diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/freepage/LinkedMetaDataPageManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/freepage/LinkedMetaDataPageManager.java
index fbb16b2..e7a1123 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/freepage/LinkedMetaDataPageManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/freepage/LinkedMetaDataPageManager.java
@@ -18,7 +18,6 @@
  */
 package org.apache.hyracks.storage.am.common.freepage;
 
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.common.api.IMetaDataPageManager;
@@ -44,7 +43,6 @@
     private boolean appendOnly = false;
     ICachedPage confiscatedMetaNode;
     ICachedPage filterPage;
-    private static Logger LOGGER = Logger.getLogger(LinkedMetaDataPageManager.class.getName());
 
     public LinkedMetaDataPageManager(IBufferCache bufferCache, ITreeIndexMetaDataFrameFactory metaDataFrameFactory) {
         this.bufferCache = bufferCache;
@@ -65,7 +63,8 @@
                 // allocate a new page in the chain of meta pages
                 int newPage = metaFrame.getFreePage();
                 if (newPage < 0) {
-                    throw new Exception("Inconsistent Meta Page State. It has no space, but it also has no entries.");
+                    throw new HyracksDataException(
+                              "Inconsistent Meta Page State. It has no space, but it also has no entries.");
                 }
 
                 ICachedPage newNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, newPage), false);
@@ -87,8 +86,6 @@
                     bufferCache.unpin(newNode);
                 }
             }
