diff --git a/android/app/build.gradle b/android/app/build.gradle
index 920690c..a507a38 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -1,5 +1,6 @@
 buildscript {
     repositories {
+        jcenter()
         mavenCentral()
     }
 
@@ -8,7 +9,7 @@
         classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+'
         // We are going to define a custom VDL service. The Vanadium
         // Gradle plugin makes that easier, so let's use that.
-        classpath 'io.v:gradle-plugin:0.1'
+        classpath 'io.v:gradle-plugin:1.3'
         // Retrolambda saves a ton on boilerplate.
         classpath 'me.tatarka:gradle-retrolambda:3.2.4'
     }
@@ -53,7 +54,7 @@
     compile 'com.android.support:design:23.1.0'
     compile 'com.android.support:recyclerview-v7:23.0.1'
     compile 'com.android.support:cardview-v7:23.0.1'
-    compile 'io.v:vanadium-android:0.2'
+    compile 'io.v:vanadium-android:0.8'
 }
 
 vdl {
diff --git a/android/app/src/main/java/io/v/syncslides/db/DeckWatcher.java b/android/app/src/main/java/io/v/syncslides/db/DeckWatcher.java
index f3bc39f..4f74905 100644
--- a/android/app/src/main/java/io/v/syncslides/db/DeckWatcher.java
+++ b/android/app/src/main/java/io/v/syncslides/db/DeckWatcher.java
@@ -12,6 +12,7 @@
 import io.v.impl.google.naming.NamingUtil;
 import io.v.syncslides.model.Deck;
 import io.v.syncslides.model.DeckImpl;
+import io.v.v23.InputChannels;
 import io.v.v23.VIterable;
 import io.v.v23.context.VContext;
 import io.v.v23.services.watch.ResumeMarker;
@@ -42,8 +43,8 @@
         try {
             BatchDatabase batch = sync(mDB.beginBatch(context, null));
             ResumeMarker resumeMarker = sync(batch.getResumeMarker(context));
-            DatabaseCore.QueryResults results = sync(batch.exec(context,
-                    "SELECT k, v FROM Decks WHERE Type(v) like \"%VDeck\""));
+            VIterable<List<VdlAny>> results = InputChannels.asIterable(sync(batch.exec(
+                    context, "SELECT k, v FROM Decks WHERE Type(v) like \"%VDeck\"")));
             for (List<VdlAny> row : results) {
                 if (row.size() != 2) {
                     throw new VException("Wrong number of columns: " + row.size());
@@ -57,7 +58,7 @@
                 throw results.error();
             }
 
-            VIterable<WatchChange> changes = sync(mDB.watch(
+            VIterable<WatchChange> changes = InputChannels.asIterable(mDB.watch(
                     context, SyncbaseDB.DECKS_TABLE, "", resumeMarker));
             for (WatchChange change : changes) {
                 final String key = change.getRowName();
diff --git a/android/app/src/main/java/io/v/syncslides/db/SlideNumberWatcher.java b/android/app/src/main/java/io/v/syncslides/db/SlideNumberWatcher.java
index 15d3e10..1ed2f5b 100644
--- a/android/app/src/main/java/io/v/syncslides/db/SlideNumberWatcher.java
+++ b/android/app/src/main/java/io/v/syncslides/db/SlideNumberWatcher.java
@@ -16,6 +16,7 @@
 
 import io.v.impl.google.naming.NamingUtil;
 import io.v.syncslides.model.Session;
+import io.v.v23.InputChannels;
 import io.v.v23.VIterable;
 import io.v.v23.context.CancelableVContext;
 import io.v.v23.context.VContext;
@@ -133,9 +134,9 @@
                 mHandler.post(() -> currentSlideChanged(slide));
             }
             ResumeMarker marker = sync(batch.getResumeMarker(mCurrentContext));
-            VIterable<WatchChange> changes =
-                    sync(mDb.watch(mCurrentContext, SyncbaseDB.PRESENTATIONS_TABLE,
-                            rowKey, marker));
+
+            VIterable<WatchChange> changes = InputChannels.asIterable(
+                    mDb.watch(mCurrentContext, SyncbaseDB.PRESENTATIONS_TABLE, rowKey, marker));
             for (WatchChange change : changes) {
                 String key = change.getRowName();
                 Log.i(TAG, "Found CurrentSlide change " + key);
@@ -148,6 +149,9 @@
                     mHandler.post(() -> currentSlideChanged(slide));
                 }
             }
+            if (changes.error() != null) {
+                throw changes.error();
+            }
         } catch (final VException e) {
             mHandler.post(() -> notifyError(e));
         }
@@ -163,7 +167,8 @@
             mHandler.post(() -> localSlideChanged(vSession.getLocalSlide()));
             ResumeMarker marker = sync(batch.getResumeMarker(mCurrentContext));
             VIterable<WatchChange> changes =
-                    sync(mDb.watch(mCurrentContext, SyncbaseDB.UI_TABLE, mSessionId, marker));
+                    InputChannels.asIterable(mDb.watch(
+                            mCurrentContext, SyncbaseDB.UI_TABLE, mSessionId, marker));
             for (WatchChange change : changes) {
                 String key = change.getRowName();
                 Log.i(TAG, "Found local slide change " + key);
@@ -176,7 +181,10 @@
                     mHandler.post(() -> localSlideChanged(vSession1.getLocalSlide()));
                 }
             }
-        } catch (final VException e) {
+            if (changes.error() != null) {
+                throw changes.error();
+            }
+         } catch (final VException e) {
             mHandler.post(() -> notifyError(e));
         }
     }
