diff --git a/src/Search/EpsilonElimination.hs b/src/Search/EpsilonElimination.hs
index 11771d22d47f3f6c95fbd6df597e2b416d9e779b..a7a7c08151f4b9f21fa9caffcbcb48dc2794e8c8 100644
--- a/src/Search/EpsilonElimination.hs
+++ b/src/Search/EpsilonElimination.hs
@@ -84,7 +84,7 @@ removeUnreachableNodes start graph =
       | node `S.member` visited = visited
       | otherwise =
         S.foldr (\succ visited' -> getReachable visited' succ) (S.insert node visited) (successors node)
-    successors node = S.map edgeTo $ graph M.! node
+    successors node = S.map edgeTo $ M.findWithDefault S.empty node graph
 
 -- | Return true iff the edge is an ɛ-transition
 isEpsilon :: Edge -> Bool
diff --git a/test/Search/EpsilonEliminationSpec.hs b/test/Search/EpsilonEliminationSpec.hs
index e68691dda1dd25b4f3ceaa0a95d4033ac95a263e..6006f1476f2e64b2a2267c5cf0b9da96c105128f 100644
--- a/test/Search/EpsilonEliminationSpec.hs
+++ b/test/Search/EpsilonEliminationSpec.hs
@@ -54,6 +54,15 @@ eliminateEpsilonsSpec = do
                        ]
     in eliminateEpsilons (mkVertex "A") graph1 `shouldBe` graph2
 
+  it "Works when not all vertices are keys in the map" $
+    let
+      graph1 = mkGraph [ ("A", edges [(Nothing, "B"), (Just "c", "C")])
+                       , ("B", edges [(Just "b", "C")])
+                       ]
+      graph2 = mkGraph [ ("A", edges [(Just "b", "C"), (Just "c", "C")])
+                       ]
+    in eliminateEpsilons (mkVertex "A") graph1 `shouldBe` graph2
+
 epsilonClosureSpec :: Spec
 epsilonClosureSpec = do
   it "Returns the identity map for a graph without epsilons" $