diff --git a/planetstack/core/plus/views.py b/planetstack/core/plus/views.py
index 3c63e16..9f5d8e4 100644
--- a/planetstack/core/plus/views.py
+++ b/planetstack/core/plus/views.py
@@ -7,6 +7,7 @@
 import datetime
 from pprint import pprint
 import json
+from syndicate.models import *
 from core.models import *
 from hpc.models import ContentProvider
 from operator import attrgetter
@@ -59,13 +60,13 @@
         serviceClass = request.POST.get("serviceClass", "0")
         imageName = request.POST.get("imageName", "0")
         actionToDo = request.POST.get("actionToDo", "0")
-        network = request.POST.get("network","0")
+        #network = request.POST.get("network","0")
         mountDataSets = request.POST.get("mountDataSets","0")
         if (actionToDo == "add"):
            serviceClass = ServiceClass.objects.get(name=serviceClass)
            site = request.user.site
            image = Image.objects.get(name=imageName)
-           newSlice = Slice(name=sliceName,serviceClass=serviceClass,site=site,imagePreference=image,mountDataSets=mountDataSets,network=network)
+           newSlice = Slice(name=sliceName,serviceClass=serviceClass,site=site,imagePreference=image,mountDataSets=mountDataSets)
            newSlice.save()
         return HttpResponse("Slice created")
 
@@ -75,7 +76,7 @@
         serviceClass = request.POST.get("serviceClass", "0")
         imageName = request.POST.get("imageName", "0")
         actionToDo = request.POST.get("actionToDo", "0")
-        network = request.POST.get("network","0")
+        #network = request.POST.get("network","0")
         dataSet = request.POST.get("dataSet","0")
         slice = Slice.objects.all()
         for entry in slice:
@@ -84,19 +85,12 @@
                          if (actionToDo == "update"):
                                 setattr(entry,'serviceClass',serviceClass)
                                 setattr(entry,'imagePreference',imageName)
-                                setattr(entry,'network',network)
+                                #setattr(entry,'network',network)
                                 setattr(entry,'mountDataSets',dataSet)
                                 entry.save()
                                 break
         return HttpResponse("Slice updated")
 
-def  update_slice(sliceName,**fields):
-         slice = Slice.objects.filter(name = sliceName)
-         for (k,v) in fields.items():
-                setattr(slice, k, v)
-                slice.save()
-         return slice
-
 def getTenantSliceInfo(user, tableFormat = False):
     tenantSliceDetails = {}
     tenantSliceData = getTenantInfo(user)
@@ -108,13 +102,13 @@
        tenantSliceDetails['userSliceInfo'] = tenantSliceData
     tenantSliceDetails['sliceServiceClass']=userSliceTableFormatter(tenantServiceClassData)
     tenantSliceDetails['image']=userSliceTableFormatter(getImageInfo(user))
-    tenantSliceDetails['network']=userSliceTableFormatter(getNetworkInfo(user))
+    #tenantSliceDetails['network']=userSliceTableFormatter(getNetworkInfo(user))
     tenantSliceDetails['deploymentSites']=userSliceTableFormatter(getDeploymentSites())
     tenantSliceDetails['sites'] = userSliceTableFormatter(getTenantSitesInfo())
     tenantSliceDetails['mountDataSets'] = userSliceTableFormatter(getMountDataSets())
+    tenantSliceDetails['publicKey'] = getPublicKey(user)
     return tenantSliceDetails
 
-
 def getTenantInfo(user):
     slices =Slice.objects.all()
     userSliceInfo = []
@@ -124,7 +118,7 @@
        sliceServiceClass = entry.serviceClass.name
        preferredImage =  entry.imagePreference
        sliceDataSet = entry.mountDataSets
-       sliceNetwork = entry.network
+       #sliceNetwork = entry.network
        numSliver = 0
        sliceImage=""
        sliceSite = {}
