diff --git a/graph-core.cabal b/graph-core.cabal
--- a/graph-core.cabal
+++ b/graph-core.cabal
@@ -1,11 +1,11 @@
 name:                graph-core
-version:             0.1.0.0
+version:             0.2.0.0
 synopsis:            Fast, memory efficient and persistent graph implementation
 description:         A small package providing a powerful and easy to use Haskell graph implementation.
 homepage:            https://github.com/factisresearch/graph-core
 license:             MIT
 license-file:        LICENSE
-author:              Stefan Wehr <wehr@cp-med.com>, David Leuschner <leuschner@cp-med.com>, Alexander Thiemann <thiemann@cp-med.com>
+author:              Stefan Wehr <wehr@cp-med.com>, David Leuschner <leuschner@cp-med.com>, Niklas Baumstark, Jonathan Dimond, Alexander Thiemann <thiemann@cp-med.com>
 maintainer:          Alexander Thiemann <thiemann@cp-med.com>
 copyright:           (c) 2014 factis research GmbH
 category:            Data
diff --git a/src/Data/Graph.hs b/src/Data/Graph.hs
--- a/src/Data/Graph.hs
+++ b/src/Data/Graph.hs
@@ -11,7 +11,7 @@
   , edgeCount
   , hull, rhull, hullFold, hullFoldM, rhullFold
   , addEdge, addEdges, removeEdge, removeEdges
-  , addNode, solitaireNodes
+  , addNode, removeNode, solitaireNodes
   , edgesAdj
   )
 where
diff --git a/src/Data/Graph/NodeManager.hs b/src/Data/Graph/NodeManager.hs
--- a/src/Data/Graph/NodeManager.hs
+++ b/src/Data/Graph/NodeManager.hs
@@ -7,6 +7,7 @@
     , emptyNode
     , initNodeManager, emptyNodeManager, getNodeMap
     , getNodeHandle, getExistingNodeHandle, lookupNode, unsafeLookupNode
+    , removeNodeHandle
     , getNewNodesSince, keys, hasKey, nodes, toList
     , isConsistent
     )
@@ -91,6 +92,15 @@
                                   , nm_nextNode = i + 1
                                   }
                return i
+
+removeNodeHandle :: (Hashable k, Eq k) => Node -> NodeManager k -> NodeManager k
+removeNodeHandle i nm@(NodeManager{..}) =
+    case IM.lookup i nm_nodeToKey of
+      Just k ->
+          nm { nm_nodeToKey = IM.delete i nm_nodeToKey
+             , nm_keyToNode = HM.delete k nm_keyToNode
+             }
+      Nothing -> nm
 
 getExistingNodeHandle :: (Hashable k, Eq k) => k -> NodeManager k -> Maybe Node
 getExistingNodeHandle k (NodeManager{..}) = HM.lookup k nm_keyToNode
diff --git a/src/Data/Graph/PureCore.hs b/src/Data/Graph/PureCore.hs
--- a/src/Data/Graph/PureCore.hs
+++ b/src/Data/Graph/PureCore.hs
@@ -116,6 +116,19 @@
 addNode x g =
     g { g_adj = IM.insertWith (\_new old -> old) x VU.empty (g_adj g) }
 
+removeNode :: Node -> Graph -> Graph
+removeNode x g =
+    let rmInAdj adj localF =
+            foldl (\adjList child ->
+                       IM.adjust (VU.filter (/=x)) child adjList
+                  ) (IM.delete x adj) $ VU.toList (localF g x)
+
+        newAdj = rmInAdj (g_adj g) parents
+        newRAdj = rmInAdj (g_radj g) children
+    in g { g_adj = newAdj
+         , g_radj = newRAdj
+         }
+
 addEdge :: Node -> Node -> Graph -> Graph
 addEdge x y g@(Graph{..}) =
    if hasEdge x y g
diff --git a/src/Test/Core.hs b/src/Test/Core.hs
--- a/src/Test/Core.hs
+++ b/src/Test/Core.hs
@@ -30,6 +30,18 @@
     do assertEqual (fromAdj [(1, [2]), (2, [3,4]), (3, [4]), (4, [])])
                    (removeEdges [e (1,3), e (4,1)] testGraphA)
 
+test_removeNode :: IO ()
+test_removeNode =
+    let orig = fromAdj [(1, [2]), (2, [3,4]), (3, [4]), (4, [])]
+        res1 = fromAdj [(1, [2]), (2, [3]), (3, [])]
+        res2 = fromAdj [(1, [2]), (2, [4]), (4, [])]
+        res3 = fromAdj [(1, []), (3, [4]), (4, [])]
+
+    in do assertEqual res1 (removeNode 4 orig)
+          assertEqual res2 (removeNode 3 orig)
+          assertEqual res3 (removeNode 2 orig)
+          assertEqual orig (removeNode 5 orig)
+
 test_hull :: IO ()
 test_hull =
     do assertEqual (IS.fromList [4]) (hull testGraphA 4)
