diff --git a/Build/types/TYPO3/index.d.ts b/Build/types/TYPO3/index.d.ts
index 87d5e16fb1e4a13f11f97ebb1e9afeae5db348f7..ad983114dbaccd9380cf5dffb1357b2475b9561d 100644
--- a/Build/types/TYPO3/index.d.ts
+++ b/Build/types/TYPO3/index.d.ts
@@ -31,6 +31,12 @@ declare namespace TYPO3 {
         public readonly: number;
       }
     }
+
+    export namespace RecordList {
+      export class LinkBrowser {
+        public getLinkAttributeValues(): {[key: string]: string};
+      }
+    }
   }
 }
 
@@ -54,6 +60,10 @@ declare module 'TYPO3/CMS/Backend/Severity' {
   export = new TYPO3.CMS.Backend.Severity();
 }
 
+declare module 'TYPO3/CMS/Recordlist/LinkBrowser' {
+  export = new TYPO3.CMS.RecordList.LinkBrowser();
+}
+
 // Type definition for global namespace object
 interface Window {
   TYPO3: any;
diff --git a/typo3/sysext/rte_ckeditor/Resources/Private/TypeScript/RteLinkBrowser.ts b/typo3/sysext/rte_ckeditor/Resources/Private/TypeScript/RteLinkBrowser.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4ff8fd8d1d07473fde8cedc294b9cc2681c33a5b
--- /dev/null
+++ b/typo3/sysext/rte_ckeditor/Resources/Private/TypeScript/RteLinkBrowser.ts
@@ -0,0 +1,102 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+/**
+ * Module: TYPO3/CMS/RteCkeditor/RteLinkBrowser
+ * LinkBrowser communication with parent window
+ */
+import $ = require('jquery');
+import LinkBrowser = require('TYPO3/CMS/Recordlist/LinkBrowser');
+import Modal = require('TYPO3/CMS/Backend/Modal');
+
+class RteLinkBrowser {
+  private plugin: any = null;
+
+  private CKEditor: CKEDITOR.editor = null;
+
+  private siteUrl = '';
+
+  /**
+   * @param {string} editorId Id of CKEditor
+   */
+  public initialize(editorId: string): void {
+    let callerWindow: Window;
+    if (typeof top.TYPO3.Backend !== 'undefined' && typeof top.TYPO3.Backend.ContentContainer.get() !== 'undefined') {
+      callerWindow = top.TYPO3.Backend.ContentContainer.get();
+    } else {
+      callerWindow = window.parent;
+    }
+
+    $.each((callerWindow as any).CKEDITOR.instances, (name: string, editor: CKEDITOR.editor) => {
+      if (editor.id === editorId) {
+        this.CKEditor = editor;
+      }
+    });
+
+    // siteUrl etc are added as data attributes to the body tag
+    $.extend(RteLinkBrowser, $('body').data());
+
+    $('.t3js-removeCurrentLink').on('click', (event: Event) => {
+      event.preventDefault();
+      this.CKEditor.execCommand('unlink');
+      Modal.dismiss();
+    });
+  }
+
+  /**
+   * Store the final link
+   *
+   * @param {stringify} link The select element or anything else which identifies
+   * the link (e.g. "page:<pageUid>" or "file:<uid>")
+   */
+  public finalizeFunction(link: string): void {
+    const linkElement: CKEDITOR.dom.element = this.CKEditor.document.createElement('a');
+    const attributes = LinkBrowser.getLinkAttributeValues();
+    const params: string = attributes.params ? attributes.params : '';
+
+    if (attributes.target) {
+      linkElement.setAttribute('target', attributes.target);
+    }
+    if (attributes.class) {
+      linkElement.setAttribute('class', attributes.class);
+    }
+    if (attributes.title) {
+      linkElement.setAttribute('title', attributes.title);
+    }
+    delete attributes.title;
+    delete attributes.class;
+    delete attributes.target;
+    delete attributes.params;
+
+    $.each(attributes, (attrName: string, attrValue: string) => {
+      linkElement.setAttribute(attrName, attrValue);
+    });
+
+    linkElement.setAttribute('href', link + params);
+
+    const selection: CKEDITOR.dom.selection = this.CKEditor.getSelection();
+    if (selection && selection.getSelectedText() === '') {
+      selection.selectElement(selection.getStartElement());
+    }
+    if (selection && selection.getSelectedText()) {
+      linkElement.setText(selection.getSelectedText());
+    } else {
+      linkElement.setText(linkElement.getAttribute('href'));
+    }
+    this.CKEditor.insertElement(linkElement);
+
+    Modal.dismiss();
+  }
+}
+
+export = new RteLinkBrowser();
diff --git a/typo3/sysext/rte_ckeditor/Resources/Public/JavaScript/RteLinkBrowser.js b/typo3/sysext/rte_ckeditor/Resources/Public/JavaScript/RteLinkBrowser.js
index e59c571b2a2b2b304912291159d7f43ed7cc913f..a0a42005c095d2f010c2b42df6b82a46e2e27811 100644
--- a/typo3/sysext/rte_ckeditor/Resources/Public/JavaScript/RteLinkBrowser.js
+++ b/typo3/sysext/rte_ckeditor/Resources/Public/JavaScript/RteLinkBrowser.js
@@ -10,96 +10,80 @@
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/RteCkeditor/RteLinkBrowser
- * LinkBrowser communication with parent window
- */
-define(['jquery', 'TYPO3/CMS/Recordlist/LinkBrowser', 'TYPO3/CMS/Backend/Modal'], function ($, LinkBrowser, Modal) {
-	'use strict';
-
-	/**
-	 *
-	 * @type {{plugin: null, CKEditor: null, siteUrl: string}}
-	 * @exports TYPO3/CMS/RteCkeditor/RteLinkBrowser
-	 */
-	var RteLinkBrowser = {
-		plugin: null,
-		CKEditor: null,
-		siteUrl: ''
-	};
-
-	/**
-	 * @param {String} editorId Id of CKEditor
-	 */
-	RteLinkBrowser.initialize = function (editorId) {
-		var callerWindow;
-		if (typeof top.TYPO3.Backend !== 'undefined' && typeof top.TYPO3.Backend.ContentContainer.get() !== 'undefined') {
-			callerWindow = top.TYPO3.Backend.ContentContainer.get();
-		} else {
-			callerWindow = window.parent;
-		}
-
-		$.each(callerWindow.CKEDITOR.instances, function (name, editor) {
-			if (editor.id === editorId) {
-				RteLinkBrowser.CKEditor = editor;
-			}
-		});
-
-		// siteUrl etc are added as data attributes to the body tag
-		$.extend(RteLinkBrowser, $('body').data());
-
-		$('.t3js-removeCurrentLink').on('click', function (event) {
-			event.preventDefault();
-			RteLinkBrowser.CKEditor.execCommand('unlink');
-			Modal.dismiss();
-		});
-	};
-
-	/**
-	 * Store the final link
-	 *
-	 * @param {String} link The select element or anything else which identifies the link (e.g. "page:<pageUid>" or "file:<uid>")
-	 */
-	LinkBrowser.finalizeFunction = function (link) {
-
-		var linkElement = RteLinkBrowser.CKEditor.document.createElement('a');
-		var attributes = LinkBrowser.getLinkAttributeValues();
-		var params = attributes.params ? attributes.params : '';
-
-		if (attributes.target) {
-			linkElement.setAttribute('target', attributes.target);
-		}
-		if (attributes.class) {
-			linkElement.setAttribute('class', attributes.class);
-		}
-		if (attributes.title) {
-			linkElement.setAttribute('title', attributes.title);
-		}
-		delete attributes.title;
-		delete attributes.class;
-		delete attributes.target;
-		delete attributes.params;
-
-		$.each(attributes, function (attrName, attrValue) {
-			linkElement.setAttribute(attrName, attrValue);
-		});
-
-		linkElement.setAttribute('href', link + params);
-
-		var selection = RteLinkBrowser.CKEditor.getSelection();
-		if (selection && selection.getSelectedText() === '') {
-			selection.selectElement(selection.getStartElement());
-		}
-		if (selection && selection.getSelectedText()) {
-			linkElement.setText(selection.getSelectedText());
-		} else {
-			linkElement.setText(linkElement.getAttribute('href'));
-		}
-		RteLinkBrowser.CKEditor.insertElement(linkElement);
-
-		Modal.dismiss();
-	};
-
-	return RteLinkBrowser;
+define(["require", "exports", "jquery", "TYPO3/CMS/Recordlist/LinkBrowser", "TYPO3/CMS/Backend/Modal"], function (require, exports, $, LinkBrowser, Modal) {
+    "use strict";
+    var RteLinkBrowser = (function () {
+        function RteLinkBrowser() {
+            this.plugin = null;
+            this.CKEditor = null;
+            this.siteUrl = '';
+        }
+        /**
+         * @param {string} editorId Id of CKEditor
+         */
+        RteLinkBrowser.prototype.initialize = function (editorId) {
+            var _this = this;
+            var callerWindow;
+            if (typeof top.TYPO3.Backend !== 'undefined' && typeof top.TYPO3.Backend.ContentContainer.get() !== 'undefined') {
+                callerWindow = top.TYPO3.Backend.ContentContainer.get();
+            }
+            else {
+                callerWindow = window.parent;
+            }
+            $.each(callerWindow.CKEDITOR.instances, function (name, editor) {
+                if (editor.id === editorId) {
+                    _this.CKEditor = editor;
+                }
+            });
+            // siteUrl etc are added as data attributes to the body tag
+            $.extend(RteLinkBrowser, $('body').data());
+            $('.t3js-removeCurrentLink').on('click', function (event) {
+                event.preventDefault();
+                _this.CKEditor.execCommand('unlink');
+                Modal.dismiss();
+            });
+        };
+        /**
+         * Store the final link
+         *
+         * @param {stringify} link The select element or anything else which identifies
+         * the link (e.g. "page:<pageUid>" or "file:<uid>")
+         */
+        RteLinkBrowser.prototype.finalizeFunction = function (link) {
+            var linkElement = this.CKEditor.document.createElement('a');
+            var attributes = LinkBrowser.getLinkAttributeValues();
+            var params = attributes.params ? attributes.params : '';
+            if (attributes.target) {
+                linkElement.setAttribute('target', attributes.target);
+            }
+            if (attributes.class) {
+                linkElement.setAttribute('class', attributes.class);
+            }
+            if (attributes.title) {
+                linkElement.setAttribute('title', attributes.title);
+            }
+            delete attributes.title;
+            delete attributes.class;
+            delete attributes.target;
+            delete attributes.params;
+            $.each(attributes, function (attrName, attrValue) {
+                linkElement.setAttribute(attrName, attrValue);
+            });
+            linkElement.setAttribute('href', link + params);
+            var selection = this.CKEditor.getSelection();
+            if (selection && selection.getSelectedText() === '') {
+                selection.selectElement(selection.getStartElement());
+            }
+            if (selection && selection.getSelectedText()) {
+                linkElement.setText(selection.getSelectedText());
+            }
+            else {
+                linkElement.setText(linkElement.getAttribute('href'));
+            }
+            this.CKEditor.insertElement(linkElement);
+            Modal.dismiss();
+        };
+        return RteLinkBrowser;
+    }());
+    return new RteLinkBrowser();
 });