diff --git a/dropkickjs/dropkickjs-tests.ts b/dropkickjs/dropkickjs-tests.ts
new file mode 100644
index 0000000000..af46b43c02
--- /dev/null
+++ b/dropkickjs/dropkickjs-tests.ts
@@ -0,0 +1,91 @@
+///
+
+//constructor
+var constructorNoOptions = new Dropkick('#my-select');
+var constructorNoOptions2 = new Dropkick(new HTMLSelectElement());
+var constructorOptions = new Dropkick('#my-select', {});
+var constructorOptions2 = new Dropkick(new HTMLSelectElement(), {});
+
+//options
+var options : DropkickOptions = {
+ disabled: true,
+ form: new HTMLFormElement(),
+ length: 1,
+ mobile: true,
+ multiple: true,
+ options: ['test'],
+ selectedIndex: 0,
+ selectedOptions: ['test'],
+ value: 'test',
+ change() { },
+ close() { },
+ open() { },
+ initialize: () => { }
+}
+var withFullOptions = new Dropkick('#test', options);
+
+var dk = new Dropkick('#test');
+
+//fields (same as options)
+var o1 = dk.disabled;
+var o2 = dk.form;
+var o3 = dk.length;
+var o4 = dk.mobile;
+var o5 = dk.multiple;
+var o6 = dk.options;
+var o7 = dk.selectedIndex;
+var o8 = dk.selectedOptions;
+var o9 = dk.value;
+
+//methods
+dk.add('new');
+dk.add(new HTMLSelectElement());
+dk.add('new', 'old');
+dk.add('new', 1);
+
+dk.disable();
+dk.disable(false);
+dk.disable(4, true);
+dk.disable(4);
+
+dk.dispose();
+
+dk.focus();
+
+dk.hide(4);
+dk.hide(4, false);
+
+var node = dk.item(4);
+
+dk.open();
+
+dk.refresh();
+
+dk.remove(4);
+
+dk.reset();
+dk.reset(true);
+
+var words = dk.search("qwer", "fuzzy");
+
+var node2 = dk.select(4);
+var node3 = dk.select("AL");
+var node4 = dk.select(4, true);
+
+var node5 = dk.selectOne(4);
+var node6 = dk.selectOne(4, true);
+
+//real life example
+var fieldValue = '';
+var selectOptions : DropkickOptions = {
+ open(this: Dropkick) {
+ const optionsList = (this).data.elem.lastChild; //undocumented but useful data field
+ if (optionsList.scrollWidth > optionsList.offsetWidth) {
+ optionsList.style.width = optionsList.scrollWidth + 25 + 'px';
+ }
+ },
+ change: () => {
+ fieldValue = select.value;
+ }
+};
+var select = new Dropkick('#select', options);
\ No newline at end of file
diff --git a/dropkickjs/index.d.ts b/dropkickjs/index.d.ts
new file mode 100644
index 0000000000..80818ff789
--- /dev/null
+++ b/dropkickjs/index.d.ts
@@ -0,0 +1,52 @@
+// Type definitions for dropkickjs v2.1.9
+// Project: http://dropkickjs.com/
+// Definitions by Dmitry Pesterev
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+interface DropkickOptions {
+ disabled?: boolean;
+ form?: Node;
+ length?: number;
+ mobile?: boolean;
+ multiple?: boolean;
+ options?: Array;
+ selectedIndex?: number;
+ selectedOptions?: Array;
+ value?: string;
+
+ change?: () => void;
+ close?: () => void;
+ initialize?: () => void;
+ open?: () => void;
+}
+
+declare class Dropkick {
+ constructor(id: string, options?: DropkickOptions);
+ constructor(element: HTMLElement, options?: DropkickOptions);
+
+ add(value: string | Node, before?: number | string): void;
+ close(): void;
+ disable(disabled?: boolean): void;
+ disable(index: number, disabled?: boolean): void;
+ dispose(): void;
+ focus(): void;
+ hide(index: number, hidden?: boolean): void;
+ item(index: number): Node;
+ open(): void;
+ refresh(): void;
+ remove(index: number): void;
+ reset(clear?: boolean): void;
+ search(string: string, mode?: string): Array;
+ select(element: number|string, selectDisabled?: boolean): Node;
+ selectOne(element: number, selectDisabled?: boolean): Node;
+
+ disabled: boolean;
+ form: Node;
+ length: number;
+ mobile: boolean;
+ multiple: boolean;
+ options: Array;
+ selectedIndex: number;
+ selectedOptions: Array;
+ value: string;
+}
\ No newline at end of file
diff --git a/dropkickjs/tsconfig.json b/dropkickjs/tsconfig.json
new file mode 100644
index 0000000000..e0699ecf5c
--- /dev/null
+++ b/dropkickjs/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "target": "es6",
+ "noImplicitAny": true,
+ "noImplicitThis": true,
+ "strictNullChecks": true,
+ "baseUrl": "../",
+ "typeRoots": [
+ "../"
+ ],
+ "types": [],
+ "noEmit": true,
+ "forceConsistentCasingInFileNames": true
+ },
+ "files": [
+ "index.d.ts",
+ "dropkickjs-tests.ts"
+ ]
+}
\ No newline at end of file
diff --git a/dropkickjs/tslint.json b/dropkickjs/tslint.json
new file mode 100644
index 0000000000..2221e40e4a
--- /dev/null
+++ b/dropkickjs/tslint.json
@@ -0,0 +1 @@
+{ "extends": "../tslint.json" }
\ No newline at end of file