diff --git a/lib/client_impl.dart b/lib/client_impl.dart
new file mode 100644
index 0000000..458ddab
--- /dev/null
+++ b/lib/client_impl.dart
@@ -0,0 +1,85 @@
+// 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.
+part of discovery;
+
+typedef Future _StopFunction();
+
+class _Client implements Client {
+  final AdvertiserProxy _advertiserProxy = new AdvertiserProxy.unbound();
+  final ScannerProxy _scannerProxy = new ScannerProxy.unbound();
+
+  _Client(ConnectToServiceFunction cts, String url) {
+    cts(url, _advertiserProxy);
+    cts(url, _scannerProxy);
+  }
+
+  Future<Scanner> scan(String query) async {
+    StreamController<Service> onFound = new StreamController<Service>();
+    StreamController<String> onLost = new StreamController<String>();
+    ScanHandlerStub handlerStub = new ScanHandlerStub.unbound();
+    handlerStub.impl = new _ScanHandler(onFound, onLost);
+
+    ScannerScanResponseParams scanResponse =
+        await _scannerProxy.ptr.scan(query, handlerStub);
+    if (scanResponse.err != null) {
+      throw scanResponse.err;
+    }
+
+    Future stop() {
+      return _scannerProxy.ptr.stop(scanResponse.handle);
+    }
+    return new _Scanner(stop, onFound.stream, onLost.stream);
+  }
+
+  Future<Advertiser> advertise(Service service,
+      {List<String> visibility: null}) async {
+    AdvertiserAdvertiseResponseParams advertiseResponse =
+        await _advertiserProxy.ptr.advertise(service, visibility);
+
+    if (advertiseResponse.err != null) {
+      throw advertiseResponse.err;
+    }
+
+    Future stop() {
+      return _advertiserProxy.ptr.stop(advertiseResponse.handle);
+    }
+    return new _Advertiser(stop);
+  }
+}
+
+class _Scanner implements Scanner {
+  final Stream<Service> onFound;
+  final Stream<String> onLost;
+
+  final _StopFunction _stop;
+  _Scanner(this._stop, this.onFound, this.onLost) {}
+
+  Future stop() {
+    return _stop();
+  }
+}
+
+class _Advertiser implements Advertiser {
+  final _StopFunction _stop;
+  _Advertiser(this._stop) {}
+
+  Future stop() {
+    return _stop();
+  }
+}
+
+class _ScanHandler extends ScanHandler {
+  StreamController<Service> _onFound;
+  StreamController<String> _onLost;
+
+  _ScanHandler(this._onFound, this._onLost);
+
+  found(Service s) {
+    _onFound.add(s);
+  }
+
+  lost(String instanceId) {
+    _onLost.add(instanceId);
+  }
+}
diff --git a/lib/discovery.dart b/lib/discovery.dart
index ad37fb7..eb40093 100644
--- a/lib/discovery.dart
+++ b/lib/discovery.dart
@@ -1,8 +1,78 @@
 // 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.
-
 library discovery;
 
-// Export everything from discovery.mojom.
-export 'gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart';
\ No newline at end of file
+import 'dart:async';
+
+import 'package:mojo/bindings.dart' as bindings;
+import 'gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart';
+
+export 'gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart' show Service;
+
+part 'client_impl.dart';
+
+typedef void ConnectToServiceFunction(String url, bindings.ProxyBase proxy);
+
+abstract class Client {
+  factory Client(ConnectToServiceFunction cts, String url) {
+    return new _Client(cts, url);
+  }
+
+  /// Scan scans services that match the query and returns a scanner handle that
+  /// includes streams of found and lost services.
+  /// Scanning will continue until [stop] is called on the [Scanner] handle.
+  ///
+  /// For example, the following code waits until finding the first service that matches the
+  /// query and then stops scanning.
+  ///
+  ///    Scanner scanner = client.scan('v.InterfaceName = "v.io/i" AND v.Attrs["a"] = "v"');
+  ///    Service firstFoundService = await scanner.onFound.first;
+  ///    scanner.stop();
+  ///
+  /// The query is a WHERE expression of a syncQL query against advertised services, where
+  /// keys are InstanceIds and values are Services.
+  ///
+  /// SyncQL tutorial at:
+  ///    https://github.com/vanadium/docs/blob/master/tutorials/syncql-tutorial.md
+  Future<Scanner> scan(String query);
+
+  /// Advertise advertises the [Service] to be discovered by [scan].
+  /// [visibility] is used to limit the principals that can see the advertisement.
+  /// An empty or null [visibility] means that there are no restrictions on visibility.
+  /// Advertising will continue until [stop] is called on the [Advertiser] handle.
+  ///
+  /// If service.InstanceId is not specified, a random unique identifier be
+  /// assigned to it. Any change to service will not be applied after advertising starts.
+  ///
+  /// It is an error to have simultaneously active advertisements for two identical
+  /// instances (service.InstanceId).
+  ///
+  /// For example, the following code advertises a service for 10 seconds.
+  ///
+  ///   Service service = new Service()
+  ///     ..interfaceName = 'v.io/i'
+  ///     ..attrs = {'a', 'v'};
+  ///   Advertiser advertiser = client.advertise(service);
+  ///   new Timer(const Duration(seconds: 10), () => advertiser.stop());
+  Future<Advertiser> advertise(Service service,
+      {List<String> visibility: null});
+}
+
+/// Handle to a scan call.
+abstract class Scanner {
+  /// A stream of [Service] objects as they are discovered by the scanner.
+  Stream<Service> get onFound;
+
+  /// A stream of instanceIds for services that are no longer advertised.
+  Stream<String> get onLost;
+
+  /// Stops scanning.
+  Future stop();
+}
+
+/// Handle to an advertise call.
+abstract class Advertiser {
+  /// Stops the advertisement.
+  Future stop();
+}
diff --git a/pubspec.yaml b/pubspec.yaml
index 5e48a2d..079085f 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Discovery is a discovery system for developers that makes it easy to advertise apps and scan for them. It works over MDNS and BLE.
 homepage: https://github.com/vanadium/mojo.discovery
 name: v23discovery
-version: 0.0.9
+version: 0.0.10
 dependencies:
   mojo_sdk: 0.2.7
 dev_dependencies:
