diff --git a/services/syncbase/bridge/cgo/impl.go b/services/syncbase/bridge/cgo/impl.go
index aa78bed..25cceef 100644
--- a/services/syncbase/bridge/cgo/impl.go
+++ b/services/syncbase/bridge/cgo/impl.go
@@ -553,15 +553,10 @@
 	if wireWC.State == watch.InitialStateSkipped {
 		return nil
 	}
-	wc := syncbase.ToWatchChange(wireWC)
-	if wc.EntityType != syncbase.EntityRow {
-		// TODO(ivanpi): Pipe collection and initial changes through.
-		return nil
-	}
 	// C.CallDbWatchPatternsCallbacksOnChange() blocks until the client acks the
 	// previous invocation, thus providing flow control.
 	cWatchChange := C.v23_syncbase_WatchChange{}
-	cWatchChange.init(*wc)
+	cWatchChange.init(*syncbase.ToWatchChange(wireWC))
 	C.CallDbWatchPatternsCallbacksOnChange(s.cbs, cWatchChange)
 	return nil
 }
diff --git a/services/syncbase/bridge/cgo/jni.go b/services/syncbase/bridge/cgo/jni.go
index 3b9dec8..2493d23 100644
--- a/services/syncbase/bridge/cgo/jni.go
+++ b/services/syncbase/bridge/cgo/jni.go
@@ -51,6 +51,7 @@
 	arrayListClass              jArrayListClass
 	changeTypeClass             jChangeType
 	collectionRowPatternClass   jCollectionRowPattern
+	entityTypeClass             jEntityType
 	hashMapClass                jHashMap
 	idClass                     jIdClass
 	keyValueClass               jKeyValue
@@ -80,6 +81,7 @@
 	arrayListClass = newJArrayListClass(env)
 	changeTypeClass = newJChangeType(env)
 	collectionRowPatternClass = newJCollectionRowPattern(env)
+	entityTypeClass = newJEntityType(env)
 	hashMapClass = newJHashMap(env)
 	idClass = newJIdClass(env)
 	keyValueClass = newJKeyValue(env)
@@ -656,6 +658,19 @@
 	return obj
 }
 
+func (x *C.v23_syncbase_EntityType) extractToJava(env *C.JNIEnv) C.jobject {
+	var obj C.jobject
+	switch *x {
+	case C.v23_syncbase_EntityTypeRoot:
+		obj = C.GetStaticObjectField(env, entityTypeClass.class, entityTypeClass.root)
+	case C.v23_syncbase_EntityTypeCollection:
+		obj = C.GetStaticObjectField(env, entityTypeClass.class, entityTypeClass.collection)
+	case C.v23_syncbase_EntityTypeRow:
+		obj = C.GetStaticObjectField(env, entityTypeClass.class, entityTypeClass.row)
+	}
+	return obj
+}
+
 func (x *C.v23_syncbase_Id) extractToJava(env *C.JNIEnv) C.jobject {
 	obj := C.NewObjectA(env, idClass.class, idClass.init, nil)
 	C.SetObjectField(env, obj, idClass.blessing, x.blessing.extractToJava(env))
@@ -821,6 +836,7 @@
 
 func (x *C.v23_syncbase_WatchChange) extractToJava(env *C.JNIEnv) C.jobject {
 	obj := C.NewObjectA(env, watchChangeClass.class, watchChangeClass.init, nil)
+	C.SetObjectField(env, obj, watchChangeClass.entityType, x.entityType.extractToJava(env))
 	C.SetObjectField(env, obj, watchChangeClass.collection, x.collection.extractToJava(env))
 	C.SetObjectField(env, obj, watchChangeClass.row, x.row.extractToJava(env))
 	C.SetObjectField(env, obj, watchChangeClass.changeType, x.changeType.extractToJava(env))
diff --git a/services/syncbase/bridge/cgo/jni_lib.go b/services/syncbase/bridge/cgo/jni_lib.go
index 1169ef6..45aa6b3 100644
--- a/services/syncbase/bridge/cgo/jni_lib.go
+++ b/services/syncbase/bridge/cgo/jni_lib.go
@@ -46,6 +46,23 @@
 	}
 }
 
