diff --git a/lib/gen/dart-gen/mojom/lib/mojo/syncbase.mojom.dart b/lib/gen/dart-gen/mojom/lib/mojo/syncbase.mojom.dart
index a9da4ac..0f45607 100644
--- a/lib/gen/dart-gen/mojom/lib/mojo/syncbase.mojom.dart
+++ b/lib/gen/dart-gen/mojom/lib/mojo/syncbase.mojom.dart
@@ -1776,6 +1776,153 @@
 }
 
 
+class SyncbaseServiceListAppsParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(8, 0)
+  ];
+
+  SyncbaseServiceListAppsParams() : super(kVersions.last.size);
+
+  static SyncbaseServiceListAppsParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    decoder.excessHandles.forEach((h) => h.close());
+    return result;
+  }
+
+  static SyncbaseServiceListAppsParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SyncbaseServiceListAppsParams result = new SyncbaseServiceListAppsParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    encoder.getStructEncoderAtOffset(kVersions.last);
+  }
+
+  String toString() {
+    return "SyncbaseServiceListAppsParams("")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    return map;
+  }
+}
+
+
+class SyncbaseServiceListAppsResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Error err = null;
+  List<String> apps = null;
+
+  SyncbaseServiceListAppsResponseParams() : super(kVersions.last.size);
+
+  static SyncbaseServiceListAppsResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    decoder.excessHandles.forEach((h) => h.close());
+    return result;
+  }
+
+  static SyncbaseServiceListAppsResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SyncbaseServiceListAppsResponseParams result = new SyncbaseServiceListAppsResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.err = Error.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.apps = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.apps[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(err, 8, false);
+    
+    if (apps == null) {
+      encoder0.encodeNullPointer(16, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(apps.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < apps.length; ++i0) {
+        
+        encoder1.encodeString(apps[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "SyncbaseServiceListAppsResponseParams("
+           "err: $err" ", "
+           "apps: $apps" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["err"] = err;
+    map["apps"] = apps;
+    return map;
+  }
+}
+
+
 class SyncbaseAppCreateParams extends bindings.Struct {
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(24, 0)
@@ -2338,6 +2485,162 @@
 }
 
 
+class SyncbaseAppListDatabasesParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(16, 0)
+  ];
+  String name = null;
+
+  SyncbaseAppListDatabasesParams() : super(kVersions.last.size);
+
+  static SyncbaseAppListDatabasesParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    decoder.excessHandles.forEach((h) => h.close());
+    return result;
+  }
+
+  static SyncbaseAppListDatabasesParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SyncbaseAppListDatabasesParams result = new SyncbaseAppListDatabasesParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      result.name = decoder0.decodeString(8, false);
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeString(name, 8, false);
+  }
+
+  String toString() {
+    return "SyncbaseAppListDatabasesParams("
+           "name: $name" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["name"] = name;
+    return map;
+  }
+}
+
+
+class SyncbaseAppListDatabasesResponseParams extends bindings.Struct {
+  static const List<bindings.StructDataHeader> kVersions = const [
+    const bindings.StructDataHeader(24, 0)
+  ];
+  Error err = null;
+  List<String> databases = null;
+
+  SyncbaseAppListDatabasesResponseParams() : super(kVersions.last.size);
+
+  static SyncbaseAppListDatabasesResponseParams deserialize(bindings.Message message) {
+    var decoder = new bindings.Decoder(message);
+    var result = decode(decoder);
+    decoder.excessHandles.forEach((h) => h.close());
+    return result;
+  }
+
+  static SyncbaseAppListDatabasesResponseParams decode(bindings.Decoder decoder0) {
+    if (decoder0 == null) {
+      return null;
+    }
+    SyncbaseAppListDatabasesResponseParams result = new SyncbaseAppListDatabasesResponseParams();
+
+    var mainDataHeader = decoder0.decodeStructDataHeader();
+    if (mainDataHeader.version <= kVersions.last.version) {
+      // Scan in reverse order to optimize for more recent versions.
+      for (int i = kVersions.length - 1; i >= 0; --i) {
+        if (mainDataHeader.version >= kVersions[i].version) {
+          if (mainDataHeader.size == kVersions[i].size) {
+            // Found a match.
+            break;
+          }
+          throw new bindings.MojoCodecError(
+              'Header size doesn\'t correspond to known version size.');
+        }
+      }
+    } else if (mainDataHeader.size < kVersions.last.size) {
+      throw new bindings.MojoCodecError(
+        'Message newer than the last known version cannot be shorter than '
+        'required by the last known version.');
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(8, false);
+      result.err = Error.decode(decoder1);
+    }
+    if (mainDataHeader.version >= 0) {
+      
+      var decoder1 = decoder0.decodePointer(16, false);
+      {
+        var si1 = decoder1.decodeDataHeaderForPointerArray(bindings.kUnspecifiedArrayLength);
+        result.databases = new List<String>(si1.numElements);
+        for (int i1 = 0; i1 < si1.numElements; ++i1) {
+          
+          result.databases[i1] = decoder1.decodeString(bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i1, false);
+        }
+      }
+    }
+    return result;
+  }
+
+  void encode(bindings.Encoder encoder) {
+    var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
+    
+    encoder0.encodeStruct(err, 8, false);
+    
+    if (databases == null) {
+      encoder0.encodeNullPointer(16, false);
+    } else {
+      var encoder1 = encoder0.encodePointerArray(databases.length, 16, bindings.kUnspecifiedArrayLength);
+      for (int i0 = 0; i0 < databases.length; ++i0) {
+        
+        encoder1.encodeString(databases[i0], bindings.ArrayDataHeader.kHeaderSize + bindings.kPointerSize * i0, false);
+      }
+    }
+  }
+
+  String toString() {
+    return "SyncbaseAppListDatabasesResponseParams("
+           "err: $err" ", "
+           "databases: $databases" ")";
+  }
+
+  Map toJson() {
+    Map map = new Map();
+    map["err"] = err;
+    map["databases"] = databases;
+    return map;
+  }
+}
+
+
 class SyncbaseAppSetPermissionsParams extends bindings.Struct {
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(32, 0)
@@ -8290,46 +8593,48 @@
 
 const int kSyncbase_serviceGetPermissions_name = 0;
 const int kSyncbase_serviceSetPermissions_name = 1;
-const int kSyncbase_appCreate_name = 2;
-const int kSyncbase_appDestroy_name = 3;
-const int kSyncbase_appExists_name = 4;
-const int kSyncbase_appGetPermissions_name = 5;
-const int kSyncbase_appSetPermissions_name = 6;
-const int kSyncbase_dbCreate_name = 7;
-const int kSyncbase_dbDestroy_name = 8;
-const int kSyncbase_dbExists_name = 9;
-const int kSyncbase_dbExec_name = 10;
-const int kSyncbase_dbBeginBatch_name = 11;
-const int kSyncbase_dbCommit_name = 12;
-const int kSyncbase_dbAbort_name = 13;
-const int kSyncbase_dbGetPermissions_name = 14;
-const int kSyncbase_dbSetPermissions_name = 15;
-const int kSyncbase_dbWatchGlob_name = 16;
-const int kSyncbase_dbGetResumeMarker_name = 17;
-const int kSyncbase_dbListTables_name = 18;
-const int kSyncbase_dbGetSyncgroupNames_name = 19;
-const int kSyncbase_dbCreateSyncgroup_name = 20;
-const int kSyncbase_dbJoinSyncgroup_name = 21;
-const int kSyncbase_dbLeaveSyncgroup_name = 22;
-const int kSyncbase_dbDestroySyncgroup_name = 23;
-const int kSyncbase_dbEjectFromSyncgroup_name = 24;
-const int kSyncbase_dbGetSyncgroupSpec_name = 25;
-const int kSyncbase_dbSetSyncgroupSpec_name = 26;
-const int kSyncbase_dbGetSyncgroupMembers_name = 27;
-const int kSyncbase_tableCreate_name = 28;
-const int kSyncbase_tableDestroy_name = 29;
-const int kSyncbase_tableExists_name = 30;
-const int kSyncbase_tableGetPermissions_name = 31;
-const int kSyncbase_tableSetPermissions_name = 32;
-const int kSyncbase_tableDeleteRange_name = 33;
-const int kSyncbase_tableScan_name = 34;
-const int kSyncbase_tableGetPrefixPermissions_name = 35;
-const int kSyncbase_tableSetPrefixPermissions_name = 36;
-const int kSyncbase_tableDeletePrefixPermissions_name = 37;
-const int kSyncbase_rowExists_name = 38;
-const int kSyncbase_rowGet_name = 39;
-const int kSyncbase_rowPut_name = 40;
-const int kSyncbase_rowDelete_name = 41;
+const int kSyncbase_serviceListApps_name = 2;
+const int kSyncbase_appCreate_name = 3;
+const int kSyncbase_appDestroy_name = 4;
+const int kSyncbase_appExists_name = 5;
+const int kSyncbase_appGetPermissions_name = 6;
+const int kSyncbase_appListDatabases_name = 7;
+const int kSyncbase_appSetPermissions_name = 8;
+const int kSyncbase_dbCreate_name = 9;
+const int kSyncbase_dbDestroy_name = 10;
+const int kSyncbase_dbExists_name = 11;
+const int kSyncbase_dbExec_name = 12;
+const int kSyncbase_dbBeginBatch_name = 13;
+const int kSyncbase_dbCommit_name = 14;
+const int kSyncbase_dbAbort_name = 15;
+const int kSyncbase_dbGetPermissions_name = 16;
+const int kSyncbase_dbSetPermissions_name = 17;
+const int kSyncbase_dbWatchGlob_name = 18;
+const int kSyncbase_dbGetResumeMarker_name = 19;
+const int kSyncbase_dbListTables_name = 20;
+const int kSyncbase_dbGetSyncgroupNames_name = 21;
+const int kSyncbase_dbCreateSyncgroup_name = 22;
+const int kSyncbase_dbJoinSyncgroup_name = 23;
+const int kSyncbase_dbLeaveSyncgroup_name = 24;
+const int kSyncbase_dbDestroySyncgroup_name = 25;
+const int kSyncbase_dbEjectFromSyncgroup_name = 26;
+const int kSyncbase_dbGetSyncgroupSpec_name = 27;
+const int kSyncbase_dbSetSyncgroupSpec_name = 28;
+const int kSyncbase_dbGetSyncgroupMembers_name = 29;
+const int kSyncbase_tableCreate_name = 30;
+const int kSyncbase_tableDestroy_name = 31;
+const int kSyncbase_tableExists_name = 32;
+const int kSyncbase_tableGetPermissions_name = 33;
+const int kSyncbase_tableSetPermissions_name = 34;
+const int kSyncbase_tableDeleteRange_name = 35;
+const int kSyncbase_tableScan_name = 36;
+const int kSyncbase_tableGetPrefixPermissions_name = 37;
+const int kSyncbase_tableSetPrefixPermissions_name = 38;
+const int kSyncbase_tableDeletePrefixPermissions_name = 39;
+const int kSyncbase_rowExists_name = 40;
+const int kSyncbase_rowGet_name = 41;
+const int kSyncbase_rowPut_name = 42;
+const int kSyncbase_rowDelete_name = 43;
 
 const String SyncbaseName =
       'mojo::Syncbase';
@@ -8337,10 +8642,12 @@
 abstract class Syncbase {
   dynamic serviceGetPermissions([Function responseFactory = null]);
   dynamic serviceSetPermissions(Perms perms,String version,[Function responseFactory = null]);
+  dynamic serviceListApps([Function responseFactory = null]);
   dynamic appCreate(String name,Perms perms,[Function responseFactory = null]);
   dynamic appDestroy(String name,[Function responseFactory = null]);
   dynamic appExists(String name,[Function responseFactory = null]);
   dynamic appGetPermissions(String name,[Function responseFactory = null]);
+  dynamic appListDatabases(String name,[Function responseFactory = null]);
   dynamic appSetPermissions(String name,Perms perms,String version,[Function responseFactory = null]);
   dynamic dbCreate(String name,Perms perms,[Function responseFactory = null]);
   dynamic dbDestroy(String name,[Function responseFactory = null]);
@@ -8428,6 +8735,20 @@
         assert(!c.isCompleted);
         c.complete(r);
         break;
+      case kSyncbase_serviceListApps_name:
+        var r = SyncbaseServiceListAppsResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          throw 'Expected a message with a valid request Id.';
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          throw 'Message had unknown request Id: ${message.header.requestId}';
+        }
+        completerMap.remove(message.header.requestId);
+        assert(!c.isCompleted);
+        c.complete(r);
+        break;
       case kSyncbase_appCreate_name:
         var r = SyncbaseAppCreateResponseParams.deserialize(
             message.payload);
@@ -8484,6 +8805,20 @@
         assert(!c.isCompleted);
         c.complete(r);
         break;
+      case kSyncbase_appListDatabases_name:
+        var r = SyncbaseAppListDatabasesResponseParams.deserialize(
+            message.payload);
+        if (!message.header.hasRequestId) {
+          throw 'Expected a message with a valid request Id.';
+        }
+        Completer c = completerMap[message.header.requestId];
+        if (c == null) {
+          throw 'Message had unknown request Id: ${message.header.requestId}';
+        }
+        completerMap.remove(message.header.requestId);
+        assert(!c.isCompleted);
+        c.complete(r);
+        break;
       case kSyncbase_appSetPermissions_name:
         var r = SyncbaseAppSetPermissionsResponseParams.deserialize(
             message.payload);
@@ -9025,6 +9360,15 @@
           -1,
           bindings.MessageHeader.kMessageExpectsResponse);
     }
