diff --git a/src/node/interop/interop_client.js b/src/node/interop/interop_client.js
index 3341486b9ed84c092453a600df73e681f267b164..02f341113d39eb9d2f001e04cac86c295cb05927 100644
--- a/src/node/interop/interop_client.js
+++ b/src/node/interop/interop_client.js
@@ -260,8 +260,8 @@ function cancelAfterFirstResponse(client, done) {
   call.on('data', function(data) {
     call.cancel();
   });
-  call.on('status', function(status) {
-    assert.strictEqual(status.code, grpc.status.CANCELLED);
+  call.on('error', function(error) {
+    assert.strictEqual(error.code, grpc.status.CANCELLED);
     done();
   });
 }
diff --git a/src/node/package.json b/src/node/package.json
index 6c0953a83f2b208bef2681763ac305dbec6e7ce9..0bb3c3d1fd07ff5fc5649f643f59334cdadcbb9c 100644
--- a/src/node/package.json
+++ b/src/node/package.json
@@ -1,6 +1,6 @@
 {
   "name": "grpc",
-  "version": "0.6.2",
+  "version": "0.7.0",
   "author": "Google Inc.",
   "description": "gRPC Library for Node",
   "homepage": "http://www.grpc.io/",
diff --git a/src/node/src/client.js b/src/node/src/client.js
index b2b79e8b706ec0fd68aed8d32cee9adfc6cc483e..9f3ddf8ed04fe8b6c9ad6383463d019f773c51df 100644
--- a/src/node/src/client.js
+++ b/src/node/src/client.js
@@ -245,6 +245,7 @@ function makeUnaryRequestFunction(method, serialize, deserialize) {
         if (response.status.code !== grpc.status.OK) {
           var error = new Error(response.status.details);
           error.code = response.status.code;
+          error.metadata = response.status.metadata;
           callback(error);
           return;
         }
@@ -316,6 +317,7 @@ function makeClientStreamRequestFunction(method, serialize, deserialize) {
         if (response.status.code !== grpc.status.OK) {
           var error = new Error(response.status.details);
           error.code = response.status.code;
+          error.metadata = response.status.metadata;
           callback(error);
           return;
         }
@@ -382,6 +384,13 @@ function makeServerStreamRequestFunction(method, serialize, deserialize) {
           throw err;
         }
         stream.emit('status', response.status);
+        if (response.status.code !== grpc.status.OK) {
+          var error = new Error(response.status.details);
+          error.code = response.status.code;
+          error.metadata = response.status.metadata;
+          stream.emit('error', error);
+          return;
+        }
       });
     });
     return stream;
@@ -440,6 +449,13 @@ function makeBidiStreamRequestFunction(method, serialize, deserialize) {
           throw err;
         }
         stream.emit('status', response.status);
+        if (response.status.code !== grpc.status.OK) {
+          var error = new Error(response.status.details);
+          error.code = response.status.code;
+          error.metadata = response.status.metadata;
+          stream.emit('error', error);
+          return;
+        }
       });
     });
     return stream;
diff --git a/src/node/test/math_client_test.js b/src/node/test/math_client_test.js
index 79df97871bf56172851f9647b3964dc250ea88e4..3461922e6626f8026e1dd109b4779119f22675fc 100644
--- a/src/node/test/math_client_test.js
+++ b/src/node/test/math_client_test.js
@@ -130,8 +130,7 @@ describe('Math client', function() {
     });
     call.write({dividend: 7, divisor: 0});
     call.end();
-    call.on('status', function checkStatus(status) {
-      assert.notEqual(status.code, grpc.status.OK);
+    call.on('error', function checkStatus(status) {
       done();
     });
   });
diff --git a/src/node/test/surface_test.js b/src/node/test/surface_test.js
index 6f63f1044fab98c84dd7add8707726629c0e039f..38f9028bffb1f1f203479abe15475934b5550245 100644
--- a/src/node/test/surface_test.js
+++ b/src/node/test/surface_test.js
@@ -278,9 +278,8 @@ describe('Trailing metadata', function() {
   it('should be present when a server stream call fails', function(done) {
     var call = client.serverStream({error: true});
     call.on('data', function(){});
-    call.on('status', function(status) {
-      assert.notStrictEqual(status.code, grpc.status.OK);
-      assert.deepEqual(status.metadata.metadata, ['yes']);
+    call.on('error', function(error) {
+      assert.deepEqual(error.metadata.metadata, ['yes']);
       done();
     });
   });
@@ -302,9 +301,8 @@ describe('Trailing metadata', function() {
     call.write({error: true});
     call.end();
     call.on('data', function(){});
-    call.on('status', function(status) {
-      assert.notStrictEqual(status.code, grpc.status.OK);
-      assert.deepEqual(status.metadata.metadata, ['yes']);
+    call.on('error', function(error) {
+      assert.deepEqual(error.metadata.metadata, ['yes']);
       done();
     });
   });
@@ -345,16 +343,16 @@ describe('Cancelling surface client', function() {
   });
   it('Should correctly cancel a server stream call', function(done) {
     var call = client.fib({'limit': 5});
-    call.on('status', function(status) {
-      assert.strictEqual(status.code, surface_client.status.CANCELLED);
+    call.on('error', function(error) {
+      assert.strictEqual(error.code, surface_client.status.CANCELLED);
       done();
     });
     call.cancel();
   });
   it('Should correctly cancel a bidi stream call', function(done) {
     var call = client.divMany();
-    call.on('status', function(status) {
-      assert.strictEqual(status.code, surface_client.status.CANCELLED);
+    call.on('error', function(error) {
+      assert.strictEqual(error.code, surface_client.status.CANCELLED);
       done();
     });
     call.cancel();