diff --git a/ko.plus/ko.plus-tests.ts b/ko.plus/ko.plus-tests.ts
new file mode 100644
index 0000000000..992332e2be
--- /dev/null
+++ b/ko.plus/ko.plus-tests.ts
@@ -0,0 +1,132 @@
+///
+///
+
+// Tests for ko.plus.d.ts
+// Project: https://github.com/stevegreatrex/ko.plus
+// Definitions by: Howard Richards
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+/*
+ Version 1.0 - initial commit
+
+ Version 1.1 - added test for makeEditable
+
+ Note: Typescript version 1.4 or higher is required for union types
+ and type declarations
+*/
+
+function CommandTests() {
+
+ // initalize command with an execute method
+ var cmd1 = ko.command(() => {
+ return "Hello cmd1";
+ });
+
+ // initialize command and add done and fail callbacks
+ var cmd2 = ko.command(() => {
+ return "Hello cmd2";
+ })
+ .done((data: any) => {
+ alert("success");
+ })
+ .fail((error: string) => {
+ alert(error);
+ });
+
+ // initialize command with options (action only)
+ var cmd3 = ko.command({
+ action: () => { return "Hello cmd3"; }
+ });
+
+ // initialize command with options (action only)
+ var cmd4 = ko.command({
+ action: () => { return "Hello cmd4"; }
+ });
+
+
+ // test execute the command
+ cmd1();
+
+ // test properties of the commmand
+ var isRunning = cmd1.isRunning();
+ var failed = cmd1.failed();
+ var completed = cmd1.completed();
+ var canExecute = cmd1.canExecute();
+
+}
+
+function EditableTests() {
+
+ // test ko.editable initializers
+ var edit1 = ko.editable(); // no intializer
+
+ var edit2 = ko.editable("test"); // with typed initializer
+
+ var edit3 = ko.editable({ test: true }); // with anything
+
+ var edit4 = ko.editable(1); // with union types
+ var edit5 = ko.editable("test");
+
+ ko.editable.makeEditable(this);
+
+ // test getting the value
+ var value = edit1();
+
+ // test editable
+ var isEditing = edit1.isEditing();
+
+ // test editableArray functions:
+ edit1.beginEdit();
+ edit1.endEdit();
+ edit1.cancelEdit();
+ edit1.rollback();
+}
+
+function EditableArrayTests() {
+
+ // test ko.editable intializers
+ var edit1 = ko.editableArray(); // no init value
+
+ var edit2 = ko.editableArray([1, 2, 3]); // init value
+
+ var edit3 = ko.editableArray(["a", 1, false, {}]); // mixed
+
+ var edit4 = ko.editableArray(["a", 1]); // constrained
+
+ // test getting the array value
+ var value = edit1();
+
+ // test properties
+ var isEditing = edit1.isEditing();
+
+ // test functions:
+ edit1.beginEdit();
+ edit1.endEdit();
+ edit1.cancelEdit();
+ edit1.rollback();
+
+}
+
+function SortableTests() {
+
+ // sorting is added via an extender, there are no .d.ts
+ // types for this at present
+ var sort1 = ko.observableArray([1, 2, 3]).extend({ sortable: true });
+
+ // extended sort definition with key+descending
+ var sort2 = ko.observableArray([
+ { id: 3, name: "alice" },
+ { id: 2, name: "james" },
+ { id: 1, name: "bob" },
+ ]).extend({
+ sortable: {
+ key: 'id',
+ descending: false
+ }
+ });
+
+ sort2.setSourceKey("id");
+ sort2.sortDescending(true);
+ sort2.setSourceKey("name");
+ sort2.sortDescending(false);
+}
\ No newline at end of file
diff --git a/ko.plus/ko.plus.d.ts b/ko.plus/ko.plus.d.ts
new file mode 100644
index 0000000000..65301aa7c1
--- /dev/null
+++ b/ko.plus/ko.plus.d.ts
@@ -0,0 +1,155 @@
+// Type definitions for ko.plus v0.0.21
+// Project: https://github.com/stevegreatrex/ko.plus
+// Definitions by: Howard Richards
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+
+/**
+ *
+ * Extensions to KO to provide a command, editable and sortable patterns
+ * - available at http://www.nuget.org/packages/ko.plus/
+ *
+ * (requires TypeScript version 1.4 or higher)
+ *
+ * Version 1.0 - initial commit
+ *
+ * Version 1.1 - fixed bug - makeEditable is now a function on .editable
+ * also refactored how the Editable classes inherit to simplify
+ */
+
+//
+// Add methods to the 'ko' Knockout object
+//
+interface KnockoutStatic {
+ // create a command - two overloads
+ command: (param: KoPlus.Callback | KoPlus.CommandOptions) => KoPlus.Command;
+
+ editable: KoPlus.EditableStatic;
+ editableArray: KoPlus.EditableArrayStatic;
+}
+
+//#region Sortable type extensions
+
+//
+// extends the KnockoutObservableArray to add sorting methods
+// see https://github.com/stevegreatrex/ko.plus#properties-and-functions
+//
+interface KnockoutObservableArray {
+ sortKey: KnockoutObservable;
+
+ sortDescending: KnockoutObservable;
+
+ setSourceKey: (key: string) => void;
+}
+
+//#endregion
+
+//
+// declare new binding handlers in ko.plus
+//
+interface KnockoutBindingHandlers {
+ loadingWhen: KnockoutBindingHandler;
+
+ command: KnockoutBindingHandler;
+
+ sortBy: KnockoutBindingHandler;
+}
+
+//
+// namespace for ko.plus types
+//
+declare module KoPlus {
+ // predefine a callback type
+ export type Callback = () => void;
+
+ //#region Command types
+
+ //
+ // the Command interface - returned by ko.command(..)
+ //
+ export interface Command {
+ // execute the command
+ (): void;
+
+ //
+ // properties: https://github.com/stevegreatrex/ko.plus#properties
+ //
+ isRunning: KnockoutObservable;
+
+ canExecute: KnockoutComputed;
+
+ failed: KnockoutObservable;
+
+ completed: KnockoutObservable;
+
+ //
+ // functions
+ // see https://github.com/stevegreatrex/ko.plus#functions
+ //
+ done: (callback: (data: any) => void) => Command;
+
+ fail: (callback: (error: string) => void) => Command;
+
+ always: (callback: Callback) => Command;
+
+ then: (resolve: Callback, reject: Callback) => Command;
+ }
+
+ //
+ // options when defining a command using the option method
+ // see https://github.com/stevegreatrex/ko.plus#options
+ //
+ export interface CommandOptions {
+ // [required] sets the command action method
+ action: Callback;
+
+ // [optional] function to determine if command can be executed
+ canExecute?: () => boolean;
+
+ // [optional] context to use in the command
+ context?: any;
+ }
+
+ //#endregion
+
+ //#region Editable types
+
+ export interface EditableStatic extends KnockoutObservableStatic {
+ (value?: T): Editable;
+
+ makeEditable(target: any): void;
+ }
+
+ export interface EditableArrayStatic extends KnockoutObservableArrayStatic {
+ (value?: Array): EditableArray;
+
+ makeEditable(target: any): void; //>
+ }
+
+ //
+ // defines common editable functions and isEditing property
+ // (used by both editable and editableArray
+ //
+ export interface EditableFunctions {
+ isEditing: KnockoutObservable;
+ beginEdit(): void;
+ endEdit(): void;
+ cancelEdit(): void;
+ rollback(): void;
+ }
+
+ //
+ // extend the standard KnockoutObservable to add editable functions
+ //
+ export interface Editable extends KnockoutObservable, EditableFunctions {
+ }
+
+ //
+ // extend the standard KnockoutObservableArray to add editable functions
+ //
+ export interface EditableArray extends KnockoutObservableArray, EditableFunctions {
+ }
+
+ //#endregion
+}
\ No newline at end of file