Merge branch 'master' of github.com:open-cloud/xos
diff --git a/views/ngXosViews/diagnostic/src/css/diagnostic.css b/views/ngXosViews/diagnostic/src/css/diagnostic.css
index d9d1470..5db9d7f 100644
--- a/views/ngXosViews/diagnostic/src/css/diagnostic.css
+++ b/views/ngXosViews/diagnostic/src/css/diagnostic.css
@@ -105,6 +105,10 @@
     stroke-width: 1px;
 }
 
+logic-topology .compute-node > text{
+    font-size: 16px;
+}
+
 /* INSTANCE */
 
 logic-topology .instance > rect{
@@ -203,6 +207,10 @@
 }
 
 .node text {
+    font: 18px sans-serif;
+}
+
+.node .instance text {
     font: 12px sans-serif;
 }
 
diff --git a/views/ngXosViews/diagnostic/src/js/chart_data_service.js b/views/ngXosViews/diagnostic/src/js/chart_data_service.js
index 5d65b2b..ff2d31b 100644
--- a/views/ngXosViews/diagnostic/src/js/chart_data_service.js
+++ b/views/ngXosViews/diagnostic/src/js/chart_data_service.js
@@ -81,6 +81,10 @@
         serviceTopologyConfig.elWidths.pop();
       }
 
+      //remove tags and ip
+      delete this.logicTopologyData.children[0].children[0].children[0].subscriberTag;
+      delete this.logicTopologyData.children[0].subscriberIP;
+
       this.highlightInstances([]);
       delete this.logicTopologyData.children[0].children[0].children[0].children[0].children;
     }
diff --git a/views/ngXosViews/diagnostic/src/js/logicTopology.js b/views/ngXosViews/diagnostic/src/js/logicTopology.js
index f88b80a..5ab5d0f 100644
--- a/views/ngXosViews/diagnostic/src/js/logicTopology.js
+++ b/views/ngXosViews/diagnostic/src/js/logicTopology.js
@@ -17,6 +17,7 @@
         var svg;
         this.selectedInstances = [];
         this.hideInstanceStats = true;
+        var _this = this;
 
         const handleSvg = (el) => {
 
@@ -61,6 +62,12 @@
           .then((instances) => {
             LogicTopologyHelper.updateTree(svg);
           })
+          .catch(e => {
+            _this.error = 'Service statistics are not available at this time. Please try again later.'
+            $timeout(() => {
+              _this.error = null;
+            }, 2000);
+          })
         });
 
         d3.select(window)
diff --git a/views/ngXosViews/diagnostic/src/js/nodeDrawer.js b/views/ngXosViews/diagnostic/src/js/nodeDrawer.js
index 7649374..514f114 100644
--- a/views/ngXosViews/diagnostic/src/js/nodeDrawer.js
+++ b/views/ngXosViews/diagnostic/src/js/nodeDrawer.js
@@ -14,10 +14,14 @@
     var _this = this;
 
     this.addNetworks = (nodes) => {
+
+      // clean childs
+      nodes.selectAll('*').remove();
+
       nodes.append('path')
       .attr({
         d: shapes.cloud,
-        transform: 'translate(-63, -52), scale(0.5)',
+        transform: 'translate(-100, -72), scale(0.7)',
         class: 'cloud'
       });
 
@@ -45,14 +49,14 @@
           currentNode.append('text')
           .attr({
             'text-anchor': 'middle',
-            y: 40
+            y: 50
           })
           .text(() => `C-Tag: ${n.subscriberTag.cTag}`);
 
           currentNode.append('text')
           .attr({
             'text-anchor': 'middle',
-            y: 60
+            y: 70
           })
           .text(() => `S-Tag: ${n.subscriberTag.sTag}`);
         }
@@ -61,7 +65,7 @@
           currentNode.append('text')
           .attr({
             'text-anchor': 'middle',
-            y: 40
+            y: 50
           })
           .text(() => `Public IP: ${n.subscriberIP}`);
         }
@@ -164,7 +168,7 @@
       nodeContainer.append('text')
       .attr({
         'text-anchor': 'start',
-        y: 15, //FIXME
+        y: 17, //FIXME
         x: 10, //FIXME
         opacity: 0
       })
