diff --git a/README.md b/README.md
index df2ba7a1e8a6fa71a64ae9533fee6ece1ee0ce50..98cc4709b48a1155b494faf872dde5d990b4ce1a 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,7 @@ This project serves the developement environment / api we use to write and repre
 ## For MW
 
  - rick click on menu bar to delete module 
+  - delete module ? then we're done ... 
 
  - walk program units and change 
  - what program units do we want?
@@ -34,7 +35,6 @@ This project serves the developement environment / api we use to write and repre
  - UI desires
   - off-screen divs get pointers-to so that we don't get lost
   - 'h' or something to zoom-to-extents
-  - highlight wires 
 
  - GIFS
   - load a program
diff --git a/client/client.js b/client/client.js
index fa9323d9c22bbc6850c36cf58a77fab1bfbffd83..a0561d4044aa0aceb82a08c289cd2052265051bb 100644
--- a/client/client.js
+++ b/client/client.js
@@ -317,7 +317,11 @@ function redrawLinks() {
                 var inputUi = program.modules[toId].ui.inputs[toKey]
                 var outPos = getOutputArrow(outputUi)
                 var inPos = getInputArrow(inputUi)
-                var bz = newBezier(outPos.x, outPos.y, inPos.x, inPos.y)
+                if (inputUi.isHovering || outputUi.isHovering) {
+                    var bz = newBezier(outPos.x, outPos.y, inPos.x, inPos.y, true)
+                } else {
+                    var bz = newBezier(outPos.x, outPos.y, inPos.x, inPos.y, false)
+                }
             }
         }
     }
