diff --git a/web/gui/src/main/webapp/app/view/topo/topoLink.js b/web/gui/src/main/webapp/app/view/topo/topoLink.js
index ec4cc53..9cd49dc 100644
--- a/web/gui/src/main/webapp/app/view/topo/topoLink.js
+++ b/web/gui/src/main/webapp/app/view/topo/topoLink.js
@@ -48,16 +48,47 @@
         return {x: mx, y: my};
     }
 
-    function computeNearestLink(mouse) {
-        var proximity = 30 / api.zoomer.scale(),
+
+    function sq(x) { return x * x; }
+
+    function mdist(p, m) {
+        return Math.sqrt(sq(p.x - m.x) + sq(p.y - m.y));
+    }
+
+    function prox(dist) {
+        return dist / api.zoomer.scale();
+    }
+
+    function computeNearestNode(mouse) {
+        var proximity = prox(30),
             nearest = null,
             minDist;
 
-        function sq(x) { return x * x; }
+        if (network.nodes.length) {
+            minDist = proximity * 2;
 
-        function mdist(p, m) {
-            return Math.sqrt(sq(p.x - m.x) + sq(p.y - m.y));
+            network.nodes.forEach(function (d) {
+                var dist;
+
+                if (!api.showHosts() && d.class === 'host') {
+                    return; // skip hidden hosts
+                }
+
+                dist = mdist({x: d.x, y: d.y}, mouse);
+                if (dist < minDist && dist < proximity) {
+                    minDist = dist;
+                    nearest = d;
+                }
+            });
         }
+        return nearest;
+    }
+
+
+    function computeNearestLink(mouse) {
+        var proximity = prox(30),
+            nearest = null,
+            minDist;
 
         function pdrop(line, mouse) {
             var x1 = line.x1,
@@ -229,12 +260,18 @@
     }
 
     function mouseClickHandler() {
-        var mp, link;
+        var mp, link, node;
 
         if (!tss.clickConsumed()) {
             mp = getLogicalMousePosition(this);
-            link = computeNearestLink(mp);
-            selectLink(link);
+            node = computeNearestNode(mp);
+            if (node) {
+                $log.debug('found nearest node:', node.labels[1]);
+                tss.selectObject(node);
+            } else {
+                link = computeNearestLink(mp);
+                selectLink(link);
+            }
         }
     }
 
diff --git a/web/gui/src/main/webapp/app/view/topo/topoSelect.js b/web/gui/src/main/webapp/app/view/topo/topoSelect.js
index b8153c3..880ab90 100644
--- a/web/gui/src/main/webapp/app/view/topo/topoSelect.js
+++ b/web/gui/src/main/webapp/app/view/topo/topoSelect.js
@@ -88,14 +88,15 @@
 
     function selectObject(obj) {
         var el = this,
-            ev = d3.event.sourceEvent,
+            nodeEv = el && el.tagName === 'g',
+            ev = d3.event.sourceEvent || {},
             n;
 
         if (api.zoomingOrPanning(ev)) {
             return;
         }
 
-        if (el) {
+        if (nodeEv) {
             n = d3.select(el);
         } else {
             api.node().each(function (d) {
@@ -106,7 +107,9 @@
         }
         if (!n) return;
 
-        consumeClick = true;
+        if (nodeEv) {
+            consumeClick = true;
+        }
         api.deselectLink();
 
         if (ev.shiftKey && n.classed('selected')) {
