diff --git a/json-merge-patch/json-merge-patch-tests.ts b/json-merge-patch/json-merge-patch-tests.ts
new file mode 100644
index 0000000000..36d0d34a8a
--- /dev/null
+++ b/json-merge-patch/json-merge-patch-tests.ts
@@ -0,0 +1,225 @@
+///
+
+import * as jmp from "json-merge-patch";
+
+var merge = jmp.merge;
+var apply = jmp.apply;
+var generate = jmp.generate;
+var assert = {deepEqual: function (a: Object, b: Object) {
+ return JSON.stringify(a) === JSON.stringify(b);
+}};
+
+assert.deepEqual(
+ merge({a: 'b'}, {b: 'c'}),
+ {a: 'b', b: 'c'}
+);
+
+assert.deepEqual(
+ merge({a: 'b'}, {a: 'c'}),
+ {a: 'c'}
+);
+
+assert.deepEqual(
+ merge({a: 'b', b: 'd'}, {a: 'c'}),
+ {a: 'c', b: 'd'}
+);
+
+assert.deepEqual(
+ merge({a: null}, {b: 'c'}),
+ {a: null, b: 'c'}
+);
+
+assert.deepEqual(
+ merge({a: null}, {a: 'b'}),
+ {a: 'b'}
+);
+
+assert.deepEqual(
+ merge({a: 'b'}, {a: null}),
+ {a: null}
+);
+
+assert.deepEqual(
+ merge([], {a: 'b'}),
+ {a: 'b'}
+);
+
+assert.deepEqual(
+ merge({a: 'b'}, []),
+ []
+);
+
+assert.deepEqual(
+ merge({a: {b: {c: 'd'}}, d: 'e'}, {a: {b: 'a'}}),
+ {a: {b: 'a'}, d: 'e'}
+);
+
+assert.deepEqual(
+ merge({a: {b: {c: 'd'}, d: 'e'}}, {a: {b: {c: 'e'}}}),
+ {a: {b: {c: 'e'}, d: 'e'}}
+);
+
+assert.deepEqual(
+ merge({a: 'b'}, null),
+ null
+);
+
+assert.deepEqual(
+ generate({a: 'b'}, {a: 'c'}),
+ {a: 'c'}
+);
+
+assert.deepEqual(
+ generate({a: 'b'}, { a: 'b', b: 'c'}),
+ {b: 'c'}
+);
+
+assert.deepEqual(
+ generate({a: 'b'}, {}),
+ {a: null}
+);
+
+assert.deepEqual(
+ generate({a: 'b', b: 'c'}, {b: 'c'}),
+ {a: null}
+);
+
+assert.deepEqual(
+ generate({a: ['b']}, {a: 'c'}),
+ {a: 'c'}
+);
+
+assert.deepEqual(
+ generate({a: 'c'}, {a: ['b']}),
+ {a: ['b']}
+);
+
+assert.deepEqual(
+ generate({a: [{b: 'c'}]}, {a: [1]}),
+ {a: [1]}
+);
+
+assert.deepEqual(
+ generate(['a', 'b'], ['c', 'd']),
+ ['c', 'd']
+);
+
+assert.deepEqual(
+ generate(['a', 'b'], ['a']),
+ ['a']
+);
+
+assert.deepEqual(
+ generate({a: 'b'}, ['c']),
+ ['c']
+);
+
+assert.deepEqual(
+ generate({a: 'foo'}, null),
+ null
+);
+
+assert.deepEqual(
+ generate({a: 'foo'}, 'bar'),
+ 'bar'
+);
+
+assert.deepEqual(
+ generate({e: null}, {e: null, a: 1}),
+ {a: 1}
+);
+
+assert.deepEqual(
+ generate({}, {a: {bb: {}}}),
+ {a: {bb: {}}}
+);
+
+assert.deepEqual(
+ generate({a: 'a'}, {a: 'a'}),
+ undefined
+);
+
+assert.deepEqual(
+ generate({a: {b: 'c'}}, {a: {b: 'c'}}),
+ undefined
+);
+
+assert.deepEqual(
+ generate([1,2,3], [1,2,3]),
+ undefined
+);
+
+assert.deepEqual(
+ apply({a: 'b'}, {a: 'c'}),
+ {a: 'c'}
+);
+
+assert.deepEqual(
+ apply({a: 'b'}, {b: 'c'}),
+ {a: 'b', b: 'c'}
+);
+
+assert.deepEqual(
+ apply({a: 'b'}, {a: null}),
+ {}
+);
+
+assert.deepEqual(
+ apply({a: 'b', b: 'c'}, {a: null}),
+ {b: 'c'}
+);
+
+assert.deepEqual(
+ apply({a: ['b']}, {a: 'c'}),
+ {a: 'c'}
+);
+
+assert.deepEqual(
+ apply({a: 'c'}, {a: ['b']}),
+ {a: ['b']}
+);
+
+assert.deepEqual(
+ apply({a: {b: 'c'}}, {a: {b: 'd', c: null}}),
+ {a: {b: 'd'}}
+);
+
+assert.deepEqual(
+ apply({a: [{b: 'c'}]}, {a: [1]}),
+ {a: [1]}
+);
+
+assert.deepEqual(
+ apply(['a', 'b'], ['c', 'd']),
+ ['c', 'd']
+);
+
+assert.deepEqual(
+ apply({a: 'b'}, ['c']),
+ ['c']
+);
+
+assert.deepEqual(
+ apply({a: 'foo'}, null),
+ null
+);
+
+assert.deepEqual(
+ apply({a: 'foo'}, 'bar'),
+ 'bar'
+);
+
+assert.deepEqual(
+ apply({e: null}, {a: 1}),
+ {e: null, a: 1}
+);
+
+assert.deepEqual(
+ apply([1, 2], {a: 'b', c: null}),
+ {a: 'b'}
+);
+
+assert.deepEqual(
+ apply({}, {a: {bb: {ccc: null}}}),
+ {a: {bb: {}}}
+);
\ No newline at end of file
diff --git a/json-merge-patch/json-merge-patch.d.ts b/json-merge-patch/json-merge-patch.d.ts
new file mode 100644
index 0000000000..bbf7c1d810
--- /dev/null
+++ b/json-merge-patch/json-merge-patch.d.ts
@@ -0,0 +1,11 @@
+// Type definitions for json-merge-patch
+// Project: https://github.com/pierreinglebert/json-merge-patch
+// Definitions by: Arsenij Schuetzer
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+
+declare module "json-merge-patch" {
+ function apply(target: Object, patch: Object): Object;
+ function generate(before: Object, after: Object): Object;
+ function merge(patch1: Object, patch2: Object): Object;
+}
\ No newline at end of file