diff --git a/planetstack/core/xoslib/static/js/xoslib/xosHelper.js b/planetstack/core/xoslib/static/js/xoslib/xosHelper.js
index d9e23a6..ca7a5bf 100644
--- a/planetstack/core/xoslib/static/js/xoslib/xosHelper.js
+++ b/planetstack/core/xoslib/static/js/xoslib/xosHelper.js
@@ -30,22 +30,22 @@
 
     confirmDialog: function(view, event, callback) {
         $("#xos-confirm-dialog").dialog({
-           autoOpen: false,
-           modal: true,
-           buttons : {
-                "Confirm" : function() {
-                  $(this).dialog("close");
-                  if (event) {
-                      view.trigger(event);
-                  }
-                  if (callback) {
-                      callback();
-                  }
-                },
-                "Cancel" : function() {
-                  $(this).dialog("close");
-                }
-              }
+           autoOpen: false,
+           modal: true,
+           buttons : {
+                "Confirm" : function() {
+                  $(this).dialog("close");
+                  if (event) {
+                      view.trigger(event);
+                  }
+                  if (callback) {
+                      callback();
+                  }
+                },
+                "Cancel" : function() {
+                  $(this).dialog("close");
+                }
+              }
             });
         $("#xos-confirm-dialog").dialog("open");
     },
@@ -76,61 +76,61 @@
 
     hideLinkedItems: function(result) {
         var index=0;
-        while (index<4) {
-            this["linkedObjs" + (index+1)].empty();
-            index = index + 1;
-        }
-    },
-
-    listViewShower: function(listViewName, collection_name, regionName, title) {
-        var app=this;
-        return function() {
-            app[regionName].show(new app[listViewName]);
-            app.hideLinkedItems();
-            $("#contentTitle").html(templateFromId("#xos-title-list")({"title": title}));
-            $("#detail").show();
-            $("#xos-listview-button-box").show();
-            $("#tabs").hide();
-            $("#xos-detail-button-box").hide();
-        }
-    },
-
-    addShower: function(detailName, collection_name, regionName, title) {
-        var app=this;
-        return function() {
-            model = new xos[collection_name].model();
-            detailViewClass = app[detailName];
-            detailView = new detailViewClass({model: model, collection:xos[collection_name]});
-            app[regionName].show(detailView);
-            $("#xos-detail-button-box").show();
-            $("#xos-listview-button-box").hide();
-        }
-    },
-
-    detailShower: function(detailName, collection_name, regionName, title) {
-        var app=this;
-        showModelId = function(model_id) {
-            $("#contentTitle").html(templateFromId("#xos-title-detail")({"title": title}));
-
-            collection = xos[collection_name];
-            model = collection.get(model_id);
-            if (model == undefined) {
-                app[regionName].show(new HTMLView({html: "failed to load object " + model_id + " from collection " + collection_name}));
-            } else {
-                detailViewClass = app[detailName];
-                detailView = new detailViewClass({model: model});
-                app[regionName].show(detailView);
-                detailView.showLinkedItems();
-                $("#xos-detail-button-box").show();
-                $("#xos-listview-button-box").hide();
-            }
-        }
-        return showModelId;
-    },
-
-    /* error handling callbacks */
-
-    hideError: function() {
+        while (index<4) {
+            this["linkedObjs" + (index+1)].empty();
+            index = index + 1;
+        }
+    },
+
+    listViewShower: function(listViewName, collection_name, regionName, title) {
+        var app=this;
+        return function() {
+            app[regionName].show(new app[listViewName]);
+            app.hideLinkedItems();
+            $("#contentTitle").html(templateFromId("#xos-title-list")({"title": title}));
+            $("#detail").show();
+            $("#xos-listview-button-box").show();
+            $("#tabs").hide();
+            $("#xos-detail-button-box").hide();
+        }
+    },
+
+    addShower: function(detailName, collection_name, regionName, title) {
+        var app=this;
+        return function() {
+            model = new xos[collection_name].model();
+            detailViewClass = app[detailName];
+            detailView = new detailViewClass({model: model, collection:xos[collection_name]});
+            app[regionName].show(detailView);
+            $("#xos-detail-button-box").show();
+            $("#xos-listview-button-box").hide();
+        }
+    },
+
+    detailShower: function(detailName, collection_name, regionName, title) {
+        var app=this;
+        showModelId = function(model_id) {
+            $("#contentTitle").html(templateFromId("#xos-title-detail")({"title": title}));
+
+            collection = xos[collection_name];
+            model = collection.get(model_id);
+            if (model == undefined) {
+                app[regionName].show(new HTMLView({html: "failed to load object " + model_id + " from collection " + collection_name}));
+            } else {
+                detailViewClass = app[detailName];
+                detailView = new detailViewClass({model: model});
+                app[regionName].show(detailView);
+                detailView.showLinkedItems();
+                $("#xos-detail-button-box").show();
+                $("#xos-listview-button-box").hide();
+            }
+        }
+        return showModelId;
+    },
+
+    /* error handling callbacks */
+
+    hideError: function() {
         if (this.logWindowId) {
         } else {
             $(this.errorBoxId).hide();
@@ -150,9 +150,9 @@
                  $(that.successBoxId).hide();
              });
          }
