diff --git a/es6-collections/es6-collections-tests.ts b/es6-collections/es6-collections-tests.ts
new file mode 100644
index 000000000..256994272
--- /dev/null
+++ b/es6-collections/es6-collections-tests.ts
@@ -0,0 +1,59 @@
+///
+
+interface Point { x: number; y: number; }
+let a: any;
+let s: string;
+let b: boolean;
+let i: number;
+let pt: Point;
+let arrayOfPoint: Point[];
+let arrayOfStringPoint: [string, Point][];
+let arrayOfPointString: [Point, string][];
+let map: Map;
+let set: Set;
+let weakMap: WeakMap;
+let weakSet: WeakSet;
+let iteratorOfString: Iterator;
+let iteratorOfStringPoint: Iterator<[String, Point]>;
+let iteratorOfPoint: Iterator;
+let iteratorOfPointPoint: Iterator<[Point, Point]>;
+
+map = new Map();
+map = new Map(arrayOfStringPoint);
+map.clear();
+b = map.delete(s);
+map.forEach((value: Point, key: string, map: Map) => { }, a);
+pt = map.get(s);
+b = map.has(s);
+map = map.set(s, pt);
+iteratorOfStringPoint = map.entries();
+iteratorOfString = map.keys();
+iteratorOfPoint = map.values();
+i = map.size;
+
+set = new Set();
+set = new Set(arrayOfPoint);
+set.clear();
+b = set.delete(pt);
+set.forEach((value: Point, key: Point, set: Set) => { }, a);
+b = set.has(pt);
+set = set.add(pt);
+iteratorOfPointPoint = set.entries();
+iteratorOfPoint = set.keys();
+iteratorOfPoint = set.values();
+i = set.size;
+
+weakMap = new WeakMap();
+weakMap = new WeakMap(arrayOfPointString);
+weakMap.clear();
+b = weakMap.delete(pt);
+s = weakMap.get(pt);
+b = weakMap.has(pt);
+weakMap = weakMap.set(pt, s);
+
+weakSet = new WeakSet();
+weakSet = new WeakSet(arrayOfPoint);
+weakSet.clear();
+b = weakSet.delete(pt);
+b = weakSet.has(pt);
+weakSet = weakSet.add(pt);
\ No newline at end of file
diff --git a/es6-collections/es6-collections-tests.ts.tscparams b/es6-collections/es6-collections-tests.ts.tscparams
new file mode 100644
index 000000000..4169d3605
--- /dev/null
+++ b/es6-collections/es6-collections-tests.ts.tscparams
@@ -0,0 +1 @@
+--noImplicitAny --module commonjs --target es5
\ No newline at end of file
diff --git a/es6-collections/es6-collections.d.ts b/es6-collections/es6-collections.d.ts
new file mode 100644
index 000000000..54bcbca01
--- /dev/null
+++ b/es6-collections/es6-collections.d.ts
@@ -0,0 +1,113 @@
+// Type definitions for es6-collections v0.5.1
+// Project: https://github.com/WebReflection/es6-collections/
+// Definitions by: Ron Buckton
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+/* *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+interface IteratorResult {
+ done: boolean;
+ value?: T;
+}
+
+interface Iterator {
+ next(value?: any): IteratorResult;
+ return?(value?: any): IteratorResult;
+ throw?(e?: any): IteratorResult;
+}
+
+interface ForEachable {
+ forEach(callbackfn: (value: T) => void): void;
+}
+
+interface Map {
+ clear(): void;
+ delete(key: K): boolean;
+ forEach(callbackfn: (value: V, index: K, map: Map) => void, thisArg?: any): void;
+ get(key: K): V;
+ has(key: K): boolean;
+ set(key: K, value?: V): Map;
+ entries(): Iterator<[K, V]>;
+ keys(): Iterator;
+ values(): Iterator;
+ size: number;
+}
+
+interface MapConstructor {
+ new (): Map;
+ new (iterable: ForEachable<[K, V]>): Map;
+ prototype: Map;
+}
+
+declare var Map: MapConstructor;
+
+interface Set {
+ add(value: T): Set;
+ clear(): void;
+ delete(value: T): boolean;
+ forEach(callbackfn: (value: T, index: T, set: Set) => void, thisArg?: any): void;
+ has(value: T): boolean;
+ entries(): Iterator<[T, T]>;
+ keys(): Iterator;
+ values(): Iterator;
+ size: number;
+}
+
+interface SetConstructor {
+ new (): Set;
+ new (iterable: ForEachable): Set;
+ prototype: Set;
+}
+
+declare var Set: SetConstructor;
+
+interface WeakMap {
+ delete(key: K): boolean;
+ clear(): void;
+ get(key: K): V;
+ has(key: K): boolean;
+ set(key: K, value?: V): WeakMap;
+}
+
+interface WeakMapConstructor {
+ new (): WeakMap;
+ new (iterable: ForEachable<[K, V]>): WeakMap;
+ prototype: WeakMap;
+}
+
+declare var WeakMap: WeakMapConstructor;
+
+interface WeakSet {
+ delete(value: T): boolean;
+ clear(): void;
+ add(value: T): WeakSet;
+ has(value: T): boolean;
+}
+
+interface WeakSetConstructor {
+ new (): WeakSet;
+ new (iterable: ForEachable): WeakSet;
+ prototype: WeakSet;
+}
+
+declare var WeakSet: WeakSetConstructor;
+
+declare module "es6-collections" {
+ var Map: MapConstructor;
+ var Set: SetConstructor;
+ var WeakMap: WeakMapConstructor;
+ var WeakSet: WeakSetConstructor;
+}
\ No newline at end of file
diff --git a/es6-shim/es6-shim-tests.ts b/es6-shim/es6-shim-tests.ts
new file mode 100644
index 000000000..3bcb0ba7d
--- /dev/null
+++ b/es6-shim/es6-shim-tests.ts
@@ -0,0 +1,222 @@
+///
+
+interface Point { x: number; y: number; }
+interface Point3D extends Point { z: number; }
+
+let a: any;
+let s: string;
+let i: number;
+let b: boolean;
+let f: () => void;
+let o: Object;
+let r: RegExp;
+let sym: symbol;
+let e: Error;
+let date: Date;
+let key: PropertyKey;
+let point: Point;
+let point3d: Point3D;
+let arrayOfPoint: Point[];
+let arrayOfPoint3D: Point3D[];
+let arrayOfSymbol: symbol[];
+let arrayOfPropertyKey: PropertyKey[];
+let arrayOfAny: any[];
+let arrayOfStringAny: [string, any][];
+let arrayLikeOfAny: ArrayLike;
+let iterableOfPoint: IterableShim;
+let iterableOfStringPoint: IterableShim<[string, Point]>;
+let iterableOfPointPoint3D: IterableShim<[Point, Point3D]>;
+let iterableIteratorOfPoint: IterableIteratorShim;
+let iterableIteratorOfNumberPoint: IterableIteratorShim<[number, Point]>;
+let iterableIteratorOfNumber: IterableIteratorShim;
+let iterableIteratorOfString: IterableIteratorShim;
+let iterableIteratorOfPointPoint: IterableIteratorShim<[Point, Point]>;
+let iterableIteratorOfNode: IterableIteratorShim;
+let iterableIteratorOfStringPoint: IterableIteratorShim<[string, Point]>;
+let iterableIteratorOfAny: IterableIteratorShim;
+let iterableIteratorOfPropertyKey: IterableIteratorShim;
+let iterableIteratorOfPropertyKeyPoint: IterableIteratorShim<[PropertyKey, Point]>;
+let nodeList: NodeList;
+let pd: PropertyDescriptor;
+let pdm: PropertyDescriptorMap;
+let map: Map;
+let set: Set;
+let weakMap: WeakMap;
+let weakSet: WeakSet;
+let promiseLikeOfPoint: PromiseLike;
+let promiseLikeOfPoint3D: PromiseLike;
+let promiseOfPoint: Promise;
+let promiseOfPoint3D: Promise;
+let promiseOfArrayOfPoint: Promise;
+let promiseOfVoid: Promise;
+
+point = Object.assign(point, point);
+b = Object.is(point, point);
+Object.setPrototypeOf(point, point);
+point = arrayOfPoint.find(p => b);
+i = arrayOfPoint.findIndex(p => b);
+arrayOfPoint = arrayOfPoint.fill(point, i, arrayOfPoint.length);
+arrayOfPoint = arrayOfPoint.copyWithin(i, i, i);
+arrayOfPoint = Array.from(arrayOfPoint);
+arrayOfPoint = Array.from(iterableOfPoint);
+arrayOfPoint3D = Array.from(arrayOfPoint, point => point3d);
+arrayOfPoint3D = Array.from(arrayOfPoint, point => point3d, a);
+arrayOfPoint3D = Array.from(iterableOfPoint, point => point3d);
+arrayOfPoint3D = Array.from(iterableOfPoint, point => point3d, a);
+arrayOfPoint = Array.of(point, point);
+i = s.codePointAt(i);
+b = s.includes(s, i);
+b = s.endsWith(s, i);
+s = s.repeat(i);
+b = s.startsWith(s, i);
+s = String.fromCodePoint(i, i);
+s = String.raw`abc`;
+s = r.flags;
+i = Number.EPSILON;
+b = Number.isFinite(i);
+b = Number.isInteger(i);
+b = Number.isNaN(i);
+b = Number.isSafeInteger(i);
+i = Number.MAX_SAFE_INTEGER;
+i = Number.MIN_SAFE_INTEGER;
+i = Number.parseFloat(s);
+i = Number.parseInt(s);
+i = Number.parseInt(s, i);
+i = Math.clz32(i);
+i = Math.imul(i, i);
+i = Math.sign(i);
+i = Math.log10(i);
+i = Math.log2(i);
+i = Math.log1p(i);
+i = Math.expm1(i);
+i = Math.cosh(i);
+i = Math.sinh(i);
+i = Math.tanh(i);
+i = Math.acosh(i);
+i = Math.asinh(i);
+i = Math.atanh(i);
+i = Math.hypot(i, i);
+i = Math.trunc(i);
+i = Math.fround(i);
+i = Math.cbrt(i);
+map.clear();
+map.delete(s);
+map.forEach((value: Point, key: string) => { });
+point = map.get(s);
+b = map.has(s);
+map = map.set(s, point);
+i = map.size;
+map = new Map();
+map = new Map(iterableOfStringPoint);
+set.clear();
+set.delete(point);
+set.forEach((value: Point, key: Point) => { });
+b = set.has(point);
+set = set.add(point);
+i = set.size;
+set = new Set();
+set = new Set(iterableOfPoint);
+weakMap.delete(point);
+point3d = weakMap.get(point);
+b = weakMap.has(point);
+weakMap = weakMap.set(point, point3d);
+weakMap = new WeakMap();
+weakMap = new WeakMap(iterableOfPointPoint3D);
+weakSet.delete(point);
+weakSet = weakSet.add(point);
+b = weakSet.has(point);
+weakSet = new WeakSet();
+weakSet = new WeakSet(iterableOfPoint);
+iterableIteratorOfNumberPoint = arrayOfPoint.entries();
+iterableIteratorOfNumber = arrayOfPoint.keys();
+iterableIteratorOfPoint = arrayOfPoint.values();
+iterableIteratorOfPointPoint = set.entries();
+iterableIteratorOfPoint = set.keys();
+iterableIteratorOfPoint = set.values();
+promiseLikeOfPoint.then((point: Point) => { });
+promiseLikeOfPoint = promiseLikeOfPoint.then();
+promiseLikeOfPoint = promiseLikeOfPoint.then(p => point);
+promiseLikeOfPoint = promiseLikeOfPoint.then(p => promiseLikeOfPoint);
+promiseLikeOfPoint = promiseLikeOfPoint.then(p => point, e => point);
+promiseLikeOfPoint = promiseLikeOfPoint.then(p => promiseLikeOfPoint, e => point);
+promiseLikeOfPoint = promiseLikeOfPoint.then(p => point, e => promiseLikeOfPoint);
+promiseLikeOfPoint = promiseLikeOfPoint.then(p => point, e => { });
+promiseLikeOfPoint = promiseLikeOfPoint.then(p => promiseLikeOfPoint, e => { });
+promiseLikeOfPoint3D = promiseLikeOfPoint.then(p => point3d);
+promiseLikeOfPoint3D = promiseLikeOfPoint.then(p => promiseLikeOfPoint3D);
+promiseLikeOfPoint3D = promiseLikeOfPoint.then(p => point3d, e => point3d);
+promiseLikeOfPoint3D = promiseLikeOfPoint.then(p => promiseLikeOfPoint3D, e => point3d);
+promiseLikeOfPoint3D = promiseLikeOfPoint.then(p => point3d, e => promiseLikeOfPoint3D);
+promiseLikeOfPoint3D = promiseLikeOfPoint.then(p => point3d, e => { });
+promiseLikeOfPoint3D = promiseLikeOfPoint.then(p => promiseLikeOfPoint3D, e => { });
+promiseOfPoint.then((point: Point) => { });
+promiseOfPoint = promiseOfPoint.then();
+promiseOfPoint = promiseOfPoint.then(p => point);
+promiseOfPoint = promiseOfPoint.then(p => promiseOfPoint);
+promiseOfPoint = promiseOfPoint.then(p => promiseLikeOfPoint);
+promiseOfPoint = promiseOfPoint.then(p => point, e => point);
+promiseOfPoint = promiseOfPoint.then(p => promiseOfPoint, e => point);
+promiseOfPoint = promiseOfPoint.then(p => promiseLikeOfPoint, e => point);
+promiseOfPoint = promiseOfPoint.then(p => point, e => promiseOfPoint);
+promiseOfPoint = promiseOfPoint.then(p => point, e => promiseLikeOfPoint);
+promiseOfPoint = promiseOfPoint.then(p => point, e => { });
+promiseOfPoint = promiseOfPoint.then(p => promiseOfPoint, e => { });
+promiseOfPoint = promiseOfPoint.then(p => promiseLikeOfPoint, e => { });
+promiseOfPoint3D = promiseOfPoint.then(p => point3d);
+promiseOfPoint3D = promiseOfPoint.then(p => promiseOfPoint3D);
+promiseOfPoint3D = promiseOfPoint.then(p => promiseLikeOfPoint3D);
+promiseOfPoint3D = promiseOfPoint.then(p => point3d, e => point3d);
+promiseOfPoint3D = promiseOfPoint.then(p => promiseOfPoint3D, e => point3d);
+promiseOfPoint3D = promiseOfPoint.then(p => promiseLikeOfPoint3D, e => point3d);
+promiseOfPoint3D = promiseOfPoint.then(p => point3d, e => promiseOfPoint3D);
+promiseOfPoint3D = promiseOfPoint.then(p => point3d, e => promiseLikeOfPoint3D);
+promiseOfPoint3D = promiseOfPoint.then(p => point3d, e => { });
+promiseOfPoint3D = promiseOfPoint.then(p => promiseOfPoint3D, e => { });
+promiseOfPoint3D = promiseOfPoint.then(p => promiseLikeOfPoint3D, e => { });
+promiseOfPoint = promiseOfPoint.catch(e => point);
+promiseOfPoint = promiseOfPoint.catch(e => promiseOfPoint);
+promiseOfPoint = promiseOfPoint.catch(e => promiseLikeOfPoint);
+promiseOfPoint = promiseOfPoint.catch(e => { });
+promiseOfPoint3D = promiseOfPoint.catch(e => point3d);
+promiseOfPoint3D = promiseOfPoint.catch(e => promiseOfPoint3D);
+promiseOfPoint3D = promiseOfPoint.catch(e => promiseLikeOfPoint3D);
+promiseOfPoint = new Promise((resolve, reject) => resolve(point));
+promiseOfPoint = new Promise((resolve, reject) => resolve(promiseOfPoint));
+promiseOfPoint = new Promise((resolve, reject) => resolve(promiseLikeOfPoint));
+promiseOfPoint = new Promise((resolve, reject) => reject(e));
+promiseOfArrayOfPoint = Promise.all(arrayOfPoint);
+promiseOfArrayOfPoint = Promise.all(iterableOfPoint);
+promiseOfPoint = Promise.race(arrayOfPoint);
+promiseOfPoint = Promise.race(iterableOfPoint);
+promiseOfVoid = Promise.resolve();
+promiseOfPoint = Promise.resolve(point3d);
+promiseOfPoint = Promise.resolve(promiseOfPoint);
+promiseOfPoint = Promise.resolve(promiseLikeOfPoint);
+promiseOfVoid = Promise.reject(e);
+promiseOfPoint = Promise.reject(e);
+a = Reflect.apply(f, a, arrayLikeOfAny);
+a = Reflect.construct(f, arrayLikeOfAny);
+b = Reflect.defineProperty(a, s, pd);
+b = Reflect.defineProperty(a, i, pd);
+b = Reflect.defineProperty(a, sym, pd);
+b = Reflect.deleteProperty(a, s);
+b = Reflect.deleteProperty(a, i);
+b = Reflect.deleteProperty(a, sym);
+iterableIteratorOfAny = Reflect.enumerate(a);
+a = Reflect.get(a, s, a);
+a = Reflect.get(a, i, a);
+a = Reflect.get(a, sym, a);
+pd = Reflect.getOwnPropertyDescriptor(a, s);
+pd = Reflect.getOwnPropertyDescriptor(a, i);
+pd = Reflect.getOwnPropertyDescriptor(a, sym);
+a = Reflect.getPrototypeOf(a);
+b = Reflect.has(a, s);
+b = Reflect.has(a, i);
+b = Reflect.has(a, sym);
+b = Reflect.isExtensible(a);
+arrayOfPropertyKey = Reflect.ownKeys(a);
+b = Reflect.preventExtensions(a);
+b = Reflect.set(a, s, a, a);
+b = Reflect.set(a, i, a, a);
+b = Reflect.set(a, sym, a, a);
+b = Reflect.setPrototypeOf(a, a);
\ No newline at end of file
diff --git a/es6-shim/es6-shim-tests.ts.tscparams b/es6-shim/es6-shim-tests.ts.tscparams
new file mode 100644
index 000000000..4169d3605
--- /dev/null
+++ b/es6-shim/es6-shim-tests.ts.tscparams
@@ -0,0 +1 @@
+--noImplicitAny --module commonjs --target es5
\ No newline at end of file
diff --git a/es6-shim/es6-shim.d.ts b/es6-shim/es6-shim.d.ts
new file mode 100644
index 000000000..cff5a9b7e
--- /dev/null
+++ b/es6-shim/es6-shim.d.ts
@@ -0,0 +1,673 @@
+// Type definitions for es6-shim v0.31.2
+// Project: https://github.com/paulmillr/es6-shim
+// Definitions by: Ron Buckton
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+declare type PropertyKey = string | number | symbol;
+
+interface IteratorResult {
+ done: boolean;
+ value?: T;
+}
+
+interface IterableShim {
+ /**
+ * Shim for an ES6 iterable. Not intended for direct use by user code.
+ */
+ "_es6-shim iterator_"(): Iterator;
+}
+
+interface Iterator {
+ next(value?: any): IteratorResult;
+ return?(value?: any): IteratorResult;
+ throw?(e?: any): IteratorResult;
+}
+
+interface IterableIteratorShim extends IterableShim, Iterator {
+ /**
+ * Shim for an ES6 iterable iterator. Not intended for direct use by user code.
+ */
+ "_es6-shim iterator_"(): IterableIteratorShim;
+}
+
+interface StringConstructor {
+ /**
+ * Return the String value whose elements are, in order, the elements in the List elements.
+ * If length is 0, the empty string is returned.
+ */
+ fromCodePoint(...codePoints: number[]): string;
+
+ /**
+ * String.raw is intended for use as a tag function of a Tagged Template String. When called
+ * as such the first argument will be a well formed template call site object and the rest
+ * parameter will contain the substitution values.
+ * @param template A well-formed template string call site representation.
+ * @param substitutions A set of substitution values.
+ */
+ raw(template: TemplateStringsArray, ...substitutions: any[]): string;
+}
+
+interface String {
+ /**
+ * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point
+ * value of the UTF-16 encoded code point starting at the string element at position pos in
+ * the String resulting from converting this object to a String.
+ * If there is no element at that position, the result is undefined.
+ * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.
+ */
+ codePointAt(pos: number): number;
+
+ /**
+ * Returns true if searchString appears as a substring of the result of converting this
+ * object to a String, at one or more positions that are
+ * greater than or equal to position; otherwise, returns false.
+ * @param searchString search string
+ * @param position If position is undefined, 0 is assumed, so as to search all of the String.
+ */
+ includes(searchString: string, position?: number): boolean;
+
+ /**
+ * Returns true if the sequence of elements of searchString converted to a String is the
+ * same as the corresponding elements of this object (converted to a String) starting at
+ * endPosition – length(this). Otherwise returns false.
+ */
+ endsWith(searchString: string, endPosition?: number): boolean;
+
+ /**
+ * Returns a String value that is made from count copies appended together. If count is 0,
+ * T is the empty String is returned.
+ * @param count number of copies to append
+ */
+ repeat(count: number): string;
+
+ /**
+ * Returns true if the sequence of elements of searchString converted to a String is the
+ * same as the corresponding elements of this object (converted to a String) starting at
+ * position. Otherwise returns false.
+ */
+ startsWith(searchString: string, position?: number): boolean;
+
+ /**
+ * Returns an HTML anchor element and sets the name attribute to the text value
+ * @param name
+ */
+ anchor(name: string): string;
+
+ /** Returns a HTML element */
+ big(): string;
+
+ /** Returns a