@@ -137,7 +131,7 @@
                 sliceNode[str(sliver)] = sliver.node.name
        numSliver = sum(sliceSite.values())
        numSites = len(sliceSite)
-       userSliceInfo.append({'sliceName': sliceName,'sliceServiceClass': sliceServiceClass,'preferredImage':preferredImage,'numOfSites':numSites, 'sliceSite':sliceSite,'sliceImage':sliceImage,'numOfSlivers':numSliver,'sliceDataSet':sliceDataSet,'sliceNetwork':sliceNetwork, 'instanceNodePair':sliceNode})
+       userSliceInfo.append({'sliceName': sliceName,'sliceServiceClass': sliceServiceClass,'preferredImage':preferredImage,'numOfSites':numSites, 'sliceSite':sliceSite,'sliceImage':sliceImage,'numOfSlivers':numSliver,'sliceDataSet':sliceDataSet,'instanceNodePair':sliceNode})
     return userSliceInfo
 
 def getTenantSitesInfo():
@@ -154,6 +148,13 @@
                     }
     return formattedData
 
+def getPublicKey(user):
+	users=User.objects.all()
+        for key in users:
+        	if (str(key.email)==str(user)):
+                    	sshKey = key.public_key
+        return sshKey
+
 def getServiceClassInfo(user):
     serviceClassList = ServiceClass.objects.all()
     sliceInfo = []
@@ -170,11 +171,58 @@
           #imageInfo.append({'Image':imageEntry})
     return imageInfo
 
+def createPrivateVolume(user, sliceName):
+    caps = Volume.CAP_READ_DATA | Volume.CAP_WRITE_DATA | Volume.CAP_HOST_DATA
+    getattr(Volume.default_gateway_caps,"read data") | \
+           getattr(Volume.default_gateway_caps,"write data") | \
+           getattr(Volume.default_gateway_caps,"host files")
+    v = Volume(name="private_" + sliceName, owner_id=user, description="private volume for %s" % sliceName, blocksize=61440, private=True, archive=False, default_gateway_caps = caps)
+    v.save()
+
+SYNDICATE_REPLICATE_PORTNUM = 1025
+
+def get_free_port():
+    inuse={}
+    inuse[SYNDICATE_REPLICATE_PORTNUM] = True
+    for vs in VolumeSlice.objects.all():
+        inuse[vs.peer_portnum]=True
+        inuse[vs.replicate_portnum]=True
+    for network in Network.objects.all():
+        network_ports = [x.strip() for x in network.ports.split(",")]
+        for network_port in network_ports:
+            try:
+                inuse[int(network_port)] = True
+            except:
+                # in case someone has put a malformed port number in the list
+                pass
+    for i in range(1025, 65535):
+        if not inuse.get(i,False):
+            return i
+    return False
+
+def mountVolume(sliceName, volumeName, readWrite):
+    slice = Slice.objects.get(name=sliceName)
+    volume = Volume.objects.get(name=volumeName)
+    # choose some unused port numbers
+    flags = Volume.CAP_READ_DATA
+    if readWrite:
+        flags = flags | Volume.CAP_WRITE_DATA
+    vs = VolumeSlice(volume_id = volume, slice_id = slice, gateway_caps=flags, peer_portnum = get_free_port(), replicate_portnum = SYNDICATE_REPLICATE_PORTNUM)
+    vs.save()
+
+def hasPrivateVolume(sliceName):
+     slice = Slice.objects.get(name=sliceName)
+     for vs in VolumeSlice.objects.filter(slice_id=slice):
+         if vs.volume_id.private:
+             return True
+     return False
+
 def getMountDataSets():
-        dataSetList = ['------','GenBank','LSST','LHC','NOAA','Measurement Lab','Common Crawl']
-        dataSetInfo = []
-        for entry in dataSetList:
-                dataSetInfo.append({'DataSet':entry})
+        dataSetInfo=[]
+        for volume in Volume.objects.all():
+            if not volume.private:
+                dataSetInfo.append({'DataSet': volume.name})
+
         return dataSetInfo
 
 def getNetworkInfo(user):
