diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ArenaManager.java.txt b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ArenaManager.java.txt
index 77bb3d5..cf14280 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ArenaManager.java.txt
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ArenaManager.java.txt
@@ -4,13 +4,15 @@
 
 public class @E@ArenaManager {
     
+    private final int noArenas;
     private ArrayList<@E@MemoryManager> arenas;
     private volatile int nextArena; 
     private ThreadLocal<LocalManager> local;    
     
     public @E@ArenaManager() {
-        int noArenas = Runtime.getRuntime().availableProcessors() * 2;
+        noArenas = Runtime.getRuntime().availableProcessors() * 2;
         arenas = new ArrayList<@E@MemoryManager>(noArenas);
+        nextArena = 0;
         local = new ThreadLocal<LocalManager>() {
             @Override
             protected LocalManager initialValue() {
@@ -27,6 +29,18 @@
         return i & 0xffffff;
     }
 
+    public int allocate() {
+        final LocalManager localManager = local.get();
+        int result = localManager.arenaId << 24;
+        result |= localManager.mgr.allocate();
+        return result;
+    }
+    
+    public void deallocate(int slotNum) {
+        final int arenaId = arenaId(slotNum);
+        get(arenaId).deallocate(localId(slotNum));
+    }
+    
     public synchronized LocalManager getNext() {
         if (nextArena >= arenas.size()) { 
             arenas.add(new @E@MemoryManager());
@@ -35,7 +49,7 @@
         LocalManager res = new LocalManager();
         res.mgr = mgr;
         res.arenaId = nextArena;
-        nextArena = (nextArena + 1) % arenas.size();
+        nextArena = (nextArena + 1) % noArenas;
         return res;
     }
     
@@ -53,4 +67,16 @@
         int arenaId;
         @E@MemoryManager mgr;
     }
+    
+    StringBuffer append(StringBuffer sb) {
+        for (int i = 0; i < arenas.size(); ++i) {
+            sb.append("++++ arena ").append(i).append(" ++++\n");
+            arenas.get(i).append(sb);
+        }
+        return sb;
+    }
+    
+    public String toString() {
+        return append(new StringBuffer()).toString();
+    }
 }
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ConcurrentLockManager.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ConcurrentLockManager.java
index 6e9ee9b..dbb56c5 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ConcurrentLockManager.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ConcurrentLockManager.java
@@ -105,10 +105,9 @@
         
         if (resSlot == -1) {
             // we don't know about this resource, let's alloc a slot
-            ResourceMemoryManager resMgr = resArenaMgr.local();
-            resSlot = resMgr.allocate();
-            resMgr.setDatasetId(resSlot, datasetId.getId());
-            resMgr.setPkHashVal(resSlot, entityHashValue);
+            resSlot = resArenaMgr.allocate();
+            resArenaMgr.setDatasetId(resSlot, datasetId.getId());
+            resArenaMgr.setPkHashVal(resSlot, entityHashValue);
 
             if (group.firstResourceIndex.get() == -1) {
                 group.firstResourceIndex.set(resSlot);
@@ -118,7 +117,7 @@
         // 2) create a request entry
 
         int jobId = txnContext.getJobId().getId();
-        int reqSlot = reqArenaMgr.local().allocate();
+        int reqSlot = reqArenaMgr.allocate();
         reqArenaMgr.setResourceId(reqSlot, resSlot);
         reqArenaMgr.setLockMode(reqSlot, lockMode); // lock mode is a byte!!
         reqArenaMgr.setJobId(reqSlot, jobId);
@@ -237,7 +236,7 @@
         }
         
         // deallocate request
-        reqArenaMgr.local().deallocate(holder);
+        reqArenaMgr.deallocate(holder);
         // deallocate resource or fix max lock mode
         if (resourceNotUsed(resource)) {
             int prev = group.firstResourceIndex.get();
@@ -249,7 +248,7 @@
                 }
                 resArenaMgr.setNext(prev, resArenaMgr.getNext(resource));
             }
-            resArenaMgr.local().deallocate(resource);
+            resArenaMgr.deallocate(resource);
         } else {
             final int oldMaxMode = resArenaMgr.getMaxMode(resource);
             final int newMaxMode = getNewMaxMode(resource, oldMaxMode);
@@ -297,16 +296,14 @@
     
     private int findResourceInGroup(ResourceGroup group, int dsId, int entityHashValue) {
         int resSlot = group.firstResourceIndex.get();
-        // we're looking in the local one as that should be set correctly // TODO make sure! 
-        ResourceMemoryManager resMgr = resArenaMgr.local();
         while (resSlot != -1) {
             // either we already have a lock on this resource or we have a 
             // hash collision
-            if (resMgr.getDatasetId(resSlot) == dsId && 
-                    resMgr.getPkHashVal(resSlot) == entityHashValue) {
+            if (resArenaMgr.getDatasetId(resSlot) == dsId && 
+                    resArenaMgr.getPkHashVal(resSlot) == entityHashValue) {
                 return resSlot;
             } else {
-                resSlot = resMgr.getNext(resSlot);
+                resSlot = resArenaMgr.getNext(resSlot);
             }
         }
         return -1;        
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/Generator.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/Generator.java
index 83bac42..a87d321 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/Generator.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/Generator.java
@@ -30,9 +30,9 @@
         
         StringBuilder sb = new StringBuilder();
 
-        //generateMemoryManagerSource(request, sb);
+        generateMemoryManagerSource(request, sb);
         //generateMemoryManagerSource(resource, sb);
-        generateArenaManagerSource(request, sb);
+        //generateArenaManagerSource(request, sb);
         //generateArenaManagerSource(resource, sb);
 
         System.out.println(sb.toString());
@@ -70,6 +70,9 @@
                         final Field field = resource.fields.get(i);
                         field.appendInitializers(sb, indent, 3);
                     }
+                } else if (line.contains("@PRINT_BUFFER@")) {
+                    resource.appendBufferPrinter(sb, indent, 3);
+                    sb.append('\n');
                 } else {
                   sb.append(line).append('\n');
                 }
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RecordType.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RecordType.java
index 1d0b41e..0b6c255 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RecordType.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RecordType.java
@@ -216,6 +216,14 @@
         }
     }
     
