diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8a7cb190..5926feca 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](http://keepachangelog.com/)
 and this project adheres to [Semantic Versioning](http://semver.org/).
 
+## [Unreleased]
+
+### Added
+
+- `OverflowDb::safeRemove` to handle exceptions when deleting nodes.
+
+### Changed
+
+- Updated Joern, CPG, and Logback versions.
+
 ## [1.0.18] - 2022-03-09
 
 ### Changed
diff --git a/build.sbt b/build.sbt
index 3cfd595e..119d01cf 100644
--- a/build.sbt
+++ b/build.sbt
@@ -3,7 +3,7 @@ name := "Plume"
 inThisBuild(
   List(
     organization := "com.github.plume-oss",
-    version := "1.0.18",
+    version := "1.0.18-SNAP",
     scalaVersion := "2.13.7",
     crossScalaVersions := Seq("2.13.7", "3.1.1"),
     resolvers ++= Seq(
@@ -14,8 +14,8 @@ inThisBuild(
   )
 )
 
-val cpgVersion         = "1.3.509"
-val joernVersion       = "1.1.606"
+val cpgVersion         = "1.3.514"
+val joernVersion       = "1.1.611"
 val sootVersion        = "4.2.1"
 val tinkerGraphVersion = "3.4.8"
 val neo4jVersion       = "4.4.3"
@@ -25,7 +25,7 @@ val jacksonVersion     = "2.13.2"
 val scalajHttpVersion  = "2.4.2"
 val lz4Version         = "1.8.0"
 val slf4jVersion       = "1.7.36"
-val logbackVersion     = "1.2.10"
+val logbackVersion     = "1.2.11"
 val scalatestVersion   = "3.2.11"
 val circeVersion       = "0.14.1"
 
diff --git a/src/main/scala/com/github/plume/oss/drivers/OverflowDbDriver.scala b/src/main/scala/com/github/plume/oss/drivers/OverflowDbDriver.scala
index 0c2007d5..4c51daab 100644
--- a/src/main/scala/com/github/plume/oss/drivers/OverflowDbDriver.scala
+++ b/src/main/scala/com/github/plume/oss/drivers/OverflowDbDriver.scala
@@ -160,7 +160,7 @@ final case class OverflowDbDriver(
     // Do node operations first
     dg.diffGraph.iterator.foreach {
       case Change.RemoveNode(nodeId) =>
-        cpg.graph.node(nodeId).remove()
+        safeRemove(cpg.graph.node(nodeId))
       case Change.RemoveNodeProperty(nodeId, propertyKey) =>
         cpg.graph.node(nodeId).removeProperty(propertyKey)
       case Change.CreateNode(node) =>
@@ -206,7 +206,7 @@ final case class OverflowDbDriver(
             propertiesFromObjectArray(edgeKeyValues).foreach { case (k, v) => e.setProperty(k, v) }
           case None =>
         }
-      case c: BatchedUpdate.RemoveNode => cpg.graph.node(c.node.id()).remove()
+      case c: BatchedUpdate.RemoveNode => safeRemove(cpg.graph.node(c.node.id()))
       case c: BatchedUpdate.SetNodeProperty =>
         cpg.graph.node(c.node.id()).setProperty(c.label, c.value)
     }
@@ -236,18 +236,26 @@ final case class OverflowDbDriver(
         val typeDecls       = fileChildren.collect { case x: TypeDecl => x }
         val namespaceBlocks = fileChildren.collect { case x: NamespaceBlock => x }
         // Remove TYPE nodes
-        typeDecls.flatMap(_.in(EdgeTypes.REF)).foreach(_.remove())
+        typeDecls.flatMap(_.in(EdgeTypes.REF)).foreach(n => safeRemove(n))
         // Remove NAMESPACE_BLOCKs and their AST children (TYPE_DECL, METHOD, etc.)
         val nodesToDelete = mutable.Set.empty[Node]
         namespaceBlocks.foreach(
           accumNodesToDelete(_, nodesToDelete, EdgeTypes.AST, EdgeTypes.CONDITION)
         )
-        nodesToDelete.foreach(_.remove)
+        nodesToDelete.foreach(n => safeRemove(n))
         // Finally remove FILE node
-        f.remove()
+        safeRemove(f)
       }
   }
 
+  private def safeRemove(n: Node): Unit = Try(if (n != null) n.remove()) match {
+    case Failure(e) if cpg.graph.node(n.id()) != null =>
+      logger.warn(
+        s"Exception '${e.getMessage}' occurred while deleting node: [${n.id()}] ${n.label()}"
+      )
+    case Success(_) =>
+  }
+
   override def propertyFromNodes(nodeType: String, keys: String*): List[Map[String, Any]] =
     cpg.graph
       .nodes(nodeType)