+    dynamic serviceListApps([Function responseFactory = null]) {
+      assert(_proxyImpl.isBound);
+      var params = new SyncbaseServiceListAppsParams();
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kSyncbase_serviceListApps_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
     dynamic appCreate(String name,Perms perms,[Function responseFactory = null]) {
       assert(_proxyImpl.isBound);
       var params = new SyncbaseAppCreateParams();
@@ -9066,6 +9410,16 @@
           -1,
           bindings.MessageHeader.kMessageExpectsResponse);
     }
+    dynamic appListDatabases(String name,[Function responseFactory = null]) {
+      assert(_proxyImpl.isBound);
+      var params = new SyncbaseAppListDatabasesParams();
+      params.name = name;
+      return _proxyImpl.sendMessageWithRequestId(
+          params,
+          kSyncbase_appListDatabases_name,
+          -1,
+          bindings.MessageHeader.kMessageExpectsResponse);
+    }
     dynamic appSetPermissions(String name,Perms perms,String version,[Function responseFactory = null]) {
       assert(_proxyImpl.isBound);
       var params = new SyncbaseAppSetPermissionsParams();
@@ -9552,6 +9906,12 @@
     result.err = err;
     return result;
   }
+  SyncbaseServiceListAppsResponseParams _SyncbaseServiceListAppsResponseParamsFactory(Error err, List<String> apps) {
+    var result = new SyncbaseServiceListAppsResponseParams();
+    result.err = err;
+    result.apps = apps;
+    return result;
+  }
   SyncbaseAppCreateResponseParams _SyncbaseAppCreateResponseParamsFactory(Error err) {
     var result = new SyncbaseAppCreateResponseParams();
     result.err = err;
@@ -9575,6 +9935,12 @@
     result.version = version;
     return result;
   }
