Index: sys/dev/wscons/wsdisplay.c
===================================================================
RCS file: /cvsroot/src/sys/dev/wscons/wsdisplay.c,v
retrieving revision 1.135
diff -u -r1.135 wsdisplay.c
--- sys/dev/wscons/wsdisplay.c  2 Feb 2012 13:11:25 -0000       1.135
+++ sys/dev/wscons/wsdisplay.c  20 Jan 2014 19:36:46 -0000
@@ -884,6 +884,15 @@
       wsdisplay_console_initted = 1;
}

+void
+wsdisplay_cndetach(void)
+{
+       KASSERT(wsdisplay_console_initted == 2);
+
+       cn_tab = NULL;
+       wsdisplay_console_initted = 0;
+}
+
/*
 * Tty and cdevsw functions.
 */
Index: sys/dev/wscons/wsdisplay_vcons.c
===================================================================
RCS file: /cvsroot/src/sys/dev/wscons/wsdisplay_vcons.c,v
retrieving revision 1.29
diff -u -r1.29 wsdisplay_vcons.c
--- sys/dev/wscons/wsdisplay_vcons.c    15 Sep 2013 16:12:00 -0000      1.29
+++ sys/dev/wscons/wsdisplay_vcons.c    20 Jan 2014 19:36:46 -0000
@@ -1262,10 +1262,15 @@
       struct vcons_screen *scr = vd->active;
       unsigned int dirty;

-       if (scr && vd->use_intr == 1) {
+       if (scr && vd->use_intr) {
               if (!SCREEN_IS_BUSY(scr)) {
                       dirty = atomic_swap_uint(&scr->scr_dirty, 0);
-                       if (dirty > 0) {
+                       if (vd->use_intr == 2) {
+                               if ((scr->scr_flags & VCONS_NO_REDRAW) == 0) {
+                                       vd->use_intr = 1;
+                                       vcons_redraw_screen(scr);
+                               }
+                       } else if (dirty > 0) {
                               if ((scr->scr_flags & VCONS_NO_REDRAW) == 0)
                                       vcons_update_screen(scr);
                       }
@@ -1280,7 +1285,7 @@
{
       /* the 'dev' arg we pass to config_interrupts isn't a device_t */
       struct vcons_data *vd = (struct vcons_data *)dev;
-       vd->use_intr = 1;
+       vd->use_intr = 2;
       callout_schedule(&vd->intr, mstohz(33));
}
#endif /* VCONS_DRAW_INTR */
@@ -1309,7 +1314,7 @@
       if (!vd->intr_valid)
               return;

-       vd->use_intr = 1;
+       vd->use_intr = 2;
       if (scr)
               atomic_inc_uint(&scr->scr_dirty);
#endif
Index: sys/dev/wscons/wsdisplayvar.h
===================================================================
RCS file: /cvsroot/src/sys/dev/wscons/wsdisplayvar.h,v
retrieving revision 1.50
diff -u -r1.50 wsdisplayvar.h
--- sys/dev/wscons/wsdisplayvar.h       31 Jan 2013 10:57:30 -0000      1.50
+++ sys/dev/wscons/wsdisplayvar.h       20 Jan 2014 19:36:47 -0000
@@ -163,6 +163,7 @@
            long);
void   wsdisplay_preattach(const struct wsscreen_descr *, void *, int, int,
            long);
+void   wsdisplay_cndetach(void);

int    wsdisplaydevprint(void *, const char *);
int    wsemuldisplaydevprint(void *, const char *);