diff --git a/socket.io.users/socket.io.users-tests.ts b/socket.io.users/socket.io.users-tests.ts
new file mode 100644
index 000000000..54a047262
--- /dev/null
+++ b/socket.io.users/socket.io.users-tests.ts
@@ -0,0 +1,58 @@
+///
+///
+///
+///
+var express = require('express');
+var app = express();
+var httpServer = require('http').createServer(app);
+var io = require('socket.io')(httpServer);
+import ioUsers = require("socket.io.users");
+
+
+
+ioUsers.Session(app, {
+ "secret": "socket.io.users secret test",
+ "resave": true,
+ "saveUninitialized": true
+});
+
+io.use(ioUsers.Middleware());
+
+var users = ioUsers.Users.of("/");
+
+
+var userDisconnected = (user: ioUsers.User) => {
+ console.log(user.get("username") + " has disconnected from all web browser windows or/and tabs");
+}
+
+var setUsername = (user: ioUsers.User, data: any) => {
+ console.log(user.ip + ' is for first time visiting our site. He/she wants ' + data.username + ' for username');
+ user.set("username", data.username);
+}
+
+var joinRoom = (user: ioUsers.User, roomToJoin: string) => {
+ console.log(user.get("username") + ' joined to ' + roomToJoin);
+}
+
+var leaveRoom = (user: ioUsers.User, roomToJoin: string) => {
+ console.log(user.get("username") + ' joined to ' + roomToJoin);
+}
+
+var sendMessage = (user: ioUsers.User, data: any) => {
+ console.log(user.get("username") + 'send ' + data.content + ' to room: ' + data.room);
+}
+
+users.on('disconnected', userDisconnected);
+users.on('set username', setUsername);
+users.on('join room', joinRoom); //notify other = user joined room or (GLOBAL) room created.
+users.on('leave room', leaveRoom); //notify other = user left room or (GLOBAL) room removed.
+users.on("send message", sendMessage); //notify other = receive message.
+
+httpServer.on('uncaughtException', function(err: any) {
+ console.log(err);
+})
+
+var httpPort = 80;
+httpServer.listen(httpPort, function() {
+ console.log("Server is running on " + httpPort);
+});
diff --git a/socket.io.users/socket.io.users.d.ts b/socket.io.users/socket.io.users.d.ts
new file mode 100644
index 000000000..f7ee9b2d8
--- /dev/null
+++ b/socket.io.users/socket.io.users.d.ts
@@ -0,0 +1,79 @@
+// Type definitions for socket.io.users
+// Project: https://github.com/nodets/socket.io.users
+// Definitions by: Makis Maropoulos
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+///
+///
+///
+
+declare module "socket.io.users" {
+ import { EventEmitter } from 'events';
+ import { Application } from "express";
+ import { SessionOptions } from "express-session";
+
+ var CONNECTION_EVENTS: string[];
+ var Middleware: () => (socket: SocketIO.Socket, next: () => any) => void;
+ var Session: (app: Application, options?: SessionOptions) => void;
+
+ type SocketUserList = {
+ [namespace: string]: Users;
+ };
+
+ class Namespaces {
+ private static socketUsersList: any;
+ static attach(namespace: string, socketUsersObj: Users): void;
+ static get(namespace: string): Users;
+ }
+
+ class User {
+ id: string | number;
+ socket: SocketIO.Socket;
+ sockets: SocketIO.Socket[];
+ rooms: string[];
+ ip: string;
+ remoteAddresses: string[];
+ store: any;
+ attach(socket: SocketIO.Socket): void;
+ detachSocket(socket: SocketIO.Socket): void;
+ detach(): void;
+ join(room: string): boolean;
+ leave(room: string): void;
+ leaveAll(): void;
+ /** same as in, checks if this user is inside a room */
+ belong(room: string): boolean;
+ /** same as belong, checks if this user is inside a room */
+ in(room: string): boolean;
+ set(key: string, value: any, callback?: () => void): void;
+ get: (key: string) => any;
+ toString(): string;
+ emit(...args: any[]): void;
+ to(room: string): SocketIO.Socket;
+ }
+
+
+ class Users extends EventEmitter {
+ namespace: string;
+ users: User[];
+ constructor(namespace?: string);
+ static of(namespace?: string): Users;
+ takeId: (request: any) => string | number;
+ create(socket: SocketIO.Socket): User;
+ getById(id: string | number): User;
+ get(socket: SocketIO.Socket): User;
+ list(): User[];
+ size(): number;
+ push(_user: User): void;
+ add(socket: SocketIO.Socket): User;
+ indexOf(user: User): number;
+ remove(user: User): void;
+ room(room: string): User[];
+ in(room: string): User[];
+ from(room: string): User[];
+ update(user: User): void;
+ emitAll(...args: any[]): void;
+ registerSocketEvents(currentUser: User): void;
+ }
+
+}