diff --git a/js/cam/assemblers/Assembler.js b/js/cam/assemblers/Assembler.js
index b08fdab417658bbd6a052f20b15aca302d68ced4..e53d04048a7bb8ff72bc17d3c3486f76270b67a2 100644
--- a/js/cam/assemblers/Assembler.js
+++ b/js/cam/assemblers/Assembler.js
@@ -48,6 +48,12 @@ define(['underscore', 'appState', 'lattice', 'three', 'threeModel', 'cam', 'comp
     Assembler.prototype._setTranslucent = function(){
         assemblerMaterial.transparent = (appState.get("currentTab") == "cam");
     };
+
+    Assembler.prototype.moveMachine = function(){//origin selection
+        var origin = cam.get("originPosition");
+        this.object3D.position.set(origin.x, origin.y, origin.z);
+        three.render();
+    };
     
     
     
@@ -138,12 +144,6 @@ define(['underscore', 'appState', 'lattice', 'three', 'threeModel', 'cam', 'comp
     Assembler.prototype.pause = function(){
     };
     
-    Assembler.prototype.moveMachine = function(){
-        var origin = cam.get("originPosition");
-        this.object3D.position.set(origin.x, origin.y, origin.z);
-        three.render();
-    };
-    
     Assembler.prototype.moveTo = function(x, y, z, speed, wcs, callback){
         x = this._makeAbsPosition(x, wcs.x);
         y = this._makeAbsPosition(y, wcs.y);
diff --git a/js/cam/assemblers/Crab.js b/js/cam/assemblers/Crab.js
index ee3b92b8f37699afe57d9f59da726624fc5a02b9..bfd0fe51dfe065e030d29f129f565aae15ba4662 100644
--- a/js/cam/assemblers/Crab.js
+++ b/js/cam/assemblers/Crab.js
@@ -3,7 +3,7 @@
  */
 
 
-define(['stlLoader', 'bin!crabSTL', 'threeModel'], function(THREE, geometry, three){
+define(['stlLoader', 'bin!assets/stls/crab/crab.stl', 'threeModel', 'assembler'], function(THREE, geometry, three, Assembler){
 
 
     var loader = new THREE.STLLoader();
@@ -16,8 +16,26 @@ define(['stlLoader', 'bin!crabSTL', 'threeModel'], function(THREE, geometry, thr
         return geo;
     }
 
-    var mesh = new THREE.Mesh(unitGeo, new THREE.MeshLambertMaterial({color:0x777777, shading:THREE.FlatShading}));
-    three.sceneAdd(mesh);
-    three.render();
+    function CrabAssembler(){
+        this.stockAttachedToEndEffector = true;//no need for "stock position"
+        Assembler.call(this);
+    }
+    CrabAssembler.prototype = Object.create(Assembler.prototype);
+
+    CrabAssembler.prototype._buildStock = function(){
+        return null;
+//        return new StockClass({});
+    };
+
+    CrabAssembler.prototype._configureAssemblerMovementDependencies = function(){
+        this.object3D.add(this.frame.getObject3D());
+    };
+
+    CrabAssembler.prototype._getSTLs = function(){
+        return {
+            frame: unitGeo
+        }
+    };
 
+    return CrabAssembler;
 });
\ No newline at end of file
diff --git a/js/cam/assemblers/StaplerAssembler.js b/js/cam/assemblers/StaplerAssembler.js
index e340f95283a6144ac439d8db5ce9f7004568799c..6c58aa8780053539e3598aeaa5d1da54edf0c2b8 100644
--- a/js/cam/assemblers/StaplerAssembler.js
+++ b/js/cam/assemblers/StaplerAssembler.js
@@ -62,28 +62,6 @@ define(['underscore', 'assembler', 'stlLoader', 'gikSuperCell',
         }
     };
 
-    StaplerAssembler.prototype._moveXAxis = function(startingPos, target, axis, speed, callback){
-        if (target == null || target === undefined) {
-            callback();
-            return;
-        }
-        this._animateObjects([this.xAxis], axis, speed, startingPos, target, callback);
-    };
-    StaplerAssembler.prototype._moveYAxis = function(startingPos, target, axis, speed, callback){
-        if (target == null || target === undefined) {
-            callback();
-            return;
-        }
-        this._animateObjects([this.yAxis], axis, speed, startingPos, target, callback);
-    };
-    StaplerAssembler.prototype._moveZAxis = function(startingPos, target, axis, speed, callback){
-        if (target == null || target === undefined) {
-            callback();
-            return;
-        }
-        this._animateObjects([this.zAxis], axis, speed, startingPos, target, callback);
-    };
-
 
     return StaplerAssembler;
 });
\ No newline at end of file
diff --git a/js/lattice/LatticeBase.js b/js/lattice/LatticeBase.js
index 6cdbccc7a627d3297e939d895f4833d295328ad8..ef6c404a9b38e02bfe4e221a3ff6fec404b7d553 100644
--- a/js/lattice/LatticeBase.js
+++ b/js/lattice/LatticeBase.js
@@ -231,7 +231,7 @@ define(['underscore', 'backbone', 'appState', 'globals', 'plist', 'three', 'thre
 
             if (!cells) {
                 console.warn("no cells specified in matrix expansion");
-                return;
+                cells = this.sparseCells;
             }
 
             if (!this.get("cellsMax") || !this.get("cellsMin")){
diff --git a/js/main.js b/js/main.js
index b464bbbbd6160c82e0397ef8292145869b87258c..bb162098b00b464db3aa4de1b8e1fa74a9f51297 100644
--- a/js/main.js
+++ b/js/main.js
@@ -167,7 +167,6 @@ require.config({
         kennyTeqPartSTL: 'assets/stls/parts/KennyTeqPart.stl',
         kennyTeqPartHighResSTL: 'assets/stls/parts/KennyTeqPartHighRes.stl',
         samTeqPartSTL: 'assets/stls/parts/SamTeqPart.stl',
-        crabSTL: 'assets/stls/crab/crab.stl'
 
     },
 
diff --git a/js/menus/AssemblerMenuView.js b/js/menus/AssemblerMenuView.js
index 4de97b64d5d6223680ab1a8810585443a110c7aa..dcac5a1f139e517c441413557399cd586cc1c42d 100644
--- a/js/menus/AssemblerMenuView.js
+++ b/js/menus/AssemblerMenuView.js
@@ -15,6 +15,11 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'cam', 'lattice', 'text!a
             this.listenTo(cam, "change", this.render);//todo handle this in wrapper
             $(document).bind('keyup', {}, this._onKeyup);
         },
+
+        getPropertyOwner: function($target){
+            if ($target.hasClass("assembler")) return cam;
+            return null;
+        },
     
         _onKeyup: function(e){
             if (this.model.get("currentTab") != "assembler") return;
diff --git a/js/menus/CamMenuView.js b/js/menus/CamMenuView.js
index 851ea2ec7917f8b2842824329b9775c7a839bec6..a8e77198b8b1eb6662f6ecd25b4741602ca153ff 100644
--- a/js/menus/CamMenuView.js
+++ b/js/menus/CamMenuView.js
@@ -19,6 +19,11 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'cam', 'lattice', 'text!c
             this.listenTo(lattice, "change", this.render);
         },
 
+        getPropertyOwner: function($target){
+            if ($target.hasClass("assembler")) return cam;
+            return null;
+        },
+
         _selectOrigin: function(e){
             e.preventDefault();
             this.model.set("manualSelectOrigin", !this.model.get("manualSelectOrigin"));
diff --git a/js/menus/MenuWrapperView.js b/js/menus/MenuWrapperView.js
index 5b509a8c0e7206f530190f5285d7c66cdfc1f9ae..17f8b42d2e68d4ae3d0ccba64b55d3686a4665d5 100644
--- a/js/menus/MenuWrapperView.js
+++ b/js/menus/MenuWrapperView.js
@@ -161,7 +161,6 @@ define(['jquery', 'underscore', 'plist', 'backbone', 'lattice', 'appState', 'tex
 
         _getPropertyOwner: function($target){
             if ($target.hasClass("lattice")) return lattice;
-            if ($target.hasClass("assembler")) return globals.cam;
             if ($target.hasClass("appState")) return this.model;
             if (this.menu) {
                 var owner = this.menu.getPropertyOwner($target);
@@ -186,9 +185,10 @@ define(['jquery', 'underscore', 'plist', 'backbone', 'lattice', 'appState', 'tex
                 return;
             }
             if (key){
+                console.log(this._getOwnerProperty(owner, property));
                 var propObject = this._getOwnerProperty(owner, property).clone();
                 propObject[key] = newVal;
-                this._setOwnerProperty(owner, property, newVal);
+                this._setOwnerProperty(owner, property, propObject);
             } else {
                 this._setOwnerProperty(owner, property, newVal);
             }
diff --git a/js/plists/PList.js b/js/plists/PList.js
index 969fc919d75b75cdcd777a5bdc850d2c57ca56c0..c01abc06f10c1b813ceb834561ff12a988a27c7d 100644
--- a/js/plists/PList.js
+++ b/js/plists/PList.js
@@ -209,10 +209,11 @@ define(['three'], function(THREE){
             octa:{
                 face: {handOfGod: "Hand of God"},
                 edgeRot: {
+                    crab: "Crab",
                     shopbot: "Shopbot",
-                        oneBitBot: "One Bit Bot",
-                        oneBitBotLegs: "One Bit Bot with Legs",
-                        handOfGod: "Hand of God"
+                    oneBitBot: "One Bit Bot",
+                    oneBitBotLegs: "One Bit Bot with Legs",
+                    handOfGod: "Hand of God"
                 },
                 vertex: {handOfGod: "Hand of God"}
             },
@@ -247,7 +248,8 @@ define(['three'], function(THREE){
                 tinyG: "TinyG"
             },
             stapler: {gcode: "G-Code"},
-            staplerDual: {gcode: "G-Code"}
+            staplerDual: {gcode: "G-Code"},
+            crab: {gcode: "G-Code"}
         },
 
         allMachineDefaults: {
@@ -264,7 +266,8 @@ define(['three'], function(THREE){
                 originPosition: new THREE.Vector3(0,0,0),
                 rapidSpeeds:{xy: 3, z: 2},
                 feedRate:{xy: 0.1, z: 0.1}
-            }
+            },
+            crab: null
         },
 
         allScripts: {
@@ -273,7 +276,7 @@ define(['three'], function(THREE){
 
         allUnitTypes: {
             inches: "Inches",
-                mm: "mm"
+            mm: "mm"
             //um: "micron"
         }
 
diff --git a/js/three/FillGeometry.js b/js/three/FillGeometry.js
index de91c17c4ac2cdf4315841040eb973af963575f1..6cab1f0a3fe529e91b54e19b31dd0c2e5d317c46 100644
--- a/js/three/FillGeometry.js
+++ b/js/three/FillGeometry.js
@@ -35,6 +35,7 @@ define(['three', 'underscore', 'backbone', 'lattice', 'threeModel'],
                 opacity:0.4,
                 side:THREE.DoubleSide
             }));
+            mesh.position.set(0,0,-0.5);
             this.set({mesh: mesh});
             three.sceneAdd(mesh);
             three.render();
@@ -44,13 +45,14 @@ define(['three', 'underscore', 'backbone', 'lattice', 'threeModel'],
             var boundingBox = this.get("mesh").geometry.boundingBox;
     
             var scale = this.get("scale");
-            var scaledMin = boundingBox.min.clone().multiplyScalar(scale);
+            var offset = this.get("mesh").position.clone();
+            console.log(offset);
+            var scaledMin = boundingBox.min.clone().multiplyScalar(scale);//.add(offset)
             var scaledMax = boundingBox.max.clone().multiplyScalar(scale);
-            console.log(scaledMin);
-            console.log(scaledMax);
     
             var minIndex = lattice.getIndexForPosition(scaledMin);
             var maxIndex = lattice.getIndexForPosition(scaledMax);
+            minIndex.z -= 1;
             console.log(minIndex);
             console.log(maxIndex);
             lattice.checkForMatrixExpansion(null, maxIndex, minIndex);//expand cells matrix before
@@ -73,15 +75,16 @@ define(['three', 'underscore', 'backbone', 'lattice', 'threeModel'],
                     for (var z=minIndex.z;z<=maxIndex.z;z++){
                         var index = new THREE.Vector3(x, y, z);
                         var position = lattice.getPositionForIndex(index);
+                        index.z -= 1;
                         if (!inside){
                             if (position.z<nextIntersection) continue;
                             else {
                                 inside = true;
-                                lattice.getUItarget().addCellAtIndex(index, true, true);
+                                lattice.addCellAtIndex(index, true, true);
                             }
                         } else {
                             if (position.z<nextIntersection) {
-                                lattice.getUItarget().addCellAtIndex(index, true, true);
+                                lattice.addCellAtIndex(index, true, true);
                                 continue;
                             }
                             else inside = false;