@@ -370,10 +374,10 @@
 
       statsContainer.append('line')
         .attr({
-          x1: d => lines[d.humanReadableName].x1 || lines['mysite_vsg-1'],
-          y1: d => lines[d.humanReadableName].y1 || lines['mysite_vsg-1'],
-          x2: d => lines[d.humanReadableName].x2 || lines['mysite_vsg-1'],
-          y2: d => lines[d.humanReadableName].y2 || lines['mysite_vsg-1'],
+          x1: d => lines[d.humanReadableName].x1 || lines['mysite_vsg-1'].x1,
+          y1: d => lines[d.humanReadableName].y1 || lines['mysite_vsg-1'].y1,
+          x2: d => lines[d.humanReadableName].x2 || lines['mysite_vsg-1'].x2,
+          y2: d => lines[d.humanReadableName].y2 || lines['mysite_vsg-1'].y2,
           stroke: 'black',
           opacity: 0
         })
diff --git a/views/ngXosViews/diagnostic/src/js/serviceTopologyHelper.js b/views/ngXosViews/diagnostic/src/js/serviceTopologyHelper.js
index 61ec1e2..bb7ba5d 100644
--- a/views/ngXosViews/diagnostic/src/js/serviceTopologyHelper.js
+++ b/views/ngXosViews/diagnostic/src/js/serviceTopologyHelper.js
@@ -71,8 +71,13 @@
 
       nodeEnter.append('text')
         .attr({
-          x: d => d.children ? -serviceTopologyConfig.circle.selectedRadius -3 : serviceTopologyConfig.circle.selectedRadius + 3,
+          x: d => d.children ? -serviceTopologyConfig.circle.selectedRadius -5 : serviceTopologyConfig.circle.selectedRadius + 5,
           dy: '.35em',
+          y: d => {
+            if (d.children && d.parent){
+              return '-5';
+            }
+          },
           transform: d => {
             if (d.children && d.parent){
               if(d.parent.x < d.x){
diff --git a/views/ngXosViews/diagnostic/src/templates/logicTopology.tpl.html b/views/ngXosViews/diagnostic/src/templates/logicTopology.tpl.html
index 8c81015..e942fca 100644
--- a/views/ngXosViews/diagnostic/src/templates/logicTopology.tpl.html
+++ b/views/ngXosViews/diagnostic/src/templates/logicTopology.tpl.html
@@ -1,6 +1,9 @@
 <select-subscriber-modal open="vm.openSelectSubscriberModal" subscribers="vm.subscribers"></select-subscriber-modal>
 <subscriber-status-modal open="vm.openSubscriberStatusModal" subscriber="vm.currentSubscriber"></subscriber-status-modal>
-<div class="instances-stats animate" ng-hide="vm.hideInstanceStats">
+<div class="alert alert-danger animate" ng-hide="!vm.error">
+  {{vm.error}}
+</div>
+<!-- <div class="instances-stats animate" ng-hide="vm.hideInstanceStats">
   <div class="row">
     <div class="col-sm-3 col-sm-offset-8">
       <div class="panel panel-primary" ng-repeat="instance in vm.selectedInstances">
@@ -21,4 +24,4 @@
       </div>  
     </div>
   </div>
-</div>
\ No newline at end of file
+</div> -->
\ No newline at end of file
diff --git a/xos/configurations/cord-pod/cdn/README.md b/xos/configurations/cord-pod/cdn/README.md
index a7730f9..af5b38d 100644
--- a/xos/configurations/cord-pod/cdn/README.md
+++ b/xos/configurations/cord-pod/cdn/README.md
@@ -65,3 +65,4 @@
 ## Restart CDN after power-down
 
 To do...
+test
diff --git a/xos/core/xoslib/static/css/xosDiagnostic.css b/xos/core/xoslib/static/css/xosDiagnostic.css
index b5fb8d6..0c1de20 100644
--- a/xos/core/xoslib/static/css/xosDiagnostic.css
+++ b/xos/core/xoslib/static/css/xosDiagnostic.css
@@ -1 +1 @@
-#xosDiagnostic,[ui-view]{min-height:700px;position:relative}diagnostic-container .form-control.small-padding{padding:6px}diagnostic-container .half-height{position:relative;height:50%}diagnostic-container .onethird-height{position:relative;height:33%;border-bottom:1px solid #999}diagnostic-container .twothird-height{position:relative;height:67%}diagnostic-container .subscriber-select{max-width:200px;position:absolute;top:20px;right:20px;z-index:1}diagnostic-container .onethird-height .well,diagnostic-container .twothird-height .well{font-weight:700;max-width:165px;text-align:center;margin-top:15px;background:#eee;border-color:steelblue;padding:10px}diagnostic-container .onethird-height .well.pull-right{position:absolute;right:0;top:-15px;cursor:pointer;z-index:200}subscriber-status-modal .row+.row{margin-top:20px}.half-height+.half-height{border-top:1px solid black}service-topology,logic-topology{height:100%;width:100%;display:block;position:absolute;top:0}logic-topology .subscriber circle,logic-topology .device circle{fill:#fff;stroke:green;stroke-width:1px}logic-topology>svg{position:absolute;top:0}logic-topology .network .cloud{fill:#fff;stroke:green;stroke-width:1px}logic-topology .node.rack>g>rect{fill:#ccc;stroke:steelblue;stroke-width:1px}logic-topology .compute-node>rect{fill:#fff;stroke:steelblue;stroke-width:1px}logic-topology .instance>rect{fill:#eee;stroke:steelblue;stroke-width:1px}logic-topology .node .instance.active rect{fill:lightsteelblue;stroke:steelblue;stroke-width:1px}logic-topology .node .instance.active.good>rect{fill:green}logic-topology .node .instance.active.provisioning>rect{fill:yellow}logic-topology .node .instance.active.bad>rect{fill:red}logic-topology .node .instance .stats-container rect{fill:white}logic-topology .node .instance .stats-container text.name{font-weight:700}logic-topology .node .instance .stats-container text.ip{font-style:italic;font-size:10px}logic-topology .node .instance .stats-container .container rect{fill:#eee;stroke:steelblue;stroke-width:1px}.legend{fill:#fff;stroke:#ccc;stroke-width:1px;position:relative}.legend text{stroke:#000}.node{cursor:pointer}.node circle,.node rect{fill:#fff;stroke:steelblue;stroke-width:1px}.node.subscriber circle,.node.subscriber rect,.node.router circle,.node.router rect{stroke:#05ffcb}.node.slice rect{stroke:#b01dff}.node.instance rect{stroke:#ccc}.node.instance rect.active{stroke:#ff8b00}.node rect.slice-detail{fill:#fff;stroke:steelblue;stroke-width:3px}.node text{font:12px sans-serif}.node text.small{font-size:10px}.link,.device-link{fill:none;stroke:#ccc;stroke-width:2px}.link.slice{stroke:rgba(157,4,183,.29)}.link.instance{stroke:#ccc}.link.instance.active{stroke:rgba(255,138,0,.65)}.service-details{width:200px;position:absolute;top:20px;right:20px}.animate.ng-hide-remove{animation:.5s bounceInRight ease}.animate.ng-hide-add{animation:.5s bounceOutRight ease}.loader{font-size:10px;margin:150px auto;text-indent:-9999em;width:11em;height:11em;border-radius:50%;background:#fff;background:linear-gradient(to right,#fff 10%,rgba(255,255,255,0) 42%);position:relative;animation:load3 1.4s infinite linear;transform:translateZ(0)}.loader:before{width:50%;height:50%;background:#105e9e;border-radius:100% 0 0;position:absolute;top:0;left:0;content:''}.loader:after{background:#fff;width:75%;height:75%;border-radius:50%;content:'';margin:auto;position:absolute;top:0;left:0;bottom:0;right:0}@keyframes load3{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.modal.fade.in{display:block}@keyframes bounceInRight{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1.000)}from{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}@keyframes bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}to{opacity:0;transform:translate3d(2000px,0,0)}}
\ No newline at end of file
+#xosDiagnostic,[ui-view]{min-height:700px;position:relative}diagnostic-container .form-control.small-padding{padding:6px}diagnostic-container .half-height{position:relative;height:50%}diagnostic-container .onethird-height{position:relative;height:33%;border-bottom:1px solid #999}diagnostic-container .twothird-height{position:relative;height:67%}diagnostic-container .subscriber-select{max-width:200px;position:absolute;top:20px;right:20px;z-index:1}diagnostic-container .onethird-height .well,diagnostic-container .twothird-height .well{font-weight:700;max-width:165px;text-align:center;margin-top:15px;background:#eee;border-color:steelblue;padding:10px}diagnostic-container .onethird-height .well.pull-right{position:absolute;right:0;top:-15px;cursor:pointer;z-index:200}subscriber-status-modal .row+.row{margin-top:20px}.half-height+.half-height{border-top:1px solid black}service-topology,logic-topology{height:100%;width:100%;display:block;position:absolute;top:0}logic-topology .subscriber circle,logic-topology .device circle{fill:#fff;stroke:green;stroke-width:1px}logic-topology>svg{position:absolute;top:0}logic-topology .network .cloud{fill:#fff;stroke:green;stroke-width:1px}logic-topology .node.rack>g>rect{fill:#ccc;stroke:steelblue;stroke-width:1px}logic-topology .compute-node>rect{fill:#fff;stroke:steelblue;stroke-width:1px}logic-topology .compute-node>text{font-size:16px}logic-topology .instance>rect{fill:#eee;stroke:steelblue;stroke-width:1px}logic-topology .node .instance.active rect{fill:lightsteelblue;stroke:steelblue;stroke-width:1px}logic-topology .node .instance.active.good>rect{fill:green}logic-topology .node .instance.active.provisioning>rect{fill:yellow}logic-topology .node .instance.active.bad>rect{fill:red}logic-topology .node .instance .stats-container rect{fill:white}logic-topology .node .instance .stats-container text.name{font-weight:700}logic-topology .node .instance .stats-container text.ip{font-style:italic;font-size:10px}logic-topology .node .instance .stats-container .container rect{fill:#eee;stroke:steelblue;stroke-width:1px}.legend{fill:#fff;stroke:#ccc;stroke-width:1px;position:relative}.legend text{stroke:#000}.node{cursor:pointer}.node circle,.node rect{fill:#fff;stroke:steelblue;stroke-width:1px}.node.subscriber circle,.node.subscriber rect,.node.router circle,.node.router rect{stroke:#05ffcb}.node.slice rect{stroke:#b01dff}.node.instance rect{stroke:#ccc}.node.instance rect.active{stroke:#ff8b00}.node rect.slice-detail{fill:#fff;stroke:steelblue;stroke-width:3px}.node text{font:18px sans-serif}.node .instance text{font:12px sans-serif}.node text.small{font-size:10px}.link,.device-link{fill:none;stroke:#ccc;stroke-width:2px}.link.slice{stroke:rgba(157,4,183,.29)}.link.instance{stroke:#ccc}.link.instance.active{stroke:rgba(255,138,0,.65)}.service-details{width:200px;position:absolute;top:20px;right:20px}.animate.ng-hide-remove{animation:.5s bounceInRight ease}.animate.ng-hide-add{animation:.5s bounceOutRight ease}.loader{font-size:10px;margin:150px auto;text-indent:-9999em;width:11em;height:11em;border-radius:50%;background:#fff;background:linear-gradient(to right,#fff 10%,rgba(255,255,255,0) 42%);position:relative;animation:load3 1.4s infinite linear;transform:translateZ(0)}.loader:before{width:50%;height:50%;background:#105e9e;border-radius:100% 0 0;position:absolute;top:0;left:0;content:''}.loader:after{background:#fff;width:75%;height:75%;border-radius:50%;content:'';margin:auto;position:absolute;top:0;left:0;bottom:0;right:0}@keyframes load3{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.modal.fade.in{display:block}@keyframes bounceInRight{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1.000)}from{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}@keyframes bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}to{opacity:0;transform:translate3d(2000px,0,0)}}
\ No newline at end of file
diff --git a/xos/core/xoslib/static/js/xosDiagnostic.js b/xos/core/xoslib/static/js/xosDiagnostic.js
index 2c46d49..4e4def0 100644
--- a/xos/core/xoslib/static/js/xosDiagnostic.js
+++ b/xos/core/xoslib/static/js/xosDiagnostic.js
@@ -16,7 +16,7 @@
   }]);
 })();
 angular.module("xos.diagnostic").run(["$templateCache", function($templateCache) {$templateCache.put("templates/diagnostic.tpl.html","<div class=\"container-fluid\">\n  <div ng-hide=\"vm.error && vm.loader\" style=\"height: 900px\">\n    <div class=\"onethird-height\">\n      <div class=\"well\">\n        Services Graph\n      </div>\n      <div class=\"well pull-right\" ng-click=\"vm.reloadGlobalScope()\" ng-show=\"vm.selectedSubscriber\">\n        Reset subscriber\n      </div>\n      <service-topology service-chain=\"vm.serviceChain\"></service-topology>\n    </div>\n    <div class=\"twothird-height\">\n      <div class=\"well\">\n        Logical Resources\n      </div>\n      <logic-topology ng-if=\"vm.subscribers\" subscribers=\"vm.subscribers\" selected=\"vm.selectedSubscriber\"></logic-topology>\n    </div>\n  </div>\n  <div class=\"row\" ng-if=\"vm.error\">\n    <div class=\"col-xs-12\">\n      <div class=\"alert alert-danger\">\n        {{vm.error}}\n      </div>\n    </div>\n  </div>\n  <div class=\"row\" ng-if=\"vm.loader\">\n    <div class=\"col-xs-12\">\n      <div class=\"loader\">Loading</div>\n    </div>\n  </div>\n</div>");
-$templateCache.put("templates/logicTopology.tpl.html","<select-subscriber-modal open=\"vm.openSelectSubscriberModal\" subscribers=\"vm.subscribers\"></select-subscriber-modal>\n<subscriber-status-modal open=\"vm.openSubscriberStatusModal\" subscriber=\"vm.currentSubscriber\"></subscriber-status-modal>\n<div class=\"instances-stats animate\" ng-hide=\"vm.hideInstanceStats\">\n  <div class=\"row\">\n    <div class=\"col-sm-3 col-sm-offset-8\">\n      <div class=\"panel panel-primary\" ng-repeat=\"instance in vm.selectedInstances\">\n        <div class=\"panel-heading\">\n          {{instance.humanReadableName}}\n        </div>\n          <ul class=\"list-group\">\n            <li class=\"list-group-item\">Backend Status: {{instance.backend_status}}</li>\n            <li class=\"list-group-item\">IP Address: {{instance.ip}}</li>\n          </ul>\n          <ul class=\"list-group\">\n            <li class=\"list-group-item\" ng-repeat=\"stat in instance.stats\">\n              <span class=\"badge\">{{stat.value}}</span>\n              {{stat.meter}}\n            </li>\n          </ul>\n        </div>\n      </div>  \n    </div>\n  </div>\n</div>");
+$templateCache.put("templates/logicTopology.tpl.html","<select-subscriber-modal open=\"vm.openSelectSubscriberModal\" subscribers=\"vm.subscribers\"></select-subscriber-modal>\n<subscriber-status-modal open=\"vm.openSubscriberStatusModal\" subscriber=\"vm.currentSubscriber\"></subscriber-status-modal>\n<div class=\"alert alert-danger animate\" ng-hide=\"!vm.error\">\n  {{vm.error}}\n</div>\n<!-- <div class=\"instances-stats animate\" ng-hide=\"vm.hideInstanceStats\">\n  <div class=\"row\">\n    <div class=\"col-sm-3 col-sm-offset-8\">\n      <div class=\"panel panel-primary\" ng-repeat=\"instance in vm.selectedInstances\">\n        <div class=\"panel-heading\">\n          {{instance.humanReadableName}}\n        </div>\n          <ul class=\"list-group\">\n            <li class=\"list-group-item\">Backend Status: {{instance.backend_status}}</li>\n            <li class=\"list-group-item\">IP Address: {{instance.ip}}</li>\n          </ul>\n          <ul class=\"list-group\">\n            <li class=\"list-group-item\" ng-repeat=\"stat in instance.stats\">\n              <span class=\"badge\">{{stat.value}}</span>\n              {{stat.meter}}\n            </li>\n          </ul>\n        </div>\n      </div>  \n    </div>\n  </div>\n</div> -->");
 $templateCache.put("templates/select-subscriber-modal.tpl.html","<div class=\"modal fade\" ng-class=\"{in: vm.open}\" tabindex=\"-1\" role=\"dialog\">\n  <div class=\"modal-dialog modal-sm\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <button ng-click=\"vm.close()\"  type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n        <h4 class=\"modal-title\">Select a subscriber:</h4>\n      </div>\n      <div class=\"modal-body\">\n        <select class=\"form-control\" ng-options=\"s as s.humanReadableName for s in vm.subscribers\" ng-model=\"vm.selected\"></select>\n      </div>\n      <div class=\"modal-footer\">\n        <button ng-click=\"vm.close()\" type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\n        <button ng-click=\"vm.select(vm.selected)\" type=\"button\" class=\"btn btn-primary\">Select</button>\n      </div>\n    </div><!-- /.modal-content -->\n  </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->");
 $templateCache.put("templates/subscriber-status-modal.tpl.html","<div class=\"modal fade\" ng-class=\"{in: vm.open}\" tabindex=\"-1\" role=\"dialog\">\n  <div class=\"modal-dialog modal-sm\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <button ng-click=\"vm.close()\"  type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n        <h4 class=\"modal-title\">Manage subscriber:</h4>\n      </div>\n      <form name=\"vm.subscriber-detail\">\n        <div class=\"modal-body\">\n          <div class=\"row\">\n            <div class=\"col-xs-12\">\n              <label>Status</label>\n            </div>\n            <div class=\"col-xs-6\">\n              <a ng-click=\"vm.subscriber.status = \'enabled\'\"\n                class=\"btn btn-block\"\n                ng-class=\"{\'btn-primary\': vm.subscriber.status === \'enabled\' ,\'btn-default\': vm.subscriber.status !== \'enabled\'}\"\n                >Enabled</a>\n            </div>\n            <div class=\"col-xs-6\">\n              <a ng-click=\"vm.subscriber.status = \'suspended\'\"\n                class=\"btn btn-block\"\n                ng-class=\"{\'btn-primary\': vm.subscriber.status === \'suspended\' ,\'btn-default\': vm.subscriber.status !== \'suspended\'}\"\n                >Suspended</a>\n            </div>\n          </div>\n          <div class=\"row\">\n            <div class=\"col-xs-6\">\n              <a ng-click=\"vm.subscriber.status = \'delinquent\'\"\n                class=\"btn btn-block\"\n                ng-class=\"{\'btn-primary\': vm.subscriber.status === \'delinquent\' ,\'btn-default\': vm.subscriber.status !== \'delinquent\'}\"\n                >Delinquent <br> payment</a>\n            </div>\n            <div class=\"col-xs-6\">\n              <a ng-click=\"vm.subscriber.status = \'copyrightviolation\'\"\n                class=\"btn btn-block\"\n                ng-class=\"{\'btn-primary\': vm.subscriber.status === \'copyrightviolation\' ,\'btn-default\': vm.subscriber.status !== \'copyrightviolation\'}\"\n                >Copyright <br> violation</a>\n            </div>\n          </div>\n          <div class=\"row\">\n            <div class=\"col-xs-6\">\n              <label>Uplink Speed</label>\n              <div class=\"input-group\">\n                <input type=\"number\" class=\"form-control small-padding\" ng-model=\"vm.subscriber.uplink_speed\"/>\n                <span class=\"input-group-addon\">Mbps</span>\n              </div>\n            </div>\n            <div class=\"col-xs-6\">\n              <label>Downlink Speed</label>\n              <div class=\"input-group\">\n                <input type=\"number\" class=\"form-control small-padding\" ng-model=\"vm.subscriber.downlink_speed\"/>\n                <span class=\"input-group-addon\">Mbps</span>\n              </div>\n            </div>\n          </div>\n          <div class=\"row\">\n            <div class=\"col-xs-6\">\n              <label>Enable Internet</label>\n            </div>\n            <div class=\"col-xs-6\">\n              <a \n                ng-click=\"vm.subscriber.enable_uverse = !vm.subscriber.enable_uverse\" \n                ng-class=\"{\'btn-success\': vm.subscriber.enable_uverse, \'btn-danger\': !vm.subscriber.enable_uverse}\"\n                class=\"btn btn-block\">\n                <span ng-show=\"vm.subscriber.enable_uverse === true\">Enabled</span>\n                <span ng-show=\"vm.subscriber.enable_uverse !== true\">Disabled</span>\n              </a>\n            </div>\n          </div>\n        </div>\n        <div class=\"modal-footer\" ng-show=\"vm.success || vm.formError\">\n          <div class=\"alert alert-success\" ng-show=\"vm.success\">\n            {{vm.success}}\n          </div>\n          <div class=\"alert alert-danger\" ng-show=\"vm.formError\">\n            {{vm.formError}}\n          </div>\n        </div>\n        <div class=\"modal-footer\">\n          <button ng-click=\"vm.close()\" type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\n          <button ng-click=\"vm.updateSubscriber(vm.subscriber)\" type=\"button\" class=\"btn btn-primary\">Save</button>\n        </div>\n      </form>\n    </div><!-- /.modal-content -->\n  </div><!-- /.modal-dialog -->\n</div><!-- /.modal -->");}]);
 'use strict';
