diff --git a/jsnlog/jsnlog-tests.ts b/jsnlog/jsnlog-tests.ts
new file mode 100644
index 000000000..dfb32a6c8
--- /dev/null
+++ b/jsnlog/jsnlog-tests.ts
@@ -0,0 +1,80 @@
+///
+
+// ----------------------------------------------------------
+// JL
+
+var traceLevel: number = JL.getTraceLevel();
+var debugLevel: number = JL.getDebugLevel();
+var infoLevel: number = JL.getInfoLevel();
+var warnLevel: number = JL.getWarnLevel();
+var errorLevel: number = JL.getErrorLevel();
+var fatalLevel: number = JL.getFatalLevel();
+
+JL.setOptions({
+ enabled: true,
+ maxMessages: 5,
+ defaultAjaxUrl: '/jsnlog.logger',
+ clientIP: '0.0.0.0',
+ requestId: 'a reuest id',
+ defaultBeforeSend: null
+});
+
+// ----------------------------------------------------------
+// Ajax Appender
+
+var ajaxAppender1: JSNLog.JSNLogAjaxAppender = JL.createAjaxAppender('ajaxAppender');
+
+ajaxAppender1.setOptions({
+ level: 5000,
+ ipRegex: 'a regex',
+ userAgentRegex: 'a user agent string',
+ disallow: 'regex matching suppressed messages',
+ sendWithBufferLevel: 5000,
+ storeInBufferLevel: 2000,
+ bufferSize: 10,
+ batchSize: 2,
+ url: '/jsnlog.logger',
+ beforeSend: null
+});
+
+// ----------------------------------------------------------
+// Console Appender
+
+var consoleAppender1: JSNLog.JSNLogConsoleAppender = JL.createConsoleAppender('consoleAppender');
+
+consoleAppender1.setOptions({
+ level: 5000,
+ ipRegex: 'a regex',
+ userAgentRegex: 'a user agent string',
+ disallow: 'regex matching suppressed messages',
+ sendWithBufferLevel: 5000,
+ storeInBufferLevel: 2000,
+ bufferSize: 10,
+ batchSize: 2
+});
+
+
+// ----------------------------------------------------------
+// Loggers
+
+var logger1: JSNLog.JSNLogLogger = JL('mylogger');
+
+var exception = {};
+
+logger1.trace('log message').debug({ x: 1, y: 2});
+logger1.info(function() { return 5; });
+logger1.warn('log message');
+logger1.error('log message');
+logger1.fatal('log message');
+logger1.fatalException('log message', exception);
+logger1.log(4000, 'log message', exception);
+
+logger1.setOptions({
+ level: 5000,
+ ipRegex: 'a regex',
+ userAgentRegex: 'a user agent string',
+ disallow: 'regex matching suppressed messages',
+ appenders: [ ajaxAppender1, consoleAppender1 ],
+ onceOnly: [ 'regex1', 'regex2' ]
+});
+
diff --git a/jsnlog/jsnlog.d.ts b/jsnlog/jsnlog.d.ts
new file mode 100644
index 000000000..6b6980165
--- /dev/null
+++ b/jsnlog/jsnlog.d.ts
@@ -0,0 +1,116 @@
+// Type definitions for JSNLog v2.11.0+
+// Project: https://github.com/mperdeck/jsnlog.js
+// Definitions by: Mattijs Perdeck
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+// -------------------------------
+// Full documentation is at
+// http://jsnlog.com
+// -------------------------------
+
+/**
+* Copyright 2015 Mattijs Perdeck.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+// Declarations of all interfaces and ambient objects, except for JL itself.
+// Provides strong typing in both jsnlog.ts itself and in TypeScript programs that use
+// JSNLog.
+
+declare module JSNLog {
+
+ interface JSNLogOptions {
+ enabled?: boolean;
+ maxMessages?: number;
+ defaultAjaxUrl?: string;
+ clientIP?: string;
+ requestId?: string;
+ defaultBeforeSend?: (xhr: XMLHttpRequest) => void;
+ }
+
+ interface JSNLogFilterOptions {
+ level?: number;
+ ipRegex?: string;
+ userAgentRegex?: string;
+ disallow?: string;
+ }
+
+ interface JSNLogLoggerOptions extends JSNLogFilterOptions {
+ appenders?: JSNLogAppender[];
+ onceOnly?: string[];
+ }
+
+ // Base for all appender options types
+ interface JSNLogAppenderOptions extends JSNLogFilterOptions {
+ sendWithBufferLevel?: number;
+ storeInBufferLevel?: number;
+ bufferSize?: number;
+ batchSize?: number;
+ }
+
+ interface JSNLogAjaxAppenderOptions extends JSNLogAppenderOptions {
+ url?: string;
+ beforeSend?: (xhr: XMLHttpRequest) => void;
+ }
+
+ interface JSNLogLogger {
+ setOptions(options: JSNLogLoggerOptions): JSNLogLogger;
+
+ trace(logObject: any): JSNLogLogger;
+ debug(logObject: any): JSNLogLogger;
+ info(logObject: any): JSNLogLogger;
+ warn(logObject: any): JSNLogLogger;
+ error(logObject: any): JSNLogLogger;
+ fatal(logObject: any): JSNLogLogger;
+ fatalException(logObject: any, e: any): JSNLogLogger;
+ log(level: number, logObject: any, e?: any): JSNLogLogger;
+ }
+
+ interface JSNLogAppender {
+ setOptions(options: JSNLogAppenderOptions): JSNLogAppender;
+ }
+
+ interface JSNLogAjaxAppender extends JSNLogAppender {
+ setOptions(options: JSNLogAjaxAppenderOptions): JSNLogAjaxAppender;
+ }
+
+ interface JSNLogConsoleAppender extends JSNLogAppender {
+ }
+
+ interface JSNLogStatic {
+ (loggerName?: string): JSNLogLogger;
+
+ setOptions(options: JSNLogOptions): JSNLogStatic;
+ createAjaxAppender(appenderName: string): JSNLogAjaxAppender;
+ createConsoleAppender(appenderName: string): JSNLogConsoleAppender;
+
+ getTraceLevel(): number;
+ getDebugLevel(): number;
+ getInfoLevel(): number;
+ getWarnLevel(): number;
+ getErrorLevel(): number;
+ getFatalLevel(): number;
+ }
+}
+
+declare function __jsnlog_configure(jsnlog: JSNLog.JSNLogStatic): void;
+
+
+// Ambient declaration of the JL object itself
+
+declare var JL: JSNLog.JSNLogStatic;
+
+
+
+