-        } catch (Exception e) {
-            e.printStackTrace();
         } finally {
             metaNode.releaseWriteLatch(true);
             bufferCache.unpin(metaNode);
@@ -181,7 +178,7 @@
     @Override
     public int getMaxPage(ITreeIndexMetaDataFrame metaFrame) throws HyracksDataException {
         ICachedPage metaNode;
-        if (!appendOnly || (appendOnly && confiscatedMetaNode == null)) {
+        if (!appendOnly || confiscatedMetaNode == null) {
             int mdPage = getFirstMetadataPage();
             if (mdPage < 0) {
                 return IBufferCache.INVALID_PAGEID;
@@ -197,7 +194,7 @@
             maxPage = metaFrame.getMaxPage();
         } finally {
             metaNode.releaseReadLatch();
-            if (!appendOnly || (appendOnly && confiscatedMetaNode == null)) {
+            if (!appendOnly || confiscatedMetaNode == null) {
                 bufferCache.unpin(metaNode);
             }
         }
@@ -235,7 +232,7 @@
     public int getFilterPageId() throws HyracksDataException {
         ICachedPage metaNode;
         int filterPageId = NO_FILTER_IN_PLACE;
-        if (!appendOnly || (appendOnly && confiscatedMetaNode == null)) {
+        if (!appendOnly || confiscatedMetaNode == null) {
             metaNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, getFirstMetadataPage()), false);
         } else {
             metaNode = confiscatedMetaNode;
@@ -251,7 +248,7 @@
             }
         } finally {
             metaNode.releaseReadLatch();
-            if (!appendOnly || (appendOnly && confiscatedMetaNode == null)) {
+            if (!appendOnly || confiscatedMetaNode == null) {
                 bufferCache.unpin(metaNode);
             }
         }
@@ -316,7 +313,7 @@
 
     @Override
     public boolean isMetaPage(ITreeIndexMetaDataFrame metaFrame) {
-        return (metaFrame.getLevel() == META_PAGE_LEVEL_INDICATOR);
+        return metaFrame.getLevel() == META_PAGE_LEVEL_INDICATOR;
     }
 
     @Override
@@ -345,6 +342,7 @@
             ITreeIndexMetaDataFrame metaFrame = metaDataFrameFactory.createFrame();
             metaFrame.setPage(confiscatedMetaNode);
             int finalFilterPage = getFreePage(metaFrame);
+            setFilterPageId(finalFilterPage);
             bufferCache.setPageDiskId(filterPage, BufferedFileHandle.getDiskPageId(fileId, finalFilterPage));
             queue.put(filterPage);
         }
@@ -413,7 +411,7 @@
     @Override
     public long getLSN() throws HyracksDataException {
         ICachedPage metaNode;
-        if (!appendOnly || (appendOnly && confiscatedMetaNode == null)) {
+        if (!appendOnly || confiscatedMetaNode == null) {
             metaNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, getFirstMetadataPage()), false);
         } else {
             metaNode = confiscatedMetaNode;
@@ -425,7 +423,7 @@
             return metaFrame.getLSN();
         } finally {
             metaNode.releaseReadLatch();
-            if (!appendOnly || (appendOnly && confiscatedMetaNode == null)) {
+            if (!appendOnly || confiscatedMetaNode == null) {
                 bufferCache.unpin(metaNode);
             }
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java
index 3a7eb77..0dcfc90 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java
@@ -46,6 +46,7 @@
 public abstract class AbstractTreeIndex implements ITreeIndex {
 
     public static final int MINIMAL_TREE_PAGE_COUNT = 2;
+    public static final int MINIMAL_TREE_PAGE_COUNT_WITH_FILTER = 3;
     protected int rootPage = 1;
 
     protected final IBufferCache bufferCache;
@@ -70,12 +71,10 @@
 
     protected int bulkloadLeafStart = 0;
 
-
     public AbstractTreeIndex(IBufferCache bufferCache, IFileMapProvider fileMapProvider,
-                             IMetaDataPageManager freePageManager, ITreeIndexFrameFactory interiorFrameFactory,
-                             ITreeIndexFrameFactory leafFrameFactory, IBinaryComparatorFactory[] cmpFactories,
-                             int fieldCount,
-                             FileReference file) {
+            IMetaDataPageManager freePageManager, ITreeIndexFrameFactory interiorFrameFactory,
+            ITreeIndexFrameFactory leafFrameFactory, IBinaryComparatorFactory[] cmpFactories, int fieldCount,
+            FileReference file) {
         this.bufferCache = bufferCache;
         this.fileMapProvider = fileMapProvider;
         this.freePageManager = freePageManager;
@@ -141,16 +140,25 @@
         }
     }
 
-    private void setRootAndMetadataPages(boolean appendOnly) throws HyracksDataException{
+    private void setRootAndMetadataPages(boolean appendOnly) throws HyracksDataException {
         if (!appendOnly) {
             // regular or empty tree
             rootPage = 1;
             bulkloadLeafStart = 2;
         } else {
-            // bulkload-only tree (used e.g. for HDFS). -1 is meta page, -2 is root page
+            //the root page is either page n-2 (no filter) or n-3 (filter)
             int numPages = bufferCache.getNumPagesOfFile(fileId);
-            //the root page is the last page before the metadata page
-            rootPage = numPages > MINIMAL_TREE_PAGE_COUNT ? numPages - MINIMAL_TREE_PAGE_COUNT : 0;
+            if (numPages > MINIMAL_TREE_PAGE_COUNT) {
+                int filterPageId = freePageManager.getFilterPageId();
+                if (filterPageId > 0) {
+                    rootPage = numPages - MINIMAL_TREE_PAGE_COUNT_WITH_FILTER;
+                } else {
+                    rootPage = numPages - MINIMAL_TREE_PAGE_COUNT;
+                }
+            } else {
+                rootPage = 0;
+            }
+
             //leaves start from the very beginning of the file.
             bulkloadLeafStart = 0;
         }
@@ -188,10 +196,9 @@
         int mdPageLoc = freePageManager.getFirstMetadataPage();
         ITreeIndexMetaDataFrame metaFrame = freePageManager.getMetaDataFrameFactory().createFrame();
         int numPages = freePageManager.getMaxPage(metaFrame);
-        if(mdPageLoc > 1 || (mdPageLoc == 1 && numPages <= MINIMAL_TREE_PAGE_COUNT -1)) { //md page doesn't count itself
+        if (mdPageLoc > 1 || (mdPageLoc == 1 && numPages <= MINIMAL_TREE_PAGE_COUNT - 1)) { //md page doesn't count
             appendOnly = true;
-        }
-        else{
+        } else {
             appendOnly = false;
         }
         setRootAndMetadataPages(appendOnly);
@@ -245,7 +252,7 @@
         if (rootPage == -1) {
             return true;
         }
-        if(freePageManager.appendOnlyMode() && bufferCache.getNumPagesOfFile(fileId) <= MINIMAL_TREE_PAGE_COUNT){
+        if (freePageManager.appendOnlyMode() && bufferCache.getNumPagesOfFile(fileId) <= MINIMAL_TREE_PAGE_COUNT) {
             return true;
         }
         ICachedPage rootNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, rootPage), false);
@@ -263,8 +270,6 @@
         }
     }
 
-
-
     public byte getTreeHeight(ITreeIndexFrame frame) throws HyracksDataException {
         ICachedPage rootNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, rootPage), false);
         rootNode.acquireReadLatch();
@@ -331,8 +336,8 @@
         protected final IFIFOPageQueue queue;
         protected List<ICachedPage> pagesToWrite;
 
-        public AbstractTreeIndexBulkLoader(float fillFactor, boolean appendOnly) throws TreeIndexException,
-                HyracksDataException {
+        public AbstractTreeIndexBulkLoader(float fillFactor, boolean appendOnly)
+                throws TreeIndexException, HyracksDataException {
             //Initialize the tree
             if (appendOnly) {
                 create(appendOnly);
@@ -359,8 +364,8 @@
 
             NodeFrontier leafFrontier = new NodeFrontier(leafFrame.createTupleReference());
             leafFrontier.pageId = freePageManager.getFreePage(metaFrame);
-            leafFrontier.page = bufferCache.confiscatePage(
-                    BufferedFileHandle.getDiskPageId(fileId, leafFrontier.pageId));
+            leafFrontier.page = bufferCache
+                    .confiscatePage(BufferedFileHandle.getDiskPageId(fileId, leafFrontier.pageId));
 
             interiorFrame.setPage(leafFrontier.page);
             interiorFrame.initBuffer((byte) 0);
@@ -382,10 +387,10 @@
             for (NodeFrontier nodeFrontier : nodeFrontiers) {
                 ICachedPage frontierPage = nodeFrontier.page;
                 if (frontierPage.confiscated()) {
-                    bufferCache.returnPage(frontierPage,false);
+                    bufferCache.returnPage(frontierPage, false);
                 }
             }
-            for(ICachedPage pageToDiscard: pagesToWrite){
+            for (ICachedPage pageToDiscard : pagesToWrite) {
                 bufferCache.returnPage(pageToDiscard, false);
             }
             releasedLatches = true;
@@ -400,8 +405,8 @@
                 newRoot.acquireWriteLatch();
                 //root will be the highest frontier
                 NodeFrontier lastNodeFrontier = nodeFrontiers.get(nodeFrontiers.size() - 1);
-                ICachedPage oldRoot = bufferCache.pin(
-                        BufferedFileHandle.getDiskPageId(fileId, lastNodeFrontier.pageId), false);
+                ICachedPage oldRoot = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, lastNodeFrontier.pageId),
+                        false);
                 oldRoot.acquireReadLatch();
                 lastNodeFrontier.page = oldRoot;
                 try {
