diff --git a/hyracks-examples/hyracks-integration-tests/src/test/java/edu/uci/ics/hyracks/tests/btree/BTreeOperatorsTest.java b/hyracks-examples/hyracks-integration-tests/src/test/java/edu/uci/ics/hyracks/tests/btree/BTreeOperatorsTest.java
index 7269a01..d10d622 100644
--- a/hyracks-examples/hyracks-integration-tests/src/test/java/edu/uci/ics/hyracks/tests/btree/BTreeOperatorsTest.java
+++ b/hyracks-examples/hyracks-integration-tests/src/test/java/edu/uci/ics/hyracks/tests/btree/BTreeOperatorsTest.java
@@ -66,6 +66,7 @@
 import edu.uci.ics.hyracks.storage.am.btree.frames.NSMLeafFrameFactory;
 import edu.uci.ics.hyracks.storage.am.btree.impls.BTree;
 import edu.uci.ics.hyracks.storage.am.btree.impls.BTreeOp;
+import edu.uci.ics.hyracks.storage.am.btree.impls.BTreeOpContext;
 import edu.uci.ics.hyracks.storage.am.btree.impls.MultiComparator;
 import edu.uci.ics.hyracks.storage.am.btree.impls.RangePredicate;
 import edu.uci.ics.hyracks.storage.am.btree.impls.RangeSearchCursor;
@@ -160,7 +161,8 @@
         BTree btree = btreeRegistryProvider.getBTreeRegistry().get(btreeFileId);
         IBTreeCursor scanCursor = new RangeSearchCursor(leafFrameFactory.getFrame());
         RangePredicate nullPred = new RangePredicate(true, null, null, true, true, null);
