diff --git a/mesh_tiny_cad/XALL.py b/mesh_tiny_cad/XALL.py
index 8cd25a5c066b289651ccb72beeab2cbf761edb5e..83ecdb52522fda09e4407fb6889645c99395a8be 100644
--- a/mesh_tiny_cad/XALL.py
+++ b/mesh_tiny_cad/XALL.py
@@ -108,37 +108,30 @@ def get_intersection_dictionary(bm, edge_indices):
     return d
 
 
-def update_mesh(obj, d):
+def update_mesh(bm, d):
     ''' Make new geometry (delete old first) '''
 
-    bpy.ops.mesh.delete(type='EDGE')
-    bpy.ops.object.editmode_toggle()
-
-    oe = obj.data.edges
-    ov = obj.data.vertices
-    vert_count = len(ov)
-    edge_count = len(oe)
+    oe = bm.edges
+    ov = bm.verts
 
+    new_verts = []
+    collect = new_verts.extend
     for old_edge, point_list in d.items():
-        num_points = len(point_list)
-        num_edges_to_add = num_points - 1
-
+        num_edges_to_add = len(point_list)-1
         for i in range(num_edges_to_add):
-            oe.add(1)
-            ov.add(2)
+            a = ov.new(point_list[i])
+            b = ov.new(point_list[i+1])
+            oe.new((a, b))
+            bm.normal_update()
+            collect([a, b])
 
-            ov[vert_count].co = point_list[i]
-            ov[vert_count + 1].co = point_list[i + 1]
+    bmesh.ops.delete(bm, geom=[edge for edge in bm.edges if edge.select], context=2) # 2 = edges
 
-            oe[edge_count].vertices = [vert_count, vert_count + 1]
-            vert_count = len(ov)
-            edge_count = len(oe)
+    #bpy.ops.mesh.remove_doubles(
+    #    threshold=cm.CAD_prefs.VTX_DOUBLES_THRSHLD,
+    #    use_unselected=False)
 
-    # set edit mode
-    bpy.ops.object.editmode_toggle()
-    bpy.ops.mesh.remove_doubles(
-        threshold=cm.CAD_prefs.VTX_DOUBLES_THRSHLD,
-        use_unselected=False)
+    bmesh.ops.remove_doubles(bm, verts=new_verts, dist=cm.CAD_prefs.VTX_DOUBLES_THRSHLD)
 
 
 def unselect_nonintersecting(bm, d_edges, edge_indices):
@@ -174,7 +167,9 @@ class TCIntersectAllEdges(bpy.types.Operator):
             d = get_intersection_dictionary(bm, edge_indices)
 
             unselect_nonintersecting(bm, d.keys(), edge_indices)
-            update_mesh(obj, d)
+            update_mesh(bm, d)
+
+            bmesh.update_edit_mesh(obj.data)
         else:
             print('must be in edit mode')
 
diff --git a/mesh_tiny_cad/__init__.py b/mesh_tiny_cad/__init__.py
index 4c2c2acdcc470fc8b724c180847cb89b5d103a31..611c67c4c08cfeecd7104a531ac01c02c6fa2c37 100644
--- a/mesh_tiny_cad/__init__.py
+++ b/mesh_tiny_cad/__init__.py
@@ -22,13 +22,13 @@
 bl_info = {
     "name": "tinyCAD Mesh tools",
     "author": "zeffii (aka Dealga McArdle)",
-    "version": (1, 3, 0),
+    "version": (1, 3, 1),
     "blender": (2, 7, 7),
     "category": "Mesh",
     "location": "View3D > EditMode > (w) Specials",
     "wiki_url": "http://zeffii.github.io/mesh_tiny_cad/",
     "tracker_url": "https://github.com/zeffii/mesh_tiny_cad/issues"
-    }
+}
 
 
 if "bpy" in locals():