@@ -307,6 +355,11 @@
 
     return new_rows
 
+def getPageSummary(request):
+    slice = request.GET.get('slice', None)
+    site = request.GET.get('site', None)
+    node = request.GET.get('node', None)
+
 class SimulatorView(View):
     def get(self, request, **kwargs):
         sim = json.loads(file("/tmp/simulator.json","r").read())
@@ -446,7 +499,7 @@
         def post(self,request):
                 sliceName = request.POST.get("sliceName",None)
                 slice = Slice.objects.get(name=sliceName)
-                print slice, slice.id
+                #print slice, slice.id
                 sliceToDel=Slice(name=sliceName, id=slice.id)
                 sliceToDel.delete()
                 return HttpResponse("Slice deleted")
diff --git a/planetstack/core/static/planetstack.css b/planetstack/core/static/planetstack.css
index 1fa6ea2..39102be 100644
--- a/planetstack/core/static/planetstack.css
+++ b/planetstack/core/static/planetstack.css
@@ -1034,7 +1034,7 @@
  margin-left: 5%;
 }
 
-#network-dropdown,#adv-network-dropdown{
+#network-dropdown,#adv-network-dropdown,#adv-network-value{
  margin-left: 3.7%;
 }
 
@@ -1129,3 +1129,16 @@
 #advNumOfSlivers{
         margin-right: 1% !important;
 }
+
+#private-vol-checkbox{
+margin: 0 0 1% 1%;
+}
+
+.public-key-warning{
+text-align: center;
+display:none;
+}
+
+#private-vol{
+margin-right: 15% !important;
+}
\ No newline at end of file
diff --git a/planetstack/templates/admin/dashboard/tenant.html b/planetstack/templates/admin/dashboard/tenant.html
index c3f95ec..a09cec6 100644
--- a/planetstack/templates/admin/dashboard/tenant.html
+++ b/planetstack/templates/admin/dashboard/tenant.html
@@ -35,9 +35,13 @@
 			</div>
 			<div class="create-slice-row">
                                 <label for="new-network">Network</label>
-                                <select id="new-network" class="tenant-create-slice"></select>
+				<input type="text" name="new-network" id="new-network">
                         </div>
 			<div class="create-slice-row">
+				<label for="private-vol">Include Private Vol</label>
+				<input type="checkbox" name="checkbox" id="private-vol" value="value">
+			</div>
+			<div class="create-slice-row">
                                 <label for="mount-data-sets">Data Sets</label>
                                 <select id="mount-data-sets" class="tenant-create-slice"></select>
                         </div>