-        btree.search(scanCursor, nullPred, leafFrameFactory.getFrame(), interiorFrameFactory.getFrame());
+        BTreeOpContext opCtx = btree.createOpContext(BTreeOp.BTO_SEARCH, leafFrameFactory.getFrame(), interiorFrameFactory.getFrame(), null);
+        btree.search(scanCursor, nullPred, opCtx);
         try {
         	while (scanCursor.hasNext()) {
         		scanCursor.next();
@@ -422,7 +424,8 @@
         System.out.println("PRINTING PRIMARY INDEX");
         IBTreeCursor scanCursorA = new RangeSearchCursor(primaryLeafFrameFactory.getFrame());
         RangePredicate nullPredA = new RangePredicate(true, null, null, true, true, null);
-        btreeA.search(scanCursorA, nullPredA, primaryLeafFrameFactory.getFrame(), primaryInteriorFrameFactory.getFrame());
+        BTreeOpContext opCtxA = btreeA.createOpContext(BTreeOp.BTO_SEARCH, primaryLeafFrameFactory.getFrame(), primaryInteriorFrameFactory.getFrame(), null);
+        btreeA.search(scanCursorA, nullPredA, opCtxA);
         try {
         	while (scanCursorA.hasNext()) {
         		scanCursorA.next();
@@ -441,7 +444,8 @@
         System.out.println("PRINTING FIRST SECONDARY INDEX");
         IBTreeCursor scanCursorB = new RangeSearchCursor(secondaryLeafFrameFactory.getFrame());
         RangePredicate nullPredB = new RangePredicate(true, null, null, true, true, null);
-        btreeB.search(scanCursorB, nullPredB, secondaryLeafFrameFactory.getFrame(), secondaryInteriorFrameFactory.getFrame());
+        BTreeOpContext opCtxB = btreeB.createOpContext(BTreeOp.BTO_SEARCH, secondaryLeafFrameFactory.getFrame(), secondaryInteriorFrameFactory.getFrame(), null);
+        btreeB.search(scanCursorB, nullPredB, opCtxB);
         try {
         	while (scanCursorB.hasNext()) {
         		scanCursorB.next();
@@ -460,7 +464,8 @@
         System.out.println("PRINTING SECOND SECONDARY INDEX");
         IBTreeCursor scanCursorC = new RangeSearchCursor(secondaryLeafFrameFactory.getFrame());
         RangePredicate nullPredC = new RangePredicate(true, null, null, true, true, null);
-        btreeC.search(scanCursorC, nullPredC, secondaryLeafFrameFactory.getFrame(), secondaryInteriorFrameFactory.getFrame());
+        BTreeOpContext opCtxC = btreeC.createOpContext(BTreeOp.BTO_SEARCH, secondaryLeafFrameFactory.getFrame(), secondaryInteriorFrameFactory.getFrame(), null);
+        btreeC.search(scanCursorC, nullPredC, opCtxC);
         try {
         	while (scanCursorC.hasNext()) {
         		scanCursorC.next();
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeInsertUpdateDeleteOperatorNodePushable.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeInsertUpdateDeleteOperatorNodePushable.java
index dc02c2e..44d26da 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeInsertUpdateDeleteOperatorNodePushable.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeInsertUpdateDeleteOperatorNodePushable.java
@@ -23,27 +23,19 @@
 import edu.uci.ics.hyracks.dataflow.common.comm.io.FrameTupleAccessor;
 import edu.uci.ics.hyracks.dataflow.common.comm.util.FrameUtils;
 import edu.uci.ics.hyracks.dataflow.std.base.AbstractUnaryInputUnaryOutputOperatorNodePushable;
-import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeInteriorFrame;
-import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrame;
-import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeMetaDataFrame;
 import edu.uci.ics.hyracks.storage.am.btree.frames.MetaDataFrame;
 import edu.uci.ics.hyracks.storage.am.btree.impls.BTree;
 import edu.uci.ics.hyracks.storage.am.btree.impls.BTreeOp;
+import edu.uci.ics.hyracks.storage.am.btree.impls.BTreeOpContext;
 
 public class BTreeInsertUpdateDeleteOperatorNodePushable extends AbstractUnaryInputUnaryOutputOperatorNodePushable {
     private final BTreeOpHelper btreeOpHelper;
-
     private FrameTupleAccessor accessor;
-
-    private IRecordDescriptorProvider recordDescProvider;
-
-    private IBTreeMetaDataFrame metaFrame;
-
-    private BTreeOp op;
-
-    private PermutingFrameTupleReference tuple = new PermutingFrameTupleReference();
-
+    private final IRecordDescriptorProvider recordDescProvider;
+    private final BTreeOp op;
+    private final PermutingFrameTupleReference tuple = new PermutingFrameTupleReference();
     private ByteBuffer writeBuffer;
+    private BTreeOpContext opCtx;
     
     public BTreeInsertUpdateDeleteOperatorNodePushable(AbstractBTreeOperatorDescriptor opDesc, IHyracksContext ctx,
     		int partition, int[] fieldPermutation, IRecordDescriptorProvider recordDescProvider, BTreeOp op) {
@@ -60,10 +52,7 @@
 
     @Override
     public void nextFrame(ByteBuffer buffer) throws HyracksDataException {
-        final BTree btree = btreeOpHelper.getBTree();
-        final IBTreeLeafFrame leafFrame = btreeOpHelper.getLeafFrame();
-        final IBTreeInteriorFrame interiorFrame = btreeOpHelper.getInteriorFrame();
-
+        final BTree btree = btreeOpHelper.getBTree();       
         accessor.reset(buffer);
         
         int tupleCount = accessor.getTupleCount();
@@ -74,12 +63,12 @@
                 switch (op) {
 
                     case BTO_INSERT: {
-                        btree.insert(tuple, leafFrame, interiorFrame, metaFrame);
+                        btree.insert(tuple, opCtx);
                     }
                         break;
 
                     case BTO_DELETE: {
-                        btree.delete(tuple, leafFrame, interiorFrame, metaFrame);
+                        btree.delete(tuple, opCtx);
                     }
                         break;
 
@@ -104,14 +93,14 @@
         AbstractBTreeOperatorDescriptor opDesc = btreeOpHelper.getOperatorDescriptor();
         RecordDescriptor inputRecDesc = recordDescProvider.getInputRecordDescriptor(opDesc.getOperatorId(), 0);
         accessor = new FrameTupleAccessor(btreeOpHelper.getHyracksContext(), inputRecDesc);
-        writeBuffer = btreeOpHelper.getHyracksContext().getResourceManager().allocateFrame();
+        writeBuffer = btreeOpHelper.getHyracksContext().getResourceManager().allocateFrame();        
         try {
             btreeOpHelper.init();
             btreeOpHelper.getBTree().open(btreeOpHelper.getBTreeFileId());
-            metaFrame = new MetaDataFrame();
         } catch (Exception e) {
             e.printStackTrace();
         }
+        opCtx = btreeOpHelper.getBTree().createOpContext(op, btreeOpHelper.getLeafFrame(), btreeOpHelper.getInteriorFrame(), new MetaDataFrame());
     }
 
     @Override
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorNodePushable.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorNodePushable.java
index 2b69d9d..e97ae7d 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorNodePushable.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorNodePushable.java
@@ -29,9 +29,10 @@
 import edu.uci.ics.hyracks.dataflow.common.data.accessors.ITupleReference;
 import edu.uci.ics.hyracks.dataflow.std.base.AbstractUnaryInputUnaryOutputOperatorNodePushable;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeCursor;
-import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeInteriorFrame;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrame;
 import edu.uci.ics.hyracks.storage.am.btree.impls.BTree;
+import edu.uci.ics.hyracks.storage.am.btree.impls.BTreeOp;
+import edu.uci.ics.hyracks.storage.am.btree.impls.BTreeOpContext;
 import edu.uci.ics.hyracks.storage.am.btree.impls.MultiComparator;
 import edu.uci.ics.hyracks.storage.am.btree.impls.RangePredicate;
 import edu.uci.ics.hyracks.storage.am.btree.impls.RangeSearchCursor;
@@ -53,10 +54,9 @@
     private boolean highKeyInclusive;
     private RangePredicate rangePred;
     private MultiComparator searchCmp;
-    private IBTreeCursor cursor;
-    private IBTreeLeafFrame leafFrame;
-    private IBTreeLeafFrame cursorFrame;
-    private IBTreeInteriorFrame interiorFrame;    
+    private IBTreeCursor cursor;    
+    private IBTreeLeafFrame cursorFrame;    
+    private BTreeOpContext opCtx;
     
     private RecordDescriptor recDesc;       
         
@@ -90,9 +90,6 @@
 			throw new HyracksDataException(e);
 		}
         btree = btreeOpHelper.getBTree();
-
-        leafFrame = btreeOpHelper.getLeafFrame();
-        interiorFrame = btreeOpHelper.getInteriorFrame();
         
         // construct range predicate
         
@@ -113,6 +110,8 @@
         dos = tb.getDataOutput();
         appender = new FrameTupleAppender(btreeOpHelper.getHyracksContext());    
         appender.reset(writeBuffer, true);
+        
+        opCtx = btree.createOpContext(BTreeOp.BTO_SEARCH, btreeOpHelper.getLeafFrame(), btreeOpHelper.getInteriorFrame(), null);
     }
     	
     private void writeSearchResults() throws Exception {
@@ -149,7 +148,7 @@
                 rangePred.setHighKey(highKey, highKeyInclusive);
                 
                 cursor.reset();
-                btree.search(cursor, rangePred, leafFrame, interiorFrame);                
+                btree.search(cursor, rangePred, opCtx);                
                 writeSearchResults();    
             }       	        	
         } catch (Exception e) {
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java
index 7a74bf8..a4effb7 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java
@@ -16,7 +16,6 @@
 package edu.uci.ics.hyracks.storage.am.btree.impls;
 
 import java.util.ArrayList;
-import java.util.Stack;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
@@ -226,8 +225,8 @@
     }
     
     private void addFreePages(BTreeOpContext ctx) throws Exception {
-        for (Integer i : ctx.freePages) {
-            addFreePage(ctx.metaFrame, i);
+        for(int i = 0; i < ctx.freePages.size(); i++) {
+            addFreePage(ctx.metaFrame, ctx.freePages.get(i));
         }
         ctx.freePages.clear();
     }
@@ -403,16 +402,10 @@
         cursor.open(page, diskOrderScanPredicate);
     }
     
-    public void search(IBTreeCursor cursor, RangePredicate pred, IBTreeLeafFrame leafFrame,
-            IBTreeInteriorFrame interiorFrame) throws Exception {
-        BTreeOpContext ctx = new BTreeOpContext();
-        ctx.op = BTreeOp.BTO_SEARCH;
-        ctx.leafFrame = leafFrame;
-        ctx.interiorFrame = interiorFrame;
-        ctx.metaFrame = null;
-        ctx.pred = pred;
-        ctx.cursor = cursor;
-        ctx.pageLsns = new Stack<Integer>();
+    public void search(IBTreeCursor cursor, RangePredicate pred, BTreeOpContext ctx) throws Exception {        
+    	ctx.reset();
+    	ctx.pred = pred;
+        ctx.cursor = cursor;        
         if (ctx.pred.getComparator() == null)
             ctx.pred.setComparator(cmp); // simple index scan
         
@@ -424,8 +417,8 @@
 
             // if we reach this stage then we need to restart from the (possibly
             // new) root
-            if (!ctx.pageLsns.isEmpty() && ctx.pageLsns.peek().equals(RESTART_OP)) {
-                ctx.pageLsns.pop(); // pop the restart op indicator
+            if (!ctx.pageLsns.isEmpty() && ctx.pageLsns.getLast() == RESTART_OP) {
+                ctx.pageLsns.removeLast(); // pop the restart op indicator
                 continue;
             }
 
@@ -438,8 +431,9 @@
 
     private void unsetSmPages(BTreeOpContext ctx) throws Exception {
         ICachedPage originalPage = ctx.interiorFrame.getPage();
-        for (Integer i : ctx.smPages) {
-            ICachedPage smPage = bufferCache.pin(FileInfo.getDiskPageId(fileId, i), false);
+        for(int i = 0; i < ctx.smPages.size(); i++) {
+            int pageId = ctx.smPages.get(i);
+        	ICachedPage smPage = bufferCache.pin(FileInfo.getDiskPageId(fileId, pageId), false);
             pins++;
             smPage.acquireWriteLatch(); // TODO: would like to set page dirty without latching
             writeLatchesAcquired++;
@@ -522,19 +516,14 @@
         }
     }
 
-    public void insert(ITupleReference tuple, IBTreeLeafFrame leafFrame, IBTreeInteriorFrame interiorFrame,
-            IBTreeMetaDataFrame metaFrame) throws Exception {
-        BTreeOpContext ctx = new BTreeOpContext();
-        ctx.op = BTreeOp.BTO_INSERT;
-        ctx.leafFrame = leafFrame;
-        ctx.interiorFrame = interiorFrame;
-        ctx.metaFrame = metaFrame;
-        ctx.pred = new RangePredicate(true, tuple, tuple, true, true, cmp);
-        ctx.splitKey = new SplitKey(leafFrame.getTupleWriter().createTupleReference());
+    public void insert(ITupleReference tuple, BTreeOpContext ctx) throws Exception {       
+    	ctx.reset();
+    	ctx.pred.setComparator(cmp);
+        ctx.pred.setLowKey(tuple, true);
+        ctx.pred.setHighKey(tuple, true);
+        ctx.splitKey.reset();
         ctx.splitKey.getTuple().setFieldCount(cmp.getKeyFieldCount());
-        ctx.smPages = new ArrayList<Integer>();
-        ctx.pageLsns = new Stack<Integer>();
-
+        
         boolean repeatOp = true;
         // we use this loop to deal with possibly multiple operation restarts
         // due to ongoing structure modifications during the descent
@@ -543,8 +532,8 @@
 
             // if we reach this stage then we need to restart from the (possibly
             // new) root
-            if (!ctx.pageLsns.isEmpty() && ctx.pageLsns.peek().equals(RESTART_OP)) {
-                ctx.pageLsns.pop(); // pop the restart op indicator
+            if (!ctx.pageLsns.isEmpty() && ctx.pageLsns.getLast() == RESTART_OP) {
+                ctx.pageLsns.removeLast(); // pop the restart op indicator
                 continue;
             }
 
@@ -759,19 +748,13 @@
         }
     }
     
-    public void delete(ITupleReference tuple, IBTreeLeafFrame leafFrame, IBTreeInteriorFrame interiorFrame,
-            IBTreeMetaDataFrame metaFrame) throws Exception {
-        BTreeOpContext ctx = new BTreeOpContext();
-        ctx.op = BTreeOp.BTO_DELETE;
-        ctx.leafFrame = leafFrame;
-        ctx.interiorFrame = interiorFrame;
-        ctx.metaFrame = metaFrame;
-        ctx.pred = new RangePredicate(true, tuple, tuple, true, true, cmp);
-        ctx.splitKey = new SplitKey(leafFrame.getTupleWriter().createTupleReference());
-        ctx.splitKey.getTuple().setFieldCount(cmp.getKeyFieldCount());
-        ctx.smPages = new ArrayList<Integer>();
-        ctx.pageLsns = new Stack<Integer>();
-        ctx.freePages = new ArrayList<Integer>();
+    public void delete(ITupleReference tuple, BTreeOpContext ctx) throws Exception {       
+    	ctx.reset();
+    	ctx.pred.setComparator(cmp);
+        ctx.pred.setLowKey(tuple, true);
+        ctx.pred.setHighKey(tuple, true);        
+        ctx.splitKey.reset();
+        ctx.splitKey.getTuple().setFieldCount(cmp.getKeyFieldCount());        
         
         boolean repeatOp = true;
         // we use this loop to deal with possibly multiple operation restarts
@@ -781,8 +764,8 @@
 
             // if we reach this stage then we need to restart from the (possibly
             // new) root
-            if (!ctx.pageLsns.isEmpty() && ctx.pageLsns.peek().equals(RESTART_OP)) {
-                ctx.pageLsns.pop(); // pop the restart op indicator
+            if (!ctx.pageLsns.isEmpty() && ctx.pageLsns.getLast() == RESTART_OP) {
+                ctx.pageLsns.removeLast(); // pop the restart op indicator
                 continue;
             }
 
@@ -793,8 +776,8 @@
                 rootNode.acquireWriteLatch();
                 writeLatchesAcquired++;
                 try {
-                    leafFrame.setPage(rootNode);
-                    leafFrame.initBuffer((byte) 0);
+                    ctx.leafFrame.setPage(rootNode);
+                    ctx.leafFrame.initBuffer((byte) 0);
                     currentLevel = 0; // debug
                 } finally {
                     rootNode.releaseWriteLatch();
@@ -978,7 +961,7 @@
         ctx.interiorFrame.setPage(node);
         boolean isConsistent = false;
         try {
-            isConsistent = ctx.pageLsns.peek().equals(ctx.interiorFrame.getPageLsn());
+            isConsistent = ctx.pageLsns.getLast() == ctx.interiorFrame.getPageLsn();
         } finally {
             node.releaseReadLatch();
             readLatchesReleased++;
@@ -999,8 +982,8 @@
 
         // remember trail of pageLsns, to unwind recursion in case of an ongoing
         // structure modification
-        ctx.pageLsns.push(ctx.interiorFrame.getPageLsn());
-
+        ctx.pageLsns.add(ctx.interiorFrame.getPageLsn());
+        
         try {
 
             // latch coupling, note: parent should never be write latched,
@@ -1022,18 +1005,18 @@
                         int childPageId = ctx.interiorFrame.getChildPageId(ctx.pred, cmp);                                                
                         performOp(childPageId, node, ctx);
 
-                        if (!ctx.pageLsns.isEmpty() && ctx.pageLsns.peek().equals(RESTART_OP)) {
-                            ctx.pageLsns.pop(); // pop the restart op indicator
+                        if (!ctx.pageLsns.isEmpty() && ctx.pageLsns.getLast() == RESTART_OP) {
+                            ctx.pageLsns.removeLast(); // pop the restart op indicator
                             if (isConsistent(pageId, ctx)) {
                                 node = null; // to avoid unpinning and
                                 // unlatching node again in
                                 // recursive call
                                 continue; // descend the tree again
                             } else {
-                                ctx.pageLsns.pop(); // pop pageLsn of this page
+                                ctx.pageLsns.removeLast(); // pop pageLsn of this page
                                 // (version seen by this op
                                 // during descent)
-                                ctx.pageLsns.push(RESTART_OP); // this node is
+                                ctx.pageLsns.add(RESTART_OP); // this node is
                                 // not
                                 // consistent,
                                 // set the
@@ -1113,10 +1096,10 @@
 
                     // unwind recursion and restart operation, find lowest page
                     // with a pageLsn as seen by this operation during descent
-                    ctx.pageLsns.pop(); // pop current page lsn
+                    ctx.pageLsns.removeLast(); // pop current page lsn
                     // put special value on the stack to inform caller of
                     // restart
-                    ctx.pageLsns.push(RESTART_OP);
+                    ctx.pageLsns.add(RESTART_OP);
                 }
             } else { // isLeaf and !smFlag
                 switch (ctx.op) {
@@ -1334,6 +1317,12 @@
         loaded = true;
     }
         
+    public BTreeOpContext createOpContext(BTreeOp op, IBTreeLeafFrame leafFrame, IBTreeInteriorFrame interiorFrame,
+            IBTreeMetaDataFrame metaFrame) {    	
+    	// TODO: figure out better tree-height hint
+    	return new BTreeOpContext(op, leafFrame, interiorFrame, metaFrame, 6);    	
+    }
+        
     public IBTreeInteriorFrameFactory getInteriorFrameFactory() {
         return interiorFrameFactory;
     }
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTreeOpContext.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTreeOpContext.java
index 9a81c96..390831d 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTreeOpContext.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTreeOpContext.java
@@ -15,24 +15,49 @@
 
 package edu.uci.ics.hyracks.storage.am.btree.impls;
 
-import java.util.ArrayList;
-import java.util.Stack;
-
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeCursor;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeInteriorFrame;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrame;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeMetaDataFrame;
 
 public final class BTreeOpContext {
-	public BTreeOp op;
-	public IBTreeLeafFrame leafFrame;
-	public IBTreeInteriorFrame interiorFrame;
-	public IBTreeMetaDataFrame metaFrame;
+	public final BTreeOp op;
+	public final IBTreeLeafFrame leafFrame;
+	public final IBTreeInteriorFrame interiorFrame;
+	public final IBTreeMetaDataFrame metaFrame;
 	public IBTreeCursor cursor;
 	public RangePredicate pred;	
-	public SplitKey splitKey;
+	public final SplitKey splitKey;
 	public int opRestarts = 0;
-	public ArrayList<Integer> smPages;	
-	public Stack<Integer> pageLsns;
-	public ArrayList<Integer> freePages;
+	public final IntArrayList pageLsns; // used like a stack
+	public final IntArrayList smPages;	
+	public final IntArrayList freePages;
+
+	public BTreeOpContext(BTreeOp op, IBTreeLeafFrame leafFrame, IBTreeInteriorFrame interiorFrame,
+			IBTreeMetaDataFrame metaFrame, int treeHeightHint) {
+		this.op = op;
+		this.leafFrame = leafFrame;
+		this.interiorFrame = interiorFrame;
+		this.metaFrame = metaFrame;
+		
+		pageLsns = new IntArrayList(treeHeightHint, treeHeightHint);	
+		if(op != BTreeOp.BTO_SEARCH) {			
+			smPages = new IntArrayList(treeHeightHint, treeHeightHint);
+			freePages = new IntArrayList(treeHeightHint, treeHeightHint);
+			pred = new RangePredicate(true, null, null, true, true, null);
+			splitKey = new SplitKey(leafFrame.getTupleWriter().createTupleReference());
+		}
+		else {			
+			smPages = null;
+			freePages = null;	
+			splitKey = null;
+		}		
+	}
+	
+	public void reset() {
+		if(pageLsns != null) pageLsns.clear();
+		if(freePages != null) freePages.clear();
+		if(smPages != null) smPages.clear();
+		opRestarts = 0;
+	}
 }
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/IntArrayList.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/IntArrayList.java
new file mode 100644
index 0000000..124cccd
--- /dev/null
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/IntArrayList.java
@@ -0,0 +1,48 @@
+package edu.uci.ics.hyracks.storage.am.btree.impls;
+
+public class IntArrayList {
+	private int[] data;
+	private int size;
+	private final int growth;
+	
+	public IntArrayList(int initialCapacity, int growth) {
+		data = new int[initialCapacity];
+		size = 0;
+		this.growth = growth;		
+	}
+		
+	public int size() {
+		return size;
+	}
+	
+	public void add(int i) {
+		if(size == data.length) {
+			int[] newData = new int[data.length + growth];
+			System.arraycopy(data, 0, newData, 0, data.length);
+			data = newData;
+		}
+		
+		data[size++] = i;
+	}	
+	
+	public void removeLast() {
+		if(size > 0) size--;
+	}
+	
+	// WARNING: caller is responsible for checking size > 0
+	public int getLast() {
+		return data[size-1];
+	}
+	
+	public int get(int i) {
+		return data[i];
+	}
+	
+	public void clear() {
+		size = 0;
+	}
+	
+	public boolean isEmpty() {
+		return size == 0;
+	}
+}
diff --git a/hyracks-storage-am-btree/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeTest.java b/hyracks-storage-am-btree/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeTest.java
index a4c488b..78b6d4d78 100644
--- a/hyracks-storage-am-btree/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeTest.java
+++ b/hyracks-storage-am-btree/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeTest.java
@@ -52,6 +52,8 @@
 import edu.uci.ics.hyracks.storage.am.btree.frames.NSMLeafFrameFactory;
 import edu.uci.ics.hyracks.storage.am.btree.impls.BTree;
 import edu.uci.ics.hyracks.storage.am.btree.impls.BTreeException;
+import edu.uci.ics.hyracks.storage.am.btree.impls.BTreeOp;
+import edu.uci.ics.hyracks.storage.am.btree.impls.BTreeOpContext;
 import edu.uci.ics.hyracks.storage.am.btree.impls.DiskOrderScanCursor;
 import edu.uci.ics.hyracks.storage.am.btree.impls.MultiComparator;
 import edu.uci.ics.hyracks.storage.am.btree.impls.RangePredicate;
@@ -164,6 +166,8 @@
 		accessor.reset(frame);
 		FrameTupleReference tuple = new FrameTupleReference();
 		
+		BTreeOpContext insertOpCtx = btree.createOpContext(BTreeOp.BTO_INSERT, leafFrame, interiorFrame, metaFrame);
+		
 		// 10000
         for (int i = 0; i < 10000; i++) {        	        	
         	        	
@@ -189,7 +193,7 @@
             }
             
             try {                                
-                btree.insert(tuple, leafFrame, interiorFrame, metaFrame);
+                btree.insert(tuple, insertOpCtx);
             } catch (BTreeException e) {            	
             } catch (Exception e) {
             	e.printStackTrace();
@@ -216,7 +220,8 @@
         print("ORDERED SCAN:\n");
         IBTreeCursor scanCursor = new RangeSearchCursor(leafFrame);
         RangePredicate nullPred = new RangePredicate(true, null, null, true, true, null);
-        btree.search(scanCursor, nullPred, leafFrame, interiorFrame);
+        BTreeOpContext searchOpCtx = btree.createOpContext(BTreeOp.BTO_SEARCH, leafFrame, interiorFrame, null);
+        btree.search(scanCursor, nullPred, searchOpCtx);
         try {
             while (scanCursor.hasNext()) {
                 scanCursor.next();                
@@ -290,8 +295,8 @@
         MultiComparator searchCmp = new MultiComparator(typeTraits, searchCmps);
         
         RangePredicate rangePred = new RangePredicate(true, lowKey, highKey, true, true, searchCmp);
-        btree.search(rangeCursor, rangePred, leafFrame, interiorFrame);
-
+        btree.search(rangeCursor, rangePred, searchOpCtx);
+        
         try {
             while (rangeCursor.hasNext()) {
                 rangeCursor.next();
@@ -382,6 +387,8 @@
 		accessor.reset(frame);
 		FrameTupleReference tuple = new FrameTupleReference();
         
+		BTreeOpContext insertOpCtx = btree.createOpContext(BTreeOp.BTO_INSERT, leafFrame, interiorFrame, metaFrame);
+		
         for (int i = 0; i < 10000; i++) {        	
         	int f0 = rnd.nextInt() % 2000;
         	int f1 = rnd.nextInt() % 1000;
@@ -405,7 +412,7 @@
             }
             
             try {
-                btree.insert(tuple, leafFrame, interiorFrame, metaFrame);
+                btree.insert(tuple, insertOpCtx);
             } catch (Exception e) {
             }
         }
@@ -419,7 +426,8 @@
         print("ORDERED SCAN:\n");        
         IBTreeCursor scanCursor = new RangeSearchCursor(leafFrame);
         RangePredicate nullPred = new RangePredicate(true, null, null, true, true, null);
-        btree.search(scanCursor, nullPred, leafFrame, interiorFrame);
+        BTreeOpContext searchOpCtx = btree.createOpContext(BTreeOp.BTO_SEARCH, leafFrame, interiorFrame, null);
+        btree.search(scanCursor, nullPred, searchOpCtx);
         
         try {
             while (scanCursor.hasNext()) {
@@ -475,7 +483,7 @@
         MultiComparator searchCmp = new MultiComparator(typeTraits, searchCmps); // use only a single comparator for searching
         
         RangePredicate rangePred = new RangePredicate(true, lowKey, highKey, true, true, searchCmp);
-        btree.search(rangeCursor, rangePred, leafFrame, interiorFrame);
+        btree.search(rangeCursor, rangePred, searchOpCtx);
         
         try {
             while (rangeCursor.hasNext()) {
@@ -560,6 +568,7 @@
 		accessor.reset(frame);
 		FrameTupleReference tuple = new FrameTupleReference();
     	
+		BTreeOpContext insertOpCtx = btree.createOpContext(BTreeOp.BTO_INSERT, leafFrame, interiorFrame, metaFrame);
     	int maxLength = 10; // max string length to be generated
     	for (int i = 0; i < 10000; i++) {
     		    		
@@ -583,7 +592,7 @@
     		}
 
     		try {
-    			btree.insert(tuple, leafFrame, interiorFrame, metaFrame);
+    			btree.insert(tuple, insertOpCtx);
     		} catch (Exception e) {
     			//e.printStackTrace();
     		}    		    	    		
@@ -596,7 +605,8 @@
         print("ORDERED SCAN:\n");        
         IBTreeCursor scanCursor = new RangeSearchCursor(leafFrame);
         RangePredicate nullPred = new RangePredicate(true, null, null, true, true, null);
-        btree.search(scanCursor, nullPred, leafFrame, interiorFrame);
+        BTreeOpContext searchOpCtx = btree.createOpContext(BTreeOp.BTO_SEARCH, leafFrame, interiorFrame, null);
+        btree.search(scanCursor, nullPred, searchOpCtx);
         
         try {
             while (scanCursor.hasNext()) {
@@ -652,7 +662,7 @@
         MultiComparator searchCmp = new MultiComparator(typeTraits, searchCmps);
         
         RangePredicate rangePred = new RangePredicate(true, lowKey, highKey, true, true, searchCmp);
-        btree.search(rangeCursor, rangePred, leafFrame, interiorFrame);
+        btree.search(rangeCursor, rangePred, searchOpCtx);
 
         try {
             while (rangeCursor.hasNext()) {
@@ -738,6 +748,9 @@
 		accessor.reset(frame);
 		FrameTupleReference tuple = new FrameTupleReference();
         
+		BTreeOpContext insertOpCtx = btree.createOpContext(BTreeOp.BTO_INSERT, leafFrame, interiorFrame, metaFrame);
+		BTreeOpContext deleteOpCtx = btree.createOpContext(BTreeOp.BTO_DELETE, leafFrame, interiorFrame, metaFrame);
+		
         int runs = 3;
         for (int run = 0; run < runs; run++) {
         	
@@ -772,11 +785,12 @@
                 	print("INSERTING " + i + "\n");
                 	//print("INSERTING " + i + ": " + cmp.printRecord(record, 0) + "\n");                                       
                 }
-
+                
                 try {
-                    btree.insert(tuple, leafFrame, interiorFrame, metaFrame);
+                    btree.insert(tuple, insertOpCtx);
                     insDone++;
-                } catch (BTreeException e) {                	
+                } catch (BTreeException e) {     
+                	//e.printStackTrace();
                 } catch (Exception e) {
                 	e.printStackTrace();
                 }
@@ -807,13 +821,14 @@
                 }
 
                 try {
-                    btree.delete(tuple, leafFrame, interiorFrame, metaFrame);
+                    btree.delete(tuple, deleteOpCtx);
                     delDone++;
-                } catch (BTreeException e) {                	
+                } catch (BTreeException e) {     
+                	//e.printStackTrace();
                 } catch (Exception e) {
                 	e.printStackTrace();
                 }
-
+                
                 if (insDoneCmp[i] != delDone) {
                     print("INCONSISTENT STATE, ERROR IN DELETION TEST\n");
                     print("INSDONECMP: " + insDoneCmp[i] + " " + delDone + "\n"); 
@@ -974,7 +989,8 @@
         
         // TODO: check when searching backwards
         RangePredicate rangePred = new RangePredicate(true, lowKey, highKey, true, true, searchCmp);
-        btree.search(rangeCursor, rangePred, leafFrame, interiorFrame);
+        BTreeOpContext searchOpCtx = btree.createOpContext(BTreeOp.BTO_SEARCH, leafFrame, interiorFrame, null);
+        btree.search(rangeCursor, rangePred, searchOpCtx);
         
         try {
             while (rangeCursor.hasNext()) {
@@ -1093,6 +1109,8 @@
         intervals[9][0] = 20;
         intervals[9][1] = 35;
 
+        BTreeOpContext insertOpCtx = btree.createOpContext(BTreeOp.BTO_INSERT, leafFrame, interiorFrame, metaFrame);
+        
         // int exceptionCount = 0;
         for (int i = 0; i < intervalCount; i++) {        	
         	int f0 = intervals[i][0];
@@ -1116,7 +1134,7 @@
         	print("INSERTING " + i + "\n");
 
             try {
-                btree.insert(tuple, leafFrame, interiorFrame, metaFrame);
+                btree.insert(tuple, insertOpCtx);
             } catch (Exception e) {
                 // e.printStackTrace();
             }
@@ -1133,7 +1151,8 @@
         print("ORDERED SCAN:\n");
         IBTreeCursor scanCursor = new RangeSearchCursor(leafFrame);
         RangePredicate nullPred = new RangePredicate(true, null, null, true, true, null);
-        btree.search(scanCursor, nullPred, leafFrame, interiorFrame);
+        BTreeOpContext searchOpCtx = btree.createOpContext(BTreeOp.BTO_SEARCH, leafFrame, interiorFrame, null);
+        btree.search(scanCursor, nullPred, searchOpCtx);
 
         try {
             while (scanCursor.hasNext()) {
@@ -1195,7 +1214,7 @@
         //print("INDEX RANGE SEARCH ON: " + cmp.printKey(lowKey, 0) + " " + cmp.printKey(highKey, 0) + "\n");                
         
         RangePredicate rangePred = new RangePredicate(true, lowKey, highKey, true, true, searchCmp);
-        btree.search(rangeCursor, rangePred, leafFrame, interiorFrame);
+        btree.search(rangeCursor, rangePred, searchOpCtx);
         
         try {
             while (rangeCursor.hasNext()) {
diff --git a/hyracks-storage-am-invertedindex/src/main/java/edu/uci/ics/hyracks/storage/am/invertedindex/impls/SimpleConjunctiveSearcher.java b/hyracks-storage-am-invertedindex/src/main/java/edu/uci/ics/hyracks/storage/am/invertedindex/impls/SimpleConjunctiveSearcher.java
index 72f57f4..e3067a3 100644
--- a/hyracks-storage-am-invertedindex/src/main/java/edu/uci/ics/hyracks/storage/am/invertedindex/impls/SimpleConjunctiveSearcher.java
+++ b/hyracks-storage-am-invertedindex/src/main/java/edu/uci/ics/hyracks/storage/am/invertedindex/impls/SimpleConjunctiveSearcher.java
@@ -21,6 +21,8 @@
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeInteriorFrame;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrame;
 import edu.uci.ics.hyracks.storage.am.btree.impls.BTree;
+import edu.uci.ics.hyracks.storage.am.btree.impls.BTreeOp;
+import edu.uci.ics.hyracks.storage.am.btree.impls.BTreeOpContext;
 import edu.uci.ics.hyracks.storage.am.btree.impls.MultiComparator;
 import edu.uci.ics.hyracks.storage.am.btree.impls.RangePredicate;
 import edu.uci.ics.hyracks.storage.am.btree.impls.RangeSearchCursor;
@@ -130,11 +132,13 @@
 		
 		maxResultBufIdx = 0;
 				
+		BTreeOpContext opCtx = btree.createOpContext(BTreeOp.BTO_SEARCH, leafFrame, interiorFrame, null);
+		
 		resultTupleAppender.reset(newResultBuffers.get(0), true);
 		try {			
 			// append first inverted list to temporary results
 			searchKey.reset(queryTokenAccessor, 0);
-			btree.search(btreeCursor, pred, leafFrame, interiorFrame);
+			btree.search(btreeCursor, pred, opCtx);
 			while(btreeCursor.hasNext()) {
 				btreeCursor.next();
 				maxResultBufIdx = appendTupleToNewResults(btreeCursor, maxResultBufIdx);
@@ -153,7 +157,7 @@
 			newResultBuffers = swap;
 			try {
 				searchKey.reset(queryTokenAccessor, i);
-				btree.search(btreeCursor, pred, leafFrame, interiorFrame);
+				btree.search(btreeCursor, pred, opCtx);
 				maxResultBufIdx = intersectList(btreeCursor, prevResultBuffers, maxResultBufIdx, newResultBuffers);			
 			} catch (Exception e) {
 				throw new HyracksDataException(e);
diff --git a/hyracks-storage-am-invertedindex/src/test/java/edu/uci/ics/hyracks/storage/am/invertedindex/searchers/SimpleConjunctiveSearcherTest.java b/hyracks-storage-am-invertedindex/src/test/java/edu/uci/ics/hyracks/storage/am/invertedindex/searchers/SimpleConjunctiveSearcherTest.java
index 3f00e4c..fa5ec4c 100644
--- a/hyracks-storage-am-invertedindex/src/test/java/edu/uci/ics/hyracks/storage/am/invertedindex/searchers/SimpleConjunctiveSearcherTest.java
+++ b/hyracks-storage-am-invertedindex/src/test/java/edu/uci/ics/hyracks/storage/am/invertedindex/searchers/SimpleConjunctiveSearcherTest.java
@@ -39,8 +39,10 @@
 import edu.uci.ics.hyracks.storage.am.btree.frames.NSMInteriorFrameFactory;
 import edu.uci.ics.hyracks.storage.am.btree.frames.NSMLeafFrameFactory;
 import edu.uci.ics.hyracks.storage.am.btree.impls.BTree;
+import edu.uci.ics.hyracks.storage.am.btree.impls.BTreeOp;
+import edu.uci.ics.hyracks.storage.am.btree.impls.BTreeOpContext;
 import edu.uci.ics.hyracks.storage.am.btree.impls.MultiComparator;
-import edu.uci.ics.hyracks.storage.am.btree.tuples.SimpleTupleWriterFactory;
+import edu.uci.ics.hyracks.storage.am.btree.tuples.TypeAwareTupleWriterFactory;
 import edu.uci.ics.hyracks.storage.am.invertedindex.api.IBinaryTokenizer;
 import edu.uci.ics.hyracks.storage.am.invertedindex.api.IInvertedIndexResultCursor;
 import edu.uci.ics.hyracks.storage.am.invertedindex.impls.SimpleConjunctiveSearcher;
@@ -62,7 +64,7 @@
 
 	// realistic params
 	//private static final int PAGE_SIZE = 32768;
-    //private static final int NUM_PAGES = 1000;
+    //private static final int NUM_PAGES = 100;
     //private static final int HYRACKS_FRAME_SIZE = 32768;
     
 	private String tmpDir = System.getProperty("java.io.tmpdir");
@@ -106,9 +108,10 @@
     	
     	MultiComparator cmp = new MultiComparator(typeTraits, cmps);
     	    	
-    	//TypeAwareTupleWriterFactory tupleWriterFactory = new TypeAwareTupleWriterFactory(typeTraits);
-    	SimpleTupleWriterFactory tupleWriterFactory = new SimpleTupleWriterFactory();
+    	TypeAwareTupleWriterFactory tupleWriterFactory = new TypeAwareTupleWriterFactory(typeTraits);
+    	//SimpleTupleWriterFactory tupleWriterFactory = new SimpleTupleWriterFactory();
         IBTreeLeafFrameFactory leafFrameFactory = new NSMLeafFrameFactory(tupleWriterFactory);
+    	//IBTreeLeafFrameFactory leafFrameFactory = new FieldPrefixNSMLeafFrameFactory(tupleWriterFactory);
         IBTreeInteriorFrameFactory interiorFrameFactory = new NSMInteriorFrameFactory(tupleWriterFactory);
         IBTreeMetaDataFrameFactory metaFrameFactory = new MetaDataFrameFactory();
         
@@ -147,6 +150,8 @@
 		int addProb = 0;
 		int addProbStep = 2;
 		
+		BTreeOpContext opCtx = btree.createOpContext(BTreeOp.BTO_INSERT, leafFrame, interiorFrame, metaFrame);
+		
     	for (int i = 0; i < tokens.size(); i++) {
     		
     		addProb += addProbStep;
@@ -164,7 +169,7 @@
     				tuple.reset(accessor, 0);
 
     				try {
-    					btree.insert(tuple, leafFrame, interiorFrame, metaFrame);
+    					btree.insert(tuple, opCtx);
     				} catch (Exception e) {
     					e.printStackTrace();
     				}    	
