Drawing subscriber and devices
diff --git a/views/ngXosViews/diagnostic/src/js/d3.js b/views/ngXosViews/diagnostic/src/js/d3.js
index 027f08d..d94a22e 100644
--- a/views/ngXosViews/diagnostic/src/js/d3.js
+++ b/views/ngXosViews/diagnostic/src/js/d3.js
@@ -2,260 +2,8 @@
   'use strict';
 
   angular.module('xos.serviceTopology')
-    .factory('d3', function($window){
-      return $window.d3;
-    })
-  .service('TreeLayout', function($window, $log, lodash, ServiceRelation, serviceTopologyConfig){
-
-    const drawLegend = (svg) => {
-      const legendContainer = svg.append('g')
-        .attr({
-          class: 'legend'
-        });
-
-      legendContainer.append('rect')
-      .attr({
-        transform: d => `translate(10, 80)`,
-        width: 100,
-        height: 100
-      });
-
-      // service
-      const service = legendContainer.append('g')
-      .attr({
-        class: 'node service'
-      });
-
-      service.append('circle')
-      .attr({
-        r: serviceTopologyConfig.circle.radius,
-        transform: d => `translate(30, 100)`
-      });
-
-      service.append('text')
-      .attr({
-        transform: d => `translate(45, 100)`,
-        dy: '.35em'
-      })
-      .text('Service')
-        .style('fill-opacity', 1);
-
-      // slice
-      const slice = legendContainer.append('g')
-        .attr({
-          class: 'node slice'
-        });
-
-      slice.append('rect')
-        .attr({
-          width: 20,
-          height: 20,
-          x: -10,
-          y: -10,
-          transform: d => `translate(30, 130)`
-        });
-
-      slice.append('text')
-        .attr({
-          transform: d => `translate(45, 130)`,
-          dy: '.35em'
-        })
-        .text('Slices')
-        .style('fill-opacity', 1);
-
-      // instance
-      const instance = legendContainer.append('g')
-        .attr({
-          class: 'node instance'
-        });
-
-      instance.append('rect')
-        .attr({
-          width: 20,
-          height: 20,
-          x: -10,
-          y: -10,
-          transform: d => `translate(30, 160)`
-        });
-
-      instance.append('text')
-        .attr({
-          transform: d => `translate(45, 160)`,
-          dy: '.35em'
-        })
-        .text('Instances')
-        .style('fill-opacity', 1);
-    };
-
-    var _svg, _layout, _source;
-
-    var i = 0;
-
-    // given a canvas, a layout and a data source, draw a tree layout
-    const updateTree = (svg, layout, source) => {
-
-      //cache data
-      _svg = svg;
-      _layout = layout;
-      _source = source;
-
-      const maxDepth = ServiceRelation.depthOf(source);
-
-      const diagonal = d3.svg.diagonal()
-        .projection(d => [d.y, d.x]);
-
-      // Compute the new tree layout.
-      var nodes = layout.nodes(source).reverse(),
-        links = layout.links(nodes);
-
-      // Normalize for fixed-depth.
-      nodes.forEach(function(d) {
-        // position the child node horizontally
-        const step = (($window.innerWidth - (serviceTopologyConfig.widthMargin * 2)) / maxDepth);
-        d.y = d.depth * step;
-      });
-
-      // Update the nodes…
-      var node = svg.selectAll('g.node')
-        .data(nodes, function(d) { return d.id || (d.id = ++i); });
-
-      // Enter any new nodes at the parent's previous position.
-      var nodeEnter = node.enter().append('g')
-        .attr({
-          class: d => `node ${d.type}`,
-          transform: `translate(${source.y0}, ${source.x0})`
-        });
-
-      const subscriberNodes = nodeEnter.filter('.subscriber');
-      const internetNodes = nodeEnter.filter('.internet');
-      const serviceNodes = nodeEnter.filter('.service');
-      const instanceNodes = nodeEnter.filter('.instance');
-      const sliceNodes = nodeEnter.filter('.slice');
-
-      subscriberNodes.append('rect')
-        .attr(serviceTopologyConfig.square);
-
-      internetNodes.append('rect')
-        .attr(serviceTopologyConfig.square);
-
-      serviceNodes.append('circle')
-        .attr('r', 1e-6)
-        .style('fill', d => d._children ? 'lightsteelblue' : '#fff')
-        .on('click', serviceClick);
-
-      sliceNodes.append('rect')
-        .attr({
-          width: 20,
-          height: 20,
-          x: -10,
-          y: -10
-        });
-
-      instanceNodes.append('rect')
-        .attr({
-          width: 20,
-          height: 20,
-          x: -10,
-          y: -10,
-          class: d => d.active ?'' : 'active'
-        });
-
-      nodeEnter.append('text')
-        .attr({
-          x: d => d.children ? -serviceTopologyConfig.circle.selectedRadius -3 : serviceTopologyConfig.circle.selectedRadius + 3,
-          dy: '.35em',
-          transform: d => {
-            if (d.children && d.parent){
-              if(d.parent.x < d.x){
-                return 'rotate(-30)';
-              }
-              return 'rotate(30)';
-            }
-          },
-          'text-anchor': d => d.children ? 'end' : 'start'
-        })
-        .text(d => d.name)
-        .style('fill-opacity', 1e-6);
-
-      // Transition nodes to their new position.
-      var nodeUpdate = node.transition()
-        .duration(serviceTopologyConfig.duration)
-        .attr({
-          'transform': d => `translate(${d.y},${d.x})`
-        });
-
-      nodeUpdate.select('circle')
-        .attr('r', d => d.selected ? serviceTopologyConfig.circle.selectedRadius : serviceTopologyConfig.circle.radius)
-        .style('fill', d => d.selected ? 'lightsteelblue' : '#fff');
-
-      nodeUpdate.select('text')
-        .style('fill-opacity', 1);
-
-      // Transition exiting nodes to the parent's new position.
-      var nodeExit = node.exit().transition()
-        .duration(serviceTopologyConfig.duration)
-        .remove();
-
-      nodeExit.select('circle')
-        .attr('r', 1e-6);
-
-      nodeExit.select('text')
-        .style('fill-opacity', 1e-6);
-
-      // Update the links…
-      var link = svg.selectAll('path.link')
-        .data(links, function(d) { return d.target.id; });
-
-      // Enter any new links at the parent's previous position.
-      link.enter().insert('path', 'g')
-        .attr('class', d => `link ${d.target.type} ${d.target.active ? '' : 'active'}`)
-        .attr('d', function(d) {
-          var o = {x: source.x0, y: source.y0};
-          return diagonal({source: o, target: o});
-        });
-
-      // Transition links to their new position.
-      link.transition()
-        .duration(serviceTopologyConfig.duration)
-        .attr('d', diagonal);
-
-      // Transition exiting nodes to the parent's new position.
-      link.exit().transition()
-        .duration(serviceTopologyConfig.duration)
-        .attr('d', function(d) {
-          var o = {x: source.x, y: source.y};
-          return diagonal({source: o, target: o});
-        })
-        .remove();
-
-      // Stash the old positions for transition.
-      nodes.forEach(function(d) {
-        d.x0 = d.x;
-        d.y0 = d.y;
-      });
-    };
-
-    const serviceClick = function(d) {
-
-      $log.info('TODO emit an event to highlight VMs');
-
-      if(!d.service){
-        return;
-      }
-
-      // toggling selected status
-      d.selected = !d.selected;
-
-      var selectedNode = d3.select(this);
-
-      selectedNode
-        .transition()
-        .duration(serviceTopologyConfig.duration)
-        .attr('r', serviceTopologyConfig.circle.selectedRadius);
-    };
-
-    this.updateTree = updateTree;
-    this.drawLegend = drawLegend;
-  });
+  .factory('d3', function($window){
+    return $window.d3;
+  })
 
 }());
\ No newline at end of file