diff --git a/src/node/src/server.js b/src/node/src/server.js
index a5d737c68d33dc7ca54a3436135e6a6e4877dcde..e4f71ff05f7ad42c8cdbe04fc754cfd4277ece24 100644
--- a/src/node/src/server.js
+++ b/src/node/src/server.js
@@ -243,15 +243,24 @@ function Server(getMetadata, options) {
       var handler = undefined;
       var deadline = data.absolute_deadline;
       var cancelled = false;
-      if (handlers.hasOwnProperty(data.method)) {
-        handler = handlers[data.method];
-      }
       call.serverAccept(function(event) {
         if (event.data.code === grpc.status.CANCELLED) {
           cancelled = true;
-          stream.emit('cancelled');
+          if (stream) {
+            stream.emit('cancelled');
+          }
         }
       }, 0);
+      if (handlers.hasOwnProperty(data.method)) {
+        handler = handlers[data.method];
+      } else {
+        call.serverEndInitialMetadata(0);
+        call.startWriteStatus(
+            grpc.status.UNIMPLEMENTED,
+            "This method is not available on this server.",
+            function() {});
+        return;
+      }
       if (getMetadata) {
         call.addMetadata(getMetadata(data.method, data.metadata));
       }
diff --git a/src/node/test/client_server_test.js b/src/node/test/client_server_test.js
index 059dd1323af118a9cd321c919bdffdf6e4bb14bc..1db9f694678dc64ef322b6d8b12044c5e323206d 100644
--- a/src/node/test/client_server_test.js
+++ b/src/node/test/client_server_test.js
@@ -185,6 +185,14 @@ describe('echo client', function() {
       done();
     });
   });
+  it('should get correct status for unimplemented method', function(done) {
+    var stream = client.makeRequest(channel, 'unimplemented_method');
+    stream.end();
+    stream.on('status', function(status) {
+      assert.equal(status.code, grpc.status.UNIMPLEMENTED);
+      done();
+    });
+  });
 });
 /* TODO(mlumish): explore options for reducing duplication between this test
  * and the insecure echo client test */