diff --git a/css/main.css b/css/main.css
index 9cac23aca2724c555d8e080b617fa0520279afa5..cae305c6921112f9315b5f40b11bc57a1963bfe6 100644
--- a/css/main.css
+++ b/css/main.css
@@ -195,7 +195,7 @@ hr {
     background-color: rgba(255, 255, 0, 0.35);
 }
 
-#postWarning {
+.postWarning {
     background-color: rgba(255,0,0,0.15);
     padding: 10px 15px 15px 15px;
     margin: 20px 0;
diff --git a/js/menus/AnimationMenuView.js b/js/menus/AnimationMenuView.js
index e6c25fcbe3dc8dbe04a440d73edfd38e082b47dc..ad37a9cf6f2598185532735ccf87e7145f7f94ce 100644
--- a/js/menus/AnimationMenuView.js
+++ b/js/menus/AnimationMenuView.js
@@ -123,7 +123,7 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'cam'], function($, _, Me
             <br/><a href="#" id="animationMenuSave" class=" btn btn-block btn-lg btn-default">Save</a><br/>\
             <!--Assembly Time:&nbsp;&nbsp;<br/><br/>-->\
             <% if (editsMadeToProgram && needsPostProcessing){ %>\
-            <div id="postWarning">You have made the following changes that require post processing:<br/>\
+            <div class="postWarning">You have made the following changes that require post processing:<br/>\
             This will override edits you have made to the G-code.  OK to override? <a href="#" class="overrideEdits btn btn-block btn-lg btn-danger">OK</a></div>\
             <% } %>\
             <div id="gcodeEditor"><%= dataOut %></div><br/>\
diff --git a/js/menus/MenuWrapperView.js b/js/menus/MenuWrapperView.js
index 6d3b270dd66081ff27eab35c8a0ceb509b78e1ca..35b7db29528d8888885f32fcfce778bbd0d201d0 100644
--- a/js/menus/MenuWrapperView.js
+++ b/js/menus/MenuWrapperView.js
@@ -134,7 +134,8 @@ define(['jquery', 'underscore', 'plist', 'backbone', 'lattice'], function($, _,
             var property = $target.data("property");
             var value = $target.data("value");
             if (!property || !value) return;
-            this._getPropertyOwner($target).set(property, value);
+            var owner = this._getPropertyOwner($target, property, value);
+            if (owner) owner.set(property, value);
         },
 
         _clickCheckbox: function(e){
@@ -161,11 +162,17 @@ define(['jquery', 'underscore', 'plist', 'backbone', 'lattice'], function($, _,
             lattice.getUItarget().clearCells();
         },
 
-        _getPropertyOwner: function($target){
+        _getPropertyOwner: function($target, property, value){
             if ($target.hasClass("lattice")) return lattice;
             if ($target.hasClass("compositeEditor")) return lattice.compositeEditor;
             if ($target.hasClass("assembler")) return globals.cam;
             if ($target.hasClass("appState")) return this.model;
+            if ($target.hasClass("serialComm")) {
+                require(['serialComm'], function(serialComm){
+                    serialComm._changeProperty(property, value);
+                });
+                return null;
+            }
             console.warn("no owner found for " + $target);
             return null;
         },
diff --git a/js/menus/SetupCommMenuView.js b/js/menus/SetupCommMenuView.js
index 2483ca780391f65704463d2b5890a742d3916baa..41cf52d5cdd51db86c05297908b70254a3541e56 100644
--- a/js/menus/SetupCommMenuView.js
+++ b/js/menus/SetupCommMenuView.js
@@ -16,15 +16,38 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'serialComm'], function($
 
         _initialize: function(){
 
+            this.listenTo(serialComm, "change", this.render);
         },
 
         _makeTemplateJSON: function(){
-            return _.extend(this.model.toJSON(), serialComm.toJSON());
+            return _.extend(this.model.toJSON(), serialComm.toJSON(), {allBaudRates: [300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200]});
         },
 
         template: _.template('\
-        Setup<br/>\
-        Send Test Messages\
+        <% if(error){ %> \
+        <div class="postWarning">Error: <%= error%></div>\
+        <% } %>\
+        Status: &nbsp;&nbsp;<% if (portConnected){ %> Connected <% } else { %> Disconnected <% } %><br/><br/>\
+        Baud Rate: &nbsp;&nbsp;\
+                <div class="btn-group">\
+                    <button data-toggle="dropdown" class="btn dropdown-toggle" type="button"><%= baudRate %><span class="caret"></span></button>\
+                    <ul role="menu" class="dropdown-menu">\
+                        <% _.each(allBaudRates, function(rate){ %>\
+                            <li><a class="serialComm dropdownSelector" data-property="baudRate" data-value="<%= rate %>" href="#"><%= rate %></a></li>\
+                        <% }); %>\
+                    </ul>\
+                </div><br/><br/>\
+        Port: &nbsp;&nbsp;\
+                <div class="btn-group">\
+                    <button data-toggle="dropdown" class="btn dropdown-toggle" type="button"><%= portName %><span class="caret"></span></button>\
+                    <ul role="menu" class="dropdown-menu">\
+                        <% _.each(availablePorts, function(port){ %>\
+                            <li><a class="serialComm dropdownSelector" data-property="portName" data-value="<%= port %>" href="#"><%= port %></a></li>\
+                        <% }); %>\
+                    </ul>\
+                </div><br/><br/>\
+        Test Message:<br/>\
+        \
             ')
 
     });
diff --git a/js/models/SerialComm.js b/js/models/SerialComm.js
index 51f0b0f87948551dbc2e6080fd6fb5fe50a4e93a..c3c4d629f203640e288c103512b7c68439da4bc2 100644
--- a/js/models/SerialComm.js
+++ b/js/models/SerialComm.js
@@ -4,15 +4,60 @@
 
 define(['underscore', 'backbone', 'socketio'], function(_, Backbone, io){
 
+    var socket = io.connect('http://localhost:8080');
+
     var SerialComm = Backbone.Model.extend({
 
+        defaults: {
+            connected: false,
+            portConnected: false,
+            availablePorts: [],
+            portName: null,
+            baudRate: 200,
+            error: null
+        },
+
+        initialize: function(){
+
+
+        },
+
+        _changeProperty: function(property, value){
+            if (property === null || property === undefined || value === null || value === undefined) return;
+            if (this.get(property) == value) return;
+            socket.emit(property, value);
+            this.set(property, value);
+        }
+
     });
 
     var serialComm = new SerialComm();
-    var socket = io.connect('http://localhost:8080');
 
-    socket.on('connected', function(){
-        console.log("worked");
+    socket.on('connected', function(data){
+        console.log(data);
+        serialComm.set("connected", true, {silent:true});
+        _.each(_.keys(data), function(key){
+            serialComm.set(key, data[key], {silent:true});
+        });
+        serialComm.trigger("change");
+    });
+
+    socket.on('disconnected', function(){
+        serialComm.set("connected", false);
+    });
+
+    socket.on('portConnected', function(baudRate){
+        serialComm.set("baudRate", baudRate);
+        serialComm.set("portConnected", true);
+    });
+
+    socket.on('portDisconnected', function(baudRate){
+        if (serialComm.get("baudRate") != baudRate) return;
+        serialComm.set("portConnected", false);
+    });
+
+    socket.on("error", function(error){
+        serialComm.set("error", error);
     });
 
 
diff --git a/node/nodeServer.js b/node/nodeServer.js
index 62e99f0684f0c4cebd56648e10219974a2b49381..37815fd3c331276171b95592aa44c55b70fd1f5e 100644
--- a/node/nodeServer.js
+++ b/node/nodeServer.js
@@ -13,11 +13,7 @@ var io = require('socket.io').listen(8080);
 //var io = require('socket.io')(http);
 
 // list serial ports:
-serialport.list(function (err, ports) {
-    ports.forEach(function(port) {
-        console.log(port.comName);
-    });
-});
+
 
 //defualts
 var portName = '/dev/cu.usbserial-DA01L12I';
@@ -28,41 +24,88 @@ var baudRate = 9600;
 //});
 
 
-
 io.on('connection', function(socket){
-  console.log('a user connected');
-    io.emit('connected');
-});
 
+    var allPorts = [];
+    serialport.list(function(err, ports){
+        ports.forEach(function(port) {
+            allPorts.push(port.comName);
+        });
+
+        socket.emit('connected', {
+            baudRate: baudRate,
+            portName: portName,
+            availablePorts: allPorts
+        });
+    });
 
-var myPort = new SerialPort(portName, {
-   baudRate: baudRate,
-   parser:serialport.parsers.readline("\n")
-//       parser: serialport.parsers.raw
-});
 
-myPort.on('open', onPortOpen);
-myPort.on('data', onPortData);
-myPort.on('close', onPortClose);
-myPort.on('error', onPortError);
+    socket.on('baudRate', function(value){
+        baudRate = value;
+        changePort();
+        console.log(value);
+    });
+
+    socket.on('portName', function(value){
+        if (allPorts.indexOf(value) < 0) {
+            onPortError("no available port called " + value);
+            return;
+        }
+        portName = value;
+        changePort();
+        console.log(value);
+    });
 
 
 
+    var currentPort = initPort(portName, baudRate);
+
+    function initPort(_portName, _baudRate){
+        var port = new SerialPort(_portName, {
+           baudRate: _baudRate,
+           parser:serialport.parsers.readline("\n")
+        //       parser: serialport.parsers.raw
+        }, false);
+
+        port.open(function(error){
+            if (error) onPortError(error);
+            onPortOpen();
+            port.on('data', onPortData);
+            port.on('close', onPortClose);
+            port.on('error', onPortError);
+        });
+        return port;
+    }
+
+    function changePort(_portName, _baudRate){
+        if (currentPort) currentPort.close(function(error){
+            if (error) onPortError(error);
+        });
+        currentPort = initPort(_portName, _baudRate);
+    }
+
+    function onPortOpen(){
+        socket.emit("portConnected", baudRate);
+    }
+
+    function onPortData(data){
+    //    console.log(data);
+    }
+
+    function onPortClose(){
+        console.log("portclosed");
+        socket.emit("portDisconnected", baudRate);
+    }
+
+    function onPortError(error){
+        console.log("Serial port error " + error);
+        socket.emit("error", error);
+    }
+
+});
 
-function onPortOpen(){
-    console.log("port open");
-}
 
-function onPortData(data){
-//    console.log(data);
-}
 
-function onPortClose(){
-    console.log("port close");
-}
 
-function onPortError(error){
-    console.log("Serial port error " + error);
-}