diff --git a/planetstack/core/xoslib/dashboards/sliverListTest.html b/planetstack/core/xoslib/dashboards/sliverListTest.html
index 2238181..7a5b2d4 100644
--- a/planetstack/core/xoslib/dashboards/sliverListTest.html
+++ b/planetstack/core/xoslib/dashboards/sliverListTest.html
@@ -3,7 +3,7 @@
 
 <script src="{{ STATIC_URL }}/js/underscore-min.js"></script>
 <script src="{{ STATIC_URL }}/js/backbone-min.js"></script>
-<script src="{{ STATIC_URL }}/js/backbone-tastypie.js"></script>
+<script src="{{ STATIC_URL }}/js/xxbackbone-tastypie.js"></script>
 <script src="{{ STATIC_URL }}/js/ICanHaz.min.js"></script>
 
 <script src="{{ STATIC_URL }}/js/xos-backbone.js"></script>
diff --git a/planetstack/core/xoslib/static/js/backbone-tastypie.js b/planetstack/core/xoslib/static/js/backbone-tastypie.js
new file mode 100644
index 0000000..69a4d56
--- /dev/null
+++ b/planetstack/core/xoslib/static/js/backbone-tastypie.js
@@ -0,0 +1,95 @@
+/**
+ * Backbone-tastypie.js 0.1
+ * (c) 2011 Paul Uithol
+ * 
+ * Backbone-tastypie may be freely distributed under the MIT license.
+ * Add or override Backbone.js functionality, for compatibility with django-tastypie.
+ */
+(function( undefined ) {
+	var Backbone = this.Backbone;
+	
+	/**
+	 * Override Backbone's sync function, to do a GET upon receiving a HTTP CREATED.
+	 * This requires 2 requests to do a create, so you may want to use some other method in production.
+	 * Modified from http://joshbohde.com/blog/backbonejs-and-django
+	 */
+	Backbone.oldSync = Backbone.sync;
+	Backbone.sync = function( method, model, options ) {
+		if ( method === 'create' ) {
+			var dfd = new $.Deferred();
+			
+			// Set up 'success' handling
+			dfd.done( options.success );
+			options.success = function( resp, status, xhr ) {
+				// If create is successful but doesn't return a response, fire an extra GET.
+				// Otherwise, resolve the deferred (which triggers the original 'success' callbacks).
+				if ( xhr.status === 201 && !resp ) { // 201 CREATED; response null or empty.
+					var location = xhr.getResponseHeader( 'Location' );
+					return $.ajax( {
+						   url: location,
+						   success: dfd.resolve,
+						   error: dfd.reject
+						});
+				}
+				else {
+					return dfd.resolveWith( options.context || options, [ resp, status, xhr ] );
+				}
+			};
+			
+			// Set up 'error' handling
+			dfd.fail( options.error );
+			options.error = dfd.reject;
+			
+			// Make the request, make it accessibly by assigning it to the 'request' property on the deferred 
+			dfd.request = Backbone.oldSync( method, model, options );
+			return dfd;
+		}
+		
+		return Backbone.oldSync( method, model, options );
+	};
+
+	Backbone.Model.prototype.idAttribute = 'resource_uri';
+	
+	Backbone.Model.prototype.url = function() {
+		// Use the id if possible
+		var url = this.id;
+		
+		// If there's no idAttribute, try to have the collection construct a url. Fallback to 'urlRoot'.
+		if ( !url ) {
+			url = this.collection && ( _.isFunction( this.collection.url ) ? this.collection.url() : this.collection.url );
+			url = url || this.urlRoot;
+		}
+		
+		url && ( url += ( url.length > 0 && url.charAt( url.length - 1 ) === '/' ) ? '' : '/' );
+		
+		return url;
+	};
+	
+	/**
+	 * Return 'data.objects' if it exists and is an array, or else just plain 'data'.
+	 */
+	Backbone.Model.prototype.parse = function( data ) {
+		return data && data.objects && ( _.isArray( data.objects ) ? data.objects[ 0 ] : data.objects ) || data;
+	};
+	
+	Backbone.Collection.prototype.parse = function( data ) {
+		return data && data.objects;
+	};
+	
+	Backbone.Collection.prototype.url = function( models ) {
+		var url = this.urlRoot || ( models && models.length && models[0].urlRoot );
+		url && ( url += ( url.length > 0 && url.charAt( url.length - 1 ) === '/' ) ? '' : '/' );
+		
+		// Build a url to retrieve a set of models. This assume the last part of each model's idAttribute
+		// (set to 'resource_uri') contains the model's id.
+		if ( models && models.length ) {
+			var ids = _.map( models, function( model ) {
+					var parts = _.compact( model.id.split('/') );
+					return parts[ parts.length - 1 ];
+				});
+			url += 'set/' + ids.join(';') + '/';
+		}
+		
+		return url;
+	};
+})();
diff --git a/planetstack/core/xoslib/static/js/sliverListTest.js b/planetstack/core/xoslib/static/js/sliverListTest.js
index 294ffd3..2365aa2 100644
--- a/planetstack/core/xoslib/static/js/sliverListTest.js
+++ b/planetstack/core/xoslib/static/js/sliverListTest.js
@@ -2,7 +2,7 @@
 
 window.SliverView = Backbone.View.extend({
     tagName: 'li',
-    className: 'XOSLib.sliver',
+    className: 'sliver',
 
     events: {
         'click .permalink': 'navigate'
@@ -40,32 +40,6 @@
     }
 });
 