-    },
-
-    showError: function(result) {
+    },
+
+    showError: function(result) {
          result["statusclass"] = "failure";
          if (this.logTableId) {
              this.appendLogWindow(result);
@@ -166,9 +166,9 @@
                  $(that.errorBoxId).hide();
              });
          }
-    },
-
-    showInformational: function(result) {
+    },
+
+    showInformational: function(result) {
          result["statusclass"] = "inprog";
          if (this.logTableId) {
              return this.appendLogWindow(result);
@@ -206,43 +206,44 @@
         limitTableRows(this.logTableId, 5);
 
         return logMessageId;
-    },
-
-    saveError: function(model, result, xhr, infoMsgId) {
-        console.log("saveError");
-        result["what"] = "save " + model.modelName + " " + model.attributes.humanReadableName;
-        result["infoMsgId"] = infoMsgId;
-        this.showError(result);
-    },
-
-    saveSuccess: function(model, result, xhr, infoMsgId, addToCollection) {
-        console.log("saveSuccess");
-        if (addToCollection) {
-            addToCollection.add(model);
-            addToCollection.sort();
-        }
-        result = {status: xhr.xhr.status, statusText: xhr.xhr.statusText};
-        result["what"] = "save " + model.modelName + " " + model.attributes.humanReadableName;
-        result["infoMsgId"] = infoMsgId;
-        this.showSuccess(result);
+    },
+
+    saveError: function(model, result, xhr, infoMsgId) {
+        console.log("saveError");
+        result["what"] = "save " + model.modelName + " " + model.attributes.humanReadableName;
+        result["infoMsgId"] = infoMsgId;
+        this.showError(result);
+    },
+
+    saveSuccess: function(model, result, xhr, infoMsgId, addToCollection) {
+        console.log("saveSuccess");
+        if (addToCollection) {
+            addToCollection.add(model);
+            addToCollection.sort();
+        }
+        result = {status: xhr.xhr.status, statusText: xhr.xhr.statusText};
+        result["what"] = "save " + model.modelName + " " + model.attributes.humanReadableName;
+        result["infoMsgId"] = infoMsgId;
+        this.showSuccess(result);
     },
 
     destroyError: function(model, result, xhr, infoMsgId) {
-        result["what"] = "destroy " + model.modelName + " " + model.attributes.humanReadableName;
-        result["infoMsgId"] = infoMsgId;
-        this.showError(result);
-    },
-
-    destroySuccess: function(model, result, xhr, infoMsgId) {
-        result = {status: xhr.xhr.status, statusText: xhr.xhr.statusText};
-        result["what"] = "destroy " + model.modelName + " " + model.attributes.humanReadableName;
-        result["infoMsgId"] = infoMsgId;
-        this.showSuccess(result);
-    },
-
-    /* end error handling callbacks */
-
-    destroyModel: function(model) {
+        result["what"] = "destroy " + model.modelName + " " + model.attributes.humanReadableName;
+        result["infoMsgId"] = infoMsgId;
+        this.showError(result);
+    },
+
+    destroySuccess: function(model, result, xhr, infoMsgId) {
+        result = {status: xhr.xhr.status, statusText: xhr.xhr.statusText};
+        result["what"] = "destroy " + model.modelName + " " + model.attributes.humanReadableName;
+        result["infoMsgId"] = infoMsgId;
+        this.showSuccess(result);
+    },
+
+    /* end error handling callbacks */
+
+    destroyModel: function(model) {
+         //console.log("destroyModel"); console.log(model);
          this.hideError();
          var infoMsgId = this.showInformational( {what: "destroy " + model.modelName + " " + model.attributes.humanReadableName, status: "", statusText: "in progress..."} );
          var that = this;
@@ -252,7 +253,9 @@
 
     deleteDialog: function(model, navToListAfterDelete) {
         var that=this;
-        this.confirmDialog(this, callback=function() {
+        //console.log("deleteDialog"); console.log(model);
+        this.confirmDialog(null, null, function() {
+            //console.log("deleteConfirm"); console.log(model);
             modelName = model.modelName;
             that.destroyModel(model);
             if (navToListAfterDelete) {
@@ -262,7 +265,7 @@
         });
     },
 });
-
+
 /* XOSDetailView
       extend with:
          app - MarionetteApplication
@@ -278,20 +281,20 @@
                      "click button.btn-xos-delete": "deleteClicked",
                      "change input": "inputChanged"},
 
-            initialize: function() {
+            /*initialize: function() {
                 this.on('deleteConfirmed', this.deleteConfirmed);
-            },
+            },*/
 
             /* inputChanged is watching the onChange events of the input controls. We
-               do this to track when this view is 'dirty', so we can throw up a warning
-               if the user tries to change his slices without saving first.
-            */
-
-            inputChanged: function(e) {
-                this.dirty = true;
-            },
-
-            submitContinueClicked: function(e) {
+               do this to track when this view is 'dirty', so we can throw up a warning
+               if the user tries to change his slices without saving first.
+            */
+
+            inputChanged: function(e) {
+                this.dirty = true;
+            },
+
+            submitContinueClicked: function(e) {
                 console.log("saveContinue");
                 e.preventDefault();
                 this.save();
@@ -313,37 +316,37 @@
 
             save: function() {
                 this.app.hideError();
-                var data = Backbone.Syphon.serialize(this);
-                var that = this;
-                var isNew = !this.model.id;
-
-                this.$el.find(".help-inline").remove();
-
-                /* although model.validate() is called automatically by
-                   model.save, we call it ourselves, so we can throw up our
-                   validation error before creating the infoMsg in the log
-                */
-                errors =  this.model.xosValidate(data);
-                if (errors) {
-                    this.onFormDataInvalid(errors);
-                    return;
-                }
-
-                if (isNew) {
-                    this.model.attributes.humanReadableName = "new " + model.modelName;
-                    this.model.addToCollection = this.collection;
-                } else {
-                    this.model.addToCollection = undefined;
-                }
-
-                var infoMsgId = this.app.showInformational( {what: "save " + model.modelName + " " + model.attributes.humanReadableName, status: "", statusText: "in progress..."} );
-
-                this.model.save(data, {error: function(model, result, xhr) { that.app.saveError(model,result,xhr,infoMsgId);},
-                                       success: function(model, result, xhr) { that.app.saveSuccess(model,result,xhr,infoMsgId);}});
-                this.dirty = false;
+                var data = Backbone.Syphon.serialize(this);
+                var that = this;
+                var isNew = !this.model.id;
+
+                this.$el.find(".help-inline").remove();
+
+                /* although model.validate() is called automatically by
+                   model.save, we call it ourselves, so we can throw up our
+                   validation error before creating the infoMsg in the log
+                */
+                errors =  this.model.xosValidate(data);
+                if (errors) {
+                    this.onFormDataInvalid(errors);
+                    return;
+                }
+
+                if (isNew) {
+                    this.model.attributes.humanReadableName = "new " + model.modelName;
+                    this.model.addToCollection = this.collection;
+                } else {
+                    this.model.addToCollection = undefined;
+                }
+
+                var infoMsgId = this.app.showInformational( {what: "save " + model.modelName + " " + model.attributes.humanReadableName, status: "", statusText: "in progress..."} );
+
+                this.model.save(data, {error: function(model, result, xhr) { that.app.saveError(model,result,xhr,infoMsgId);},
+                                       success: function(model, result, xhr) { that.app.saveSuccess(model,result,xhr,infoMsgId);}});
+                this.dirty = false;
             },
 
-            destroyModel: function() {
+            /*destroyModel: function() {
                  this.app.hideError();
                  var infoMsgId = this.app.showInformational( {what: "destroy " + model.modelName + " " + model.attributes.humanReadableName, status: "", statusText: "in progress..."} );
                  var that = this;
@@ -353,28 +356,33 @@
 
              deleteClicked: function(e) {
                  e.preventDefault();
-                 this.app.confirmDialog(this, "deleteConfirmed");
-             },
-
-             deleteConfirmed: function() {
-                 modelName = this.model.modelName;
-                 this.destroyModel();
-                 this.app.navigate("list", modelName);
-             },
-
+                 this.app.confirmDialog(this, "deleteConfirmed");
+             },
+
+             deleteConfirmed: function() {
+                 modelName = this.model.modelName;
+                 this.destroyModel();
+                 this.app.navigate("list", modelName);
+             }, */
+
+             deleteClicked: function(e) {
+                 e.preventDefault();
+                 this.app.deleteDialog(this.model, true);
+             },
+
             tabClick: function(tabId, regionName) {
-                    region = this.app[regionName];
-                    if (this.currentTabRegion != undefined) {
-                        this.currentTabRegion.$el.hide();
-                    }
-                    if (this.currentTabId != undefined) {
-                        $(this.currentTabId).removeClass('active');
-                    }
-                    this.currentTabRegion = region;
-                    this.currentTabRegion.$el.show();
-
-                    this.currentTabId = tabId;
-                    $(tabId).addClass('active');
+                    region = this.app[regionName];
+                    if (this.currentTabRegion != undefined) {
+                        this.currentTabRegion.$el.hide();
+                    }
+                    if (this.currentTabId != undefined) {
+                        $(this.currentTabId).removeClass('active');
+                    }
+                    this.currentTabRegion = region;
+                    this.currentTabRegion.$el.show();
+
+                    this.currentTabId = tabId;
+                    $(tabId).addClass('active');
             },
 
             showTabs: function(tabs) {
@@ -397,44 +405,44 @@
                     tabs.push({name: "details", region: "detail"});
 
                     var index=0;
-                    for (relatedName in this.model.collection.relatedCollections) {
-                        relatedField = this.model.collection.relatedCollections[relatedName];
-                        regionName = "linkedObjs" + (index+1);
-
-                        relatedListViewClassName = relatedName + "ListView";
-                        assert(this.app[relatedListViewClassName] != undefined, relatedListViewClassName + " not found");
-                        relatedListViewClass = this.app[relatedListViewClassName].extend({collection: xos[relatedName].filterBy(relatedField,this.model.id)});
-                        this.app[regionName].show(new relatedListViewClass());
-                        if (this.app.hideTabsByDefault) {
-                            this.app[regionName].$el.hide();
-                        }
-                        tabs.push({name: relatedName, region: regionName});
-                        index = index + 1;
-                    }
-
-                    while (index<4) {
-                        this.app["linkedObjs" + (index+1)].empty();
-                        index = index + 1;
-                    }
-
-                    this.showTabs(tabs);
-                    this.tabClick('#xos-nav-detail', 'detail');
-              },
-
-            onFormDataInvalid: function(errors) {
-                var self=this;
-                var markErrors = function(value, key) {
-                    console.log("name='" + key + "'");
-                    var $inputElement = self.$el.find("[name='" + key + "']");
-                    var $inputContainer = $inputElement.parent();
-                    //$inputContainer.find(".help-inline").remove();
-                    var $errorEl = $("<span>", {class: "help-inline error", text: value});
-                    $inputContainer.append($errorEl).addClass("error");
-                }
-                _.each(errors, markErrors);
-            },
-
-});
+                    for (relatedName in this.model.collection.relatedCollections) {
+                        relatedField = this.model.collection.relatedCollections[relatedName];
+                        regionName = "linkedObjs" + (index+1);
+
+                        relatedListViewClassName = relatedName + "ListView";
+                        assert(this.app[relatedListViewClassName] != undefined, relatedListViewClassName + " not found");
+                        relatedListViewClass = this.app[relatedListViewClassName].extend({collection: xos[relatedName].filterBy(relatedField,this.model.id)});
+                        this.app[regionName].show(new relatedListViewClass());
+                        if (this.app.hideTabsByDefault) {
+                            this.app[regionName].$el.hide();
+                        }
+                        tabs.push({name: relatedName, region: regionName});
+                        index = index + 1;
+                    }
+
+                    while (index<4) {
+                        this.app["linkedObjs" + (index+1)].empty();
+                        index = index + 1;
+                    }
+
+                    this.showTabs(tabs);
+                    this.tabClick('#xos-nav-detail', 'detail');
+              },
+
+            onFormDataInvalid: function(errors) {
+                var self=this;
+                var markErrors = function(value, key) {
+                    console.log("name='" + key + "'");
+                    var $inputElement = self.$el.find("[name='" + key + "']");
+                    var $inputContainer = $inputElement.parent();
+                    //$inputContainer.find(".help-inline").remove();
+                    var $errorEl = $("<span>", {class: "help-inline error", text: value});
+                    $inputContainer.append($errorEl).addClass("error");
+                }
+                _.each(errors, markErrors);
+            },
+
+});
 
 /* XOSItemView
       This is for items that will be displayed as table rows.
@@ -463,32 +471,32 @@
 */
 
 XOSListView = Marionette.CompositeView.extend({
-             childViewContainer: 'tbody',
-
-             events: {"click button.btn-xos-add": "addClicked",
-                      "click button.btn-xos-refresh": "refreshClicked",
-                     },
-
-             _fetchStateChange: function() {
-                 if (this.collection.fetching) {
-                    $("#xos-list-title-spinner").show();
-                 } else {
-                    $("#xos-list-title-spinner").hide();
-                 }
-             },
-
+             childViewContainer: 'tbody',
+
+             events: {"click button.btn-xos-add": "addClicked",
+                      "click button.btn-xos-refresh": "refreshClicked",
+                     },
+
+             _fetchStateChange: function() {
+                 if (this.collection.fetching) {
+                    $("#xos-list-title-spinner").show();
+                 } else {
+                    $("#xos-list-title-spinner").hide();
+                 }
+             },
+
              addClicked: function(e) {
                 e.preventDefault();
                 this.app.Router.navigate("add" + firstCharUpper(this.collection.modelName), {trigger: true});
              },
-
-             refreshClicked: function(e) {
-                 e.preventDefault();
-                 this.collection.refresh(refreshRelated=true);
-             },
-
-             initialize: function() {
-                 this.listenTo(this.collection, 'change', this._renderChildren)
+
+             refreshClicked: function(e) {
+                 e.preventDefault();
+                 this.collection.refresh(refreshRelated=true);
+             },
+
+             initialize: function() {
+                 this.listenTo(this.collection, 'change', this._renderChildren)
                  this.listenTo(this.collection, 'fetchStateChange', this._fetchStateChange);
 
                  // Because many of the templates use idToName(), we need to
@@ -506,7 +514,7 @@
 
              templateHelpers: function() {
                 return { title: this.title };
-             },
+             },
 });
 
 /* Give an id, the name of a collection, and the name of a field for models
