diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFileManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFileManager.java
index b5d1c79..91316dc 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFileManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFileManager.java
@@ -20,7 +20,6 @@
 package org.apache.hyracks.storage.am.lsm.btree.impls;
 
 import java.io.FilenameFilter;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -32,7 +31,6 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.FileReference;
 import org.apache.hyracks.api.io.IIOManager;
-import org.apache.hyracks.api.util.IoUtil;
 import org.apache.hyracks.storage.am.common.api.ITreeIndex;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager;
 import org.apache.hyracks.storage.am.lsm.common.impls.IndexComponentFileReference;
@@ -42,7 +40,7 @@
 
 public class LSMBTreeFileManager extends AbstractLSMIndexFileManager {
 
-    private static final FilenameFilter btreeFilter =
+    private static final FilenameFilter BTREE_FILTER =
             (dir, name) -> !name.startsWith(".") && name.endsWith(BTREE_SUFFIX);
     private final TreeIndexFactory<? extends ITreeIndex> btreeFactory;
     private final boolean hasBloomFilter;
@@ -62,7 +60,7 @@
 
     @Override
     public LSMComponentFileReferences getRelFlushFileReference() throws HyracksDataException {
-        String baseName = getNextComponentSequence(btreeFilter);
+        String baseName = getNextComponentSequence(BTREE_FILTER);
         return new LSMComponentFileReferences(getFileReference(baseName + DELIMITER + BTREE_SUFFIX), null,
                 hasBloomFilter ? getFileReference(baseName + DELIMITER + BLOOM_FILTER_SUFFIX) : null);
     }
@@ -79,11 +77,8 @@
         List<LSMComponentFileReferences> validFiles = new ArrayList<>();
         ArrayList<IndexComponentFileReference> allBTreeFiles = new ArrayList<>();
         ArrayList<IndexComponentFileReference> allBloomFilterFiles = new ArrayList<>();
-        // create transaction filter <to hide transaction files>
-        FilenameFilter transactionFilter = getTransactionFileFilter(false);
         // List of valid BTree files.
-        cleanupAndGetValidFilesInternal(getCompoundFilter(transactionFilter, btreeFilter), btreeFactory, allBTreeFiles,
-                btreeFactory.getBufferCache());
+        cleanupAndGetValidFilesInternal(BTREE_FILTER, btreeFactory, allBTreeFiles, btreeFactory.getBufferCache());
         HashSet<String> btreeFilesSet = new HashSet<>();
         for (IndexComponentFileReference cmpFileName : allBTreeFiles) {
             int index = cmpFileName.getFileName().lastIndexOf(DELIMITER);
@@ -91,8 +86,7 @@
         }
 
         if (hasBloomFilter) {
-            validateFiles(btreeFilesSet, allBloomFilterFiles, getCompoundFilter(transactionFilter, bloomFilterFilter),
-                    null, btreeFactory.getBufferCache());
+            validateFiles(btreeFilesSet, allBloomFilterFiles, BLOOM_FILTER_FILTER, null, btreeFactory.getBufferCache());
             // Sanity check.
             if (allBTreeFiles.size() != allBloomFilterFiles.size()) {
                 throw HyracksDataException.create(ErrorCode.UNEQUAL_NUM_FILTERS_TREES, baseDir);
@@ -100,12 +94,12 @@
         }
 
         // Trivial cases.
-        if (allBTreeFiles.isEmpty() || hasBloomFilter && allBloomFilterFiles.isEmpty()) {
+        if (allBTreeFiles.isEmpty()) {
             return validFiles;
         }
 
         // Special case: sorting is not required
-        if (allBTreeFiles.size() == 1 && (!hasBloomFilter || allBloomFilterFiles.size() == 1)) {
+        if (allBTreeFiles.size() == 1) {
             validFiles.add(new LSMComponentFileReferences(allBTreeFiles.get(0).getFileRef(), null,
                     hasBloomFilter ? allBloomFilterFiles.get(0).getFileRef() : null));
             return validFiles;
@@ -169,7 +163,7 @@
         }
         IndexComponentFileReference cmpBTreeFileName = null;
         IndexComponentFileReference cmpBloomFilterFileName = null;
-        while (btreeFileIter.hasNext() && (hasBloomFilter ? bloomFilterFileIter.hasNext() : true)) {
+        while (btreeFileIter.hasNext() && (!hasBloomFilter || bloomFilterFileIter.hasNext())) {
             cmpBTreeFileName = btreeFileIter.next();
             if (hasBloomFilter) {
                 cmpBloomFilterFileName = bloomFilterFileIter.next();
@@ -180,44 +174,4 @@
 
         return validFiles;
     }
-
-    @Override
-    public LSMComponentFileReferences getNewTransactionFileReference() throws IOException {
-        String sequence = getNextComponentSequence(btreeFilter);
-        // Create transaction lock file
-        IoUtil.create(baseDir.getChild(TXN_PREFIX + sequence));
-        String baseName = getNextComponentSequence(btreeFilter);
-        return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + BTREE_SUFFIX), null,
-                baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
-    }
-
-    @Override
-    public LSMComponentFileReferences getTransactionFileReferenceForCommit() throws HyracksDataException {
-        FilenameFilter transactionFilter;
-        String[] files = baseDir.getFile().list(txnFileNameFilter);
-        if (files.length == 0) {
-            return null;
-        }
-        if (files.length != 1) {
-            throw HyracksDataException.create(ErrorCode.FOUND_MULTIPLE_TRANSACTIONS, baseDir);
-        } else {
-            transactionFilter = getTransactionFileFilter(true);
-            FileReference txnFile = baseDir.getChild(files[0]);
-            // get the actual transaction files
-            files = baseDir.getFile().list(transactionFilter);
-            IoUtil.delete(txnFile);
-        }
-        FileReference bTreeFileRef = null;
-        FileReference bloomFilterFileRef = null;
-        for (String fileName : files) {
-            if (fileName.endsWith(BTREE_SUFFIX)) {
-                bTreeFileRef = baseDir.getChild(fileName);
-            } else if (fileName.endsWith(BLOOM_FILTER_SUFFIX)) {
-                bloomFilterFileRef = baseDir.getChild(fileName);
-            } else {
-                throw HyracksDataException.create(ErrorCode.UNRECOGNIZED_INDEX_COMPONENT_FILE, fileName);
-            }
-        }
-        return new LSMComponentFileReferences(bTreeFileRef, null, bloomFilterFileRef);
-    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyAbstractCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyAbstractCursor.java
deleted file mode 100644
index e7b8bbd..0000000
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyAbstractCursor.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.storage.am.lsm.btree.impls;
-
-import java.util.List;
-
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
-import org.apache.hyracks.storage.am.bloomfilter.impls.BloomFilter;
-import org.apache.hyracks.storage.am.btree.api.IBTreeLeafFrame;
-import org.apache.hyracks.storage.am.btree.impls.BTree;
-import org.apache.hyracks.storage.am.btree.impls.BTree.BTreeAccessor;
-import org.apache.hyracks.storage.am.btree.impls.BTreeRangeSearchCursor;
-import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
-import org.apache.hyracks.storage.am.common.api.ILSMIndexCursor;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
-import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.LSMComponentType;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
-import org.apache.hyracks.storage.common.EnforcedIndexCursor;
-import org.apache.hyracks.storage.common.ICursorInitialState;
-import org.apache.hyracks.storage.common.IIndexAccessParameters;
-import org.apache.hyracks.storage.common.IIndexCursorStats;
-import org.apache.hyracks.storage.common.ISearchPredicate;
-import org.apache.hyracks.storage.common.MultiComparator;
-
-public abstract class LSMBTreeWithBuddyAbstractCursor extends EnforcedIndexCursor implements ILSMIndexCursor {
-
-    protected boolean open;
-    protected BTreeRangeSearchCursor[] btreeCursors;
-    protected BTreeRangeSearchCursor[] buddyBtreeCursors;
-    protected BTreeAccessor[] btreeAccessors;
-    protected BTreeAccessor[] buddyBtreeAccessors;
-    protected BloomFilter[] buddyBtreeBloomFilters;
-    protected MultiComparator btreeCmp;
-    protected MultiComparator buddyBtreeCmp;
-    protected int numberOfTrees;
-    protected RangePredicate btreeRangePredicate;
-    protected RangePredicate buddyBtreeRangePredicate;
-    protected ITupleReference frameTuple;
-    protected boolean includeMutableComponent;
-    protected ILSMHarness lsmHarness;
-    protected boolean foundNext;
-    protected final ILSMIndexOperationContext opCtx;
-    protected final IIndexAccessParameters iap;
-
-    protected final long[] hashes = BloomFilter.createHashArray();
-
-    protected List<ILSMComponent> operationalComponents;
-
-    public LSMBTreeWithBuddyAbstractCursor(ILSMIndexOperationContext opCtx, IIndexCursorStats stats) {
-        super();
-        this.opCtx = opCtx;
-        this.iap = IndexAccessParameters.createNoOpParams(stats);
-        buddyBtreeRangePredicate = new RangePredicate(null, null, true, true, null, null);
-    }
-
-    public ITreeIndexCursor getCursor(int cursorIndex) {
-        return btreeCursors[cursorIndex];
-    }
-
-    @Override
-    public void doOpen(ICursorInitialState initialState, ISearchPredicate searchPred) throws HyracksDataException {
-
-        LSMBTreeWithBuddyCursorInitialState lsmInitialState = (LSMBTreeWithBuddyCursorInitialState) initialState;
-        btreeCmp = lsmInitialState.getBTreeCmp();
-        buddyBtreeCmp = lsmInitialState.getBuddyBTreeCmp();
-
-        operationalComponents = lsmInitialState.getOperationalComponents();
-        lsmHarness = lsmInitialState.getLSMHarness();
-        numberOfTrees = operationalComponents.size();
-
-        if (btreeCursors == null || btreeCursors.length != numberOfTrees) {
-            // need to re-use the following four instead of re-creating
-            btreeCursors = new BTreeRangeSearchCursor[numberOfTrees];
-            buddyBtreeCursors = new BTreeRangeSearchCursor[numberOfTrees];
-            btreeAccessors = new BTreeAccessor[numberOfTrees];
-            buddyBtreeAccessors = new BTreeAccessor[numberOfTrees];
-            buddyBtreeBloomFilters = new BloomFilter[numberOfTrees];
-        }
-
-        includeMutableComponent = false;
-
-        for (int i = 0; i < numberOfTrees; i++) {
-            ILSMComponent component = operationalComponents.get(i);
-            BTree btree;
-            BTree buddyBtree;
-            if (component.getType() == LSMComponentType.MEMORY) {
-                // This is not needed at the moment but is implemented anyway
-                includeMutableComponent = true;
-                // No need for a bloom filter for the in-memory BTree.
-                if (buddyBtreeCursors[i] == null) {
-                    buddyBtreeCursors[i] = new BTreeRangeSearchCursor(
-                            (IBTreeLeafFrame) lsmInitialState.getBuddyBTreeLeafFrameFactory().createFrame(), false);
-                } else {
-                    buddyBtreeCursors[i].close();
-                }
-                btree = ((LSMBTreeWithBuddyMemoryComponent) component).getIndex();
-                buddyBtree = ((LSMBTreeWithBuddyMemoryComponent) component).getBuddyIndex();
-                buddyBtreeBloomFilters[i] = null;
-            } else {
-                if (buddyBtreeCursors[i] == null) {
-                    buddyBtreeCursors[i] = new BTreeRangeSearchCursor(
-                            (IBTreeLeafFrame) lsmInitialState.getBuddyBTreeLeafFrameFactory().createFrame(), false);
-                } else {
-                    buddyBtreeCursors[i].close();
-                }
-                btree = ((LSMBTreeWithBuddyDiskComponent) component).getIndex();
-                buddyBtree = ((LSMBTreeWithBuddyDiskComponent) component).getBuddyIndex();
-                buddyBtreeBloomFilters[i] = ((LSMBTreeWithBuddyDiskComponent) component).getBloomFilter();
-            }
-            IBTreeLeafFrame leafFrame = (IBTreeLeafFrame) lsmInitialState.getBTreeLeafFrameFactory().createFrame();
-            if (btreeAccessors[i] == null) {
-                btreeCursors[i] = new BTreeRangeSearchCursor(leafFrame, false);
-                btreeAccessors[i] = btree.createAccessor(iap);
-                buddyBtreeAccessors[i] = buddyBtree.createAccessor(iap);
-            } else {
-                btreeCursors[i].close();
-                btreeAccessors[i].reset(btree, iap);
-                buddyBtreeAccessors[i].reset(buddyBtree, iap);
-            }
-        }
-        btreeRangePredicate = (RangePredicate) searchPred;
-        buddyBtreeRangePredicate.reset(null, null, true, true, buddyBtreeCmp, buddyBtreeCmp);
-        open = true;
-    }
-
-    @Override
-    public void doDestroy() throws HyracksDataException {
-        if (!open) {
-            return;
-        }
-        try {
-            if (btreeCursors != null && buddyBtreeCursors != null) {
-                for (int i = 0; i < numberOfTrees; i++) {
-                    btreeCursors[i].destroy();
-                    buddyBtreeCursors[i].destroy();
-                }
-            }
-            btreeCursors = null;
-            buddyBtreeCursors = null;
-        } finally {
-            lsmHarness.endSearch(opCtx);
-        }
-        foundNext = false;
-        open = false;
-    }
-
-    @Override
-    public ITupleReference doGetTuple() {
-        return frameTuple;
-    }
-
-    @Override
-    public boolean getSearchOperationCallbackProceedResult() {
-        return false;
-    }
-
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyCursorInitialState.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyCursorInitialState.java
deleted file mode 100644
index 1e98248..0000000
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyCursorInitialState.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.storage.am.lsm.btree.impls;
-
-import java.util.List;
-
-import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
-import org.apache.hyracks.storage.common.ICursorInitialState;
-import org.apache.hyracks.storage.common.ISearchOperationCallback;
-import org.apache.hyracks.storage.common.MultiComparator;
-import org.apache.hyracks.storage.common.buffercache.ICachedPage;
-
-public class LSMBTreeWithBuddyCursorInitialState implements ICursorInitialState {
-    private final ITreeIndexFrameFactory btreeInteriorFrameFactory;
-    private final ITreeIndexFrameFactory btreeLeafFrameFactory;
-    private final ITreeIndexFrameFactory buddyBtreeLeafFrameFactory;
-    private MultiComparator btreeCmp;
-    private MultiComparator buddyBtreeCmp;
-    private final ILSMHarness lsmHarness;
-
-    private ISearchOperationCallback searchCallback;
-    private List<ILSMComponent> operationalComponents;
-
-    public LSMBTreeWithBuddyCursorInitialState(ITreeIndexFrameFactory btreeInteriorFrameFactory,
-            ITreeIndexFrameFactory btreeLeafFrameFactory, ITreeIndexFrameFactory buddyBtreeLeafFrameFactory,
-            ILSMHarness lsmHarness, MultiComparator btreeCmp, MultiComparator buddyBtreeCmp,
-            ISearchOperationCallback searchCallback, List<ILSMComponent> operationalComponents) {
-        this.btreeLeafFrameFactory = btreeLeafFrameFactory;
-        this.btreeInteriorFrameFactory = btreeInteriorFrameFactory;
-        this.buddyBtreeLeafFrameFactory = buddyBtreeLeafFrameFactory;
-        this.btreeCmp = btreeCmp;
-        this.buddyBtreeCmp = buddyBtreeCmp;
-        this.lsmHarness = lsmHarness;
-        this.searchCallback = searchCallback;
-        this.operationalComponents = operationalComponents;
-    }
-
-    public ITreeIndexFrameFactory getBTreeInteriorFrameFactory() {
-        return btreeInteriorFrameFactory;
-    }
-
-    public ITreeIndexFrameFactory getBTreeLeafFrameFactory() {
-        return btreeLeafFrameFactory;
-    }
-
-    public ITreeIndexFrameFactory getBuddyBTreeLeafFrameFactory() {
-        return buddyBtreeLeafFrameFactory;
-    }
-
-    public MultiComparator getBTreeCmp() {
-        return btreeCmp;
-    }
-
-    public MultiComparator getBuddyBTreeCmp() {
-        return buddyBtreeCmp;
-    }
-
-    public List<ILSMComponent> getOperationalComponents() {
-        return operationalComponents;
-    }
-
-    public ILSMHarness getLSMHarness() {
-        return lsmHarness;
-    }
-
-    @Override
-    public ICachedPage getPage() {
-        return null;
-    }
-
-    @Override
-    public void setPage(ICachedPage page) {
-    }
-
-    @Override
-    public ISearchOperationCallback getSearchOperationCallback() {
-        return searchCallback;
-    }
-
-    @Override
-    public void setSearchOperationCallback(ISearchOperationCallback searchCallback) {
-        this.searchCallback = searchCallback;
-    }
-
-    @Override
-    public MultiComparator getOriginalKeyComparator() {
-        return btreeCmp;
-    }
-
-    @Override
-    public void setOriginialKeyComparator(MultiComparator originalCmp) {
-        this.btreeCmp = originalCmp;
-    }
-
-    public void setOperationalComponents(List<ILSMComponent> operationalComponents) {
-        this.operationalComponents = operationalComponents;
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyDiskComponent.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyDiskComponent.java
deleted file mode 100644
index 1e9dade..0000000
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyDiskComponent.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.storage.am.lsm.btree.impls;
-
-import java.util.Set;
-
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.bloomfilter.impls.BloomFilter;
-import org.apache.hyracks.storage.am.btree.impls.BTree;
-import org.apache.hyracks.storage.am.lsm.common.api.AbstractLSMWithBuddyDiskComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
-import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
-import org.apache.hyracks.storage.common.buffercache.IBufferCache;
-
-public class LSMBTreeWithBuddyDiskComponent extends AbstractLSMWithBuddyDiskComponent {
-    private final BTree btree;
-    private final BloomFilter bloomFilter;
-    private final BTree buddyBtree;
-
-    public LSMBTreeWithBuddyDiskComponent(AbstractLSMIndex lsmIndex, BTree btree, BTree buddyBtree,
-            BloomFilter bloomFilter, ILSMComponentFilter filter) {
-        super(lsmIndex, LSMBTreeDiskComponent.getMetadataPageManager(btree), filter);
-        this.btree = btree;
-        this.bloomFilter = bloomFilter;
-        this.buddyBtree = buddyBtree;
-    }
-
-    @Override
-    public BTree getBuddyIndex() {
-        return buddyBtree;
-    }
-
-    @Override
-    public long getComponentSize() {
-        return LSMBTreeDiskComponent.getComponentSize(btree)
-                + LSMBTreeWithBloomFilterDiskComponent.getComponentSize(bloomFilter)
-                + buddyBtree.getFileReference().getFile().length();
-    }
-
-    @Override
-    public Set<String> getLSMComponentPhysicalFiles() {
-        Set<String> files = LSMBTreeDiskComponent.getFiles(btree);
-        LSMBTreeWithBloomFilterDiskComponent.addFiles(files, bloomFilter);
-        files.add(buddyBtree.getFileReference().getFile().getAbsolutePath());
-        return files;
-    }
-
-    @Override
-    public void validate() throws HyracksDataException {
-        throw new UnsupportedOperationException("Validation not implemented for LSM B-Trees with Buddy B-Tree.");
-    }
-
-    @Override
-    public int getFileReferenceCount() {
-        return LSMBTreeDiskComponent.getFileReferenceCount(btree);
-    }
-
-    @Override
-    public BTree getMetadataHolder() {
-        return btree;
-    }
-
-    @Override
-    public BTree getIndex() {
-        return btree;
-    }
-
-    @Override
-    public BloomFilter getBloomFilter() {
-        return bloomFilter;
-    }
-
-    @Override
-    public IBufferCache getBloomFilterBufferCache() {
-        return getMetadataHolder().getBufferCache();
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyDiskComponentFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyDiskComponentFactory.java
deleted file mode 100644
index bfa2314..0000000
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyDiskComponentFactory.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.storage.am.lsm.btree.impls;
-
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.bloomfilter.impls.BloomFilterFactory;
-import org.apache.hyracks.storage.am.btree.impls.BTree;
-import org.apache.hyracks.storage.am.lsm.common.api.IComponentFilterHelper;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentFactory;
-import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
-import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
-import org.apache.hyracks.storage.am.lsm.common.impls.TreeIndexFactory;
-
-public class LSMBTreeWithBuddyDiskComponentFactory implements ILSMDiskComponentFactory {
-
-    protected final TreeIndexFactory<BTree> btreeFactory;
-    protected final IComponentFilterHelper filterHelper;
-    protected final BloomFilterFactory bloomFilterFactory;
-    protected final TreeIndexFactory<BTree> buddyBtreeFactory;
-
-    public LSMBTreeWithBuddyDiskComponentFactory(TreeIndexFactory<BTree> btreeFactory,
-            TreeIndexFactory<BTree> buddyBtreeFactory, BloomFilterFactory bloomFilterFactory,
-            IComponentFilterHelper filterHelper) {
-        this.btreeFactory = btreeFactory;
-        this.filterHelper = filterHelper;
-        this.bloomFilterFactory = bloomFilterFactory;
-        this.buddyBtreeFactory = buddyBtreeFactory;
-    }
-
-    public int[] getBloomFilterKeyFields() {
-        return bloomFilterFactory == null ? null : bloomFilterFactory.getBloomFilterKeyFields();
-    }
-
-    @Override
-    public LSMBTreeWithBuddyDiskComponent createComponent(AbstractLSMIndex lsmIndex, LSMComponentFileReferences cfr)
-            throws HyracksDataException {
-        return new LSMBTreeWithBuddyDiskComponent(lsmIndex,
-                btreeFactory.createIndexInstance(cfr.getInsertIndexFileReference()),
-                buddyBtreeFactory.createIndexInstance(cfr.getDeleteIndexFileReference()),
-                bloomFilterFactory.createBloomFiltertInstance(cfr.getBloomFilterFileReference()),
-                filterHelper == null ? null : filterHelper.createFilter());
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyFileManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyFileManager.java
deleted file mode 100644
index 81e6d10..0000000
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyFileManager.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.storage.am.lsm.btree.impls;
-
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.hyracks.api.exceptions.ErrorCode;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.api.io.FileReference;
-import org.apache.hyracks.api.io.IIOManager;
-import org.apache.hyracks.api.util.IoUtil;
-import org.apache.hyracks.storage.am.common.api.ITreeIndex;
-import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager;
-import org.apache.hyracks.storage.am.lsm.common.impls.IndexComponentFileReference;
-import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
-import org.apache.hyracks.storage.am.lsm.common.impls.TreeIndexFactory;
-
-public class LSMBTreeWithBuddyFileManager extends AbstractLSMIndexFileManager {
-
-    private final TreeIndexFactory<? extends ITreeIndex> btreeFactory;
-    private final TreeIndexFactory<? extends ITreeIndex> buddyBtreeFactory;
-
-    private static FilenameFilter btreeFilter = (dir, name) -> !name.startsWith(".") && name.endsWith(BTREE_SUFFIX);
-
-    private static FilenameFilter buddyBtreeFilter =
-            (dir, name) -> !name.startsWith(".") && name.endsWith(DELETE_TREE_SUFFIX);
-
-    public LSMBTreeWithBuddyFileManager(IIOManager ioManager, FileReference file,
-            TreeIndexFactory<? extends ITreeIndex> btreeFactory,
-            TreeIndexFactory<? extends ITreeIndex> buddyBtreeFactory) {
-        super(ioManager, file, null);
-        this.buddyBtreeFactory = buddyBtreeFactory;
-        this.btreeFactory = btreeFactory;
-    }
-
-    @Override
-    public LSMComponentFileReferences getRelFlushFileReference() throws HyracksDataException {
-        String baseName = getNextComponentSequence(btreeFilter);
-        return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + BTREE_SUFFIX),
-                baseDir.getChild(baseName + DELIMITER + DELETE_TREE_SUFFIX),
-                baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
-    }
-
-    @Override
-    public LSMComponentFileReferences getRelMergeFileReference(String firstFileName, String lastFileName) {
-        final String baseName = IndexComponentFileReference.getMergeSequence(firstFileName, lastFileName);
-        return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + BTREE_SUFFIX),
-                baseDir.getChild(baseName + DELIMITER + DELETE_TREE_SUFFIX),
-                baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
-    }
-
-    @Override
-    public List<LSMComponentFileReferences> cleanupAndGetValidFiles() throws HyracksDataException {
-        List<LSMComponentFileReferences> validFiles = new ArrayList<>();
-        ArrayList<IndexComponentFileReference> allBTreeFiles = new ArrayList<>();
-        ArrayList<IndexComponentFileReference> allBuddyBTreeFiles = new ArrayList<>();
-        ArrayList<IndexComponentFileReference> allBloomFilterFiles = new ArrayList<>();
-        // Create transaction file filter
-        FilenameFilter transactionFilefilter = getTransactionFileFilter(false);
-        // Gather files.
-        cleanupAndGetValidFilesInternal(getCompoundFilter(btreeFilter, transactionFilefilter), btreeFactory,
-                allBTreeFiles, btreeFactory.getBufferCache());
-        HashSet<String> btreeFilesSet = new HashSet<>();
-        for (IndexComponentFileReference cmpFileName : allBTreeFiles) {
-            btreeFilesSet.add(cmpFileName.getSequence());
-        }
-        validateFiles(btreeFilesSet, allBuddyBTreeFiles, getCompoundFilter(buddyBtreeFilter, transactionFilefilter),
-                buddyBtreeFactory, btreeFactory.getBufferCache());
-        validateFiles(btreeFilesSet, allBloomFilterFiles, getCompoundFilter(bloomFilterFilter, transactionFilefilter),
-                null, btreeFactory.getBufferCache());
-        // Sanity check.
-        if (allBTreeFiles.size() != allBuddyBTreeFiles.size() || allBTreeFiles.size() != allBloomFilterFiles.size()) {
-            throw HyracksDataException.create(ErrorCode.UNEQUAL_NUM_FILTERS_TREES, baseDir);
-        }
-        // Trivial cases.
-        if (allBTreeFiles.isEmpty() || allBuddyBTreeFiles.isEmpty() || allBloomFilterFiles.isEmpty()) {
-            return validFiles;
-        }
-        if (allBTreeFiles.size() == 1 && allBuddyBTreeFiles.size() == 1 && allBloomFilterFiles.size() == 1) {
-            validFiles.add(new LSMComponentFileReferences(allBTreeFiles.get(0).getFileRef(),
-                    allBuddyBTreeFiles.get(0).getFileRef(), allBloomFilterFiles.get(0).getFileRef()));
-            return validFiles;
-        }
-
-        // Sorts files names from earliest to latest sequence.
-        Collections.sort(allBTreeFiles);
-        Collections.sort(allBuddyBTreeFiles);
-        Collections.sort(allBloomFilterFiles);
-
-        List<IndexComponentFileReference> validComparableBTreeFiles = new ArrayList<>();
-        IndexComponentFileReference lastBTree = allBTreeFiles.get(0);
-        validComparableBTreeFiles.add(lastBTree);
-
-        List<IndexComponentFileReference> validComparableBuddyBTreeFiles = new ArrayList<>();
-        IndexComponentFileReference lastBuddyBTree = allBuddyBTreeFiles.get(0);
-        validComparableBuddyBTreeFiles.add(lastBuddyBTree);
-
-        List<IndexComponentFileReference> validComparableBloomFilterFiles = new ArrayList<>();
-        IndexComponentFileReference lastBloomFilter = allBloomFilterFiles.get(0);
-        validComparableBloomFilterFiles.add(lastBloomFilter);
-
-        for (int i = 1; i < allBTreeFiles.size(); i++) {
-            IndexComponentFileReference currentBTree = allBTreeFiles.get(i);
-            IndexComponentFileReference currentBuddyBTree = allBuddyBTreeFiles.get(i);
-            IndexComponentFileReference currentBloomFilter = allBloomFilterFiles.get(i);
-            // Current start sequence is greater than last stop sequence
-            if (currentBTree.isMoreRecentThan(lastBTree) && currentBuddyBTree.isMoreRecentThan(lastBuddyBTree)
-                    && currentBloomFilter.isMoreRecentThan(lastBloomFilter)) {
-                validComparableBTreeFiles.add(currentBTree);
-                validComparableBuddyBTreeFiles.add(currentBuddyBTree);
-                validComparableBloomFilterFiles.add(currentBloomFilter);
-                lastBTree = currentBTree;
-                lastBuddyBTree = currentBuddyBTree;
-                lastBloomFilter = currentBloomFilter;
-            } else if (currentBTree.isWithin(lastBTree) && currentBuddyBTree.isWithin(lastBuddyBTree)
-                    && currentBloomFilter.isWithin(lastBloomFilter)) {
-                // Invalid files are completely contained in last sequence.
-                delete(treeFactory.getBufferCache(), currentBTree.getFileRef());
-                delete(treeFactory.getBufferCache(), currentBuddyBTree.getFileRef());
-                delete(treeFactory.getBufferCache(), currentBloomFilter.getFileRef());
-            } else {
-                // This scenario should not be possible.
-                throw HyracksDataException.create(ErrorCode.FOUND_OVERLAPPING_LSM_FILES, baseDir);
-            }
-        }
-
-        // Sort valid files in reverse lexicographical order, such that newer
-        // files come first.
-        validComparableBTreeFiles.sort(recencyCmp);
-        validComparableBuddyBTreeFiles.sort(recencyCmp);
-        validComparableBloomFilterFiles.sort(recencyCmp);
-
-        Iterator<IndexComponentFileReference> btreeFileIter = validComparableBTreeFiles.iterator();
-        Iterator<IndexComponentFileReference> buddyBtreeFileIter = validComparableBuddyBTreeFiles.iterator();
-        Iterator<IndexComponentFileReference> bloomFilterFileIter = validComparableBloomFilterFiles.iterator();
-        while (btreeFileIter.hasNext() && buddyBtreeFileIter.hasNext()) {
-            IndexComponentFileReference cmpBTreeFileName = btreeFileIter.next();
-            IndexComponentFileReference cmpBuddyBTreeFileName = buddyBtreeFileIter.next();
-            IndexComponentFileReference cmpBloomFilterFileName = bloomFilterFileIter.next();
-            validFiles.add(new LSMComponentFileReferences(cmpBTreeFileName.getFileRef(),
-                    cmpBuddyBTreeFileName.getFileRef(), cmpBloomFilterFileName.getFileRef()));
-        }
-
-        return validFiles;
-    }
-
-    @Override
-    public LSMComponentFileReferences getNewTransactionFileReference() throws IOException {
-        // Create transaction lock file
-        String baseName = getNextComponentSequence(btreeFilter);
-        Files.createFile(Paths.get(baseDir + TXN_PREFIX + baseName));
-        return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + BTREE_SUFFIX),
-                baseDir.getChild(baseName + DELIMITER + DELETE_TREE_SUFFIX),
-                baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
-    }
-
-    @Override
-    public LSMComponentFileReferences getTransactionFileReferenceForCommit() throws HyracksDataException {
-        FilenameFilter transactionFilter;
-        String[] files = baseDir.getFile().list(txnFileNameFilter);
-        if (files.length == 0) {
-            return null;
-        }
-        if (files.length != 1) {
-            throw HyracksDataException.create(ErrorCode.FOUND_MULTIPLE_TRANSACTIONS, baseDir);
-        } else {
-            transactionFilter = getTransactionFileFilter(true);
-            // get the actual transaction files
-            files = baseDir.getFile().list(transactionFilter);
-            if (files.length < 3) {
-                throw HyracksDataException.create(ErrorCode.UNEQUAL_NUM_FILTERS_TREES, baseDir);
-            }
-            IoUtil.delete(baseDir.getChild(files[0]));
-        }
-        FileReference bTreeFileRef = null;
-        FileReference buddyBTreeFileRef = null;
-        FileReference bloomFilterFileRef = null;
-        for (String fileName : files) {
-            if (fileName.endsWith(BTREE_SUFFIX)) {
-                bTreeFileRef = baseDir.getChild(fileName);
-            } else if (fileName.endsWith(DELETE_TREE_SUFFIX)) {
-                buddyBTreeFileRef = baseDir.getChild(fileName);
-            } else if (fileName.endsWith(BLOOM_FILTER_SUFFIX)) {
-                bloomFilterFileRef = baseDir.getChild(fileName);
-            } else {
-                throw HyracksDataException.create(ErrorCode.UNRECOGNIZED_INDEX_COMPONENT_FILE, fileName);
-            }
-        }
-
-        return new LSMComponentFileReferences(bTreeFileRef, buddyBTreeFileRef, bloomFilterFileRef);
-    }
-
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMemoryComponent.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMemoryComponent.java
deleted file mode 100644
index feed07e..0000000
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMemoryComponent.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.storage.am.lsm.btree.impls;
-
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.btree.impls.BTree;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
-import org.apache.hyracks.storage.am.lsm.common.api.IVirtualBufferCache;
-import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
-import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMWithBuddyMemoryComponent;
-import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
-
-/*
- * This class is also not needed at the moment but is implemented anyway
- */
-public class LSMBTreeWithBuddyMemoryComponent extends AbstractLSMWithBuddyMemoryComponent {
-
-    private final BTree btree;
-    private final BTree buddyBtree;
-
-    public LSMBTreeWithBuddyMemoryComponent(AbstractLSMIndex lsmIndex, BTree btree, BTree buddyBtree,
-            IVirtualBufferCache vbc, ILSMComponentFilter filter) {
-        super(lsmIndex, vbc, filter);
-        this.btree = btree;
-        this.buddyBtree = buddyBtree;
-    }
-
-    @Override
-    public BTree getIndex() {
-        return btree;
-    }
-
-    @Override
-    public BTree getBuddyIndex() {
-        return buddyBtree;
-    }
-
-    @Override
-    public void validate() throws HyracksDataException {
-        throw new UnsupportedOperationException("Validation not implemented for LSM B-Trees with Buddy B-Tree.");
-    }
-
-    @Override
-    public LSMComponentFileReferences getComponentFileRefs() {
-        return new LSMComponentFileReferences(btree.getFileReference(), buddyBtree.getFileReference(), null);
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMergeOperation.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMergeOperation.java
deleted file mode 100644
index 3876afa..0000000
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMergeOperation.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.storage.am.lsm.btree.impls;
-
-import org.apache.hyracks.api.io.FileReference;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
-import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
-import org.apache.hyracks.storage.am.lsm.common.impls.MergeOperation;
-import org.apache.hyracks.storage.common.IIndexCursor;
-import org.apache.hyracks.storage.common.IIndexCursorStats;
-
-public class LSMBTreeWithBuddyMergeOperation extends MergeOperation {
-
-    private final FileReference buddyBtreeMergeTarget;
-    private final FileReference bloomFilterMergeTarget;
-    private final boolean keepDeletedTuples;
-
-    public LSMBTreeWithBuddyMergeOperation(ILSMIndexAccessor accessor, IIndexCursor cursor, IIndexCursorStats stats,
-            FileReference target, FileReference buddyBtreeMergeTarget, FileReference bloomFilterMergeTarget,
-            ILSMIOOperationCallback callback, String indexIdentifier, boolean keepDeletedTuples) {
-        super(accessor, target, callback, indexIdentifier, cursor, stats);
-        this.buddyBtreeMergeTarget = buddyBtreeMergeTarget;
-        this.bloomFilterMergeTarget = bloomFilterMergeTarget;
-        this.keepDeletedTuples = keepDeletedTuples;
-    }
-
-    public FileReference getBuddyBTreeTarget() {
-        return buddyBtreeMergeTarget;
-    }
-
-    public FileReference getBloomFilterTarget() {
-        return bloomFilterMergeTarget;
-    }
-
-    public boolean isKeepDeletedTuples() {
-        return keepDeletedTuples;
-    }
-
-    @Override
-    public LSMComponentFileReferences getComponentFiles() {
-        return new LSMComponentFileReferences(target, buddyBtreeMergeTarget, bloomFilterMergeTarget);
-    }
-
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySearchCursor.java
deleted file mode 100644
index ac3c8ae7..0000000
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySearchCursor.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.storage.am.lsm.btree.impls;
-
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
-import org.apache.hyracks.dataflow.common.data.accessors.PermutingTupleReference;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
-import org.apache.hyracks.storage.common.ICursorInitialState;
-import org.apache.hyracks.storage.common.IIndexCursorStats;
-import org.apache.hyracks.storage.common.ISearchPredicate;
-import org.apache.hyracks.storage.common.NoOpIndexCursorStats;
-
-public class LSMBTreeWithBuddySearchCursor extends LSMBTreeWithBuddyAbstractCursor {
-    private int currentCursor;
-    private final PermutingTupleReference buddyBTreeTuple;
-
-    public LSMBTreeWithBuddySearchCursor(ILSMIndexOperationContext opCtx, int[] buddyBTreeFields) {
-        this(opCtx, buddyBTreeFields, NoOpIndexCursorStats.INSTANCE);
-    }
-
-    public LSMBTreeWithBuddySearchCursor(ILSMIndexOperationContext opCtx, int[] buddyBTreeFields,
-            IIndexCursorStats stats) {
-        super(opCtx, stats);
-        currentCursor = 0;
-        this.buddyBTreeTuple = new PermutingTupleReference(buddyBTreeFields);
-    }
-
-    @Override
-    public void doDestroy() throws HyracksDataException {
-        super.doDestroy();
-        currentCursor = 0;
-    }
-
-    @Override
-    public void doClose() throws HyracksDataException {
-        if (!open) {
-            return;
-        }
-
-        currentCursor = 0;
-        foundNext = false;
-        try {
-            for (int i = 0; i < numberOfTrees; i++) {
-                btreeCursors[i].close();
-                buddyBtreeCursors[i].close();
-            }
-            btreeCursors = null;
-            buddyBtreeCursors = null;
-        } finally {
-            lsmHarness.endSearch(opCtx);
-        }
-    }
-
-    private void searchNextCursor() throws HyracksDataException {
-        if (currentCursor < numberOfTrees) {
-            btreeCursors[currentCursor].close();
-            btreeAccessors[currentCursor].search(btreeCursors[currentCursor], btreeRangePredicate);
-        }
-    }
-
-    @Override
-    public boolean doHasNext() throws HyracksDataException {
-        if (foundNext) {
-            return true;
-        }
-        while (currentCursor < numberOfTrees) {
-            while (btreeCursors[currentCursor].hasNext()) {
-                btreeCursors[currentCursor].next();
-                ITupleReference currentTuple = btreeCursors[currentCursor].getTuple();
-                buddyBTreeTuple.reset(btreeCursors[currentCursor].getTuple());
-                boolean killerTupleFound = false;
-                for (int i = 0; i < currentCursor && !killerTupleFound; i++) {
-                    if (buddyBtreeBloomFilters[i] != null
-                            && !buddyBtreeBloomFilters[i].contains(buddyBTreeTuple, hashes)) {
-                        continue;
-                    }
-                    buddyBtreeCursors[i].close();
-                    buddyBtreeRangePredicate.setHighKey(buddyBTreeTuple, true);
-                    buddyBtreeRangePredicate.setLowKey(buddyBTreeTuple, true);
-                    buddyBtreeAccessors[i].search(buddyBtreeCursors[i], buddyBtreeRangePredicate);
-                    try {
-                        if (buddyBtreeCursors[i].hasNext()) {
-                            killerTupleFound = true;
-                        }
-                    } finally {
-                        buddyBtreeCursors[i].close();
-                    }
-                }
-                if (!killerTupleFound) {
-                    frameTuple = currentTuple;
-                    foundNext = true;
-                    return true;
-                }
-            }
-            btreeCursors[currentCursor].close();
-            currentCursor++;
-            searchNextCursor();
-        }
-        return false;
-    }
-
-    @Override
-    public void doNext() throws HyracksDataException {
-        foundNext = false;
-    }
-
-    @Override
-    public ITupleReference getFilterMinTuple() {
-        ILSMComponentFilter filter = getFilter();
-        return filter == null ? null : filter.getMinTuple();
-    }
-
-    @Override
-    public ITupleReference getFilterMaxTuple() {
-        ILSMComponentFilter filter = getFilter();
-        return filter == null ? null : filter.getMaxTuple();
-    }
-
-    private ILSMComponentFilter getFilter() {
-        if (currentCursor < 0) {
-            return null;
-        }
-        return operationalComponents.get(currentCursor).getLSMComponentFilter();
-    }
-
-    @Override
-    public void doOpen(ICursorInitialState initialState, ISearchPredicate searchPred) throws HyracksDataException {
-        super.doOpen(initialState, searchPred);
-        searchNextCursor();
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySortedCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySortedCursor.java
deleted file mode 100644
index ce47589..0000000
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySortedCursor.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.storage.am.lsm.btree.impls;
-
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
-import org.apache.hyracks.dataflow.common.data.accessors.PermutingTupleReference;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
-import org.apache.hyracks.storage.common.ICursorInitialState;
-import org.apache.hyracks.storage.common.IIndexCursorStats;
-import org.apache.hyracks.storage.common.ISearchPredicate;
-import org.apache.hyracks.storage.common.util.IndexCursorUtils;
-
-public class LSMBTreeWithBuddySortedCursor extends LSMBTreeWithBuddyAbstractCursor {
-    // TODO: This class can be removed and instead use a search cursor that uses
-    // a logic similar
-    // to the one in LSMRTreeWithAntiMatterTuplesSearchCursor
-    // currently, this cursor is only used when doing merge operations.
-    private boolean[] depletedBtreeCursors;
-    private int foundIn = -1;
-    private PermutingTupleReference buddyBtreeTuple;
-
-    public LSMBTreeWithBuddySortedCursor(ILSMIndexOperationContext opCtx, int[] buddyBTreeFields,
-            IIndexCursorStats stats) throws HyracksDataException {
-        super(opCtx, stats);
-        this.buddyBtreeTuple = new PermutingTupleReference(buddyBTreeFields);
-        close();
-    }
-
-    public ILSMIndexOperationContext getOpCtx() {
-        return opCtx;
-    }
-
-    @Override
-    public void doClose() throws HyracksDataException {
-        depletedBtreeCursors = new boolean[numberOfTrees];
-        foundNext = false;
-        try {
-            for (int i = 0; i < numberOfTrees; i++) {
-                btreeCursors[i].close();
-                btreeAccessors[i].search(btreeCursors[i], btreeRangePredicate);
-                if (btreeCursors[i].hasNext()) {
-                    btreeCursors[i].next();
-                } else {
-                    depletedBtreeCursors[i] = true;
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new HyracksDataException("error while reseting the btrees of the lsm btree with buddy btree", e);
-        } finally {
-            if (open) {
-                lsmHarness.endSearch(opCtx);
-            }
-        }
-    }
-
-    @Override
-    public ITupleReference getFilterMinTuple() {
-        ILSMComponentFilter filter = getFilter();
-        return filter == null ? null : filter.getMinTuple();
-    }
-
-    @Override
-    public ITupleReference getFilterMaxTuple() {
-        ILSMComponentFilter filter = getFilter();
-        return filter == null ? null : filter.getMaxTuple();
-    }
-
-    private ILSMComponentFilter getFilter() {
-        if (foundIn < 0) {
-            return null;
-        }
-        return operationalComponents.get(foundIn).getLSMComponentFilter();
-    }
-
-    @Override
-    public boolean doHasNext() throws HyracksDataException {
-        while (!foundNext) {
-            frameTuple = null;
-
-            if (foundIn != -1) {
-                if (btreeCursors[foundIn].hasNext()) {
-                    btreeCursors[foundIn].next();
-                } else {
-                    depletedBtreeCursors[foundIn] = true;
-                }
-            }
-
-            foundIn = -1;
-            for (int i = 0; i < numberOfTrees; i++) {
-                if (depletedBtreeCursors[i]) {
-                    continue;
-                }
-
-                if (frameTuple == null) {
-                    frameTuple = btreeCursors[i].getTuple();
-                    foundIn = i;
-                    continue;
-                }
-
-                if (btreeCmp.compare(frameTuple, btreeCursors[i].getTuple()) > 0) {
-                    frameTuple = btreeCursors[i].getTuple();
-                    foundIn = i;
-                }
-            }
-
-            if (foundIn == -1) {
-                return false;
-            }
-
-            boolean killed = false;
-            buddyBtreeTuple.reset(frameTuple);
-            for (int i = 0; i < foundIn; i++) {
-                buddyBtreeCursors[i].close();
-                buddyBtreeRangePredicate.setHighKey(buddyBtreeTuple, true);
-                btreeRangePredicate.setLowKey(buddyBtreeTuple, true);
-                btreeAccessors[i].search(btreeCursors[i], btreeRangePredicate);
-                try {
-                    if (btreeCursors[i].hasNext()) {
-                        killed = true;
-                        break;
-                    }
-                } finally {
-                    btreeCursors[i].close();
-                }
-            }
-            if (!killed) {
-                foundNext = true;
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    public void doNext() throws HyracksDataException {
-        foundNext = false;
-    }
-
-    @Override
-    public void doOpen(ICursorInitialState initialState, ISearchPredicate searchPred) throws HyracksDataException {
-        super.doOpen(initialState, searchPred);
-        depletedBtreeCursors = new boolean[numberOfTrees];
-        foundNext = false;
-        for (int i = 0; i < numberOfTrees; i++) {
-            btreeCursors[i].close();
-        }
-        IndexCursorUtils.open(btreeAccessors, btreeCursors, btreeRangePredicate);
-        try {
-            for (int i = 0; i < numberOfTrees; i++) {
-                if (btreeCursors[i].hasNext()) {
-                    btreeCursors[i].next();
-                } else {
-                    depletedBtreeCursors[i] = true;
-                }
-            }
-        } catch (Throwable th) { // NOSONAR Must catch all failures to close before throwing
-            for (int i = 0; i < numberOfTrees; i++) {
-                IndexCursorUtils.close(btreeCursors[i], th);
-            }
-            throw HyracksDataException.create(th);
-        }
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBuddyBTreeMergeCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBuddyBTreeMergeCursor.java
deleted file mode 100644
index eb4b29d..0000000
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBuddyBTreeMergeCursor.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.storage.am.lsm.btree.impls;
-
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.btree.impls.BTree;
-import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexAccessor;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
-import org.apache.hyracks.storage.am.lsm.common.impls.LSMIndexSearchCursor;
-import org.apache.hyracks.storage.common.ICursorInitialState;
-import org.apache.hyracks.storage.common.IIndexAccessor;
-import org.apache.hyracks.storage.common.IIndexCursor;
-import org.apache.hyracks.storage.common.IIndexCursorStats;
-import org.apache.hyracks.storage.common.ISearchPredicate;
-import org.apache.hyracks.storage.common.util.IndexCursorUtils;
-
-public class LSMBuddyBTreeMergeCursor extends LSMIndexSearchCursor {
-
-    public LSMBuddyBTreeMergeCursor(ILSMIndexOperationContext opCtx, IIndexCursorStats stats) {
-        super(opCtx, true, stats);
-    }
-
-    @Override
-    protected boolean isDeleted(PriorityQueueElement checkElement) throws HyracksDataException {
-        return false;
-    }
-
-    @Override
-    public void doOpen(ICursorInitialState initialState, ISearchPredicate searchPred) throws HyracksDataException {
-        LSMBTreeWithBuddyCursorInitialState lsmInitialState = (LSMBTreeWithBuddyCursorInitialState) initialState;
-        cmp = lsmInitialState.getBuddyBTreeCmp();
-        operationalComponents = lsmInitialState.getOperationalComponents();
-        // We intentionally set the lsmHarness to null so that we don't call
-        // lsmHarness.endSearch() because we already do that when we merge
-        // actual index.
-        lsmHarness = null;
-        int numBTrees = operationalComponents.size();
-        rangeCursors = new IIndexCursor[numBTrees];
-        RangePredicate btreePredicate = new RangePredicate(null, null, true, true, cmp, cmp);
-        IIndexAccessor[] btreeAccessors = new ITreeIndexAccessor[numBTrees];
-        for (int i = 0; i < numBTrees; i++) {
-            ILSMComponent component = operationalComponents.get(i);
-            BTree buddyBtree = ((LSMBTreeWithBuddyDiskComponent) component).getBuddyIndex();
-            btreeAccessors[i] = buddyBtree.createAccessor(iap);
-            rangeCursors[i] = btreeAccessors[i].createSearchCursor(false);
-        }
-        IndexCursorUtils.open(btreeAccessors, rangeCursors, btreePredicate);
-        try {
-            setPriorityQueueComparator();
-            initPriorityQueue();
-        } catch (Throwable th) { // NOSONAR: Must catch all failures
-            IndexCursorUtils.close(rangeCursors, th);
-            throw HyracksDataException.create(th);
-        }
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexFileManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexFileManager.java
index 2d38758..f2727ed 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexFileManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexFileManager.java
@@ -19,7 +19,6 @@
 
 package org.apache.hyracks.storage.am.lsm.common.api;
 
-import java.io.IOException;
 import java.util.Comparator;
 import java.util.List;
 
@@ -53,33 +52,6 @@
     Comparator<String> getFileNameComparator();
 
     /**
-     * @return delete existing transaction disk component file reference
-     * @throws HyracksDataException
-     */
-    void deleteTransactionFiles() throws HyracksDataException;
-
-    /**
-     * Rename files of a transaction removing the transaction prefix and return the component file reference in order to be committed
-     *
-     * @return the renamed component file references
-     * @throws HyracksDataException
-     */
-    LSMComponentFileReferences getTransactionFileReferenceForCommit() throws HyracksDataException;
-
-    /**
-     * Recover transaction files without returning them
-     *
-     * @throws HyracksDataException
-     */
-    void recoverTransaction() throws HyracksDataException;
-
-    /**
-     * @return a reference to the transaction disk component file reference
-     * @throws IOException
-     */
-    LSMComponentFileReferences getNewTransactionFileReference() throws IOException;
-
-    /**
      * Initializes the last used sequence
      *
      * @param lastUsedSeq
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbortRecoverLSMIndexFileManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbortRecoverLSMIndexFileManager.java
deleted file mode 100644
index 72d5423..0000000
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbortRecoverLSMIndexFileManager.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.storage.am.lsm.common.impls;
-
-import org.apache.hyracks.api.io.FileReference;
-import org.apache.hyracks.api.io.IIOManager;
-
-public class AbortRecoverLSMIndexFileManager extends AbstractLSMIndexFileManager {
-    public AbortRecoverLSMIndexFileManager(IIOManager ioManager, FileReference file) {
-        super(ioManager, file, null);
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java
index 5d70337..4da207d 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java
@@ -20,7 +20,6 @@
 package org.apache.hyracks.storage.am.lsm.common.impls;
 
 import java.io.FilenameFilter;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -79,17 +78,12 @@
      * Indicates Look Aside File (LAF) for compressed indexes
      */
     public static final String LAF_SUFFIX = ".dic";
-    /**
-     * Hides transaction components until they are either committed by removing this file or deleted along with the file
-     */
-    public static final String TXN_PREFIX = ".T";
     public static final long UNINITIALIZED_COMPONENT_SEQ = -1;
     public static final FilenameFilter COMPONENT_FILES_FILTER = (dir, name) -> !name.startsWith(".");
-    protected static final FilenameFilter txnFileNameFilter = (dir, name) -> name.startsWith(TXN_PREFIX);
-    protected static FilenameFilter bloomFilterFilter =
+    protected static FilenameFilter BLOOM_FILTER_FILTER =
             (dir, name) -> !name.startsWith(".") && name.endsWith(BLOOM_FILTER_SUFFIX);
     protected static final Comparator<String> cmp = new FileNameComparator();
-    private static final FilenameFilter dummyFilter = (dir, name) -> true;
+
     protected final IIOManager ioManager;
     // baseDir should reflect dataset name and partition name and be absolute
     protected final FileReference baseDir;
@@ -293,19 +287,7 @@
         return baseDir;
     }
 
-    @Override
-    public void recoverTransaction() throws HyracksDataException {
-        String[] files = listDirFiles(baseDir, txnFileNameFilter);
-        if (files.length == 0) {
-            // Do nothing
-        } else if (files.length > 1) {
-            throw HyracksDataException.create(ErrorCode.FOUND_MULTIPLE_TRANSACTIONS, baseDir);
-        } else {
-            IoUtil.delete(baseDir.getChild(files[0]));
-        }
-    }
-
-    private class RecencyComparator implements Comparator<IndexComponentFileReference> {
+    private static class RecencyComparator implements Comparator<IndexComponentFileReference> {
         @Override
         public int compare(IndexComponentFileReference a, IndexComponentFileReference b) {
             int startCmp = -Long.compare(a.getSequenceStart(), b.getSequenceStart());
@@ -316,65 +298,15 @@
         }
     }
 
-    // This function is used to delete transaction files for aborted transactions
-    @Override
-    public void deleteTransactionFiles() throws HyracksDataException {
-        String[] files = listDirFiles(baseDir, txnFileNameFilter);
-        if (files.length == 0) {
-            // Do nothing
-        } else if (files.length > 1) {
-            throw HyracksDataException.create(ErrorCode.FOUND_MULTIPLE_TRANSACTIONS, baseDir);
-        } else {
-            //create transaction filter
-            FilenameFilter transactionFilter = createTransactionFilter(files[0], true);
-            String[] componentsFiles = listDirFiles(baseDir, transactionFilter);
-            for (String fileName : componentsFiles) {
-                FileReference file = baseDir.getChild(fileName);
-                IoUtil.delete(file);
-            }
-            // delete the txn lock file
-            IoUtil.delete(baseDir.getChild(files[0]));
-        }
-    }
-
-    @Override
-    public LSMComponentFileReferences getNewTransactionFileReference() throws IOException {
-        return null;
-    }
-
-    @Override
-    public LSMComponentFileReferences getTransactionFileReferenceForCommit() throws HyracksDataException {
-        return null;
-    }
-
     @Override
     public void initLastUsedSeq(long lastUsedSeq) {
         lastUsedComponentSeq = lastUsedSeq;
     }
 
-    private static FilenameFilter createTransactionFilter(String transactionFileName, final boolean inclusive) {
-        final String timeStamp =
-                transactionFileName.substring(transactionFileName.indexOf(TXN_PREFIX) + TXN_PREFIX.length());
-        return (dir, name) -> inclusive == name.startsWith(timeStamp);
-    }
-
-    protected FilenameFilter getTransactionFileFilter(boolean inclusive) throws HyracksDataException {
-        String[] files = listDirFiles(baseDir, txnFileNameFilter);
-        if (files.length == 0) {
-            return dummyFilter;
-        } else {
-            return createTransactionFilter(files[0], inclusive);
-        }
-    }
-
     protected void delete(IBufferCache bufferCache, FileReference fileRef) throws HyracksDataException {
         bufferCache.deleteFile(fileRef);
     }
 
-    protected FilenameFilter getCompoundFilter(final FilenameFilter filter1, final FilenameFilter filter2) {
-        return (dir, name) -> filter1.accept(dir, name) && filter2.accept(dir, name);
-    }
-
     protected String getNextComponentSequence(FilenameFilter filenameFilter) throws HyracksDataException {
         if (lastUsedComponentSeq == UNINITIALIZED_COMPONENT_SEQ) {
             lastUsedComponentSeq = getOnDiskLastUsedComponentSequence(filenameFilter);
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFileManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFileManager.java
index 83f6573..3b8f82a 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFileManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFileManager.java
@@ -92,7 +92,7 @@
         validateFiles(deletedKeysBTreeFilesSet, allInvListsFiles, invListFilter, null, btreeFactory.getBufferCache());
         validateFiles(deletedKeysBTreeFilesSet, allDictBTreeFiles, dictBTreeFilter, btreeFactory,
                 btreeFactory.getBufferCache());
-        validateFiles(deletedKeysBTreeFilesSet, allBloomFilterFiles, bloomFilterFilter, null,
+        validateFiles(deletedKeysBTreeFilesSet, allBloomFilterFiles, BLOOM_FILTER_FILTER, null,
                 btreeFactory.getBufferCache());
 
         // Sanity check.
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFileManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFileManager.java
index 81e8f83..a511f8c 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFileManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFileManager.java
@@ -20,9 +20,6 @@
 package org.apache.hyracks.storage.am.lsm.rtree.impls;
 
 import java.io.FilenameFilter;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -33,7 +30,6 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.FileReference;
 import org.apache.hyracks.api.io.IIOManager;
-import org.apache.hyracks.api.util.IoUtil;
 import org.apache.hyracks.storage.am.common.api.ITreeIndex;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager;
 import org.apache.hyracks.storage.am.lsm.common.impls.IndexComponentFileReference;
@@ -80,20 +76,14 @@
         ArrayList<IndexComponentFileReference> allBTreeFiles = new ArrayList<>();
         ArrayList<IndexComponentFileReference> allBloomFilterFiles = new ArrayList<>();
 
-        // Create a transaction filter <- to hide transaction components->
-        FilenameFilter transactionFilter = getTransactionFileFilter(false);
-
         // Gather files.
-        cleanupAndGetValidFilesInternal(getCompoundFilter(transactionFilter, btreeFilter), btreeFactory, allBTreeFiles,
-                btreeFactory.getBufferCache());
+        cleanupAndGetValidFilesInternal(btreeFilter, btreeFactory, allBTreeFiles, btreeFactory.getBufferCache());
         HashSet<String> btreeFilesSet = new HashSet<>();
         for (IndexComponentFileReference cmpFileName : allBTreeFiles) {
             btreeFilesSet.add(cmpFileName.getSequence());
         }
-        validateFiles(btreeFilesSet, allRTreeFiles, getCompoundFilter(transactionFilter, rtreeFilter), rtreeFactory,
-                btreeFactory.getBufferCache());
-        validateFiles(btreeFilesSet, allBloomFilterFiles, getCompoundFilter(transactionFilter, bloomFilterFilter), null,
-                btreeFactory.getBufferCache());
+        validateFiles(btreeFilesSet, allRTreeFiles, rtreeFilter, rtreeFactory, btreeFactory.getBufferCache());
+        validateFiles(btreeFilesSet, allBloomFilterFiles, BLOOM_FILTER_FILTER, null, btreeFactory.getBufferCache());
 
         // Sanity check.
         if (allRTreeFiles.size() != allBTreeFiles.size() || allBTreeFiles.size() != allBloomFilterFiles.size()) {
@@ -101,11 +91,11 @@
         }
 
         // Trivial cases.
-        if (allRTreeFiles.isEmpty() || allBTreeFiles.isEmpty() || allBloomFilterFiles.isEmpty()) {
+        if (allRTreeFiles.isEmpty()) {
             return validFiles;
         }
 
-        if (allRTreeFiles.size() == 1 && allBTreeFiles.size() == 1 && allBloomFilterFiles.size() == 1) {
+        if (allRTreeFiles.size() == 1) {
             validFiles.add(new LSMComponentFileReferences(allRTreeFiles.get(0).getFileRef(),
                     allBTreeFiles.get(0).getFileRef(), allBloomFilterFiles.get(0).getFileRef()));
             return validFiles;
@@ -171,49 +161,4 @@
         }
         return validFiles;
     }
-
-    @Override
-    public LSMComponentFileReferences getNewTransactionFileReference() throws IOException {
-        String baseName = getNextComponentSequence(btreeFilter);
-        // Create transaction lock file
-        Files.createFile(Paths.get(baseDir + TXN_PREFIX + baseName));
-        return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + RTREE_SUFFIX),
-                baseDir.getChild(baseName + DELIMITER + BTREE_SUFFIX),
-                baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
-    }
-
-    @Override
-    public LSMComponentFileReferences getTransactionFileReferenceForCommit() throws HyracksDataException {
-        FilenameFilter transactionFilter;
-        String[] files = baseDir.getFile().list(txnFileNameFilter);
-        if (files.length == 0) {
-            return null;
-        }
-        if (files.length != 1) {
-            throw HyracksDataException.create(ErrorCode.FOUND_MULTIPLE_TRANSACTIONS, baseDir);
-        } else {
-            transactionFilter = getTransactionFileFilter(true);
-            // get the actual transaction files
-            files = baseDir.getFile().list(transactionFilter);
-            if (files.length < 3) {
-                throw HyracksDataException.create(ErrorCode.UNEQUAL_NUM_FILTERS_TREES, baseDir);
-            }
-            IoUtil.delete(baseDir.getChild(files[0]));
-        }
-        FileReference rTreeFileRef = null;
-        FileReference bTreeFileRef = null;
-        FileReference bloomFilterFileRef = null;
-        for (String fileName : files) {
-            if (fileName.endsWith(BTREE_SUFFIX)) {
-                bTreeFileRef = baseDir.getChild(fileName);
-            } else if (fileName.endsWith(RTREE_SUFFIX)) {
-                rTreeFileRef = baseDir.getChild(fileName);
-            } else if (fileName.endsWith(BLOOM_FILTER_SUFFIX)) {
-                bloomFilterFileRef = baseDir.getChild(fileName);
-            } else {
-                throw HyracksDataException.create(ErrorCode.UNRECOGNIZED_INDEX_COMPONENT_FILE, fileName);
-            }
-        }
-        return new LSMComponentFileReferences(rTreeFileRef, bTreeFileRef, bloomFilterFileRef);
-    }
 }
