diff --git a/prismjs/prism-tests.ts b/prismjs/prism-tests.ts
new file mode 100644
index 000000000..3b89dd14e
--- /dev/null
+++ b/prismjs/prism-tests.ts
@@ -0,0 +1,10 @@
+///
+
+var element = document.createElement("code");
+var callback = (element: Element) => console.log(element);
+
+Prism.highlightElement(element, false, callback);
+Prism.highlightElement(element, false);
+Prism.highlightAll(true, callback);
+Prism.highlightAll(true);
+
diff --git a/prismjs/prism.d.ts b/prismjs/prism.d.ts
new file mode 100644
index 000000000..c3bbffae0
--- /dev/null
+++ b/prismjs/prism.d.ts
@@ -0,0 +1,164 @@
+// Type definitions for prism v1.4.4
+// Project: http://prismjs.com/
+// Definitions by: Erik Lieben
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+declare namespace PrismJS {
+
+ /**
+ * The Prism object
+ */
+ interface Prism {
+
+ util: Util;
+ languages: Languages;
+ plugins: any;
+
+ /**
+ * This is the most high-level function in Prism’s API. It fetches all the elements that have a .language-xxxx class and then calls Prism.highlightElement() on each one of them.
+ *
+ * @param {boolean} async - Whether to use Web Workers to improve performance and avoid blocking the UI when highlighting very large chunks of code. False by default.
+ * @param {(element:Element)=>void} callback? - An optional callback to be invoked after the highlighting is done. Mostly useful when async is true, since in that case, the highlighting is done asynchronously.
+ * @returns void
+ */
+ highlightAll(async: boolean, callback?: (element: Element) => void): void;
+
+ /**
+ * Highlights the code inside a single element.
+ *
+ * @param {Element} element - The element containing the code. It must have a class of language-xxxx to be processed, where xxxx is a valid language identifier.
+ * @param {boolean} async - Whether to use Web Workers to improve performance and avoid blocking the UI when highlighting very large chunks of code. False by default.
+ * @param {(element:Element)=>void} callback? - An optional callback to be invoked after the highlighting is done. Mostly useful when async is true, since in that case, the highlighting is done asynchronously.
+ * @returns void
+ */
+ highlightElement(element: Element, async: boolean, callback?: (element: Element) => void): void;
+
+
+ /**
+ * Low-level function, only use if you know what you’re doing. It accepts a string of text as input and the language definitions to use, and returns a string with the HTML produced.
+ *
+ * @param {string} text - A string with the code to be highlighted.
+ * @param {LanguageDefinition} grammer - An object containing the tokens to use. Usually a language definition like Prism.languages.markup
+ * @param {LanguageDefinition} language
+ * @returns string - The highlighted HTML
+ */
+ highlight(text: string, grammer: LanguageDefinition, language?: LanguageDefinition): string;
+
+ /**
+ * This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input and the language definitions to use,
+ * and returns an array with the tokenized code. When the language definition includes nested tokens, the function is called recursively on each of
+ * these tokens. This method could be useful in other contexts as well, as a very crude parser.
+ *
+ * @param {string} text - A string with the code to be highlighted.
+ * @param {LanguageDefinition} grammar - An object containing the tokens to use. Usually a language definition like Prism.languages.markup
+ * @param {LanguageDefinition} language
+ * @returns Array - An array of strings, tokens (class Prism.Token) and other arrays.
+ */
+ tokenize(text: string, grammar: LanguageDefinition, language?: LanguageDefinition): Array;
+
+ fileHighlight(): void;
+
+ hooks: Hooks;
+ }
+
+ interface Environment {
+ element?: Element;
+ language?: LanguageDefinition;
+ grammer?: any;
+ code?: any;
+ highlightedCode?: any;
+ type?: string;
+ content?:string;
+ tag?: string;
+ classes?: Array;
+ attributes?: Array | Object;
+ parent?: Element;
+ }
+
+ interface Identifier {
+ value: number;
+ }
+
+ interface Util {
+ encode(tokens:Token | Array | string): Token | Array | string;
+ type(o: Object): string;
+ objId(obj: Object): Identifier;
+ clone(o: LanguageDefinition): LanguageDefinition;
+ }
+
+ interface LanguageDefinition {
+ keyword?: RegExp | LanguageDefinition;
+ number?: RegExp | LanguageDefinition;
+ function?: RegExp | LanguageDefinition;
+ string?: RegExp | LanguageDefinition;
+ boolean?: RegExp | LanguageDefinition;
+ operator?: RegExp | LanguageDefinition;
+ punctuation?: RegExp | LanguageDefinition;
+ atrule?: RegExp | LanguageDefinition;
+ url?: RegExp | LanguageDefinition;
+ selector?: RegExp | LanguageDefinition;
+ property?: RegExp | LanguageDefinition;
+ important?: RegExp | LanguageDefinition;
+ style?: RegExp | LanguageDefinition;
+
+ /**
+ * This option can be used to define one or more aliases for the matched token. The result will be, that the styles
+ * of the token and its aliases are combined. This can be useful, to combine the styling of a well known token,
+ * which is already supported by most of the themes, with a semantically correct token name. The option can be
+ * set to a string literal or an array of string literals. In the following example the token name latex-equation
+ * is not supported by any theme, but it will be highlighted the same as a string.
+ */
+ alias?: string;
+
+ pattern?: RegExp;
+
+ /**
+ * This option mitigates JavaScript’s lack of lookbehind. When set to true, the first capturing group in the regex
+ * pattern is discarded when matching this token, so it effectively behaves as if it was lookbehind
+ */
+ lookbehind?: boolean;
+
+ /**
+ * This property accepts another object literal, with tokens that are allowed to be nested in this token.
+ * This makes it easier to define certain languages. However, keep in mind that they’re slower and if coded poorly,
+ * can even result in infinite recursion. For an example of nested tokens, check out the Markup language definition
+ */
+ inside?: LanguageDefinition;
+
+ /**
+ * Accepts an object literal with tokens and appends them to the end of the current object literal.
+ */
+ rest?: Array;
+ }
+
+ interface Languages extends Array {
+
+ extend(id: string, redef: LanguageDefinition): LanguageDefinition;
+
+ /**
+ * Insert a token before another token in a language literal
+ * As this needs to recreate the object (we cannot actually insert before keys in object literals),
+ * we cannot just provide an object, we need anobject and a key.
+ * @param inside The key (or language id) of the parent
+ * @param before The key to insert before. If not provided, the function appends instead.
+ * @param insert Object with the key/value pairs to insert
+ * @param root The object that contains `inside`. If equal to Prism.languages, it can be omitted.
+ */
+ insertBefore(inside: string, before: string, insert: LanguageDefinition, root: Object): any;
+ }
+
+ interface Hooks {
+ all: Array void>>;
+ add(name: string, callback: (env: Environment) => void):void;
+ run(name: string, env: Environment): void;
+ }
+
+ interface Token {
+ type: string;
+ content: Token | Array | string;
+ alias: string;
+ stringify(o:string| Array, language: LanguageDefinition, parent: HTMLPreElement): string;
+ }
+}
+
+declare var Prism : PrismJS.Prism;
\ No newline at end of file