+  SyncbaseAppListDatabasesResponseParams _SyncbaseAppListDatabasesResponseParamsFactory(Error err, List<String> databases) {
+    var result = new SyncbaseAppListDatabasesResponseParams();
+    result.err = err;
+    result.databases = databases;
+    return result;
+  }
   SyncbaseAppSetPermissionsResponseParams _SyncbaseAppSetPermissionsResponseParamsFactory(Error err) {
     var result = new SyncbaseAppSetPermissionsResponseParams();
     result.err = err;
@@ -9824,6 +10190,28 @@
               bindings.MessageHeader.kMessageIsResponse);
         }
         break;
+      case kSyncbase_serviceListApps_name:
+        var params = SyncbaseServiceListAppsParams.deserialize(
+            message.payload);
+        var response = _impl.serviceListApps(_SyncbaseServiceListAppsResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kSyncbase_serviceListApps_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kSyncbase_serviceListApps_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
       case kSyncbase_appCreate_name:
         var params = SyncbaseAppCreateParams.deserialize(
             message.payload);
@@ -9912,6 +10300,28 @@
               bindings.MessageHeader.kMessageIsResponse);
         }
         break;
+      case kSyncbase_appListDatabases_name:
+        var params = SyncbaseAppListDatabasesParams.deserialize(
+            message.payload);
+        var response = _impl.appListDatabases(params.name,_SyncbaseAppListDatabasesResponseParamsFactory);
+        if (response is Future) {
+          return response.then((response) {
+            if (response != null) {
+              return buildResponseWithId(
+                  response,
+                  kSyncbase_appListDatabases_name,
+                  message.header.requestId,
+                  bindings.MessageHeader.kMessageIsResponse);
+            }
+          });
+        } else if (response != null) {
+          return buildResponseWithId(
+              response,
+              kSyncbase_appListDatabases_name,
+              message.header.requestId,
+              bindings.MessageHeader.kMessageIsResponse);
+        }
+        break;
       case kSyncbase_appSetPermissions_name:
         var params = SyncbaseAppSetPermissionsParams.deserialize(
             message.payload);
