diff --git a/test/built-ins/Proxy/set/boolean-trap-result-is-false-boolean-return-false.js b/test/built-ins/Proxy/set/boolean-trap-result-is-false-boolean-return-false.js
new file mode 100644
index 0000000000000000000000000000000000000000..0e7100cfc86a26e70132f8705b54ffde13bbbbb0
--- /dev/null
+++ b/test/built-ins/Proxy/set/boolean-trap-result-is-false-boolean-return-false.js
@@ -0,0 +1,20 @@
+// 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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    11. If booleanTrapResult is false, return false.
+features: [Reflect]
+---*/
+
+var target = {};
+var handler = {
+    set: function(t, prop, value, receiver) {
+        return false;
+    }
+};
+var p = new Proxy(target, handler);
+
+assert.sameValue(Reflect.set(p, "attr", "foo"), false);
diff --git a/test/built-ins/Proxy/set/boolean-trap-result-is-false-null-return-false.js b/test/built-ins/Proxy/set/boolean-trap-result-is-false-null-return-false.js
new file mode 100644
index 0000000000000000000000000000000000000000..c6ca59a13560b36a49428f3fe74808aaeda5dbd5
--- /dev/null
+++ b/test/built-ins/Proxy/set/boolean-trap-result-is-false-null-return-false.js
@@ -0,0 +1,20 @@
+// 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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    11. If booleanTrapResult is false, return false.
+features: [Reflect]
+---*/
+
+var target = {};
+var handler = {
+    set: function(t, prop, value, receiver) {
+        return null;
+    }
+};
+var p = new Proxy(target, handler);
+
+assert.sameValue(Reflect.set(p, "attr", "foo"), false);
diff --git a/test/built-ins/Proxy/set/boolean-trap-result-is-false-number-return-false.js b/test/built-ins/Proxy/set/boolean-trap-result-is-false-number-return-false.js
new file mode 100644
index 0000000000000000000000000000000000000000..58380a602dfd06bd4c1d851a5d1ffc6d1897a41c
--- /dev/null
+++ b/test/built-ins/Proxy/set/boolean-trap-result-is-false-number-return-false.js
@@ -0,0 +1,20 @@
+// 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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    11. If booleanTrapResult is false, return false.
+features: [Reflect]
+---*/
+
+var target = {};
+var handler = {
+    set: function(t, prop, value, receiver) {
+        return 0;
+    }
+};
+var p = new Proxy(target, handler);
+
+assert.sameValue(Reflect.set(p, "attr", "foo"), false);
diff --git a/test/built-ins/Proxy/set/boolean-trap-result-is-false-string-return-false.js b/test/built-ins/Proxy/set/boolean-trap-result-is-false-string-return-false.js
new file mode 100644
index 0000000000000000000000000000000000000000..9d3783668e2814711e23debd8cbb7abdc3106a7c
--- /dev/null
+++ b/test/built-ins/Proxy/set/boolean-trap-result-is-false-string-return-false.js
@@ -0,0 +1,20 @@
+// 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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    11. If booleanTrapResult is false, return false.
+features: [Reflect]
+---*/
+
+var target = {};
+var handler = {
+    set: function(t, prop, value, receiver) {
+        return "";
+    }
+};
+var p = new Proxy(target, handler);
+
+assert.sameValue(Reflect.set(p, "attr", "foo"), false);
diff --git a/test/built-ins/Proxy/set/boolean-trap-result-is-false-undefined-return-false.js b/test/built-ins/Proxy/set/boolean-trap-result-is-false-undefined-return-false.js
new file mode 100644
index 0000000000000000000000000000000000000000..3d05404a976b6b817a742f24100ae90eed672122
--- /dev/null
+++ b/test/built-ins/Proxy/set/boolean-trap-result-is-false-undefined-return-false.js
@@ -0,0 +1,20 @@
+// 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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    11. If booleanTrapResult is false, return false.
+features: [Reflect]
+---*/
+
+var target = {};
+var handler = {
+    set: function(t, prop, value, receiver) {
+        return undefined;
+    }
+};
+var p = new Proxy(target, handler);
+
+assert.sameValue(Reflect.set(p, "attr", "foo"), false);
diff --git a/test/built-ins/Proxy/set/call-parameters.js b/test/built-ins/Proxy/set/call-parameters.js
new file mode 100644
index 0000000000000000000000000000000000000000..812333e9242bb210f89358855a9439c7939332e9
--- /dev/null
+++ b/test/built-ins/Proxy/set/call-parameters.js
@@ -0,0 +1,33 @@
+// 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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    9. Let booleanTrapResult be ToBoolean(Call(trap, handler, «target, P, V,
+    Receiver»)).
+
+---*/
+
+var _target, _handler, _prop, _value, _receiver;
+var target = {};
+var handler = {
+    set: function(t, prop, value, receiver) {
+        _handler = this;
+        _target = t;
+        _prop = prop;
+        _value = value;
+        _receiver = receiver;
+        return t[prop] = value;
+    }
+};
+var p = new Proxy(target, handler);
+
+p.attr = "foo";
+
+assert.sameValue(_handler, handler, "handler object as the trap context");
+assert.sameValue(_target, target, "first argument is the target object");
+assert.sameValue(_prop, "attr", "second argument is the property name");
+assert.sameValue(_value, "foo", "third argument is the new value");
+assert.sameValue(_receiver, p, "forth argument is the proxy object");
diff --git a/test/built-ins/Proxy/set/null-handler.js b/test/built-ins/Proxy/set/null-handler.js
new file mode 100644
index 0000000000000000000000000000000000000000..3b2035085840b1916f8138b6e3a01aba809651bf
--- /dev/null
+++ b/test/built-ins/Proxy/set/null-handler.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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    3. If handler is null, throw a TypeError exception.
+---*/
+
+var p = Proxy.revocable({}, {});
+
+p.revoke();
+
+assert.throws(TypeError, function() {
+    p.proxy.attr = 1;
+});
+
+assert.throws(TypeError, function() {
+    p.proxy['attr'] = 1;
+});
diff --git a/test/built-ins/Proxy/set/return-is-abrupt.js b/test/built-ins/Proxy/set/return-is-abrupt.js
new file mode 100644
index 0000000000000000000000000000000000000000..d4be173fb68477d3ac774d29027aa3a72aae587b
--- /dev/null
+++ b/test/built-ins/Proxy/set/return-is-abrupt.js
@@ -0,0 +1,29 @@
+// 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.9
+description: >
+    Trap returns abrupt.
+info: >
+    [[Set]] ( P, V, Receiver)
+
+    ...
+    9. Let booleanTrapResult be ToBoolean(Call(trap, handler, «target, P, V, Receiver»)).
+    10. ReturnIfAbrupt(booleanTrapResult).
+    ...
+includes: [Test262Error.js]
+---*/
+
+var p = new Proxy({}, {
+    set: function(t, prop, value, receiver) {
+        throw new Test262Error();
+    }
+});
+
+assert.throws(Test262Error, function() {
+    p.attr = "bar";
+});
+
+assert.throws(Test262Error, function() {
+    p["attr"] = "bar";
+});
diff --git a/test/built-ins/Proxy/set/return-true-target-property-accessor-is-configurable-set-is-undefined.js b/test/built-ins/Proxy/set/return-true-target-property-accessor-is-configurable-set-is-undefined.js
new file mode 100644
index 0000000000000000000000000000000000000000..11f35638737664c9968e625bcc5158f25e053f0d
--- /dev/null
+++ b/test/built-ins/Proxy/set/return-true-target-property-accessor-is-configurable-set-is-undefined.js
@@ -0,0 +1,26 @@
+// 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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    Returns true if trap returns true and target property accessor is
+    configurable and set is undefined.
+features: [Reflect]
+---*/
+
+var target = {};
+var handler = {
+    set: function(t, prop, value, receiver) {
+        return true;
+    }
+};
+var p = new Proxy(target, handler);
+
+Object.defineProperty(target, "attr", {
+    configurable: true,
+    set: undefined
+});
+
+assert(Reflect.set(p, "attr", "bar"));
diff --git a/test/built-ins/Proxy/set/return-true-target-property-accessor-is-not-configurable.js b/test/built-ins/Proxy/set/return-true-target-property-accessor-is-not-configurable.js
new file mode 100644
index 0000000000000000000000000000000000000000..0277b54c18a43da5f796c559906acbb2e09125ce
--- /dev/null
+++ b/test/built-ins/Proxy/set/return-true-target-property-accessor-is-not-configurable.js
@@ -0,0 +1,28 @@
+// 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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    Returns true if trap returns true and target property accessor is not
+    configurable and set is not undefined.
+features: [Reflect]
+---*/
+
+var target = {};
+var handler = {
+    set: function(t, prop, value, receiver) {
+        return true;
+    }
+};
+var p = new Proxy(target, handler);
+
+Object.defineProperty(target, 'attr', {
+    configurable: false,
+    set: function( value ) {
+        return value;
+    }
+});
+
+assert(Reflect.set(p, "attr", 1));
diff --git a/test/built-ins/Proxy/set/return-true-target-property-is-not-configurable.js b/test/built-ins/Proxy/set/return-true-target-property-is-not-configurable.js
new file mode 100644
index 0000000000000000000000000000000000000000..0bd1f6328dc68c78cc17da191e0d860b55fcff7e
--- /dev/null
+++ b/test/built-ins/Proxy/set/return-true-target-property-is-not-configurable.js
@@ -0,0 +1,27 @@
+// 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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    Returns true if trap returns true and target property is not configurable
+    but writable.
+features: [Reflect]
+---*/
+
+var target = {};
+var handler = {
+    set: function(t, prop, value, receiver) {
+        return true;
+    }
+};
+var p = new Proxy(target, handler);
+
+Object.defineProperty(target, 'attr', {
+    configurable: false,
+    writable: true,
+    value: 'foo'
+});
+
+assert(Reflect.set(p, "attr", 1));
diff --git a/test/built-ins/Proxy/set/return-true-target-property-is-not-writable.js b/test/built-ins/Proxy/set/return-true-target-property-is-not-writable.js
new file mode 100644
index 0000000000000000000000000000000000000000..314d164ef0827b2a0bcd3001ea5dfa529473f752
--- /dev/null
+++ b/test/built-ins/Proxy/set/return-true-target-property-is-not-writable.js
@@ -0,0 +1,27 @@
+// 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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    Returns true if trap returns true and target property is configurable
+    but not writable.
+features: [Reflect]
+---*/
+
+var target = {};
+var handler = {
+    set: function(t, prop, value, receiver) {
+        return true;
+    }
+};
+var p = new Proxy(target, handler);
+
+Object.defineProperty(target, "attr", {
+    configurable: true,
+    writable: false,
+    value: "foo"
+});
+
+assert(Reflect.set(p, "attr", "foo"));
diff --git a/test/built-ins/Proxy/set/target-property-is-accessor-not-configurable-set-is-undefined.js b/test/built-ins/Proxy/set/target-property-is-accessor-not-configurable-set-is-undefined.js
new file mode 100644
index 0000000000000000000000000000000000000000..32075bce31c89dcf84db4a76acec6b5dca3d3e8f
--- /dev/null
+++ b/test/built-ins/Proxy/set/target-property-is-accessor-not-configurable-set-is-undefined.js
@@ -0,0 +1,36 @@
+// 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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    Throws a TypeError when target property is an accessor not configurable and
+    and set is undefined.
+info: >
+    14. If targetDesc is not undefined, then
+        b. If IsAccessorDescriptor(targetDesc) and targetDesc.[[Configurable]] is false, then
+            i. If targetDesc.[[Set]] is undefined, throw a TypeError exception.
+
+---*/
+
+var target = {};
+var handler = {
+    set: function(t, prop, value, receiver) {
+        return true;
+    }
+};
+var p = new Proxy(target, handler);
+
+Object.defineProperty(target, 'attr', {
+    configurable: false,
+    set: undefined
+});
+
+assert.throws(TypeError, function() {
+    p.attr = 'bar';
+});
+
+assert.throws(TypeError, function() {
+    p['attr'] = 'bar';
+});
diff --git a/test/built-ins/Proxy/set/target-property-is-not-configurable-not-writable-not-equal-to-v.js b/test/built-ins/Proxy/set/target-property-is-not-configurable-not-writable-not-equal-to-v.js
new file mode 100644
index 0000000000000000000000000000000000000000..4b1a9f919d713af34d35ec9e9cc049fd513d298e
--- /dev/null
+++ b/test/built-ins/Proxy/set/target-property-is-not-configurable-not-writable-not-equal-to-v.js
@@ -0,0 +1,38 @@
+// 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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    Throws a TypeError when target property is not configurable neither writable
+    and its value is not strictly equal to V.
+info: >
+    14. If targetDesc is not undefined, then
+        a. If IsDataDescriptor(targetDesc) and targetDesc.[[Configurable]] is
+        false and targetDesc.[[Writable]] is false, then
+            i. If SameValue(V, targetDesc.[[Value]]) is false, throw a TypeError
+            exception.
+---*/
+
+var target = {};
+var handler = {
+    set: function(t, prop, value, receiver) {
+        return true;
+    }
+};
+var p = new Proxy(target, handler);
+
+Object.defineProperty(target, 'attr', {
+    configurable: false,
+    writable: false,
+    value: 'foo'
+});
+
+assert.throws(TypeError, function() {
+    p.attr = 'bar';
+});
+
+assert.throws(TypeError, function() {
+    p['attr'] = 'bar';
+});
diff --git a/test/built-ins/Proxy/set/trap-is-not-callable.js b/test/built-ins/Proxy/set/trap-is-not-callable.js
new file mode 100644
index 0000000000000000000000000000000000000000..fb044e5be9770d6599e8d748422af82b470dfd48
--- /dev/null
+++ b/test/built-ins/Proxy/set/trap-is-not-callable.js
@@ -0,0 +1,28 @@
+// 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.9
+description: >
+    Trap is not callable.
+info: >
+    [[Set]] ( P, V, Receiver)
+
+    6. Let trap be GetMethod(handler, "set").
+    ...
+
+    7.3.9 GetMethod (O, P)
+
+    5. If IsCallable(func) is false, throw a TypeError exception.
+---*/
+
+var p = new Proxy({}, {
+    set: {}
+});
+
+assert.throws(TypeError, function() {
+    p.attr = 1;
+});
+
+assert.throws(TypeError, function() {
+    p["attr"] = 1;
+});
diff --git a/test/built-ins/Proxy/set/trap-is-undefined-no-property.js b/test/built-ins/Proxy/set/trap-is-undefined-no-property.js
new file mode 100644
index 0000000000000000000000000000000000000000..f0b29b0ff8f8418b365fc0a1f3f72d4e36b6e3b6
--- /dev/null
+++ b/test/built-ins/Proxy/set/trap-is-undefined-no-property.js
@@ -0,0 +1,19 @@
+// 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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    8. If trap is undefined, then return target.[[Set]](P, V, Receiver).
+
+---*/
+
+var target = {
+    attr: 1
+};
+var p = new Proxy(target, {});
+
+p.attr = 2;
+
+assert.sameValue(target.attr, 2);
diff --git a/test/built-ins/Proxy/set/trap-is-undefined.js b/test/built-ins/Proxy/set/trap-is-undefined.js
new file mode 100644
index 0000000000000000000000000000000000000000..82399fa34328ae0e7dd064e40584e0939812bd21
--- /dev/null
+++ b/test/built-ins/Proxy/set/trap-is-undefined.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.9
+description: >
+    [[Set]] ( P, V, Receiver)
+
+    8. If trap is undefined, then return target.[[Set]](P, V, Receiver).
+
+---*/
+
+var target = {
+    attr: 1
+};
+var p = new Proxy(target, {
+    get: undefined
+});
+
+p.attr = 1;
+
+assert.sameValue(target.attr, 1);