diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index bb0933af5..e122304b6 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -117,6 +117,7 @@ All definitions files include a header with the author and editors, so at some p
* [Google Translate API](https://developers.google.com/translate/) (by [Frank M](https://github.com/sgtfrankieboy))
* [Google Url Shortener](https://developers.google.com/url-shortener/) (by [Frank M](https://github.com/sgtfrankieboy))
* [Hammer.js](http://eightmedia.github.com/hammer.js/) (by [Boris Yankov](https://github.com/borisyankov))
+* [Hapi](http://github.com/spumko/hapi) (by [Hakubo](http://github.com/hakubo))
* [Handlebars](http://handlebarsjs.com/) (by [Boris Yankov](https://github.com/borisyankov))
* [HashMap](https://github.com/flesler/hashmap) (by [RafaĆ Wrzeszcz](https://wrzasq.pl))
* [HashSet](http://www.timdown.co.uk/jshashtable/jshashset.html) (by [Sergey Gerasimov](https://github.com/gerich-home))
diff --git a/hapi/hapi-tests.ts b/hapi/hapi-tests.ts
new file mode 100644
index 000000000..fcc870af6
--- /dev/null
+++ b/hapi/hapi-tests.ts
@@ -0,0 +1,26 @@
+///
+
+import Hapi = require('hapi');
+
+// Create a server with a host and port
+var server = Hapi.createServer('localhost', 8000);
+
+// Add the route
+server.route({
+ method: 'GET',
+ path: '/hello',
+ handler: function (request: Hapi.Request, reply: Function) {
+ reply('hello world');
+ }
+});
+
+server.route([{
+ method: 'GET',
+ path: '/hello2',
+ handler: function (request: Hapi.Request, reply: Function) {
+ reply('hello world2');
+ }
+}]);
+
+// Start the server
+server.start();
diff --git a/hapi/hapi.d.ts b/hapi/hapi.d.ts
new file mode 100644
index 000000000..68b366d6d
--- /dev/null
+++ b/hapi/hapi.d.ts
@@ -0,0 +1,457 @@
+// Type definitions for hapi
+// Project: http://github.com/spumko/hapi
+// Definitions by: Hakubo
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+
+declare module Hapi {
+ export interface ServerOptions {
+ app?: any;
+// cache?: string;
+// cache?: {
+// engine: any;
+// };
+ cache?: any;
+// cors?: boolean;
+// cors?: {
+// origin?: Array;
+// isOriginExposed?: boolean;
+// matchOrigin?: boolean;
+// maxAge?: number;
+// headers?: Array;
+// additionalHeaders?: Array;
+// methods?: Array;
+// additionalMethods?: Array;
+// exposedHeaders?: Array;
+// additionalExposedHeaders?: Array;
+// credentials?: boolean;
+// };
+ cors?: any;
+// security?: boolean;
+// security?: {
+// hsts?: boolean;
+// hsts?: {
+// maxAge: number;
+// includeSubdomains: boolean;
+// };
+// xframe?: boolean;
+// xframe?: string;
+// xframe?: {
+// rule: string;
+// source: any;
+// };
+// xss?: boolean;
+// noOpen?: boolean;
+// noSniff?: boolean;
+// };
+ security?: any;
+ debug?: {
+ request: Array;
+ };
+ files?: {
+ relativeTo: string;
+ etagsCacheMaxSize: number;
+ };
+ json?: {
+// replacer?: () => void;
+// replacer?: Array<() => void>;
+ replacer?: any;
+ space?: number;
+ };
+ labels?: Array;
+ load?: {
+ maxHeapUsedBytes?: number;
+ maxRssBytes?: number;
+ maxEventLoopDelay?: number;
+ sampleInterval?: number;
+ };
+ location?: string;
+ payload?: {
+ maxBytes: number;
+ uploads: string;
+ };
+ plugins?: any;
+ router?: {
+ isCaseSensitive?: boolean;
+ stripTrailingSlash?: boolean;
+ };
+ state?: {
+ cookies: {
+ parse?: boolean;
+ failAction?: string;
+ clearInvalid?: boolean;
+ strictHeader?: boolean;
+ }
+ };
+ timeout?: {
+// server?: boolean;
+// server?: number;
+ server?: any;
+// client?: boolean;
+// client?: number;
+ client?: any;
+// socket?: boolean;
+// socket?: number;
+ socket?: any;
+ };
+ tls?: any; //This should be Node.tls
+ maxSockets?: number;
+ validation?: any;
+ views?: ServerView;
+ }
+
+ export class Pack {
+ require(name: string, options: {}, callback: Function): void;
+ }
+
+ export interface ServerView {
+ engines: {
+ [extension: string]: string;
+ module?: string;
+// compile: (
+// template: string,
+// options: any
+// ) => void;
+// compile: (
+// template: string,
+// options: any,
+// callback: (
+// err: any,
+// compiled: (
+// context: any,
+// options: any,
+// callback: (
+// err: any,
+// rendered: boolean
+// ) => void
+// ) => void
+// ) => void
+// ) => void;
+ compile?: any;
+ };
+ defaultExtension?: string;
+ path?: string;
+ partialsPath?: string;
+ helpersPath?: string;
+ basePath?: string;
+ layout?: boolean;
+ layoutPath?: string;
+ layoutKeyword?: string;
+ encoding?: string;
+ isCached?: boolean;
+ allowAbsolutePaths?: boolean;
+ allowInsecureAccess?: boolean;
+ compileOptions?: any;
+ runtimeOptions?: any;
+ contentType?: string;
+ compileMode?: string;
+ }
+
+ export interface RouteOptions {
+ path: string;
+ method: string;
+// vhost?: string;
+// vhost?: Array;
+ vhost?: any;
+// handler: string;
+// handler: (request: Request, reply: Function) => void;
+// handler: {
+// file: string;
+// file: (request: Request) => void;
+// file: {
+// path: string;
+// filename?: string;
+// mode?: boolean;
+// mode?: string;
+// lookupCompressed: boolean;
+// };
+// directory: {
+// path: string;
+// path: Array;
+// path: (request: Request) => string;
+// path: (request: Request) => Array;
+// index?: boolean;
+// listing?: boolean;
+// showHidden?: boolean;
+// redirectToSlash?: boolean;
+// lookupCompressed?: boolean;
+// defaultExtension?: string;
+// };
+// proxy?: {
+// host?: string;
+// port?: number;
+// protocol?: string;
+// uri?: string;
+// passThrough?: boolean;
+// rejectUnauthorized?: boolean;
+// xforward?: boolean;
+// redirects?: boolean;
+// redirects?: number;
+// timeout?: number;
+//
+// mapUri?: (request: Request, callback: (err: any, uri: string, headers: {[key: string]: string}) => void) => void;
+// onResponse: (
+// err: any,
+// res: any,//Node Response
+// req: any,//Node Request
+// reply: () => void,
+// settings: any,
+// ttl: number
+// ) => void;
+// ttl: number;
+// };
+// view: string;
+// view: {
+// template: string;
+// context: {
+// payload: any;
+// params: any;
+// query: any;
+// pre: any;
+// }
+// };
+// config: {
+// handler: any;
+// bind: any;
+// app: any;
+// plugins: {
+// [name: string]: any;
+// };
+// pre: Array<() => void>;
+// validate: {
+// headers: any;
+// params: any;
+// query: any;
+// payload: any;
+// errorFields?: any;
+// failAction?: string;
+// failAction?: (source: string, error: any, next: () => void) => void;
+// };
+// payload: {
+// output: {
+// data: any;
+// stream: any;
+// file: any;
+// };
+// parse?: any;
+// allow?: string;
+// allow?: Array;
+// override?: string;
+// maxBytes?: number;
+// uploads?: number;
+// failAction?: string;
+// };
+// response: {
+// schema: any;
+// sample: number;
+// failAction: string;
+// };
+// cache: {
+// privacy: string;
+// expiresIn: number;
+// expiresAt: number;
+// };
+// auth: string;
+// auth: boolean;
+// auth: {
+// mode: string;
+// strategies: Array;
+// payload?: boolean;
+// payload?: string;
+// tos?: boolean;
+// tos?: string;
+// scope?: string;
+// scope?: Array;
+// entity: string;
+// };
+// cors?: boolean;
+// jsonp?: string;
+// description?: string;
+// notes?: string;
+// notes?: Array;
+// tags?: Array;
+// }
+// };
+ handler: any;
+ }
+
+ export class Server {
+ app: any;
+ methods: Array<() => void>;
+ info: {
+ port: number;
+ host?: string;
+ protocol?: string;
+ uri?: string;
+ };
+ listener: any;// Node Http server
+ load: {
+ eventLoopDelay: number;
+ heapUsed: number;
+ rss: number;
+ };
+ pack: Pack;
+ plugins: {
+ [pluginName: string]: any;
+ };
+
+ start(callback?: () => void): void;
+ stop(options?: {timeout: number;}, callback?: () => void): void;
+ route(options: RouteOptions): void;
+ route(routes: Array): void;
+ table(host?: string): Array;
+ log(tags: string, data?: string, timestamp?: number): void;
+ log(tags: Array, data?: string, timestamp?: number): void;
+ log(tags: string, data?: any, timestamp?: number): void;
+ log(tags: Array, data?: any, timestamp?: number): void;
+ state(name: string, options?: {
+ ttl: number;
+ isSecure: boolean;
+ isHttpOnly: boolean;
+ path: string;
+ domain: string;
+ autoValue: (request: Request, next: (err: any, value: any) => void) => void;
+ encoding?: string;
+ sign: any;
+ password: string;
+ iron: any;
+ }): void;
+ views(options: ServerView): void;
+ cache(name: string, options: {
+ expiresIn: number;
+ expiresAt: number;
+ staleIn: number;
+ staleTimeout: number;
+ cache: string;
+ }): void;
+
+ auth: {
+ scheme(name: string, scheme: {
+ name: string;
+ scheme: (server: Server, options: any) => (authenticate: any, payload: any, response: any) => void;
+ }): void;
+ strategy: any;
+ };
+ ext(event: any, method: string, options?: any): void;
+ method(method: Array<{name: string; fn: () => void; options: any}>): void;
+ method(name: string, fn: () => void, options: any): void;
+ inject(options: any, callback: any): void;
+ handler(name: string, method: (name: string, options: any) => void): void;
+ }
+
+ export interface Request {
+ app: any;
+ auth: {
+ isAuthenticated: boolean;
+ credentials: Object;
+ artifacts: Object;
+ session: Object
+ };
+ domain: any;
+ headers: Object;
+ id: number;
+ info: {
+ received: number;
+ remoteAddress: string;
+ remotePort: number;
+ referrer: string;
+ host: string;
+ };
+ method: string;
+ mime?: string;
+ params: any;
+ path: string;
+ payload: any;
+ plugins: Object;
+ pre: Object;
+ response: Object;
+ responses: Object;
+ query: Object;
+ raw: {
+ req: any; //http.ClientRequest
+ res: any; //http.ClientResponse
+ };
+ route: string;
+ server: Server;
+ session: any;
+ state: Object;
+ url: Object;
+
+ setUrl? (url: string): void;
+ setMethod? (method: string): void;
+ log (tags: string, data?: string, timestamp?: number): void;
+ log (tags: string, data?: Object, timestamp?: number): void;
+ log (tags: string[], data?: string, timestamp?: number): void;
+ log (tags: string[], data?: Object, timestamp?: number): void;
+ getLog(): string[];
+ getLog(tag: string): string[];
+ getLog(tags: string[]): string[];
+ tail(name?: string): Function;
+ }
+
+ export interface Response {
+ statusCode: number;
+ headers: Object;
+ source: any;
+ variety: string;
+ app: any;
+ plugins: Object;
+ settings: {
+ encoding: string;
+ charset: string;
+ location: string;
+ ttl: number;
+ stringify: any;
+ passThrough: boolean;
+ }
+
+ code (statusCode: number): void;
+ header (name: string, value: string, options?: {
+ append: boolean;
+ separator: string;
+ override: boolean;
+ }): void;
+ type (mimeType: string): void;
+ bytes (length: number): void;
+ vary (header: string): void;
+ location (location: string): void;
+ created (location: string): void;
+ redirect (location: string): void;
+ encoding (encoding: string): void;
+ charset (charset: string): void;
+ ttl (ttl: number): void;
+ state (name: string, value: string, options?: any): void;
+ unstate (name: string): void;
+
+ replacer (method: Function): void;
+ replacer (method: Array): void;
+ spaces (count: number): void;
+
+ temporary (isTemporary: boolean): void;
+ permanent (isPermanent: boolean): void;
+ rewritable (isRewritable: boolean): void;
+ }
+
+ export module reply {
+ function file(path: string, options: {
+ filePath: string;
+ options: {
+ filename: string;
+ mode: string
+ }
+ }): void;
+
+ function view(template: string, context?: Object, options?: Object): Response;
+ function close(options?: Object): void;
+ function proxy(options: Object): void;
+
+ export function reply(result: any): any;
+ }
+
+ export function createServer (host: string, port: number, options?: ServerOptions): Server;
+}
+
+declare module "hapi" {
+ export = Hapi;
+}