diff --git a/haskey-btree.cabal b/haskey-btree.cabal
--- a/haskey-btree.cabal
+++ b/haskey-btree.cabal
@@ -1,5 +1,5 @@
 name:                haskey-btree
-version:             0.2.0.0
+version:             0.2.0.1
 synopsis:            B+-tree implementation in Haskell.
 description:
     This package provides two B+-tree implementations. The first one is a pure
diff --git a/src/Data/BTree/Alloc/Class.hs b/src/Data/BTree/Alloc/Class.hs
--- a/src/Data/BTree/Alloc/Class.hs
+++ b/src/Data/BTree/Alloc/Class.hs
@@ -64,4 +64,7 @@
     -- | Free an overflow page.
     freeOverflow :: OverflowId -> m ()
 
+    -- | Force delete overflow data from disk.
+    deleteOverflowData :: OverflowId -> m ()
+
 --------------------------------------------------------------------------------
diff --git a/src/Data/BTree/Alloc/Debug.hs b/src/Data/BTree/Alloc/Debug.hs
--- a/src/Data/BTree/Alloc/Debug.hs
+++ b/src/Data/BTree/Alloc/Debug.hs
@@ -85,3 +85,4 @@
         return (0, c)
 
     freeOverflow _ = return ()
+    deleteOverflowData _ = return ()
diff --git a/src/Data/BTree/Impure/Insert.hs b/src/Data/BTree/Impure/Insert.hs
--- a/src/Data/BTree/Impure/Insert.hs
+++ b/src/Data/BTree/Impure/Insert.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 -- | Algorithms related to inserting key-value pairs in an impure B+-tree.
 module Data.BTree.Impure.Insert where
@@ -73,6 +74,11 @@
                 newChildren <- splitIndex hgt (putIdx ctx newChildIdx)
                 traverse (allocNode hgt) newChildren
             Leaf items -> do
+                case M.lookup k items of
+                    Nothing                  -> return ()
+                    Just (RawValue _)        -> return ()
+                    Just (OverflowValue oid) -> freeOverflow oid
+
                 v' <- toLeafValue v
                 traverse (allocNode hgt) =<< splitLeaf (M.insert k v' items)
 
@@ -93,8 +99,18 @@
             newChildren <- splitIndex h newIndex
             traverse (allocNode h) newChildren
         Leaf items -> do
+            mapM_ (\k -> freeOverwrittenOverflowId $ M.lookup k items) $ M.keys kvs
             kvs' <- toLeafItems kvs
             traverse (allocNode h) =<< splitLeaf (M.union kvs' items)
+  where
+    freeOverwrittenOverflowId :: (AllocM m)
+                              => Maybe (LeafValue v)
+                              -> m ()
+    freeOverwrittenOverflowId = \case
+        Nothing                  -> return ()
+        Just (RawValue _)        -> return ()
+        Just (OverflowValue oid) -> freeOverflow oid
+
 
 --------------------------------------------------------------------------------
 
