diff --git a/js/cam/assemblers/Assembler.js b/js/cam/assemblers/Assembler.js
index 2ff0a44f5fd26977a16e18b36a9bacfec1d5ede5..b08fdab417658bbd6a052f20b15aca302d68ced4 100644
--- a/js/cam/assemblers/Assembler.js
+++ b/js/cam/assemblers/Assembler.js
@@ -8,17 +8,15 @@ define(['underscore', 'appState', 'lattice', 'three', 'threeModel', 'cam', 'comp
     
     function Assembler(){
 
-        var self = this;
         this.stock = this._buildStock();
         this._positionStockRelativeToEndEffector(this.stock);
 
         this.object3D = new THREE.Object3D();
         three.sceneAdd(this.object3D);
-        this._buildAssemblerComponents(function(){
-            self._configureAssemblerMovementDependencies();
-            three.render();
-        });
-    
+        this._buildAssemblerComponents();
+        this._configureAssemblerMovementDependencies();
+        three.render();
+
         this.setVisibility(cam.isVisible());
     }
     
@@ -29,32 +27,16 @@ define(['underscore', 'appState', 'lattice', 'three', 'threeModel', 'cam', 'comp
     Assembler.prototype._positionStockRelativeToEndEffector = function(stock){
     };
     
-    Assembler.prototype._buildAssemblerComponents = function(callback){
-        var numMeshes = this._getTotalNumMeshes();
-        if (numMeshes == 0) {
-            callback();
-            return;
-        }
-    
-        function allLoaded(){
-            numMeshes -= 1;
-            return numMeshes <= 0;
-        }
-    
+    Assembler.prototype._buildAssemblerComponents = function(){
+        var allSTLs = this._getSTLs();
         var self = this;
-        function doAdd(geometry, name){
+        _.each(allSTLs, function(geometry, name){
             self[name] = new Component(geometry, assemblerMaterial);
-            if (allLoaded()) callback();
-        }
-    
-        this._loadSTls(doAdd);
-    };
-    
-    Assembler.prototype._getTotalNumMeshes = function(){
-        return 0;
+        });
     };
     
     Assembler.prototype._configureAssemblerMovementDependencies = function(){
+        //override in subclasses
     };
     
     Assembler.prototype.setVisibility = function(visible){
@@ -64,12 +46,7 @@ define(['underscore', 'appState', 'lattice', 'three', 'threeModel', 'cam', 'comp
     };
     
     Assembler.prototype._setTranslucent = function(){
-        //todo make stock transparent
-        if (appState.get("currentTab") == "cam"){
-            assemblerMaterial.transparent = true;
-        } else {
-            assemblerMaterial.transparent = false;
-        }
+        assemblerMaterial.transparent = (appState.get("currentTab") == "cam");
     };
     
     
@@ -143,9 +120,9 @@ define(['underscore', 'appState', 'lattice', 'three', 'threeModel', 'cam', 'comp
     
     
     
+    //animation methods
     
-    
-    Assembler.prototype.updateCellMode = function(){
+    Assembler.prototype.updateCellMode = function(){//message from cam
         this.stock.setMode();
     };
     
diff --git a/js/cam/assemblers/StaplerAssembler.js b/js/cam/assemblers/StaplerAssembler.js
index 70ab8dcb547595444a37d18d0ac695c5fc17d4f7..e340f95283a6144ac439d8db5ce9f7004568799c 100644
--- a/js/cam/assemblers/StaplerAssembler.js
+++ b/js/cam/assemblers/StaplerAssembler.js
@@ -3,7 +3,30 @@
  */
 
 
-define(['underscore', 'assembler', 'stlLoader', 'gikSuperCell'], function(_, Assembler, THREE, StockClass){
+define(['underscore', 'assembler', 'stlLoader', 'gikSuperCell',
+    'bin!assets/stls/stapler/frame.stl',
+    'bin!assets/stls/stapler/xAxis.stl',
+    'bin!assets/stls/stapler/yAxis.stl',
+    'bin!assets/stls/stapler/zAxis.stl',
+    'bin!assets/stls/stapler/substrate.stl'],
+    function(_, Assembler, THREE, StockClass, frame, xAxis, yAxis, zAxis, substrate){
+
+    function geometryPreProcess(geometry){
+        geometry.applyMatrix(new THREE.Matrix4().makeTranslation(-4.0757, -4.3432, -6.2154));
+        geometry.applyMatrix(new THREE.Matrix4().makeRotationX(Math.PI/2));
+
+        var unitScale = 20;
+        geometry.applyMatrix(new THREE.Matrix4().makeScale(unitScale, unitScale, unitScale));
+        geometry.applyMatrix(new THREE.Matrix4().makeTranslation(-21, -0.63, 0));
+        return geometry;
+    }
+
+    var loader = new THREE.STLLoader();
+    var _frameGeo = geometryPreProcess(loader.parse(frame));
+    var _xAxisGeo = geometryPreProcess(loader.parse(xAxis));
+    var _yAxisGeo = geometryPreProcess(loader.parse(yAxis));
+    var _zAxisGeo = geometryPreProcess(loader.parse(zAxis));
+    var _substrateGeo = geometryPreProcess(loader.parse(substrate));
 
     function StaplerAssembler(){
         this.stockAttachedToEndEffector = true;//no need for "stock position"
@@ -15,7 +38,7 @@ define(['underscore', 'assembler', 'stlLoader', 'gikSuperCell'], function(_, Ass
         return new StockClass({});
     };
 
-    StaplerAssembler.prototype._positionStockRelativeToEndEffector = function(stock){
+    StaplerAssembler.prototype._positionStockRelativeToEndEffector = function(stock){//relative position between stock and end effector
         var object3D = stock.getObject3D();
         object3D.position.set((2.4803+0.2)*20, (-1.9471+0.36)*20, 1.7*20);
     };
@@ -29,44 +52,14 @@ define(['underscore', 'assembler', 'stlLoader', 'gikSuperCell'], function(_, Ass
         this.object3D.add(this.substrate.getObject3D());
     };
 
-    StaplerAssembler.prototype._getTotalNumMeshes = function(){
-        return 5;
-    };
-
-    StaplerAssembler.prototype._loadSTls = function(doAdd){
-
-        function geometryScale(geometry){
-            geometry.applyMatrix(new THREE.Matrix4().makeTranslation(-4.0757, -4.3432, -6.2154));
-            geometry.applyMatrix(new THREE.Matrix4().makeRotationX(Math.PI/2));
-
-            var unitScale = 20;
-            geometry.applyMatrix(new THREE.Matrix4().makeScale(unitScale, unitScale, unitScale));
-            geometry.applyMatrix(new THREE.Matrix4().makeTranslation(-21, -0.63, 0));
-            return geometry;
+    StaplerAssembler.prototype._getSTLs = function(){
+        return {
+            xAxis: _xAxisGeo,
+            yAxis: _yAxisGeo,
+            zAxis: _zAxisGeo,
+            frame: _frameGeo,
+            substrate: _substrateGeo
         }
-
-        var loader = new THREE.STLLoader();
-        loader.load("assets/stls/stapler/frame.stl", function(geometry){
-            doAdd(geometryScale(geometry), "frame");
-        });
-        loader.load(this._headSTLFile(), function(geometry){
-            doAdd(geometryScale(geometry), "zAxis");
-        });
-        loader.load("assets/stls/stapler/yAxis.stl", function(geometry){
-            doAdd(geometryScale(geometry), "yAxis");
-        });
-        loader.load("assets/stls/stapler/xAxis.stl", function(geometry){
-            doAdd(geometryScale(geometry), "xAxis");
-        });
-        loader.load("assets/stls/stapler/substrate.stl", function(geometry){
-    //        geometry.applyMatrix(new THREE.Matrix4().makeRotationY(Math.PI/2));
-    //        geometry.applyMatrix(new THREE.Matrix4().makeTranslation(0, 1.8545, -1.2598));
-            doAdd(geometryScale(geometry), "substrate");
-        });
-    };
-
-    StaplerAssembler.prototype._headSTLFile = function(){
-        return "assets/stls/stapler/zAxis.stl";
     };
 
     StaplerAssembler.prototype._moveXAxis = function(startingPos, target, axis, speed, callback){
diff --git a/js/lattice/Lattice.js b/js/lattice/Lattice.js
index 06cd6f9612dedf31255c9efb45b41bf3d6d788b5..a9822cf2d8e7c3a33579ebc98fadda7738a7ebc3 100644
--- a/js/lattice/Lattice.js
+++ b/js/lattice/Lattice.js
@@ -13,7 +13,7 @@ define(['underscore', 'backbone', 'appState', 'globals', 'plist', 'three', 'thre
             units: "mm",
 
             cellType: "cube",
-            connectionType: "face",
+            connectionType: "gik",
             partType: null,
 
             nodes: [],