diff --git a/app/build.gradle b/app/build.gradle
index 85e4d95..5e9e0a6 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -83,5 +83,5 @@
     )
     firebaseCompile 'com.firebase:firebase-client-android:2.5.2'
     syncbaseCompile 'io.v:vanadium-android:2.2.+'
-    syncbase2Compile 'io.v:syncbase:0.1.5'
+    syncbase2Compile 'io.v:syncbase:0.1.6'
 }
diff --git a/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbaseMain.java b/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbaseMain.java
index 5359f7e..2c39fb0 100644
--- a/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbaseMain.java
+++ b/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbaseMain.java
@@ -14,7 +14,7 @@
 import io.v.syncbase.DatabaseHandle;
 import io.v.syncbase.Id;
 import io.v.syncbase.Syncbase;
-import io.v.syncbase.core.VError;
+import io.v.syncbase.exception.SyncbaseException;
 import io.v.todos.model.ListMetadata;
 import io.v.todos.model.ListSpec;
 import io.v.todos.persistence.ListEventListener;
@@ -40,14 +40,12 @@
     public String addTodoList(ListSpec listSpec) {
         DatabaseHandle.CollectionOptions opts = new DatabaseHandle.CollectionOptions();
         try {
-            // TODO(alexfandrianto): We're not allowed to have dashes in our collection names still!
-            // You also must start with a letter, not a number.
-            Collection c = sDb.collection("list_" + UUID.randomUUID().toString().replaceAll("-", ""), opts);
+            Collection c = sDb.createCollection(opts.setPrefix(TODO_LIST_COLLECTION_PREFIX));
             c.put(TODO_LIST_KEY, listSpec);
             return c.getId().encode();
-        } catch (VError vError) {
-            Log.e(TAG, "Failed to create todo list collection", vError);
-            throw new RuntimeException(vError);
+        } catch (SyncbaseException e) {
+            Log.e(TAG, "Failed to create todo list collection", e);
+            throw new RuntimeException(e);
         }
     }
 
@@ -57,8 +55,8 @@
         Collection c = sDb.getCollection(listId);
         try {
             c.delete(TODO_LIST_KEY);
-        } catch (VError vError) {
-            Log.e(TAG, "Failed to delete todo list key", vError);
+        } catch (SyncbaseException e) {
+            Log.e(TAG, "Failed to delete todo list key", e);
         }
         // TODO(alexfandrianto): Instead of deleting the key, we should destroy the collection.
         // Unfortunately, I can't yet: https://v.io/i/1374
diff --git a/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbasePersistence.java b/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbasePersistence.java
index 72affe4..e5d4ef8 100644
--- a/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbasePersistence.java
+++ b/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbasePersistence.java
@@ -25,7 +25,7 @@
 import io.v.syncbase.Syncgroup;
 import io.v.syncbase.SyncgroupInvite;
 import io.v.syncbase.WatchChange;
-import io.v.syncbase.core.VError;
+import io.v.syncbase.exception.SyncbaseException;
 import io.v.todos.model.ListMetadata;
 import io.v.todos.model.ListSpec;
 import io.v.todos.model.Task;
