diff --git a/impl/google/services/jni.go b/impl/google/services/jni.go
index 4ef77a1..0ea7dd8 100644
--- a/impl/google/services/jni.go
+++ b/impl/google/services/jni.go
@@ -9,8 +9,7 @@
 import (
 	jgroups "v.io/x/jni/impl/google/services/groups"
 	jmounttable "v.io/x/jni/impl/google/services/mounttable"
-	// See TODO below.
-	//jsyncbase "v.io/x/jni/impl/google/services/syncbase"
+	jsyncbase "v.io/x/jni/impl/google/services/syncbase"
 	jutil "v.io/x/jni/util"
 )
 
@@ -27,12 +26,9 @@
 	if err := jmounttable.Init(env); err != nil {
 		return err
 	}
-	// TODO(sadovsky): Temporarily disable Syncbase Java code (as of 2016-03-28),
-	// while we update the code to the simplified API.
-	/*
-		if err := jsyncbase.Init(env); err != nil {
-			return err
-		}
-	*/
+	if err := jsyncbase.Init(env); err != nil {
+		return err
+	}
+
 	return nil
 }
diff --git a/v23/jni.go b/v23/jni.go
index f658aa6..671e6fe 100644
--- a/v23/jni.go
+++ b/v23/jni.go
@@ -14,8 +14,6 @@
 	jsecurity "v.io/x/jni/v23/security"
 	jaccess "v.io/x/jni/v23/security/access"
 	jgroups "v.io/x/jni/v23/services/groups"
-	// See TODO below.
-	//jsyncbase "v.io/x/jni/v23/syncbase"
 )
 
 // #include "jni.h"
@@ -43,12 +41,6 @@
 	if err := jgroups.Init(env); err != nil {
 		return err
 	}
-	// TODO(sadovsky): Temporarily disable Syncbase Java code (as of 2016-03-28),
-	// while we update the code to the simplified API.
-	/*
-		if err := jsyncbase.Init(env); err != nil {
-			return err
-		}
-	*/
+
 	return nil
 }
