diff --git a/planetstack/core/xoslib/static/js/xoslib/xosHelper.js b/planetstack/core/xoslib/static/js/xoslib/xosHelper.js
index 019bae9..46bc522 100644
--- a/planetstack/core/xoslib/static/js/xoslib/xosHelper.js
+++ b/planetstack/core/xoslib/static/js/xoslib/xosHelper.js
@@ -383,7 +383,7 @@
             submitContinueClicked: function(e) {
                 console.log("saveContinue");
                 e.preventDefault();
-                this.afterSave = function() {};
+                this.afterSave = function() { };
                 this.save();
             },
 
@@ -486,6 +486,10 @@
 
                     tabs.push({name: "details", region: "detail"});
 
+                    makeFilter = function(relatedField, relatedId) {
+                        return function(model) { return model.attributes[relatedField] == relatedId; }
+                    };
+
                     var index=0;
                     for (relatedName in this.model.collection.relatedCollections) {
                         var relatedField = this.model.collection.relatedCollections[relatedName];
@@ -495,7 +499,7 @@
                         relatedListViewClassName = relatedName + "ListView";
                         assert(this.app[relatedListViewClassName] != undefined, relatedListViewClassName + " not found");
                         relatedListViewClass = this.app[relatedListViewClassName].extend({collection: xos[relatedName],
-                                                                                          filter: function(model) { return model.attributes[relatedField]==relatedId;},
+                                                                                          filter: makeFilter(relatedField, relatedId), //function(model) { return model.attributes[relatedField]==relatedId; },
                                                                                           parentModel: this.model});
                         this.app[regionName].show(new relatedListViewClass());
                         if (this.app.hideTabsByDefault) {
@@ -619,16 +623,17 @@
 
              getAddChildHash: function() {
                 if (this.parentModel) {
-                    // Find the field name in the model that should point to
-                    // the parent object. For example, when adding a sliver, the
-                    // fieldName that should point to 'users' is 'creator'.
-                    parentFieldName = "unknown";
+                    parentFieldName = this.parentModel.relatedCollections[this.collection.collectionName];
+                    parentFieldName = parentFieldName || "unknown";
+
+                    /*parentFieldName = "unknown";
+
                     for (fieldName in this.collection.foreignFields) {
                         cname = this.collection.foreignFields[fieldName];
                         if (cname = this.collection.collectionName) {
                             parentFieldName = fieldName;
                         }
-                    }
+                    }*/
                     return "#addChild" + firstCharUpper(this.collection.modelName) + "/" + this.parentModel.modelName + "/" + parentFieldName + "/" + this.parentModel.id; // modelName, fieldName, id
                 } else {
                     return null;