@@ -37,9 +37,9 @@
 import io.v.todos.sharing.ShareListDialogFragment;
 
 public abstract class SyncbasePersistence implements Persistence {
-    protected static final String SETTINGS_COLLECTION = "settings";
     protected static final String SHOW_DONE_KEY = "showDoneKey";
     protected static final String TODO_LIST_KEY = "todoListKey";
+    protected static final String TODO_LIST_COLLECTION_PREFIX = "list";
     protected static final String TAG = "High-Level Syncbase";
 
     protected static boolean sInitialized = false;
@@ -50,7 +50,6 @@
     protected static boolean sShowDone = true;
 
     protected static Database sDb;
-    protected static Collection sSettings;
 
     private static final Object sSyncbaseMutex = new Object();
     private static TodoListListener sTodoListListener;
@@ -72,12 +71,10 @@
                 Syncbase.Options opts = new Syncbase.Options();
                 opts.rootDir = activity.getFilesDir().getAbsolutePath();
                 opts.disableSyncgroupPublishing = true;
-                // TODO(alexfandrianto): https://v.io/i/1375
-                opts.disableUserdataSyncgroup = true;
                 try {
                     Syncbase.init(opts);
-                } catch (VError vError) {
-                    Log.e(TAG, "Failed to initialize", vError);
+                } catch (SyncbaseException e) {
+                    Log.e(TAG, "Failed to initialize", e);
                     return;
                 }
 
@@ -91,8 +88,8 @@
                             Log.d(TAG, "Successfully logged in!");
                             try {
                                 sDb = Syncbase.database();
-                            } catch (VError vError) {
-                                Log.e(TAG, "Failed to create database", vError);
+                            } catch (SyncbaseException e) {
+                                Log.e(TAG, "Failed to create database", e);
                                 callNotify();
                                 return;
                             }
@@ -163,14 +160,6 @@
     }
 
     private void continueSetup() {
-        Log.d(TAG, "Creating settings collection");
-        // Create a settings collection.
-        try {
-            sSettings = sDb.collection(SETTINGS_COLLECTION);
-        } catch (VError vError) {
-            Log.e(TAG, "couldn't create settings collection", vError);
-        }
-
         Log.d(TAG, "Watching everything");
         // Watch everything.
         // TODO(alexfandrianto): This can be simplified if we watch specific collections and the
@@ -202,16 +191,14 @@
                 Log.d(TAG, "Handling put change " + value.getRowKey());
                 Log.d(TAG, "From collection: " + value.getCollectionId());
                 Log.d(TAG, "With entity type: " + value.getEntityType());
-                if (value.getEntityType() != WatchChange.EntityType.ROW ||
-                        value.getCollectionId().getName().equals("userdata__")) {
-                    // TODO(alexfandrianto): I can't deal with these yet. Please skip to avoid crashing.
-                    // TODO(alexfandrianto): export/hide userdata__ https://v.io/i/1372
+                if (value.getEntityType() != WatchChange.EntityType.ROW) {
+                    // TODO(alexfandrianto): I can't deal with non-row entities yet. Skip.
                     return;
                 }
                 Log.d(TAG, "With row...: " + value.getRowKey());
                 final Id collectionId = value.getCollectionId();
 
-                if (collectionId.getName().equals(SETTINGS_COLLECTION)) {
+                if (collectionId.getName().equals(Syncbase.USERDATA_NAME)) {
                     if (value.getRowKey().equals(SHOW_DONE_KEY)) {
                         try {
                             sShowDone = value.getValue(Boolean.class);
@@ -221,8 +208,8 @@
                             if (sTodoListListener != null) {
                                 sTodoListListener.onUpdateShowDone(sShowDone);
                             }
-                        } catch (VError vError) {
-                            Log.e(TAG, "Failed to decode watch change as Boolean", vError);
+                        } catch (SyncbaseException e) {
+                            Log.e(TAG, "Failed to decode watch change as Boolean", e);
                         }
                     }
                     return; // Show done updated. Nothing left to do.
@@ -250,8 +237,8 @@
                         if (sTodoListListener != null && sTodoListExpectedId.equals(collectionId)) {
                             sTodoListListener.onUpdate(listSpec);
                         }
-                    } catch (VError vError) {
-                        Log.e(TAG, "Failed to decode watch change value as ListSpec", vError);
+                    } catch (SyncbaseException e) {
+                        Log.e(TAG, "Failed to decode watch change value as ListSpec", e);
                     }
                 } else {
                     Map<String, TaskSpec> taskData = sTasksByListMap.get(collectionId);
@@ -275,8 +262,8 @@
                                 sTodoListListener.onItemUpdate(new Task(rowKey, newSpec));
                             }
                         }
-                    } catch (VError vError) {
-                        Log.e(TAG, "Failed to decode watch change value as TaskSpec", vError);
+                    } catch (SyncbaseException e) {
+                        Log.e(TAG, "Failed to decode watch change value as TaskSpec", e);
                     }
                 }
             }
@@ -288,9 +275,10 @@
                 Log.d(TAG, "Handling delete change " + value.getRowKey());
                 Log.d(TAG, "From collection: " + value.getCollectionId());
                 Log.d(TAG, "With entity type: " + value.getEntityType());