diff --git a/v23/syncbase/jni.go b/v23/syncbase/jni.go
deleted file mode 100644
index 01d04f8..0000000
--- a/v23/syncbase/jni.go
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build java android
-
-package syncbase
-
-import (
-	"unsafe"
-
-	wire "v.io/v23/services/syncbase"
-	"v.io/v23/syncbase"
-
-	jutil "v.io/x/jni/util"
-	jcontext "v.io/x/jni/v23/context"
-)
-
-// #include "jni.h"
-import "C"
-
-var (
-	// Global reference for io.v.v23.syncbase.DatabaseImpl class.
-	jDatabaseImplClass jutil.Class
-	// Global reference for io.v.v23.syncbase.Conflict class.
-	jConflictClass jutil.Class
-	// Global reference for io.v.v23.syncbase.Resolution class.
-	jResolutionClass jutil.Class
-	// Global reference for io.v.v23.services.syncbase.BatchOptions class.
-	jBatchOptionsClass jutil.Class
-	// Global reference for io.v.v23.services.syncbase.SchemaMetadata class.
-	jSchemaMetadataClass jutil.Class
-)
-
-// Init initializes the JNI code with the given Java environment.  This method
-// must be invoked before any other method in this package and must be called
-// from the main Java thread (e.g., On_Load()).
-func Init(env jutil.Env) error {
-	var err error
-	jDatabaseImplClass, err = jutil.JFindClass(env, "io/v/v23/syncbase/DatabaseImpl")
-	if err != nil {
-		return err
-	}
-	jConflictClass, err = jutil.JFindClass(env, "io/v/v23/syncbase/Conflict")
-	if err != nil {
-		return err
-	}
-	jResolutionClass, err = jutil.JFindClass(env, "io/v/v23/syncbase/Resolution")
-	if err != nil {
-		return err
-	}
-	jBatchOptionsClass, err = jutil.JFindClass(env, "io/v/v23/services/syncbase/BatchOptions")
-	if err != nil {
-		return err
-	}
-	jSchemaMetadataClass, err = jutil.JFindClass(env, "io/v/v23/services/syncbase/SchemaMetadata")
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-//export Java_io_v_v23_syncbase_DatabaseImpl_nativeCreate
-func Java_io_v_v23_syncbase_DatabaseImpl_nativeCreate(jenv *C.JNIEnv, jDatabaseImplClass C.jclass, jParentFullName C.jstring, jRelativeName C.jstring, jSchemaObj C.jobject) C.jobject {
-	env := jutil.Env(uintptr(unsafe.Pointer(jenv)))
-	parentFullName := jutil.GoString(env, jutil.Object(uintptr(unsafe.Pointer(jParentFullName))))
-	relativeName := jutil.GoString(env, jutil.Object(uintptr(unsafe.Pointer(jRelativeName))))
-	jSchema := jutil.Object(uintptr(unsafe.Pointer(jSchemaObj)))
-	schema, err := GoSchema(env, jSchema)
-	if err != nil {
-		jutil.JThrowV(env, err)
-		return nil
-	}
-	db := syncbase.NewDatabase(parentFullName, relativeName, schema)
-	jdb := newJNIDatabase(env, db, parentFullName, schema, jSchema)
-	jDatabase, err := javaDatabase(env, jdb)
-	if err != nil {
-		jutil.JThrowV(env, err)
-		return nil
-	}
-	return C.jobject(unsafe.Pointer(jDatabase))
-}
-
-//export Java_io_v_v23_syncbase_DatabaseImpl_nativeBeginBatch
-func Java_io_v_v23_syncbase_DatabaseImpl_nativeBeginBatch(jenv *C.JNIEnv, jDatabaseImpl C.jobject, goRef C.jlong, jContext C.jobject, jBatchOptsObj C.jobject, jCallbackObj C.jobject) {
-	env := jutil.Env(uintptr(unsafe.Pointer(jenv)))
-	jCallback := jutil.Object(uintptr(unsafe.Pointer(jCallbackObj)))
-	jBatchOpts := jutil.Object(uintptr(unsafe.Pointer(jBatchOptsObj)))
-	jdb := (*jniDatabase)(jutil.GoRefValue(jutil.Ref(goRef)))
-	var batchOpts wire.BatchOptions
-	if err := jutil.GoVomCopy(env, jBatchOpts, jBatchOptionsClass, &batchOpts); err != nil {
-		jutil.CallbackOnFailure(env, jCallback, err)
-		return
-	}
-	ctx, _, err := jcontext.GoContext(env, jutil.Object(uintptr(unsafe.Pointer(jContext))))
-	if err != nil {
-		jutil.CallbackOnFailure(env, jCallback, err)
-		return
-	}
-	jutil.DoAsyncCall(env, jCallback, func() (jutil.Object, error) {
-		batchDB, err := jdb.BeginBatch(ctx, batchOpts)
-		if err != nil {
-			return jutil.NullObject, err
-		}
-		env, freeFunc := jutil.GetEnv()
-		defer freeFunc()
-		jBatchDB, err := javaBatchDatabase(env, batchDB, jdb.parentFullName, jdb.jSchema)
-		if err != nil {
-			return jutil.NullObject, err
-		}
-		// Must grab a global reference as we free up the env and all local references that come
-		// along with it.
-		return jutil.NewGlobalRef(env, jBatchDB), nil
-	})
-}
-
-//export Java_io_v_v23_syncbase_DatabaseImpl_nativeEnforceSchema
-func Java_io_v_v23_syncbase_DatabaseImpl_nativeEnforceSchema(jenv *C.JNIEnv, jDatabaseImpl C.jobject, goRef C.jlong, jContext C.jobject, jCallbackObj C.jobject) {
-	env := jutil.Env(uintptr(unsafe.Pointer(jenv)))
-	jCallback := jutil.Object(uintptr(unsafe.Pointer(jCallbackObj)))
-	jdb := (*jniDatabase)(jutil.GoRefValue(jutil.Ref(goRef)))
-	ctx, _, err := jcontext.GoContext(env, jutil.Object(uintptr(unsafe.Pointer(jContext))))
-	if err != nil {
-		jutil.CallbackOnFailure(env, jCallback, err)
-		return
-	}
-	jutil.DoAsyncCall(env, jCallback, func() (jutil.Object, error) {
-		return jutil.NullObject, jdb.EnforceSchema(ctx)
-	})
-}
-
-//export Java_io_v_v23_syncbase_DatabaseImpl_nativeFinalize
-func Java_io_v_v23_syncbase_DatabaseImpl_nativeFinalize(jenv *C.JNIEnv, jDatabaseImpl C.jobject, goRef C.jlong) {
-	jutil.GoDecRef(jutil.Ref(goRef))
-}
diff --git a/v23/syncbase/resolver.go b/v23/syncbase/resolver.go
deleted file mode 100644
index 509341a..0000000
--- a/v23/syncbase/resolver.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build java android
-
-package syncbase
-
-import (
-	"runtime"
-
-	"v.io/v23/context"
-	"v.io/v23/syncbase"
-
-	jutil "v.io/x/jni/util"
-	jcontext "v.io/x/jni/v23/context"
-)
-
-// GoResolver converts a provided Java ConflictResolver into a Go
-// ConflictResolver.
-func GoResolver(env jutil.Env, jResolver jutil.Object) syncbase.ConflictResolver {
-	if jResolver.IsNull() {
-		return nil
-	}
-	// Reference Java resolver; it will be de-referenced when the Go resolver
-	// created below is garbage-collected (through the finalizer callback we
-	// setup just below).
-	jResolver = jutil.NewGlobalRef(env, jResolver)
-	resolver := &jniResolver{
-		jResolver: jResolver,
-	}
-	runtime.SetFinalizer(resolver, func(r *jniResolver) {
-		env, freeFunc := jutil.GetEnv()
-		defer freeFunc()
-		jutil.DeleteGlobalRef(env, r.jResolver)
-	})
-	return resolver
-}
-
-type jniResolver struct {
-	jResolver jutil.Object
-}
-
-func (r *jniResolver) OnConflict(ctx *context.T, conflict *syncbase.Conflict) syncbase.Resolution {
-	env, freeFunc := jutil.GetEnv()
-	defer freeFunc()
-	jContext, err := jcontext.JavaContext(env, ctx, nil)
-	if err != nil {
-		panic("Couldn't create Java context: " + err.Error())
-	}
-	jConflict, err := jutil.JVomCopy(env, *conflict, jConflictClass)
-	if err != nil {
-		panic("Couldn't create Java Conflict object: " + err.Error())
-	}
-	contextSign := jutil.ClassSign("io.v.v23.context.VContext")
-	conflictSign := jutil.ClassSign("io.v.v23.syncbase.Conflict")
-	resolutionSign := jutil.ClassSign("io.v.v23.syncbase.Resolution")
-	jResolution, err := jutil.CallObjectMethod(env, r.jResolver, "onConflict", []jutil.Sign{contextSign, conflictSign}, resolutionSign, jContext, jConflict)
-	if err != nil {
-		panic("Error invoking Java ConflictResolver: " + err.Error())
-	}
-	var resolution syncbase.Resolution
-	if err := jutil.GoVomCopy(env, jResolution, jResolutionClass, &resolution); err != nil {
-		panic("Couldn't create Go Resolution: " + err.Error())
-	}
-	return resolution
-}
diff --git a/v23/syncbase/util.go b/v23/syncbase/util.go
deleted file mode 100644
index d8ff179..0000000
--- a/v23/syncbase/util.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build java android
-
-package syncbase
-
-import (
-	"runtime"
-
-	wire "v.io/v23/services/syncbase"
-	"v.io/v23/syncbase"
-
-	jutil "v.io/x/jni/util"
-)
-
-type jniDatabase struct {
-	syncbase.Database
-	parentFullName string
-	schema         *syncbase.Schema
-	jSchema        jutil.Object
-}
-
-func newJNIDatabase(env jutil.Env, db syncbase.Database, parentFullName string, schema *syncbase.Schema, jSchema jutil.Object) *jniDatabase {
-	// Reference Java schema; it will be de-referenced when the Go database
-	// created below is garbage-collected (through the finalizer callback we
-	// setup just below).
-	jSchema = jutil.NewGlobalRef(env, jSchema)
-	jdb := &jniDatabase{
-		Database:       db,
-		parentFullName: parentFullName,
-		schema:         schema,
-		jSchema:        jSchema,
-	}
-	runtime.SetFinalizer(jdb, func(jdb *jniDatabase) {
-		env, freeFunc := jutil.GetEnv()
-		defer freeFunc()
-		jutil.DeleteGlobalRef(env, jdb.jSchema)
-	})
-	return jdb
-}
-
-func javaDatabase(env jutil.Env, jdb *jniDatabase) (jutil.Object, error) {
-	schemaSign := jutil.ClassSign("io.v.v23.syncbase.Schema")
-	ref := jutil.GoNewRef(jdb) // Un-refed when jDatabase is finalized
-	jDatabase, err := jutil.NewObject(env, jDatabaseImplClass, []jutil.Sign{jutil.LongSign, jutil.StringSign, jutil.StringSign, jutil.StringSign, schemaSign}, int64(ref), jdb.parentFullName, jdb.FullName(), jdb.Name(), jdb.jSchema)
-	if err != nil {
-		jutil.GoDecRef(ref)
-		return jutil.NullObject, err
-	}
-	return jDatabase, nil
-}
-
-func javaBatchDatabase(env jutil.Env, batchDB syncbase.BatchDatabase, parentFullName string, jSchema jutil.Object) (jutil.Object, error) {
-	schemaSign := jutil.ClassSign("io.v.v23.syncbase.Schema")
-	return jutil.NewObject(env, jDatabaseImplClass, []jutil.Sign{jutil.LongSign, jutil.StringSign, jutil.StringSign, jutil.StringSign, schemaSign}, 0, parentFullName, batchDB.FullName(), batchDB.Name(), jSchema)
-}
-
-// GoSchema converts the provided Java Schema object into a Go syncbase.Schema
-// type.
-func GoSchema(env jutil.Env, jSchema jutil.Object) (*syncbase.Schema, error) {
-	if jSchema.IsNull() {
-		return nil, nil
-	}
-	metadataSign := jutil.ClassSign("io.v.v23.services.syncbase.SchemaMetadata")
-	jMetadata, err := jutil.CallObjectMethod(env, jSchema, "getMetadata", nil, metadataSign)
-	if err != nil {
-		return nil, err
-	}
-	var metadata wire.SchemaMetadata
-	if err := jutil.GoVomCopy(env, jMetadata, jSchemaMetadataClass, &metadata); err != nil {
-		return nil, err
-	}
-	resolverSign := jutil.ClassSign("io.v.v23.syncbase.ConflictResolver")
-	jResolver, err := jutil.CallObjectMethod(env, jSchema, "getResolver", nil, resolverSign)
-	if err != nil {
-		return nil, err
-	}
-	resolver := GoResolver(env, jResolver)
-	return &syncbase.Schema{
-		Metadata: metadata,
-		Resolver: resolver,
-	}, nil
-}
