diff --git a/apps/accessibility/appinfo/routes.php b/apps/accessibility/appinfo/routes.php
index 21b48fab24a4b07aaea262ceb76dd30dc8b84b30..af4ef53601be5cff3bdf1fd6a908a46295cd2898 100644
--- a/apps/accessibility/appinfo/routes.php
+++ b/apps/accessibility/appinfo/routes.php
@@ -23,6 +23,6 @@
 
 return [
     'routes' => [
-        ['name' => 'accessibility#getCss', 'url' => '/css/user.css', 'verb' => 'GET'],
+        ['name' => 'accessibility#getCss', 'url' => '/css/user-{md5}.css', 'verb' => 'GET'],
     ],
 ];
diff --git a/apps/accessibility/css/dark.scss b/apps/accessibility/css/dark.scss
index cc4ebc20e1d5483307243fe2ac7fef89577432e7..6a220d1f063dbaacaee94a5772d16825eee2a009 100644
--- a/apps/accessibility/css/dark.scss
+++ b/apps/accessibility/css/dark.scss
@@ -1,14 +1,23 @@
-// Revert lighten/darken
-@function nc-darken($color, $value) {
-	@return lighten($color, $value);
-}
-
-@function nc-lighten($color, $value) {
-	@return darken($color, $value);
-}
-
 // SCSS variables
 $color-main-text: #d8d8d8;
 $color-main-background: #181818;
+
+$color-background-dark: lighten($color-main-background, 4%);
+$color-background-darker: lighten($color-main-background, 8%);
+
+$color-text-maxcontrast: darken($color-main-text, 30%);
+$color-text-light: darken($color-main-text, 10%);
+$color-text-lighter: darken($color-main-text, 20%);
+
 $color-loading-light: #777;
 $color-loading-dark: #ccc;
+
+$color-box-shadow: rgba(darken($color-main-background, 70%), .5);
+
+$color-border: lighten($color-main-background, 7%);
+$color-border-dark: lighten($color-main-background, 14%);
+
+#app-navigation > ul > li > a:first-child img,
+#app-navigation > ul > li > ul > li > a:first-child img {
+	filter: invert(100%);
+}
\ No newline at end of file
diff --git a/apps/accessibility/css/highcontrast.scss b/apps/accessibility/css/highcontrast.scss
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..7929677fbb68975857b2cd0b9d8f99d9d78bc10f 100644
--- a/apps/accessibility/css/highcontrast.scss
+++ b/apps/accessibility/css/highcontrast.scss
@@ -0,0 +1,22 @@
+// SCSS variables
+$color-main-text: #000;
+$color-main-background: #fff;
+
+$color-background-dark: darken($color-main-background, 30%);
+$color-background-darker: darken($color-main-background, 30%);
+
+$color-text-maxcontrast: $color-main-text;
+$color-text-light: $color-main-text;
+$color-text-lighter: $color-main-text;
+
+$color-loading-light: #ddd;
+$color-loading-dark: #000;
+
+$color-box-shadow: $color-main-text;
+
+$color-border: darken($color-main-background, 50%);
+$color-border-dark: darken($color-main-background, 50%);
+
+* {
+	opacity: 1 !important;
+}
\ No newline at end of file
diff --git a/apps/accessibility/css/style.scss b/apps/accessibility/css/style.scss
index f05336e76fac6384aa303702d423bc9c14971195..8c18a628188d8db26908662caf2d4dcc3a269d6f 100644
--- a/apps/accessibility/css/style.scss
+++ b/apps/accessibility/css/style.scss
@@ -1,10 +1,13 @@
 .preview-list {
 	display: flex;
+	flex-wrap: wrap;
 }
 .preview {
 	display: flex;
 	flex-direction: column;
-	width: 300px;
+	min-width: 250px;
+	max-width: 400px;
+	flex: 1 1 300px;
 	border: 1px solid var(--color-border);
 	padding: 10px;
 	border-radius: var(--border-radius);
@@ -12,9 +15,8 @@
 	filter: drop-shadow(0 1px 2px var(--color-box-shadow));
 	background-color: var(--color-main-background);
 	opacity: 0.9;
-	&:not(:last-child) {
-		margin-right: 20px;
-	}
+	margin: 10px;
+	position: relative;
 	&,
 	* {
 		cursor: pointer;
@@ -22,18 +24,30 @@
 	}
 	&:hover,
 	&.selected {
-		background-color: var(--color-background-dark);
 		filter: drop-shadow(0 1px 4px var(--color-box-shadow));
 		opacity: 1;
 	}
 	.preview-image {
-		width: 100%;
-		height: 150px;
-		background-position: center;
+		height: 200px;
+		background-position: top left;
 		background-size: cover;
 		background-repeat: no-repeat;
 	}
 	p {
 		text-align: justify;
 	}
+	.icon-checkmark {
+		position: absolute;
+		width: 50px;
+		height: 50px;
+		background-size: contain;
+		right: -10px;
+		top: -15px;
+		opacity: 0;
+		transition: all 100ms ease-in-out;
+	}
+	&.selected .icon-checkmark {
+		opacity: 1;
+		filter: drop-shadow(0 1px 1px var(--color-box-shadow));
+	}
 }
