diff --git a/js/cam/cam.js b/js/cam/cam.js
index 304510d9bb2147d95241a41b141a699119b8cf2e..192b2aecf466f15c26155d0070e82ec0e5385987 100644
--- a/js/cam/cam.js
+++ b/js/cam/cam.js
@@ -2,11 +2,13 @@
  * Created by aghassaei on 3/10/15.
  */
 
-define(['underscore', 'backbone', 'appState', 'latticeCAM', 'threeModel', 'plist'], function(_, Backbone, appState, lattice, three, plist){
+define(['underscore', 'three', 'backbone', 'appState', 'latticeCAM', 'threeModel', 'plist', 'materials'],
+    function(_, THREE, Backbone, appState, lattice, three, plist, materials){
 
     var Cam = Backbone.Model.extend({
 
         defaults: {
+
             camStrategy: "raster",
             placementOrder: "XYZ",//used for raster strategy entry
             camProcess: "gcode",
@@ -36,7 +38,9 @@ define(['underscore', 'backbone', 'appState', 'latticeCAM', 'threeModel', 'plist
             feedRate:{xy: 0.1, z: 0.1},//speed when heading towards assembly
 
             simLineNumber: 0,//used for stock simulation, reading through gcode
-            simSpeed: 4//#X times real speed
+            simSpeed: 4,//#X times real speed
+
+            allCAMMaterialTypes: []//all types of stock needed
         },
 
         initialize: function(){
@@ -64,9 +68,9 @@ define(['underscore', 'backbone', 'appState', 'latticeCAM', 'threeModel', 'plist
                     "change:machineName",
                 this._setNeedsPostProcessing);
             this.listenTo(lattice,
+                    "change:scale" +
+                    "change:units" +
                     "change:numCells " +
-                    "change:units " +
-                    "change:scale " +
                     "change:cellType " +
                     "change:connectionType",
                 this._setNeedsPostProcessing);
@@ -79,11 +83,16 @@ define(['underscore', 'backbone', 'appState', 'latticeCAM', 'threeModel', 'plist
 
             this._navChanged();
     //        this._initOriginAndStock();
+
+
         },
 
 
 
 
+        _calculateNumMaterials: function(){
+            this.set("allCAMMaterialTypes", materials.getChildCellTypes(lattice.sparseCells, true));
+        },
 
 
 
@@ -120,7 +129,10 @@ define(['underscore', 'backbone', 'appState', 'latticeCAM', 'threeModel', 'plist
         //events
 
         _navChanged: function(){
-            if (appState.get("currentNav") == "navAssemble") this._setToDefaults();
+            if (appState.get("currentNav") == "navAssemble") {
+                this._setToDefaults();
+                this._calculateNumMaterials();
+            }
         },
 
         _setToDefaults: function(){
@@ -144,7 +156,6 @@ define(['underscore', 'backbone', 'appState', 'latticeCAM', 'threeModel', 'plist
             if (this.get("assembler")) this.get("assembler").setVisibility(visible);
             if (appState.get("currentNav") == "navAssemble") {
                 appState.set("basePlaneIsVisible", !visible);
-                appState.set("highlighterIsVisible", !visible);
             }
             three.render();
         },
diff --git a/js/lattice/Lattice.js b/js/lattice/Lattice.js
index 6b6627904dcbe8117e4eb1fbb29107ecb7206dfb..0cd49e79fa7472eddfcd8b0f20320f9ce1b19ed5 100644
--- a/js/lattice/Lattice.js
+++ b/js/lattice/Lattice.js
@@ -11,6 +11,7 @@ define(['underscore', 'backbone', 'appState', 'globals', 'plist', 'three', 'thre
         defaults: _.extend(_.clone(LatticeBase.prototype.defaults), {
 
             units: "mm",
+            scale: 1.0,
 
             cellType: "cube",
             connectionType: "gik",
diff --git a/js/menus/AnimationMenuView.js b/js/menus/AnimationMenuView.js
index 35ced6921c339cae3585ed6ac36440f491783864..47475ce4bf793f06aa48e5662e7bb9215b0e1d20 100644
--- a/js/menus/AnimationMenuView.js
+++ b/js/menus/AnimationMenuView.js
@@ -2,7 +2,8 @@
  * Created by aghassaei on 2/1/15.
  */
 
-define(['jquery', 'underscore', 'menuParent', 'plist', 'cam', 'text!animationMenuTemplate'], function($, _, MenuParentView, plist, cam, template){
+define(['jquery', 'underscore', 'menuParent', 'plist', 'cam', 'text!animationMenuTemplate'],
+    function($, _, MenuParentView, plist, cam, template){
 
     return MenuParentView.extend({
 
diff --git a/js/menus/AssemblerMenuView.js b/js/menus/AssemblerMenuView.js
index dcae6a7d799ce8f5697d7128b8cf773b5bdc9021..1e70594766c295eb759648f5a4301932019bec5a 100644
--- a/js/menus/AssemblerMenuView.js
+++ b/js/menus/AssemblerMenuView.js
@@ -2,7 +2,7 @@
  * Created by aghassaei on 2/25/15.
  */
 
-define(['jquery', 'underscore', 'menuParent', 'plist', 'cam', 'lattice', 'text!assemblerMenuTemplate'], function($, _, MenuParentView, plist, cam, lattice, template){
+define(['jquery', 'underscore', 'menuParent', 'plist', 'cam', 'lattice', 'materials', 'text!assemblerMenuTemplate'], function($, _, MenuParentView, plist, cam, lattice, materials, template){
 
     return MenuParentView.extend({
     
@@ -35,7 +35,7 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'cam', 'lattice', 'text!a
         },
 
         _makeTemplateJSON: function(){
-            return _.extend(this.model.toJSON(), cam.toJSON(), lattice.toJSON(), plist);
+            return _.extend(this.model.toJSON(), cam.toJSON(), lattice.toJSON(), plist, {materials:materials.list});
         },
     
         template: _.template(template)
diff --git a/js/menus/templates/AssemblerMenuView.html b/js/menus/templates/AssemblerMenuView.html
index c6a41a9d717bfd3782adf4fcb22a35d94a215d6b..c7ed425079a5173d749f4750f51b10e2e90d3272 100644
--- a/js/menus/templates/AssemblerMenuView.html
+++ b/js/menus/templates/AssemblerMenuView.html
@@ -25,6 +25,16 @@ Strategy:   
         </ul>
     </div><br/><br/>
 <% if (camStrategy == "raster"){ %>
-    Raster Order: &nbsp;&nbsp;<input value="<%= placementOrder %>" placeholder="Placement Order" class="form-control placementOrder" type="text"><br/><br/>
+    Raster Order: &nbsp;&nbsp;<input value="<%= placementOrder %>" placeholder="Placement Order" class="form-control placementOrder" type="text"><br/>
 <% } %>
-Num Materials: &nbsp;&nbsp;
+<% if (allMachines[machineName].numMaterials > -1 && allMachines[machineName].numMaterials < allCAMMaterialTypes.length){ %>
+    <div class="inlineWarning">Number of materials in assembly exceeds available materials ( <%= allMachines[machineName].numMaterials %> ) for assembler type.</div>
+<% } %>
+Num Materials: &nbsp;&nbsp;<%= allCAMMaterialTypes.length %><br/>
+<% _.each(allCAMMaterialTypes, function(material){ %>
+    <label class="radio colorSwatches">
+        <div class="materialColorSwatch">
+        <div style="background-color:<% if(realisticColorScheme){ %><%= materials[material].color %><% }else{ %><%= materials[material].altColor %><% } %>"></div>
+        <span><span class="materialListTitle"><%= materials[material].name %></span></span></div>
+    </label>
+<% }) %>
\ No newline at end of file
diff --git a/js/menus/templates/CamMenuView.html b/js/menus/templates/CamMenuView.html
index 6ac1992ec23f213798fde0e00529a346ea8db8db..c632b0196b15fff254df235f8d080aa9a0ede1ef 100644
--- a/js/menus/templates/CamMenuView.html
+++ b/js/menus/templates/CamMenuView.html
@@ -7,6 +7,7 @@ CAM output: &nbsp;&nbsp;<div class="btn-group">
         </ul>
     </div><br/><br/>
 <a href="#" id="saveCam" class=" btn btn-block btn-lg btn-default">Process and Save</a><br/>
+Scale: &nbsp;&nbsp;<input data-property="scale" value="<%= scale %>" placeholder="Scale" class="form-control floatInput lattice" type="text"> &nbsp;&nbsp;&nbsp;&nbsp;
 Units: &nbsp;&nbsp;<div class="btn-group">
         <button data-toggle="dropdown" class="btn dropdown-toggle" type="button"><%= allUnitTypes[units] %><span class="caret"></span></button>
         <ul role="menu" class="dropdown-menu">
diff --git a/js/models/AppState.js b/js/models/AppState.js
index ef40440390db19ea603ecc5b121bd1535cbcd905..76e105b27431d8019bbb34917bdb2a2758a05acb 100644
--- a/js/models/AppState.js
+++ b/js/models/AppState.js
@@ -111,6 +111,7 @@ define(['underscore', 'backbone', 'threeModel', 'three', 'plist', 'globals'], fu
                 this.set("basePlaneIsVisible", true);
                 this.set("highlighterIsVisible", false);
             } else if (navSelection == "navAssemble"){
+                this.set("highlighterIsVisible", false);
             }
         },
 
diff --git a/js/plists/PList.js b/js/plists/PList.js
index 8b63c903bc5b697e85de565d5957970935d13701..45b29cdd17e36ef138e9e9f6fd32d1b3c26da6b2 100644
--- a/js/plists/PList.js
+++ b/js/plists/PList.js
@@ -199,13 +199,15 @@ define(['three'], function(THREE){
                 name: "Hand of God",
                 shouldPickUpStock: false,
                 relative: false,
-                camProcesses: ["gcode"]
+                camProcesses: ["gcode"],
+                numMaterials: -1//-1 == infinite
             },
             shopbot: {
                 name: "Shopbot",
                 shouldPickUpStock: true,
                 relative: false,
-                camProcesses: ["shopbot", "gcode"]
+                camProcesses: ["shopbot", "gcode"],
+                numMaterials: -1
             },
             oneBitBot: {
                 name: "One Bit Bot",
@@ -218,6 +220,7 @@ define(['three'], function(THREE){
                 shouldPickUpStock: false,
                 relative: false,
                 camProcesses: ["gcode"],
+                numMaterials: 2,
                 defaults: {
                     camStrategy: "raster",
                     placementOrder: "XYZ",//used for raster strategy entry