diff --git a/Classes/Controller/BrowseLinksController.php b/Classes/Controller/BrowseLinksController.php
index a5c651ce3bd1f57ba597410425be8e394cccea42..5f0737cdfa2f38e5bab9d398258a9ff80e46949c 100644
--- a/Classes/Controller/BrowseLinksController.php
+++ b/Classes/Controller/BrowseLinksController.php
@@ -15,6 +15,7 @@ namespace SGalinski\Tinymce4Rte\Controller;
  */
 
 use Psr\Http\Message\ServerRequestInterface;
+use SGalinski\Tinymce4Rte\Utility\VersionUtility;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Page\PageRenderer;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -210,39 +211,60 @@ class BrowseLinksController extends AbstractLinkBrowserController {
 			return;
 		}
 
-		if (!empty($this->currentLinkParts['class'])) {
-			// remove required classes
-			$currentClasses = GeneralUtility::trimExplode(' ', $this->currentLinkParts['class'], true);
-			if (count($currentClasses) > 1) {
-				$this->currentLinkParts['class'] = end($currentClasses);
+		if (VersionUtility::isVersion870OrHigher()) {
+			if (!empty($this->currentLinkParts['url'])) {
+				/** @noinspection ExceptionsAnnotatingAndHandlingInspection */
+				/** @noinspection PhpUnnecessaryFullyQualifiedNameInspection */
+				$linkService = GeneralUtility::makeInstance(\TYPO3\CMS\Core\LinkHandling\LinkService::class);
+				$data = $linkService->resolve($this->currentLinkParts['url']);
+				$this->currentLinkParts['type'] = $data['type'];
+				unset($data['type']);
+				$this->currentLinkParts['url'] = $data;
 			}
-		}
 
-		if (empty($this->currentLinkParts['data-htmlarea-external'])) {
-			// strip siteUrl prefix except for external and mail links
-			if (strpos($this->currentLinkParts['url'], 'mailto:') === false) {
-				$paramsPosition = strpos($this->currentLinkParts['url'], '?');
-				if ($paramsPosition !== false) {
-					$this->currentLinkParts['url'] = substr($this->currentLinkParts['url'], $paramsPosition + 1);
+			if (!empty($this->currentLinkParts['class'])) {
+				// Only keep last class value (others are automatically added again by required option)
+				// https://review.typo3.org/#/c/29643
+				$currentClasses = GeneralUtility::trimExplode(' ', $this->currentLinkParts['class'], true);
+				if (count($currentClasses) > 1) {
+					$this->currentLinkParts['class'] = end($currentClasses);
 				}
 			}
-			// special treatment for page links, remove the id= part
-			$idPosition = strpos($this->currentLinkParts['url'], 'id=');
-			if ($idPosition !== false) {
-				$this->currentLinkParts['url'] = substr($this->currentLinkParts['url'], $idPosition + 3);
+		} else {
+			if (!empty($this->currentLinkParts['class'])) {
+				// remove required classes
+				$currentClasses = GeneralUtility::trimExplode(' ', $this->currentLinkParts['class'], TRUE);
+				if (count($currentClasses) > 1) {
+					$this->currentLinkParts['class'] = end($currentClasses);
+				}
 			}
 
-			// in RTE the additional params are encoded directly at the end of the href part
-			// we need to split this again into dedicated fields
-			$additionalParamsPosition = strpos($this->currentLinkParts['url'], '?');
-			if ($additionalParamsPosition === false) {
-				$additionalParamsPosition = strpos($this->currentLinkParts['url'], '&');
-			}
-			if ($additionalParamsPosition !== false) {
-				$this->currentLinkParts['params'] = substr($this->currentLinkParts['url'], $additionalParamsPosition);
-				$this->currentLinkParts['url'] = substr($this->currentLinkParts['url'], 0, $additionalParamsPosition);
-				// in case the first sign was an ? override it with &
-				$this->currentLinkParts['params'][0] = '&';
+			if (empty($this->currentLinkParts['data-htmlarea-external'])) {
+				// strip siteUrl prefix except for external and mail links
+				if (strpos($this->currentLinkParts['url'], 'mailto:') === FALSE) {
+					$paramsPosition = strpos($this->currentLinkParts['url'], '?');
+					if ($paramsPosition !== FALSE) {
+						$this->currentLinkParts['url'] = substr($this->currentLinkParts['url'], $paramsPosition + 1);
+					}
+				}
+				// special treatment for page links, remove the id= part
+				$idPosition = strpos($this->currentLinkParts['url'], 'id=');
+				if ($idPosition !== FALSE) {
+					$this->currentLinkParts['url'] = substr($this->currentLinkParts['url'], $idPosition + 3);
+				}
+
+				// in RTE the additional params are encoded directly at the end of the href part
+				// we need to split this again into dedicated fields
+				$additionalParamsPosition = strpos($this->currentLinkParts['url'], '?');
+				if ($additionalParamsPosition === FALSE) {
+					$additionalParamsPosition = strpos($this->currentLinkParts['url'], '&');
+				}
+				if ($additionalParamsPosition !== FALSE) {
+					$this->currentLinkParts['params'] = substr($this->currentLinkParts['url'], $additionalParamsPosition);
+					$this->currentLinkParts['url'] = substr($this->currentLinkParts['url'], 0, $additionalParamsPosition);
+					// in case the first sign was an ? override it with &
+					$this->currentLinkParts['params'][0] = '&';
+				}
 			}
 		}
 
@@ -589,4 +611,4 @@ class BrowseLinksController extends AbstractLinkBrowserController {
 			'contentTypo3Language' => $this->contentTypo3Language
 		];
 	}
-}
\ No newline at end of file
+}
diff --git a/Classes/Form/Element/RichTextElement.php b/Classes/Form/Element/RichTextElement.php
index 74c807dc83d73b2ea1dbb5c24e7be3dd9e2937ce..182b20f240442ab3d9b04870e1f577d50da3494a 100644
--- a/Classes/Form/Element/RichTextElement.php
+++ b/Classes/Form/Element/RichTextElement.php
@@ -359,55 +359,56 @@ class RichTextElement extends AbstractFormElement {
 	 * @return void
 	 */
 	protected function enableRegisteredPlugins() {
-//		$plugins = [
+		// @todo repair this
+		$plugins = [
 //			'TYPO3Image' => [
 //				'objectReference' => Typo3Image::class,
 //			],
-//			'TYPO3Link' => [
-//				'objectReference' => TYPO3Link::class,
-//			],
-//		];
-//		foreach ($plugins as $pluginId => $pluginObjectConfiguration) {
-//			if (is_array($pluginObjectConfiguration) && isset($pluginObjectConfiguration['objectReference'])) {
-//				/** @var RteHtmlAreaApi $plugin */
-//				$plugin = GeneralUtility::makeInstance($pluginObjectConfiguration['objectReference']);
-//				$configuration = array(
-//					'language' => $this->language,
-//					'contentTypo3Language' => $this->contentTypo3Language,
-//					'contentISOLanguage' => $this->contentISOLanguage,
-//					'contentLanguageUid' => $this->contentLanguageUid,
-//					'RTEsetup' => $this->vanillaRteTsConfig,
-//					'client' => $this->client,
-//					'thisConfig' => $this->processedRteConfiguration,
-//					'specConf' => $this->defaultExtras,
-//				);
-//				if ($plugin->main($configuration)) {
-//					$this->registeredPlugins[$pluginId] = $plugin;
-//					// Override buttons from previously registered plugins
-//					$pluginButtons = GeneralUtility::trimExplode(',', $plugin->getPluginButtons(), TRUE);
-//					foreach ($this->pluginButton as $previousPluginId => $buttonList) {
-//						$this->pluginButton[$previousPluginId] = implode(',', array_diff(GeneralUtility::trimExplode(',', $this->pluginButton[$previousPluginId], TRUE), $pluginButtons));
-//					}
-//					$this->pluginButton[$pluginId] = $plugin->getPluginButtons();
-//					$pluginLabels = GeneralUtility::trimExplode(',', $plugin->getPluginLabels(), TRUE);
-//					foreach ($this->pluginLabel as $previousPluginId => $labelList) {
-//						$this->pluginLabel[$previousPluginId] = implode(',', array_diff(GeneralUtility::trimExplode(',', $this->pluginLabel[$previousPluginId], TRUE), $pluginLabels));
-//					}
-//					$this->pluginLabel[$pluginId] = $plugin->getPluginLabels();
-//					$this->pluginEnabledArray[] = $pluginId;
-//				}
-//			}
-//		}
-//
-//		// Process overrides
-//		$hidePlugins = array();
-//		foreach ($this->registeredPlugins as $pluginId => $plugin) {
-//			/** @var RteHtmlAreaApi $plugin */
-//			if ($plugin->addsButtons() && !$this->pluginButton[$pluginId]) {
-//				$hidePlugins[] = $pluginId;
-//			}
-//		}
-//		$this->pluginEnabledArray = array_unique(array_diff($this->pluginEnabledArray, $hidePlugins));
+			'TYPO3Link' => [
+				'objectReference' => TYPO3Link::class,
+			],
+		];
+		foreach ($plugins as $pluginId => $pluginObjectConfiguration) {
+			if (is_array($pluginObjectConfiguration) && isset($pluginObjectConfiguration['objectReference'])) {
+				/** @var RteHtmlAreaApi $plugin */
+				$plugin = GeneralUtility::makeInstance($pluginObjectConfiguration['objectReference']);
+				$configuration = array(
+					'language' => $this->language,
+					'contentTypo3Language' => $this->contentTypo3Language,
+					'contentISOLanguage' => $this->contentISOLanguage,
+					'contentLanguageUid' => $this->contentLanguageUid,
+					'RTEsetup' => $this->vanillaRteTsConfig,
+					'client' => $this->client,
+					'thisConfig' => $this->processedRteConfiguration,
+					'specConf' => $this->defaultExtras,
+				);
+				if ($plugin->main($configuration)) {
+					$this->registeredPlugins[$pluginId] = $plugin;
+					// Override buttons from previously registered plugins
+					$pluginButtons = GeneralUtility::trimExplode(',', $plugin->getPluginButtons(), TRUE);
+					foreach ($this->pluginButton as $previousPluginId => $buttonList) {
+						$this->pluginButton[$previousPluginId] = implode(',', array_diff(GeneralUtility::trimExplode(',', $this->pluginButton[$previousPluginId], TRUE), $pluginButtons));
+					}
+					$this->pluginButton[$pluginId] = $plugin->getPluginButtons();
+					$pluginLabels = GeneralUtility::trimExplode(',', $plugin->getPluginLabels(), TRUE);
+					foreach ($this->pluginLabel as $previousPluginId => $labelList) {
+						$this->pluginLabel[$previousPluginId] = implode(',', array_diff(GeneralUtility::trimExplode(',', $this->pluginLabel[$previousPluginId], TRUE), $pluginLabels));
+					}
+					$this->pluginLabel[$pluginId] = $plugin->getPluginLabels();
+					$this->pluginEnabledArray[] = $pluginId;
+				}
+			}
+		}
+
+		// Process overrides
+		$hidePlugins = array();
+		foreach ($this->registeredPlugins as $pluginId => $plugin) {
+			/** @var RteHtmlAreaApi $plugin */
+			if ($plugin->addsButtons() && !$this->pluginButton[$pluginId]) {
+				$hidePlugins[] = $pluginId;
+			}
+		}
+		$this->pluginEnabledArray = array_unique(array_diff($this->pluginEnabledArray, $hidePlugins));
 	}
 
 	/**