diff --git a/lib/src/app.dart b/lib/src/app.dart
index 6c27195..b3f3876 100644
--- a/lib/src/app.dart
+++ b/lib/src/app.dart
@@ -41,6 +41,15 @@
     return v.perms;
   }
 
+  // TODO(aghassemi): Maybe add an abstract class for SyncbaseDatabase so we can
+  // return either NoSqlDatabase or SqlDatabase (when both exist).
+  Future<List<SyncbaseNoSqlDatabase>> listDatabases() async {
+    var v = await _ctx.syncbase.appListDatabases(fullName);
+    if (isError(v.err)) throw v.err;
+
+    return v.databases.map((dbName) => this.noSqlDatabase(dbName)).toList();
+  }
+
   Future setPermissions(mojom.Perms perms, String version) async {
     var v = await _ctx.syncbase.appSetPermissions(fullName, perms, version);
     if (isError(v.err)) throw v.err;
diff --git a/lib/src/nosql/database.dart b/lib/src/nosql/database.dart
index 2577feb..b4e4581 100644
--- a/lib/src/nosql/database.dart
+++ b/lib/src/nosql/database.dart
@@ -4,7 +4,6 @@
 
 part of syncbase_client;
 
-// TODO(sadovsky): Add listTables method.
 class SyncbaseNoSqlDatabase extends NamedResource {
   SyncbaseNoSqlDatabase._internal(
       _ctx, _parentFullName, relativeName, batchSuffix)
diff --git a/lib/syncbase_client.dart b/lib/syncbase_client.dart
index e98f5ab..68759d0 100644
--- a/lib/syncbase_client.dart
+++ b/lib/syncbase_client.dart
@@ -74,6 +74,13 @@
     return v.perms;
   }
 
+  Future<List<SyncbaseApp>> listApps() async {
+    var v = await _ctx.syncbase.serviceListApps();
+    if (isError(v.err)) throw v.err;
+
+    return v.apps.map((appName) => this.app(appName)).toList();
+  }
+
   Future setPermissions(mojom.Perms perms, String version) async {
     var v = await _ctx.syncbase.serviceSetPermissions(perms, version);
     if (isError(v.err)) throw v.err;
diff --git a/mojom/syncbase.mojom b/mojom/syncbase.mojom
index 1009b87..793a5d9 100644
--- a/mojom/syncbase.mojom
+++ b/mojom/syncbase.mojom
@@ -96,7 +96,6 @@
 };
 
 // TODO(sadovsky): Add schema version to all RPCs. See v.io/c/13734.
-// TODO(aghassemi): Add ListApps and ListDatabases methods. See v.io/i/794.
 // All 'name' params are service-relative object names.
 
 // Error handling modeled after:
@@ -107,6 +106,7 @@
 
   ServiceGetPermissions() => (Error err, Perms perms, string version);
   ServiceSetPermissions(Perms perms, string version) => (Error err);
+  ServiceListApps() => (Error err, array<string> apps);
 
   ////////////////////////////////////////
   // App
@@ -115,6 +115,7 @@
   AppDestroy(string name) => (Error err);
   AppExists(string name) => (Error err, bool exists);
   AppGetPermissions(string name) => (Error err, Perms perms, string version);
+  AppListDatabases(string name) => (Error err, array<string> databases);
   AppSetPermissions(string name, Perms perms, string version) => (Error err);
 
   ////////////////////////////////////////
diff --git a/test/integration/syncbase_app_test.dart b/test/integration/syncbase_app_test.dart
index 33f3d8c..6777ec5 100644
--- a/test/integration/syncbase_app_test.dart
+++ b/test/integration/syncbase_app_test.dart
@@ -29,5 +29,39 @@
     expect(await app.exists(), equals(false));
   });
 
