diff --git a/grid.cabal b/grid.cabal
--- a/grid.cabal
+++ b/grid.cabal
@@ -1,5 +1,5 @@
 Name:              grid
-Version:           7.8.4
+Version:           7.8.5
 Stability:         experimental
 Synopsis:          Tools for working with regular grids (graphs, lattices).
 Description:       Provides tools for working with regular arrangements
@@ -27,13 +27,13 @@
 source-repository this
   type:     git
   location: https://github.com/mhwombat/grid.git
-  tag:      7.8.4
+  tag:      7.8.5
 
 
 library
   hs-source-dirs:  src
   build-depends:   base ==4.*,
-                   cereal ==0.4.*,
+                   cereal >=0.4 && < 0.6,
                    containers ==0.5.*
   ghc-options:     -Wall
   exposed-modules: Math.Geometry.Grid,
@@ -69,4 +69,3 @@
                    Math.Geometry.Grid.SquareQC,
                    Math.Geometry.Grid.TriangularQC
                    Math.Geometry.GridMap.LazyQC
-
diff --git a/src/Math/Geometry/GridMap/Lazy.hs b/src/Math/Geometry/GridMap/Lazy.hs
--- a/src/Math/Geometry/GridMap/Lazy.hs
+++ b/src/Math/Geometry/GridMap/Lazy.hs
@@ -20,6 +20,7 @@
   (
     LGridMap,
     lazyGridMap,
+    lazyGridMapIndexed,
     empty
   ) where
 
@@ -46,6 +47,11 @@
   where kvs = zip ks vs
         ks = G.indices g
 
+lazyGridMapIndexed :: (Ord (G.Index g), G.Grid g) => g -> [((G.Index g), v)] -> LGridMap g v
+lazyGridMapIndexed g kvs = LGridMap g (M.fromList kvs')
+  where kvs' = Prelude.filter (validIndex . fst) kvs
+        validIndex k = g `G.contains` k
+
 empty :: G.Grid g => g -> LGridMap g v
 empty g = LGridMap g M.empty
 
@@ -89,10 +95,10 @@
   lookup k = M.lookup k . toMap
   insertWithKey f k v gm = if gm `G.contains` k
                    then gm { lgmMap = M.insertWithKey f k v $ lgmMap gm }
-                   else gm 
+                   else gm
   delete k gm = if gm `G.contains` k
                    then gm { lgmMap = M.delete k $ lgmMap gm }
-                   else gm 
+                   else gm
   adjustWithKey f k gm = gm { lgmMap = M.adjustWithKey f k (lgmMap gm)}
   alter f k gm = if gm `G.contains` k
                    then gm { lgmMap = M.alter f k $ lgmMap gm }
diff --git a/test/Math/Geometry/GridMap/LazyQC.hs b/test/Math/Geometry/GridMap/LazyQC.hs
--- a/test/Math/Geometry/GridMap/LazyQC.hs
+++ b/test/Math/Geometry/GridMap/LazyQC.hs
@@ -19,7 +19,7 @@
     test
   ) where
 
-import Data.List ((\\), foldl')
+import Data.List ((\\), foldl', intersect)
 import Data.Maybe (isJust)
 import qualified Math.Geometry.GridMap as GM
 import Math.Geometry.GridMap.Lazy
@@ -114,6 +114,20 @@
 prop_delete_never_invalid gm k = property $
   mapValid (GM.delete k gm)
 
+prop_lazyGridMapIndexed_adds_all_valid_keys
+  :: Int -> Int -> [(G.Index RectSquareGrid, Int)] -> Property
+prop_lazyGridMapIndexed_adds_all_valid_keys n m kvs = property $
+  (GM.keys gm) `intersect` (G.indices g) == GM.keys gm
+  where gm = lazyGridMapIndexed g kvs
+        g = rectSquareGrid n m
+
+prop_lazyGridMapIndexed_never_adds_invalid_keys
+  :: Int -> Int -> [(G.Index RectSquareGrid, Int)] -> Property
+prop_lazyGridMapIndexed_never_adds_invalid_keys n m kvs = property $
+  null ((GM.keys gm) \\ (G.indices g))
+  where gm = lazyGridMapIndexed g kvs
+        g = rectSquareGrid n m
+
 test :: Test
 test = testGroup "Math.Geometry.GridMap.LazyQC"
   [
@@ -125,5 +139,9 @@
     testProperty "prop_delete_works" prop_delete_works,
     testProperty "prop_delete_never_alters_grid"
       prop_delete_never_alters_grid,
-    testProperty "prop_delete_never_invalid" prop_delete_never_invalid
+    testProperty "prop_delete_never_invalid" prop_delete_never_invalid,
+    testProperty "prop_lazyGridMapIndexed_adds_all_valid_keys"
+      prop_lazyGridMapIndexed_adds_all_valid_keys,
+    testProperty "prop_lazyGridMapIndexed_never_adds_invalid_keys"
+      prop_lazyGridMapIndexed_never_adds_invalid_keys
   ]
