diff --git a/js/cam/Assembler.js b/js/cam/Assembler.js
index f8083f875ab92bb381b722c121495dbebbb22287..b5c0743d1bfe7225edbd56f7e1445f0fcc6b51e0 100644
--- a/js/cam/Assembler.js
+++ b/js/cam/Assembler.js
@@ -5,8 +5,8 @@
 Assembler = Backbone.Model.extend({
 
     defaults: {
-        camStrategy: "xRaster",
-        placementOrder: "XYZ",//used for manual strategy entry
+        camStrategy: "raster",
+        placementOrder: "XYZ",//used for raster strategy entry
         camProcess: "shopbot",
         machineName: "shopbot",
         machine: null,
@@ -204,9 +204,7 @@ Assembler = Backbone.Model.extend({
     },
 
     _getOrder: function(strategy){
-        if (strategy == "xRaster") return "XYZ";
-        if (strategy == "yRaster") return "YXZ";
-        if (strategy == "manual") return this.get("placementOrder");
+        if (strategy == "raster") return this.get("placementOrder");
         console.warn("strategy not recognized");
         return "";
     },
diff --git a/js/menus/AssemblerMenuView.js b/js/menus/AssemblerMenuView.js
index 8de418301bfa2530e348f1f1e5dc9eb32c16cd34..139247b309257d27326b0db758d6cd7ba1cc6188 100644
--- a/js/menus/AssemblerMenuView.js
+++ b/js/menus/AssemblerMenuView.js
@@ -69,8 +69,8 @@ AssemblerMenuView = Backbone.View.extend({
                     <% }); %>\
                 </ul>\
             </div><br/><br/>\
-            <% if (camStrategy == "manual"){ %>\
-        Manual Placement Order: &nbsp;&nbsp;<input value="<%= placementOrder %>" placeholder="Placement Order" class="form-control placementOrder" type="text"><br/><br/>\
+            <% if (camStrategy == "raster"){ %>\
+        Raster Order: &nbsp;&nbsp;<input value="<%= placementOrder %>" placeholder="Placement Order" class="form-control placementOrder" type="text"><br/><br/>\
         <% } %>\
         ')
 });
\ No newline at end of file
diff --git a/js/models/AppState.js b/js/models/AppState.js
index 8abd76db0a7729014c7a40f6251400fcfecb712b..a031a24b3dbf2fab5741a9595064e37540996d02 100644
--- a/js/models/AppState.js
+++ b/js/models/AppState.js
@@ -130,9 +130,7 @@ AppState = Backbone.Model.extend({
 //            }
 //        },
         allAssemblyStrategies: {
-            xRaster: "X Raster",
-            yRaster: "Y Raster",
-            manual: "Manual Entry"
+            raster: "Raster"
         },
         allCamProcesses: {
             shopbot: "Shopbot (sbp)",
diff --git a/js/models/Lattice.js b/js/models/Lattice.js
index a70648fd2f6e4394dee73499f29326b587943b3d..4b57ea3c527d955dbffa5c343010da2c92a86253 100644
--- a/js/models/Lattice.js
+++ b/js/models/Lattice.js
@@ -450,7 +450,7 @@ Lattice = Backbone.Model.extend({
         }
     },
 
-    rasterCells: function(order, callback, var1, var2, var3){//used for CAM raster x/y/z in any order permutation
+    rasterCells: function(order, callback, var1, var2, var3, cells){//used for CAM raster x/y/z in any order permutation
         //order is of form 'XYZ'
         var firstLetter = order.charAt(0);
         order = order.substr(1);
@@ -460,7 +460,7 @@ Lattice = Backbone.Model.extend({
             firstLetter = order.charAt(0);
             order = order.substr(1);
         }
-        var cells = this.get("cells");
+        if (!cells) cells = this.get("cells");//grab cells once at beginning and hold onto it in case changes are made while looping
         var newVarOrder;
         var newVarDim;
         if (firstLetter == 'X'){
@@ -473,13 +473,9 @@ Lattice = Backbone.Model.extend({
             newVarOrder = 2;
             newVarDim = cells[0][0].length;
         } else if (firstLetter == ""){
-            for (var i=0;i<var1.dim;i++){
-            //for (var i=var1.dim-1;i>=0;i--){
-                for (var j=var2.dim-1;j>=0;j--){
-                    for (var k=var3.dim-1;k>=0;k--){
-            //for (var i=0;i<var1.dim;i++){
-            //    for (var j=0;j<var2.dim;j++){
-            //        for (var k=0;k<var3.dim;k++){
+            for (var i=this._getRasterLoopInit(var1);this._getRasterLoopCondition(i,var1);i+=this._getRasterLoopIterator(var1)){
+                for (var j=this._getRasterLoopInit(var2);this._getRasterLoopCondition(j,var2);j+=this._getRasterLoopIterator(var2)){
+                    for (var k=this._getRasterLoopInit(var3);this._getRasterLoopCondition(k,var3);k+=this._getRasterLoopIterator(var3)){
                         if (var1.order == 0){
                             if (var2.order == 1) callback(cells[i][j][k], i, j, k);
                             else if (var2.order == 2) callback(cells[i][k][j], i, k, j);
@@ -488,7 +484,9 @@ Lattice = Backbone.Model.extend({
                             else if (var2.order == 2) callback(cells[k][i][j], k, i, j);
                         } else {
                             if (var2.order == 0) callback(cells[j][k][i], j, k, i);
-                            else if (var2.order == 1) callback(cells[k][j][i], k, j, i);
+                            else if (var2.order == 1) {
+                                callback(cells[k][j][i], k, j, i);
+                            }
                         }
 
                     }
@@ -496,10 +494,25 @@ Lattice = Backbone.Model.extend({
             }
             return;
         }
-        if (var3 == null) var3 = {order: newVarOrder, dim: newVarDim};
-        else if (var2  == null) var2 = {order: newVarOrder, dim: newVarDim};
-        else var1 = {order: newVarOrder, dim: newVarDim};
-        this.rasterCells(order, callback, var1, var2, var3);
+        if (var3 == null) var3 = {order: newVarOrder, dim: newVarDim, neg:isNeg};
+        else if (var2  == null) var2 = {order: newVarOrder, dim: newVarDim, neg:isNeg};
+        else var1 = {order: newVarOrder, dim: newVarDim, neg:isNeg};
+        this.rasterCells(order, callback, var1, var2, var3, cells);
+    },
+
+    _getRasterLoopInit: function(variable){
+        if (variable.neg) return variable.dim-1;
+        return 0;
+    },
+
+    _getRasterLoopCondition: function(iter, variable){
+        if (variable.neg) return iter>=0;
+        return iter<variable.dim;
+    },
+
+    _getRasterLoopIterator: function(variable){
+        if (variable.neg) return -1;
+        return 1;
     }
 
 });
\ No newline at end of file