diff --git a/types/http-proxy-middleware/http-proxy-middleware-tests.ts b/types/http-proxy-middleware/http-proxy-middleware-tests.ts
new file mode 100644
index 0000000000..db331eec3d
--- /dev/null
+++ b/types/http-proxy-middleware/http-proxy-middleware-tests.ts
@@ -0,0 +1,23 @@
+// Derived from https://github.com/chimurai/http-proxy-middleware#example
+
+import * as express from 'express';
+import * as proxy from 'http-proxy-middleware';
+
+const options = {
+ target: 'http://www.example.org',
+ changeOrigin: true,
+ ws: true,
+ pathRewrite: {
+ '^/api/old-path': '/api/new-path',
+ '^/api/remove/path': '/path'
+ },
+ router: {
+ 'dev.localhost:3000': 'http://localhost:8000'
+ }
+};
+
+const myProxy = proxy(options);
+
+const app = express();
+app.use('/api', myProxy);
+app.listen(3000);
diff --git a/types/http-proxy-middleware/index.d.ts b/types/http-proxy-middleware/index.d.ts
new file mode 100644
index 0000000000..516ba72709
--- /dev/null
+++ b/types/http-proxy-middleware/index.d.ts
@@ -0,0 +1,67 @@
+// Type definitions for http-proxy-middleware
+// Project: https://github.com/chimurai/http-proxy-middleware
+// Definitions by: Zebulon McCorkle
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+// TypeScript Version: 2.2
+
+///
+///
+
+import * as http from 'http';
+import * as net from 'net';
+import * as tls from 'tls';
+import * as connect from 'connect';
+
+declare function proxy(config: proxy.Config): proxy.Proxy;
+declare function proxy(contextOrUri: string, config: proxy.Config): proxy.Proxy;
+
+declare namespace proxy {
+ type Logger = (...objs: any[]) => void;
+ export interface LogProvider {
+ log: Logger,
+ debug?: Logger,
+ info?: Logger,
+ warn?: Logger,
+ error?: Logger,
+ }
+
+ export interface Config {
+ pathRewrite?: { [regexp: string]: string } | ((path: string, req: http.IncomingMessage) => string),
+ router?: { [hostOrPath: string]: string } | ((req: http.IncomingMessage) => string),
+ logLevel?: 'debug' | 'info' | 'warn' | 'error' | 'silent',
+ logProvider?: (provider: LogProvider) => LogProvider,
+
+ onError?: connect.HandleFunction,
+ onProxyRes?: (proxyRes: http.ServerResponse, req: http.IncomingMessage, res: http.ServerResponse) => void,
+ onProxyReq?: (proxyReq: http.ClientRequest, req: http.IncomingMessage, res: http.ServerResponse) => void,
+ onProxyReqWs?: (proxyReq: http.ClientRequest, req: http.IncomingMessage, socket: any, options: any, head: any) => void, // TODO: Figure out the types of the last 3
+ onOpen?: (proxySocket: net.Socket) => void,
+ onClose?: (res: http.ServerResponse, socket: net.Socket) => void,
+
+ target?: string,
+ forward?: string,
+ agent?: http.Agent,
+ ssl?: tls.TlsOptions,
+ ws?: boolean,
+ xfwd?: boolean,
+ secure?: boolean,
+ toProxy?: boolean,
+ prependPath?: boolean,
+ ignorePath?: boolean,
+ localAddress?: string,
+ changeOrigin?: boolean,
+ auth?: string,
+ hostRewrite?: any, // TODO
+ autoRewrite?: any, // TODO
+ protocolRewrite?: any, // TODO
+ cookieDomainRewrite?: false | string | { [domain: string]: string },
+ headers?: { [header: string]: string },
+ proxyTimeout?: number,
+ }
+
+ export interface Proxy extends connect.NextHandleFunction {
+
+ }
+}
+
+export = proxy;
diff --git a/types/http-proxy-middleware/tsconfig.json b/types/http-proxy-middleware/tsconfig.json
new file mode 100644
index 0000000000..1fa2b32d6d
--- /dev/null
+++ b/types/http-proxy-middleware/tsconfig.json
@@ -0,0 +1,22 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "lib": [
+ "es6"
+ ],
+ "noImplicitAny": true,
+ "noImplicitThis": true,
+ "strictNullChecks": true,
+ "baseUrl": "../",
+ "typeRoots": [
+ "../"
+ ],
+ "types": [],
+ "noEmit": true,
+ "forceConsistentCasingInFileNames": true
+ },
+ "files": [
+ "index.d.ts",
+ "http-proxy-middleware-tests.ts"
+ ]
+}