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();
   });
