diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
index 77f4e61fed9a..0ba7d7dcac89 100644
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -207,7 +207,7 @@ static int save_kbd_state(scr_stat *scp);
 static int update_kbd_state(scr_stat *scp, int state, int mask);
 static int update_kbd_leds(scr_stat *scp, int which);
 static timeout_t blink_screen;
-static struct tty *sc_alloc_tty(int, const char *, ...) __printflike(2, 3);
+static struct tty *sc_alloc_tty(int, int);
 
 static cn_probe_t	sc_cnprobe;
 static cn_init_t	sc_cninit;
@@ -224,11 +224,6 @@ static	tsw_ioctl_t	sctty_ioctl;
 static	tsw_mmap_t	sctty_mmap;
 
 static struct ttydevsw sc_ttydevsw = {
-	/*
-	 * XXX: we should use the prefix, but this doesn't work for
-	 * consolectl.
-	 */
-	.tsw_flags	= TF_NOPREFIX,
 	.tsw_open	= sctty_open,
 	.tsw_close	= sctty_close,
 	.tsw_outwakeup	= sctty_outwakeup,
@@ -236,6 +231,15 @@ static struct ttydevsw sc_ttydevsw = {
 	.tsw_mmap	= sctty_mmap,
 };
 
+static d_ioctl_t	consolectl_ioctl;
+
+static struct cdevsw consolectl_devsw = {
+	.d_version	= D_VERSION,
+	.d_flags	= D_NEEDGIANT,
+	.d_ioctl	= consolectl_ioctl,
+	.d_name		= "consolectl",
+};
+
 int
 sc_probe_unit(int unit, int flags)
 {
@@ -321,14 +325,10 @@ sctty_outwakeup(struct tty *tp)
 }
 
 static struct tty *
-sc_alloc_tty(int index, const char *fmt, ...)
+sc_alloc_tty(int index, int devnum)
 {
-	va_list ap;
 	struct sc_ttysoftc *stc;
 	struct tty *tp;
-	char name[11]; /* "consolectl" */
-
-	va_start(ap, fmt);
 
 	/* Allocate TTY object and softc to store unit number. */
 	stc = malloc(sizeof(struct sc_ttysoftc), M_DEVBUF, M_WAITOK);
@@ -337,10 +337,7 @@ sc_alloc_tty(int index, const char *fmt, ...)
 	tp = tty_alloc(&sc_ttydevsw, stc, &Giant);
 
 	/* Create device node. */
-	va_start(ap, fmt);
-	vsnrprintf(name, sizeof name, 32, fmt, ap);
-	va_end(ap);
-	tty_makedev(tp, NULL, "%s", name);
+	tty_makedev(tp, NULL, "v%r", devnum);
 
 	return (tp);
 }
@@ -354,7 +351,7 @@ sc_attach_unit(int unit, int flags)
     video_info_t info;
 #endif
     int vc;
-    struct tty *tp;
+    struct cdev *dev;
 
     flags &= ~SC_KERNEL_CONSOLE;
 
@@ -425,7 +422,7 @@ sc_attach_unit(int unit, int flags)
 
     for (vc = 0; vc < sc->vtys; vc++) {
 	if (sc->dev[vc] == NULL) {
-		sc->dev[vc] = sc_alloc_tty(vc, "ttyv%r", vc + unit * MAXCONS);
+		sc->dev[vc] = sc_alloc_tty(vc, vc + unit * MAXCONS);
 		if (vc == 0 && sc->dev == main_devs)
 			SC_STAT(sc->dev[0]) = &main_console;
 	}
@@ -436,8 +433,9 @@ sc_attach_unit(int unit, int flags)
 	 */
     }
 
-    tp = sc_alloc_tty(0, "consolectl");
-    SC_STAT(tp) = sc_console;
+    dev = make_dev(&consolectl_devsw, 0, UID_ROOT, GID_WHEEL, 0600,
+        "consolectl");
+    dev->si_drv1 = sc->dev[0];
 
     return 0;
 }
@@ -1428,6 +1426,14 @@ sctty_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
     return (ENOIOCTL);
 }
 
+static int
+consolectl_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
+    struct thread *td)
+{
+
+	return sctty_ioctl(dev->si_drv1, cmd, data, td);
+}
+
 static void
 sc_cnprobe(struct consdev *cp)
 {
@@ -2728,7 +2734,7 @@ scinit(int unit, int flags)
 	    /* assert(sc_malloc) */
 	    sc->dev = malloc(sizeof(struct tty *)*sc->vtys, M_DEVBUF,
 	        M_WAITOK|M_ZERO);
-	    sc->dev[0] = sc_alloc_tty(0, "ttyv%r", unit * MAXCONS);
+	    sc->dev[0] = sc_alloc_tty(0, unit * MAXCONS);
 	    scp = alloc_scp(sc, sc->first_vty);
 	    SC_STAT(sc->dev[0]) = scp;
 	}