diff --git a/object_fracture_voroni/cell_fracture.py b/object_fracture_voroni/fracture_cell_calc.py
similarity index 100%
rename from object_fracture_voroni/cell_fracture.py
rename to object_fracture_voroni/fracture_cell_calc.py
diff --git a/object_fracture_voroni/fracture_cell_setup.py b/object_fracture_voroni/fracture_cell_setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..7e99924c5f146001e2a8cc404bcee93dc5f5e5ba
--- /dev/null
+++ b/object_fracture_voroni/fracture_cell_setup.py
@@ -0,0 +1,108 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+# Script copyright (C) Blender Foundation 2012
+
+def cell_fracture_objects(context, obj, method={'OTHER'}):
+
+    #assert(method in {'OTHER', 'PARTICLES'})
+    
+    from . import fracture_cell_calc
+
+    points = []
+
+    if 'PARTICLES' in method:
+        points.extend([p.location.copy()
+                         for psys in obj.particle_systems
+                         for p in psys.particles])
+
+    if 'OTHER' in method:
+        for obj_other in context.selected_objects:
+            if obj_other.type == 'MESH':
+                mesh = obj_other.data
+                matrix = obj_other.matrix_world.copy()
+                points.extend([matrix * v.co for v in mesh.vertices])
+
+
+    mesh = obj.data
+    matrix = obj.matrix_world.copy()
+    verts = [matrix * v.co for v in mesh.vertices]
+
+    cells = fracture_cell_calc.points_as_bmesh_cells(verts, points)
+    
+    # some hacks here :S
+    import bmesh
+
+    scene = context.scene
+    cell_name = obj.name + "_cell"
+    
+    objects = []
+    
+    for center_point, cell_points in cells:
+        mesh = bpy.data.meshes.new(name=cell_name)
+        obj_cell = bpy.data.objects.new(name=cell_name, object_data=mesh)
+        scene.objects.link(obj_cell)
+        # scene.objects.active = obj_cell
+        obj_cell.location = center_point
+
+        # create the convex hulls
+        bm = bmesh.new()
+        for i, co in enumerate(cell_points):
+            bm_vert = bm.verts.new(co)
+            bm_vert.tag = True
+
+        import mathutils
+        bm.transform(mathutils.Matrix.Translation((+100.0, +100.0, +100.0))) # BUG IN BLENDER
+        bmesh.ops.remove_doubles(bm, {'TAG'}, 0.0001)
+        bmesh.ops.convex_hull(bm, {'TAG'})
+        bm.transform(mathutils.Matrix.Translation((-100.0, -100.0, -100.0))) # BUG IN BLENDER
+        
+        bm.to_mesh(me)
+        bm.free()
+
+        objects.append(obj_cell)
+    
+    return obj_cell
+
+
+
+
+def cell_fracture_boolean(context, obj, objects):
+    scene = context.scene
+    for obj_cell in objects:
+        mod = obj_cell.modifiers.new(type='BOOLEAN')
+        mod.object = boolobj
+        mod.operation = 'INTERSECT'
+        
+        mesh_new = obj_cell.to_mesh(scene, apply_modifiers=True)
+        mesh_old = obj_cell.data
+        obj_cell.data = mesh_new
+
+        # remove if not valid
+        if not mesh_old.users:
+            bpy.data.meshes.remove(mesh_old)
+        if not mesh_new.verts:
+            scene.objects.unlink(obj_cell)
+            if not obj_cell.users:
+                bpy.data.objects.remove(obj_cell)
+                if not mesh_new.users:
+                    bpy.data.meshes.remove(mesh_old)
+        obj_cell.select = True
+