diff --git a/web/ons-demo/js/app.js b/web/ons-demo/js/app.js
index 8cb50ef..92dd37e 100644
--- a/web/ons-demo/js/app.js
+++ b/web/ons-demo/js/app.js
@@ -311,13 +311,10 @@
 		var dstDPID = link['dst-switch'];
 
 		var srcMap = linkMap[srcDPID] || {};
-		var dstMap = linkMap[dstDPID] || {};
 
-		srcMap[dstDPID] = true;
-		dstMap[srcDPID] = true;
+		srcMap[dstDPID] = link;
 
 		linkMap[srcDPID]  = srcMap;
-		linkMap[dstDPID]  = dstMap;
 	});
 	return linkMap;
 }
@@ -330,7 +327,7 @@
 	var linkMap = createLinkMap(model);
 //	var flowMap = createFlowMap(model);
 
-	function mouseOver(data) {
+	function mouseOverSwitch(data) {
 		if (data.highlighted) {
 			return;
 		}
@@ -370,7 +367,7 @@
 		node.moveToFront();
 	}
 
-	function mouseOut(data) {
+	function mouseOutSwitch(data) {
 		if (data.mouseDown)
 			return;
 
@@ -381,11 +378,32 @@
 		data.target = false;
 	}
 
-	function mouseDown(data) {
-		mouseOver(data);
+	function mouseDownSwitch(data) {
+		mouseOverSwitch(data);
 		data.mouseDown = true;
 	}
 
+	function mouseUpSwitch(data) {
+		if (data.mouseDown) {
+			data.mouseDown = false;
+			d3.event.stopPropagation();
+		}
+	}
+
+	function doubleClickSwitch(data) {
+		if (data.state == 'ACTIVE') {
+			var prompt = 'Deactivate ' + data.dpid + '?';
+			if (confirm(prompt)) {
+				switchDown(data);
+			}
+		} else {
+			var prompt = 'Activate ' + data.dpid + '?';
+			if (confirm(prompt)) {
+				switchUp(data);
+			}
+		}
+	}
+
 	function ringEnter(data, i) {
 		if (!data.length) {
 			return;
@@ -424,9 +442,15 @@
 			});
 
 		// setup the mouseover behaviors
-		nodes.on('mouseover', mouseOver);
-		nodes.on('mouseout', mouseOut);
-		nodes.on('mousedown', mouseDown)
+		nodes.on('mouseover', mouseOverSwitch);
+		nodes.on('mouseout', mouseOutSwitch);
+		nodes.on('mouseup', mouseUpSwitch);
+		nodes.on('mousedown', mouseDownSwitch);
+
+		// only do switch up/down for core switches
+		if (i == 2) {
+			nodes.on('dblclick', doubleClickSwitch);
+		}
 	}
 
 	// append switches
@@ -441,7 +465,7 @@
 				return data.dpid;
 			});
 		nodes.select('circle').attr('class', function (data, i)  {
-				if (data.state === 'ACTIVE') {
+				if (data.state === 'ACTIVE' && data.controller) {
 					return data.className + ' ' + controllerColorMap[data.controller];
 				} else {
 					return data.className + ' ' + 'colorInactive';
@@ -462,7 +486,7 @@
 		function clearHighlight() {
 			svg.selectAll('circle').each(function (data) {
 				data.mouseDown = false;
-				mouseOut(data);
+				mouseOutSwitch(data);
 			})
 		};
 
@@ -493,12 +517,20 @@
 				if (map && map[dstData.dpid]) {
 					var prompt = 'Remove link between ' + srcData.dpid + ' and ' + dstData.dpid + '?';
 					if (confirm(prompt)) {
-						linkDown(srcData, dstData);
+						linkDown(map[dstData.dpid]);
 					}
 				} else {
-					var prompt = 'Create link between ' + srcData.dpid + ' and ' + dstData.dpid + '?';
-					if (confirm(prompt)) {
-						linkUp(srcData, dstData);
+					map = linkMap[dstData.dpid];
+					if (map && map[srcData.dpid]) {
+						var prompt = 'Remove link between ' + dstData.dpid + ' and ' + srcData.dpid + '?';
+						if (confirm(prompt)) {
+							linkDown(map[srcData.dpid]);
+						}
+					} else {
+						var prompt = 'Create link between ' + srcData.dpid + ' and ' + dstData.dpid + '?';
+						if (confirm(prompt)) {
+							linkUp(srcData, dstData);
+						}
 					}
 				}
 			}
@@ -654,7 +686,7 @@
 	// this should never be needed
 	// controllers.exit().remove();
 
-	controllers.on('click', function (c, index) {
+	controllers.on('click', function (c) {
 		var allSelected = true;
 		for (var key in controllerColorMap) {
 			if (!d3.select(document.body).classed(controllerColorMap[key] + '-selected')) {
@@ -675,6 +707,8 @@
 		// var selected = d3.select(document.body).classed(controllerColorMap[c] + '-selected');
 		// d3.select(document.body).classed(controllerColorMap[c] + '-selected', !selected);
 	});
+
+
 }
 
 function sync(svg, selectedFlowsView) {
diff --git a/web/ons-demo/js/controller.js b/web/ons-demo/js/controller.js
index 86a7905..b61b2d4 100644
--- a/web/ons-demo/js/controller.js
+++ b/web/ons-demo/js/controller.js
@@ -1,26 +1,48 @@
-var controllerFunctions = {
-	link: function (cmd, src, dst) {
-		var url = '/proxy/gui/link/' + [cmd, src.dpid, 1, dst.dpid, 1].join('/');
-		d3.json(url, function (error, result) {		
-			if (error) {
-				alert(url + ' : ' + error.status);
-			}
-		});
-	}
+/*global d3*/
+
+function callURL(url) {
+	d3.text(url, function (error, result) {
+		if (error) {
+			alert(url + ' : ' + error.status);
+		} else {
+			console.log(result);
+		}
+	});
 }
 
 
+var controllerFunctions = {
+	l: function (cmd, link) {
+		var url = '/proxy/gui/link/' + [cmd, link['src-switch'], link['src-port'], link['dst-switch'], link['dst-port']].join('/');
+		callURL(url);
+
+	},
+	s: function (cmd, s) {
+		var url = '/proxy/gui/switch/' + [cmd, s.dpid].join('/');
+		callURL(url);
+	}
+};
+
+
 // if (parseURLParameters().mock) {
 // 	urls = mockURLs;
 // }
 
 
-function linkUp(src, dst) {
-	controllerFunctions.link('up', src, dst);
+function linkUp(link) {
+	controllerFunctions.l('up', link);
 }
 
-function linkDown(src, dst) {
-	controllerFunctions.link('down', src, dst);
+function linkDown(link) {
+	controllerFunctions.l('down', link);
+}
+
+function switchUp(s) {
+	controllerFunctions.s('up', s);
+}
+
+function switchDown(s) {
+	controllerFunctions.s('down', s);
 }
 
 function createFlow(src, dst) {
diff --git a/web/topology_rest.py b/web/topology_rest.py
index 4409893..3d0a6d3 100755
--- a/web/topology_rest.py
+++ b/web/topology_rest.py
@@ -74,12 +74,13 @@
 
 ## PROXY API (allows development where the webui is served from someplace other than the controller)##
 ONOS_GUI3_HOST="http://gui3.onlab.us:8080"
+ONOS_GUI3_CONTROL_HOST="http://gui3.onlab.us:8081"
 ONOS_LOCAL_HOST="http://localhost:8080" ;# for Amazon EC2
 
 @app.route("/proxy/gui/link/<cmd>/<src_dpid>/<src_port>/<dst_dpid>/<dst_port>")
 def proxy_link_change(cmd, src_dpid, src_port, dst_dpid, dst_port):
   try:
-    command = "curl -s %s/gui/link/%s/%s/%s/%s/%s" % (ONOS_GUI3_HOST, cmd, src_dpid, src_port, dst_dpid, dst_port)
+    command = "curl -s %s/gui/link/%s/%s/%s/%s/%s" % (ONOS_GUI3_CONTROL_HOST, cmd, src_dpid, src_port, dst_dpid, dst_port)
     print command
     result = os.popen(command).read()
   except:
@@ -89,7 +90,18 @@
   resp = Response(result, status=200, mimetype='application/json')
   return resp
 
+@app.route("/proxy/gui/switch/<cmd>/<dpid>")
+def proxy_switch_status_change(cmd, dpid):
+  try:
+    command = "curl -s %s/gui/switch/%s/%s" % (ONOS_GUI3_CONTROL_HOST, cmd, dpid)
+    print command
+    result = os.popen(command).read()
+  except:
+    print "REST IF has issue"
+    exit
 
+  resp = Response(result, status=200, mimetype='application/json')
+  return resp
 
 @app.route("/wm/core/topology/switches/all/json")
 def switches():
@@ -118,7 +130,7 @@
 
   try:
     command = "curl -s %s/wm/core/topology/links/json" % (host)
-#    print command
+    print command
     result = os.popen(command).read()
   except:
     print "REST IF has issue"