-window.InputView = Backbone.View.extend({
-    events: {
-        'click .sliver': 'createSliver',
-        'keypress #message': 'createOnEnter'
-    },
-
-    createOnEnter: function(e){
-        if((e.keyCode || e.which) == 13){
-            this.createSliver();
-            e.preventDefault();
-        }
-
-    },
-
-    createSliver: function(){
-        var message = this.$('#message').val();
-        if(message){
-            this.collection.create({
-                message: message
-            });
-            this.$('#message').val('');
-        }
-    }
-
-});
-
 window.ListView = Backbone.View.extend({
     initialize: function(){
         _.bindAll(this, 'addOne', 'addAll');
@@ -82,7 +56,7 @@
 
     addOne: function(sliver){
         var view = new SliverView({
-            model: XOSLib.sliver
+            model: sliver
         });
         $(this.el).prepend(view.render().el);
         this.views.push(view);
@@ -104,6 +78,7 @@
 
     render: function(){
         console.log("listApp.render");
+        console.log(this.collection);
         $(this.el).html(ich.listApp({}));
         var list = new ListView({
             collection: this.collection,
@@ -111,10 +86,6 @@
         });
         list.addAll();
         list.bind('all', this.rethrow, this);
-        new InputView({
-            collection: this.collection,
-            el: this.$('#input')
-        });
     }
 });
 
@@ -139,7 +110,7 @@
 $(function(){
     window.app = window.app || {};
     app.router = new Router();
-    app.slivers = new XOSLib.slivers();
+    app.slivers = XOSLib.slivers; //new XOSLib.slivers();
     app.list = new ListApp({
         el: $("#app"),
         collection: app.slivers
@@ -148,13 +119,11 @@
         el: $("#app")
     });
     app.router.bind('route:list', function(){
-        console.log("Router:list2");
         app.slivers.maybeFetch({
             success: _.bind(app.list.render, app.list)
         });
     });
     app.router.bind('route:detail', function(id){
-        console.log("Router:detail2");
         app.slivers.getOrFetch(app.slivers.urlRoot + id + '/', {
             success: function(model){
                 app.detail.model = model;
diff --git a/planetstack/core/xoslib/static/js/xos-backbone.js b/planetstack/core/xoslib/static/js/xos-backbone.js
index 99f0784..1633768 100644
--- a/planetstack/core/xoslib/static/js/xos-backbone.js
+++ b/planetstack/core/xoslib/static/js/xos-backbone.js
@@ -1,6 +1,34 @@
 SLIVER_API = "/plstackapi/slivers/";
 
+XOSModel = Backbone.Model.extend({
+    /* from backbone-tastypie.js */
+    idAttribute: 'resource_uri',
+
+    /* from backbone-tastypie.js */
+    url: function() {
+		// Use the id if possible
+		var url = this.id;
+
+		// If there's no idAttribute, try to have the collection construct a url. Fallback to 'urlRoot'.
+		if ( !url ) {
+			url = this.collection && ( _.isFunction( this.collection.url ) ? this.collection.url() : this.collection.url );
+                        console.log(url);
+			url = url || this.urlRoot;
+		}
+
+		url && ( url += ( url.length > 0 && url.charAt( url.length - 1 ) === '/' ) ? '' : '/' );
+
+                url && ( url += "?no_hyperlinks=1" );
+
+		return url;
+	},
+});
+
 XOSCollection = Backbone.Collection.extend({
+    objects: function() {
+                return this.models.map(function(element) { return element.attributes; });
+             },
+
     maybeFetch: function(options){
             // Helper function to fetch only if this collection has not been fetched before.
         if(this._fetched){
@@ -32,18 +60,39 @@
             return;
         }
 
-        model = new Sliver({
+        model = new this.model({
             resource_uri: id
         });
 
         model.fetch(options);
-    }
+    },
+
+    /* from backbone-tastypie.js */
+    url: function( models ) {
+		var url = this.urlRoot || ( models && models.length && models[0].urlRoot );
+		url && ( url += ( url.length > 0 && url.charAt( url.length - 1 ) === '/' ) ? '' : '/' );
+
+		// Build a url to retrieve a set of models. This assume the last part of each model's idAttribute
+		// (set to 'resource_uri') contains the model's id.
+		if ( models && models.length ) {
+			var ids = _.map( models, function( model ) {
+					var parts = _.compact( model.id.split('/') );
+					return parts[ parts.length - 1 ];
+				});
+			url += 'set/' + ids.join(';') + '/';
+		}
+
+                url && ( url += "?no_hyperlinks=1" );
+
+		return url;
+	},
 });
 
 function xoslib() {
-    this.sliver = Backbone.Model.extend({ urlRoot: SLIVER_API });
-    this.slivers = XOSCollection.extend({ urlRoot: SLIVER_API,
-                                    model: this.sliver});
+    this.sliver = XOSModel.extend({ urlRoot: SLIVER_API });
+    this.sliverCollection = XOSCollection.extend({ urlRoot: SLIVER_API,
+                                                   model: this.sliver});
+    this.slivers = new this.sliverCollection();
 };
 
 XOSLib = new xoslib();
