diff --git a/css/main.css b/css/main.css
index 8dd5b1384ff478a9c958e37e22232d4a60fc2e02..e058094d4c95d468b82d33f0b411a99fd4d2ca1e 100644
--- a/css/main.css
+++ b/css/main.css
@@ -160,3 +160,8 @@ hr {
 #gcodeEditor:focus {
     outline-width: 0;
 }
+
+input.numberInput{
+    width:22%;
+    display: inline;
+}
diff --git a/js/cam/Assembler.js b/js/cam/Assembler.js
index cbe188220935202f903ed73baf4d124d8aaf0ca1..96405d562c9584fe46d0c9beb69ecb1eac0321b7 100644
--- a/js/cam/Assembler.js
+++ b/js/cam/Assembler.js
@@ -14,6 +14,8 @@ Assembler = Backbone.Model.extend({
 
         rapidHeight: 12,
         stockHeight: 3,
+        origin: null,
+        originPosition: new THREE.Vector3(0,0,0)
     },
 
     initialize: function(){
@@ -23,7 +25,28 @@ Assembler = Backbone.Model.extend({
         //bind events
         this.listenTo(this, "change:camProcess", this._setNeedsPostProcessing);
         this.listenTo(dmaGlobals.appState, "change:units", this._setNeedsPostProcessing);
+        this.listenTo(dmaGlobals.appState, "change:currentTab", this._setOriginVisibility);
+        this.listenTo(this, "change:originPosition", this._moveOrigin);
+
+        //init origin mesh
+        var origin = new THREE.Mesh(new THREE.SphereGeometry(dmaGlobals.lattice.get("scale")/4), new THREE.MeshBasicMaterial({color:0xff0000}));
+        dmaGlobals.three.sceneAdd(origin);
+        this.set("origin", origin);
+        this._setOriginVisibility();
+    },
+
+    _setOriginVisibility: function(){
+        var visible = false;
+        var currentTab = dmaGlobals.appState.get("currentTab");
+        if (currentTab == "cam" || currentTab == "animate" || currentTab == "send") visible = true;
+        this.get("origin").visible = visible;
+        dmaGlobals.three.render();
+    },
 
+    _moveOrigin: function(){
+        var position = this.get("originPosition");
+        this.get("origin").position.set(position.x, position.y, position.z);
+        dmaGlobals.three.render();
     },
 
     _setNeedsPostProcessing: function(){
diff --git a/js/menus/CamMenuView.js b/js/menus/CamMenuView.js
index 4edc02b2043d7fd101261633bba7ee31b332b26b..6337df5a4892d36655936314e3151d3fade0ae20 100644
--- a/js/menus/CamMenuView.js
+++ b/js/menus/CamMenuView.js
@@ -20,8 +20,11 @@ CamMenuView = Backbone.View.extend({
         this.assembler = options.assembler;
 
         _.bindAll(this, "render");
+        _.bindAll(this, "_updateOrigin");
+        //bind events
         this.listenTo(this.assembler, "change", this.render);
         this.listenTo(this.model, "change:units", this.render);
+        $(document).bind('keyup', {state:false}, this._updateOrigin);
     },
 
     _selectCamProcess: function(e){
@@ -34,6 +37,16 @@ CamMenuView = Backbone.View.extend({
         this.model.set("units", $(e.target).data("type"));
     },
 
+    _updateOrigin: function(e){
+        if (!$(".wcs").is(":focus")) return;
+        e.preventDefault();
+        var newPosition = parseFloat($(e.target).val());
+        if (isNaN(newPosition)) return;
+        var origin = this.assembler.get("originPosition");
+        origin[$(e.target).data("type")] = newPosition;
+        this.assembler.trigger("change:originPosition");
+    },
+
     _save: function(e){
         e.preventDefault();
         this.assembler.save();
@@ -41,6 +54,7 @@ CamMenuView = Backbone.View.extend({
 
     render: function(){
         if (this.model.get("currentTab") != "cam") return;
+        if ($(".wcs").is(":focus")) return;
         this.$el.html(this.template(_.extend(this.model.toJSON(), this.assembler.toJSON())));
     },
 
@@ -54,6 +68,7 @@ CamMenuView = Backbone.View.extend({
                     <% }); %>\
                 </ul>\
             </div><br/><br/>\
+         <a href="#" id="saveCam" class=" btn btn-block btn-lg btn-default">Process and Save</a><br/>\
          Units: &nbsp;&nbsp;\
             <div class="btn-group">\
                 <button data-toggle="dropdown" class="btn dropdown-toggle" type="button"><%= allUnitTypes[units] %><span class="caret"></span></button>\
@@ -63,7 +78,9 @@ CamMenuView = Backbone.View.extend({
                     <% }); %>\
                 </ul>\
             </div><br/><br/>\
-            <a href="#" id="saveCam" class=" btn btn-block btn-lg btn-default">Process and Save</a><br/>\
+            Part Zero: &nbsp;&nbsp;<input data-type="x" value="<%= originPosition.x %>" placeholder="origin X" class="form-control numberInput wcs" type="text">\
+            &nbsp;<input data-type="y" value="<%= originPosition.y %>" placeholder="origin Y" class="form-control numberInput wcs" type="text">\
+            &nbsp;<input data-type="z" value="<%= originPosition.z %>" placeholder="origin Z" class="form-control numberInput wcs" type="text"><br/>\
         ')
 
 });
\ No newline at end of file
diff --git a/js/menus/MenuWrapperView.js b/js/menus/MenuWrapperView.js
index 9d09c2542e9d4446c20c4ee3054d12d87864591c..ee51d2bef8071eba0c3dbf06bfbf45e132441052 100644
--- a/js/menus/MenuWrapperView.js
+++ b/js/menus/MenuWrapperView.js
@@ -92,6 +92,7 @@ MenuWrapper = Backbone.View.extend({
         var self = this;
         this._hide(function(){
             self._populateAndShow();
+            self.model.trigger("change:currentTab");//this was updated silently before
         }, true);
     },