diff --git a/test/built-ins/SetIteratorPrototype/Symbol.toStringTag.js b/test/built-ins/SetIteratorPrototype/Symbol.toStringTag.js
index 871d73571bd5cec1c36c1d209b34ca4bf25b3d48..83a389f86fdc05f3444f857ba9902a8cb5c6205b 100644
--- a/test/built-ins/SetIteratorPrototype/Symbol.toStringTag.js
+++ b/test/built-ins/SetIteratorPrototype/Symbol.toStringTag.js
@@ -1,20 +1,22 @@
 // Copyright (C) 2014 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
-
 /*---
-  description: >
-      `Object.prototype.getOwnPropertyDescriptor` should reflect the value and
-      writability of the @@toStringTag attribute.
-  includes: [propertyHelper.js]
-  es6id: 23.2.3.12
+es6id: 23.2.3.12
+description: >
+  `Object.prototype.getOwnPropertyDescriptor` should reflect the value and
+  writability of the @@toStringTag attribute.
+includes: [propertyHelper.js]
+features:
+  - Symbol.toStringTag
+  - Symbol.iterator
  ---*/
 
 var SetIteratorProto = Object.getPrototypeOf(new Set()[Symbol.iterator]());
 
 assert.sameValue(
- 'Set Iterator',
- SetIteratorProto[Symbol.toStringTag],
- "`'Set Iterator'` is `SetIteratorProto[Symbol.toStringTag]`"
+  'Set Iterator',
+  SetIteratorProto[Symbol.toStringTag],
+  '`Set Iterator` is `SetIteratorProto[Symbol.toStringTag]`'
 );
 
 verifyNotEnumerable(SetIteratorProto, Symbol.toStringTag);
diff --git a/test/built-ins/SetIteratorPrototype/next/does-not-have-mapiterator-internal-slots-set.js b/test/built-ins/SetIteratorPrototype/next/does-not-have-mapiterator-internal-slots-set.js
new file mode 100644
index 0000000000000000000000000000000000000000..6b729eacc798eff7e34fe759b271d95d8251b562
--- /dev/null
+++ b/test/built-ins/SetIteratorPrototype/next/does-not-have-mapiterator-internal-slots-set.js
@@ -0,0 +1,39 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.2.5.2.1
+description: >
+  Throws a TypeError if `this` does not have all of the internal slots of a Set
+  Iterator Instance.
+info: >
+  %SetIteratorPrototype%.next ( )
+
+  1. Let O be the this value.
+  2. If Type(O) is not Object, throw a TypeError exception.
+  3. If O does not have all of the internal slots of a Set Iterator Instance
+  (23.2.5.3), throw a TypeError exception.
+  ...
+features: [Symbol.iterator]
+---*/
+
+var set = new Set([1, 2]);
+
+var iterator = set[Symbol.iterator]();
+assert.throws(TypeError, function() {
+  iterator.next.call(set);
+});
+
+iterator = set.entries();
+assert.throws(TypeError, function() {
+  iterator.next.call(set);
+});
+
+iterator = set.keys();
+assert.throws(TypeError, function() {
+  iterator.next.call(set);
+});
+
+iterator = set.values();
+assert.throws(TypeError, function() {
+  iterator.next.call(set);
+});
diff --git a/test/built-ins/SetIteratorPrototype/next/does-not-have-mapiterator-internal-slots.js b/test/built-ins/SetIteratorPrototype/next/does-not-have-mapiterator-internal-slots.js
new file mode 100644
index 0000000000000000000000000000000000000000..631b641e967b9bf741aa3704cf65c0afb739679a
--- /dev/null
+++ b/test/built-ins/SetIteratorPrototype/next/does-not-have-mapiterator-internal-slots.js
@@ -0,0 +1,42 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.2.5.2.1
+description: >
+  Throws a TypeError if `this` does not have all of the internal slots of a Set
+  Iterator Instance.
+info: >
+  %SetIteratorPrototype%.next ( )
+
+  1. Let O be the this value.
+  2. If Type(O) is not Object, throw a TypeError exception.
+  3. If O does not have all of the internal slots of a Set Iterator Instance
+  (23.2.5.3), throw a TypeError exception.
+  ...
+features: [Symbol.iterator]
+---*/
+
+var set = new Set([1, 2]);
+
+var iterator = set[Symbol.iterator]();
+assert.throws(TypeError, function() {
+  iterator.next.call({});
+});
+
+iterator = set.entries();
+assert.throws(TypeError, function() {
+  iterator.next.call({});
+});
+
+iterator = set.keys();
+assert.throws(TypeError, function() {
+  iterator.next.call({});
+});
+
+iterator = set.values();
+assert.throws(TypeError, function() {
+  iterator.next.call({});
+});
+
+// does not throw an Error
+iterator.next.call(set[Symbol.iterator]());
diff --git a/test/built-ins/SetIteratorPrototype/next/iteration-mutable.js b/test/built-ins/SetIteratorPrototype/next/iteration-mutable.js
index 01b9f68efd20f6b75ab8560cbd36eb4a44f590d8..9d91688eab875f82ae584fda90ff78557e9411ab 100644
--- a/test/built-ins/SetIteratorPrototype/next/iteration-mutable.js
+++ b/test/built-ins/SetIteratorPrototype/next/iteration-mutable.js
@@ -1,14 +1,14 @@
 // Copyright (C) 2014 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