@@ -184,9 +184,14 @@
 
       nodeEnter.append('text').attr({
         x: function x(d) {
-          return d.children ? -serviceTopologyConfig.circle.selectedRadius - 3 : serviceTopologyConfig.circle.selectedRadius + 3;
+          return d.children ? -serviceTopologyConfig.circle.selectedRadius - 5 : serviceTopologyConfig.circle.selectedRadius + 5;
         },
         dy: '.35em',
+        y: function y(d) {
+          if (d.children && d.parent) {
+            return '-5';
+          }
+        },
         transform: function transform(d) {
           if (d.children && d.parent) {
             if (d.parent.x < d.x) {
@@ -890,9 +895,13 @@
     var _this = this;
 
     this.addNetworks = function (nodes) {
+
+      // clean childs
+      nodes.selectAll('*').remove();
+
       nodes.append('path').attr({
         d: shapes.cloud,
-        transform: 'translate(-63, -52), scale(0.5)',
+        transform: 'translate(-100, -72), scale(0.7)',
         'class': 'cloud'
       });
 
@@ -919,14 +928,14 @@
         if (n.name === 'LAN-Side' && angular.isDefined(n.subscriberTag)) {
           currentNode.append('text').attr({
             'text-anchor': 'middle',
-            y: 40
+            y: 50
           }).text(function () {
             return 'C-Tag: ' + n.subscriberTag.cTag;
           });
 
           currentNode.append('text').attr({
             'text-anchor': 'middle',
-            y: 60
+            y: 70
           }).text(function () {
             return 'S-Tag: ' + n.subscriberTag.sTag;
           });
@@ -935,7 +944,7 @@
         if (n.name === 'WAN-Side' && angular.isDefined(n.subscriberIP)) {
           currentNode.append('text').attr({
             'text-anchor': 'middle',
-            y: 40
+            y: 50
           }).text(function () {
             return 'Public IP: ' + n.subscriberIP;
           });
@@ -1030,7 +1039,7 @@
 
       nodeContainer.append('text').attr({
         'text-anchor': 'start',
-        y: 15, //FIXME
+        y: 17, //FIXME
         x: 10, //FIXME
         opacity: 0
       }).text(function (d) {
@@ -1204,16 +1213,16 @@
 
       statsContainer.append('line').attr({
         x1: function x1(d) {
-          return lines[d.humanReadableName].x1 || lines['mysite_vsg-1'];
+          return lines[d.humanReadableName].x1 || lines['mysite_vsg-1'].x1;
         },
         y1: function y1(d) {
-          return lines[d.humanReadableName].y1 || lines['mysite_vsg-1'];
+          return lines[d.humanReadableName].y1 || lines['mysite_vsg-1'].y1;
         },
         x2: function x2(d) {
-          return lines[d.humanReadableName].x2 || lines['mysite_vsg-1'];
+          return lines[d.humanReadableName].x2 || lines['mysite_vsg-1'].x2;
         },
         y2: function y2(d) {
-          return lines[d.humanReadableName].y2 || lines['mysite_vsg-1'];
+          return lines[d.humanReadableName].y2 || lines['mysite_vsg-1'].y2;
         },
         stroke: 'black',
         opacity: 0
@@ -1575,13 +1584,14 @@
       controllerAs: 'vm',
       templateUrl: 'templates/logicTopology.tpl.html',
       controller: ["$element", "$log", "$scope", "$rootScope", "$timeout", "d3", "LogicTopologyHelper", "Node", "Tenant", "Ceilometer", "serviceTopologyConfig", "ChartData", function controller($element, $log, $scope, $rootScope, $timeout, d3, LogicTopologyHelper, Node, Tenant, Ceilometer, serviceTopologyConfig, ChartData) {
-        var _this = this;
+        var _this2 = this;
 
         $log.info('Logic Plane');
 
         var svg;
         this.selectedInstances = [];
         this.hideInstanceStats = true;
+        var _this = this;
 
         var handleSvg = function handleSvg(el) {
 
@@ -1598,7 +1608,7 @@
         loadGlobalScope();
 
         $scope.$watch(function () {
-          return _this.selected;
+          return _this2.selected;
         }, function (selected) {
           if (selected) {
             ChartData.selectSubscriber(selected);
@@ -1610,9 +1620,9 @@
         });
 
         $rootScope.$on('instance.detail.hide', function () {
-          _this.hideInstanceStats = true;
+          _this2.hideInstanceStats = true;
           $timeout(function () {
-            _this.selectedInstances = [];
+            _this2.selectedInstances = [];
             ChartData.highlightInstances([]);
             LogicTopologyHelper.updateTree(svg);
           }, 500);
@@ -1621,6 +1631,11 @@
         $rootScope.$on('instance.detail', function (evt, service) {
           ChartData.getInstanceStatus(service).then(function (instances) {
             LogicTopologyHelper.updateTree(svg);
+          })['catch'](function (e) {
+            _this.error = 'Service statistics are not available at this time. Please try again later.';
+            $timeout(function () {
+              _this.error = null;
+            }, 2000);
           });
         });
 
@@ -1634,12 +1649,12 @@
         LogicTopologyHelper.setupTree(svg);
 
         this.selectSubscriberModal = function () {
-          _this.openSelectSubscriberModal = true;
+          _this2.openSelectSubscriberModal = true;
           $scope.$apply();
         };
 
         this.subscriberStatusModal = function () {
-          _this.openSubscriberStatusModal = true;
+          _this2.openSubscriberStatusModal = true;
           $scope.$apply();
         };
 
@@ -1647,9 +1662,9 @@
         $rootScope.$on('subscriber.modal.open', function () {
 
           if (ChartData.currentSubscriber) {
-            _this.subscriberStatusModal();
+            _this2.subscriberStatusModal();
           } else {
-            _this.selectSubscriberModal();
+            _this2.selectSubscriberModal();
           }
         });
 
@@ -1657,10 +1672,10 @@
         $rootScope.$on('subscriber.modal.open', function () {
 
           if (ChartData.currentSubscriber) {
-            _this.currentSubscriber = ChartData.currentSubscriber;
-            _this.subscriberStatusModal();
+            _this2.currentSubscriber = ChartData.currentSubscriber;
+            _this2.subscriberStatusModal();
           } else {
-            _this.selectSubscriberModal();
+            _this2.selectSubscriberModal();
           }
         });
       }]
@@ -1862,6 +1877,10 @@
         serviceTopologyConfig.elWidths.pop();
       }
 
+      //remove tags and ip
+      delete _this.logicTopologyData.children[0].children[0].children[0].subscriberTag;
+      delete _this.logicTopologyData.children[0].subscriberIP;
+
       _this.highlightInstances([]);
       delete _this.logicTopologyData.children[0].children[0].children[0].children[0].children;
     };
diff --git a/xos/synchronizers/vcpe/files/etc/service/message/run b/xos/synchronizers/vcpe/files/etc/service/message/run
index 2f3b563..7b587d8 100755
--- a/xos/synchronizers/vcpe/files/etc/service/message/run
+++ b/xos/synchronizers/vcpe/files/etc/service/message/run
@@ -5,16 +5,14 @@
 
 class HTTPHandlerOne(BaseHTTPServer.BaseHTTPRequestHandler):
     def do_GET(self):
-        # with open('./message.html', 'r') as msgfile:
-        with open('../../../../templates/message.html.j2', 'r') as msgfile:
+        with open('./message.html', 'r') as msgfile:
             message = msgfile.read()
         self.wfile.write(message)
 
 
 def run(server_class=BaseHTTPServer.HTTPServer,
         handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
-    # server_address = ('192.168.0.1', 8000)
-    server_address = ('127.0.0.1', 8000)
+    server_address = ('192.168.0.1', 8000)
     httpd = server_class(server_address, handler_class)
     httpd.serve_forever()
 
diff --git a/xos/synchronizers/vcpe/templates/message.html.j2 b/xos/synchronizers/vcpe/templates/message.html.j2
index d56632c..eb4497a 100644
--- a/xos/synchronizers/vcpe/templates/message.html.j2
+++ b/xos/synchronizers/vcpe/templates/message.html.j2
@@ -5,6 +5,10 @@
   <title>Service Suspended</title>
   <style>
     
+    .row {
+      width: 100%;
+    }
+
     .col-sm-offset-2 {
       margin-left: 16.66666667%;
     }