diff --git a/extension/manifest.json b/extension/manifest.json
index 89c0449..ab38291 100644
--- a/extension/manifest.json
+++ b/extension/manifest.json
@@ -1,6 +1,6 @@
 {
   "name": "Vanadium Extension",
-  "version": "0.1.7",
+  "version": "0.1.8",
   "description": "Access and create Vanadium services from JavaScript.",
   "manifest_version": 2,
   "icons": {
diff --git a/extension/src/components/settings/index.js b/extension/src/components/settings/index.js
index 80e81af..636ec76 100644
--- a/extension/src/components/settings/index.js
+++ b/extension/src/components/settings/index.js
@@ -19,7 +19,7 @@
 module.exports.render = render;
 
 var defaults = {
-  identityd: 'identity/dev.v.io/root/google',
+  identityd: 'identity/dev.v.io/u/google',
   identitydBlessingUrl: 'https://dev.v.io/auth/blessing-root',
   namespaceRoot: '/(dev.v.io/role/vprod/service/mounttabled)@ns.dev.v.io:8101',
   proxy: 'proxy',
diff --git a/src/gen-vdl/v.io/x/ref/services/wspr/internal/rpc/server/index.js b/src/gen-vdl/v.io/x/ref/services/wspr/internal/rpc/server/index.js
index cd45b2d..b27766f 100644
--- a/src/gen-vdl/v.io/x/ref/services/wspr/internal/rpc/server/index.js
+++ b/src/gen-vdl/v.io/x/ref/services/wspr/internal/rpc/server/index.js
@@ -11,6 +11,7 @@
 
 
 
+var signature = require('./../../../../../../../v23/vdlroot/signature');
 var time = require('./../../../../../../../v23/vdlroot/time');
 var security = require('./../../../../../../../v23/security');
 var vtrace = require('./../../../../../../../v23/vtrace');
@@ -27,9 +28,12 @@
 var _type4 = new vdl.Type();
 var _type5 = new vdl.Type();
 var _type6 = new vdl.Type();
+var _type7 = new vdl.Type();
+var _typeAuthReply = new vdl.Type();
 var _typeCaveatValidationRequest = new vdl.Type();
 var _typeCaveatValidationResponse = new vdl.Type();
 var _typeContext = new vdl.Type();
+var _typeLookupReply = new vdl.Type();
 var _typeSecurityCall = new vdl.Type();
 var _typeServerRpcRequest = new vdl.Type();
 var _typeServerRpcRequestCall = new vdl.Type();
@@ -51,6 +55,12 @@
 _type6.kind = vdl.kind.OPTIONAL;
 _type6.name = "";
 _type6.elem = new principal.JsBlessings()._type;
+_type7.kind = vdl.kind.LIST;
+_type7.name = "";
+_type7.elem = new signature.Interface()._type;
+_typeAuthReply.kind = vdl.kind.STRUCT;
+_typeAuthReply.name = "v.io/x/ref/services/wspr/internal/rpc/server.AuthReply";
+_typeAuthReply.fields = [{name: "Err", type: vdl.types.ERROR}];
 _typeCaveatValidationRequest.kind = vdl.kind.STRUCT;
 _typeCaveatValidationRequest.name = "v.io/x/ref/services/wspr/internal/rpc/server.CaveatValidationRequest";
 _typeCaveatValidationRequest.fields = [{name: "Call", type: _typeSecurityCall}, {name: "Context", type: _typeContext}, {name: "Cavs", type: _type3}];
@@ -60,6 +70,9 @@
 _typeContext.kind = vdl.kind.STRUCT;
 _typeContext.name = "v.io/x/ref/services/wspr/internal/rpc/server.Context";
 _typeContext.fields = [{name: "Language", type: vdl.types.STRING}];
+_typeLookupReply.kind = vdl.kind.STRUCT;
+_typeLookupReply.name = "v.io/x/ref/services/wspr/internal/rpc/server.LookupReply";
+_typeLookupReply.fields = [{name: "Handle", type: vdl.types.INT32}, {name: "HasAuthorizer", type: vdl.types.BOOL}, {name: "HasGlobber", type: vdl.types.BOOL}, {name: "Signature", type: _type7}, {name: "Err", type: vdl.types.ERROR}];
 _typeSecurityCall.kind = vdl.kind.STRUCT;
 _typeSecurityCall.name = "v.io/x/ref/services/wspr/internal/rpc/server.SecurityCall";
 _typeSecurityCall.fields = [{name: "Method", type: vdl.types.STRING}, {name: "Suffix", type: vdl.types.STRING}, {name: "MethodTags", type: _type1}, {name: "LocalBlessings", type: new principal.JsBlessings()._type}, {name: "LocalBlessingStrings", type: _type2}, {name: "RemoteBlessings", type: new principal.JsBlessings()._type}, {name: "RemoteBlessingStrings", type: _type2}, {name: "LocalEndpoint", type: vdl.types.STRING}, {name: "RemoteEndpoint", type: vdl.types.STRING}];
@@ -75,15 +88,20 @@
 _type4.freeze();
 _type5.freeze();
 _type6.freeze();
+_type7.freeze();
+_typeAuthReply.freeze();
 _typeCaveatValidationRequest.freeze();
 _typeCaveatValidationResponse.freeze();
 _typeContext.freeze();
+_typeLookupReply.freeze();
 _typeSecurityCall.freeze();
 _typeServerRpcRequest.freeze();
 _typeServerRpcRequestCall.freeze();
+module.exports.AuthReply = (vdl.registry.lookupOrCreateConstructor(_typeAuthReply));
 module.exports.CaveatValidationRequest = (vdl.registry.lookupOrCreateConstructor(_typeCaveatValidationRequest));
 module.exports.CaveatValidationResponse = (vdl.registry.lookupOrCreateConstructor(_typeCaveatValidationResponse));
 module.exports.Context = (vdl.registry.lookupOrCreateConstructor(_typeContext));
+module.exports.LookupReply = (vdl.registry.lookupOrCreateConstructor(_typeLookupReply));
 module.exports.SecurityCall = (vdl.registry.lookupOrCreateConstructor(_typeSecurityCall));
 module.exports.ServerRpcRequest = (vdl.registry.lookupOrCreateConstructor(_typeServerRpcRequest));
 module.exports.ServerRpcRequestCall = (vdl.registry.lookupOrCreateConstructor(_typeServerRpcRequestCall));
diff --git a/src/lib/hex-vom.js b/src/lib/hex-vom.js
new file mode 100644
index 0000000..fa73524
--- /dev/null
+++ b/src/lib/hex-vom.js
@@ -0,0 +1,24 @@
+// 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.
+
+/**
+ * @private
+ * @fileoverview Helper methods for vom and hex encode/decode.
+ */
+
+var byteUtil = require('../vdl/byte-util');
+var vom = require('../vom');
+
+module.exports = {
+  decode: decode,
+  encode: encode
+};
+
+function encode(x) {
+  return byteUtil.bytes2Hex(vom.encode(x));
+}
+
+function decode(x) {
+  return vom.decode(byteUtil.hex2Bytes(x));
+}
diff --git a/src/proxy/index.js b/src/proxy/index.js
index 6e0b705..ec2d7ff 100644
--- a/src/proxy/index.js
+++ b/src/proxy/index.js
@@ -15,12 +15,10 @@
 var Incoming = MessageType.Incoming;
 var Outgoing = MessageType.Outgoing;
 var vlog = require('./../lib/vlog');
-var byteUtil = require('../vdl/byte-util');
-var vom = require('../vom');
 var unwrap = require('../vdl/type-util').unwrap;
 var Encoder = require('../vom/encoder');
 var Decoder = require('../vom/decoder');
-
+var hexVom = require('../lib/hex-vom');
 
 // Cache the service signatures for one hour.
 var SIGNATURE_CACHE_TTL = 3600 * 1000;
@@ -68,7 +66,7 @@
 
   var payload;
   try {
-    payload = vom.decode(byteUtil.hex2Bytes(message.data));
+    payload = hexVom.decode(message.data);
     payload.message = unwrap(payload.message);
   } catch (e) {
     vlog.logger.error(e);
@@ -147,7 +145,11 @@
   if (handler) {
     this.outstandingRequests[id] = handler;
   }
-  var body = JSON.stringify({ id: id, data: message, type: type });
+  var body = {
+    id: id,
+    data: message,
+    type: type
+  };
 
   var self = this;
   this.senderPromise.then(function(sender) {
diff --git a/src/proxy/nacl.js b/src/proxy/nacl.js
index 4d9d483..a21614f 100644
--- a/src/proxy/nacl.js
+++ b/src/proxy/nacl.js
@@ -7,14 +7,13 @@
  * @private
  */
 
-var extensionEventProxy = require('../browser/event-proxy');
-var errors = require('../verror/index');
 var Deferred = require('../lib/deferred');
+var errors = require('../verror/index');
+var extensionEventProxy = require('../browser/event-proxy');
+var hexVom = require('../lib/hex-vom');
 var Proxy = require('./index');
 var random = require('../lib/random');
 var vlog = require('./../lib/vlog');
-var byteUtil = require('../vdl/byte-util');
-var vom = require('../vom');
 
 module.exports = ProxyConnection;
 
@@ -32,7 +31,7 @@
   this.onBrowsprMsg = function(msg) {
     var body;
     try {
-      body = vom.decode(byteUtil.hex2Bytes(msg.body));
+      body = hexVom.decode(msg.body);
     } catch (e) {
       vlog.logger.warn('Failed to parse ' + msg.body + 'err: ' + e);
       return;
diff --git a/src/proxy/stream-handler.js b/src/proxy/stream-handler.js
index f0a4c60..49c90be 100644
--- a/src/proxy/stream-handler.js
+++ b/src/proxy/stream-handler.js
@@ -3,15 +3,13 @@
 // license that can be found in the LICENSE file.
 
 var Incoming = require('./message-type').Incoming;
-var byteUtil = require('../vdl/byte-util');
-var vom = require('../vom');
 var emitStreamError = require('../lib/emit-stream-error');
 var vError = require('../gen-vdl/v.io/v23/verror');
 var SharedContextKeys = require('../runtime/shared-context-keys');
 var Blessings = require('../security/blessings');
 var JsBlessings =
   require('../gen-vdl/v.io/x/ref/services/wspr/internal/principal').JsBlessings;
-
+var hexVom = require('../lib/hex-vom');
 
 module.exports = Handler;
 
@@ -32,7 +30,7 @@
   switch (type) {
     case Incoming.STREAM_RESPONSE:
       try {
-        data = vom.decode(byteUtil.hex2Bytes(data));
+        data = hexVom.decode(data);
       } catch (e) {
         emitStreamError(this._stream,
           new vError.InternalError(this._ctx,
diff --git a/src/proxy/stream.js b/src/proxy/stream.js
index fcb2b67..e218fab 100644
--- a/src/proxy/stream.js
+++ b/src/proxy/stream.js
@@ -11,14 +11,13 @@
 var Duplex = require('stream').Duplex;
 var vlog = require('../lib/vlog');
 var inherits = require('inherits');
-var byteUtil = require('../vdl/byte-util');
-var vom = require('../vom');
 var fill = require('../vdl/canonicalize').fill;
 var reduce = require('../vdl/canonicalize').reduce;
 var unwrap = require('../vdl/type-util').unwrap;
 var Blessings = require('../security/blessings');
 var ServerRpcReply =
   require('../gen-vdl/v.io/x/ref/services/wspr/internal/lib').ServerRpcReply;
+var hexVom = require('../lib/hex-vom');
 
 /**
  * @summary
@@ -79,11 +78,11 @@
   var object = {
     id: this.flowId,
     type: Outgoing.RESPONSE,
-    data: byteUtil.bytes2Hex(vom.encode(new ServerRpcReply({
+    data: hexVom.encode(new ServerRpcReply({
       results: results,
       err: err || null,
       traceResponse: traceResponse
-    })))
+    }))
   };
   Duplex.prototype.write.call(this, object);
 };
@@ -171,7 +170,7 @@
   var canonChunk = fill(chunk, this.writeType);
   var object = {
     id: this.flowId,
-    data: byteUtil.bytes2Hex(vom.encode(canonChunk)),
+    data: hexVom.encode(canonChunk),
     type: Outgoing.STREAM_VALUE
   };
   return Duplex.prototype.write.call(this, object, encoding, cb);
@@ -179,7 +178,7 @@
 
 Stream.prototype._write = function(chunk, encoding, cb) {
   this.webSocketPromise.then(function(websocket) {
-    websocket.send(JSON.stringify(chunk));
+    websocket.send(chunk);
     cb();
   });
 };
diff --git a/src/proxy/websocket.js b/src/proxy/websocket.js
index ef23e59..baa236e 100644
--- a/src/proxy/websocket.js
+++ b/src/proxy/websocket.js
@@ -10,11 +10,10 @@
 var isBrowser = require('is-browser');
 var WebSocket = require('ws');
 
-var byteUtil = require('../vdl/byte-util');
 var Deferred = require('./../lib/deferred');
+var hexVom = require('../lib/hex-vom');
 var Proxy = require('./index');
 var vlog = require('./../lib/vlog');
-var vom = require('../vom');
 
 /**
  * A client for the vanadium service using websockets. Connects to the vanadium
@@ -34,7 +33,10 @@
   // has completed.
   var def = new Deferred();
   Proxy.call(this, def.promise);
-  def.resolve(this.getWebSocket());
+  var proxy = this;
+  this.getWebSocket().then(function success() {
+    def.resolve(proxy);
+  }, def.reject);
 }
 
 ProxyConnection.prototype = Object.create(Proxy.prototype);
@@ -86,7 +88,7 @@
   websocket.onmessage = function(frame) {
     var message;
     try {
-      message = vom.decode(byteUtil.hex2Bytes(frame.data));
+      message = hexVom.decode(frame.data);
     } catch (e) {
       vlog.logger.warn('Failed to parse ' + frame.data + ' err: ' + e);
       return;
@@ -98,13 +100,18 @@
   return deferred.promise;
 };
 
+ProxyConnection.prototype.send = function(msg) {
+  this.getWebSocket().then(function(ws) {
+    ws.send(JSON.stringify(msg));
+  }).catch(function(err) {
+    throw err;
+  });
+};
+
 ProxyConnection.prototype.close = function(cb) {
-  var proxy = this;
   var deferred = new Deferred(cb);
 
-  proxy
-  .getWebSocket()
-  .then(close, function(err) {
+  this.getWebSocket().then(close, function(err) {
     // TODO(jasoncampbell): Better error handling around websocket connection
     // It's possible that the initial connection failed with
     // "Error: getaddrinfo ENOTFOUND" Since there was not a
diff --git a/src/rpc/client.js b/src/rpc/client.js
index 4c5e292..6f05115 100644
--- a/src/rpc/client.js
+++ b/src/rpc/client.js
@@ -19,6 +19,7 @@
 var context = require('../context');
 var Deferred = require('../lib/deferred');
 var emitStreamError = require('../lib/emit-stream-error');
+var hexVom = require('../lib/hex-vom');
 var Incoming = require('../proxy/message-type').Incoming;
 var makeError = require('../verror/make-errors');
 var Outgoing = require('../proxy/message-type').Outgoing;
@@ -36,7 +37,6 @@
 var vdl = require('../vdl');
 var verror = require('../gen-vdl/v.io/v23/verror');
 var vlog = require('../lib/vlog');
-var vom = require('../vom');
 var SharedContextKeys = require('../runtime/shared-context-keys');
 var vtrace = require('../vtrace');
 var Blessings = require('../security/blessings');
@@ -241,7 +241,7 @@
 OutstandingRPC.prototype.handleStreamData = function(data) {
   if (this._def.stream) {
     try {
-      data = vom.decode(byteUtil.hex2Bytes(data));
+      data = hexVom.decode(data);
     } catch (e) {
       this.handleError(
         new verror.InternalError(this._ctx, 'Failed to decode result: ', e));
diff --git a/src/rpc/granter-router.js b/src/rpc/granter-router.js
index 40394da..a2390a5 100644
--- a/src/rpc/granter-router.js
+++ b/src/rpc/granter-router.js
@@ -5,8 +5,7 @@
 
 var asyncCall = require('../lib/async-call');
 var Deferred = require('../lib/deferred');
-var vom = require('../vom');
-var byteUtil = require('../vdl/byte-util');
+var hexVom = require('../lib/hex-vom');
 var verror = require('../gen-vdl/v.io/v23/verror');
 var MessageType = require('../proxy/message-type');
 var Incoming = MessageType.Incoming;
@@ -44,7 +43,7 @@
   }
 
   try {
-   request = vom.decode(byteUtil.hex2Bytes(request));
+   request = hexVom.decode(request);
    request = request.val;
   } catch (e) {
     // TODO(bjornick): Pass in context here so we can generate useful error
@@ -52,7 +51,7 @@
     var res = new GranterResponse({
       err: new verror.NoExistError(this._rootCtx, 'failed to decode message')
     });
-    var data = byteUtil.bytes2Hex(vom.encode(res));
+    var data = hexVom.encode(res);
     this._proxy.sendRequest(data, Outgoing.GRANTER_RESPONSE,
         null, messageId);
   }
@@ -63,7 +62,7 @@
     var res = new GranterResponse({
       err: new verror.NoExistError(this._rootCtx, 'unknown granter')
     });
-    var data = byteUtil.bytes2Hex(vom.encode(res));
+    var data = hexVom.encode(res);
     this._proxy.sendRequest(data, Outgoing.GRANTER_RESPONSE,
         null, messageId);
     return;
@@ -83,14 +82,14 @@
         err: new verror.NoExistError(this._rootCtx, 'error while granting: ' +
           err)
       });
-      var errData = byteUtil.bytes2Hex(vom.encode(res));
+      var errData = hexVom.encode(res);
       self._proxy.sendRequest(errData, Outgoing.GRANTER_RESPONSE,
           null, messageId);
       def.resolve();
       return;
     }
     var result = new GranterResponse({blessings: outBlessings[0]._id});
-    var data = byteUtil.bytes2Hex(vom.encode(result));
+    var data = hexVom.encode(result);
     self._proxy.sendRequest(data, Outgoing.GRANTER_RESPONSE, null,
       messageId);
     def.resolve();
diff --git a/src/rpc/server-router.js b/src/rpc/server-router.js
index 53520d8..9c4a3a1 100644
--- a/src/rpc/server-router.js
+++ b/src/rpc/server-router.js
@@ -19,21 +19,20 @@
 var SecurityCall = require('../security/call');
 var ServerCall = require('./server-call');
 var vdl = require('../vdl');
-var byteUtil = require('../vdl/byte-util');
 var typeUtil = require('../vdl/type-util');
 var Deferred = require('../lib/deferred');
 var capitalize = require('../vdl/util').capitalize;
-var vom = require('../vom');
-var vdlsig = require('../gen-vdl/v.io/v23/vdlroot/signature');
 var namespaceUtil = require('../naming/util');
 var naming = require('../gen-vdl/v.io/v23/naming');
 var Glob = require('./glob');
 var GlobStream = require('./glob-stream');
 var ServerRpcReply =
   require('../gen-vdl/v.io/x/ref/services/wspr/internal/lib').ServerRpcReply;
-var CaveatValidationResponse =
-  require('../gen-vdl/v.io/x/ref/services/wspr/internal/rpc/server').
-  CaveatValidationResponse;
+var serverVdl =
+  require('../gen-vdl/v.io/x/ref/services/wspr/internal/rpc/server');
+var CaveatValidationResponse = serverVdl.CaveatValidationResponse;
+var AuthReply = serverVdl.AuthReply;
+var LookupReply = serverVdl.LookupReply;
 var vtrace = require('../vtrace');
 var lib =
   require('../gen-vdl/v.io/x/ref/services/wspr/internal/lib');
@@ -43,6 +42,7 @@
 var WireBlessings =
   require('../gen-vdl/v.io/v23/security').WireBlessings;
 var SharedContextKeys = require('../runtime/shared-context-keys');
+var hexVom = require('../lib/hex-vom');
 
 /**
  * A router that handles routing incoming requests to the right
@@ -101,43 +101,50 @@
 };
 
 Router.prototype.handleAuthorizationRequest = function(messageId, request) {
+  var authReply;
   try {
-   request = vom.decode(byteUtil.hex2Bytes(request));
+   request = hexVom.decode(request);
   } catch (e) {
-    JSON.stringify({
+    authReply = new AuthReply({
       // TODO(bjornick): Use the real context
-      err: new verror.InternalError(this._rootCtx,
-                                    'Failed to decode ', e)
+      err: new verror.InternalError(this._rootCtx, 'Failed to decode ', e)
     });
-    this._proxy.sendRequest(data, Outgoing.AUTHORIZATION_RESPONSE,
-        null, messageId);
+
+    this._proxy.sendRequest(hexVom.encode(authReply),
+                            Outgoing.AUTHORIZATION_RESPONSE, null, messageId);
+    return;
   }
 
   var ctx = this._rootCtx.withValue(SharedContextKeys.LANG_KEY,
                                     request.context.language);
   var server = this._servers[request.serverId];
   if (!server) {
-    var data = JSON.stringify({
+    authReply = new AuthReply({
       // TODO(bjornick): Use the real context
       err: new verror.ExistsError(ctx, 'unknown server')
     });
-    this._proxy.sendRequest(data, Outgoing.AUTHORIZATION_RESPONSE,
-        null, messageId);
+
+    this._proxy.sendRequest(hexVom.encode(authReply),
+                            Outgoing.AUTHORIZATION_RESPONSE, null, messageId);
     return;
   }
   var router = this;
   var call = new SecurityCall(request.call, this._controller);
 
+  authReply = new AuthReply({});
+
   server.handleAuthorization(request.handle, ctx, call).then(function() {
-    router._proxy.sendRequest('{}', Outgoing.AUTHORIZATION_RESPONSE, null,
-        messageId);
+    router._proxy.sendRequest(hexVom.encode(authReply),
+                              Outgoing.AUTHORIZATION_RESPONSE, null,
+                              messageId);
   }).catch(function(e) {
-    var data = JSON.stringify({
+    var authReply = new AuthReply({
       err: ErrorConversion.fromNativeValue(e, this._appName,
-                                          request.call.method)
+                                              request.call.method)
     });
-    router._proxy.sendRequest(data, Outgoing.AUTHORIZATION_RESPONSE, null,
-        messageId);
+    router._proxy.sendRequest(hexVom.encode(authReply),
+                              Outgoing.AUTHORIZATION_RESPONSE, null,
+                              messageId);
   });
 };
 
@@ -180,9 +187,9 @@
     var response = new CaveatValidationResponse({
       results: results
     });
-    var data = byteUtil.bytes2Hex(vom.encode(response));
-    self._proxy.sendRequest(data, Outgoing.CAVEAT_VALIDATION_RESPONSE, null,
-      messageId);
+    self._proxy.sendRequest(hexVom.encode(response),
+                            Outgoing.CAVEAT_VALIDATION_RESPONSE, null,
+                            messageId);
   }).catch(function(err) {
     throw new Error('Unexpected error (all promises should resolve): ' + err);
   });
@@ -193,49 +200,33 @@
   if (!server) {
     // TODO(bjornick): Pass in context here so we can generate useful error
     // messages.
-    var data = JSON.stringify({
+    var reply = new LookupReply({
       err: new verror.NoExistError(this._rootCtx, 'unknown server')
     });
-    this._proxy.sendRequest(data, Outgoing.LOOKUP_RESPONSE,
-        null, messageId);
+    this._proxy.sendRequest(hexVom.encode(reply), Outgoing.LOOKUP_RESPONSE,
+                            null, messageId);
     return;
   }
 
   var self = this;
   return server._handleLookup(request.suffix).then(function(value) {
     var signatureList = value.invoker.signature();
-    var res;
-    try {
-      // TODO(alexfandrianto): Define []signature.Interface in VDL.
-      // See dispatcher.go lookupReply's signature field.
-      // Also see dispatcher.go lookupIntermediateReply's signature field.
-      // We have to pre-encode the signature list into a string.
-      var canonicalSignatureList = vdl.canonicalize.fill(signatureList, {
-        kind: vdl.kind.LIST,
-        elem: vdlsig.Interface.prototype._type
-      });
-      res = byteUtil.bytes2Hex(vom.encode(canonicalSignatureList));
-    } catch (e) {
-      return Promise.reject(e);
-    }
-
     var hasAuthorizer = (typeof value.authorizer === 'function');
     var hasGlobber = value.invoker.hasGlobber();
-    var data = {
+    var reply = new LookupReply({
       handle: value._handle,
-      signature: res,
+      signature: signatureList,
       hasAuthorizer: hasAuthorizer,
       hasGlobber: hasGlobber
-    };
-    self._proxy.sendRequest(JSON.stringify(data), Outgoing.LOOKUP_RESPONSE,
-        null, messageId);
-  }).catch(function(err) {
-    var data = JSON.stringify({
-      err: ErrorConversion.fromNativeValue(err, self._appName,
-                                          '__Signature'),
     });
-    self._proxy.sendRequest(data, Outgoing.LOOKUP_RESPONSE,
-        null, messageId);
+    self._proxy.sendRequest(hexVom.encode(reply), Outgoing.LOOKUP_RESPONSE,
+                            null, messageId);
+  }).catch(function(err) {
+    var reply = new LookupReply({
+      err: ErrorConversion.fromNativeValue(err, self._appName, '__Signature')
+    });
+    self._proxy.sendRequest(hexVom.encode(reply), Outgoing.LOOKUP_RESPONSE,
+                            null, messageId);
   });
 };
 
@@ -270,7 +261,7 @@
   var err;
   var request;
   try {
-   request = vom.decode(byteUtil.hex2Bytes(vdlRequest));
+   request = hexVom.decode(vdlRequest);
   } catch (e) {
     err = new Error('Failed to decode args: ' + e);
     this.sendResult(messageId, '', null, err);
@@ -633,9 +624,8 @@
       err: errorStruct,
       traceResponse: traceResponse
     });
-    var responseDataVOM = byteUtil.bytes2Hex(vom.encode(responseData));
-    this._proxy.sendRequest(responseDataVOM, Outgoing.RESPONSE, null,
-        messageId);
+    this._proxy.sendRequest(hexVom.encode(responseData), Outgoing.RESPONSE,
+                            null, messageId);
   }
 };
 
diff --git a/test/unit/test-rpc-client.js b/test/unit/test-rpc-client.js
index c6d1643..883ed47 100644
--- a/test/unit/test-rpc-client.js
+++ b/test/unit/test-rpc-client.js
@@ -8,8 +8,7 @@
 var createSignature = require('../../src/vdl/create-signature');
 var createMockProxy = require('./mock-proxy');
 var vdl = require('../../src/vdl');
-var byteUtil = require('../../src/vdl/byte-util');
-var vom = require('../../src/vom');
+var hexVom = require('../../src/lib/hex-vom');
 var vtrace = require('../../src/vtrace');
 var app = require('../../src/gen-vdl/v.io/x/ref/services/wspr/internal/app');
 var SharedContextKeys = require('../../src/runtime/shared-context-keys');
@@ -50,7 +49,7 @@
 }
 
 var mockProxy = createMockProxy(function(data, type) {
-  var decodedData = vom.decode(byteUtil.hex2Bytes(data));
+  var decodedData = hexVom.decode(data);
   var response = new app.RpcResponse();
 
   if (decodedData instanceof app.RpcRequest &&
@@ -60,7 +59,7 @@
     // Take the first arg and return it in a result list.
     response.outArgs = [decodedData];
   }
-  return byteUtil.bytes2Hex(vom.encode(response));
+  return hexVom.encode(response);
 });
 
 test('creating instances', function(assert) {
diff --git a/test/unit/test-rpc-signature-cache.js b/test/unit/test-rpc-signature-cache.js
index 087309f..fd75545 100644
--- a/test/unit/test-rpc-signature-cache.js
+++ b/test/unit/test-rpc-signature-cache.js
@@ -13,8 +13,7 @@
 var createMockProxy = require('./mock-proxy');
 var Outgoing = require('../../src/proxy/message-type').Outgoing;
 var Client = require('../../src/rpc/client.js');
-var byteUtil = require('../../src/vdl/byte-util');
-var vom = require('../../src/vom');
+var hexVom = require('../../src/lib/hex-vom');
 var app = require('../../src/gen-vdl/v.io/x/ref/services/wspr/internal/app');
 var vtrace = require('../../src/vtrace');
 var vdlsig = require('../../src/gen-vdl/v.io/v23/vdlroot/signature');
@@ -29,13 +28,13 @@
 function createProxy() {
   return createMockProxy(function(message, type) {
     if (type === Outgoing.REQUEST) {
-      var decodedData = vom.decode(byteUtil.hex2Bytes(message));
+      var decodedData = hexVom.decode(message);
       if (decodedData.method !== 'Signature') {
         throw new Error('Unexpected method call');
       }
       var response = new app.RpcResponse();
       response.outArgs = [freshSig];
-      return byteUtil.bytes2Hex(vom.encode(response));
+      return hexVom.encode(response);
     }
     throw new Error('Unexpected message type');
   }, CACHE_TTL);
diff --git a/test/unit/test-server-router.js b/test/unit/test-server-router.js
index afe2932..7687a35 100644
--- a/test/unit/test-server-router.js
+++ b/test/unit/test-server-router.js
@@ -11,8 +11,7 @@
 var Server = require('../../src/rpc/server');
 var Outgoing = require('../../src/proxy/message-type').Outgoing;
 var vdl = require('../../src/vdl');
-var byteUtil = require('../../src/vdl/byte-util');
-var vom = require('../../src/vom');
+var hexVom = require('../../src/lib/hex-vom');
 var context = require('../../src/context');
 
 test('Server Router Signature Lookup', function(t) {
@@ -102,11 +101,10 @@
     t.equals(responseType, Outgoing.LOOKUP_RESPONSE, 'response type');
     t.equals(responseMessageId, inputMessageId, 'message id');
 
-    var data = JSON.parse(responseData);
-    t.ok(data.hasOwnProperty('handle'), 'has a handle');
-    t.equals(data.hasAuthorizer, true, 'has authorizer');
-    var decodedSignature = vom.decode(byteUtil.hex2Bytes(data.signature));
-    t.deepEquals(decodedSignature.val, expectedSignature, 'signature');
+    var reply = hexVom.decode(responseData);
+    t.ok(reply.hasOwnProperty('handle'), 'has a handle');
+    t.equals(reply.hasAuthorizer, true, 'has authorizer');
+    t.deepEquals(reply.signature, expectedSignature, 'signature');
 
     t.end();
   });
