diff --git a/test/built-ins/Proxy/getPrototypeOf/call-parameters.js b/test/built-ins/Proxy/getPrototypeOf/call-parameters.js
new file mode 100644
index 0000000000000000000000000000000000000000..8476b7c4aadb0517aad2b646150c0a54ab78868a
--- /dev/null
+++ b/test/built-ins/Proxy/getPrototypeOf/call-parameters.js
@@ -0,0 +1,31 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 9.5.1
+description: >
+    Trap is called with handler as context and target as the first parameter.
+info: >
+    [[GetPrototypeOf]] ( )
+
+    ...
+    8. Let handlerProto be Call(trap, handler, «target»).
+    ...
+
+---*/
+
+var _handler, _target;
+var target = {};
+var handler = {
+  getPrototypeOf: function(t) {
+    _handler = this;
+    _target = t;
+    return {};
+  }
+};
+
+var p = new Proxy(target, handler);
+
+Object.getPrototypeOf(p);
+
+assert.sameValue(_handler, handler);
+assert.sameValue(_target, target);
diff --git a/test/built-ins/Proxy/getPrototypeOf/extensible-target-return-handlerproto.js b/test/built-ins/Proxy/getPrototypeOf/extensible-target-return-handlerproto.js
new file mode 100644
index 0000000000000000000000000000000000000000..10ee96187e89ef4fac99eb5d35e96883610d9841
--- /dev/null
+++ b/test/built-ins/Proxy/getPrototypeOf/extensible-target-return-handlerproto.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 9.5.1
+description: >
+    Return trap result if it's an Object and target is extensible.
+info: >
+    [[GetPrototypeOf]] ( )
+
+    ...
+    1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
+    ...
+    4. Let target be the value of the [[ProxyTarget]] internal slot of O.
+    5. Let trap be GetMethod(handler, "getPrototypeOf").
+    ...
+    8. Let handlerProto be Call(trap, handler, «target»).
+    ...
+    11. Let extensibleTarget be IsExtensible(target).
+    12. ReturnIfAbrupt(extensibleTarget).
+    13. If extensibleTarget is true, return handlerProto.
+    ...
+
+---*/
+
+var prot = { foo: 1 };
+var p = new Proxy({}, {
+  getPrototypeOf: function() {
+    return prot;
+  }
+});
+
+assert.sameValue(Object.getPrototypeOf(p), prot);
diff --git a/test/built-ins/Proxy/getPrototypeOf/not-extensible-not-same-proto-throws.js b/test/built-ins/Proxy/getPrototypeOf/not-extensible-not-same-proto-throws.js
new file mode 100644
index 0000000000000000000000000000000000000000..7a31e7fb9218a95628dbc2e15e2cfc97732c5a68
--- /dev/null
+++ b/test/built-ins/Proxy/getPrototypeOf/not-extensible-not-same-proto-throws.js
@@ -0,0 +1,40 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 9.5.1
+description: >
+    Throws a TypeError if the target is not extensible and the trap result is
+    not the same as the target.[[GetPrototypeOf]] result.
+info: >
+    [[GetPrototypeOf]] ( )
+
+    ...
+    1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
+    ...
+    4. Let target be the value of the [[ProxyTarget]] internal slot of O.
+    5. Let trap be GetMethod(handler, "getPrototypeOf").
+    ...
+    8. Let handlerProto be Call(trap, handler, «target»).
+    ...
+    11. Let extensibleTarget be IsExtensible(target).
+    ...
+    14. Let targetProto be target.[[GetPrototypeOf]]().
+    15. ReturnIfAbrupt(targetProto).
+    16. If SameValue(handlerProto, targetProto) is false, throw a TypeError
+    exception.
+    ...
+---*/
+
+var target = Object.create({ foo: 1 });
+
+var p = new Proxy(target, {
+  getPrototypeOf: function() {
+    return {};
+  }
+});
+
+Object.preventExtensions(target);
+
+assert.throws(TypeError, function() {
+    Object.getPrototypeOf(p);
+});
diff --git a/test/built-ins/Proxy/getPrototypeOf/not-extensible-same-proto.js b/test/built-ins/Proxy/getPrototypeOf/not-extensible-same-proto.js
new file mode 100644
index 0000000000000000000000000000000000000000..c9143a014b6bab179b6d86befe273560c8cd8a9e
--- /dev/null
+++ b/test/built-ins/Proxy/getPrototypeOf/not-extensible-same-proto.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 9.5.1
+description: >
+    Return trap result is target is not extensible, but trap result has the same
+    value as target.[[GetPrototypeOf]] result.
+info: >
+    [[GetPrototypeOf]] ( )
+
+    ...
+    1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
+    ...
+    4. Let target be the value of the [[ProxyTarget]] internal slot of O.
+    5. Let trap be GetMethod(handler, "getPrototypeOf").
+    ...
+    8. Let handlerProto be Call(trap, handler, «target»).
+    ...
+    11. Let extensibleTarget be IsExtensible(target).
+    ...
+    14. Let targetProto be target.[[GetPrototypeOf]]().
+    ...
+    17. Return handlerProto.
+
+---*/
+
+var target = Object.create(Array.prototype);
+
+var p = new Proxy(target, {
+  getPrototypeOf: function() {
+    return Array.prototype;
+  }
+});
+
+Object.preventExtensions(target);
+
+assert.sameValue(Object.getPrototypeOf(p), Array.prototype);
diff --git a/test/built-ins/Proxy/getPrototypeOf/null-handler.js b/test/built-ins/Proxy/getPrototypeOf/null-handler.js
new file mode 100644
index 0000000000000000000000000000000000000000..38c8e7e4934ac33c37ce757f14fdc96486bcdb1d
--- /dev/null
+++ b/test/built-ins/Proxy/getPrototypeOf/null-handler.js
@@ -0,0 +1,15 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 9.5.1
+description: >
+    Throws a TypeError exception if handler is null.
+---*/
+
+var p = Proxy.revocable({}, {});
+
+p.revoke();
+
+assert.throws(TypeError, function() {
+    Object.getPrototypeOf(p.proxy);
+});
diff --git a/test/built-ins/Proxy/getPrototypeOf/return-is-abrupt.js b/test/built-ins/Proxy/getPrototypeOf/return-is-abrupt.js
new file mode 100644
index 0000000000000000000000000000000000000000..88a46a7a436ee72e59b98ce857b8625f6826d2eb
--- /dev/null
+++ b/test/built-ins/Proxy/getPrototypeOf/return-is-abrupt.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 9.5.1
+description: >
+    Trap returns abrupt.
+info: >
+    8. Let handlerProto be Call(trap, handler, «target»).
+    9. ReturnIfAbrupt(handlerProto).
+includes: [Test262Error.js]
+---*/
+
+var p = new Proxy({}, {
+  getPrototypeOf: function() {
+    throw new Test262Error();
+  }
+});
+
+assert.throws(Test262Error, function() {
+    Object.getPrototypeOf(p);
+});
diff --git a/test/built-ins/Proxy/getPrototypeOf/trap-is-not-callable.js b/test/built-ins/Proxy/getPrototypeOf/trap-is-not-callable.js
new file mode 100644
index 0000000000000000000000000000000000000000..e6335e46a535a5aa4d9112a48c2f623bf42d8533
--- /dev/null
+++ b/test/built-ins/Proxy/getPrototypeOf/trap-is-not-callable.js
@@ -0,0 +1,15 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 9.5.1
+description: >
+    Throws if trap is not callable.
+---*/
+
+var p = new Proxy({}, {
+    getPrototypeOf: {}
+});
+
+assert.throws(TypeError, function() {
+    Object.getPrototypeOf(p);
+});
diff --git a/test/built-ins/Proxy/getPrototypeOf/trap-is-undefined.js b/test/built-ins/Proxy/getPrototypeOf/trap-is-undefined.js
new file mode 100644
index 0000000000000000000000000000000000000000..efa9dcd1009f05d163bb0697e957cb648b26bf50
--- /dev/null
+++ b/test/built-ins/Proxy/getPrototypeOf/trap-is-undefined.js
@@ -0,0 +1,12 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 9.5.1
+description: >
+    Return target.[[GetPrototypeOf]]() if trap is undefined.
+---*/
+
+var target = Object.create(Array.prototype);
+var p = new Proxy(target, {});
+
+assert.sameValue(Object.getPrototypeOf(p), Array.prototype);
diff --git a/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-boolean.js b/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-boolean.js
new file mode 100644
index 0000000000000000000000000000000000000000..c8c0543ba8310725e39bd360f496ec50ffc96e0e
--- /dev/null
+++ b/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-boolean.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 9.5.1
+description: >
+    Throw a TypeError exception if trap result is false.
+---*/
+
+var p = new Proxy({}, {
+  getPrototypeOf: function() {
+    return false;
+  }
+});
+
+assert.throws(TypeError, function() {
+    Object.getPrototypeOf(p);
+});
diff --git a/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-number.js b/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-number.js
new file mode 100644
index 0000000000000000000000000000000000000000..d0533f518ca2716667f44139f1e0c980b132d9a7
--- /dev/null
+++ b/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-number.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 9.5.1
+description: >
+    Throw a TypeError exception if trap result is a Number.
+---*/
+
+var p = new Proxy({}, {
+  getPrototypeOf: function() {
+    return 0;
+  }
+});
+
+assert.throws(TypeError, function() {
+    Object.getPrototypeOf(p);
+});
diff --git a/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-string.js b/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-string.js
new file mode 100644
index 0000000000000000000000000000000000000000..34bea0d5fc4b6629f1d4bd7e46bcc23625eeab9d
--- /dev/null
+++ b/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-string.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 9.5.1
+description: >
+    throw a TypeError exception if trap result is a String.
+---*/
+
+var p = new Proxy({}, {
+  getPrototypeOf: function() {
+    return "";
+  }
+});
+
+assert.throws(TypeError, function() {
+    Object.getPrototypeOf(p);
+});
diff --git a/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-symbol.js b/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-symbol.js
new file mode 100644
index 0000000000000000000000000000000000000000..9b47cf9a9f5a42446f53b0a1d92e24ac1a3e6cd6
--- /dev/null
+++ b/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-symbol.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 9.5.1
+description: >
+    Throw a TypeError exception if trap result is a Symbol.
+features: [Symbol]
+---*/
+
+var p = new Proxy({}, {
+  getPrototypeOf: function() {
+    return Symbol();
+  }
+});
+
+assert.throws(TypeError, function() {
+    Object.getPrototypeOf(p);
+});
diff --git a/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-undefined.js b/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-undefined.js
new file mode 100644
index 0000000000000000000000000000000000000000..8e5143d3d87bc3b6c31c3639dbe333b4f1ffd04e
--- /dev/null
+++ b/test/built-ins/Proxy/getPrototypeOf/trap-result-neither-object-nor-null-throws-undefined.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 9.5.1
+description: >
+    Throw a TypeError exception if trap result is undefined.
+---*/
+
+var p = new Proxy({}, {
+  getPrototypeOf: function() {
+    return undefined;
+  }
+});
+
+assert.throws(TypeError, function() {
+    Object.getPrototypeOf(p);
+});