-
 /*---
-  description: >
-      When an item is added to the set after the iterator is created but before
-      the iterator is "done" (as defined by 23.2.5.2.1), the new item should be
-      accessible via iteration. When an item is added to the set after the
-      iterator is "done", the new item should not be accessible via iteration.
-  es6id: 23.2.3.11
- ---*/
+es6id: 23.2.3.11
+description: >
+  When an item is added to the set after the iterator is created but before
+  the iterator is "done" (as defined by 23.2.5.2.1), the new item should be
+  accessible via iteration. When an item is added to the set after the
+  iterator is "done", the new item should not be accessible via iteration.
+features: [Symbol.iterator]
+---*/
 
 var set = new Set();
 set.add(1);
diff --git a/test/built-ins/SetIteratorPrototype/next/iteration.js b/test/built-ins/SetIteratorPrototype/next/iteration.js
index 1889923afd67ea30dedd895ec066647772c6edc4..64688c12f0ee98be5b2cce4a378ca7998f30c3c1 100644
--- a/test/built-ins/SetIteratorPrototype/next/iteration.js
+++ b/test/built-ins/SetIteratorPrototype/next/iteration.js
@@ -1,11 +1,12 @@
 // Copyright (C) 2014 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
-
 /*---
-  description: >
-      The method should return a valid iterator with the context as the
-      IteratedObject.
-  es6id: 23.2.3.11
+es6id: 23.2.3.11
+description: >
+  The method should return a valid iterator with the context as the
+  IteratedObject.
+features:
+  - Symbol.iterator
  ---*/
 
 var set = new Set();
