diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index e10ca14d4c..1ab702c85b 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -423,6 +423,7 @@ All definitions files include a header with the author and editors, so at some p
* [urlrouter](https://github.com/fengmk2/urlrouter) (by [Carlos Ballesteros Velasco](https://github.com/soywiz))
* [UUID.js](https://github.com/LiosK/UUID.js) (by [Jason Jarrett](https://github.com/staxmanade))
* [Valerie](https://github.com/davewatts/valerie) (by [Howard Richards](https://github.com/conficient))
+* [validator](https://github.com/chriso/validator.js) (by [tgfjt](https://github.com/tgfjt))
* [Velocity](http://velocityjs.org/) (by [Greg Smith](https://github.com/smrq))
* [Viewporter](https://github.com/zynga/viewporter) (by [Boris Yankov](https://github.com/borisyankov))
* [Vimeo](http://developer.vimeo.com/player/js-api) (by [Daz Wilkin](https://github.com/DazWilkin/))
diff --git a/validator/validator-tests.ts b/validator/validator-tests.ts
new file mode 100644
index 0000000000..b7f45d4271
--- /dev/null
+++ b/validator/validator-tests.ts
@@ -0,0 +1,106 @@
+///
+
+import validator = require("validator");
+
+
+validator.extend("isTest", function(str) {
+ return !str;
+});
+
+validator.equals("abc", "Abc");
+
+validator.contains("foo", "foobar");
+
+validator.matches("foobar", "foo/i");
+
+validator.isEmail("sample");
+
+validator.isURL("sample");
+
+validator.isFQDN("sample");
+
+validator.isIP("sample");
+
+validator.isAlpha("sample");
+
+validator.isNumeric("sample");
+
+validator.isAlphanumeric("sample");
+
+validator.isBase64("sample");
+
+validator.isHexadecimal("sample");
+
+validator.isHexColor("sample");
+
+validator.isLowercase("sample");
+
+validator.isUppercase("sample");
+
+validator.isInt("sample");
+
+validator.isFloat("sample");
+
+validator.isDivisibleBy("sample", 2);
+
+validator.isNull("sample");
+
+validator.isLength("sample", 3, 5);
+
+validator.isByteLength("sample", 3);
+
+validator.isUUID("sample");
+
+validator.isDate("sample");
+
+validator.isAfter("sample");
+
+validator.isBefore("sample");
+
+validator.isIn("sample", []);
+
+validator.isCreditCard("sample");
+
+validator.isISBN("sample");
+
+validator.isJSON("sample");
+
+validator.isMultibyte("sample");
+
+validator.isAscii("sample");
+
+validator.isFullWidth("sample");
+
+validator.isHalfWidth("sample");
+
+validator.isVariableWidth("sample");
+
+validator.isSurrogatePair("sample");
+
+validator.isMongoId("sample");
+
+validator.toString(123);
+
+validator.toDate(1225);
+
+validator.toFloat('011');
+
+validator.toInt('aa');
+
+validator.toBoolean('yes!');
+
+validator.trim(' triming ');
+
+validator.ltrim(' triming ');
+
+validator.rtrim(' triming ');
+
+validator.escape('