diff --git a/planetstack/templates/admin/base.html b/planetstack/templates/admin/base.html
index 6842040..25d9743 100644
--- a/planetstack/templates/admin/base.html
+++ b/planetstack/templates/admin/base.html
@@ -1,4 +1,4 @@
-{% load admin_static %}{% load suit_tags %}{% load url from future %}<!DOCTYPE html>
+﻿{% load admin_static %}{% load suit_tags %}{% load url from future %}<!DOCTYPE html>
 <html lang="{{ LANGUAGE_CODE|default:"en-us" }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
 <head>
   <title>{% block title %}  {%if title %} {{ title }} | {% endif %} {{ 'ADMIN_NAME'|suit_conf }}{% endblock %}</title>
@@ -9,7 +9,7 @@
   {% block extrastyle %}{% endblock %}
   {% if LANGUAGE_BIDI %}<link rel="stylesheet" type="text/css" href="{% block stylesheet_rtl %}{% static "admin/css/rtl.css" %}{% endblock %}"/>{% endif %}
   <script type="text/javascript">window.__admin_media_prefix__ = "{% filter escapejs %}{% static "admin/" %}{% endfilter %}";</script>
-  <script src="{% static 'suit/js/jquery-1.8.3.min.js' %}"></script>
+  <script src="{% static 'suit/js/jquery-1.9.1.min.js' %}"></script>
   <script type="text/javascript">var Suit = { $: $.noConflict() }; if (!$) $ = Suit.$; </script>
   {% if 'SHOW_REQUIRED_ASTERISK'|suit_conf %}
   <style type="text/css">.required:after { content: '*'; margin: 0 0 0 5px; position: absolute; color: #ccc;}</style>
@@ -87,9 +87,7 @@
             {% if user.is_active and user.is_staff %}
               <div id="user-tools">
                 {% trans 'Welcome,' %}
-                <strong>
-                  {% filter force_escape %}
-                    {% firstof user.first_name user.username %}{% endfilter %}</strong>.
+                <a href="http://{{ request.get_host}}/admin/core/user/{{user.id}}">{{user.email}}</a>
                 <span class="user-links">
                 {% block userlinks %}
                   {% url 'django-admindocs-docroot' as docsroot %}
@@ -120,6 +118,25 @@
           <div id="suit-center" class="suit-column">
 
             {% if not is_popup %}
+            <div id=openCloudTopPage>
+            <span id="minDashboard">
+                <div class="hide">{{ app_label|capfirst|escape }}</div>
+                <div class="hide selectedMainNav">{{ opts.verbose_name_plural|capfirst }}</div>
+                <div class="hide currentOriginalNode">{{ original|truncatewords:"18" }}</div>
+
+
+               <label class="nodetextbox nodesLabel" style="display: none;" > </label>
+              <label class="nodelabel nodesValue" style="display: none;" ></label>
+                <span class="nodesCnt hide"></span>
+              <label class="nodetextbox cpuLabel" style="display: none;" ></label>
+              <label class="nodelabel cpuValue" style="display: none;" ></label>
+                <span class="cpuCnt hide"></span>
+            <label class="nodetextbox bandwidthLabel" style="display: none;" ></label>
+              <label class="nodelabel bandwidthValue" style="width:60px;display: none;"></label>
+                <span class="bandUsage hide"></span>
+            </span>
+            </div>
+
               {% block breadcrumbs %}
                 <ul class="breadcrumb"> 
                   <li><a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
@@ -132,20 +149,6 @@
                     </li>
                 </ul>
               {% endblock %}
-		<div class="hide">{{ app_label|capfirst|escape }}</div>
-		<div class="hide selectedMainNav">{{ opts.verbose_name_plural|capfirst }}</div>
-		<div class="hide currentOriginalNode">{{ original|truncatewords:"18" }}</div>  
-                  
-
-               <label class="nodetextbox nodesLabel" style="display: none;" > </label>
-              <label class="nodelabel nodesValue" style="display: none;" ></label>
-		<span class="nodesCnt hide"></span>
-              <label class="nodetextbox cpuLabel" style="display: none;" ></label>
-              <label class="nodelabel cpuValue" style="display: none;" ></label>
-		<span class="cpuCnt hide"></span>
-            <label class="nodetextbox bandwidthLabel" style="display: none;" ></label>    
-              <label class="nodelabel bandwidthValue" style="width:60px;display: none;"></label>
-		<span class="bandUsage hide"></span>
             {% endif %}
 
             {% block messages %}
@@ -237,10 +240,13 @@
 
   <script src="{% static 'suit/bootstrap/js/bootstrap.min.js' %}"></script>
   <script src="{% static 'suit/js/suit.js' %}"></script>
-  <script src="{% static 'main.js' %}"></script>
+  <script src="{% static 'page_analytics.js' %}"></script>
+  <script type="text/javascript" src="//www.google.com/jsapi"></script>
+  <script src="{% static 'planetstack_graphs.js' %}"></script>
+  <!-- src="{% static 'planetstack_graphs_old.js' %}" -->
+
   {% block extrajs %}{% endblock %}
 <script src="http://d3js.org/d3.v3.js"></script>
-
 	<div class="modal fade hide" id="chartsModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
 	  <div class="modal-dialog">
 	    <div class="modal-content">
@@ -269,6 +275,7 @@
 				</div>
 			</div>
 		</div>
+                <div id="graph_work" style="display:none"></div>
 	      </div>
 	      <!--<div class="modal-footer">
 		<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
diff --git a/planetstack/templates/admin/dashboard/hpc_historical.html b/planetstack/templates/admin/dashboard/hpc_historical.html
new file mode 100644
index 0000000..7446ae5
--- /dev/null
+++ b/planetstack/templates/admin/dashboard/hpc_historical.html
@@ -0,0 +1,329 @@
+
+    <script type="text/javascript" src="//www.google.com/jsapi"></script>
+    <link rel="stylesheet" href="/static/hpc_historical.css">
+    <script type="text/javascript">
+		google.load('visualization', '1', {'packages' : ['controls','table','corechart','geochart']});
+    </script>
+	
+    <script type="text/javascript">
+var queryString = encodeURIComponent("SELECT MINUTE(time) as Time, city, s8 as Node, REGEXP_REPLACE(s8,r'node[0-9]+\.(.*)\.vicci\.org',r'\\1') as Site, AVG(i0) as Cpu, AVG(i1) as Requests FROM [vicci.demoevents] WHERE i0 is not null AND s8 contains 'vicci.org' and not city IN ('princeton','Unknown') and city is not null GROUP BY Time,city,Site,Node ORDER BY Time;");
+			var serverPart = "http://cloud-scrutiny.appspot.com/command?action=send_query&force=ColumnChart&q="
+			var dataSourceUrl = serverPart + queryString;
+			var query;
+
+			var options = {
+	   width: 600,
+	   height: 400,
+	   showRowNumber: false,
+	   pages:true,
+       numRows:9,
+	   backgroundColor: "black"
+			};
+
+google.setOnLoadCallback(function() { sendAndDraw(dataSourceUrl); });
+
+function showNodeAgg(dt) {
+		var tab = new google.visualization.ChartWrapper({
+          'chartType': 'Table',
+          'containerId': 'chart3',
+          'options': {
+            'width': 300,
+            'height': 300,
+            'title': 'Network-wide usage',
+			'page': 'enable',
+			'pageSize': 10
+          },
+          'view': {'columns': [0, 1, 2]}
+        });
+
+        tab.setDataTable(dt);
+        tab.draw();
+}
+
+function showSiteTimeAgg(dt) {
+		var lineChart = new google.visualization.ChartWrapper({
+          'chartType': 'LineChart',
+          'containerId': 'chart4',
+          'options': {
+            'width': 300,
+            'height': 300,
+            'title': 'Network-wide usage',
+			'pages': true,
+			'numRows': 9
+          },
+          'view': {'columns': [0, 1, 2]}
+        });
+        lineChart.setDataTable(dt);
+        lineChart.draw();
+		/*
+		var scatterChart = new google.visualization.ChartWrapper({
+          'chartType': 'ScatterChart',
+          'containerId': 'chart5',
+          'options': {
+            'width': 300,
+            'height': 300,
+          },
+          // from the 'data' DataTable.
+          'view': {'columns': [1, 2]}
+        });
+		scatterChart.setDataTable(dt);
+		scatterChart.draw();*/
+}
+function showSiteAgg(dt) {
+		var barChart = new google.visualization.ChartWrapper({
+          'chartType': 'ColumnChart',
+          'containerId': 'chart1',
+          'options': {
+            'width': 300,
+            'height': 300,
+            'title': 'Site-wise usage',
+			'pages': true,
+			'numRows': 9
+          },
+          // Instruct the piechart to use colums 0 (Name) and 3 (Donuts Eaten)
+          // from the 'data' DataTable.
+          'view': {'columns': [1, 2, 3]}
+        });
+        barChart.setDataTable(dt);
+        barChart.draw();
+		var geoChart = new google.visualization.ChartWrapper({
+          'chartType': 'GeoChart',
+          'containerId': 'chart2',
+          'options': {
+            'width': 300,
+            'height': 300,
+			'displayMode': 'markers',
+			'region':'021',
+            'title': 'Usage map',
+        	colorAxis: {colors: ['green', 'purple', 'red']}
+          },
+          // Instruct the piechart to use colums 0 (Name) and 3 (Donuts Eaten)
+          // from the 'data' DataTable.
+          'view': {'columns': [0, 2,3]}
+        });
+		geoChart.setDataTable(dt);
+		geoChart.draw();
+	
+		var histogram = new google.visualization.ChartWrapper({
+          'chartType': 'Histogram',
+          'containerId': 'chart6',
+          'options': {
+            'width': 300,
+            'height': 300,
+          },
+		  'title': 'Sites by load',
+          // Instruct the piechart to use colums 0 (Name) and 3 (Donuts Eaten)
+          // from the 'data' DataTable.
+          'view': {'columns': [1, 2]}
+        });
+		histogram.setDataTable(dt);
+		histogram.draw();
+		
+}
+
+function handleResponse(response) {
+var supportedClasses = {
+		'Table':google.visualization.Table,
+		'LineChart':google.visualization.LineChart,
+		'ScatterChart':google.visualization.ScatterChart,
+		'ColumnChart':google.visualization.ColumnChart,
+		'GeoChart':google.visualization.GeoChart,
+		'PieChart':google.visualization.PieChart,
+		'Histogram':google.visualization.Histogram
+	};
+
+	/*var slider2 = new google.visualization.ControlWrapper({
+    'controlType': 'NumberRangeFilter',
+    'containerId': 'control3',
+    'options': {
+      'filterColumnLabel': 'Cpu',
+      minValue: 0,
+      maxValue: 100,
+	  ui: { ticks: 10}
+    }
+  });*/
+
+  var timeSlider = new google.visualization.ControlWrapper({
+    'controlType': 'NumberRangeFilter',
+    'containerId': 'control1',
+    'options': {
+      'filterColumnLabel': 'Time',
+	  ui: { ticks: 10}
+    }
+  });
+
+  // Define a bar chart
+  var barChart = new google.visualization.ChartWrapper({
+    'chartType': 'BarChart',
+    'containerId': 'chart1',
+    'options': {
+      'width': 400,
+      'height': 300,
+      'hAxis': {'minValue': 0, 'maxValue': 60},
+      'chartArea': {top: 0, right: 0, bottom: 0}
+    }
+  });
+
+	var categoryPicker = new google.visualization.ControlWrapper({
+          'controlType': 'CategoryFilter',
+          'allowMultiple': true,
+          'containerId': 'control2',
+          'options': {
+            'filterColumnLabel': 'Site',
+            'ui': {
+            'labelStacking': 'vertical',
+              'allowTyping': false
+            }
+          }
+        });
+	//var container = document.getElementById('datatable');
+	//var table = new google.visualization.LineChart(container);
+	//var table = new google.visualization.ColumnChart(container);
+
+	var proxy = new google.visualization.ChartWrapper({
+          'chartType': 'Table',
+          'containerId': 'chart7',
+          'options': {
+            'width': 800,
+            'height': 300,
+			pageSize:5,
+			page:'enable',
+            'legend': 'none',
+            'title': 'Nodes'
+          },
+          // Instruct the piechart to use colums 0 (Name) and 3 (Donuts Eaten)
+          // from the 'data' DataTable.
+          'view': {'columns': [0,1,2,3,4,5]}
+        });
+
+	function core_sum(arr) {
+		var ret = 0;
+		for (var i = 0; i < arr.length; i++) {
+			ret+=arr[i]/1000;
+		}
+		return ret;
+	}
+
+	function scaled_sum(arr) {
+		var ret = 0;
+		for (var i = 0; i < arr.length; i++) {
+			ret+=arr[i]/1000;
+		}
+		return ret;
+	}
+
+	function count_uniq(arr) {
+		var counts = {};
+		var ret = 0;
+		console.log('Starting ret '+ret);
+		for (var i = 0; i < arr.length; i++) {
+				if (!counts[arr[i]]) ret+=1;
+			    counts[arr[i]] = 1;
+		}
+		return ret;
+	}
+	google.visualization.events.addListener(proxy, 'ready', function () {
+        // 0 - time 1 - city 2 - node 3 - site 4 - cpu 5 - bytes
+        var dt = proxy.getDataTable();
+		var groupedData1 = google.visualization.data.group(dt, [0], [{
+            column: 4,
+            type: 'number',
+            label: dt.getColumnLabel(4),
+            aggregation: google.visualization.data.sum
+        },{
+			column: 5,
+            type: 'number',
+            label: dt.getColumnLabel(5),
+            aggregation: google.visualization.data.sum
+		}]);
+
+        showSiteTimeAgg(groupedData1);
+    });
+
+	/*google.visualization.events.addListener(proxy, 'ready', function () {
+        // 0 - time 1 - city 2 - node 3 - site 4 - cpu 5 - bytes
+        var dt = proxy.getDataTable();
+        var groupedData0 = google.visualization.data.group(dt, [2], [{
+            column: 4,
+            type: 'number',
+            label: dt.getColumnLabel(4),
+            aggregation: google.visualization.data.sum
+        },{
+			column: 5,
+            type: 'number',
+            label: dt.getColumnLabel(5),
+            aggregation: google.visualization.data.sum
+		}]);
+        // after grouping, the data will be sorted by column 0, then 1, then 2
+        // if you want a different order, you have to re-sort
+		showNodeAgg(groupedData0);
+		});*/
+
+	google.visualization.events.addListener(proxy, 'ready', function () {
+        // 0 - time 1 - city 2 - node 3 - site 4 - cpu 5 - bytes
+        var dt = proxy.getDataTable();
+        var groupedData0 = google.visualization.data.group(dt, [1,3], [{
+            column: 4,
+            type: 'number',
+            label: 'Cores',
+            aggregation: core_sum
+        },{
+			column: 5,
+            type: 'number',
+            label: dt.getColumnLabel(5),
+            aggregation: scaled_sum
+		}]);
+        // after grouping, the data will be sorted by column 0, then 1, then 2
+        // if you want a different order, you have to re-sort
+		showSiteAgg(groupedData0);
+            });
+
+	data = response.getDataTable();
+	new google.visualization.Dashboard(document.getElementById('dashboard')).
+            // Establish bindings, declaring the both the slider and the category
+            // picker will drive both charts.
+            bind([categoryPicker,timeSlider], [proxy]).
+            // Draw the entire dashboard.
+            draw(data);
+
+}
+function sendAndDraw(queryString) {
+	query = new google.visualization.Query(queryString)
+	query && query.abort();
+	query.send(function(response) {handleResponse(response);});
+}
+      
+
+    </script>
+    <div id="dashboard" class="container">
+		<div class="row">
+			<div class="col-md-8">
+				<div class="col-md-4" id="control2"></div>
+				<div class="col-md-4" id="control1"></div>
+				<!--<div class="col-md-4" id="control3"></div>-->
+			</div>
+		</div>
+		<div class="row">
+			<div class="col-md-8">
+				<div class="col-md-4" id="chart1">
+				</div>
+				<div class="col-md-4" id="chart2">
+				</div>
+				<!--
+				<div class="col-md-4" id="chart3">
+				</div>-->
+			</div>
+		</div>
+		<div class="row">
+			<div class="col-md-8">
+				<div class="col-md-4" id="chart4">
+				</div>
+				<!--
+				<div class="col-md-4" id="chart5">
+				</div>-->
+				<div class="col-md-4" id="chart6">
+				</div>
+			</div>
+		</div>
+    </div>
+	<div id="chart7" style="display:none"></div>
diff --git a/planetstack/templates/admin/dashboard/welcome.html b/planetstack/templates/admin/dashboard/welcome.html
index 8df5f10..306467a 100644
--- a/planetstack/templates/admin/dashboard/welcome.html
+++ b/planetstack/templates/admin/dashboard/welcome.html
@@ -2,51 +2,187 @@
 {% load admin_static %}
 
 {% block content %}
-<h1>Welcome <a href="core/user/{{user.id}}">{{user.email}}</a> from Site: <a href="core/site/{{site.id}}">{{site}}</a></h1>
-<table class="table table-striped table-bordered table-hover table-condensed">
-<thead><tr>
-<th class="sortable">Slices</th><th class="sortable">Privilege</th>
-<th class="sortable">Reservations</th>
-</tr></thead>
-{% for entry in userSliceInfo %}
-<tr><td> <a href="core/slice/{{entry.slice.id}}">{{entry.slice.name}}</a><br>
-</td><td>{{entry.role}}</td>
-{% if entry.reservations %}
-<td><a href="core/slice/{{entry.slice.id}}/#reservations">
-{% for resSlot in entry.reservations.1 %}
-{{resSlot}} <br>
-{% endfor %}
-</a></td></tr>
-{% else %}
-<td></td></tr>
-{% endif %}
-{% endfor %}
-</table>
-<script type="text/javascript" src="{% static 'log4javascript-1.4.6/log4javascript.js' %}"></script>
-<div id="HPCDashboard">
-    <h1>HPC Dashboard</h1>
-    <span id="hpcSummary">
-        <span class="summary-attr"><b>Active Slivers:</b> 78 </span>
-        <span class="summary-attr"><b>Overall Throughput:</b> 58Gbps</span>
-        <span class="summary-attr-util"><b>CPU Utilization:</b> 45%</span>
+<link rel="stylesheet"  href="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.0/css/jquery.dataTables.css">
+<link rel="stylesheet" type="text/css" href="{% static 'suit/css/suit.css' %}" media="all">
+<link rel="stylesheet" type="text/css" href="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.0/css/jquery.dataTables_themeroller.css">
+<link rel="stylesheet" type="text/css" href="{% static 'planetstack.css' %}" media="all">
+<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
 
-    </span>
-    <div id="map-us" ></div>
-</div>
 <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.css" />
 <script src="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.js"></script>
 
-<script src="{% static 'js/Leaflet.MakiMarkers.js' %}" > </script>
 
+<!-- no need to include jquery here as it's already included by base.html. Including it multiple times will break mtuity statistics. -->
+<!-- src="http://code.jquery.com/jquery-1.9.1.js" -->
+
+<script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
+<script src="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js"></script>
+<script type="text/javascript" src="{% static 'log4javascript-1.4.6/log4javascript.js' %}"></script>
+<script src="{% static 'js/Leaflet.MakiMarkers.js' %}" > </script>
+  
+<script>
+  $(function() {
+    $( "#tabs" ).tabs({active: 0
+      //collapsible: true
+    });
+  });
+</script>
 <script>
 
+function confirmDialog(title,msg) {
+    var dialog = $('<div>'+msg+'</div>');
+    var def = $.Deferred();
+
+    $(dialog).dialog({
+        resizable: false,
+        title: title,
+        autoOpen: true,
+        modal: true,
+        dialogClass: "dashboard-hpc-sliver",
+        buttons: {
+            'OK': function() {
+                def.resolve();
+                log.debug("Chose to add a sliver");
+                $( this ).dialog( "close" );
+            },
+            'Cancel': function() {
+                def.reject();
+                $( this ).dialog( "close" );
+            }
+        },
+        close: {
+        }
+    });
+    return def.promise();
+}
+
+  </script>
+
+<div id="tabs" class="inner-center-column ui-tabs ui-widget ui-widget-content ui-corner-all">
+  <ul id="suit_form_tabs" class="nav nav-tabs nav-tabs-suit">
+    <li class="active"><a href="#tabs-1">Developer View</a></li>
+    <li><a href="#tabs-2">CDN Operations </a></li>
+    <li><a href="#tabs-3">Historical</a></li>
+    <li><a href="#tabs-3">Tenant</a></li>
+  </ul>
+<div id="tabs-1">
+</div>
+<div id="tabs-2">
+    <div id="HPCDashboard">
+    <h1>CDN Operations View</h1>
+    <span id="hpcSummary">
+        <span class="summary-attr"><b>Active Slivers:</b> <span id="active-slivers-value"> </span> </span>
+        <span class="summary-attr"><b>Overall Throughput:</b> <span id="overall-throughput-value"> </span>  </span>
+        <span class="summary-attr-util"><b>Average CPU Utilization:</b> <span id="cpu-utilization-value"> </span>  </span>
+    </span>
+    <div id="map-us" ></div>
+    <div style="line-height: 30%"><br></div><table border=0><tr>
+    <td>Least Loaded&nbsp;&nbsp;</td>
+    <td bgcolor="#0000FF" width=40>&nbsp;</td>
+    <td bgcolor="#00FFFF" width=40>&nbsp;</td>
+    <td bgcolor="#00FF00" width=40>&nbsp;</td>
+    <td bgcolor="#FFFF00" width=40>&nbsp;</td>
+    <td bgcolor="#FF0000" width=40>&nbsp;</td>
+    <td>&nbsp;&nbsp;Most Loaded</td>
+    </tr></table>
+    </div>
+</div>
+<div id="tabs-3">
+{% include "/opt/planetstack/templates/admin/dashboard/hpc_historical.html" %}
+</div>
+</div>
+
+<script>
+var oTable;
 var consoleAppender = new log4javascript.BrowserConsoleAppender();
 var patternLayout = new log4javascript.PatternLayout("%d{HH:mm:ss,SSS} %l{s:l} %-5p - %m{1}%n");
 consoleAppender.setLayout(patternLayout);
 
+//var log  = log4javascript.getDefaultLogger();
 var log  = log4javascript.getRootLogger();
 log.addAppender(consoleAppender);
-log.setLevel(log4javascript.Level.ALL);
+log.setLevel(log4javascript.Level.ERROR);
+
+function updateUserSliceTable(){
+    log.debug("Should grab user slice info");
+    jQuery.ajax({
+        async:true,
+        dataType: 'json',
+        url: '/hpcdashuserslices',
+        success: function(data){
+            log.info("Got Data back for User SliceTable");
+            //parseData(data);
+            //createUserSliceTable(data);
+            setTimeout(function () { updateUserSliceTable() }, 5000);
+        },
+        error: function(data){
+            log.debug("COULDNT GET DATA BACK");
+            setTimeout(function () { updateUserSliceTable() }, 5000);
+        }
+    });
+}
+
+function createUserSliceTable(data) {
+    log.debug("Creating User Slice Table");
+
+    //Add check for #dynamicusersliceinfo_filter label-> input having focus here
+
+    $('#tabs-1').html( '<table cellpadding="0" cellspacing="0" border="0" class="display" id="dynamicusersliceinfo"></table>' );
+    var actualEntries = [];
+    log.debug(data['userSliceInfo']['rows'][0]['slicename']);
+
+    var rows = data['userSliceInfo']['rows'];
+    for (row in rows) {
+        log.debug(row[0]);
+        slicename = rows[row]['slicename'];
+        sliceid = rows[row]['sliceid'];
+        role = rows[row]['role'];
+        slivercount = rows[row]['slivercount'];
+        sitecount = rows[row]['sitecount'];
+        actualEntries.push(['<a href="http://{{request.get_host}}/admin/core/slice/' + sliceid + '">' + slicename + '</a>',
+                            role, slivercount, sitecount]);
+    }
+    oTable = $('#dynamicusersliceinfo').dataTable( {
+        "bJQueryUI": true,
+        "aaData":  actualEntries ,
+        "bStateSave": true,
+        "aoColumns": [
+            { "sTitle": "Slice" },
+            { "sTitle": "Privilege" , sClass: "alignCenter"},
+            { "sTitle": "Number of Slivers" , sClass: "alignCenter"},
+            { "sTitle": "Number of Sites" , sClass: "alignCenter"},
+        ]
+    } );
+
+    // If the filter had focus, reapply here
+
+    setTimeout(function() {
+       jQuery.ajax({
+           url: '/hpcdashuserslices',
+           dataType: 'json',
+           success: function(data){ createUserSliceTable(data); },
+           complete: function(){ },
+       });
+    },  10000);
+}
+
+function initTable(){
+    log.debug("Initializing Table")
+    jQuery.ajax({
+        url: '/hpcdashuserslices',
+        dataType: 'json',
+        success: function(data){ createUserSliceTable(data); },
+        complete: function(){
+        }
+    });
+    updateUserSliceTable();
+}
+
+
+initTable();
+
+//$( "#dialogadd" ).dialog({ autoOpen: false });
+//$( "#remSliverdialog" ).dialog({ autoOpen: false });
 
 L.Map = L.Map.extend({
     openPopup: function(popup) {
@@ -61,22 +197,28 @@
 
 //Iterate through data and find the max/min coordinates to include all of our points to start
 var map = L.map('map-us'); //.setView([0, 0], 1);
+map.scrollWheelZoom.disable();
 
-L.tileLayer('http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/997/256/{z}/{x}/{y}.png', {
+//
+// Great tiles, but starting to occasionally see 403 errors on certain tiles causing grey out effect
+//L.tileLayer('http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/997/256/{z}/{x}/{y}.png', {
+//
+// Swapping out cloudmade tiles to openstreetmap - too many grey tiles showing
+L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
     maxZoom: 18,
     attribution: 'Test'
 }).addTo(map);
 
 var arrayOfLatLngs = [];
-var data = {{ cdnData|safe }};
-log.info( data );
+var mapData = {{ cdnData|safe }};
+log.debug( mapData );
 
-for ( var key in data ) {
-    arrayOfLatLngs.push([data[key]['lat'],data[key]['long']]);
-    log.info( arrayOfLatLngs );
+for ( var key in mapData ) {
+    arrayOfLatLngs.push([mapData[key]['lat'],mapData[key]['long']]);
+    log.debug( arrayOfLatLngs );
 
-    data[key]['marker'] = L.marker([data[key]['lat'], data[key]['long']], {icon: getIcon(data[key]['numNodes'], data[key]['numHPCSlivers']) });
-    data[key]['marker'].addTo(map).bindPopup(setPopupVals(key, data[key]));
+    mapData[key]['marker'] = L.marker([mapData[key]['lat'], mapData[key]['long']], {icon: getIcon(mapData[key]['numNodes'], mapData[key]['numHPCSlivers'], 0, mapData[key]['hot']) });
+    mapData[key]['marker'].addTo(map).bindPopup(setPopupVals(key, mapData[key]));
 
 }
 var bounds = new L.LatLngBounds(arrayOfLatLngs);
@@ -88,51 +230,109 @@
 function setPopupVals (site, siteData) {
     var retVal = '<span class="SiteDetail"><b>' + site + '</b></span>' + 
                    '</br><a href="' + siteData['siteUrl'] + '">' + siteData['siteUrl'] + '</a>' + 
-                   '</br><b>Available Nodes: </b>' + siteData['numNodes'] + 
-                   '</br><b>Active HPC Slivers: </b>' + siteData['numHPCSlivers'] + 
-                   '</br><span id="addSlivers">Add HPC Slivers</span>' + 
-                   '<span id="remSlivers">Remove HPC Slivers</span>' ; 
+                   '</br><b>HPC Slivers: </b>' + siteData['numHPCSlivers'] + 
+                   '</br><b>Total Nodes: </b>' + siteData['numNodes'] +
+//                   '</br><b>Hot: </b>' + Math.round(siteData['hot']*100) +
+                   '</br><b>Measured Load: </b>' + siteData['load'] + '%' +
+                   '<span id="addSlivers"></br><a href="#" id="addHPCSliver" data-site="' + site + '" data-availNodes="' + siteData['numNodes'] +'">Add HPC Slivers</a> </span>' +
+                   '<span id="remSlivers"><a href="#" id="remHPCSliver" data-site="' + site + '">Remove HPC Slivers</a> </span>';
 
    return retVal;
 }
-function getIcon(numNodes, numHPCSlivers, currentBW) {
-    var colorChoices = ["#007FFF", "#0000FF", "#7f00ff", "#FF00FF", "#FF007F", "#FF0000"];
 
-    var ratio = (numHPCSlivers/numNodes) * 100;
+$('#map-us').on('click', '#remHPCSliver', function() {
+   
+    $.ajax({
+        url : '/dashboardaddorremsliver/',
+        dataType : 'json',
+        data: {site: $(this).data('site'),
+               actionToDo: "rem",
+               csrfmiddlewaretoken: "{{ csrf_token }}",   // < here 
+               state:"inactive" },
+        type : 'POST',
+        //success: function(response)
+        //{
+         //   alert("Successfully posted request to REMOVE sliver");
+        //},
+        complete:function(){
+            alert("Successfully posted request to REMOVE sliver");
+        },
+        //error:function (xhr, textStatus, thrownError){
+         //   alert("Could not request to remove HPC Sliver");
+        //}
+    });
+});
+
+$('#map-us').on('click', '#addHPCSliver', function() {
+   
+    $.ajax({
+        url : '/dashboardaddorremsliver/',
+        dataType : 'json',
+        data: {site: $(this).data('site'),
+               actionToDo: "add",
+               csrfmiddlewaretoken: "{{ csrf_token }}",   // < here 
+               state:"inactive" },
+        type : 'POST',
+        success: function(response)
+        {
+            alert("Successfully posted request to add sliver");
+        },
+        complete:function()
+        { 
+            alert("Successfully posted request to add sliver");
+        },
+        //error:function (xhr, textStatus, thrownError){
+         //   alert("error doing something");
+        //}
+    });
+  //  confirmDialog("Add HPC Slivers","Add some HPC Slivers to site " + $(this).data('site'));
+});
+
+function getIcon(numNodes, numHPCSlivers, currentBW, hot) {
+    //var colorChoices = ["#007FFF", "#0000FF", "#7f00ff", "#FF00FF", "#FF007F", "#FF0000"];
+    var colorChoices = ["#0000FF", "#00FFFF", "#00FF00", "#FFFF00", "#FF0000"];
+
+    var ratio = hot * 100; //(numHPCSlivers/numNodes) * 100;
     var numColors = colorChoices.length;
     var colorBands = 100/numColors;
 
     //Algorithm for color tone should consider the number of available nodes
     // on the site, and then how much the current dedicated nodes are impacted
     //var iconColor = 0;
-    var iconColor = 5;
+    var iconColor = colorChoices.length-1;
     for (colorBand = 0; colorBand < numColors; colorBand ++) {
         if (ratio < colorBands * colorBand+1) {
             iconColor = colorBand
             break;
         }
     }
-  
-    var icon = L.MakiMarkers.icon({icon: "star-stroked", color: colorChoices[iconColor] , size: "s"});
+
+    if (numHPCSlivers < 1) {
+        iconColor = "#7F7F7F";
+    } else {
+        iconColor = colorChoices[iconColor];
+    }
+
+    var icon = L.MakiMarkers.icon({icon: "star-stroked", color: iconColor , size: "s"});
     return icon;
 }
 
 function updateMaps() {
-    log.info("Attempting to update Maps");
+    log.debug("Attempting to update Maps");
     $.ajax({
     url : '/hpcdashboard',
     dataType : 'json',
     type : 'GET',
     success: function(newData)
     {
-        log.info("Successfully got data back...");
-        log.info(newData);
-        log.info("Still have old data too");
-        log.info(data);
+        log.debug("Successfully got data back...");
+        log.debug(newData);
+        log.debug("Still have old data too");
+        log.debug(mapData);
         updateMapData(newData);
     }
 });
-    setTimeout(updateMaps, 45000)
+    setTimeout(updateMaps, 30000)
 
 }
 
@@ -140,32 +340,32 @@
     for ( site in newData ) {
         var isNewSite = false;
         //check to see if the site is new or not
-        if (site in data) {
-            log.info("Site " + site + " already mapped");
+        if (site in mapData) {
+            log.debug("Site " + site + " already mapped");
             //take ownership of marker
-            newData[site]['marker'] = data[site]['marker'];
-            delete data[site];
-            newData[site]['marker'].setIcon(getIcon(newData[site]['numNodes'], newData[site]['numHPCSlivers']));
+            newData[site]['marker'] = mapData[site]['marker'];
+            delete mapData[site];
+            newData[site]['marker'].setIcon(getIcon(newData[site]['numNodes'], newData[site]['numHPCSlivers'],  0, newData[site]['hot']));
             // workaround, markers currently don't have a setPopup Content method -- so have to grab object directly
             newData[site]['marker']._popup.setContent(setPopupVals(site, newData[site]));
         }
         else {
             isNewSite = true;
-            log.info("New Site detected: " + site);
+            log.debug("New Site detected: " + site);
             newData[site]['marker'] = L.marker([newData[site]['lat'], newData[site]['long']], 
-                                              {icon: getIcon(newData[site]['numNodes'], newData[site]['numHPCSlivers']) });
+                                              {icon: getIcon(newData[site]['numNodes'], newData[site]['numHPCSlivers'],  0, newData[site]['hot']) });
             newData[site]['marker'].addTo(map).bindPopup(setPopupVals(site, newData[site])); //.openPopup();
-            log.info("Should have added the new site");
+            log.debug("Should have added the new site");
 
         }
     }
 
     // Anything still in data needs to be removed since it is no longer a valid site
-    for (remSite in data) {
+    for (remSite in mapData) {
         log.warn("Site: " + remSite + " is no longer valid, removing from map");
         map.removeLayer(data[remSite]['marker']);
     }
-    data = newData;
+    mapData = newData;
 }
 
 function onMapClick(e) {
@@ -177,5 +377,51 @@
 
 setTimeout(updateMaps, 5000)
 
+// from stackexchange
+function setInnerText (elementId, text) {
+    var element;
+    if (document.getElementById) {
+        element = document.getElementById(elementId);
+    } else if (document.all) {
+        element = document.all[elementId];
+    }
+    if (element) {
+        if (typeof element.textContent != 'undefined') {
+            element.textContent = text;
+        } else if (typeof element.innerText != 'undefined') {
+            element.innerText = text;
+        } else if (typeof element.removeChild != 'undefined') {
+            while (element.hasChildNodes()) {
+                element.removeChild(element.lastChild);
+            }
+            element.appendChild(document.createTextNode(text)) ;
+        }
+    }
+}
+
+function updateLabelData(summaryData) {
+    setInnerText("active-slivers-value", summaryData["total_slivers"]);
+    setInnerText("overall-throughput-value", (summaryData["total_bandwidth"]*8/1024/1024/1024).toFixed(2) + " Gbps");
+    setInnerText("cpu-utilization-value", summaryData["average_cpu"] + "%");
+}
+
+function updateLabels() {
+    log.debug("Attempting to update Labels");
+    $.ajax({
+    url : '/hpcsummary',
+    dataType : 'json',
+    type : 'GET',
+    success: function(newData)
+    {
+        updateLabelData(newData);
+    }
+});
+    setTimeout(updateLabels, 30000)
+
+}
+
+setTimeout(updateLabels, 5000)
+		
+
 </script>
 {% endblock %}