@@ -429,20 +433,28 @@ function mouseUpDragListener(evt) {
 // get json menu item and render
 // and ask for module at /obj/key
 oncontextmenu = function(evt) {
-    if (sckt) {
-        socketSend('get module menu', '')
+    console.log(evt.target)
+    if (evt.target.className == 'modname') {
+        var modRep = program.modules[evt.target.innerHTML]
+        if (modRep) {
+            writeModuleOptionMenu(modRep)
+        }
     } else {
-        // socket brkn, reload page 
-        location.reload()
+        if (sckt) {
+            socketSend('get module menu', '')
+        } else {
+            // socket brkn, reload page 
+            location.reload()
+        }
+        // prevents event bubbling 
     }
-    // prevents event bubbling 
     return false
 }
 
-onmousemove = function(evt){
+onmousemove = function(evt) {
     var cT = getCurrentTransform()
-    lastPos.x = cT.ox - cT.tx + (evt.pageX - cT.ox)/cT.s
-    lastPos.y = cT.oy - cT.ty + (evt.pageY - cT.oy)/cT.s
+    lastPos.x = cT.ox - cT.tx + (evt.pageX - cT.ox) / cT.s
+    lastPos.y = cT.oy - cT.ty + (evt.pageY - cT.oy) / cT.s
 }
 
 document.onkeydown = function(evt) {
@@ -466,12 +478,52 @@ document.onkeydown = function(evt) {
     }
 }
 
+function writeModuleOptionMenu(modRep) {
+    var menuDom = document.createElement('div')
+    menuDom.id = 'perModuleMenu'
+    menuDom.style.left = 10 + modRep.ui.domElem.offsetLeft + modRep.ui.domElem.offsetWidth + 'px'
+    menuDom.style.top = modRep.ui.domElem.offsetTop + 'px'
+    // future: rm all inputs, rm all outputs, rename, open (heirarchy)
+    var opts = ['delete', 'copy']
+    for (i in opts) {
+        var li = document.createElement('li')
+        li.innerHTML = opts[i]
+        li.id = opts[i]
+        if (opts[i] == 'delete') {
+            li.addEventListener('click', function(evt) {
+                var data = {
+                    id: modRep.description.id 
+                }
+                socketSend('remove module', data)
+                wrapper.removeChild(document.getElementById('perModuleMenu'))
+            })
+        } else if (opts[i] == 'copy') {
+            li.addEventListener('click', function(evt) {
+                var data = modRep.description.path 
+                socketSend('put module', data)
+                wrapper.removeChild(document.getElementById('perModuleMenu'))
+            })
+        }
+        menuDom.appendChild(li)
+    }
+    wrapper.append(menuDom)
+
+    function rmListener(evt) {
+        var findMenu = document.getElementById('perModuleMenu')
+        if (findMenu != null && findMenu.id == 'perModuleMenu') {
+            wrapper.removeChild(findMenu)
+        }
+        evt.target.removeEventListener(evt.type, arguments.callee)
+    }
+
+    document.addEventListener('click', rmListener)
+}
+
 // return ul element with name and alt and link? 
 // TODO: not properly a tree, see note @ reciprocal fn in views.js
 function heapSendsModuleMenu(tree) {
     var menuDom = document.createElement('div')
     menuDom.id = 'moduleMenu'
-    console.log(lastPos)
     menuDom.style.left = lastPos.x + 'px'
     menuDom.style.top = lastPos.y + 'px'
     for (key in tree) {
diff --git a/client/divtools.js b/client/divtools.js
index ee000c89689232614b3ffd97b2a155fc348bec5f..f6b9eb3fb30967ca1348d91b0cd54c2bfb97b8b6 100644
--- a/client/divtools.js
+++ b/client/divtools.js
@@ -16,6 +16,34 @@ function addRepToView(rep) {
     title.className = 'modname'
     title.innerHTML = rep.description.id
     title.alt = rep.description.alt
+    // MOVEABOUT CODE 
+    title.onmousedown = function(evt) {
+        evt.preventDefault()
+        evt.stopPropagation()
+
+        offsetX = evt.clientX - domElem.getBoundingClientRect().left
+        offsetY = evt.clientY - domElem.getBoundingClientRect().top
+
+        function domElemMouseMove(evt) {
+            evt.preventDefault()
+            evt.stopPropagation()
+            var cT = getCurrentTransform()
+            domElem.style.left = parseFloat(domElem.style.left) + evt.movementX / cT.s + 'px'
+            domElem.style.top = parseFloat(domElem.style.top) + evt.movementY / cT.s + 'px'
+            redrawLinks()
+        }
+
+        function rmOnMouseUp(evt) {
+            rep.description.position.left = parseInt(domElem.style.left, 10)
+            rep.description.position.top = parseInt(domElem.style.top, 10)
+            putUi(rep)
+            document.removeEventListener('mousemove', domElemMouseMove)
+            document.removeEventListener('mouseup', rmOnMouseUp)
+        }
+
+        document.addEventListener('mousemove', domElemMouseMove)
+        document.addEventListener('mouseup', rmOnMouseUp)
+    }
     domElem.appendChild(title)
 
     var uiSetFlag
@@ -36,7 +64,7 @@ function addRepToView(rep) {
         rep.description.position.top = lastPos.y
     }
 
-    if(rep.ui == null){
+    if (rep.ui == null) {
         rep.ui = {}
     }
 
@@ -79,34 +107,8 @@ function addRepToView(rep) {
     clearElem.className = 'clear'
     domElem.appendChild(clearElem)
 
-    // MOVEABOUT CODE 
-    title.onmousedown = function(evt) {
-        offsetX = evt.clientX - domElem.getBoundingClientRect().left
-        offsetY = evt.clientY - domElem.getBoundingClientRect().top
-
-        function domElemMouseMove(evt) {
-            evt.preventDefault()
-            evt.stopPropagation()
-            var cT = getCurrentTransform()
-            domElem.style.left = parseFloat(domElem.style.left) + evt.movementX/cT.s + 'px'
-            domElem.style.top = parseFloat(domElem.style.top) + evt.movementY/cT.s + 'px'
-            redrawLinks()
-        }
-
-        function rmOnMouseUp(evt){
-            rep.description.position.left = parseInt(domElem.style.left, 10)
-            rep.description.position.top = parseInt(domElem.style.top, 10)
-            putUi(rep)
-            document.removeEventListener('mousemove', domElemMouseMove)
-            document.removeEventListener('mouseup', rmOnMouseUp)
-        }
-
-        document.addEventListener('mousemove', domElemMouseMove)
-        document.addEventListener('mouseup', rmOnMouseUp)
-    }
-
     wrapper.appendChild(rep.ui.domElem)
-    if(uiSetFlag){
+    if (uiSetFlag) {
         putUi(rep)
     }
 }
@@ -125,6 +127,22 @@ function writeEventRep(rep, type, key) {
         console.log('clicked', key)
         evtConnectHandler(ipclk)
     })
+    li.addEventListener('mouseover', (evt) => {
+        if (type == 'input') {
+            rep.ui.inputs[key].isHovering = true
+        } else if (type == 'output') {
+            rep.ui.outputs[key].isHovering = true
+        }
+        redrawLinks()
+        li.addEventListener('mouseout', (evt) => {
+            if (type == 'input') {
+                rep.ui.inputs[key].isHovering = false
+            } else if (type == 'output') {
+                rep.ui.outputs[key].isHovering = false
+            }
+            redrawLinks()
+        })
+    })
     return li
 }
 
@@ -220,10 +238,14 @@ function writeStateRep(container, rep, key) {
 var svgns = 'http://www.w3.org/2000/svg'
 var svg = {}
 
-function newBezier(x1, y1, x2, y2) {
+function newBezier(x1, y1, x2, y2, highlight) {
     var bz = {}
     bz.elem = document.createElementNS(svgns, 'path')
-    bz.elem.style.stroke = '#1a1a1a'
+    if (highlight) {
+        bz.elem.style.stroke = '#fcd17b'
+    } else {
+        bz.elem.style.stroke = '#1a1a1a'
+    }
     bz.elem.style.fill = 'none'
     bz.elem.style.strokeWidth = '7px'
     bz.x1 = x1
diff --git a/client/style.css b/client/style.css
index eaa14125a28ffa18ce81b2ee9adc89560a149914..4c3c94d6b1b5dc9b8b22b1b21d74bce30ae65605 100644
--- a/client/style.css
+++ b/client/style.css
@@ -1,6 +1,6 @@
 body {
 	background-color: #d6d6d6;
-	font-family: Lucia Grande, sans-serif;
+	font-family: Palatino, serif;
 	font-size: 11px;
 }
 
@@ -17,13 +17,19 @@ body {
 }
 
 .modname {
-	font-size: 13px;
-	padding-left:60px;
+	font-size: 15px;
+	font-weight: bold;
+	font-style: italic;
+	padding-left:89px;
 	padding-top: 7px;
 	padding-bottom: 7px;
 	color: #eee;
 }
 
+.modname:hover{
+	background-color: #969696;
+}
+
 .inputs {
 	width: 78px;
 	float: left;
@@ -110,4 +116,11 @@ li:active{
 	width: 245px;
 	padding: 10px;
     background-color: #303030;
+}
+
+#perModuleMenu {
+	position: absolute;
+	width: 80px;
+	padding: 3px;
+    background-color: #303030;
 }
\ No newline at end of file
diff --git a/views.js b/views.js
index 6f7416d1faa08c269edee89fda93913a243f5ea6..6ca1d5c515b15e360e01de36a93f791b649b86e0 100644
--- a/views.js
+++ b/views.js
@@ -99,6 +99,9 @@ function socketRecv(evt) {
         case 'put module':
             uiRequestNewModule(data)
             break
+        case 'remove module':
+            uiRequestRemoveModule(data) 
+            break 
         case 'put state change':
             uiRequestStateChange(data)
             break
@@ -224,6 +227,10 @@ function uiRequestNewModule(data) {
     socketSend('put module', Reps.makeFromModule(program.modules[keys[keys.length - 1]]))
 }
 
+function uiRequestRemoveModule(data){
+    console.log('UI REQUEST TO REMOVE MODULE', data.id)
+}
+
 function uiRequestStateChange(data) {
     console.log('UI REQUEST CHANGE STATE IN MODULE', data)