Index: /trunk/source/lisp-kernel/gc-common.c
===================================================================
--- /trunk/source/lisp-kernel/gc-common.c	(revision 12805)
+++ /trunk/source/lisp-kernel/gc-common.c	(revision 12806)
@@ -1101,7 +1101,5 @@
 
   install_weak_mark_functions(lisp_global(WEAK_GC_METHOD) >> fixnumshift);
-
-
-
+  
 #ifndef FORCE_DWS_MARK
   if ((natural) (tcr->cs_limit) == CS_OVERFLOW_FORCE_LIMIT) {
@@ -1163,4 +1161,8 @@
 
   get_time(start);
+
+  /* The link-inverting marker might need to write to watched areas */
+  unprotect_watched_areas(PROT_READ|PROT_EXEC|PROT_WRITE);
+
   lisp_global(IN_GC) = (1<<fixnumshift);
 
@@ -1238,4 +1240,5 @@
 
         case AREA_STATIC:
+	case AREA_WATCHED:
         case AREA_DYNAMIC:                  /* some heap that isn't "the" heap */
           /* In both of these cases, we -could- use the area's "markbits"
@@ -1373,4 +1376,5 @@
 
         case AREA_STATIC:
+	case AREA_WATCHED:
         case AREA_DYNAMIC:                  /* some heap that isn't "the" heap */
           if (next_area->younger == NULL) {
@@ -1384,5 +1388,5 @@
       }
     }
-  
+
     if (GCephemeral_low) {
       forward_memoized_area(tenured_area, area_dnode(a->low, tenured_area->low));
@@ -1428,4 +1432,6 @@
   
   lisp_global(IN_GC) = 0;
+  
+  protect_watched_areas();
 
   nrs_GC_EVENT_STATUS_BITS.vcell |= gc_postgc_pending;
Index: /trunk/source/lisp-kernel/memory.c
===================================================================
--- /trunk/source/lisp-kernel/memory.c	(revision 12805)
+++ /trunk/source/lisp-kernel/memory.c	(revision 12806)
@@ -948,2 +948,36 @@
   pure_space_active = pure_space_start;
 }
+
+void
+protect_watched_areas()
+{
+  area *a = active_dynamic_area;
+  natural code = a->code;
+
+  while (code != AREA_VOID) {
+    if (code == AREA_WATCHED) {
+      natural size = a->high - a->low;
+      
+      ProtectMemory(a->low, size);
+    }
+    a = a->succ;
+    code = a->code;
+  }
+}
+
+void
+unprotect_watched_areas()
+{
+  area *a = active_dynamic_area;
+  natural code = a->code;
+
+  while (code != AREA_VOID) {
+    if (code == AREA_WATCHED) {
+      natural size = a->high - a->low;
+      
+      UnProtectMemory(a->low, size);
+    }
+    a = a->succ;
+    code = a->code;
+  }
+}
