diff --git a/angular-q-spread/angular-q-spread-test.ts b/angular-q-spread/angular-q-spread-test.ts
new file mode 100644
index 0000000000..932ecc4fa9
--- /dev/null
+++ b/angular-q-spread/angular-q-spread-test.ts
@@ -0,0 +1,42 @@
+///
+
+interface IMyService {
+ getFirstname(): ng.IPromise;
+ getLastname(): ng.IPromise;
+}
+
+interface IScope {
+ name: string;
+}
+
+function TestCtrl($scope: IScope, $q: ng.IQService, MyService: IMyService) {
+ $scope.name = null;
+
+ function firstCallback(firstname: string, lastname: string)
+ {
+ return firstname + ' ' + lastname;
+ }
+
+ function anotherCallback(fullname: string)
+ {
+ $scope.name = fullname;
+ }
+
+ function failureCallback(reason: any)
+ {
+ alert('Could not load data: ' + reason);
+ }
+
+ $q
+ .all([
+ MyService.getFirstname(),
+ MyService.getLastname()
+ ])
+ .spread(firstCallback)
+ .then(anotherCallback)
+ .catch(failureCallback);
+};
+
+TestCtrl.$inject = ['$scope', '$q', 'MyService'];
+
+angular.module('test').controller('TestCtrl', TestCtrl);
diff --git a/angular-q-spread/angular-q-spread.d.ts b/angular-q-spread/angular-q-spread.d.ts
new file mode 100644
index 0000000000..3eb37dc4e0
--- /dev/null
+++ b/angular-q-spread/angular-q-spread.d.ts
@@ -0,0 +1,17 @@
+// Type definitions for angular-q-spread module
+// Project: https://www.npmjs.com/package/angular-q-spread
+// Definitions by: rafw87
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+///
+
+declare module angular {
+ interface IPromise {
+ /**
+ This method can be used as a replacement for then. Similarly, it takes two parameters, a callback when all promises are resolved and a callback for failure. The resolve callback is going to be called with the result of the list of promises passed to $q.all as separate parameters instead of one parameters which is an array.
+ * @param successCallback Callback for resolved promise, similar to then's one, but takes multiple parameters instead of single array parameter
+ * @param errorCallback Callback for error, the same as for then
+ */
+ spread(successCallback: (...promiseValues: any[]) => IPromise|TResult, errorCallback?: (reason: any) => any): IPromise;
+ }
+}