diff --git a/test/built-ins/SetIteratorPrototype/next/no-set-data.js b/test/built-ins/SetIteratorPrototype/next/no-set-data.js
deleted file mode 100644
index 55feabcadf7cb22718284d166741ddfec9602eb0..0000000000000000000000000000000000000000
--- a/test/built-ins/SetIteratorPrototype/next/no-set-data.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (C) 2014 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-  description: >
-      If the context does not have a [[SetData]] internal slot, throw a
-      TypeError exception as per 23.2.5.1.
-  es6id: 23.2.3.11
- ---*/
-
-var iterator = new Set()[Symbol.iterator]();
-
-assert.throws(TypeError, function() {
-  iterator.next.call({});
-});
diff --git a/test/built-ins/SetIteratorPrototype/next/this-not-object-throw-entries.js b/test/built-ins/SetIteratorPrototype/next/this-not-object-throw-entries.js
new file mode 100644
index 0000000000000000000000000000000000000000..e5e616a5f5b0feceb3e090df2eef699179600213
--- /dev/null
+++ b/test/built-ins/SetIteratorPrototype/next/this-not-object-throw-entries.js
@@ -0,0 +1,48 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.2.5.2.1
+description: >
+  Throws a TypeError if `this` value is not an Object.
+info: >
+  From Set.prototype.entries()
+
+  %SetIteratorPrototype%.next ( )
+
+  1. Let O be the this value.
+  2. If Type(O) is not Object, throw a TypeError exception.
+  ...
+features:
+  - Symbol
+  - Symbol.iterator
+---*/
+
+var set = new Set([1, 2]);
+var iterator = set.entries();
+
+assert.throws(TypeError, function() {
+  iterator.next.call(false);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(1);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call('');
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(undefined);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(null);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(Symbol());
+});
+
+// does not throw an Error
+iterator.next.call(set[Symbol.iterator]());
diff --git a/test/built-ins/SetIteratorPrototype/next/this-not-object-throw-keys.js b/test/built-ins/SetIteratorPrototype/next/this-not-object-throw-keys.js
new file mode 100644
index 0000000000000000000000000000000000000000..7ae20213a1075df83839095b3dd8710b99496323
--- /dev/null
+++ b/test/built-ins/SetIteratorPrototype/next/this-not-object-throw-keys.js
@@ -0,0 +1,48 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.2.5.2.1
+description: >
+  Throws a TypeError if `this` value is not an Object.
+info: >
+  From Set.prototype.keys()
+
+  %SetIteratorPrototype%.next ( )
+
+  1. Let O be the this value.
+  2. If Type(O) is not Object, throw a TypeError exception.
+  ...
+features:
+  - Symbol
+  - Symbol.iterator
+---*/
+
+var set = new Set([[1, 11], [2, 22]]);
+var iterator = set.keys();
+
+assert.throws(TypeError, function() {
+  iterator.next.call(false);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(1);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call('');
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(undefined);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(null);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(Symbol());
+});
+
+// does not throw an Error
+iterator.next.call(set[Symbol.iterator]());
diff --git a/test/built-ins/SetIteratorPrototype/next/this-not-object-throw-prototype-iterator.js b/test/built-ins/SetIteratorPrototype/next/this-not-object-throw-prototype-iterator.js
new file mode 100644
index 0000000000000000000000000000000000000000..87338d389ebbae0eedfbc401f3f97e4f2734414a
--- /dev/null
+++ b/test/built-ins/SetIteratorPrototype/next/this-not-object-throw-prototype-iterator.js
@@ -0,0 +1,48 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.2.5.2.1
+description: >
+  Throws a TypeError if `this` value is not an Object.
+info: >
+  Using Set.prototype[Symbol.iterator]()
+
+  %SetIteratorPrototype%.next ( )
+
+  1. Let O be the this value.
+  2. If Type(O) is not Object, throw a TypeError exception.
+  ...
+features:
+  - Symbol
+  - Symbol.iterator
+---*/
+
+var set = new Set([[1, 11], [2, 22]]);
+var iterator = set[Symbol.iterator]();
+
+assert.throws(TypeError, function() {
+  iterator.next.call(false);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(1);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call('');
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(undefined);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(null);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(Symbol());
+});
+
+// does not throw an Error
+iterator.next.call(set[Symbol.iterator]());
diff --git a/test/built-ins/SetIteratorPrototype/next/this-not-object-throw-values.js b/test/built-ins/SetIteratorPrototype/next/this-not-object-throw-values.js
new file mode 100644
index 0000000000000000000000000000000000000000..2443af357279ef8c334a3ae7cdf72a2dbedf5040
--- /dev/null
+++ b/test/built-ins/SetIteratorPrototype/next/this-not-object-throw-values.js
@@ -0,0 +1,48 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 23.2.5.2.1
+description: >
+  Throws a TypeError if `this` value is not an Object.
+info: >
+  From Set.prototype.values()
+
+  %SetIteratorPrototype%.next ( )
+
+  1. Let O be the this value.
+  2. If Type(O) is not Object, throw a TypeError exception.
+  ...
+features:
+  - Symbol
+  - Symbol.iterator
+---*/
+
+var set = new Set([[1, 11], [2, 22]]);
+var iterator = set.values();
+
+assert.throws(TypeError, function() {
+  iterator.next.call(false);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(1);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call('');
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(undefined);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(null);
+});
+
+assert.throws(TypeError, function() {
+  iterator.next.call(Symbol());
+});
+
+// does not throw an Error
+iterator.next.call(set[Symbol.iterator]());