diff --git a/lib/core/traverse.js b/lib/core/traverse.js
index ee263e57516aca4dde6bc4ec78f65b79db6c021f..379910ec781847cd02fc9f6f035c95bd558a5a3d 100644
Binary files a/lib/core/traverse.js and b/lib/core/traverse.js differ
diff --git a/ts/core/clean.ts b/ts/core/clean.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4e8e8acf620ffdf7dfae6c69e7f1d055ea4e10cb
--- /dev/null
+++ b/ts/core/clean.ts
@@ -0,0 +1,67 @@
+// TODO: tsify
+
+function isArray(obj) {
+  return obj && Array.isArray(obj);
+}
+
+function isObject(obj) {
+  return obj && obj !== null && typeof obj === 'object';
+}
+
+function hasNothing(obj) {
+  if (isArray(obj)) {
+    return obj.length === 0;
+  }
+
+  if (isObject(obj)) {
+    return Object.keys(obj).length === 0;
+  }
+
+  return typeof obj === 'undefined' || obj === null;
+}
+
+function removeProps(obj, key?, parent?) {
+  var i,
+      value,
+      isFullyEmpty = true;
+
+  if (isArray(obj)) {
+    for (i = 0; i < obj.length; ++i) {
+      value = obj[i];
+
+      if (isObject(value)) {
+        removeProps(value, i, obj);
+      }
+
+      if (hasNothing(value)) {
+        obj.splice(i--, 1);
+      } else {
+        isFullyEmpty = false;
+      }
+    }
+  } else {
+    for (i in obj) {
+      value = obj[i];
+
+      if (isObject(value)) {
+        removeProps(value, i, obj);
+      }
+
+      if (hasNothing(value)) {
+        delete obj[i];
+      } else {
+        isFullyEmpty = false;
+      }
+    }
+  }
+
+  if (typeof key !== 'undefined' && isFullyEmpty) {
+    delete parent[key];
+    removeProps(obj);
+  }
+}
+
+export = function(obj: any) {
+  removeProps(obj);
+  return obj;
+};
diff --git a/ts/core/traverse.ts b/ts/core/traverse.ts
index 8ceb630badb785f9b4851f391a6c1e3107449867..4883f0f9496a2b01e4a64c62ab8230664843edc5 100644
--- a/ts/core/traverse.ts
+++ b/ts/core/traverse.ts
@@ -1,3 +1,4 @@
+import clean = require('./clean');
 import random = require('./random');
 import ParseError = require('./error');
 import inferType = require('./infer');
@@ -91,7 +92,7 @@ function traverse(schema: JsonSchema, path: SchemaPath, resolve: Function) {
     }
   }
 
-  return copy;
+  return clean(copy);
 }
 
 export = traverse;