diff --git a/apps/accessibility/img/theme-highcontrast.jpg b/apps/accessibility/img/theme-highcontrast.jpg
index b47d5acef1f36683027592598f8ae2f0572edf3c..1a7a2de082893efb85ab91c59a85b1832e30be9d 100644
Binary files a/apps/accessibility/img/theme-highcontrast.jpg and b/apps/accessibility/img/theme-highcontrast.jpg differ
diff --git a/apps/accessibility/js/accessibility.js b/apps/accessibility/js/accessibility.js
new file mode 100644
index 0000000000000000000000000000000000000000..bfb8d5d0ce8290ac732e343ae3465689b6b5e89e
Binary files /dev/null and b/apps/accessibility/js/accessibility.js differ
diff --git a/apps/accessibility/js/accessibility.js.map b/apps/accessibility/js/accessibility.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..fe540840a88923ad0c118c0b5533108587ae6f70
Binary files /dev/null and b/apps/accessibility/js/accessibility.js.map differ
diff --git a/apps/accessibility/lib/AppInfo/Application.php b/apps/accessibility/lib/AppInfo/Application.php
index 1c5e4b5cec17e7df9498895d56b3c5f4e508ce6b..dda2fd60698e7c24a6bc592b7255b08576adc101 100644
--- a/apps/accessibility/lib/AppInfo/Application.php
+++ b/apps/accessibility/lib/AppInfo/Application.php
@@ -24,16 +24,32 @@
 namespace OCA\Accessibility\AppInfo;
 
 use OCP\AppFramework\App;
+use OCP\IConfig;
+use OCP\IUserSession;
 
 class Application extends App {
 
 	/** @var string */
 	protected $appName = 'accessibility';
 
+	/** @var IConfig */
+	private $config;
+
+	/** @var IUserSession */
+	private $userSession;
+
 	public function __construct() {
 		parent::__construct($this->appName);
-        
-        // Inject the fake css on all pages
-        \OCP\Util::addStyle('accessibility', 'user', true);
+		$this->config      = \OC::$server->getConfig();
+		$this->userSession = \OC::$server->getUserSession();
+
+		// Inject the fake css on all pages if enabled and user is logged
+		$loggedUser = $this->userSession->getUser();
+		if (!is_null($loggedUser)) {
+			$userValues = $this->config->getUserKeys($loggedUser->getUID(), $this->appName);
+			if(count($userValues) > 0) {
+				\OCP\Util::addStyle($this->appName, 'user-' . md5(implode('-', $userValues)), true);
+			}
+		}
 	}
 }
diff --git a/apps/accessibility/lib/Controller/AccessibilityController.php b/apps/accessibility/lib/Controller/AccessibilityController.php
index ee1f42dfebbfd2a8751e866d61d0633d60c5e904..ff5da9c0827975856916411d84dbbe367ce7dd87 100644
--- a/apps/accessibility/lib/Controller/AccessibilityController.php
+++ b/apps/accessibility/lib/Controller/AccessibilityController.php
@@ -29,6 +29,7 @@ use OCP\AppFramework\Controller;
 use OCP\AppFramework\Http;
 use OCP\AppFramework\Http\DataDisplayResponse;
 use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\App\IAppManager;
 use OCP\IConfig;
 use OCP\ILogger;
 use OCP\IRequest;
