Index: /trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/transactions/ReadSet.java
===================================================================
--- /trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/transactions/ReadSet.java (revision 2649)
+++ /trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/transactions/ReadSet.java (revision 2738)
@@ -37,5 +37,6 @@
       // out from underneath me, I get a NoSuchElementException, so I'm writing
       // my own add function.
-      myAdd(r);
+      if (r != null)
+          myAdd(r);
   }
 
@@ -72,4 +73,5 @@
       if (sealed) {
 		  FortressTaskRunner.debugPrintln("add of " + t + " to readset " + toString() + " failed because readset was sealed");
+          Thread.dumpStack();
 		  return false;
       } else {
Index: /trunk/ProjectFortress/src/com/sun/fortress/interpreter/env/ValueNode.java
===================================================================
--- /trunk/ProjectFortress/src/com/sun/fortress/interpreter/env/ValueNode.java (revision 2649)
+++ /trunk/ProjectFortress/src/com/sun/fortress/interpreter/env/ValueNode.java (revision 2738)
@@ -32,36 +32,25 @@
     Transaction writer;
     ReadSet readers;
-    
+
+    public  ValueNode(FValue v, Transaction w, ReadSet r, ValueNode o) {
+        old = o;
+        value = v;
+        writer = w;
+        readers = new ReadSet(r);
+    }
+
     ValueNode() {
         old = null;
         value = null;
-        writer = FortressTaskRunner.getTransaction();
+        writer = null;
         readers = new ReadSet();
     }
 
-    ValueNode(FValue val) {
-        old = null;
-        value = val;
-        writer = FortressTaskRunner.getTransaction();
-        readers = new ReadSet();
-    }
-
-    ValueNode(FValue val, Transaction w, ValueNode o) {
-        old = o;
-        value = val;
-        writer = w;
-        if (o != null)
-            readers = new ReadSet(o.readers);
-        else readers = new ReadSet();
-    }
-
-    ValueNode(FValue val, ReadSet r) {
-        old = null;
-        value = val;
-        readers = new ReadSet(r);
-    }
+    public static final ValueNode nullValueNode = new ValueNode();
 
     public String toString() {
-        return "ValueNode[" + value +  ":" + writer + "]" ;
+        if (this == nullValueNode)
+            return "nullValueNode";
+        else return "ValueNode[" + value +  ":" + writer +  "::" + readers + "]" ;
     }
 
@@ -80,4 +69,7 @@
             
     public void AbortAllReaders() {
+        if (this == nullValueNode)
+            throw new RuntimeException(Thread.currentThread().getName() + "Trying to abort all the readers of the null value node");
+
 		readers.seal();
 		for (Transaction r : readers) {
Index: /trunk/ProjectFortress/src/com/sun/fortress/interpreter/env/ReferenceCell.java
===================================================================
--- /trunk/ProjectFortress/src/com/sun/fortress/interpreter/env/ReferenceCell.java (revision 2700)
+++ /trunk/ProjectFortress/src/com/sun/fortress/interpreter/env/ReferenceCell.java (revision 2738)
@@ -44,5 +44,12 @@
     public ReferenceCell() {
         super();
-        node = new ValueNode();
+        node = ValueNode.nullValueNode;
+        id = counter.getAndIncrement();
+    }
+
+    public ReferenceCell(FType t) {
+        super();
+        theType = t;
+        node = ValueNode.nullValueNode;
         id = counter.getAndIncrement();
     }
@@ -51,12 +58,5 @@
         super();
         theType = t;
-        node = new ValueNode(v);
-        id = counter.getAndIncrement();
-    }
-
-    public ReferenceCell(FType t) {
-        super();
-        theType = t;
-        node = new ValueNode();
+        node = new ValueNode(v, FortressTaskRunner.getTransaction(), null, null);
         id = counter.getAndIncrement();
     }
@@ -64,5 +64,4 @@
     public FType getType() { return theType;}
     public String toString() { return "ReferenceCell" + id;}
-
 
     private boolean transactionIsCommitted(Transaction w) {
@@ -90,4 +89,6 @@
     private synchronized void cleanup() {
         Transaction w = node.getWriter();
+        if (Transaction.debug)
+            FortressTaskRunner.debugPrintln("Cleanup:" + this + " start with node = " + node);
         while (w != null && transactionIsNotActive(w)) {
             if (transactionIsAbortedOrOrphaned(w)) {
@@ -96,8 +97,18 @@
                 assert(transactionIsCommitted(w));
                 Transaction p = w.getParent();
-                if (p == null) {
-                    node = new ValueNode(node.getValue(), node.getOld().getReaders());
-                } else  {
-                    node = new ValueNode(node.getValue(), p, node.getOld());
+                ValueNode old = node.getOld();
+                if (p == null && old == null) {
+                    // Committed to top level, with no previous value.
+                    node = new ValueNode(node.getValue(), null, null, null);
+                } else if (p == null) {
+                    // Committed to top level.  Any readers of the committed transaction
+                    // must be preserved.
+                    node = new ValueNode(node.getValue(), null, old.getReaders(), null);
+                } else  if (old != null) {
+                    // Committed to a parent transaction, must preserve readers and 
+                    // old transaction.
+                    node = new ValueNode(node.getValue(), p, old.getReaders(), old);
+                } else {
+                    node = new ValueNode(node.getValue(), p, null, null);
                 }
             }
@@ -105,8 +116,12 @@
                 w = node.getWriter();
             } else {
-                node = new ValueNode();
+                node = ValueNode.nullValueNode;
+                if (Transaction.debug)
+                    FortressTaskRunner.debugPrintln("Cleanup:" + this + " end with " + node);
                 return;
             }
         }
+        if (Transaction.debug)
+            FortressTaskRunner.debugPrintln("Cleanup:" + this + " end with " + node);
     }
 
@@ -114,9 +129,20 @@
         Transaction me  = FortressTaskRunner.getTransaction();
         cleanup();
+        if (Transaction.debug) 
+            FortressTaskRunner.debugPrintln(this + " assignValue start = " + node + " value = " + f2);
+
+        if (node == ValueNode.nullValueNode) {
+            node = new ValueNode(f2, me, null, null);
+        }
+
         // writer is either active, or null
         if (me == null) { // top level assignment
-            ValueNode temp = node;
-            node = new ValueNode(f2);
-            temp.AbortAllReadersAndWriters();
+            if (node == ValueNode.nullValueNode) 
+                node = new ValueNode(f2, me, null, null);
+            else {
+                ValueNode temp = node;
+                node = new ValueNode(f2, null, null, null);
+                temp.AbortAllReadersAndWriters();
+            }
         } else if (!me.isActive()) {
             throw new AbortedException(me, "Somebody killed me ");
@@ -128,8 +154,10 @@
 
             Transaction w = node.getWriter();
+            ValueNode old = node.getOld();
 
             if (w == null || w.isAncestorOf(me)) {
-                node = new ValueNode(f2, me, node);
+                node = new ValueNode(f2, me, node.getReaders(), node);
                 if (Transaction.debug) me.addWrite(this, f2);
+
             } else if (w.isActive()) {
 				// Cleanup got us to a parent node with an active writer
@@ -137,4 +165,6 @@
             }
         }
+        if (Transaction.debug)
+            FortressTaskRunner.debugPrintln(this + " assignValue finish = " + node);
     }
 