+type jEntityType struct {
+	class      C.jclass
+	root       C.jfieldID
+	collection C.jfieldID
+	row        C.jfieldID
+}
+
+func newJEntityType(env *C.JNIEnv) jEntityType {
+	cls := findClass(env, "io/v/syncbase/core/WatchChange$EntityType")
+	return jEntityType{
+		class:      cls,
+		root:       jGetStaticFieldID(env, cls, "ROOT", "Lio/v/syncbase/core/WatchChange$EntityType;"),
+		collection: jGetStaticFieldID(env, cls, "COLLECTION", "Lio/v/syncbase/core/WatchChange$EntityType;"),
+		row:        jGetStaticFieldID(env, cls, "ROW", "Lio/v/syncbase/core/WatchChange$EntityType;"),
+	}
+}
+
 type jHashMap struct {
 	class C.jclass
 	init  C.jmethodID
@@ -250,6 +267,7 @@
 type jWatchChange struct {
 	class        C.jclass
 	init         C.jmethodID
+	entityType   C.jfieldID
 	collection   C.jfieldID
 	row          C.jfieldID
 	changeType   C.jfieldID
@@ -264,6 +282,7 @@
 	return jWatchChange{
 		class:        cls,
 		init:         init,
+		entityType:   jGetFieldID(env, cls, "entityType", "Lio/v/syncbase/core/WatchChange$EntityType;"),
 		collection:   jGetFieldID(env, cls, "collection", "Lio/v/syncbase/core/Id;"),
 		row:          jGetFieldID(env, cls, "row", "Ljava/lang/String;"),
 		changeType:   jGetFieldID(env, cls, "changeType", "Lio/v/syncbase/core/WatchChange$ChangeType;"),
diff --git a/services/syncbase/bridge/cgo/lib.h b/services/syncbase/bridge/cgo/lib.h
index 748661d..553eadc 100644
--- a/services/syncbase/bridge/cgo/lib.h
+++ b/services/syncbase/bridge/cgo/lib.h
@@ -88,8 +88,16 @@
   v23_syncbase_ChangeTypeDelete = 1
 } v23_syncbase_ChangeType;
 
+// syncbase.EntityType
+typedef enum v23_syncbase_EntityType {
+  v23_syncbase_EntityTypeRoot = 0,
+  v23_syncbase_EntityTypeCollection = 1,
+  v23_syncbase_EntityTypeRow = 2
+} v23_syncbase_EntityType;
+
 // syncbase.WatchChange
 typedef struct {
+  v23_syncbase_EntityType entityType;
   v23_syncbase_Id collection;
   v23_syncbase_String row;
   v23_syncbase_ChangeType changeType;
diff --git a/services/syncbase/bridge/cgo/types.go b/services/syncbase/bridge/cgo/types.go
index 0188d17..680011d 100644
--- a/services/syncbase/bridge/cgo/types.go
+++ b/services/syncbase/bridge/cgo/types.go
@@ -412,23 +412,31 @@
 // C.v23_syncbase_WatchChange
 
 func (x *C.v23_syncbase_WatchChange) init(wc syncbase.WatchChange) error {
+	x.entityType = C.v23_syncbase_EntityType(wc.EntityType)
 	x.collection.init(wc.Collection)
 	x.row.init(wc.Row)
 	x.changeType = C.v23_syncbase_ChangeType(wc.ChangeType)
 	var value []byte
-	if wc.ChangeType != syncbase.DeleteChange {
-		var valueAsRawBytes vom.RawBytes
-		var err error
-		if err = wc.Value(&valueAsRawBytes); err != nil {
-			return err
-		}
-		if clientUnderstandsVOM {
-			value, err = vom.Encode(valueAsRawBytes)
-		} else {
-			err = valueAsRawBytes.ToValue(&value)
-		}
-		if err != nil {
-			return err
+	switch wc.EntityType {
+	case syncbase.EntityRoot:
+		// Nothing to do.
+	case syncbase.EntityCollection:
+		// TODO(razvanm): Pass the CollectionInfo from wc.value.
+	case syncbase.EntityRow:
+		if wc.ChangeType != syncbase.DeleteChange {
+			var valueAsRawBytes vom.RawBytes
+			var err error
+			if err = wc.Value(&valueAsRawBytes); err != nil {
+				return err
+			}
+			if clientUnderstandsVOM {
+				value, err = vom.Encode(valueAsRawBytes)
+			} else {
+				err = valueAsRawBytes.ToValue(&value)
+			}
+			if err != nil {
+				return err
+			}
 		}
 	}
 	x.value.init(value)