+  test('listing apps', () async {
+    var appName = utils.uniqueName('app');
+    await c.app(appName).create(utils.emptyPerms());
+
+    var apps = await c.listApps();
+
+    // NOTE(aghassemi): Since the Syncbase instance is shared between all tests,
+    // we will get a lot more than just 1 app, so we simply verify that our
+    // appName is in the returned list.
+    expect(apps.length, greaterThan(0));
+    var ourApp = apps.firstWhere((e) => e.name == appName);
+    expect(ourApp.name, equals(appName));
+  });
+
+  test('listing databases', () async {
+    var appName = utils.uniqueName('app');
+    var app = c.app(appName);
+    await app.create(utils.emptyPerms());
+
+    var dbNames = [utils.uniqueName('db1'), utils.uniqueName('db2')];
+    dbNames.sort();
+
+    for (var dbName in dbNames) {
+      await app.noSqlDatabase(dbName).create(utils.emptyPerms());
+    }
+
+    var dbs = await app.listDatabases();
+    dbs.sort((d1, d2) => d1.name.compareTo(d2.name));
+    expect(dbs.length, equals(dbNames.length));
+    for (var i = 0; i < dbNames.length; i++) {
+      expect(dbs[i].name, equals(dbNames[i]));
+    }
+  });
+
   // TODO(nlacasse): Test app.get/setPermissions.
 }
diff --git a/test/integration/syncbase_database_test.dart b/test/integration/syncbase_database_test.dart
index 9318f57..850766f 100644
--- a/test/integration/syncbase_database_test.dart
+++ b/test/integration/syncbase_database_test.dart
@@ -43,11 +43,7 @@
     var db = app.noSqlDatabase(utils.uniqueName('db'));
     await db.create(utils.emptyPerms());
 
-    var tableNames = [
-      utils.uniqueName('table'),
-      utils.uniqueName('table'),
-      utils.uniqueName('table'),
-    ];
+    var tableNames = [utils.uniqueName('table1'), utils.uniqueName('table2')];
     tableNames.sort();
 
     for (var tableName in tableNames) {
@@ -57,7 +53,7 @@
     var tables = await db.listTables();
     tables.sort((t1, t2) => t1.name.compareTo(t2.name));
     expect(tables.length, equals(tableNames.length));
-    for (var i = 0; i < tables.length; i++) {
+    for (var i = 0; i < tableNames.length; i++) {
       expect(tables[i].name, equals(tableNames[i]));
     }
   });
