diff --git a/Makefile b/Makefile
index c2acbc4..940f314 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,8 @@
 include ../shared/mojo.mk
-V23_GO_FILES := $(shell find $(JIRI_ROOT) -name "*.go")
 
+ifndef MOJO_DIR
+        $(error MOJO_DIR is not set)
+endif
 
 ifdef ANDROID
 	DISCOVERY_BUILD_DIR := $(PWD)/gen/mojo/android
@@ -18,43 +20,59 @@
 	CGO_CXXFLAGS="-I$(MOJO_DIR)/src $(CGO_CXXFLAGS)" \
 	CGO_LDFLAGS="-L$(dir $(MOJO_SHARED_LIB)) -lsystem_thunk $(CGO_LDFLAGS)" \
 	$(GOROOT)/bin/go test -v $1
-
 endef
-all: $(DISCOVERY_BUILD_DIR)/discovery.mojo
+
+V23_GO_FILES := $(shell find $(JIRI_ROOT) -name "*.go")
+
+all: build
 
 # Installs dart dependencies.
 .PHONY: packages
 packages:
 	pub upgrade
 
+.PHONY: build
+build: packages $(DISCOVERY_BUILD_DIR)/discovery.mojo gen-mojom
+
+.PHONY: test
+test: discovery-test
+
+.PHONY: gen-mojom
+gen-mojom: go/src/mojom/vanadium/discovery/discovery.mojom.go lib/gen/dart-gen/mojom/lib/mojo/discovery.mojom.dart
+
 go/src/mojom/vanadium/discovery/discovery.mojom.go: mojom/vanadium/discovery.mojom | mojo-env-check
 	$(call MOJOM_GEN,$<,.,.,go)
 	gofmt -w $@
 
-go/src/mojom/vanadium/discovery/discovery.mojom.dart: mojom/vanadium/discovery.mojom packages | mojo-env-check
+lib/gen/dart-gen/mojom/lib/mojo/discovery.mojom.dart: mojom/vanadium/discovery.mojom | mojo-env-check
 	$(call MOJOM_GEN,$<,.,lib/gen,dart)
 	# TODO(nlacasse): mojom_bindings_generator creates bad symlinks on dart
 	# files, so we delete them.  Stop doing this once the generator is fixed.
 	# See https://github.com/domokit/mojo/issues/386
 	rm -f lib/gen/mojom/$(notdir $@)
 
-$(DISCOVERY_BUILD_DIR)/discovery.mojo: $(V23_GO_FILES) $(MOJO_SHARED_LIB) go/src/mojom/vanadium/discovery/discovery.mojom.go go/src/mojom/vanadium/discovery/discovery.mojom.dart | mojo-env-check
+$(DISCOVERY_BUILD_DIR)/discovery.mojo: $(V23_GO_FILES) $(MOJO_SHARED_LIB) | mojo-env-check
 	$(call MOGO_BUILD,vanadium/discovery,$@)
 
+discovery-test: $(V23_GO_FILES) $(MOJO_SHARED_LIB) go/src/mojom/vanadium/discovery/discovery.mojom.go | mojo-env-check
+	$(call CGO_TEST,vanadium/discovery/internal)
+
+clean:
+	rm -rf gen
+	rm -rf lib/gen/dart-pkg
+	rm -rf lib/gen/mojom
+
+# Examples.
+run-advertiser: $(DISCOVERY_BUILD_DIR)/advertiser.mojo $(DISCOVERY_BUILD_DIR)/discovery.mojo
+	$(MOJO_DIR)/src/mojo/devtools/common/mojo_run --config-file $(PWD)/mojoconfig $(MOJO_SHELL_FLAGS) $(MOJO_ANDROID_FLAGS) https://mojo.v.io/advertiser.mojo \
+	--args-for="https://mojo.v.io/discovery.mojo"
+
+run-scanner: $(DISCOVERY_BUILD_DIR)/scanner.mojo $(DISCOVERY_BUILD_DIR)/discovery.mojo
+	$(MOJO_DIR)/src/mojo/devtools/common/mojo_run --config-file $(PWD)/mojoconfig $(MOJO_SHELL_FLAGS) $(MOJO_ANDROID_FLAGS) https://mojo.v.io/scanner.mojo \
+	--args-for="https://mojo.v.io/discovery.mojo"
+
 $(DISCOVERY_BUILD_DIR)/advertiser.mojo: $(V23_GO_FILES) $(MOJO_SHARED_LIB) go/src/mojom/vanadium/discovery/discovery.mojom.go | mojo-env-check
 	$(call MOGO_BUILD,examples/advertiser,$@)
 
 $(DISCOVERY_BUILD_DIR)/scanner.mojo: $(V23_GO_FILES) $(MOJO_SHARED_LIB) go/src/mojom/vanadium/discovery/discovery.mojom.go | mojo-env-check
 	$(call MOGO_BUILD,examples/scanner,$@)
