diff --git a/src/node/ext/byte_buffer.cc b/src/node/ext/byte_buffer.cc
index 142951475a1cec9a69cbe9751d7cace172829296..695ecedd3447518fdfde638b5e37b44bcc4e7ae5 100644
--- a/src/node/ext/byte_buffer.cc
+++ b/src/node/ext/byte_buffer.cc
@@ -39,13 +39,17 @@
 #include "grpc/grpc.h"
 #include "grpc/support/slice.h"
 
+#include "byte_buffer.h"
+
 namespace grpc {
 namespace node {
 
-#include "byte_buffer.h"
-
 using ::node::Buffer;
+using v8::Context;
+using v8::Function;
 using v8::Handle;
+using v8::Object;
+using v8::Number;
 using v8::Value;
 
 grpc_byte_buffer *BufferToByteBuffer(Handle<Value> buffer) {
@@ -73,7 +77,19 @@ Handle<Value> ByteBufferToBuffer(grpc_byte_buffer *buffer) {
     memcpy(result + offset, GPR_SLICE_START_PTR(next), GPR_SLICE_LENGTH(next));
     offset += GPR_SLICE_LENGTH(next);
   }
-  return NanEscapeScope(NanNewBufferHandle(result, length));
+  return NanEscapeScope(MakeFastBuffer(NanNewBufferHandle(result, length)));
+}
+
+Handle<Value> MakeFastBuffer(Handle<Value> slowBuffer) {
+  NanEscapableScope();
+  Handle<Object> globalObj = Context::GetCurrent()->Global();
+  Handle<Function> bufferConstructor = Handle<Function>::Cast(
+      globalObj->Get(NanNew("Buffer")));
+  Handle<Value> consArgs[3] = { slowBuffer,
+                                NanNew<Number>(Buffer::Length(slowBuffer)),
+                                NanNew<Number>(0) };
+  Handle<Object> fastBuffer = bufferConstructor->NewInstance(3, consArgs);
+  return NanEscapeScope(fastBuffer);
 }
 }  // namespace node
 }  // namespace grpc
diff --git a/src/node/ext/byte_buffer.h b/src/node/ext/byte_buffer.h
index ee2b4c0d158a4d16417b31facb8d645f989fb9d6..5f1903a42ebc82f1a43d2d9f250cbeacc13bb006 100644
--- a/src/node/ext/byte_buffer.h
+++ b/src/node/ext/byte_buffer.h
@@ -50,6 +50,10 @@ grpc_byte_buffer *BufferToByteBuffer(v8::Handle<v8::Value> buffer);
 /* Convert a grpc_byte_buffer to a Node.js Buffer */
 v8::Handle<v8::Value> ByteBufferToBuffer(grpc_byte_buffer *buffer);
 
+/* Convert a ::node::Buffer to a fast Buffer, as defined in the Node
+   Buffer documentation */
+v8::Handle<v8::Value> MakeFastBuffer(v8::Handle<v8::Value> slowBuffer);
+
 }  // namespace node
 }  // namespace grpc
 
diff --git a/src/node/ext/event.cc b/src/node/ext/event.cc
index fcf046b6978390d0a590cd1b67514545644781a0..b9446062d71f8b9339e22cfe79b015429594be5f 100644
--- a/src/node/ext/event.cc
+++ b/src/node/ext/event.cc
@@ -80,7 +80,8 @@ Handle<Value> ParseMetadata(grpc_metadata *metadata_elements, size_t length) {
       metadata_object->Set(key_string, array);
     }
     array->Set(index_map[elem->key],
-               NanNewBufferHandle(elem->value, elem->value_length));
+               MakeFastBuffer(
+                   NanNewBufferHandle(elem->value, elem->value_length)));
     index_map[elem->key] += 1;
   }
   return NanEscapeScope(metadata_object);