Merge "core.js: Failing service runner was not exiting with code != 0. This change should break the tests but because they were broken already."
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();
   });