+    static String padRight(String s, int n) {
+        return String.format("%1$-" + n + "s", s);  
+    }
+
+    static String padLeft(String s, int n) {
+        return String.format("%1$" + n + "s", s);  
+    }
+    
     StringBuilder appendConstants(StringBuilder sb, String indent, int level) {
         sb = indent(sb, indent, level);
         sb.append("public static int ITEM_SIZE = ")
@@ -231,4 +239,47 @@
         }
         return sb;
     }
+    
+    StringBuilder appendBufferPrinter(StringBuilder sb, String indent, int level) {
+        int maxNameWidth = 0;
+        for (int i = 0; i < fields.size(); ++i) {
+            int width = fields.get(i).name.length();
+            if (width > maxNameWidth) {
+                maxNameWidth = width;
+            }
+        }
+        for (int i = 0; i < fields.size(); ++i) {
+            final Field field = fields.get(i);
+            sb = indent(sb, indent, level);
+            sb.append("sb.append(\"")
+              .append(padRight(field.name, maxNameWidth))
+              .append(" | \");\n");
+            sb = indent(sb, indent, level);
+            sb.append("for (int i = 0; i < occupiedSlots; ++i) {\n");
+            sb = indent(sb, indent, level + 1);
+            sb.append(name(field.type))
+              .append(" value = bb.")
+              .append(bbGetter(field.type))
+              .append("(i * ITEM_SIZE + ")
+              .append(field.offsetName())
+              .append(");\n");
+            sb = indent(sb, indent, level + 1);
+            sb.append("sb.append(String.format(\"%1$2x\", ")
+              .append(name)
+              .append("ArenaManager.arenaId(value)));\n");
+            sb = indent(sb, indent, level + 1);
+            sb.append("sb.append(\" \");\n");
+            sb = indent(sb, indent, level + 1);
+            sb.append("sb.append(String.format(\"%1$6x\", ")
+              .append(name)
+              .append("ArenaManager.localId(value)));\n");
+            sb = indent(sb, indent, level + 1);
+            sb.append("sb.append(\" | \");\n");
+            sb = indent(sb, indent, level);
+            sb.append("}\n");
+            sb = indent(sb, indent, level);
+            sb.append("sb.append(\"\\n\");\n");
+        }
+        return sb;
+    }
 }
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestArenaManager.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestArenaManager.java
index 23260ba..0247dc7 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestArenaManager.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestArenaManager.java
@@ -4,13 +4,15 @@
 
 public class RequestArenaManager {
     
+    private final int noArenas;
     private ArrayList<RequestMemoryManager> arenas;
     private volatile int nextArena; 
     private ThreadLocal<LocalManager> local;    
     
     public RequestArenaManager() {
-        int noArenas = Runtime.getRuntime().availableProcessors() * 2;
+        noArenas = Runtime.getRuntime().availableProcessors() * 2;
         arenas = new ArrayList<RequestMemoryManager>(noArenas);
+        nextArena = 0;
         local = new ThreadLocal<LocalManager>() {
             @Override
             protected LocalManager initialValue() {
@@ -27,6 +29,18 @@
         return i & 0xffffff;
     }
 
+    public int allocate() {
+        final LocalManager localManager = local.get();
+        int result = localManager.arenaId << 24;
+        result |= localManager.mgr.allocate();
+        return result;
+    }
+    
+    public void deallocate(int slotNum) {
+        final int arenaId = arenaId(slotNum);
+        get(arenaId).deallocate(localId(slotNum));
+    }
+    
     public synchronized LocalManager getNext() {
         if (nextArena >= arenas.size()) { 
             arenas.add(new RequestMemoryManager());
@@ -35,7 +49,7 @@
         LocalManager res = new LocalManager();
         res.mgr = mgr;
         res.arenaId = nextArena;
-        nextArena = (nextArena + 1) % arenas.size();
+        nextArena = (nextArena + 1) % noArenas;
         return res;
     }
     
@@ -160,5 +174,17 @@
         int arenaId;
         RequestMemoryManager mgr;
     }
+    
+    StringBuffer append(StringBuffer sb) {
+        for (int i = 0; i < arenas.size(); ++i) {
+            sb.append("++++ arena ").append(i).append(" ++++\n");
+            arenas.get(i).append(sb);
+        }
+        return sb;
+    }
+    
+    public String toString() {
+        return append(new StringBuffer()).toString();
+    }
 }
 
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestMemoryManager.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestMemoryManager.java
index 36ca35a..e0bee72 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestMemoryManager.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestMemoryManager.java
@@ -209,6 +209,24 @@
     }
 
     
+    StringBuffer append(StringBuffer sb) {
+        sb.append("+++ current: ")
+          .append(current)
+          .append(" no occupied slots: ")
+          .append(occupiedSlots)
+          .append(" +++\n");
+        for (int i = 0; i < buffers.size(); ++i) {
+            buffers.get(i).append(sb);
+            sb.append("\n");
+        }
+        return sb;
+    }
+    
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        append(sb);
+        return sb.toString();
+    }
 
     static class Buffer {
         private ByteBuffer bb;
@@ -275,6 +293,76 @@
         public void setNextFreeSlot(int slotNum, int nextFreeSlot) {
             bb.putInt(slotNum * ITEM_SIZE + NEXT_FREE_SLOT_OFFSET, nextFreeSlot);
         }
+
+        StringBuffer append(StringBuffer sb) {
+            sb.append("++ free slot: ")
+              .append(freeSlotNum)
+              .append(" no occupied slots: ")
+              .append(occupiedSlots)
+              .append(" ++\n");
+            sb.append("resource id      | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + RESOURCE_ID_OFF);
+                sb.append(String.format("%1$2x", RequestArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", RequestArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("lock mode        | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + LOCK_MODE_OFF);
+                sb.append(String.format("%1$2x", RequestArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", RequestArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("job id           | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + JOB_ID_OFF);
+                sb.append(String.format("%1$2x", RequestArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", RequestArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("prev job request | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + PREV_JOB_REQUEST_OFF);
+                sb.append(String.format("%1$2x", RequestArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", RequestArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("next job request | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + NEXT_JOB_REQUEST_OFF);
+                sb.append(String.format("%1$2x", RequestArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", RequestArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("next request     | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + NEXT_REQUEST_OFF);
+                sb.append(String.format("%1$2x", RequestArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", RequestArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+
+            return sb;
+        }
+        
+        public String toString() {
+            StringBuffer sb = new StringBuffer();
+            append(sb);
+            return sb.toString();
+        }
     }
     
 }
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceArenaManager.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceArenaManager.java
index 2212b50..f38b6ce 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceArenaManager.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceArenaManager.java
@@ -4,13 +4,15 @@
 
 public class ResourceArenaManager {
     
+    private final int noArenas;
     private ArrayList<ResourceMemoryManager> arenas;
     private volatile int nextArena; 
     private ThreadLocal<LocalManager> local;    
     
     public ResourceArenaManager() {
-        int noArenas = Runtime.getRuntime().availableProcessors() * 2;
+        noArenas = Runtime.getRuntime().availableProcessors() * 2;
         arenas = new ArrayList<ResourceMemoryManager>(noArenas);
+        nextArena = 0;
         local = new ThreadLocal<LocalManager>() {
             @Override
             protected LocalManager initialValue() {
@@ -27,6 +29,18 @@
         return i & 0xffffff;
     }
 
+    public int allocate() {
+        final LocalManager localManager = local.get();
+        int result = localManager.arenaId << 24;
+        result |= localManager.mgr.allocate();
+        return result;
+    }
+    
+    public void deallocate(int slotNum) {
+        final int arenaId = arenaId(slotNum);
+        get(arenaId).deallocate(localId(slotNum));
+    }
+    
     public synchronized LocalManager getNext() {
         if (nextArena >= arenas.size()) { 
             arenas.add(new ResourceMemoryManager());
@@ -35,7 +49,7 @@
         LocalManager res = new LocalManager();
         res.mgr = mgr;
         res.arenaId = nextArena;
-        nextArena = (nextArena + 1) % arenas.size();
+        nextArena = (nextArena + 1) % noArenas;
         return res;
     }
     
@@ -178,5 +192,17 @@
         int arenaId;
         ResourceMemoryManager mgr;
     }
+    
+    StringBuffer append(StringBuffer sb) {
+        for (int i = 0; i < arenas.size(); ++i) {
+            sb.append("++++ arena ").append(i).append(" ++++\n");
+            arenas.get(i).append(sb);
+        }
+        return sb;
+    }
+    
+    public String toString() {
+        return append(new StringBuffer()).toString();
+    }
 }
 
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceMemoryManager.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceMemoryManager.java
index ffe973f..a61c221 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceMemoryManager.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceMemoryManager.java
@@ -220,6 +220,24 @@
     }
 
     
+    StringBuffer append(StringBuffer sb) {
+        sb.append("+++ current: ")
+          .append(current)
+          .append(" no occupied slots: ")
+          .append(occupiedSlots)
+          .append(" +++\n");
+        for (int i = 0; i < buffers.size(); ++i) {
+            buffers.get(i).append(sb);
+            sb.append("\n");
+        }
+        return sb;
+    }
+    
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        append(sb);
+        return sb.toString();
+    }
 
     static class Buffer {
         private ByteBuffer bb;
@@ -290,6 +308,85 @@
         public void setNextFreeSlot(int slotNum, int nextFreeSlot) {
             bb.putInt(slotNum * ITEM_SIZE + NEXT_FREE_SLOT_OFFSET, nextFreeSlot);
         }
+
+        StringBuffer append(StringBuffer sb) {
+            sb.append("++ free slot: ")
+              .append(freeSlotNum)
+              .append(" no occupied slots: ")
+              .append(occupiedSlots)
+              .append(" ++\n");
+            sb.append("last holder    | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + LAST_HOLDER_OFF);
+                sb.append(String.format("%1$2x", ResourceArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", ResourceArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("first waiter   | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + FIRST_WAITER_OFF);
+                sb.append(String.format("%1$2x", ResourceArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", ResourceArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("first upgrader | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + FIRST_UPGRADER_OFF);
+                sb.append(String.format("%1$2x", ResourceArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", ResourceArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("max mode       | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + MAX_MODE_OFF);
+                sb.append(String.format("%1$2x", ResourceArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", ResourceArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("dataset id     | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + DATASET_ID_OFF);
+                sb.append(String.format("%1$2x", ResourceArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", ResourceArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("pk hash val    | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + PK_HASH_VAL_OFF);
+                sb.append(String.format("%1$2x", ResourceArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", ResourceArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("next           | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + NEXT_OFF);
+                sb.append(String.format("%1$2x", ResourceArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", ResourceArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+
+            return sb;
+        }
+        
+        public String toString() {
+            StringBuffer sb = new StringBuffer();
+            append(sb);
+            return sb.toString();
+        }
     }
     
 }
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/StructuredMemoryManager.java.txt b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/StructuredMemoryManager.java.txt
index a0e4516..e79093b 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/StructuredMemoryManager.java.txt
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/StructuredMemoryManager.java.txt
@@ -143,6 +143,24 @@
 
     @METHODS@
     
+    StringBuffer append(StringBuffer sb) {
+        sb.append("+++ current: ")
+          .append(current)
+          .append(" no occupied slots: ")
+          .append(occupiedSlots)
+          .append(" +++\n");
+        for (int i = 0; i < buffers.size(); ++i) {
+            buffers.get(i).append(sb);
+            sb.append("\n");
+        }
+        return sb;
+    }
+    
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        append(sb);
+        return sb.toString();
+    }
 
     static class Buffer {
         private ByteBuffer bb;
@@ -210,6 +228,22 @@
         public void setNextFreeSlot(int slotNum, int nextFreeSlot) {
             bb.putInt(slotNum * ITEM_SIZE + NEXT_FREE_SLOT_OFFSET, nextFreeSlot);
         }
+
+        StringBuffer append(StringBuffer sb) {
+            sb.append("++ free slot: ")
+              .append(freeSlotNum)
+              .append(" no occupied slots: ")
+              .append(occupiedSlots)
+              .append(" ++\n");
+            @PRINT_BUFFER@
+            return sb;
+        }
+        
+        public String toString() {
+            StringBuffer sb = new StringBuffer();
+            append(sb);
+            return sb.toString();
+        }
     }
     
 }
\ No newline at end of file
