diff --git a/rest-io/rest-io-tests.ts b/rest-io/rest-io-tests.ts
new file mode 100644
index 0000000000..5f558b77a2
--- /dev/null
+++ b/rest-io/rest-io-tests.ts
@@ -0,0 +1,18 @@
+///
+
+import express = require('express');
+import restIO = require('rest-io');
+import mongoose = require('mongoose');
+
+var app = express();
+
+// register the express app with rest.io
+restIO.restIO(app, {
+ resources: __dirname + '/resources'
+});
+
+mongoose.connect('mongodb://localhost:27017/test');
+app.listen(3000, function () {
+ console.log('Server has started under port: 3000');
+});
+module.exports = app;
\ No newline at end of file
diff --git a/rest-io/rest-io.d.ts b/rest-io/rest-io.d.ts
new file mode 100644
index 0000000000..a2dac465b6
--- /dev/null
+++ b/rest-io/rest-io.d.ts
@@ -0,0 +1,148 @@
+// Type definitions for rest-io 4.0
+// Project: https://github.com/EnoF/rest-io
+// Definitions by: Andy Tang , Stefan Schacherl
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+///
+
+
+declare module 'rest-io' {
+import {Router, Application, Response, Request} from 'express';
+
+import {Mongoose, Schema, Model, Document, Types, Promise} from 'mongoose';
+
+ function restIO(app: Application, config?: IRestIOConfig): RestIO;
+
+ export interface RestIO {
+ resource: ResourceModule
+ }
+
+ export interface IRestIOConfig {
+ resources: string;
+ db?: Mongoose;
+ }
+
+ export interface ResourceModule {
+ Resource: Resource;
+ AuthorizedResource: AuthorizedResource;
+ authorizedResource: AuthorizedResourceModule;
+ UserResource: UserResource;
+ SubResource: SubResource;
+ }
+
+ export class Resource {
+ baseUrl: string;
+ url: string;
+ parameterizedUrl: string;
+ model: Model;
+ resDef: IResource;
+ parentResource: Resource;
+ router: Router;
+ app: Application;
+ db: Mongoose;
+ paramId: string;
+ parentRef: string;
+ populate: string;
+
+ constructor(resDef: IResource);
+
+ createModel(resDef: IResource): Model;
+
+ toClassName(name: string): string;
+
+ setupRoutes(): void;
+
+ getAll(req: Request, res: Response): void;
+
+ buildParentSearch(req: Request): any;
+
+ getById(req: Request, res: Response): void;
+
+ create(req: Request, res: Response): void;
+
+ update(req: Request, res: Response): void;
+
+ del(req: Request, res: Response): void;
+
+ errorHandler(err: Error, res: Response): void;
+ }
+
+ export interface IResource {
+ name: string;
+ model: any;
+ parentRef?: string;
+ populate?: string;
+ plural?: string;
+ parentResource?: Resource;
+ }
+
+ export interface AuthorizedResourceModule {
+ AuthorizedResource: AuthorizedResource
+ ROLES: Roles
+ }
+
+ export interface Roles {
+ USER: string;
+ SUPER_USER: string;
+ MODERATOR: string;
+ ADMIN: string;
+ }
+
+ export class AuthorizedResource extends Resource {
+ methodAccess: IMethodAccess;
+
+ maxDays: number;
+
+ permissions: IMethodAccess;
+
+ isTokenExpired(createdAt: Date): boolean;
+
+ getRoles(id: string): Promise;
+
+ hasAuthorizedRole(roles: Array, authorizedRoles: Array): boolean;
+
+ hasAccessRightsDefined(req: Request, authorizedRoles: Array): boolean;
+
+ isAuthorized(req: Request, authorizedRoles: Array): boolean;
+
+ sendUnauthorized(error: Error, res: Response): void;
+ }
+
+ export interface IMethodAccess {
+ getAll: Array;
+ getById: Array;
+ create: Array;
+ update: Array;
+ del: Array;
+ }
+
+ export class UserResource extends AuthorizedResource {
+ ensureBaseUserModel(model: any): void;
+
+ createRoleModel(): void;
+
+ isSelf(req: Request): boolean;
+
+ login(req: Request, res: Response): void;
+ }
+
+ export class SubResource extends Resource {
+ constructor(resDef: ISubResource);
+
+ createProjectionQuery(req: Request): any;
+
+ createPullQuery(req: Request): any;
+
+ createFindQuery(req: Request): any;
+
+ createSubUpdateQuery(req: Request): any;
+ }
+
+ export interface ISubResource {
+ name: string;
+ plural?: string;
+ parentResource: Resource;
+ populate?: string;
+ }
+}
\ No newline at end of file