diff --git a/extern/carve/lib/intersect_face_division.cpp b/extern/carve/lib/intersect_face_division.cpp
index e826948128c61d4f776e2a60334a086e9fb4a3dc..0016724e16c5301d59b1d24eecc3ed87b3a40b4b 100644
--- a/extern/carve/lib/intersect_face_division.cpp
+++ b/extern/carve/lib/intersect_face_division.cpp
@@ -719,6 +719,10 @@ namespace {
           unassigned--;
         }
       }
+
+      if (!removed.size())
+        throw carve::exception("Failed to merge holes");
+
       for (std::set<int>::iterator f = removed.begin(); f != removed.end(); ++f) {
         for (unsigned i = 0; i < containing_faces.size(); ++i) {
           containing_faces[i].erase(std::remove(containing_faces[i].begin(),
diff --git a/extern/carve/patches/face_hole_merge_workaround.patch b/extern/carve/patches/face_hole_merge_workaround.patch
new file mode 100644
index 0000000000000000000000000000000000000000..834e03a4b12a32e5a36db7a20dfdfd781cfea370
--- /dev/null
+++ b/extern/carve/patches/face_hole_merge_workaround.patch
@@ -0,0 +1,14 @@
+diff -r e82d852e4fb0 lib/intersect_face_division.cpp
+--- a/lib/intersect_face_division.cpp	Wed Jan 15 13:16:14 2014 +1100
++++ b/lib/intersect_face_division.cpp	Thu Mar 13 15:39:26 2014 +0600
+@@ -719,6 +719,10 @@
+           unassigned--;
+         }
+       }
++
++      if (!removed.size())
++        throw carve::exception("Failed to merge holes");
++
+       for (std::set<int>::iterator f = removed.begin(); f != removed.end(); ++f) {
+         for (unsigned i = 0; i < containing_faces.size(); ++i) {
+           containing_faces[i].erase(std::remove(containing_faces[i].begin(),
diff --git a/extern/carve/patches/series b/extern/carve/patches/series
index 62a24d9d7305fd0ef806590b43f2b48304c4a67a..286d594bbef7f93eb727fec0eec6b1c9e2821b3c 100644
--- a/extern/carve/patches/series
+++ b/extern/carve/patches/series
@@ -9,3 +9,4 @@ interpolator_reorder.patch
 mesh_simplify_dissolve_edges.patch
 memory_leak_fix.patch
 mavc_fix.patch
+face_hole_merge_workaround.patch