diff --git a/lisp/gc.c b/lisp/gc.c
index a458235de2ee3f2f633d2e7b45ff670103428c33..146f6c2cd2c41858093e080bd7ae34b8ffd3b71c 100644
--- a/lisp/gc.c
+++ b/lisp/gc.c
@@ -1,7 +1,7 @@
 /*
  * Stop and Copy GC based on Cheney's algorithm.
  *
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/gc.c,v 1.10 1997/02/05 18:01:13 pw Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/gc.c,v 1.11 1997/02/17 09:17:15 dtc Exp $
  * 
  * Written by Christopher Hoover.
  */
@@ -361,6 +361,8 @@ void collect_garbage(void)
 
 /* Scavenging */
 
+#define DIRECT_SCAV 0
+
 static void
 scavenge(lispobj *start, long nwords)
 {
@@ -376,7 +378,7 @@ scavenge(lispobj *start, long nwords)
 		       (unsigned long) start, (unsigned long) object, type);
 #endif
 
-#if 0
+#if DIRECT_SCAV
 		words_scavenged = (scavtab[type])(start, object);
 #else
                 if (Pointerp(object)) {
@@ -589,6 +591,7 @@ void print_garbage(lispobj *from_space, lispobj *from_space_free_pointer)
 static lispobj trans_function_header(lispobj object);
 static lispobj trans_boxed(lispobj object);
 
+#if DIRECT_SCAV
 static int
 scav_function_pointer(lispobj *where, lispobj object)
 {
@@ -631,6 +634,45 @@ scav_function_pointer(lispobj *where, lispobj object)
 	}
 	return 1;
 }
+#else
+static int
+scav_function_pointer(lispobj *where, lispobj object)
+{
+  lispobj  *first_pointer;
+  lispobj copy;
+  lispobj first;
+  int type;
+
+  gc_assert(Pointerp(object));
+      
+  /* object is a pointer into from space. Not a FP */
+  first_pointer = (lispobj *) PTR(object);
+  first = *first_pointer;
+		
+  /* must transport object -- object may point */
+  /* to either a function header, a closure */
+  /* function header, or to a closure header. */
+  
+  type = TypeOf(first);
+  switch (type) {
+  case type_FunctionHeader:
+  case type_ClosureFunctionHeader:
+    copy = trans_function_header(object);
+    break;
+  default:
+    copy = trans_boxed(object);
+    break;
+  }
+  
+  first = *first_pointer = copy;
+
+  gc_assert(Pointerp(first));
+  gc_assert(!from_space_p(first));
+
+  *where = first;
+  return 1;
+}
+#endif
 
 static struct code *
 trans_code(struct code *code)
@@ -865,6 +907,7 @@ trans_function_header(lispobj object)
 
 /* Instances */
 
+#if DIRECT_SCAV
 static int
 scav_instance_pointer(lispobj *where, lispobj object)
 {
@@ -882,12 +925,26 @@ scav_instance_pointer(lispobj *where, lispobj object)
     }
     return 1;
 }
+#else
+static int
+scav_instance_pointer(lispobj *where, lispobj object)
+{
+  lispobj  *first_pointer;
+  
+  /* object is a pointer into from space.  Not a FP */
+  first_pointer = (lispobj *) PTR(object);
+  
+  *where = *first_pointer = trans_boxed(object);
+  return 1;
+}
+#endif
 
 
 /* Lists and Conses */
 
 static lispobj trans_list(lispobj object);
 
+#if DIRECT_SCAV
 static int
 scav_list_pointer(lispobj *where, lispobj object)
 {
@@ -911,6 +968,26 @@ scav_list_pointer(lispobj *where, lispobj object)
 	}
 	return 1;
 }
+#else
+static int
+scav_list_pointer(lispobj *where, lispobj object)
+{
+  lispobj first, *first_pointer;
+
+  gc_assert(Pointerp(object));
+
+  /* object is a pointer into from space.  Not a FP. */
+  first_pointer = (lispobj *) PTR(object);
+  
+  first = *first_pointer = trans_list(object);
+  
+  gc_assert(Pointerp(first));
+  gc_assert(!from_space_p(first));
+  
+  *where = first;
+  return 1;
+}
+#endif
 
 static lispobj
 trans_list(lispobj object)
@@ -966,6 +1043,7 @@ trans_list(lispobj object)
 
 /* Scavenging and Transporting Other Pointers */
 
+#if DIRECT_SCAV
 static int
 scav_other_pointer(lispobj *where, lispobj object)
 {
@@ -990,6 +1068,25 @@ scav_other_pointer(lispobj *where, lispobj object)
 	}
 	return 1;
 }
+#else
+static int
+scav_other_pointer(lispobj *where, lispobj object)
+{
+  lispobj first, *first_pointer;
+
+  gc_assert(Pointerp(object));
+
+  /* Object is a pointer into from space - not a FP */
+  first_pointer = (lispobj *) PTR(object);
+  first = *first_pointer = (transother[TypeOf(*first_pointer)])(object);
+
+  gc_assert(Pointerp(first));
+  gc_assert(!from_space_p(first));
+
+  *where = first;
+  return 1;
+}
+#endif
 
 
 /* Immediate, Boxed, and Unboxed Objects */
@@ -1772,7 +1869,7 @@ void gc_init(void)
 	transother[type_Sap] = trans_unboxed;
 	transother[type_UnboundMarker] = trans_immediate;
 	transother[type_WeakPointer] = trans_weak_pointer;
-        transother[type_InstanceHeader] = trans_vector;
+        transother[type_InstanceHeader] = trans_boxed;
 	transother[type_Fdefn] = trans_boxed;
 
 	/* Size table */
@@ -1826,7 +1923,7 @@ void gc_init(void)
 	sizetab[type_Sap] = size_unboxed;
 	sizetab[type_UnboundMarker] = size_immediate;
 	sizetab[type_WeakPointer] = size_weak_pointer;
-        sizetab[type_InstanceHeader] = size_vector;
+        sizetab[type_InstanceHeader] = size_boxed;
 	sizetab[type_Fdefn] = size_boxed;
 }