diff --git a/src/node/interop/interop_client.js b/src/node/interop/interop_client.js
index 02f341113d39eb9d2f001e04cac86c295cb05927..2b51bcae6a31fc350dffb6d112cbbd6c0fd426f6 100644
--- a/src/node/interop/interop_client.js
+++ b/src/node/interop/interop_client.js
@@ -86,7 +86,7 @@ function emptyUnary(client, done) {
  */
 function largeUnary(client, done) {
   var arg = {
-    response_type: testProto.PayloadType.COMPRESSABLE,
+    response_type: 'COMPRESSABLE',
     response_size: 314159,
     payload: {
       body: zeroBuffer(271828)
@@ -94,9 +94,8 @@ function largeUnary(client, done) {
   };
   var call = client.unaryCall(arg, function(err, resp) {
     assert.ifError(err);
-    assert.strictEqual(resp.payload.type, testProto.PayloadType.COMPRESSABLE);
-    assert.strictEqual(resp.payload.body.limit - resp.payload.body.offset,
-                       314159);
+    assert.strictEqual(resp.payload.type, 'COMPRESSABLE');
+    assert.strictEqual(resp.payload.body.length, 314159);
   });
   call.on('status', function(status) {
     assert.strictEqual(status.code, grpc.status.OK);
@@ -138,7 +137,7 @@ function clientStreaming(client, done) {
  */
 function serverStreaming(client, done) {
   var arg = {
-    response_type: testProto.PayloadType.COMPRESSABLE,
+    response_type: 'COMPRESSABLE',
     response_parameters: [
       {size: 31415},
       {size: 9},
@@ -150,8 +149,8 @@ function serverStreaming(client, done) {
   var resp_index = 0;
   call.on('data', function(value) {
     assert(resp_index < 4);
-    assert.strictEqual(value.payload.type, testProto.PayloadType.COMPRESSABLE);
-    assert.strictEqual(value.payload.body.limit - value.payload.body.offset,
+    assert.strictEqual(value.payload.type, 'COMPRESSABLE');
+    assert.strictEqual(value.payload.body.length,
                        arg.response_parameters[resp_index].size);
     resp_index += 1;
   });
@@ -182,23 +181,21 @@ function pingPong(client, done) {
   });
   var index = 0;
   call.write({
-      response_type: testProto.PayloadType.COMPRESSABLE,
+      response_type: 'COMPRESSABLE',
       response_parameters: [
         {size: response_sizes[index]}
       ],
       payload: {body: zeroBuffer(payload_sizes[index])}
   });
   call.on('data', function(response) {
-    assert.strictEqual(response.payload.type,
-                       testProto.PayloadType.COMPRESSABLE);
-    assert.equal(response.payload.body.limit - response.payload.body.offset,
-                 response_sizes[index]);
+    assert.strictEqual(response.payload.type, 'COMPRESSABLE');
+    assert.equal(response.payload.body.length, response_sizes[index]);
     index += 1;
     if (index === 4) {
       call.end();
     } else {
       call.write({
-        response_type: testProto.PayloadType.COMPRESSABLE,
+        response_type: 'COMPRESSABLE',
         response_parameters: [
           {size: response_sizes[index]}
         ],
@@ -251,7 +248,7 @@ function cancelAfterBegin(client, done) {
 function cancelAfterFirstResponse(client, done) {
   var call = client.fullDuplexCall();
   call.write({
-      response_type: testProto.PayloadType.COMPRESSABLE,
+      response_type: 'COMPRESSABLE',
       response_parameters: [
         {size: 31415}
       ],
@@ -281,7 +278,7 @@ function authTest(expected_user, client, done) {
     }
     client.updateMetadata = grpc.getGoogleAuthDelegate(credential);
     var arg = {
-      response_type: testProto.PayloadType.COMPRESSABLE,
+      response_type: 'COMPRESSABLE',
       response_size: 314159,
       payload: {
         body: zeroBuffer(271828)
@@ -291,9 +288,8 @@ function authTest(expected_user, client, done) {
     };
     var call = client.unaryCall(arg, function(err, resp) {
       assert.ifError(err);
-      assert.strictEqual(resp.payload.type, testProto.PayloadType.COMPRESSABLE);
-      assert.strictEqual(resp.payload.body.limit - resp.payload.body.offset,
-                         314159);
+      assert.strictEqual(resp.payload.type, 'COMPRESSABLE');
+      assert.strictEqual(resp.payload.body.length, 314159);
       assert.strictEqual(resp.username, expected_user);
       assert.strictEqual(resp.oauth_scope, AUTH_SCOPE_RESPONSE);
     });
diff --git a/src/node/interop/interop_server.js b/src/node/interop/interop_server.js
index 8e5c03666fa3b7ddcfb02ae9bd77a9856af52351..dad59c1347769386026c1d322db2545703de9e61 100644
--- a/src/node/interop/interop_server.js
+++ b/src/node/interop/interop_server.js
@@ -72,10 +72,9 @@ function handleUnary(call, callback) {
   var req = call.request;
   var zeros = zeroBuffer(req.response_size);
   var payload_type = req.response_type;
-  if (payload_type === testProto.PayloadType.RANDOM) {
-    payload_type = [
-      testProto.PayloadType.COMPRESSABLE,
-      testProto.PayloadType.UNCOMPRESSABLE][Math.random() < 0.5 ? 0 : 1];
+  if (payload_type === 'RANDOM') {
+    payload_type = ['COMPRESSABLE',
+                    'UNCOMPRESSABLE'][Math.random() < 0.5 ? 0 : 1];
   }
   callback(null, {payload: {type: payload_type, body: zeros}});
 }
@@ -89,7 +88,7 @@ function handleUnary(call, callback) {
 function handleStreamingInput(call, callback) {
   var aggregate_size = 0;
   call.on('data', function(value) {
-    aggregate_size += value.payload.body.limit - value.payload.body.offset;
+    aggregate_size += value.payload.body.length;
   });
   call.on('end', function() {
     callback(null, {aggregated_payload_size: aggregate_size});
@@ -103,10 +102,9 @@ function handleStreamingInput(call, callback) {
 function handleStreamingOutput(call) {
   var req = call.request;
   var payload_type = req.response_type;
-  if (payload_type === testProto.PayloadType.RANDOM) {
-    payload_type = [
-      testProto.PayloadType.COMPRESSABLE,
-      testProto.PayloadType.UNCOMPRESSABLE][Math.random() < 0.5 ? 0 : 1];
+  if (payload_type === 'RANDOM') {
+    payload_type = ['COMPRESSABLE',
+                    'UNCOMPRESSABLE'][Math.random() < 0.5 ? 0 : 1];
   }
   _.each(req.response_parameters, function(resp_param) {
     call.write({
@@ -127,10 +125,9 @@ function handleStreamingOutput(call) {
 function handleFullDuplex(call) {
   call.on('data', function(value) {
     var payload_type = value.response_type;
-    if (payload_type === testProto.PayloadType.RANDOM) {
-      payload_type = [
-        testProto.PayloadType.COMPRESSABLE,
-        testProto.PayloadType.UNCOMPRESSABLE][Math.random() < 0.5 ? 0 : 1];
+    if (payload_type === 'RANDOM') {
+      payload_type = ['COMPRESSABLE',
+                      'UNCOMPRESSABLE'][Math.random() < 0.5 ? 0 : 1];
     }
     _.each(value.response_parameters, function(resp_param) {
       call.write({
diff --git a/src/node/package.json b/src/node/package.json
index 4033bc59cf95d3779dde3c187514d4ab8032ef7e..8d413c3ffaafd88e223c9e0398a4ef1598b0ce00 100644
--- a/src/node/package.json
+++ b/src/node/package.json
@@ -1,6 +1,6 @@
 {
   "name": "grpc",
-  "version": "0.7.0",
+  "version": "0.8.0",
   "author": "Google Inc.",
   "description": "gRPC Library for Node",
   "homepage": "http://www.grpc.io/",
diff --git a/src/node/src/common.js b/src/node/src/common.js
index 55a6b137828a05150e3cdfd41402ea4ae564efab..98917c0fdd086087bd77edf1b6087499b5e4af59 100644
--- a/src/node/src/common.js
+++ b/src/node/src/common.js
@@ -50,7 +50,7 @@ function deserializeCls(cls) {
    * @return {cls} The resulting object
    */
   return function deserialize(arg_buf) {
-    return cls.decode(arg_buf);
+    return cls.decode(arg_buf).toRaw();
   };
 }
 
diff --git a/src/node/test/echo_service.proto b/src/node/test/echo_service.proto
new file mode 100644
index 0000000000000000000000000000000000000000..b2c7e3dc23676c8fb07891d0851528e84b921f2e
--- /dev/null
+++ b/src/node/test/echo_service.proto
@@ -0,0 +1,39 @@
+// Copyright 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+message EchoMessage {
+  string value = 1;
+  int32 value2 = 2;
+}
+
+service EchoService {
+  rpc Echo (EchoMessage) returns (EchoMessage);
+}
\ No newline at end of file
diff --git a/src/node/test/surface_test.js b/src/node/test/surface_test.js
index 38f9028bffb1f1f203479abe15475934b5550245..9c72c29fab3fa0bf437ed310fcdbcc5f2a952b73 100644
--- a/src/node/test/surface_test.js
+++ b/src/node/test/surface_test.js
@@ -99,6 +99,36 @@ describe('Surface server constructor', function() {
     }, /math.Math/);
   });
 });
+describe('Echo service', function() {
+  var server;
+  var client;
+  before(function() {
+    var test_proto = ProtoBuf.loadProtoFile(__dirname + '/echo_service.proto');
+    var echo_service = test_proto.lookup('EchoService');
+    var Server = grpc.buildServer([echo_service]);
+    server = new Server({
+      'EchoService': {
+        echo: function(call, callback) {
+          callback(null, call.request);
+        }
+      }
+    });
+    var port = server.bind('localhost:0');
+    var Client = surface_client.makeProtobufClientConstructor(echo_service);
+    client = new Client('localhost:' + port);
+    server.listen();
+  });
+  after(function() {
+    server.shutdown();
+  });
+  it('should echo the recieved message directly', function(done) {
+    client.echo({value: 'test value', value2: 3}, function(error, response) {
+      assert.ifError(error);
+      assert.deepEqual(response, {value: 'test value', value2: 3});
+      done();
+    });
+  });
+});
 describe('Generic client and server', function() {
   function toString(val) {
     return val.toString();