@@ -66,23 +70,20 @@
 	</script>
 	<script>
 	$(document).ready(function () {
-		function showSliceData(data,value) {
-			var imageData = data['image']['rows'];
-			var networkData = data['network']['rows'];
+		function showSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value) {
 			$("#service-level-value").empty();
 			$("#slice-image-value").empty();
 			$("#tenantSiteTable").empty();
 			$('#tenantSiteTable').html('<table cellpadding="0" cellspacing="0" border="0" class="display" id="tenantSiteTableData"></table>');
 			$("#tenantSliceDropDown").val(value);
-			var rows = data['userSliceInfo']['rows'];
 			var siteNames = [];
 			var sliverCount;
 			for (row in rows) {
 				if (rows[row]['sliceName'] == value) {
 					sliceImageData = rows[row]['preferredImage'];
 					$("#slice-image-value").html(sliceImageData);
-					serviceLevelData = rows[row]['sliceServiceClass'];
-					$("#service-level-value").html(serviceLevelData);
+					serviceLevelDataBasic = rows[row]['sliceServiceClass'];
+					$("#service-level-value").html(serviceLevelDataBasic);
 					var innerRows = rows[row]['sliceSite'];
 					for (innerRow in innerRows) {
 						sliverCount = innerRows[innerRow];
@@ -103,18 +104,16 @@
 						"sTitle": "Allocated",
 						sClass: "alignCenter"
 					}
-					//{ "sTitle": "Allocated" , sClass: "alignCenter"},
-					//{ "sTitle": "Desired" , sClass: "alignCenter"},
 				]
 			});
 				$('#tenantSliceDropDown').on('change', function () {
 					var value = $("#tenantSliceDropDown").val();
 	//alert(value);
-					checkForBasicAdvView(value, data);
+					checkForBasicAdvView(value,rows,imageData,serviceLevelData,siteRows,dataSet);
 				});
 		}
 
-		function downloadSliceInfo(data,value){
+		function downloadSliceInfo(rows,imageData,serviceLevelData,siteRows,dataSet,value){
 			 $("#download-details").unbind().click(function(){
                                                 function download(filename, text) {
     						var sliceDetails = document.createElement('a');
@@ -122,7 +121,6 @@
     						sliceDetails.setAttribute('download', filename);
     						sliceDetails.click();
 					}
-					var rows = data['userSliceInfo']['rows'];
 					var sliceInfo;
 					for (row in rows){
 						if(rows[row]['sliceName']==value){
@@ -140,8 +138,9 @@
 				var allocatedSlivers = parseInt($(this).parent().siblings(".allocated").html());
 				var td = $(this).parent().siblings(".allocated");
 				var pos = oTable.fnGetPosition(td[0]);
+				$("#numOfSlivers").val("");;
+				$("#advNumOfSlivers").val("");;
 				$("#adv-tooltip").css("display", "none");
-				$("#numOfSlivers").empty();
 				$("#adv-dialog-form").dialog({
 					autoOpen: false,
 					height: 200,
@@ -151,21 +150,15 @@
 					buttons: {
 						"Add": function () {
 							allocatedSlivers += parseInt($("#advNumOfSlivers").val());
-							//if (!(parseInt($("#numOfSlivers").val()))) {
 								$("#adv-tooltip").css("display", "block");
-							//} else {
 								$(this).dialog("close");
 								td.html(allocatedSlivers);
-							//}
 						},
 						"Remove": function () {
 							allocatedSlivers -= parseInt($("#advNumOfSlivers").val());
-						//	if (!(parseInt($("#numOfSlivers").val()))) {
 								$("#adv-tooltip").css("display", "block");
-						//	} else {
 								$(this).dialog("close");
 								td.html(allocatedSlivers);
-						//	}
 						}
 					}
 				});
@@ -173,23 +166,15 @@
 			});
 		}
 
-		function advShowSliceData(data,value) {
-			var serviceLevelData = data['sliceServiceClass']['rows'];
-			var imageData = data['image']['rows'];
-			var networkData = data['network']['rows'];
-			var siteRows = data['sites']['rows'];
-			var dataSet = data['mountDataSets']['rows'];
+		function advShowSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value) {
 			$("#adv-service-level-value").empty();
 			$("#adv-slice-image-value").empty();
 			$("#adv-slice-data-set-value").empty();
-			$("#adv-slice-network-value").empty();
 			$("#advTenantSliceDropDown").val(value);
 			$("<select></select>").attr('id', 'adv-service-level-dropdown').appendTo('#adv-service-level-value');
 			$("<select></select>").attr('id', 'adv-image-dropdown').appendTo('#adv-slice-image-value');
-			$("<select></select>").attr('id', 'adv-network-dropdown').appendTo('#adv-slice-network-value');
 			$("<select></select>").attr('id', 'adv-dataset-dropdown').appendTo('#adv-slice-data-set-value');
 			$('#advTenantSiteTable').html('<table cellpadding="0" cellspacing="0" border="0" class="display" id="advTenantSiteTableData"></table>');
-			var rows = data['userSliceInfo']['rows'];
 			var siteNames = [];
 			var sliverCount;
 			var tableData = {};
@@ -199,9 +184,6 @@
                         for (row in imageData) {
                                 $("#adv-image-dropdown").append("<option>" + imageData[row]['Image'] + "</option>");
                         }
-                        for (row in networkData) {
-                                $("#adv-network-dropdown").append("<option>" + networkData[row]['Network'] + "</option>");
-                        }
                         for (row in dataSet) {
                                 $("#adv-dataset-dropdown").append("<option>" + dataSet[row]['DataSet'] + "</option>");
                         }
@@ -212,7 +194,6 @@
 					$("#adv-service-level-dropdown").val(rows[row]['sliceServiceClass']);
 					$("#adv-image-dropdown").val(rows[row]['preferredImage']);
 					$("#adv-dataset-dropdown").val(rows[row]['sliceDataSet']);
-					$("#adv-network-dropdown").val(rows[row]['sliceNetwork']);
 					for (innerRow in innerRows) {
 						tableData[innerRow] = innerRows[innerRow];
 					}
@@ -249,8 +230,8 @@
 							},
 							type: 'POST',
 							complete: function () {
-                                                                //oTable.fnReloadAjax();
-								location.reload();
+								//location.reload();
+								
                                                         }
 						});
 					} else if (newTableData[newRow] < tableData[newRow]) {
@@ -267,8 +248,7 @@
 							},
 							type: 'POST',
 							complete: function () {
-                                                               // oTable.fnReloadAjax();
-								location.reload();
+								//location.reload();
                                                         }
 						});
 					}
