diff --git a/angular-ui/angular-ui-sortable-tests.ts b/angular-ui/angular-ui-sortable-tests.ts
new file mode 100644
index 000000000..836dc71e9
--- /dev/null
+++ b/angular-ui/angular-ui-sortable-tests.ts
@@ -0,0 +1,143 @@
+///
+///
+
+var myApp = angular.module('testModule');
+
+interface MySortableControllerScope extends ng.IScope {
+ items: SortableModelInfo[];
+ sortableOptions: ng.ui.UISortableOptions;
+ sortingLog: SortLogInfo[];
+}
+
+interface SortableModelInfo {
+ text: string;
+ value: number;
+}
+
+interface SortLogInfo {
+ ID: number;
+ Text: string;
+}
+
+myApp.controller('sortableController', function ($scope: MySortableControllerScope) {
+ $scope.sortableOptions = {
+ activate: function(e, ui) {
+ var jQueryEventObject: JQueryEventObject = e;
+ var uiSortableUIParams: ng.ui.UISortableUIParams = ui;
+ },
+ beforeStop: function(e, ui) {
+ var jQueryEventObject: JQueryEventObject = e;
+ var uiSortableUIParams: ng.ui.UISortableUIParams = ui;
+ },
+ change: function(e, ui) {
+ var jQueryEventObject: JQueryEventObject = e;
+ var uiSortableUIParams: ng.ui.UISortableUIParams = ui;
+ },
+ deactivate: function(e, ui) {
+ var jQueryEventObject: JQueryEventObject = e;
+ var uiSortableUIParams: ng.ui.UISortableUIParams = ui;
+ },
+ out: function(e, ui) {
+ var jQueryEventObject: JQueryEventObject = e;
+ var uiSortableUIParams: ng.ui.UISortableUIParams = ui;
+ },
+ over: function(e, ui) {
+ var jQueryEventObject: JQueryEventObject = e;
+ var uiSortableUIParams: ng.ui.UISortableUIParams = ui;
+ },
+ receive: function(e, ui) {
+ var jQueryEventObject: JQueryEventObject = e;
+ var uiSortableUIParams: ng.ui.UISortableUIParams = ui;
+ },
+ remove: function(e, ui) {
+ var jQueryEventObject: JQueryEventObject = e;
+ var uiSortableUIParams: ng.ui.UISortableUIParams = ui;
+ },
+ sort: function(e, ui) {
+ var jQueryEventObject: JQueryEventObject = e;
+ var uiSortableUIParams: ng.ui.UISortableUIParams = ui;
+ },
+ start: function(e, ui) {
+ var jQueryEventObject: JQueryEventObject = e;
+ var uiSortableUIParams: ng.ui.UISortableUIParams = ui;
+ },
+ stop: function(e, ui) {
+ var jQueryEventObject: JQueryEventObject = e;
+ var uiSortableUIParams: ng.ui.UISortableUIParams = ui;
+ var uiitem: ng.ui.UISortableUIItem = ui.item;
+ var uiitemscope: ng.IScope = uiitem.scope();
+ var uiitemsortable: ng.ui.UISortableProperties = uiitem.sortable;
+
+ var dropindex: number = uiitemsortable.dropindex;
+ var droptarget: number = uiitemsortable.droptarget;
+ var droptargetModel: SortableModelInfo[] = uiitemsortable.droptargetModel;
+ var index: number = uiitemsortable.index;
+ var model: SortableModelInfo = uiitemsortable.model;
+ var moved: SortableModelInfo = uiitemsortable.moved;
+ var received: Boolean = uiitemsortable.received;
+ var source: ng.IAugmentedJQuery = uiitemsortable.source;
+ var sourceModel: SortableModelInfo[] = uiitemsortable.sourceModel;
+
+ var logEntry = {
+ ID: $scope.sortingLog.length + 1,
+ Text: 'Moved element: ' + ui.item.sortable.model.text
+ };
+ $scope.sortingLog.push(logEntry);
+ },
+ update: function(e, ui) {
+ var jQueryEventObject: JQueryEventObject = e;
+ var uiSortableUIParams: ng.ui.UISortableUIParams = ui;
+ var voidcanceled: void = ui.item.sortable.cancel();
+ var isCanceled: Boolean = ui.item.sortable.isCanceled();
+ var isCustomHelperUsed: Boolean =ui.item.sortable.isCustomHelperUsed();
+ }
+ };
+
+ $scope.sortableOptions.appendTo = document.body;
+ $scope.sortableOptions.appendTo = angular.element(document.body);
+ $scope.sortableOptions.appendTo = 'body';
+ $scope.sortableOptions.axis = 'x';
+ $scope.sortableOptions.axis = 'y';
+ $scope.sortableOptions.axis = false;
+ $scope.sortableOptions.cancel = '.disabled';
+ $scope.sortableOptions.connectWith = '.connectedSortable';
+ $scope.sortableOptions.connectWith = false;
+ $scope.sortableOptions.containment = 'parent';
+ $scope.sortableOptions.containment = 'body';
+ $scope.sortableOptions.containment = document.body;
+ $scope.sortableOptions.containment = false;
+ $scope.sortableOptions.cursor = 'move';
+ $scope.sortableOptions.cursorAt = false;
+ $scope.sortableOptions.cursorAt = { left: 5 };
+ $scope.sortableOptions.delay = 300;
+ $scope.sortableOptions.disabled = true;
+ $scope.sortableOptions.distance = 5;
+ $scope.sortableOptions.dropOnEmpty = false;
+ $scope.sortableOptions.forceHelperSize = true;
+ $scope.sortableOptions.forcePlaceholderSize = true;
+ $scope.sortableOptions.grid = false;
+ $scope.sortableOptions.grid = [20, 10];
+ $scope.sortableOptions.handle = '.handle';
+ $scope.sortableOptions.helper = 'clone';
+ $scope.sortableOptions.helper = function(e: JQueryEventObject, item: ng.IAugmentedJQuery) {
+ return item.clone();
+ };
+ $scope.sortableOptions.items = '> li:not(.disabled)';
+ $scope.sortableOptions.opacity = false;
+ $scope.sortableOptions.opacity = 0.5;
+ $scope.sortableOptions.placeholder = false;
+ $scope.sortableOptions.placeholder = 'sortable-placeholder';
+ $scope.sortableOptions.revert = true;
+ $scope.sortableOptions.revert = 300;
+ $scope.sortableOptions.scroll = false;
+ $scope.sortableOptions.scrollSensitivity = 10;
+ $scope.sortableOptions.scrollSpeed = 40;
+ $scope.sortableOptions.tolerance = 'pointer';
+ $scope.sortableOptions.zIndex = 9999;
+
+ $scope.sortableOptions['ui-floating'] = undefined;
+ $scope.sortableOptions['ui-floating'] = null;
+ $scope.sortableOptions['ui-floating'] = false;
+ $scope.sortableOptions['ui-floating'] = true;
+ $scope.sortableOptions['ui-floating'] = "auto";
+});
diff --git a/angular-ui/angular-ui-sortable.d.ts b/angular-ui/angular-ui-sortable.d.ts
new file mode 100644
index 000000000..a0c99f34f
--- /dev/null
+++ b/angular-ui/angular-ui-sortable.d.ts
@@ -0,0 +1,210 @@
+// Type definitions for angular.ui.sortable module v0.13+
+// Project: https://github.com/angular-ui/ui-sortable
+// Definitions by: Thodoris Greasidis
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+
+declare module ng.ui {
+
+ interface UISortableOptions extends SortableOptions {
+ 'ui-floating'?: string|boolean;
+ }
+
+ interface UISortableProperties {
+ /**
+ * Holds the index of the drop target that the dragged item was dropped.
+ */
+ dropindex: number;
+
+ /**
+ * Holds the ui-sortable element that the dragged item was dropped on.
+ */
+ droptarget: number;
+
+ /**
+ * Holds the array that is specified by the `ng-model` attribute of the [`droptarget`](#droptarget) ui-sortable element.
+ */
+ droptargetModel: Array;
+
+ /**
+ * Holds the original index of the item dragged.
+ */
+ index: number;
+
+ /**
+ * Holds the JavaScript object that is used as the model of the dragged item, as specified by the ng-repeat of the [`source`](#source) ui-sortable element and the item's [`index`](#index).
+ */
+ model: T;
+
+ /**
+ * Holds the model of the dragged item only when a sorting happens between two connected ui-sortable elements.
+ * In other words: `'moved' in ui.item.sortable` will return false only when a sorting is withing the same ui-sortable element ([`source`](#source) equals to the [`droptarget`](#droptarget)).
+ */
+ moved?: T;
+
+ /**
+ * When sorting between two connected sortables, it will be set to true inside the `update` callback of the [`droptarget`](#droptarget).
+ */
+ received: Boolean;
+
+ /**
+ * Holds the ui-sortable element that the dragged item originated from.
+ */
+ source: ng.IAugmentedJQuery
+
+ /**
+ * Holds the array that is specified by the `ng-model` of the [`source`](#source) ui-sortable element.
+ */
+ sourceModel: Array;
+
+ /**
+ * Can be called inside the `update` callback, in order to prevent/revert a sorting.
+ * Should be used instead of the [jquery-ui-sortable cancel()](http://api.jqueryui.com/sortable/#method-cancel) method.
+ */
+ cancel(): void;
+
+ /**
+ * Returns whether the current sorting is marked as canceled, by an earlier call to [`ui.item.sortable.cancel()`](#cancel).
+ */
+ isCanceled(): Boolean;
+
+ /**
+ * Returns whether the [`helper`](http://api.jqueryui.com/sortable/#option-helper) element used for the current sorting, is one of the original ui-sortable list elements.
+ */
+ isCustomHelperUsed(): Boolean;
+ }
+
+ interface UISortableUIItem extends ng.IAugmentedJQuery {
+ sortable: UISortableProperties;
+ }
+
+ interface UISortableUIParams extends SortableUIParams {
+ item: UISortableUIItem;
+ }
+
+ // Base Sortable //////////////////////////////////////////////////
+
+ interface SortableCursorAtOptions {
+ top?: number;
+ left?: number;
+ right?: number;
+ bottom?: number;
+ }
+
+ interface SortableHelperFunctionOption {
+ (event: JQueryEventObject, ui: ng.IAugmentedJQuery): JQuery;
+ }
+
+ interface SortableOptions extends SortableEvents {
+ /**
+ * jQuery, Element, Selector or string
+ * Default: "parent"
+ */
+ appendTo?: any;
+ /**
+ * "X", "Y" or false
+ * Default: false
+ */
+ axis?: string|boolean;
+ /**
+ * Selector
+ * Default: "input,textarea,button,select,option"
+ */
+ cancel?: string;
+ /**
+ * Selector or false
+ * Default: false
+ */
+ connectWith?: string|boolean;
+ /**
+ * Element, Selector, string or false
+ * Default: false
+ */
+ containment?: any;
+ cursor?: string;
+ /**
+ * Moves the sorting element or helper so the cursor always appears to drag from the same position. Coordinates can be given as a hash using a combination of one or two keys SortableCursorAtOptions: { top, left, right, bottom }
+ * Default: false
+ */
+ cursorAt?: SortableCursorAtOptions|boolean;
+ delay?: number;
+ disabled?: boolean;
+ distance?: number;
+ dropOnEmpty?: boolean;
+ forceHelperSize?: boolean;
+ forcePlaceholderSize?: boolean;
+ /**
+ * Array of numbers or false
+ * Default: false
+ */
+ grid?: number[]|boolean;
+ /**
+ * Selector or Element
+ */
+ handle?: any;
+ /**
+ * "original", "clone" or Function()
+ * Default: "original"
+ */
+ helper?: string|SortableHelperFunctionOption;
+ /**
+ * Selector
+ */
+ items?: string;
+ /**
+ * Number or false
+ * Default: false
+ */
+ opacity?: number|boolean;
+ /**
+ * string or false
+ * Default: false
+ */
+ placeholder?: string|boolean;
+ /**
+ * boolean or number
+ * Default: false
+ */
+ revert?: number|boolean;
+ scroll?: boolean;
+ scrollSensitivity?: number;
+ scrollSpeed?: number;
+ /**
+ * "intersect" or "pointer"
+ * Default: "intersect"
+ */
+ tolerance?: string;
+ zIndex?: number;
+ }
+
+ interface SortableUIParams {
+ helper: ng.IAugmentedJQuery;
+ item: ng.IAugmentedJQuery;
+ offset: any;
+ position: any;
+ originalPosition: any;
+ sender: ng.IAugmentedJQuery;
+ placeholder: ng.IAugmentedJQuery;
+ }
+
+ interface SortableEvent {
+ (event: JQueryEventObject, ui: UISortableUIParams): void;
+ }
+
+ interface SortableEvents {
+ activate?: SortableEvent;
+ beforeStop?: SortableEvent;
+ change?: SortableEvent;
+ deactivate?: SortableEvent;
+ out?: SortableEvent;
+ over?: SortableEvent;
+ receive?: SortableEvent;
+ remove?: SortableEvent;
+ sort?: SortableEvent;
+ start?: SortableEvent;
+ stop?: SortableEvent;
+ update?: SortableEvent;
+ }
+
+}