diff --git a/test/suite/es6/Array.prototype.find/Array.prototype.find_callable-predicate.js b/test/suite/es6/Array.prototype.find/Array.prototype.find_callable-predicate.js
new file mode 100644
index 0000000000000000000000000000000000000000..ba66238e9156ea89c4569d56bb1fb97bdbb8e5fe
--- /dev/null
+++ b/test/suite/es6/Array.prototype.find/Array.prototype.find_callable-predicate.js
@@ -0,0 +1,30 @@
+// Copyright (c) 2014 Matthew Meyers. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/**
+ * @path
+ * @description Array.prototype.find shouldn't throw a TypeError if IsCallable(predicate) is true
+ */
+
+var callableValues = [
+    function () {},
+    Array.prototype.forEach,
+    Proxy,
+    new Proxy(function () {}, function () {}),
+    x => x
+];
+
+function testcase() {
+    for (var i = 0, len = callableValues.length; i < len; i++) {
+        try {
+            [].find(callableValues[i]);
+        } catch (e) {
+            if (e instanceof TypeError) {
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+runTestCase(testcase);
diff --git a/test/suite/es6/Array.prototype.find/Array.prototype.find_empty-array-undefined.js b/test/suite/es6/Array.prototype.find/Array.prototype.find_empty-array-undefined.js
new file mode 100644
index 0000000000000000000000000000000000000000..19293c9124059ade5b147ffc5acd6c6491d988c7
--- /dev/null
+++ b/test/suite/es6/Array.prototype.find/Array.prototype.find_empty-array-undefined.js
@@ -0,0 +1,15 @@
+// Copyright (c) 2014 Matthew Meyers. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/**
+ * @path
+ * @description Find on empty array should return undefined
+ */
+
+var a = [].find(function () {
+	return true;
+});
+
+if (a !== undefined) {
+	$ERROR('#1: a !== undefined. Actual: ' + typeof a);
+}
diff --git a/test/suite/es6/Array.prototype.find/Array.prototype.find_length-property.js b/test/suite/es6/Array.prototype.find/Array.prototype.find_length-property.js
new file mode 100644
index 0000000000000000000000000000000000000000..5184bd9cf57093eec6b9154551d8ff8c160c4d7b
--- /dev/null
+++ b/test/suite/es6/Array.prototype.find/Array.prototype.find_length-property.js
@@ -0,0 +1,11 @@
+// Copyright (c) 2014 Matthew Meyers. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/**
+ * @path
+ * @description The length property of the find method is 1
+ */
+
+if ([].find.length !== 1) {
+	$ERROR('1: [].find.length !== 1. Actual: ' + [].find.length);
+}
diff --git a/test/suite/es6/Array.prototype.find/Array.prototype.find_modify-after-start.js b/test/suite/es6/Array.prototype.find/Array.prototype.find_modify-after-start.js
new file mode 100644
index 0000000000000000000000000000000000000000..2fc5f4303c9a4622405b82a36b63ed35b6cf1aa0
--- /dev/null
+++ b/test/suite/es6/Array.prototype.find/Array.prototype.find_modify-after-start.js
@@ -0,0 +1,28 @@
+// Copyright (c) 2014 Matthew Meyers. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/**
+ * @path
+ * @description Array may be mutated by calls to the predicate
+ */
+
+[1, 2, 3].find(function (v, i, arr) {
+	arr[i + 1] = arr[i + 1] + 1;
+	switch (i) {
+		case 0:
+			if (arr[i] !== 1) {
+				$ERROR('#1: arr[0] !== 1. Actual: ' + arr[i]);
+			}
+			break;
+		case 1:
+			if (arr[i] !== 3) {
+				$ERROR('#2: arr[1] !== 3. Actual: ' + arr[i]);
+			}
+			break;
+		case 2:
+			if (arr[i] !== 4) {
+				$ERROR('#3: arr[1] !== 4. Actual: ' + arr[i]);
+			}
+			break;
+	}
+});
diff --git a/test/suite/es6/Array.prototype.find/Array.prototype.find_non-returning-predicate.js b/test/suite/es6/Array.prototype.find/Array.prototype.find_non-returning-predicate.js
new file mode 100644
index 0000000000000000000000000000000000000000..0b63d32adbcd8a1cc6d7f628b8e2f4563eff10fb
--- /dev/null
+++ b/test/suite/es6/Array.prototype.find/Array.prototype.find_non-returning-predicate.js
@@ -0,0 +1,13 @@
+// Copyright (c) 2014 Matthew Meyers. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/**
+ * @path
+ * @description Find with a predicate with no return value should return undefined
+ */
+
+var a = [1, 2, 3].find(function () {});
+
+if (a !== undefined) {
+	$ERROR('#1: a !== undefined. Actual: ' + typeof a);
+}
diff --git a/test/suite/es6/Array.prototype.find/Array.prototype.find_noncallable-predicate.js b/test/suite/es6/Array.prototype.find/Array.prototype.find_noncallable-predicate.js
new file mode 100644
index 0000000000000000000000000000000000000000..1fcda5f4920d620994544b3bd6376e981ba708e7
--- /dev/null
+++ b/test/suite/es6/Array.prototype.find/Array.prototype.find_noncallable-predicate.js
@@ -0,0 +1,33 @@
+// Copyright (c) 2014 Matthew Meyers. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/**
+ * @path
+ * @description Array.prototype.find should throw a TypeError if IsCallable(predicate) is false
+ */
+
+var uncallableValues = [
+    undefined,
+    null,
+    true,
+    this,
+    {},
+    'string',
+    0
+];
+
+function testcase() {
+    for (var i = 0, len = uncallableValues.length; i < len; i++) {
+        try {
+            [].find(uncallableValues[i]);
+            return false;
+        } catch (e) {
+            if (!(e instanceof TypeError)) {
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+runTestCase(testcase);
diff --git a/test/suite/es6/Array.prototype.find/Array.prototype.find_predicate-arguments.js b/test/suite/es6/Array.prototype.find/Array.prototype.find_predicate-arguments.js
new file mode 100644
index 0000000000000000000000000000000000000000..8ce1217958418f439113507cc22f1b74a1965e8d
--- /dev/null
+++ b/test/suite/es6/Array.prototype.find/Array.prototype.find_predicate-arguments.js
@@ -0,0 +1,24 @@
+// Copyright (c) 2014 Matthew Meyers. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/**
+ * @path
+ * @description predicate is called with three arguments: the value of the element, the index of the element, and the object being traversed.
+ */
+
+var a = [1];
+
+var b = a.find(function (v, i, arr) {
+	if (arguments.length !== 3) {
+		$ERROR('#1: arguments.length !== 3. Actual: ' + arguments.length);
+	}
+	if (v !== 1) {
+		$ERROR('#2: element value !== 1. Actual: ' + v);
+	}
+	if (i !== 0) {
+		$ERROR('#3: index !== 0. Actual: ' + i);
+	}
+	if (arr !== a) {
+		$ERROR('#4: object being traversed !== a');
+	}
+});
diff --git a/test/suite/es6/Array.prototype.find/Array.prototype.find_push-after-start.js b/test/suite/es6/Array.prototype.find/Array.prototype.find_push-after-start.js
new file mode 100644
index 0000000000000000000000000000000000000000..0ed0138de3d937535956f86dede9b0364181cddc
--- /dev/null
+++ b/test/suite/es6/Array.prototype.find/Array.prototype.find_push-after-start.js
@@ -0,0 +1,14 @@
+// Copyright (c) 2014 Matthew Meyers. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/**
+ * @path
+ * @description Elements added to array after find has been called should not be visited
+ */
+
+[1].find(function (v, i, arr) {
+	arr.push('string');
+	if (v === 'string') {
+		$ERROR('#' + i + ': \'string\' should not be visited');
+	}
+});
diff --git a/test/suite/es6/Array.prototype.find/Array.prototype.find_remove-after-start.js b/test/suite/es6/Array.prototype.find/Array.prototype.find_remove-after-start.js
new file mode 100644
index 0000000000000000000000000000000000000000..169e6fdebf36e409d63643ae71c1206229f8e6f3
--- /dev/null
+++ b/test/suite/es6/Array.prototype.find/Array.prototype.find_remove-after-start.js
@@ -0,0 +1,29 @@
+// Copyright (c) 2014 Matthew Meyers. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/**
+ * @path
+ * @description Elements removed from array after find has been called should not be visited
+ */
+
+[1, 'string', 2].find(function (v, i, arr) {
+	var stringIndex = arr.indexOf('string');
+	if (stringIndex !== -1) delete arr[stringIndex];
+	if (v === 'string') {
+		$ERROR('#1: \'string\' should not exist, it has been deleted');
+	}
+	if (v === undefined) {
+		$ERROR('#2: deleted element should not be visited');
+	}
+});
+
+[1, 'string', 2].find(function (v, i, arr) {
+	var stringIndex = arr.indexOf('string');
+	if (stringIndex !== -1) arr.splice(stringIndex, 1);
+	if (v === 'string') {
+		$ERROR('#3: \'string\' should not exist, it has been deleted');
+	}
+	if (v === undefined) {
+		$ERROR('#4: deleted element should not be visited');
+	}
+});
diff --git a/test/suite/es6/Array.prototype.find/Array.prototype.find_return-found-value.js b/test/suite/es6/Array.prototype.find/Array.prototype.find_return-found-value.js
new file mode 100644
index 0000000000000000000000000000000000000000..b65ead1c32117104fe6deb95bd011c705f29546b
--- /dev/null
+++ b/test/suite/es6/Array.prototype.find/Array.prototype.find_return-found-value.js
@@ -0,0 +1,29 @@
+// Copyright (c) 2014 Matthew Meyers. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/**
+ * @path
+ * @description Find should return value if predicate returns true
+ */
+
+var testVals = [
+	undefined,
+	null,
+	0,
+	'string',
+	String,
+	this,
+	true,
+	[1,2,3]
+];
+
+var a;
+
+for (var i = 0, len = testVals.length; i < len; i++) {
+	a = testVals.find(function (v) {
+		return v === testVals[i];
+	});
+	if (a !== testVals[i]) {
+		$ERROR('#' + (i + 1) + ': a !== testVals[' + i + ']. Actual: ' + a);
+	}
+}
diff --git a/test/suite/es6/Array.prototype.find/Array.prototype.find_skip-empty.js b/test/suite/es6/Array.prototype.find/Array.prototype.find_skip-empty.js
new file mode 100644
index 0000000000000000000000000000000000000000..a24b0b8301873c58b697cb3be3bd6aadd2d7788b
--- /dev/null
+++ b/test/suite/es6/Array.prototype.find/Array.prototype.find_skip-empty.js
@@ -0,0 +1,20 @@
+// Copyright (c) 2014 Matthew Meyers. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/**
+ * @path
+ * @description predicate is called only for elements of the array which actually exist; it is not called for missing elements of the array
+ */
+
+var a = [];
+
+a[10] = 1;
+a[11] = 2;
+
+var b = a.find(function (v) {
+	return v !== 1;
+});
+
+if (b !== 2) {
+	$ERROR('#1: b !== 2. Actual: ' + b);
+}
diff --git a/test/suite/es6/Array.prototype.find/Array.prototype.find_this-defined.js b/test/suite/es6/Array.prototype.find/Array.prototype.find_this-defined.js
new file mode 100644
index 0000000000000000000000000000000000000000..f28f6fc4a56ce6b40b4acf293ffeb412187aa4ef
--- /dev/null
+++ b/test/suite/es6/Array.prototype.find/Array.prototype.find_this-defined.js
@@ -0,0 +1,18 @@
+// Copyright (c) 2014 Matthew Meyers. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/**
+ * @path
+ * @description thisArg should be bound to this if provided
+ */
+
+var globalThis = this;
+
+[1].find(function () {
+    if (this !== Array) {
+      $ERROR('#1: this !== Array');
+    }
+    if (this === globalThis) {
+      $ERROR('#2: this === globalThis. Should be Array');
+    }
+}, Array);
diff --git a/test/suite/es6/Array.prototype.find/Array.prototype.find_this-is-object.js b/test/suite/es6/Array.prototype.find/Array.prototype.find_this-is-object.js
new file mode 100644
index 0000000000000000000000000000000000000000..7897090a66c0441a187e8f6e400a4ae5babc60c3
--- /dev/null
+++ b/test/suite/es6/Array.prototype.find/Array.prototype.find_this-is-object.js
@@ -0,0 +1,25 @@
+// Copyright (c) 2014 Matthew Meyers. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/**
+ * @path
+ * @description Array.prototype.find should convert thisArg into an object
+ */
+var dataTypes = [
+    undefined,
+    null,
+    true,
+    this,
+    {},
+    'string',
+    0,
+    function () {}
+]
+
+for (var i = 0, len = dataTypes.length; i < len; i++) {
+	[1].find(function () {
+		if (!(this instanceof Object)) {
+		  $ERROR('#' + i + ': !(this instanceof Object). Actual: ' + typeof this);
+		}
+	}, dataTypes[i])
+}
diff --git a/test/suite/es6/Array.prototype.find/Array.prototype.find_this-undefined.js b/test/suite/es6/Array.prototype.find/Array.prototype.find_this-undefined.js
new file mode 100644
index 0000000000000000000000000000000000000000..54a2c9fd4266d6ad1fd64c03edc6a02265af943d
--- /dev/null
+++ b/test/suite/es6/Array.prototype.find/Array.prototype.find_this-undefined.js
@@ -0,0 +1,15 @@
+// Copyright (c) 2014 Matthew Meyers. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/**
+ * @path
+ * @description thisArg should be undefined if not provided
+ */
+
+var globalThis = this;
+
+[1].find(function () {
+	if (this !== globalThis) {
+	  $ERROR('#1: this !== globalThis');
+	}
+});