@@ -280,7 +260,6 @@
                                                                 sliceName: $("#advTenantSliceDropDown").val(),
 								serviceClass: $("#adv-service-level-dropdown").val(),
 								imageName: $("#adv-image-dropdown").val(),
-								network: $("#adv-network-dropdown").val(),
 								dataSet: $("#adv-dataset-dropdown").val(),
                                                                 actionToDo: "update",
                                                                 csrfmiddlewaretoken: "{{ csrf_token }}", // < here
@@ -288,8 +267,8 @@
                                                         },
                                                         type: 'POST',
                                                         complete: function () {
-                                                                //oTable.fnReloadAjax();
-                                                                location.reload();
+								$("#tabs-5").empty();
+                                                                initTenant();    //location.reload();
                                                         }
                                                 });
 
@@ -315,20 +294,17 @@
 			});
 			editSliverAdv();
 				$('#advTenantSliceDropDown').on('change', function () {
-	var selectedValue = $("#advTenantSliceDropDown").val();
-	//alert(selectedValue);
-					checkForBasicAdvView(selectedValue, data);
-					//editSliverAdv();
+					var selectedValue = $("#advTenantSliceDropDown").val();
+					checkForBasicAdvView(selectedValue, rows,imageData,serviceLevelData,siteRows,dataSet);
 				});
 		}
 
