diff --git a/extern/polymesh b/extern/polymesh
index b7ee88d6a832faccbd38a1b568c0467644111e2d..a9f10730da832facca272aac08d79b7a84ad6439 160000
--- a/extern/polymesh
+++ b/extern/polymesh
@@ -1 +1 @@
-Subproject commit b7ee88d6a832faccbd38a1b568c0467644111e2d
+Subproject commit a9f10730da832facca272aac08d79b7a84ad6439
diff --git a/tests/complex/triangulate-crash.cc b/tests/complex/triangulate-crash.cc
index 7ce2ff480f5120342ecc843e0af098c440652eba..dcf319f6cf921de965766e7b7b204446e3f29920 100644
--- a/tests/complex/triangulate-crash.cc
+++ b/tests/complex/triangulate-crash.cc
@@ -114,3 +114,99 @@ TEST_CASE("triangulate_naive crash")
             c.add_line(p0, p1);
     }*/
 }
+
+TEST_CASE("triangulate_naive crash 2")
+{
+    auto m = pm::Mesh();
+    std::vector<pm::vertex_index> vertices;
+    for (int i = 0; i < 9; ++i)
+        vertices.push_back(m.vertices().add());
+
+    std::vector<pm::vertex_index> vs;
+    vs.push_back(vertices[1]);
+    vs.push_back(vertices[2]);
+    vs.push_back(vertices[3]);
+    vs.push_back(vertices[0]);
+    m.faces().add(vs);
+    vs.clear();
+    vs.push_back(vertices[4]);
+    vs.push_back(vertices[5]);
+    vs.push_back(vertices[2]);
+    vs.push_back(vertices[1]);
+    m.faces().add(vs);
+    vs.clear();
+    vs.push_back(vertices[6]);
+    vs.push_back(vertices[3]);
+    vs.push_back(vertices[2]);
+    vs.push_back(vertices[5]);
+    m.faces().add(vs);
+    vs.clear();
+    vs.push_back(vertices[0]);
+    vs.push_back(vertices[3]);
+    vs.push_back(vertices[6]);
+    vs.push_back(vertices[7]);
+    m.faces().add(vs);
+    vs.clear();
+    vs.push_back(vertices[8]);
+    vs.push_back(vertices[7]);
+    vs.push_back(vertices[6]);
+    vs.push_back(vertices[5]);
+    vs.push_back(vertices[4]);
+    m.faces().add(vs);
+    vs.clear();
+    vs.push_back(vertices[7]);
+    vs.push_back(vertices[8]);
+    vs.push_back(vertices[4]);
+    vs.push_back(vertices[1]);
+    vs.push_back(vertices[0]);
+    m.faces().add(vs);
+    vs.clear();
+    pm::triangulate_naive(m);
+
+    /*
+        {
+            auto is_inner_valence2 = [](pm::vertex_handle v) { return !v.is_boundary() && valence(v) == 2; };
+
+            std::vector<pm::vertex_handle> vs;
+            for (auto f : m.faces())
+            {
+                vs.clear();
+                f.vertices().into_vector(vs);
+
+                if (vs.size() <= 3)
+                    continue;
+
+                // find non-valence 2
+                auto si = 0;
+                for (auto i = 0u; i < vs.size(); ++i)
+                {
+                    if (!is_inner_valence2(vs[i]))
+                    {
+                        si = i;
+                        break;
+                    }
+                }
+                POLYMESH_ASSERT(!is_inner_valence2(vs[si]) && "could not find start vertex (second vertex must not be inner valence 2)");
+                si--; // make sure v1 is never valence 2
+                if (si < 0)
+                    si += int(vs.size());
+
+                // remove
+                m.faces().remove(f);
+
+                // triangulate
+                std::cout << "triangulate " << int(f) << std::endl;
+                for (auto i = 2u; i < vs.size(); ++i)
+                {
+                    auto v0 = vs[si];
+                    auto v1 = vs[(si + i - 1) % vs.size()];
+                    auto v2 = vs[(si + i) % vs.size()];
+                    std::cout << int(v0) << " " << int(v1) << " " << int(v2) << std::endl;
+                    for (auto v : {v0, v1, v2})
+                        std::cout << "  is inner val 2: " << is_inner_valence2(v) << " (boundary " << v.is_boundary() << ", valence: " << valence(v)
+                                  << ")" << std::endl;
+                    m.faces().add(v0, v1, v2);
+                }
+            }
+        }*/
+}