diff --git a/hasher/hasher-tests.ts b/hasher/hasher-tests.ts
new file mode 100644
index 000000000..5c43af9b0
--- /dev/null
+++ b/hasher/hasher-tests.ts
@@ -0,0 +1,14 @@
+///
+
+//handle hash changes
+function handleChanges(newHash: any, oldHash: any) {
+ console.log(newHash);
+}
+
+hasher.changed.add(handleChanges); //add hash change listener
+hasher.initialized.add(handleChanges); //add initialized listener (to grab initial value in case it is already set)
+hasher.init(); //initialize hasher (start listening for history changes)
+
+hasher.setHash('foo'); //change hash value (generates new history record)
+
+hasher.prependHash = '!'; //default value is "/"
diff --git a/hasher/hasher.d.ts b/hasher/hasher.d.ts
new file mode 100644
index 000000000..dfed50bd4
--- /dev/null
+++ b/hasher/hasher.d.ts
@@ -0,0 +1,116 @@
+// Type definitions for Hasher.js
+// Project: https://github.com/millermedeiros/hasher/
+// Definitions by: flyfishMT
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+
+declare module HasherJs {
+
+ export interface HasherStatic {
+
+ // {string} hasher.appendHash
+ // String that should always be added to the end of Hash value.
+ appendHash(): string;
+
+ // default value: '';
+ // will be automatically removed from `hasher.getHash()`
+ // avoid conflicts with elements that contain ID equal to hash value;
+ // {signals.Signal} hasher.changed
+ // Signal dispatched when hash value changes. - pass current hash as 1st parameter to listeners and previous hash value as 2nd parameter.
+ changed: Signal;
+
+ // {signals.Signal} hasher.initialized
+ // Signal dispatched when hasher is initialized. - pass current hash as first parameter to listeners.
+ initialized: Signal;
+
+ // {string} hasher.prependHash
+ // String that should always be added to the beginning of Hash value.
+ prependHash: string;
+
+ // default value: '/';
+ // will be automatically removed from `hasher.getHash()`
+ // avoid conflicts with elements that contain ID equal to hash value;
+ // {string} hasher.separator
+ // String used to split hash paths; used by hasher.getHashAsArray() to split paths.
+ separator: string;
+
+ // default value: '/';
+ // {signals.Signal} hasher.stopped
+ // Signal dispatched when hasher is stopped. - pass current hash as first parameter to listeners
+ stopped: Signal;
+
+ // {string} hasher.VERSION
+ // hasher Version Number
+ VERSION: string;
+
+ // Method Detail
+ // hasher.dispose()
+ // Removes all event listeners, stops hasher and destroy hasher object. - IMPORTANT: hasher won't work after calling this method, hasher Object will be deleted.
+ dispose(): void;
+
+ // {string} hasher.getBaseURL()
+ // Returns:
+ // {string} Retrieve URL without query string and hash.
+ getBaseURL(): string;
+
+ // {string} hasher.getHash()
+ // Returns:
+ // {string} Hash value without '#', `hasher.appendHash` and `hasher.prependHash`.
+ getHash(): string;
+
+ // {Array.} hasher.getHashAsArray()
+ // Returns:
+ // {Array.} Hash value split into an Array.
+ getHashAsArray(): string[];
+
+ // {string} hasher.getURL()
+ // Returns:
+ // {string} Full URL.
+ getURL(): string;
+
+ // hasher.init()
+ // Start listening/dispatching changes in the hash/history.
+ init(): void;
+
+ // hasher won't dispatch CHANGE events by manually typing a new value or pressing the back/forward buttons before calling this method.
+ // {boolean} hasher.isActive()
+ // Returns:
+ // {boolean} If hasher is listening to changes on the browser history and/or hash value.
+ isActive(): boolean;
+
+ // hasher.replaceHash(path)
+ // Set Hash value without keeping previous hash on the history record. Similar to calling window.location.replace("#/hash") but will also work on IE6-7.
+ // hasher.replaceHash('lorem', 'ipsum', 'dolor') -> '#/lorem/ipsum/dolor'
+ // Parameters:
+ // {...string} path
+ // Hash value without '#'. Hasher will join path segments using `hasher.separator` and prepend/append hash value with `hasher.appendHash` and `hasher.prependHash`
+ replaceHash(...path: string[]): void;
+
+ // hasher.setHash(path)
+ // Set Hash value, generating a new history record.
+ // hasher.setHash('lorem', 'ipsum', 'dolor') -> '#/lorem/ipsum/dolor'
+ // Parameters:
+ // {...string} path
+ // Hash value without '#'. Hasher will join path segments using `hasher.separator` and prepend/append hash value with `hasher.appendHash` and `hasher.prependHash`
+ setHash(...path: string[]): void;
+
+ // hasher.stop()
+ // Stop listening/dispatching changes in the hash/history.
+ // hasher won't dispatch CHANGE events by manually typing a new value or pressing the back/forward buttons after calling this method, unless you call hasher.init() again.
+ // hasher will still dispatch changes made programatically by calling hasher.setHash();
+ stop(): void;
+
+ // {string} hasher.toString()
+ // Returns:
+ // {string} A string representation of the object.
+ toString(): string;
+ }
+}
+
+declare var hasher: HasherJs.HasherStatic;
+
+// AMD
+declare module 'hasher'{
+ export = hasher;
+}