-		function checkForBasicAdvView(value, data) {
-			var rows = data['userSliceInfo']['rows'];
+		function checkForBasicAdvView(value, rows,imageData,serviceLevelData,siteRows,dataSet) {
 			for (row in rows) {
 				if (rows[row]['sliceName'] == value) {
 					if (rows[row]['numOfSites'] > 1) {
-						advShowSliceData(data,value);
-						downloadSliceInfo(data,value);
+						advShowSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value);
+						downloadSliceInfo(rows,imageData,serviceLevelData,siteRows,dataSet,value);
 						$("#tenantSliceDataWrapper").css("display","none");
 						$("#advancedTenantSliceDataWrapper").css("display","block");
 						$("#advTenantSiteTable").css("display","block");
@@ -337,9 +313,8 @@
 						$("#save-btn").css("display","block");
 						break;
 					} else if(rows[row]['numOfSites'] <= 1){
-						showSliceData(data,value);
-						downloadSliceInfo(data,value);
-						//editSliverAdv();
+						showSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value);
+						downloadSliceInfo(rows,imageData,serviceLevelData,siteRows,dataSet,value);
 						$("#tenantSliceDataWrapper").css("display","block");
 						$("#advancedTenantSliceDataWrapper").css("display","none");
 						$("#advTenantSiteTable").css("display","none");
@@ -352,15 +327,14 @@
 			}
 		}
 
-		function UserSliceTable(data) {
+		function UserSliceTable(rows,imageData,serviceLevelData,siteRows,dataSet) {
 				//Add check for #dynamicusersliceinfo_filter label-> input having focus here
-				var rows = data['userSliceInfo']['rows'];
 				$("<div></div>").attr('id', 'tenantSliceDataWrapper').appendTo('#tabs-5');
 				$("<div></div>").attr('id', 'advancedTenantSliceDataWrapper').appendTo('#tabs-5');
 				var sliceData = '';
-				sliceData += '<div class="tenant-row"><span class="summary-attr"><b>Slice Name:</b> <span id="slice-name-value"> </span> </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Service Level:</b> <span id="service-level-value"> </span>  </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Image:</b> <span id="slice-image-value"> </span>  </span><br></div><div class="btn btn-high btn-info" id="advanced-tenant">Go to Advanced View</div>';
+				sliceData += '<div class="tenant-row public-key-warning"><span class="summary-attr">You have not uploaded your Public Key. <a href="http://{{ request.get_host}}/admin/core/user/{{user.id}}">Click here</a> to upload it now.</span></div><div class="tenant-row"><span class="summary-attr"><b>Slice Name:</b> <span id="slice-name-value"> </span> </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Service Level:</b> <span id="service-level-value"> </span>  </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Image:</b> <span id="slice-image-value"> </span>  </span><br></div><div class="btn btn-high btn-info" id="advanced-tenant">Go to Advanced View</div>';
 				var advSliceData = '';
-				advSliceData += '<div class="adv-tenant-row"><span class="summary-attr"><b>Slice Name:</b> <span id="adv-slice-name-value"> </span> </span><br><br></div><div class="tenant-row"><span class="summary-attr"><b>Service Level:</b> <span id="adv-service-level-value"> </span> <span class="help-inline">Changes are potentially disruptive to existing slivers</span> </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Image:</b> <span id="adv-slice-image-value"> </span><span class="help-inline">Changes are potentially disruptive to existing slivers</span>  </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Network:</b> <span id="adv-slice-network-value"> </span>  <span class="help-inline">Changes are potentially disruptive to existing slivers</span></span></div><div class="tenant-row"><span class="summary-attr"><b>Data Sets:</b> <span id="adv-slice-data-set-value"> </span>  </span></div>';
+				advSliceData += '<div class="tenant-row public-key-warning"><span class="summary-attr">You have not uploaded your Public Key. <a href="http://{{ request.get_host}}/admin/core/user/{{user.id}}">Click here</a> to upload it now.</span></div><div class="adv-tenant-row"><span class="summary-attr"><b>Slice Name:</b> <span id="adv-slice-name-value"> </span> </span><br><br></div><div class="tenant-row"><span class="summary-attr"><b>Service Level:</b> <span id="adv-service-level-value"> </span> <span class="help-inline">Changes are potentially disruptive to existing slivers</span> </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Image:</b> <span id="adv-slice-image-value"> </span><span class="help-inline">Changes are potentially disruptive to existing slivers</span>  </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Network:</b> <input type="text" name="adv-network-value" id="adv-network-value"> <span class="help-inline">List of port ranges(if any) e.g. 1021-1026,1029</span><br></div><div class="tenant-row"><span class="summary-attr"><b>Data Sets:</b> <span id="adv-slice-data-set-value"> </span>  <input type="checkbox" name="checkbox" id="private-vol-checkbox" value="value"><span class="help-inline">Include Private Volume</span></span></div>';
 				$('#tenantSliceDataWrapper').append(sliceData).css("display", "none");
 				$('#advancedTenantSliceDataWrapper').append(advSliceData);
 				$("#advancedTenantSliceDataWrapper").css("display", "none");
@@ -381,7 +355,7 @@
 				$('<div class="btn btn-high btn-info" id="save-btn">Save</div>').appendTo("#tabs-5").css("display", "none");
 				$("#advanced-tenant").unbind().click(function () {
 					var value = $("#tenantSliceDropDown").val();
-					advShowSliceData(data,value);
+					advShowSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value);
                                                 $("#tenantSliceDataWrapper").css("display","none");
                                                 $("#advancedTenantSliceDataWrapper").css("display","block");
                                                 $("#advTenantSiteTable").css("display","block");
@@ -391,7 +365,6 @@
 
 			});
 			$("#sliver-btn").click(function () {
-				$("#numOfSlivers").empty();
 				$("#basic-tooltip").css("display", "none");
 				$("#dialog-form").dialog({
 					autoOpen: false,
@@ -420,8 +393,9 @@
 										return true;
 									}
 								},
-								complete: function () {
+								success: function () {
 									location.reload();
+$("#dialog-form").dialog("close");
 								}
 							});
 						},
@@ -445,8 +419,10 @@
 										return true;
 									}
 								},