diff --git a/android/app/src/main/java/io/v/syncslides/db/SlideWatcher.java b/android/app/src/main/java/io/v/syncslides/db/SlideWatcher.java
index 30d0aa2..2913dec 100644
--- a/android/app/src/main/java/io/v/syncslides/db/SlideWatcher.java
+++ b/android/app/src/main/java/io/v/syncslides/db/SlideWatcher.java
@@ -11,6 +11,7 @@
 import io.v.impl.google.naming.NamingUtil;
 import io.v.syncslides.model.Slide;
 import io.v.syncslides.model.SlideImpl;
+import io.v.v23.InputChannels;
 import io.v.v23.VIterable;
 import io.v.v23.context.VContext;
 import io.v.v23.services.watch.ResumeMarker;
@@ -72,7 +73,8 @@
         Table notesTable = batch.getTable(SyncbaseDB.NOTES_TABLE);
         String query = "SELECT k, v FROM Decks WHERE Type(v) LIKE \"%VSlide\" " +
                 "AND k LIKE \"" + NamingUtil.join(mDeckId, "slides") + "%\"";
-        DatabaseCore.QueryResults results = sync(batch.exec(context, query));
+        VIterable<List<VdlAny>> results = InputChannels.asIterable(
+                sync(batch.exec(context, query)));
         for (List<VdlAny> row : results) {
             if (row.size() != 2) {
                 throw new VException("Wrong number of columns: " + row.size());
@@ -84,13 +86,16 @@
             Slide newSlide = new DBSlide(key, slide, notes);
             listener.onPut(newSlide);
         }
+        if (results.error() != null) {
+            throw results.error();
+        }
     }
 
     private void watchSlideChanges(VContext context, Listener<Slide> listener,
                                    ResumeMarker watchMarker) throws VException {
         Table notesTable = mDb.getTable(SyncbaseDB.NOTES_TABLE);
-        VIterable<WatchChange> changes =
-                sync(mDb.watch(context, SyncbaseDB.DECKS_TABLE, mDeckId, watchMarker));
+        VIterable<WatchChange> changes = InputChannels.asIterable(
+                mDb.watch(context, SyncbaseDB.DECKS_TABLE, mDeckId, watchMarker));
         for (WatchChange change : changes) {
             String key = change.getRowName();
             if (isDeckKey(key)) {
@@ -121,8 +126,8 @@
     private void watchNoteChanges(VContext context, Listener<Slide> listener,
                                   ResumeMarker watchMarker) throws VException {
         Table decksTable = mDb.getTable(SyncbaseDB.DECKS_TABLE);
-        VIterable<WatchChange> changes =
-                sync(mDb.watch(context, SyncbaseDB.NOTES_TABLE, mDeckId, watchMarker));
+        VIterable<WatchChange> changes = InputChannels.asIterable(
+                mDb.watch(context, SyncbaseDB.NOTES_TABLE, mDeckId, watchMarker));
         for (WatchChange change : changes) {
             String key = change.getRowName();
             if (!SyncbaseDB.isSlideKey(key)) {
diff --git a/android/app/src/main/java/io/v/syncslides/db/SyncbaseDB.java b/android/app/src/main/java/io/v/syncslides/db/SyncbaseDB.java
index 4b314e7..a319459 100644
--- a/android/app/src/main/java/io/v/syncslides/db/SyncbaseDB.java
+++ b/android/app/src/main/java/io/v/syncslides/db/SyncbaseDB.java
@@ -223,7 +223,7 @@
         String key = slideRowKey(prefix, idx);
         Log.i(TAG, "Adding slide " + key);
         BlobWriter writer = sync(mDB.writeBlob(mVContext, null));
-        try (OutputStream out = sync(writer.stream(mVContext))) {
+        try (OutputStream out = writer.stream(mVContext)) {
             out.write(slide.getImageData());
         } catch (IOException e) {
             throw new VException("Couldn't write slide: " + key + ": " + e.getMessage());