@@ -62,6 +63,9 @@ class AccessibilityController extends Controller {
 	/** @var IUserSession */
 	private $userSession;
 
+	/** @var IAppManager */
+	private $appManager;
+
 	/**
 	 * Account constructor.
 	 *
@@ -73,39 +77,43 @@ class AccessibilityController extends Controller {
 	 * @param IURLGenerator $urlGenerator
 	 * @param ITimeFactory $timeFactory
 	 * @param IUserSession $userSession
+	 * @param IAppManager $appManager
 	 */
 	public function __construct(string $appName,
-		IRequest $request,
-		IConfig $config,
-		IUserManager $userManager,
-		ILogger $logger,
-		IURLGenerator $urlGenerator,
-		ITimeFactory $timeFactory,
-		IUserSession $userSession) {
+								IRequest $request,
+								IConfig $config,
+								IUserManager $userManager,
+								ILogger $logger,
+								IURLGenerator $urlGenerator,
+								ITimeFactory $timeFactory,
+								IUserSession $userSession,
+								IAppManager $appManager) {
 		parent::__construct($appName, $request);
+		$this->appName      = $appName;
 		$this->config       = $config;
 		$this->userManager  = $userManager;
 		$this->logger       = $logger;
 		$this->urlGenerator = $urlGenerator;
 		$this->timeFactory  = $timeFactory;
 		$this->userSession  = $userSession;
+		$this->appManager   = $appManager;
 
 		$this->serverRoot = \OC::$SERVERROOT;
-		$this->appRoot    = \OC_App::getAppPath($this->appName);
+		$this->appRoot    = $this->appManager->getAppPath($this->appName);
 	}
 
 	/**
 	 * @NoAdminRequired
 	 * @NoCSRFRequired
 	 *
-	 * @return DataResponse
+	 * @return DataDisplayResponse
 	 */
 	public function getCss(): DataDisplayResponse {
 
 		$css     = '';
 		$imports = '';
 
-		foreach ($this->getUserValues() as $scssFile) {
+		foreach ($this->getUserValues() as $key => $scssFile) {
 			if ($scssFile !== false) {
 				$imports .= '@import "' . $scssFile . '";';
 			}
@@ -122,7 +130,7 @@ class AccessibilityController extends Controller {
 			$scss->setIgnoreErrors(true);
 			$scss->setFormatter(Crunched::class);
 
-			// Compile
+			// Import theme, variables and compile css4 variables
 			try {
 				$css .= $scss->compile(
 					$imports .
@@ -139,9 +147,9 @@ class AccessibilityController extends Controller {
 
 		$response = new DataDisplayResponse($css, Http::STATUS_OK, ['Content-Type' => 'text/css']);
 
+		// Set cache control
 		$ttl = 31536000;
 		$response->addHeader('Cache-Control', 'max-age=' . $ttl . ', immutable');
-
 		$expires = new \DateTime();
 		$expires->setTimestamp($this->timeFactory->getTime());
 		$expires->add(new \DateInterval('PT' . $ttl . 'S'));
@@ -152,13 +160,10 @@ class AccessibilityController extends Controller {
 	}
 
 	private function getUserValues() {
-		$userTheme = $this->config->getUserValue($this->userSession->getUser()->getUID(), 'accessibility', 'theme', false);
-		$userFont  = $this->config->getUserValue($this->userSession->getUser()->getUID(), 'accessibility', 'font', false);
+		$userTheme = $this->config->getUserValue($this->userSession->getUser()->getUID(), $this->appName, 'theme', false);
+		$userFont  = $this->config->getUserValue($this->userSession->getUser()->getUID(), $this->appName, 'font', false);
 
-		return [
-			'theme' => $userTheme,
-			'font'  => $userFont
-		];
+		return [$userTheme, $userFont];
 	}
 
 	private function filterOutRule(string $rule, string $css) {
diff --git a/apps/accessibility/lib/Settings/Personal.php b/apps/accessibility/lib/Settings/Personal.php
index d28625449a7daffb519eb1862fa8b524334bca22..6bce287e6e173614481bd3e78d435b8966a77de0 100644
--- a/apps/accessibility/lib/Settings/Personal.php
+++ b/apps/accessibility/lib/Settings/Personal.php
@@ -83,12 +83,12 @@ class Personal implements ISettings {
 
 		$serverData = [
 			'themes' => $this->accessibilityProvider->getThemes(),
-			'fonts' => $this->accessibilityProvider->getFonts(),
-			'theme' => $this->config->getUserValue($this->userSession->getUser()->getUID(), 'accessibility', 'theme', 'dark'),
-			'font' => $this->config->getUserValue($this->userSession->getUser()->getUID(), 'accessibility', 'font', false)
+			'fonts'  => $this->accessibilityProvider->getFonts(),
+			'theme'  => $this->config->getUserValue($this->userSession->getUser()->getUID(), $this->appName, 'theme', false),
+			'font'   => $this->config->getUserValue($this->userSession->getUser()->getUID(), $this->appName, 'font', false)
 		];
 
-		return new TemplateResponse('accessibility', 'settings-personal', ['serverData' => $serverData]);
+		return new TemplateResponse($this->appName, 'settings-personal', ['serverData' => $serverData]);
 	}
 
 	/**
@@ -96,7 +96,7 @@ class Personal implements ISettings {
 	 * @since 9.1
 	 */
 	public function getSection() {
-		return 'accessibility';
+		return $this->appName;
 	}
 
 	/**
diff --git a/apps/accessibility/lib/Settings/PersonalSection.php b/apps/accessibility/lib/Settings/PersonalSection.php
index bd3afa7935525031e57c77ead81441e027887c38..3e89635c7bbf94570720eadc87b977abbd8c1ff2 100644
--- a/apps/accessibility/lib/Settings/PersonalSection.php
+++ b/apps/accessibility/lib/Settings/PersonalSection.php
@@ -29,6 +29,9 @@ use OCP\Settings\IIconSection;
 
 class PersonalSection implements IIconSection {
 
+	/** @var string */
+	protected $appName;
+
 	/** @var IURLGenerator */
 	private $urlGenerator;
 
@@ -38,11 +41,14 @@ class PersonalSection implements IIconSection {
 	/**
 	 * Personal Section constructor.
 	 *
+	 * @param string $appName
 	 * @param IURLGenerator $urlGenerator
 	 * @param IL10N $l
 	 */
-	public function __construct(IURLGenerator $urlGenerator,
+	public function __construct(string $appName,
+								IURLGenerator $urlGenerator,
 								IL10N $l) {
+		$this->appName      = $appName;
 		$this->urlGenerator = $urlGenerator;
 		$this->l            = $l;
 	}
@@ -55,7 +61,7 @@ class PersonalSection implements IIconSection {
 	 * @since 13.0.0
 	 */
 	public function getIcon() {
-		return $this->urlGenerator->imagePath('accessibility', 'app-dark.svg');
+		return $this->urlGenerator->imagePath($this->appName, 'app-dark.svg');
 	}
 
 	/**
@@ -66,7 +72,7 @@ class PersonalSection implements IIconSection {
 	 * @since 9.1
 	 */
 	public function getID() {
-		return 'accessibility';
+		return $this->appName;
 	}
 
 	/**
diff --git a/apps/accessibility/src/App.vue b/apps/accessibility/src/App.vue
index d83d72b36eb9bf40cefc98885af6ce1d1491d333..7b196f840ab6f4ab8c2c5b1ffc416f64eb91c78f 100644
--- a/apps/accessibility/src/App.vue
+++ b/apps/accessibility/src/App.vue
@@ -62,14 +62,19 @@ export default {
 		},
 
 		/**
-		 * Commit a change
+		 * Commit a change and force reload css
+		 * Fetching the file again will trigger the server update
 		 *
 		 * @param {string} type type of the change (font or theme)
 		 * @param {string} id the data of the change
 		 */
 		selectItem(type, id) {
 			this.serverData[type] = id;
-			console.log(type, id);
+			let cssLink = document.querySelector(
+				'link[rel=stylesheet][href*=accessibility][href*=user-]'
+			);
+			cssLink.href =
+				cssLink.href.split('?')[0] + '?v=' + new Date().getTime();
 		}
 	}
 };
diff --git a/apps/accessibility/src/components/itemPreview.vue b/apps/accessibility/src/components/itemPreview.vue
index 79f3f0494eb245a3b309f145d8d70c9de30a5d52..d1139aa407e05ee5bed89b4b82547103eff01da3 100644
--- a/apps/accessibility/src/components/itemPreview.vue
+++ b/apps/accessibility/src/components/itemPreview.vue
@@ -1,6 +1,7 @@
 <template>
 	<div :class="{preview: true, selected: preview.id === selected}"
 		 @click="selectItem">
+		<div class="icon-checkmark"></div>
 		<div class="preview-image" :style="{backgroundImage: 'url(' + preview.img + ')'}"></div>
 		<h3>{{preview.title}}</h3>
 		<p>{{preview.text}}</p>
diff --git a/apps/accessibility/webpack.common.js b/apps/accessibility/webpack.common.js
index cb38e307cf73cc3dbc0ff7286e160a6e4dc85331..0496ca90fe48b86b31556265cd0531f54f46ecea 100644
--- a/apps/accessibility/webpack.common.js
+++ b/apps/accessibility/webpack.common.js
@@ -1,8 +1,8 @@
 const path = require('path');
-const { VueLoaderPlugin } = require(`vue-loader`);
+const { VueLoaderPlugin } = require('vue-loader');
 
 module.exports = {
-	entry: path.join(__dirname, `src`, `main.js`),
+	entry: path.join(__dirname, 'src', 'main.js'),
 	output: {
 		path: path.resolve(__dirname, './js'),
 		publicPath: '/js/',