-								complete: function () {
-									location.reload();
+								success: function () {
+$("#dialog-form").dialog("close");								
+location.reload();
+
 								}
 							});
 						}
@@ -455,10 +431,6 @@
 				$("#dialog-form").dialog("open");
 			});
 			$("#create-slice-btn").unbind().click(function () {
-				var serviceLevelData = data['sliceServiceClass']['rows'];
-				var imageData = data['image']['rows'];
-				var dataSet = data['mountDataSets']['rows'];
-				var networkData = data['network']['rows'];
 				$("#new-service-class").empty();
 				$("#new-image").empty();
 				$("#mount-data-sets").empty();
@@ -472,9 +444,6 @@
 				for (row in dataSet) {
                                         $("#mount-data-sets").append("<option>" + dataSet[row]['DataSet'] + "</option>");
                                 }
-				for (row in networkData) {
-                                        $("#new-network").append("<option>" + networkData[row]['Network'] + "</option>");
-                                }
 				var nameOfSlice = $("#new-slice-name").val();
 				var nameOfServiceClass = $("#new-service-class").val();
 				var nameOfImage = $("#new-image").val();
@@ -540,7 +509,6 @@
 				$("#create-slice-form").dialog("open");
 			});
 			$("#delete-slice-btn").unbind().click(function () {
-				var rows = data['userSliceInfo']['rows'];
 				$("#delete-slice").empty();
 				for (row in rows) {
 					$("#delete-slice").append("<option>" + rows[row]['sliceName'] + "</option>");
@@ -583,9 +551,18 @@
 			url: '/tenantview',
 			dataType: 'json',
 			success: function (data) {
-				UserSliceTable(data);
+				var rows = data['userSliceInfo']['rows'];
+				var imageData = data['image']['rows'];
+				//var networkData = data['network']['rows'];
+				var serviceLevelData = data['sliceServiceClass']['rows'];
+				var siteRows = data['sites']['rows'];
+				var dataSet = data['mountDataSets']['rows'];
+				UserSliceTable(rows,imageData,serviceLevelData,siteRows,dataSet);
+				if(!(data['publicKey'])){
+					$(".public-key-warning").css("display","block");
+				}
 				var value = $("#tenantSliceDropDown").val();
-				checkForBasicAdvView(value, data);
+				checkForBasicAdvView(value,rows,imageData,serviceLevelData,siteRows,dataSet);
 				$("#tooltip").css("display", "none");
 				$("#basic-tooltip").css("display", "none");
 				$("#adv-tooltip").css("display", "none");
