diff --git a/xos/core/xoslib/static/js/xosTenant.js b/xos/core/xoslib/static/js/xosTenant.js
index d2a3b4e..f933c89 100644
--- a/xos/core/xoslib/static/js/xosTenant.js
+++ b/xos/core/xoslib/static/js/xosTenant.js
@@ -1,456 +1,524 @@
-/* eslint-disable */
 
-XOSTenantSite = XOSModel.extend( {
-    listFields: ["name", "allocated"],
-    modelName: "tenantSite",
-    collectionName: "tenantSites"
+/* globals XOSModel, XOSCollection */
+/* eslint-disable no-undef, guard-for-in, new-cap */
+
+XOSTenantSite = XOSModel.extend({
+  listFields: ['name', 'allocated'],
+  modelName: 'tenantSite',
+  collectionName: 'tenantSites'
 });
 
-XOSTenantSiteCollection = XOSCollection.extend( {
-    listFields: ["name", "allocated", "ready"],
-    modelName: "tenantSite",
-    collectionName: "tenantSites",
+XOSTenantSiteCollection = XOSCollection.extend({
+  listFields: ['name', 'allocated', 'ready'],
+  modelName: 'tenantSite',
+  collectionName: 'tenantSites',
 
-    getFromSlice: function(slice) {
-        var tenantSites = [];
-        var id = 0;
-        for (siteName in slice.attributes.site_allocation) {
-            allocated = slice.attributes.site_allocation[siteName];
-            ready = slice.attributes.site_ready[siteName] || 0;
-            tenantSites.push(new XOSTenantSite( { name: siteName, allocated: allocated, ready: ready, id: id} ));
-            id = id + 1;
-        }
-        for (index in xos.tenantview.models[0].attributes.blessed_site_names) {
-            siteName = xos.tenantview.models[0].attributes.blessed_site_names[index];
-            if (! (siteName in slice.attributes.site_allocation)) {
-                tenantSites.push(new XOSTenantSite( { name: siteName, allocated: 0, ready: 0, id: id} ));
-                id = id + 1;
-            }
-        }
-        this.set(tenantSites);
+  getFromSlice: function(slice) {
+    var tenantSites = [];
+    var id = 0;
+    var that = this;
 
-        var that=this;
-        this.listenTo(slice, 'change', function() { that.getReadyFromSlice(slice); })
-    },
+    for (siteName in slice.attributes.site_allocation) {
+      allocated = slice.attributes.site_allocation[siteName];
+      ready = slice.attributes.site_ready[siteName] || 0;
+      tenantSites.push(new XOSTenantSite({name: siteName, allocated: allocated, ready: ready, id: id}));
+      id = id + 1;
+    }
 
-    getReadyFromSlice: function(slice) {
-        for (siteName in slice.attributes.site_ready) {
-            ready = slice.attributes.site_ready[siteName];
-            for (index in this.models) {
-                tenantSite = this.models[index];
-                if (tenantSite.attributes.name == siteName) {
-                    tenantSite.set("ready", ready);
-                }
-            }
-        }
-    },
+    for (index in xos.tenantview.models[0].attributes.blessed_site_names) {
+      siteName = xos.tenantview.models[0].attributes.blessed_site_names[index];
+      if (! (siteName in slice.attributes.site_allocation)) {
+        tenantSites.push(new XOSTenantSite({name: siteName, allocated: 0, ready: 0, id: id}));
+        id = id + 1;
+      }
+    }
+    this.set(tenantSites);
 
-    putToSlice: function(slice) {
-        slice.attributes.site_allocation = {};
-        for (index in this.models) {
-            var model = this.models[index];
-            slice.attributes.site_allocation[ model.attributes.name ] = model.attributes.allocated;
+    this.listenTo(slice, 'change', function() {
+      that.getReadyFromSlice(slice);
+    });
+  },
+
+  getReadyFromSlice: function(slice) {
+    for (siteName in slice.attributes.site_ready) {
+      ready = slice.attributes.site_ready[siteName];
+      for (index in this.models) {
+        tenantSite = this.models[index];
+        if (tenantSite.attributes.name == siteName) {
+          tenantSite.set('ready', ready);
         }
-    },
+      }
+    }
+  },
+
+  putToSlice: function(slice) {
+    slice.attributes.site_allocation = {};
+    for (index in this.models) {
+      var model = this.models[index];
+
+      slice.attributes.site_allocation[ model.attributes.name ] = model.attributes.allocated;
+    }
+  },
 });
 
 XOSEditUsersView = Marionette.ItemView.extend({
-            template: "#tenant-edit-users",
-            viewInitializers: [],
+  template: '#tenant-edit-users',
+  viewInitializers: [],
 
-            onShow: function() {
-                _.each(this.viewInitializers, function(initializer) {
-                    initializer();
-                });
-            },
+  onShow: function() {
+    _.each(this.viewInitializers, function(initializer) {
+      initializer();
+    });
+  },
 
-            templateHelpers: function() { return { detailView: this, model: this.model }; },
+  templateHelpers: function() {
+    return {detailView: this, model: this.model};
+  }
 
-            });
+});
 
 XOSTenantSummaryView = XOSDetailView.extend({
-            events: {"change": "onChange"},
+  events: {'change': 'onChange'},
 
-            onChange: function(e) {
-                XOSTenantApp.setDirty(true);
-            },
+  onChange: function(e) {
+    XOSTenantApp.setDirty(true);
+  },
 
-            saveSuccess: function() {
-                console.log("saveSuccess!");
-                XOSTenantApp.setDirty(false);
-            },
+  saveSuccess: function() {
+    XOSTenantApp.setDirty(false);
+  },
 
-            });
+});
 
 
 XOSTenantButtonView = Marionette.ItemView.extend({
-            template: "#xos-tenant-buttons-template",
+  template: '#xos-tenant-buttons-template',
 
-            events: {"click button.btn-tenant-create": "createClicked",
-                     "click button.btn-tenant-delete": "deleteClicked",
-                     "click button.btn-tenant-add-user": "addUserClicked",
-                     "click button.btn-tenant-save": "saveClicked",
-                     "click button.btn-tenant-download-ssh": "downloadClicked",
-                     },
+  events: {'click button.btn-tenant-create': 'createClicked',
+           'click button.btn-tenant-delete': 'deleteClicked',
+           'click button.btn-tenant-add-user': 'addUserClicked',
+           'click button.btn-tenant-save': 'saveClicked',
+           'click button.btn-tenant-download-ssh': 'downloadClicked',
+           },
 
-            createClicked: function(e) {
-                     XOSTenantApp.addSlice();
-                     },
+  createClicked: function() {
+    XOSTenantApp.addSlice();
+  },
 
-            deleteClicked: function(e) {
-                     XOSTenantApp.deleteSlice(this.options.linkedView.model);
-                     },
+  deleteClicked: function() {
+    XOSTenantApp.deleteSlice(this.options.linkedView.model);
+  },
 
-            addUserClicked: function(e) {
-                     XOSTenantApp.editUsers(this.options.linkedView.model);
-                     },
+  addUserClicked: function() {
+    XOSTenantApp.editUsers(this.options.linkedView.model);
+  },
 
-            downloadClicked: function(e) {
-                     XOSTenantApp.downloadSSH(this.options.linkedView.model);
-                     },
+  downloadClicked: function() {
+    XOSTenantApp.downloadSSH(this.options.linkedView.model);
+  },
 
-            saveClicked: function(e) {
-                     model = this.options.linkedView.model;
-                     model.tenantSiteCollection.putToSlice(model);
-                     model.attributes.users = model.usersBuffer;
+  saveClicked: function(e) {
+    var model = this.options.linkedView.model;
 
-                     e.preventDefault();
-                     this.options.linkedView.save();
-                     //this.options.linkedView.submitContinueClicked.call(this.options.linkedView, e);
-                     //XOSTenantApp.setDirty(false);
-                     },
-            });
+    model.tenantSiteCollection.putToSlice(model);
+    model.attributes.users = model.usersBuffer;
+
+    e.preventDefault();
+    this.options.linkedView.save();
+    //this.options.linkedView.submitContinueClicked.call(this.options.linkedView, e);
+    //XOSTenantApp.setDirty(false);
+  }
+});
 
 XOSTenantApp = new XOSApplication({
-    logTableId: "#logTable",
-    statusMsgId: "#statusMsg",
-    hideTabsByDefault: true,
-    dirty: false,
-    varName: "XOSTenantApp",
+  logTableId: '#logTable',
+  statusMsgId: '#statusMsg',
+  hideTabsByDefault: true,
+  dirty: false,
+  varName: 'XOSTenantApp',
 });
 
 XOSTenantApp.addRegions({
-    tenantSliceSelector: "#tenantSliceSelector",
-    tenantSummary: "#tenantSummary",
-    tenantSiteList: "#tenantSiteList",
-    tenantButtons: "#tenantButtons",
-    tenantAddSliceInterior: "#tenant-addslice-interior",
-    tenantEditUsersInterior: "#tenant-edit-users-interior",
-    tenantSSHCommandsInterior: "#tenant-ssh-commands-interior",
+  tenantSliceSelector: '#tenantSliceSelector',
+  tenantSummary: '#tenantSummary',
+  tenantSiteList: '#tenantSiteList',
+  tenantButtons: '#tenantButtons',
+  tenantAddSliceInterior: '#tenant-addslice-interior',
+  tenantEditUsersInterior: '#tenant-edit-users-interior',
+  tenantSSHCommandsInterior: '#tenant-ssh-commands-interior',
 });
 
 XOSTenantApp.setDirty = function(dirty) {
-    XOSTenantApp.dirty = dirty;
-    if (dirty) {
-        $("button.btn-tenant-save").addClass("btn-success");
-    } else {
-        $("button.btn-tenant-save").removeClass("btn-success");
-    }
+  XOSTenantApp.dirty = dirty;
+  if (dirty) {
+    $('button.btn-tenant-save').addClass('btn-success');
+  }
+  else {
+    $('button.btn-tenant-save').removeClass('btn-success');
+  }
 };
 
 XOSTenantApp.buildViews = function() {
-     XOSTenantApp.tenantSites = new XOSTenantSiteCollection();
+  XOSTenantApp.tenantSites = new XOSTenantSiteCollection();
 
-     tenantSummaryClass = XOSTenantSummaryView.extend({template: "#xos-detail-template",
-                                                app: XOSTenantApp,
-                                                detailFields: ["serviceClass", "default_image", "default_flavor", "network_ports"],
-                                                fieldDisplayNames: {serviceClass: "Service Level", "default_flavor": "Flavor", "default_image": "Image", "mount_data_sets": "Data Sets"},
-                                                helpText: {"serviceClass": "Existing instances will be re-instantiated if changed",
-                                                           "default_image": "Existing instances will be re-instantiated if changed",
-                                                           "default_flavor": "Existing instances will be re-instantiated if changed"},
+  tenantSummaryClass = XOSTenantSummaryView.extend({
+    template: '#xos-detail-template',
+    app: XOSTenantApp,
+    detailFields: ['serviceClass', 'default_image', 'default_flavor', 'network_ports'],
+    fieldDisplayNames: {
+      serviceClass: 'Service Level',
+      default_flavor: 'Flavor',
+      default_image: 'Image',
+      mount_data_sets: 'Data Sets'
+    },
+    helpText: {
+      'serviceClass': 'Existing instances will be re-instantiated if changed',
+      'default_image': 'Existing instances will be re-instantiated if changed',
+      'default_flavor': 'Existing instances will be re-instantiated if changed'
+    },
+    onShow: function() {
+      // the slice selector is in a different table, so make every label cell the maximal width
+      make_same_width('#xos-tenant-view-panel', '.xos-label-cell');
+    },
+  });
 
-                                                onShow: function() {
-                                                    // the slice selector is in a different table, so make every label cell the maximal width
-                                                    make_same_width("#xos-tenant-view-panel", ".xos-label-cell");
-                                                },
-                                                });
+  XOSTenantApp.tenantSummaryView = tenantSummaryClass;
 
-     XOSTenantApp.tenantSummaryView = tenantSummaryClass;
+  tenantAddClass = XOSDetailView.extend({
+    template: '#xos-detail-template',
+    app: XOSTenantApp,
+    detailFields: ['name', 'description']
+  });
 
-     tenantAddClass = XOSDetailView.extend({template: "#xos-detail-template",
-                                                app: XOSTenantApp,
-                                                detailFields: ["name", "description"]});
+  XOSTenantApp.tenantAddView = tenantAddClass;
 
-     XOSTenantApp.tenantAddView = tenantAddClass;
+  tenantSiteItemClass = XOSItemView.extend({
+    template: '#xos-listitem-template',
+    app: XOSTenantApp
+  });
 
-     tenantSiteItemClass = XOSItemView.extend({template: "#xos-listitem-template",
-                                               app: XOSTenantApp});
+  XOSTenantApp.tenantSiteItemView = tenantSiteItemClass;
 
-     XOSTenantApp.tenantSiteItemView = tenantSiteItemClass;
+  tenantSiteListClass = XOSDataTableView.extend({
+    template: '#xos-list-template',
+    app: XOSTenantApp,
+    childView: tenantSiteItemClass,
+    collection: XOSTenantApp.tenantSites,
+    title: 'sites',
+    inputType: {allocated: 'spinner'},
+    noDeleteColumn: true,
+    disablePaginate: true,
+    disableFilter: true,
+    fieldDisplayNames: {name: 'Site'},
+  });
 
-     tenantSiteListClass = XOSDataTableView.extend({template: "#xos-list-template",
-                                               app: XOSTenantApp,
-                                               childView: tenantSiteItemClass,
-                                               collection: XOSTenantApp.tenantSites,
-                                               title: "sites",
-                                               inputType: {allocated: "spinner"},
-                                               noDeleteColumn: true,
-                                               disablePaginate: true,
-                                               disableFilter: true,
-                                               fieldDisplayNames: {"name": "Site"},
-                                               });
+  XOSTenantApp.tenantSiteListView = tenantSiteListClass;
 
-     XOSTenantApp.tenantSiteListView = tenantSiteListClass;
+  XOSTenantApp.tenantSliceSelectorView = SliceSelectorView.extend({
+    sliceChanged: function(id) {
+      XOSTenantApp.navToSlice(id);
+    },
+    filter: function(slice) {
+      return slice.attributes.current_user_can_see;
+    },
+  });
 
-     XOSTenantApp.tenantSliceSelectorView = SliceSelectorView.extend( {
-         sliceChanged: function(id) {
-             XOSTenantApp.navToSlice(id);
-         },
-         filter: function(slice) {
-             return slice.attributes.current_user_can_see;
-         },
-     });
-
-     xos.sites.fetch();
-     xos.slicesPlus.fetch();
-     xos.tenantview.fetch();
+  xos.sites.fetch();
+  xos.slicesPlus.fetch();
+  xos.tenantview.fetch();
 };
 
 make_choices = function(list_of_names, list_of_values) {
-    result = [];
-    if (!list_of_values) {
-        for (index in list_of_names) {
-            displayName = list_of_names[index];
-            result.push( [displayName, displayName] );
-        }
-    } else {
-        for (index in list_of_names) {
-            displayName = list_of_names[index];
-            id = list_of_values[index];
-            result.push( [displayName, id] );
-        }
+  var result = [];
+  var displayName;
+
+  if (!list_of_values) {
+    for (var index in list_of_names) {
+      displayName = list_of_names[index];
+      result.push([displayName, displayName]);
     }
-    return result;
+  }
+  else {
+    for (var index in list_of_names) {
+      displayName = list_of_names[index];
+      id = list_of_values[index];
+      result.push([displayName, id]);
+    }
+  }
+  return result;
 };
 
 XOSTenantApp.navToSlice = function(id) {
-    XOSTenantApp.viewSlice(xos.slicesPlus.get(id));
+  XOSTenantApp.viewSlice(xos.slicesPlus.get(id));
 };
 
 XOSTenantApp.adjustCollectionField = function(collectionName, id, fieldName, amount) {
-    model = XOSTenantApp[collectionName].get(id);
-    model.set(fieldName, Math.max(model.get(fieldName) + amount, 0));
-    XOSTenantApp.setDirty(true);
+  model = XOSTenantApp[collectionName].get(id);
+  model.set(fieldName, Math.max(model.get(fieldName) + amount, 0));
+  XOSTenantApp.setDirty(true);
 };
 
 XOSTenantApp.addSlice = function() {
-    var app=this;
+  var app = this;
 
-    if (!xos.tenant().current_user_can_create_slice) {
-        window.alert("You do not have sufficient rights to create a slice on your site");
-        return;
+  if (!xos.tenant().current_user_can_create_slice) {
+    window.alert('You do not have sufficient rights to create a slice on your site');
+    return;
+  }
+
+  model = new xos.slicesPlus.model({
+    site: xos.tenant().current_user_site_id,
+    name: xos.tenant().current_user_login_base + '_',
+    creator: xos.tenant().current_user_id
+  });
+
+  var detailView = new XOSTenantApp.tenantAddView({
+    model: model,
+    collection: xos.slicesPlus,
+    noSubmitButton: true,
+  });
+
+  detailView.dialog = $('#tenant-addslice-dialog');
+  app.tenantAddSliceInterior.show(detailView);
+
+  $('#tenant-addslice-dialog').dialog({
+    autoOpen: false,
+    modal: true,
+    width: 640,
+    buttons: {
+      'Create Slice': function() {
+        var addDialog = this;
+
+        detailView.synchronous = true;
+        detailView.afterSave = function() {
+          $(addDialog).dialog('close');
+          XOSTenantApp.navToSlice(detailView.model.id);
+        };
+        detailView.save();
+      },
+      'Cancel': function() {
+        $(this).dialog('close');
+      }
     }
-
-    model = new xos.slicesPlus.model({site: xos.tenant().current_user_site_id,
-                                      name: xos.tenant().current_user_login_base + "_",
-                                      creator: xos.tenant().current_user_id});
-    console.log(model);
-    var detailView = new XOSTenantApp.tenantAddView({model: model,
-                                                     collection: xos.slicesPlus,
-                                                     noSubmitButton: true,
-                                                    });
-    detailView.dialog = $("#tenant-addslice-dialog");
-    app.tenantAddSliceInterior.show(detailView);
-    $("#tenant-addslice-dialog").dialog({
-       autoOpen: false,
-       modal: true,
-       width: 640,
-       buttons : {
-            "Create Slice" : function() {
-              var addDialog = this;
-              console.log("SAVE!!!");
-              detailView.synchronous = true;
-              detailView.afterSave = function() { $(addDialog).dialog("close"); XOSTenantApp.navToSlice(detailView.model.id); }
-              detailView.save();
-            },
-            "Cancel" : function() {
-              $(this).dialog("close");
-            }
-          }
-        });
-    $("#tenant-addslice-dialog").dialog("open");
+  });
+  $('#tenant-addslice-dialog').dialog('open');
 };
 
 XOSTenantApp.editUsers = function(model) {
-    var app=this;
-    var detailView = new XOSEditUsersView({model: model, collection: xos.slicesPlus});
-    detailView.dialog = $("#tenant-edit-users-dialog");
-    app.tenantEditUsersInterior.show(detailView);
-    $("#tenant-edit-users-dialog").dialog({
-       autoOpen: false,
-       modal: true,
-       width: 640,
-       buttons : {
-            "Ok" : function() {
-              var editDialog = this;
-              user_ids = all_options($("#tenant-edit-users-dialog").find(".select-picker-to"));
-              user_ids = user_ids.map( function(x) { return parseInt(x,10); } );
-              if (!array_same_elements(user_ids, model.usersBuffer)) {
-                  XOSTenantApp.setDirty(true);
-              }
-              model.usersBuffer = user_ids;
-              $(editDialog).dialog("close");
-            },
-            "Cancel" : function() {
-              $(this).dialog("close");
-            }
-          }
+  var app = this;
+  var detailView = new XOSEditUsersView({model: model, collection: xos.slicesPlus});
+
+  detailView.dialog = $('#tenant-edit-users-dialog');
+  app.tenantEditUsersInterior.show(detailView);
+
+  $('#tenant-edit-users-dialog').dialog({
+    autoOpen: false,
+    modal: true,
+    width: 640,
+    buttons: {
+      'Ok': function() {
+        var editDialog = this;
+        var user_ids = all_options($('#tenant-edit-users-dialog').find('.select-picker-to'));
+
+        user_ids = user_ids.map(function(x) {
+          return parseInt(x,10);
         });
-    $("#tenant-edit-users-dialog").dialog("open");
+
+        if (!array_same_elements(user_ids, model.usersBuffer)) {
+          XOSTenantApp.setDirty(true);
+        }
+        model.usersBuffer = user_ids;
+        $(editDialog).dialog('close');
+      },
+      'Cancel': function() {
+        $(this).dialog('close');
+      }
+    }
+  });
+  $('#tenant-edit-users-dialog').dialog('open');
 };
 
 XOSTenantApp.downloadSSH = function(model) {
-    var sshCommands = "";
-    for (index in model.attributes.sliceInfo.sshCommands) {
-         sshCommand = model.attributes.sliceInfo.sshCommands[index];
-         sshCommands = sshCommands + sshCommand + "\n";
+  var sshCommands = '';
+
+  for (index in model.attributes.sliceInfo.sshCommands) {
+    sshCommand = model.attributes.sliceInfo.sshCommands[index];
+    sshCommands = sshCommands + sshCommand + '\n';
+  }
+
+  if (sshCommands.length == 0) {
+    alert('this slice has no instantiated instances yet');
+    return;
+  }
+
+  var htmlView = new HTMLView({
+    html: '<pre style="overflow: auto; word-wrap: normal; white-space: pre; word-wrap: normal;">' +
+      sshCommands + '</pre>'
+  });
+
+  XOSTenantApp.tenantSSHCommandsInterior.show(htmlView);
+
+  $('#tenant-ssh-commands-dialog').dialog({
+    autoOpen: false,
+    modal: true,
+    width: 640,
+    buttons: {
+      'Download': function() {
+        var dlLink = document.createElement('a');
+
+        dlLink.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(sshCommands));
+        dlLink.setAttribute('download', 'sshcommands.txt');
+        dlLink.click();
+
+        //window.open('data:text/text,' + encodeURIComponent(sshCommands));
+      },
+      'Close': function() {
+        $(this).dialog('close');
+      },
     }
-
-    if (sshCommands.length == 0) {
-         alert("this slice has no instantiated instances yet");
-         return;
-    }
-
-    var htmlView = new HTMLView({html: '<pre style="overflow: auto; word-wrap: normal; white-space: pre; word-wrap: normal;">' + sshCommands + '</pre>'});
-    XOSTenantApp.tenantSSHCommandsInterior.show(htmlView);
-
-    $("#tenant-ssh-commands-dialog").dialog({
-       autoOpen: false,
-       modal: true,
-       width: 640,
-       buttons : {
-            "Download": function() {
-                var dlLink = document.createElement('a');
-                dlLink.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(sshCommands));
-                dlLink.setAttribute('download', 'sshcommands.txt');
-                dlLink.click();
-
-                //window.open('data:text/text,' + encodeURIComponent(sshCommands));
-            },
-            "Close" : function() {
-              $(this).dialog("close");
-            },
-          }
-        });
-    $("#tenant-ssh-commands-dialog").dialog("open");
+  });
+  $('#tenant-ssh-commands-dialog').dialog('open');
 };
 
 XOSTenantApp.deleteSlice = function(model) {
-    var app=this;
-    app.deleteDialog(model, function() { console.log("afterDelete"); app.viewSlice(undefined); });
+  var app = this;
+
+  app.deleteDialog(model, function() {
+    app.viewSlice(undefined);
+  });
 };
 
 XOSTenantApp.viewSlice = function(model) {
-    if (XOSTenantApp.dirty) {
-        if (!confirm("The current instance has unsaved data -- view new instance anyway ?")) {
-            $("#tenantSliceSelector select").val(XOSTenantApp.currentSlice.id);
-            return;
-        }
+  if (XOSTenantApp.dirty) {
+    if (!confirm('The current instance has unsaved data -- view new instance anyway ?')) {
+      $('#tenantSliceSelector select').val(XOSTenantApp.currentSlice.id);
+      return;
     }
+  }
 
-    XOSTenantApp.setDirty(false);
+  XOSTenantApp.setDirty(false);
 
-    if (!model && xos.slicesPlus.models.length > 0) {
-        model = xos.slicesPlus.models[0];
-    }
+  if (!model && xos.slicesPlus.models.length > 0) {
+    model = xos.slicesPlus.models[0];
+  }
 
-    if (model) {
-        sliceSelector = new XOSTenantApp.tenantSliceSelectorView({collection: xos.slicesPlus,
-                                                                  selectedID: model ? model.id : null,
-                                                                 } );
-        XOSTenantApp.sliceSelector = sliceSelector;
-        XOSTenantApp.tenantSliceSelector.show(sliceSelector);
+  if (model) {
+    sliceSelector = new XOSTenantApp.tenantSliceSelectorView({
+      collection: xos.slicesPlus,
+      selectedID: model ? model.id : null,
+    });
 
-        tenantSummary = new XOSTenantApp.tenantSummaryView({model: model,
-                                                            choices: {mount_data_sets: make_choices(xos.tenant().public_volume_names, null),
-                                                                      serviceClass: make_choices(xos.tenant().blessed_service_class_names, xos.tenant().blessed_service_classes),
-                                                                      default_image: make_choices(xos.tenant().blessed_image_names, xos.tenant().blessed_images),
-                                                                      default_flavor: make_choices(xos.tenant().blessed_flavor_names, xos.tenant().blessed_flavors),},
-                                                           });
-        XOSTenantApp.tenantSummary.show(tenantSummary);
+    XOSTenantApp.sliceSelector = sliceSelector;
+    XOSTenantApp.tenantSliceSelector.show(sliceSelector);
 
-        tenantSites = new XOSTenantSiteCollection();
-        tenantSites.getFromSlice(model);
-        model.usersBuffer = model.attributes.users; /* save a copy of 'users' that we can edit. This prevents another view (developer) from overwriting our copy with a fetch from the server */
-        model.usersOrig = model.attributes.users;   /* save an immutable copy that we'll use for username lookups */
-        model.user_namesOrig = model.attributes.user_names;
-        model.tenantSiteCollection = tenantSites;
-        XOSTenantApp.tenantSites = tenantSites;
+    tenantSummary = new XOSTenantApp.tenantSummaryView({
+      model: model,
+      choices: {
+        mount_data_sets: make_choices(xos.tenant().public_volume_names, null),
+        serviceClass: make_choices(xos.tenant().blessed_service_class_names, xos.tenant().blessed_service_classes),
+        default_image: make_choices(xos.tenant().blessed_image_names, xos.tenant().blessed_images),
+        default_flavor: make_choices(xos.tenant().blessed_flavor_names, xos.tenant().blessed_flavors)
+      },
+    });
 
-        tenantSiteList = new XOSTenantApp.tenantSiteListView({collection: tenantSites });
-        XOSTenantApp.tenantSiteList.show(tenantSiteList);
-        // on xos.slicePlus.sort, need to update xostenantapp.tenantSites
+    XOSTenantApp.tenantSummary.show(tenantSummary);
 
-        XOSTenantApp.tenantButtons.show( new XOSTenantButtonView( { app: XOSTenantApp,
-                                                                    linkedView: tenantSummary } ) );
+    tenantSites = new XOSTenantSiteCollection();
+    tenantSites.getFromSlice(model);
+    model.usersBuffer = model.attributes.users; /* save a copy of 'users' that we can edit. This prevents another view (developer) from overwriting our copy with a fetch from the server */
+    model.usersOrig = model.attributes.users;   /* save an immutable copy that we'll use for username lookups */
+    model.user_namesOrig = model.attributes.user_names;
+    model.tenantSiteCollection = tenantSites;
+    XOSTenantApp.tenantSites = tenantSites;
 
-        XOSTenantApp.currentSlice = model;
-    } else {
-        XOSTenantApp.tenantSliceSelector.show(new HTMLView({html: ""}));
-        XOSTenantApp.tenantSummary.show(new HTMLView({html: "You have no slices"}));
-        XOSTenantApp.tenantSiteList.show(new HTMLView({html: ""}));
-        XOSTenantApp.tenantButtons.show( new XOSTenantButtonView( { template: "#xos-tenant-buttons-noslice-template",
-                                                                    app: XOSTenantApp,
-                                                                    linkedView: tenantSummary } ) );
-    }
+    tenantSiteList = new XOSTenantApp.tenantSiteListView({collection: tenantSites});
+    XOSTenantApp.tenantSiteList.show(tenantSiteList);
+    // on xos.slicePlus.sort, need to update xostenantapp.tenantSites
+
+    XOSTenantApp.tenantButtons.show(
+      new XOSTenantButtonView({
+        app: XOSTenantApp,
+        linkedView: tenantSummary
+      })
+    );
+
+    XOSTenantApp.currentSlice = model;
+  }
+  else {
+    XOSTenantApp.tenantSliceSelector.show(new HTMLView({html: ''}));
+    XOSTenantApp.tenantSummary.show(new HTMLView({html: 'You have no slices'}));
+    XOSTenantApp.tenantSiteList.show(new HTMLView({html: ''}));
+    XOSTenantApp.tenantButtons.show(
+      new XOSTenantButtonView({
+        template: '#xos-tenant-buttons-noslice-template',
+        app: XOSTenantApp,
+        linkedView: tenantSummary
+      })
+    );
+  }
 };
 
 XOSTenantApp.sanityCheck = function() {
-    errors = [];
-    if (xos.tenant().blessed_deployments && xos.tenant().blessed_deployments.length == 0) {
-        errors.push("no blessed deployments");
-    }
-    if (xos.tenant().blessed_service_classes.length == 0) {
-        errors.push("no blessed service classes");
-    }
-    if (xos.tenant().blessed_flavors.length == 0) {
-        errors.push("no blessed flavors");
-    }
-    if (xos.tenant().blessed_images.length == 0) {
-        errors.push("no blessed images");
-    }
-    if (xos.tenant().blessed_sites.length == 0) {
-        errors.push("no blessed sites");
-    }
-    if (xos.tenant().current_user_site_id == null) {
-        errors.push("current user does not have a site");
-    }
+  errors = [];
+  if (xos.tenant().blessed_deployments && xos.tenant().blessed_deployments.length == 0) {
+    errors.push('no blessed deployments');
+  }
+  if (xos.tenant().blessed_service_classes.length == 0) {
+    errors.push('no blessed service classes');
+  }
+  if (xos.tenant().blessed_flavors.length == 0) {
+    errors.push('no blessed flavors');
+  }
+  if (xos.tenant().blessed_images.length == 0) {
+    errors.push('no blessed images');
+  }
+  if (xos.tenant().blessed_sites.length == 0) {
+    errors.push('no blessed sites');
+  }
+  if (xos.tenant().current_user_site_id == null) {
+    errors.push('current user does not have a site');
+  }
 
-    if (errors.length > 0) {
-         t = templateFromId("#tenant-sanity-check")
-         $("#tenantSummary").html( t({errors: errors, blessed_deployment_names: xos.tenant().blessed_deployment_names}) );
-         return false;
-    }
+  if (errors.length > 0) {
+    t = templateFromId('#tenant-sanity-check');
+    $('#tenantSummary').html(t({
+      errors: errors,
+      blessed_deployment_names:
+      xos.tenant().blessed_deployment_names
+    }));
+    return false;
+  }
 
-    return true;
-}
-
-XOSTenantApp.collectionLoadChange = function() {
-    stats = xos.getCollectionStatus();
-
-    if (!XOSTenantApp.navigationStarted) {
-        if (stats["isLoaded"] + stats["failedLoad"] >= stats["startedLoad"]) {
-            if (XOSTenantApp.sanityCheck()) {
-                XOSTenantApp.viewSlice(undefined);
-            }
-        } else {
-            $("#tenantSummary").html("<h3>Loading...</h3><div id='xos-startup-progress'></div>");
-            $("#xos-startup-progress").progressbar({value: stats["completedLoad"], max: stats["startedLoad"]});
-        }
-    }
+  return true;
 };
 
-XOSTenantApp.on("start", function() {
-     XOSTenantApp.buildViews();
+XOSTenantApp.collectionLoadChange = function() {
+  stats = xos.getCollectionStatus();
 
-     // fire it once to initially show the progress bar
-     XOSTenantApp.collectionLoadChange();
+  if (!XOSTenantApp.navigationStarted) {
+    if (stats['isLoaded'] + stats['failedLoad'] >= stats['startedLoad']) {
+      if (XOSTenantApp.sanityCheck()) {
+        XOSTenantApp.viewSlice(undefined);
+      }
+    }
+    else {
+      $('#tenantSummary').html('<h3>Loading...</h3><div id="xos-startup-progress"></div>');
+      $('#xos-startup-progress').progressbar({value: stats['completedLoad'], max: stats['startedLoad']});
+    }
+  }
+};
 
-     // fire it each time the collection load status is updated
-     Backbone.on("xoslib:collectionLoadChange", XOSTenantApp.collectionLoadChange);
+XOSTenantApp.on('start', function() {
+  XOSTenantApp.buildViews();
+
+  // fire it once to initially show the progress bar
+  XOSTenantApp.collectionLoadChange();
+
+  // fire it each time the collection load status is updated
+  Backbone.on('xoslib:collectionLoadChange', XOSTenantApp.collectionLoadChange);
 });
 
-$(document).ready(function(){
-    XOSTenantApp.start();
+$(document).ready(function() {
+  XOSTenantApp.start();
 });
 /* eslint-enable */