-
-discovery_test: $(V23_GO_FILES) $(MOJO_SHARED_LIB) go/src/mojom/vanadium/discovery/discovery.mojom.go | mojo-env-check
-	echo $(GOPATH)
-	$(call CGO_TEST,vanadium/discovery/internal)
-
-run-advertiser: $(DISCOVERY_BUILD_DIR)/advertiser.mojo $(DISCOVERY_BUILD_DIR)/discovery.mojo
-	sudo $(MOJO_DIR)/src/mojo/devtools/common/mojo_run --config-file $(PWD)/mojoconfig $(MOJO_SHELL_FLAGS) $(MOJO_ANDROID_FLAGS) https://mojo.v.io/advertiser.mojo \
-	--args-for="https://mojo.v.io/discovery.mojo host1 ble mdns"
-
-run-scanner: $(DISCOVERY_BUILD_DIR)/scanner.mojo $(DISCOVERY_BUILD_DIR)/discovery.mojo
-	sudo $(MOJO_DIR)/src/mojo/devtools/common/mojo_run --config-file $(PWD)/mojoconfig $(MOJO_SHELL_FLAGS) $(MOJO_ANDROID_FLAGS) https://mojo.v.io/scanner.mojo \
-	--args-for="https://mojo.v.io/discovery.mojo host2 ble mdns"
diff --git a/go/src/mojom/vanadium/discovery/discovery.mojom.go b/go/src/mojom/vanadium/discovery/discovery.mojom.go
index 6d35293..f39fb62 100644
--- a/go/src/mojom/vanadium/discovery/discovery.mojom.go
+++ b/go/src/mojom/vanadium/discovery/discovery.mojom.go
@@ -86,7 +86,7 @@
 }
 
 type Advertiser interface {
-	Advertise(inS Service, inVisibility []string) (outHandle uint32, outErr *Error, err error)
+	Advertise(inService Service, inVisibility []string) (outHandle uint32, outErr *Error, err error)
 	Stop(inH uint32) (err error)
 }
 
@@ -152,7 +152,7 @@
 }
 
 type advertiser_Advertise_Params struct {
-	inS          Service
+	inService    Service
 	inVisibility []string
 }
 
@@ -161,7 +161,7 @@
 	if err := encoder.WritePointer(); err != nil {
 		return err
 	}