-                if (value.getEntityType() != WatchChange.EntityType.ROW || value.getCollectionId().getName().equals("userdata__")) {
-                    // TODO(alexfandrianto): I can't deal with these yet. Please skip to avoid crashing.
-                    // TODO(alexfandrianto): export/hide userdata__ https://v.io/i/1372
+                if (value.getEntityType() != WatchChange.EntityType.ROW ||
+                        value.getCollectionId().getName().equals(Syncbase.USERDATA_NAME)) {
+                    // TODO(alexfandrianto): I can't deal with non-row entities, and we don't need
+                    // to watch deletes from userdata.
                     return;
                 }
                 Log.d(TAG, "With row...: " + value.getRowKey());
diff --git a/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbaseTodoList.java b/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbaseTodoList.java
index 556ecda..c30ec72 100644
--- a/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbaseTodoList.java
+++ b/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbaseTodoList.java
@@ -23,7 +23,7 @@
 import io.v.syncbase.Database;
 import io.v.syncbase.Id;
 import io.v.syncbase.User;
-import io.v.syncbase.core.VError;
+import io.v.syncbase.exception.SyncbaseException;
 import io.v.todos.model.ListSpec;
 import io.v.todos.model.Task;
 import io.v.todos.model.TaskSpec;
@@ -86,8 +86,8 @@
     public void updateTodoList(ListSpec listSpec) {
         try {
             mCollection.put(TODO_LIST_KEY, listSpec);
-        } catch (VError vError) {
-            Log.w(TAG, vError);
+        } catch (SyncbaseException e) {
+            Log.w(TAG, e);
         }
     }
 
@@ -95,8 +95,8 @@
     public void deleteTodoList() {
         try {
             mCollection.delete(TODO_LIST_KEY);
-        } catch (VError vError) {
-            Log.w(TAG, vError);
+        } catch (SyncbaseException e) {
+            Log.w(TAG, e);
         }
     }
 
@@ -118,14 +118,14 @@
                         // TODO(alexfandrianto): If we're in a batch, it's okay to error, isn't it?
                         try {
                             bCollection.put(rowKey, newSpec);
-                        } catch (VError vError) {
-                            Log.w(TAG, vError);
+                        } catch (SyncbaseException e) {
+                            Log.w(TAG, e);
                         }
                     }
                 }
             }, new Database.BatchOptions());
-        } catch (VError vError) {
-            Log.w(TAG, vError);
+        } catch (SyncbaseException e) {
+            Log.w(TAG, e);
         }
     }
 
@@ -133,8 +133,8 @@
     public void addTask(TaskSpec task) {
         try {
             mCollection.put(UUID.randomUUID().toString(), task);
-        } catch (VError vError) {
-            Log.w(TAG, vError);
+        } catch (SyncbaseException e) {
+            Log.w(TAG, e);
         }
     }
 
@@ -142,8 +142,8 @@
     public void updateTask(Task task) {
         try {
             mCollection.put(task.key, task.toSpec());
-        } catch (VError vError) {
-            Log.w(TAG, vError);
+        } catch (SyncbaseException e) {
+            Log.w(TAG, e);
         }
     }
 
@@ -151,17 +151,17 @@
     public void deleteTask(String key) {
         try {
             mCollection.delete(key);
-        } catch (VError vError) {
-            Log.w(TAG, vError);
+        } catch (SyncbaseException e) {
+            Log.w(TAG, e);
         }
     }
 
     @Override
     public void setShowDone(boolean showDone) {
         try {
-            sSettings.put(SHOW_DONE_KEY, showDone);
-        } catch (VError vError) {
-            Log.w(TAG, vError);
+            sDb.getUserdataCollection().put(SHOW_DONE_KEY, showDone);
+        } catch (SyncbaseException e) {
+            Log.w(TAG, e);
         }
     }
 
@@ -177,8 +177,8 @@
         }
         try {
             mCollection.getSyncgroup().inviteUsers(users, AccessList.AccessLevel.READ_WRITE);
-        } catch (VError vError) {
-            Log.w(TAG, "Could not share to: " + users.toString(), vError);
+        } catch (SyncbaseException e) {
+            Log.w(TAG, "Could not share to: " + users.toString(), e);
         }
     }
 }
