diff --git a/chain/src/main/scala/org/bitcoins/chain/blockchain/ChainHandlerCached.scala b/chain/src/main/scala/org/bitcoins/chain/blockchain/ChainHandlerCached.scala
index 7a648c4468..075a0d06b3 100644
--- a/chain/src/main/scala/org/bitcoins/chain/blockchain/ChainHandlerCached.scala
+++ b/chain/src/main/scala/org/bitcoins/chain/blockchain/ChainHandlerCached.scala
@@ -6,8 +6,8 @@ import org.bitcoins.chain.models.{
   CompactFilterDAO,
   CompactFilterHeaderDAO
 }
-import org.bitcoins.core.api.chain.{ChainApi, FilterSyncMarker}
 import org.bitcoins.core.api.chain.db.{BlockHeaderDb, CompactFilterHeaderDb}
+import org.bitcoins.core.api.chain.{ChainApi, FilterSyncMarker}
 import org.bitcoins.core.protocol.blockchain.BlockHeader
 import org.bitcoins.crypto.DoubleSha256DigestBE
 
diff --git a/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterDAO.scala b/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterDAO.scala
index 56bbb6874d..a25ca8a033 100644
--- a/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterDAO.scala
+++ b/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterDAO.scala
@@ -132,6 +132,10 @@ case class CompactFilterDAO()(implicit
     val join = table
       .join(blockHeaderTable)
       .on(_.blockHash === _.hash)
+      .sortBy(_._1.height.desc)
+      //just take the last 2016 headers, if we have a reorg larger than
+      //this we will not be able to retrieve that header
+      .take(appConfig.chain.difficultyChangeInterval)
 
     val maxQuery = join.map(_._2.chainWork).max
 
@@ -149,21 +153,12 @@ case class CompactFilterDAO()(implicit
   }
 
   private val bestFilterHeightQuery = {
-    val join = table
-      .join(blockHeaderTable)
-      .on(_.blockHash === _.hash)
-
-    val maxQuery = join.map(_._2.chainWork).max
-
-    join
-      .filter(_._2.chainWork === maxQuery)
-      .take(1)
-      .map(_._1.height)
-      .result
-      .transactionally
+    bestFilterQuery.map(_.headOption.map(_.height))
   }
 
   def getBestFilterHeight: Future[Int] = {
-    safeDatabase.run(bestFilterHeightQuery).map(_.headOption.getOrElse(0))
+    safeDatabase.run(bestFilterHeightQuery).map { filterHeightOpt =>
+      filterHeightOpt.headOption.getOrElse(0)
+    }
   }
 }
diff --git a/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterHeaderDAO.scala b/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterHeaderDAO.scala
index aa2ebbe234..db6a374815 100644
--- a/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterHeaderDAO.scala
+++ b/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterHeaderDAO.scala
@@ -125,6 +125,10 @@ case class CompactFilterHeaderDAO()(implicit
     val join = table
       .join(blockHeaderTable)
       .on(_.blockHash === _.hash)
+      .sortBy(_._1.height.desc)
+      //just take the last 2016 headers, if we have a reorg larger than
+      //this we will not be able to retrieve that header
+      .take(appConfig.chain.difficultyChangeInterval)
 
     val maxQuery = join.map(_._2.chainWork).max
 
@@ -146,22 +150,13 @@ case class CompactFilterHeaderDAO()(implicit
   }
 
   private val bestFilterHeaderHeightQuery = {
-    val join = table
-      .join(blockHeaderTable)
-      .on(_.blockHash === _.hash)
-
-    val maxQuery = join.map(_._2.chainWork).max
-
-    join
-      .filter(_._2.chainWork === maxQuery)
-      .take(1)
-      .map(_._1.height)
-      .result
-      .transactionally
+    bestFilterHeaderQuery.map(_.headOption.map(_.height))
   }
 
   def getBestFilterHeaderHeight: Future[Int] = {
-    safeDatabase.run(bestFilterHeaderHeightQuery).map(_.headOption.getOrElse(0))
+    safeDatabase.run(bestFilterHeaderHeightQuery).map { filterHeaderHeightOpt =>
+      filterHeaderHeightOpt.headOption.getOrElse(0)
+    }
   }
 
   /** This looks for best filter headers whose [[CompactFilterHeaderDb.blockHashBE]] are associated with the given