-	if err := s.inS.Encode(encoder); err != nil {
+	if err := s.inService.Encode(encoder); err != nil {
 		return err
 	}
 	if err := encoder.WritePointer(); err != nil {
@@ -216,7 +216,7 @@
 		if pointer0 == 0 {
 			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
 		} else {
-			if err := s.inS.Decode(decoder); err != nil {
+			if err := s.inService.Decode(decoder); err != nil {
 				return err
 			}
 		}
@@ -263,7 +263,7 @@
 // String names and labels used by the MojomStruct types.
 var (
 	structName_AdvertiserAdvertiseParams                   = "AdvertiserAdvertiseParams"
-	structFieldName_AdvertiserAdvertiseParams_InS          = "InS"
+	structFieldName_AdvertiserAdvertiseParams_InService    = "InService"
 	structFieldName_AdvertiserAdvertiseParams_InVisibility = "InVisibility"
 )
 
@@ -273,7 +273,7 @@
 			ShortName: &structName_AdvertiserAdvertiseParams,
 		}, Fields: []mojom_types.StructField{mojom_types.StructField{
 			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_AdvertiserAdvertiseParams_InS,
+				ShortName: &structFieldName_AdvertiserAdvertiseParams_InService,
 			},
 			Type: &mojom_types.TypeTypeReference{
 				Value: mojom_types.TypeReference{Identifier: &ID_discovery_Service__,
@@ -394,9 +394,9 @@
 	}
 }
 
-func (p *Advertiser_Proxy) Advertise(inS Service, inVisibility []string) (outHandle uint32, outErr *Error, err error) {
+func (p *Advertiser_Proxy) Advertise(inService Service, inVisibility []string) (outHandle uint32, outErr *Error, err error) {
 	payload := &advertiser_Advertise_Params{
-		inS,
+		inService,
 		inVisibility,
 	}
 	header := bindings.MessageHeader{
@@ -606,7 +606,7 @@
 			return err
 		}
 		var response advertiser_Advertise_ResponseParams
-		response.outHandle, response.outErr, err = s.impl.Advertise(request.inS, request.inVisibility)
+		response.outHandle, response.outErr, err = s.impl.Advertise(request.inService, request.inVisibility)
 		if err != nil {
 			return
 		}
@@ -1169,7 +1169,7 @@
 }
 
 type ScanHandler interface {
-	Found(inS Service) (err error)
+	Found(inService Service) (err error)
 	Lost(inInstanceId []uint8) (err error)
 }
 
@@ -1235,7 +1235,7 @@
 }
 
 type scanHandler_Found_Params struct {
-	inS Service
+	inService Service
 }
 
 func (s *scanHandler_Found_Params) Encode(encoder *bindings.Encoder) error {
@@ -1243,7 +1243,7 @@
 	if err := encoder.WritePointer(); err != nil {
 		return err
 	}
-	if err := s.inS.Encode(encoder); err != nil {
+	if err := s.inService.Encode(encoder); err != nil {
 		return err
 	}
 	if err := encoder.Finish(); err != nil {
@@ -1283,7 +1283,7 @@
 		if pointer0 == 0 {
 			return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpected null pointer"}
 		} else {
-			if err := s.inS.Decode(decoder); err != nil {
+			if err := s.inService.Decode(decoder); err != nil {
 				return err
 			}
 		}
@@ -1296,8 +1296,8 @@
 
 // String names and labels used by the MojomStruct types.
 var (
-	structName_ScanHandlerFoundParams          = "ScanHandlerFoundParams"
-	structFieldName_ScanHandlerFoundParams_InS = "InS"
+	structName_ScanHandlerFoundParams                = "ScanHandlerFoundParams"
+	structFieldName_ScanHandlerFoundParams_InService = "InService"
 )
 
 func discovery_ScanHandler_Found_Params__() mojom_types.MojomStruct {
@@ -1306,7 +1306,7 @@
 			ShortName: &structName_ScanHandlerFoundParams,
 		}, Fields: []mojom_types.StructField{mojom_types.StructField{
 			DeclData: &mojom_types.DeclarationData{
-				ShortName: &structFieldName_ScanHandlerFoundParams_InS,
+				ShortName: &structFieldName_ScanHandlerFoundParams_InService,
 			},
 			Type: &mojom_types.TypeTypeReference{
 				Value: mojom_types.TypeReference{Identifier: &ID_discovery_Service__,
@@ -1316,9 +1316,9 @@
 	}
 }
 
-func (p *ScanHandler_Proxy) Found(inS Service) (err error) {
+func (p *ScanHandler_Proxy) Found(inService Service) (err error) {
 	payload := &scanHandler_Found_Params{
-		inS,
+		inService,
 	}
 	header := bindings.MessageHeader{
 		Type:  scanHandler_Found_Name,
@@ -1532,7 +1532,7 @@
 		if err := message.DecodePayload(&request); err != nil {
 			return err
 		}
-		err = s.impl.Found(request.inS)
+		err = s.impl.Found(request.inService)
 		if err != nil {
 			return
 		}
diff --git a/go/src/vanadium/discovery/discovery.go b/go/src/vanadium/discovery/discovery.go
index 1a829ac..86fce64 100644
--- a/go/src/vanadium/discovery/discovery.go
+++ b/go/src/vanadium/discovery/discovery.go
@@ -5,19 +5,19 @@
 package main
 
 import (
-	"v.io/v23"
-	discovery_factory "v.io/x/ref/lib/discovery/factory"
-
-	_ "v.io/x/ref/runtime/factories/generic"
-
-	mojom "mojom/vanadium/discovery"
-	"vanadium/discovery/internal"
+	"sync"
 
 	"mojo/public/go/application"
 	"mojo/public/go/bindings"
 	"mojo/public/go/system"
-	"sync"
+	mojom "mojom/vanadium/discovery"
+
+	"v.io/v23"
 	"v.io/v23/context"
+
+	_ "v.io/x/ref/runtime/factories/generic"
+
+	"vanadium/discovery/internal"
 )
 
 //#include "mojo/public/c/system/types.h"
@@ -32,8 +32,8 @@
 	stubs map[*bindings.Stub]struct{}
 
 	ctx      *context.T
-	impl     *internal.DiscoveryService
 	shutdown v23.Shutdown
+	impl     *internal.DiscoveryService
 }
 
 func (d *discoveryDelegate) Initialize(c application.Context) {
@@ -41,19 +41,8 @@
 	// will be bad.  For now, this is ok because this is the only
 	// vanadium service that will be used in the demos and each go library
 	// will be in its own process.
-	ctx, shutdown := v23.Init()
-
-	if len(c.Args()) <= 2 {
-		ctx.Fatalf("Not enough arguments passed to discovery.mojo. Given: %v. Pass a name to advertise, followed by 1+ discovery protocols.", c)
-	}
-	// TODO(bjornick): Change this to use the factory to determine which protocols to use.
-	inst, err := discovery_factory.New(c.Args()[2:]...)
-	if err != nil {
-		ctx.Fatalf("failed to initalize discovery: %v", err)
-	}
-
-	d.impl = internal.NewDiscoveryService(ctx, inst)
-	d.shutdown = shutdown
+	d.ctx, d.shutdown = v23.Init()
+	d.impl = internal.NewDiscoveryService(d.ctx)
 }
 
 func (d *discoveryDelegate) addAndServeStub(stub *bindings.Stub) {
diff --git a/go/src/vanadium/discovery/internal/discovery.go b/go/src/vanadium/discovery/internal/discovery.go
index c577c59..3ae5da2 100644
--- a/go/src/vanadium/discovery/internal/discovery.go
+++ b/go/src/vanadium/discovery/internal/discovery.go
@@ -10,6 +10,7 @@
 	"mojo/public/go/bindings"
 	mojom "mojom/vanadium/discovery"
 
+	"v.io/v23"
 	"v.io/v23/context"
 	"v.io/v23/discovery"
 	"v.io/v23/security"
@@ -21,8 +22,8 @@
 // DiscoveryService implements the mojom interface mojom/vanadium/discovery.DiscoveryService.  It
 // is basically a thin wrapper around the Vanadium Discovery API.
 type DiscoveryService struct {
-	ctx *context.T
-	s   discovery.T
+	ctx       *context.T
+	discovery discovery.T
 
 	// mu protects pending* and next*
 	mu sync.Mutex
@@ -47,10 +48,10 @@
 
 // NewDiscoveryService returns a new DiscoveryService bound to the context and the Vanadium
 // Discovery implementation passed in.
-func NewDiscoveryService(ctx *context.T, vDiscovery discovery.T) *DiscoveryService {
+func NewDiscoveryService(ctx *context.T) *DiscoveryService {
 	return &DiscoveryService{
 		ctx:         ctx,
-		s:           vDiscovery,
+		discovery:   v23.GetDiscovery(ctx),
 		nextAdv:     1,
 		activeAdvs:  map[id]func(){},
 		activeScans: map[id]func(){},
@@ -74,7 +75,7 @@
 	for i, pattern := range patterns {
 		perms[i] = security.BlessingPattern(pattern)
 	}
-	done, err := d.s.Advertise(ctx, vService, perms)
+	done, err := d.discovery.Advertise(ctx, vService, perms)
 	if err != nil {
 		cancel()
 		return 0, v2mError(err), nil
@@ -115,7 +116,7 @@
 // Returns the handle to this Scan.
 func (d *DiscoveryService) Scan(query string, scanHandler mojom.ScanHandler_Pointer) (uint32, *mojom.Error, error) {
 	ctx, cancel := context.WithCancel(d.ctx)
-	scanCh, err := d.s.Scan(ctx, query)
+	scanCh, err := d.discovery.Scan(ctx, query)
 	if err != nil {
 		cancel()
 		return 0, v2mError(err), nil
@@ -169,6 +170,6 @@
 	for _, cancel := range d.activeAdvs {
 		cancel()
 	}
-	d.s.Close()
+	d.discovery.Close()
 	d.mu.Unlock()
 }
diff --git a/go/src/vanadium/discovery/internal/discovery_test.go b/go/src/vanadium/discovery/internal/discovery_test.go
index b9ff152..6aa62b4 100644
--- a/go/src/vanadium/discovery/internal/discovery_test.go
+++ b/go/src/vanadium/discovery/internal/discovery_test.go
@@ -18,15 +18,12 @@
 	"v.io/v23/security"
 
 	idiscovery "v.io/x/ref/lib/discovery"
+	dfactory "v.io/x/ref/lib/discovery/factory"
 	_ "v.io/x/ref/runtime/factories/generic"
 	vtest "v.io/x/ref/test"
 )
 
-type mockAdv struct {
-	s discovery.Service
-}
-
-type discoveryMock struct {
+type mockDiscovery struct {
 	mu       sync.Mutex
 	trigger  *idiscovery.Trigger
 	id       int64
@@ -35,7 +32,7 @@
 	deleteCh chan struct{}
 }
 
-func (d *discoveryMock) Advertise(ctx *context.T, s discovery.Service, perms []security.BlessingPattern) (<-chan struct{}, error) {
+func (d *mockDiscovery) Advertise(ctx *context.T, s discovery.Service, perms []security.BlessingPattern) (<-chan struct{}, error) {
 	d.mu.Lock()
 	currId := d.id
 	d.services[currId] = s
@@ -54,11 +51,11 @@
 	return done, nil
 }
 
-func (*discoveryMock) Scan(ctx *context.T, query string) (<-chan discovery.Update, error) {
+func (*mockDiscovery) Scan(ctx *context.T, query string) (<-chan discovery.Update, error) {
 	return nil, nil
 }
 
-func (*discoveryMock) Close() {}
+func (*mockDiscovery) Close() {}
 
 func compare(want discovery.Service, got mojom.Service) error {
 	mwant := v2mService(want)
@@ -69,14 +66,17 @@
 }
 
 func TestAdvertising(t *testing.T) {
-	ctx, shutdown := vtest.V23Init()
-	defer shutdown()
-	mock := &discoveryMock{
+	mock := &mockDiscovery{
 		trigger:  idiscovery.NewTrigger(),
 		services: map[int64]discovery.Service{},
 		deleteCh: make(chan struct{}),
 	}
-	s := NewDiscoveryService(ctx, mock)
+	dfactory.InjectDiscovery(mock)
+
+	ctx, shutdown := vtest.V23Init()
+	defer shutdown()
+
+	s := NewDiscoveryService(ctx)
 	testService := mojom.Service{
 		InterfaceName: "v.io/v23/discovery.T",
 		Attrs: map[string]string{
diff --git a/lib/gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart b/lib/gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart
index 89d46bb..60a3e41 100644
--- a/lib/gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart
+++ b/lib/gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart
@@ -269,7 +269,7 @@
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(24, 0)
   ];
-  Service s = null;
+  Service service = null;
   List<String> visibility = null;
 
   AdvertiserAdvertiseParams() : super(kVersions.last.size);
@@ -308,7 +308,7 @@
     if (mainDataHeader.version >= 0) {
       
       var decoder1 = decoder0.decodePointer(8, false);
-      result.s = Service.decode(decoder1);
+      result.service = Service.decode(decoder1);
     }
     if (mainDataHeader.version >= 0) {
       
@@ -328,7 +328,7 @@
   void encode(bindings.Encoder encoder) {
     var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
     
-    encoder0.encodeStruct(s, 8, false);
+    encoder0.encodeStruct(service, 8, false);
     
     if (visibility == null) {
       encoder0.encodeNullPointer(16, false);
@@ -343,13 +343,13 @@
 
   String toString() {
     return "AdvertiserAdvertiseParams("
-           "s: $s" ", "
+           "service: $service" ", "
            "visibility: $visibility" ")";
   }
 
   Map toJson() {
     Map map = new Map();
-    map["s"] = s;
+    map["service"] = service;
     map["visibility"] = visibility;
     return map;
   }
@@ -712,7 +712,7 @@
   static const List<bindings.StructDataHeader> kVersions = const [
     const bindings.StructDataHeader(16, 0)
   ];
-  Service s = null;
+  Service service = null;
 
   ScanHandlerFoundParams() : super(kVersions.last.size);
 
@@ -750,7 +750,7 @@
     if (mainDataHeader.version >= 0) {
       
       var decoder1 = decoder0.decodePointer(8, false);
-      result.s = Service.decode(decoder1);
+      result.service = Service.decode(decoder1);
     }
     return result;
   }
@@ -758,17 +758,17 @@
   void encode(bindings.Encoder encoder) {
     var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
     
-    encoder0.encodeStruct(s, 8, false);
+    encoder0.encodeStruct(service, 8, false);
   }
 
   String toString() {
     return "ScanHandlerFoundParams("
-           "s: $s" ")";
+           "service: $service" ")";
   }
 
   Map toJson() {
     Map map = new Map();
-    map["s"] = s;
+    map["service"] = service;
     return map;
   }
 }
@@ -845,7 +845,7 @@
       'discovery::Advertiser';
 
 abstract class Advertiser {
-  dynamic advertise(Service s,List<String> visibility,[Function responseFactory = null]);
+  dynamic advertise(Service service,List<String> visibility,[Function responseFactory = null]);
   void stop(int h);
 
 }
@@ -874,18 +874,25 @@
         var r = AdvertiserAdvertiseResponseParams.deserialize(
             message.payload);
         if (!message.header.hasRequestId) {
-          throw 'Expected a message with a valid request Id.';
+          proxyError("Expected a message with a valid request Id.");
+          return;
         }
         Completer c = completerMap[message.header.requestId];
         if (c == null) {
-          throw 'Message had unknown request Id: ${message.header.requestId}';
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
         }
         completerMap.remove(message.header.requestId);
-        assert(!c.isCompleted);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
         c.complete(r);
         break;
       default:
-        throw new bindings.MojoCodecError("Unexpected message name");
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
         break;
     }
   }
@@ -901,10 +908,9 @@
   AdvertiserProxyImpl _proxyImpl;
 
   _AdvertiserProxyCalls(this._proxyImpl);
-    dynamic advertise(Service s,List<String> visibility,[Function responseFactory = null]) {
-      assert(_proxyImpl.isBound);
+    dynamic advertise(Service service,List<String> visibility,[Function responseFactory = null]) {
       var params = new AdvertiserAdvertiseParams();
-      params.s = s;
+      params.service = service;
       params.visibility = visibility;
       return _proxyImpl.sendMessageWithRequestId(
           params,
@@ -913,7 +919,10 @@
           bindings.MessageHeader.kMessageExpectsResponse);
     }
     void stop(int h) {
-      assert(_proxyImpl.isBound);
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
       var params = new AdvertiserStopParams();
       params.h = h;
       _proxyImpl.sendMessage(params, kAdvertiser_stop_name);
@@ -962,6 +971,10 @@
 
   Future close({bool immediate: false}) => impl.close(immediate: immediate);
 
+  Future responseOrError(Future f) => impl.responseOrError(f);
+
+  Future get errorFuture => impl.errorFuture;
+
   int get version => impl.version;
 
   Future<int> queryVersion() => impl.queryVersion();
@@ -1015,7 +1028,7 @@
       case kAdvertiser_advertise_name:
         var params = AdvertiserAdvertiseParams.deserialize(
             message.payload);
-        var response = _impl.advertise(params.s,params.visibility,_AdvertiserAdvertiseResponseParamsFactory);
+        var response = _impl.advertise(params.service,params.visibility,_AdvertiserAdvertiseResponseParamsFactory);
         if (response is Future) {
           return response.then((response) {
             if (response != null) {
@@ -1096,18 +1109,25 @@
         var r = ScannerScanResponseParams.deserialize(
             message.payload);
         if (!message.header.hasRequestId) {
-          throw 'Expected a message with a valid request Id.';
+          proxyError("Expected a message with a valid request Id.");
+          return;
         }
         Completer c = completerMap[message.header.requestId];
         if (c == null) {
-          throw 'Message had unknown request Id: ${message.header.requestId}';
+          proxyError(
+              "Message had unknown request Id: ${message.header.requestId}");
+          return;
         }
         completerMap.remove(message.header.requestId);
-        assert(!c.isCompleted);
+        if (c.isCompleted) {
+          proxyError("Response completer already completed");
+          return;
+        }
         c.complete(r);
         break;
       default:
-        throw new bindings.MojoCodecError("Unexpected message name");
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
         break;
     }
   }
@@ -1124,7 +1144,6 @@
 
   _ScannerProxyCalls(this._proxyImpl);
     dynamic scan(String query,Object scanHandler,[Function responseFactory = null]) {
-      assert(_proxyImpl.isBound);
       var params = new ScannerScanParams();
       params.query = query;
       params.scanHandler = scanHandler;
@@ -1135,7 +1154,10 @@
           bindings.MessageHeader.kMessageExpectsResponse);
     }
     void stop(int h) {
-      assert(_proxyImpl.isBound);
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
       var params = new ScannerStopParams();
       params.h = h;
       _proxyImpl.sendMessage(params, kScanner_stop_name);
@@ -1184,6 +1206,10 @@
 
   Future close({bool immediate: false}) => impl.close(immediate: immediate);
 
+  Future responseOrError(Future f) => impl.responseOrError(f);
+
+  Future get errorFuture => impl.errorFuture;
+
   int get version => impl.version;
 
   Future<int> queryVersion() => impl.queryVersion();
@@ -1289,7 +1315,7 @@
       'discovery::ScanHandler';
 
 abstract class ScanHandler {
-  void found(Service s);
+  void found(Service service);
   void lost(List<int> instanceId);
 
 }
@@ -1315,7 +1341,8 @@
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
-        throw new bindings.MojoCodecError("Unexpected message name");
+        proxyError("Unexpected message type: ${message.header.type}");
+        close(immediate: true);
         break;
     }
   }
@@ -1331,15 +1358,21 @@
   ScanHandlerProxyImpl _proxyImpl;
 
   _ScanHandlerProxyCalls(this._proxyImpl);
-    void found(Service s) {
-      assert(_proxyImpl.isBound);
+    void found(Service service) {
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
       var params = new ScanHandlerFoundParams();
-      params.s = s;
+      params.service = service;
       _proxyImpl.sendMessage(params, kScanHandler_found_name);
     }
   
     void lost(List<int> instanceId) {
-      assert(_proxyImpl.isBound);
+      if (!_proxyImpl.isBound) {
+        _proxyImpl.proxyError("The Proxy is closed.");
+        return;
+      }
       var params = new ScanHandlerLostParams();
       params.instanceId = instanceId;
       _proxyImpl.sendMessage(params, kScanHandler_lost_name);
@@ -1388,6 +1421,10 @@
 
   Future close({bool immediate: false}) => impl.close(immediate: immediate);
 
+  Future responseOrError(Future f) => impl.responseOrError(f);
+
+  Future get errorFuture => impl.errorFuture;
+
   int get version => impl.version;
 
   Future<int> queryVersion() => impl.queryVersion();
@@ -1435,7 +1472,7 @@
       case kScanHandler_found_name:
         var params = ScanHandlerFoundParams.deserialize(
             message.payload);
-        _impl.found(params.s);
+        _impl.found(params.service);
         break;
       case kScanHandler_lost_name:
         var params = ScanHandlerLostParams.deserialize(
diff --git a/mojom/vanadium/discovery.mojom b/mojom/vanadium/discovery.mojom
index b5c960c..f61ccdb 100644
--- a/mojom/vanadium/discovery.mojom
+++ b/mojom/vanadium/discovery.mojom
@@ -6,57 +6,70 @@
 
 // Copied from v.io/v23/discovery/types.vdl
 struct Service {
-    // The 128 bit (16 byte) universal unique identifier of a service instance.
-	// If this is not specified, a random UUID will be used.
-	array<uint8> InstanceUuid;
-	// Optional name of the service instance.
-	string InstanceName;
-	// The interface that the service implements.
-	// E.g., 'v.io/v23/services/vtrace.Store'.
-	string InterfaceName;
-	// The service attributes.
-	// E.g., {'resolution': '1024x768'}.
-	map<string, string> Attrs;
-	// The addresses that the service is served on.
-	// E.g., '/host:port/a/b/c'.
-	array<string> Addrs;
+  // The 128 bit (16 byte) universal unique identifier of a service instance.
+  // If this is not specified, a random UUID will be used.
+  array<uint8> InstanceUuid;
+  // Optional name of the service instance.
+  string InstanceName;
+  // The interface that the service implements.
+  // E.g., 'v.io/v23/services/vtrace.Store'.
+  string InterfaceName;
+  // The service attributes.
+  // E.g., {'resolution': '1024x768'}.
+  map<string, string> Attrs;
+  // The addresses that the service is served on.
+  // E.g., '/host:port/a/b/c'.
+  array<string> Addrs;
 };
 
 struct Error {
-   string id;
-   int32 action;
-   string msg;
+  string id;
+  int32 action;
+  string msg;
 };
 
 // Advertiser provides methods to do Vanadium Advertising.
 interface Advertiser {
-    // Advertise advertises the service to be discovered by "Scanner" implementations.
-	// visibility is used to limit the principals that can see the advertisement. An
-	// empty set means that there are no restrictions on visibility (i.e, equivalent
-	// to []security.BlessingPattern{security.AllPrincipals}). Advertising will continue
-	// until the context is canceled or exceeds its deadline.
-	Advertise(Service s, array<string> visibility) => (uint32 Handle, Error? Err);
+  // Advertise advertises the service to be discovered by "Scanner" implementations.
+  // visibility is used to limit the principals that can see the advertisement. An
+  // empty set means that there are no restrictions on visibility (i.e, equivalent
+  // to []security.BlessingPattern{security.AllPrincipals}).
+  //
+  // It is an error to have simultaneously active advertisements for two identical
+  // instances (service.InstanceUuid).
+  Advertise(Service service, array<string> visibility) => (uint32 Handle, Error? Err);
 
-	// Stop Stops the advertisement associated with the given handle.
-	Stop(uint32 h);
+  // Stop Stops the advertisement associated with the given handle.
+  Stop(uint32 h);
 };
 
 // Scanner provides methods to scan for Vanadium advertisements.
 interface Scanner {
-	// Scan scans for services matching the query passed and calls ScanHandler with updates.
-	// Returns a handle to the active scanner that can be used to stop the scanning.
-	Scan(string query, ScanHandler scanHandler) => (uint32 Handle, Error? Err);
+  // Scan scans for services matching the query passed and calls ScanHandler with updates.
+  //
+  // The query is a WHERE expression of syncQL query against scanned services, where
+  // keys are InstanceUuids and values are Service.
+  //
+  // Examples
+  //
+  //    v.InstanceName = "v.io/i"
+  //    v.InstanceName = "v.io/i" AND v.Attrs["a"] = "v"
+  //    v.Attrs["a"] = "v1" OR v.Attrs["a"] = "v2"
+  //
+  // SyncQL tutorial at:
+  //    https://github.com/vanadium/docs/blob/master/tutorials/syncql-tutorial.md
+  Scan(string query, ScanHandler scanHandler) => (uint32 Handle, Error? Err);
 
-	// StopScan stops the scanner associated weith the given handle.
-	Stop(uint32 h);
+  // StopScan stops the scanner associated weith the given handle.
+  Stop(uint32 h);
 };
 
-// ScanHandler is used to pass updates about Services that are found/lost during the
-// scan.
+// ScanHandler is used to pass updates about Services that are found/lost during
+// the scan.
 interface ScanHandler {
-	// Found will be called when a Service is found.
-	Found(Service s);
+  // Found will be called when a Service is found.
+  Found(Service service);
 
-	// Lost will be called when a service is lost.
-	Lost(array<uint8> instanceId);
-};
\ No newline at end of file
+  // Lost will be called when a service is lost.
+  Lost(array<uint8> instanceId);
+};
