diff --git a/frontend-js/.idea/dictionaries/piotr_gawron.xml b/frontend-js/.idea/dictionaries/piotr_gawron.xml
new file mode 100644
index 0000000000000000000000000000000000000000..efca1ca385e9a2c524561d337471a9927a616985
--- /dev/null
+++ b/frontend-js/.idea/dictionaries/piotr_gawron.xml
@@ -0,0 +1,28 @@
+<component name="ProjectDictionaryState">
+  <dictionary name="piotr.gawron">
+    <words>
+      <w>antisense</w>
+      <w>biocompendium</w>
+      <w>chebi</w>
+      <w>chembl</w>
+      <w>drugbank</w>
+      <w>ensembl</w>
+      <w>entrez</w>
+      <w>heterodimer</w>
+      <w>hgnc</w>
+      <w>hmdb</w>
+      <w>interpro</w>
+      <w>isoform</w>
+      <w>kegg</w>
+      <w>lcsb</w>
+      <w>mapviewer</w>
+      <w>omim</w>
+      <w>pubchem</w>
+      <w>pubmed</w>
+      <w>reactome</w>
+      <w>refseq</w>
+      <w>sbgn</w>
+      <w>uniprot</w>
+    </words>
+  </dictionary>
+</component>
\ No newline at end of file
diff --git a/frontend-js/.idea/workspace.xml b/frontend-js/.idea/workspace.xml
index 23e9fb403c2b6fe26a55e72865710b3eadae973f..a74db47d9d25a7972d873da6c1b1c2173761479c 100644
--- a/frontend-js/.idea/workspace.xml
+++ b/frontend-js/.idea/workspace.xml
@@ -6,7 +6,13 @@
   </component>
   <component name="ChangeListManager">
     <list default="true" id="c119f0dd-fdda-4d02-a51e-86bc6ef7e50c" name="Default" comment="">
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/dictionaries/piotr_gawron.xml" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/main/js/map/data/UserPreferences.js" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/src/test/js/map/data/UserPreferences-test.js" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/testFiles/preferences.json" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/test/js/helper.js" afterPath="$PROJECT_DIR$/src/test/js/helper.js" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/../rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java" afterPath="$PROJECT_DIR$/../rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java" />
     </list>
     <ignored path="$PROJECT_DIR$/.tmp/" />
     <ignored path="$PROJECT_DIR$/temp/" />
@@ -20,102 +26,98 @@
   </component>
   <component name="FileEditorManager">
     <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
-      <file leaf-file-name="ServerConnector.js" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/js/ServerConnector.js">
+      <file leaf-file-name="OverviewDialog.js" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/js/gui/OverviewDialog.js">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="15623">
-              <caret line="919" column="18" lean-forward="false" selection-start-line="919" selection-start-column="18" selection-end-line="919" selection-end-column="18" />
+            <state relative-caret-position="0">
+              <caret line="195" column="65" lean-forward="false" selection-start-line="195" selection-start-column="65" selection-end-line="195" selection-end-column="65" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="SessionData.js" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/js/SessionData.js">
+      <file leaf-file-name="AbstractExportPanel.js" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/js/gui/export/AbstractExportPanel.js">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="935">
-              <caret line="55" column="17" lean-forward="false" selection-start-line="55" selection-start-column="17" selection-end-line="55" selection-end-column="17" />
+            <state relative-caret-position="153">
+              <caret line="9" column="42" lean-forward="false" selection-start-line="9" selection-start-column="42" selection-end-line="9" selection-end-column="42" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Configuration.js" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/js/Configuration.js">
+      <file leaf-file-name="PublicationListDialog.js" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/js/gui/leftPanel/PublicationListDialog.js">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="697">
-              <caret line="41" column="27" lean-forward="false" selection-start-line="41" selection-start-column="27" selection-end-line="41" selection-end-column="27" />
+            <state relative-caret-position="1088">
+              <caret line="64" column="48" lean-forward="false" selection-start-line="64" selection-start-column="48" selection-end-line="64" selection-end-column="48" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Functions.js" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/js/Functions.js">
+      <file leaf-file-name="AbstractInfoWindow.js" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/js/map/window/AbstractInfoWindow.js">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="1190">
-              <caret line="70" column="9" lean-forward="false" selection-start-line="70" selection-start-column="9" selection-end-line="70" selection-end-column="9" />
+            <state relative-caret-position="17">
+              <caret line="190" column="16" lean-forward="false" selection-start-line="190" selection-start-column="16" selection-end-line="190" selection-end-column="16" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="OverviewDialog.js" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/js/gui/OverviewDialog.js">
+      <file leaf-file-name="User.js" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/js/map/data/User.js">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="3315">
-              <caret line="195" column="65" lean-forward="false" selection-start-line="195" selection-start-column="65" selection-end-line="195" selection-end-column="65" />
+            <state relative-caret-position="0">
+              <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="AbstractExportPanel.js" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/js/gui/export/AbstractExportPanel.js">
+      <file leaf-file-name="UserPreferences.js" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/js/map/data/UserPreferences.js">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="153">
-              <caret line="9" column="42" lean-forward="false" selection-start-line="9" selection-start-column="42" selection-end-line="9" selection-end-column="42" />
+            <state relative-caret-position="570">
+              <caret line="48" column="0" lean-forward="false" selection-start-line="48" selection-start-column="0" selection-end-line="48" selection-end-column="0" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="PublicationListDialog.js" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/js/gui/leftPanel/PublicationListDialog.js">
+      <file leaf-file-name="assert.js" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/node_modules/chai/lib/chai/interface/assert.js">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="1088">
-              <caret line="64" column="48" lean-forward="false" selection-start-line="64" selection-start-column="48" selection-end-line="64" selection-end-column="48" />
+            <state relative-caret-position="218">
+              <caret line="84" column="30" lean-forward="false" selection-start-line="84" selection-start-column="30" selection-end-line="84" selection-end-column="30" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="AbstractInfoWindow.js" pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/src/main/js/map/window/AbstractInfoWindow.js">
+      <file leaf-file-name="UserPreferences-test.js" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/test/js/map/data/UserPreferences-test.js">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="246">
-              <caret line="190" column="16" lean-forward="true" selection-start-line="190" selection-start-column="16" selection-end-line="190" selection-end-column="16" />
+            <state relative-caret-position="204">
+              <caret line="12" column="23" lean-forward="true" selection-start-line="12" selection-start-column="23" selection-end-line="12" selection-end-column="23" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="minerva.js" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/js/minerva.js">
+      <file leaf-file-name="preferences.json" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/testFiles/preferences.json">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="11135">
-              <caret line="655" column="28" lean-forward="false" selection-start-line="655" selection-start-column="28" selection-end-line="655" selection-end-column="28" />
-              <folding>
-                <marker date="1503677591650" expanded="true" signature="16592:16651" ph="..." />
-                <marker date="1503677591650" expanded="true" signature="19917:19976" ph="..." />
-                <marker date="1503677591650" expanded="true" signature="20784:20843" ph="..." />
-              </folding>
+            <state relative-caret-position="306">
+              <caret line="18" column="6" lean-forward="true" selection-start-line="18" selection-start-column="6" selection-end-line="18" selection-end-column="6" />
+              <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="dual-listbox.js" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/node_modules/dual-listbox/dist/dual-listbox.js">
+      <file leaf-file-name="Submap-test.js" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/test/js/map/Submap-test.js">
           <provider selected="true" editor-type-id="text-editor">
             <state relative-caret-position="0">
               <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
@@ -128,8 +130,6 @@
   </component>
   <component name="FindInProjectRecents">
     <findStrings>
-      <find>self =</find>
-      <find>InvalidArgumentError</find>
       <find>getFileContent</find>
       <find>getConverter</find>
       <find>chai</find>
@@ -158,6 +158,8 @@
       <find>_directeEvidence</find>
       <find>changedToCustimzed</find>
       <find>getParamsgetParams</find>
+      <find>User</find>
+      <find>fs</find>
     </findStrings>
     <replaceStrings>
       <replace>ValidationError</replace>
@@ -168,6 +170,7 @@
       <replace>LEGEND_INDICATORS_OL</replace>
       <replace>_directEvidence</replace>
       <replace>changedToCustomized</replace>
+      <replace>UserPreferences</replace>
     </replaceStrings>
     <dirStrings>
       <dir>C:\Users\piotr.gawron\workspace\MapViewer-parent\frontend-js\src\main\js\gui\leftPanel</dir>
@@ -180,9 +183,6 @@
   <component name="IdeDocumentHistory">
     <option name="CHANGED_PATHS">
       <list>
-        <option value="$PROJECT_DIR$/src/main/js/gui/leftPanel/GuiUtils.js" />
-        <option value="$PROJECT_DIR$/src/main/js/gui/leftPanel/SearchPanel.js" />
-        <option value="$PROJECT_DIR$/src/test/js/map/overlay/UserDbOverlay-test.js" />
         <option value="$PROJECT_DIR$/src/test/js/map/overlay/DrugDbOverlay-test.js" />
         <option value="$PROJECT_DIR$/src/test/js/map/data/ReferenceGenomeGeneMapping-test.js" />
         <option value="$PROJECT_DIR$/src/test/js/map/data/LayoutData-test.js" />
@@ -215,7 +215,6 @@
         <option value="$PROJECT_DIR$/src/test/js/ServerConnector-test.js" />
         <option value="$PROJECT_DIR$/src/test/js/mocha-config.js" />
         <option value="$PROJECT_DIR$/src/test/js/ServerConnector-mock.js" />
-        <option value="$PROJECT_DIR$/src/test/js/helper.js" />
         <option value="$PROJECT_DIR$/src/test/js/gui/LoginDialog-test.js" />
         <option value="$PROJECT_DIR$/src/test/js/gui/CommentDialog-test.js" />
         <option value="$PROJECT_DIR$/src/test/js/gui/leftPanel/GenericSearchPanel-test.js" />
@@ -231,6 +230,10 @@
         <option value="$PROJECT_DIR$/src/test/js/map/data/IdentifiedElement-test.js" />
         <option value="$PROJECT_DIR$/src/test/js/minerva-test.js" />
         <option value="$PROJECT_DIR$/src/main/js/GuiConnector.js" />
+        <option value="$PROJECT_DIR$/src/test/js/helper.js" />
+        <option value="$PROJECT_DIR$/src/main/js/map/data/UserPreferences.js" />
+        <option value="$PROJECT_DIR$/src/test/js/map/data/UserPreferences-test.js" />
+        <option value="$PROJECT_DIR$/testFiles/preferences.json" />
       </list>
     </option>
   </component>
@@ -238,6 +241,13 @@
   <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER">
     <package-json value="$PROJECT_DIR$/package.json" />
   </component>
+  <component name="JsFlowSettings">
+    <service-enabled>true</service-enabled>
+    <exe-path />
+    <annotation-enable>false</annotation-enable>
+    <other-services-enabled>true</other-services-enabled>
+    <auto-save>true</auto-save>
+  </component>
   <component name="JsGulpfileManager">
     <detection-done>true</detection-done>
     <sorting>DEFINITION_ORDER</sorting>
@@ -325,6 +335,11 @@
             <id>XPath</id>
           </State>
         </expanded-state>
+        <selected-state>
+          <State>
+            <id>AngularJS</id>
+          </State>
+        </selected-state>
       </profile-state>
     </entry>
   </component>
@@ -345,7 +360,6 @@
     </navigator>
     <panes>
       <pane id="Scratches" />
-      <pane id="Scope" />
       <pane id="ProjectPane">
         <subPane>
           <expand>
@@ -353,10 +367,81 @@
               <item name="frontend-js" type="b2602c69:ProjectViewProjectNode" />
               <item name="frontend-js" type="462c0819:PsiDirectoryNode" />
             </path>
+            <path>
+              <item name="frontend-js" type="b2602c69:ProjectViewProjectNode" />
+              <item name="frontend-js" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="frontend-js" type="b2602c69:ProjectViewProjectNode" />
+              <item name="frontend-js" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="main" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="frontend-js" type="b2602c69:ProjectViewProjectNode" />
+              <item name="frontend-js" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="main" type="462c0819:PsiDirectoryNode" />
+              <item name="js" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="frontend-js" type="b2602c69:ProjectViewProjectNode" />
+              <item name="frontend-js" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="main" type="462c0819:PsiDirectoryNode" />
+              <item name="js" type="462c0819:PsiDirectoryNode" />
+              <item name="map" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="frontend-js" type="b2602c69:ProjectViewProjectNode" />
+              <item name="frontend-js" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="main" type="462c0819:PsiDirectoryNode" />
+              <item name="js" type="462c0819:PsiDirectoryNode" />
+              <item name="map" type="462c0819:PsiDirectoryNode" />
+              <item name="data" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="frontend-js" type="b2602c69:ProjectViewProjectNode" />
+              <item name="frontend-js" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="test" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="frontend-js" type="b2602c69:ProjectViewProjectNode" />
+              <item name="frontend-js" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="test" type="462c0819:PsiDirectoryNode" />
+              <item name="js" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="frontend-js" type="b2602c69:ProjectViewProjectNode" />
+              <item name="frontend-js" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="test" type="462c0819:PsiDirectoryNode" />
+              <item name="js" type="462c0819:PsiDirectoryNode" />
+              <item name="map" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="frontend-js" type="b2602c69:ProjectViewProjectNode" />
+              <item name="frontend-js" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="test" type="462c0819:PsiDirectoryNode" />
+              <item name="js" type="462c0819:PsiDirectoryNode" />
+              <item name="map" type="462c0819:PsiDirectoryNode" />
+              <item name="data" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="frontend-js" type="b2602c69:ProjectViewProjectNode" />
+              <item name="frontend-js" type="462c0819:PsiDirectoryNode" />
+              <item name="testFiles" type="462c0819:PsiDirectoryNode" />
+            </path>
           </expand>
           <select />
         </subPane>
       </pane>
+      <pane id="Scope" />
     </panes>
   </component>
   <component name="PropertiesComponent">
@@ -365,7 +450,7 @@
     <property name="nodejs_interpreter_path" value="C:/Program Files/nodejs/node" />
     <property name="HbShouldOpenHtmlAsHb" value="" />
     <property name="nodejs.mocha.mocha_node_package_dir" value="$PROJECT_DIR$/node_modules/mocha" />
-    <property name="settings.editor.selected.configurable" value="reference.settings.ide.settings.spelling" />
+    <property name="settings.editor.selected.configurable" value="JavaScript.Libraries" />
     <property name="run.code.analysis.last.selected.profile" value="pProject Default" />
     <property name="node.js.path.for.package.jscs" value="project" />
     <property name="node.js.detected.package.jscs" value="true" />
@@ -379,6 +464,8 @@
   </component>
   <component name="RecentsManager">
     <key name="CopyFile.RECENT_KEYS">
+      <recent name="C:\Users\piotr.gawron\workspace\MapViewer-parent\frontend-js\src\test\js\map\data" />
+      <recent name="C:\Users\piotr.gawron\workspace\MapViewer-parent\frontend-js\src\main\js\map\data" />
       <recent name="C:\Users\piotr.gawron\workspace\MapViewer-parent\frontend-js\testFiles\apiCalls\projects\sample" />
       <recent name="C:\Users\piotr.gawron\workspace\MapViewer-parent\frontend-js\src\main\js" />
       <recent name="C:\Users\piotr.gawron\workspace\MapViewer-parent\frontend-js\src\test\js" />
@@ -396,21 +483,7 @@
       </list>
     </option>
   </component>
-  <component name="RunManager" selected="npm.test">
-    <configuration name="AddProjectDialog" type="mocha-javascript-test-runner" factoryName="Mocha" temporary="true" nameIsGenerated="true">
-      <node-interpreter>project</node-interpreter>
-      <node-options />
-      <working-directory>$PROJECT_DIR$</working-directory>
-      <pass-parent-env>true</pass-parent-env>
-      <envs />
-      <ui>bdd</ui>
-      <extra-mocha-options />
-      <test-kind>SUITE</test-kind>
-      <test-file>$PROJECT_DIR$/src/test/js/gui/admin/AddProjectDialog-test.js</test-file>
-      <test-names>
-        <name value="AddProjectDialog" />
-      </test-names>
-    </configuration>
+  <component name="RunManager" selected="Mocha.UserPreferences.constructor">
     <configuration name="AddProjectDialog.js" type="NodeJSConfigurationType" factoryName="Node.js" temporary="true" path-to-node="project" path-to-js-file="AddProjectDialog.js" working-dir="$PROJECT_DIR$/src/main/js/gui/admin">
       <EXTENSION ID="com.jetbrains.nodejs.remote.docker.NodeJSDockerRunConfigurationExtension">
         <option name="envVars">
@@ -488,6 +561,21 @@
         <name value="toggleLegend" />
       </test-names>
     </configuration>
+    <configuration name="UserPreferences.constructor" type="mocha-javascript-test-runner" factoryName="Mocha" temporary="true" nameIsGenerated="true">
+      <node-interpreter>project</node-interpreter>
+      <node-options />
+      <working-directory>$PROJECT_DIR$</working-directory>
+      <pass-parent-env>true</pass-parent-env>
+      <envs />
+      <ui>bdd</ui>
+      <extra-mocha-options />
+      <test-kind>TEST</test-kind>
+      <test-file>$PROJECT_DIR$/src/test/js/map/data/UserPreferences-test.js</test-file>
+      <test-names>
+        <name value="UserPreferences" />
+        <name value="constructor" />
+      </test-names>
+    </configuration>
     <configuration default="true" type="mocha-javascript-test-runner" factoryName="Mocha">
       <node-interpreter>project</node-interpreter>
       <node-options />
@@ -605,19 +693,19 @@
       <item index="1" class="java.lang.String" itemvalue="Node.js.test without coverage" />
       <item index="2" class="java.lang.String" itemvalue="npm.build-deploy" />
       <item index="3" class="java.lang.String" itemvalue="npm.test" />
-      <item index="4" class="java.lang.String" itemvalue="Mocha.AddProjectDialog" />
-      <item index="5" class="java.lang.String" itemvalue="Mocha.ServerConnector.removeProject.default" />
-      <item index="6" class="java.lang.String" itemvalue="Node.js.GuiConnector.js" />
-      <item index="7" class="java.lang.String" itemvalue="Node.js.AddProjectDialog.js" />
-      <item index="8" class="java.lang.String" itemvalue="Mocha.TopMenu.toggleLegend" />
+      <item index="4" class="java.lang.String" itemvalue="Mocha.ServerConnector.removeProject.default" />
+      <item index="5" class="java.lang.String" itemvalue="Node.js.GuiConnector.js" />
+      <item index="6" class="java.lang.String" itemvalue="Node.js.AddProjectDialog.js" />
+      <item index="7" class="java.lang.String" itemvalue="Mocha.TopMenu.toggleLegend" />
+      <item index="8" class="java.lang.String" itemvalue="Mocha.UserPreferences.constructor" />
     </list>
     <recent_temporary>
       <list size="5">
-        <item index="0" class="java.lang.String" itemvalue="Mocha.TopMenu.toggleLegend" />
-        <item index="1" class="java.lang.String" itemvalue="Mocha.ServerConnector.removeProject.default" />
-        <item index="2" class="java.lang.String" itemvalue="Node.js.AddProjectDialog.js" />
-        <item index="3" class="java.lang.String" itemvalue="Node.js.GuiConnector.js" />
-        <item index="4" class="java.lang.String" itemvalue="Mocha.AddProjectDialog" />
+        <item index="0" class="java.lang.String" itemvalue="Mocha.UserPreferences.constructor" />
+        <item index="1" class="java.lang.String" itemvalue="Mocha.TopMenu.toggleLegend" />
+        <item index="2" class="java.lang.String" itemvalue="Mocha.ServerConnector.removeProject.default" />
+        <item index="3" class="java.lang.String" itemvalue="Node.js.AddProjectDialog.js" />
+        <item index="4" class="java.lang.String" itemvalue="Node.js.GuiConnector.js" />
       </list>
     </recent_temporary>
   </component>
@@ -640,44 +728,45 @@
       <workItem from="1503560609163" duration="22426000" />
       <workItem from="1503648028157" duration="9357000" />
       <workItem from="1503673204553" duration="8891000" />
-      <workItem from="1503992362005" duration="19000" />
+      <workItem from="1503992362005" duration="615000" />
+      <workItem from="1504003657581" duration="4141000" />
     </task>
     <servers />
   </component>
   <component name="TestHistory">
-    <history-entry file="ServerConnector_removeProject_default - 2017.08.25 at 16h 37m 49s.xml">
-      <configuration name="ServerConnector.removeProject.default" configurationId="mocha-javascript-test-runner" />
+    <history-entry file="UserPreferences_constructor - 2017.08.29 at 13h 30m 06s.xml">
+      <configuration name="UserPreferences.constructor" configurationId="mocha-javascript-test-runner" />
     </history-entry>
-    <history-entry file="ServerConnector_removeProject_default - 2017.08.25 at 16h 41m 03s.xml">
-      <configuration name="ServerConnector.removeProject.default" configurationId="mocha-javascript-test-runner" />
+    <history-entry file="UserPreferences_constructor - 2017.08.29 at 13h 30m 37s.xml">
+      <configuration name="UserPreferences.constructor" configurationId="mocha-javascript-test-runner" />
     </history-entry>
-    <history-entry file="ServerConnector_removeProject_default - 2017.08.25 at 16h 42m 01s.xml">
-      <configuration name="ServerConnector.removeProject.default" configurationId="mocha-javascript-test-runner" />
+    <history-entry file="UserPreferences_constructor - 2017.08.29 at 13h 30m 52s.xml">
+      <configuration name="UserPreferences.constructor" configurationId="mocha-javascript-test-runner" />
     </history-entry>
-    <history-entry file="ServerConnector_removeProject_default - 2017.08.25 at 16h 42m 14s.xml">
-      <configuration name="ServerConnector.removeProject.default" configurationId="mocha-javascript-test-runner" />
+    <history-entry file="UserPreferences_constructor - 2017.08.29 at 13h 40m 57s.xml">
+      <configuration name="UserPreferences.constructor" configurationId="mocha-javascript-test-runner" />
     </history-entry>
-    <history-entry file="TopMenu_toggleLegend - 2017.08.25 at 17h 52m 36s.xml">
-      <configuration name="TopMenu.toggleLegend" configurationId="mocha-javascript-test-runner" />
+    <history-entry file="UserPreferences_constructor - 2017.08.29 at 13h 42m 21s.xml">
+      <configuration name="UserPreferences.constructor" configurationId="mocha-javascript-test-runner" />
     </history-entry>
-    <history-entry file="TopMenu_toggleLegend - 2017.08.25 at 17h 53m 16s.xml">
-      <configuration name="TopMenu.toggleLegend" configurationId="mocha-javascript-test-runner" />
+    <history-entry file="UserPreferences_constructor - 2017.08.29 at 13h 42m 45s.xml">
+      <configuration name="UserPreferences.constructor" configurationId="mocha-javascript-test-runner" />
     </history-entry>
-    <history-entry file="TopMenu_toggleLegend - 2017.08.25 at 17h 53m 32s.xml">
-      <configuration name="TopMenu.toggleLegend" configurationId="mocha-javascript-test-runner" />
+    <history-entry file="UserPreferences_constructor - 2017.08.29 at 13h 44m 20s.xml">
+      <configuration name="UserPreferences.constructor" configurationId="mocha-javascript-test-runner" />
     </history-entry>
-    <history-entry file="TopMenu_toggleLegend - 2017.08.25 at 17h 53m 45s.xml">
-      <configuration name="TopMenu.toggleLegend" configurationId="mocha-javascript-test-runner" />
+    <history-entry file="UserPreferences_constructor - 2017.08.29 at 13h 46m 23s.xml">
+      <configuration name="UserPreferences.constructor" configurationId="mocha-javascript-test-runner" />
     </history-entry>
-    <history-entry file="TopMenu_toggleLegend - 2017.08.25 at 17h 55m 56s.xml">
-      <configuration name="TopMenu.toggleLegend" configurationId="mocha-javascript-test-runner" />
+    <history-entry file="UserPreferences_constructor - 2017.08.29 at 13h 46m 37s.xml">
+      <configuration name="UserPreferences.constructor" configurationId="mocha-javascript-test-runner" />
     </history-entry>
-    <history-entry file="TopMenu_toggleLegend - 2017.08.25 at 17h 56m 08s.xml">
-      <configuration name="TopMenu.toggleLegend" configurationId="mocha-javascript-test-runner" />
+    <history-entry file="UserPreferences_constructor - 2017.08.29 at 14h 03m 14s.xml">
+      <configuration name="UserPreferences.constructor" configurationId="mocha-javascript-test-runner" />
     </history-entry>
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="45863000" />
+    <option name="totallyTimeSpent" value="50600000" />
   </component>
   <component name="ToolWindowManager">
     <frame x="-8" y="-8" width="1936" height="1176" extended-state="6" />
@@ -687,8 +776,8 @@
       <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
       <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.5679475" sideWeight="0.33802083" order="7" side_tool="true" content_ui="tabs" />
       <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
+      <window_info id="Run" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.33833176" sideWeight="0.49791667" order="10" side_tool="false" content_ui="tabs" x="-170" y="502" width="1920" height="493" />
       <window_info id="npm" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
-      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33833176" sideWeight="0.49791667" order="10" side_tool="false" content_ui="tabs" x="-170" y="502" width="1920" height="493" />
       <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
       <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" />
@@ -736,48 +825,6 @@
     <watches-manager />
   </component>
   <component name="editorHistoryManager">
-    <entry file="file://$PROJECT_DIR$/src/main/js/map/data/LayoutData.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="229">
-          <caret line="18" column="17" lean-forward="false" selection-start-line="18" selection-start-column="17" selection-end-line="18" selection-end-column="17" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/js/map/data/IdentifiedElement.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="229">
-          <caret line="80" column="18" lean-forward="false" selection-start-line="80" selection-start-column="18" selection-end-line="80" selection-end-column="18" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/js/map/data/BioEntity.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="136">
-          <caret line="8" column="22" lean-forward="false" selection-start-line="8" selection-start-column="22" selection-end-line="8" selection-end-column="22" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/js/map/data/MiRna.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="204">
-          <caret line="12" column="0" lean-forward="true" selection-start-line="12" selection-start-column="0" selection-end-line="12" selection-end-column="0" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/js/map/data/LayoutAlias.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="136">
-          <caret line="8" column="19" lean-forward="false" selection-start-line="8" selection-start-column="19" selection-end-line="8" selection-end-column="19" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/js/map/data/Chemical.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="425">
-          <caret line="31" column="25" lean-forward="false" selection-start-line="31" selection-start-column="25" selection-end-line="31" selection-end-column="25" />
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/src/main/js/map/data/LayoutReaction.js">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="102">
@@ -862,13 +909,6 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/test/js/ServerConnector-mock.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="229">
-          <caret line="51" column="9" lean-forward="false" selection-start-line="51" selection-start-column="9" selection-end-line="51" selection-end-column="9" />
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/src/test/js/logger.js">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="119">
@@ -876,13 +916,6 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/test/js/helper.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="221">
-          <caret line="327" column="4" lean-forward="false" selection-start-line="327" selection-start-column="4" selection-end-line="327" selection-end-column="4" />
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/src/test/js/Functions-test.js">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="375">
@@ -1061,7 +1094,7 @@
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/js/Configuration.js">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="697">
+        <state relative-caret-position="0">
           <caret line="41" column="27" lean-forward="false" selection-start-line="41" selection-start-column="27" selection-end-line="41" selection-end-column="27" />
           <folding />
         </state>
@@ -1077,7 +1110,7 @@
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/js/gui/OverviewDialog.js">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="3315">
+        <state relative-caret-position="0">
           <caret line="195" column="65" lean-forward="false" selection-start-line="195" selection-start-column="65" selection-end-line="195" selection-end-column="65" />
           <folding />
         </state>
@@ -1101,8 +1134,72 @@
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/js/map/window/AbstractInfoWindow.js">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="246">
-          <caret line="190" column="16" lean-forward="true" selection-start-line="190" selection-start-column="16" selection-end-line="190" selection-end-column="16" />
+        <state relative-caret-position="17">
+          <caret line="190" column="16" lean-forward="false" selection-start-line="190" selection-start-column="16" selection-end-line="190" selection-end-column="16" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/js/map/data/User.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/js/helper.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="349">
+          <caret line="383" column="16" lean-forward="true" selection-start-line="383" selection-start-column="16" selection-end-line="383" selection-end-column="16" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/js/ServerConnector-mock.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="439">
+          <caret line="82" column="0" lean-forward="false" selection-start-line="71" selection-start-column="0" selection-end-line="82" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/js/map/Submap-test.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/js/map/data/UserPreferences.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="570">
+          <caret line="48" column="0" lean-forward="false" selection-start-line="48" selection-start-column="0" selection-end-line="48" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/node_modules/chai/lib/chai/interface/assert.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="218">
+          <caret line="84" column="30" lean-forward="false" selection-start-line="84" selection-start-column="30" selection-end-line="84" selection-end-column="30" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/js/map/data/UserPreferences-test.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="204">
+          <caret line="12" column="23" lean-forward="true" selection-start-line="12" selection-start-column="23" selection-end-line="12" selection-end-column="23" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/testFiles/preferences.json">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="306">
+          <caret line="18" column="6" lean-forward="true" selection-start-line="18" selection-start-column="6" selection-end-line="18" selection-end-column="6" />
           <folding />
         </state>
       </provider>
diff --git a/frontend-js/src/main/js/map/data/UserPreferences.js b/frontend-js/src/main/js/map/data/UserPreferences.js
new file mode 100644
index 0000000000000000000000000000000000000000..5a2467eaa76ab190321650e56fd53c285b1001bb
--- /dev/null
+++ b/frontend-js/src/main/js/map/data/UserPreferences.js
@@ -0,0 +1,62 @@
+"use strict";
+
+/* exported logger */
+
+var logger = require('../../logger');
+
+function UserPreferences(javaObject) {
+  if (javaObject !== undefined) {
+    this.setProjectUpload(javaObject["project-upload"]);
+    this.setElementAnnotators(javaObject["element-annotators"]);
+    this.setElementRequiredAnnotations(javaObject["element-required-annotations"]);
+    this.setElementValidAnnotations(javaObject["element-valid-annotations"]);
+  } else {
+    this._projectUpload = {};
+    this._elementAnnotators = {};
+    this._elementRequiredAnnotations = {};
+    this._elementValidAnnotations = {};
+  }
+}
+
+UserPreferences.prototype.setProjectUpload = function (projectUpload) {
+  this._projectUpload = {
+    autoResize: projectUpload["auto-resize"],
+    validateMiriam: projectUpload["validate-miriam"],
+    annotateModel: projectUpload["annotate-model"],
+    cacheData: projectUpload["cache-data"],
+    semanticZooming: projectUpload["semantic-zooming"],
+    sbgn: projectUpload["sbgn"]
+  };
+};
+UserPreferences.prototype.getProjectUpload = function () {
+  return this._projectUpload;
+};
+UserPreferences.prototype.setElementAnnotators = function (elementAnnotators) {
+  this._elementAnnotators = elementAnnotators;
+};
+UserPreferences.prototype.getElementAnnotators = function (className) {
+  return this._elementAnnotators[className];
+};
+UserPreferences.prototype.setElementRequiredAnnotations = function (elementRequiredAnnotations) {
+  this._elementRequiredAnnotations = {};
+  for (var key in elementRequiredAnnotations) {
+    if (elementRequiredAnnotations.hasOwnProperty(key)) {
+      var data = elementRequiredAnnotations[key];
+      this._elementRequiredAnnotations[key] = {
+        requiredAtLeastOnce: data["require-at-least-one"],
+        list: data["annotation-list"]
+      };
+    }
+  }
+};
+UserPreferences.prototype.getElementRequiredAnnotations = function (className) {
+  return this._elementRequiredAnnotations[className];
+};
+UserPreferences.prototype.setElementValidAnnotations = function (elementValidAnnotations) {
+  this._elementValidAnnotations = elementValidAnnotations;
+};
+UserPreferences.prototype.getElementValidAnnotations = function (className) {
+  return this._elementValidAnnotations[className];
+};
+
+module.exports = UserPreferences;
diff --git a/frontend-js/src/test/js/helper.js b/frontend-js/src/test/js/helper.js
index 8082f7c557a6abb31fc60f5a685b0e4f733b4958..e2a1067d19908b2fb3a1f7cfed9dc4ba1153bd8c 100644
--- a/frontend-js/src/test/js/helper.js
+++ b/frontend-js/src/test/js/helper.js
@@ -25,6 +25,7 @@ var SearchDbOverlay = require("../../main/js/map/overlay/SearchDbOverlay");
 var User = require("../../main/js/map/data/User");
 
 var Cookies = require('js-cookie');
+var fs = require('fs');
 
 var GuiConnector = require('../../main/js/GuiConnector');
 
@@ -36,78 +37,78 @@ function Helper(configuration) {
   this.idCounter = 1000000;
 }
 
-Helper.prototype.setConfiguration = function(configuration) {
+Helper.prototype.setConfiguration = function (configuration) {
   this._configuration = configuration;
 };
-Helper.prototype.getConfiguration = function() {
+Helper.prototype.getConfiguration = function () {
   return this._configuration;
 };
 
-Helper.prototype.createCommentDbOverlay = function(map) {
+Helper.prototype.createCommentDbOverlay = function (map) {
   var result = new CommentDbOverlay({
-    map : map,
-    name : "comment",
-    allowGeneralSearch : true
+    map: map,
+    name: "comment",
+    allowGeneralSearch: true
   });
   map.registerDbOverlay(result);
   return result;
 };
 
-Helper.prototype.createSearchDbOverlay = function(map) {
+Helper.prototype.createSearchDbOverlay = function (map) {
   var result = new SearchDbOverlay({
-    map : map,
-    name : "search",
+    map: map,
+    name: "search",
   });
   map.registerDbOverlay(result);
   return result;
 };
 
-Helper.prototype.createDbOverlay = function(map) {
+Helper.prototype.createDbOverlay = function (map) {
   var result = new AbstractDbOverlay({
-    map : map,
-    name : "search",
+    map: map,
+    name: "search",
   });
-  result.clear = function() {
+  result.clear = function () {
     logger.debug("Clear mock");
   };
   map.registerDbOverlay(result);
   return result;
 };
 
-Helper.prototype.createDrugDbOverlay = function(map) {
+Helper.prototype.createDrugDbOverlay = function (map) {
   var result = new DrugDbOverlay({
-    map : map,
-    name : "drug",
-    allowGeneralSearch : true,
-    allowSearchById : true,
+    map: map,
+    name: "drug",
+    allowGeneralSearch: true,
+    allowSearchById: true,
   });
   map.registerDbOverlay(result);
   return result;
 };
 
-Helper.prototype.createChemicalDbOverlay = function(map) {
+Helper.prototype.createChemicalDbOverlay = function (map) {
   var result = new ChemicalDbOverlay({
-    map : map,
-    name : "chemical",
-    allowGeneralSearch : true,
-    allowSearchById : true,
+    map: map,
+    name: "chemical",
+    allowGeneralSearch: true,
+    allowSearchById: true,
   });
   map.registerDbOverlay(result);
   return result;
 };
 
-Helper.prototype.createMiRnaDbOverlay = function(map) {
+Helper.prototype.createMiRnaDbOverlay = function (map) {
   var result = new MiRnaDbOverlay({
-    map : map,
-    name : "mirna",
-    allowGeneralSearch : true,
-    allowSearchById : true,
+    map: map,
+    name: "mirna",
+    allowGeneralSearch: true,
+    allowSearchById: true,
   });
   map.registerDbOverlay(result);
   return result;
 };
 
-Helper.prototype.createComment = function(element) {
+Helper.prototype.createComment = function (element) {
   var elementType = "ALIAS";
   var elementId = this.idCounter++;
   var id = this.idCounter++;
@@ -124,25 +125,25 @@ Helper.prototype.createComment = function(element) {
   }
 
   var result = new Comment({
-    elementId : elementId,
-    type : elementType,
-    modelId : modelId,
-    icon : "icons/comment.png",
-    id : id,
-    pinned : true,
-    coord : {
-      x : 321.5,
-      y : 289.0
+    elementId: elementId,
+    type: elementType,
+    modelId: modelId,
+    icon: "icons/comment.png",
+    id: id,
+    pinned: true,
+    coord: {
+      x: 321.5,
+      y: 289.0
     },
-    removed : false,
-    title : "title fo comment: " + id,
-    content : "content of the comment # " + id
+    removed: false,
+    title: "title fo comment: " + id,
+    content: "content of the comment # " + id
   });
 
   return result;
 };
 
-Helper.prototype.createProject = function() {
+Helper.prototype.createProject = function () {
   var result = new Project();
   result.setProjectId("testId");
   result.setId(this.idCounter++);
@@ -150,17 +151,17 @@ Helper.prototype.createProject = function() {
   return result;
 };
 
-Helper.prototype.createUser = function() {
+Helper.prototype.createUser = function () {
   var result = new User({
-    login : "test_login",
-    id : this.idCounter++,
-    name : "some name",
-    surname : "surname",
+    login: "test_login",
+    id: this.idCounter++,
+    name: "some name",
+    surname: "surname",
   });
   return result;
 };
 
-Helper.prototype.createAlias = function(map) {
+Helper.prototype.createAlias = function (map) {
   var mapId;
   if (map === undefined) {
     mapId = this.idCounter++;
@@ -168,17 +169,17 @@ Helper.prototype.createAlias = function(map) {
     mapId = map.getId();
   }
   var result = new Alias({
-    idObject : this.idCounter++,
-    name : "Test element",
-    type : "RNA",
-    modelId : mapId,
-    bounds : {
-      x : 10.0,
-      y : 20.0,
-      width : 30.0,
-      height : 40.0,
+    idObject: this.idCounter++,
+    name: "Test element",
+    type: "RNA",
+    modelId: mapId,
+    bounds: {
+      x: 10.0,
+      y: 20.0,
+      width: 30.0,
+      height: 40.0,
     },
-    references : [],
+    references: [],
   });
   if (map !== undefined) {
     map.getModel().addAlias(result);
@@ -186,7 +187,7 @@ Helper.prototype.createAlias = function(map) {
   return result;
 };
 
-Helper.prototype.createLayoutAlias = function(alias) {
+Helper.prototype.createLayoutAlias = function (alias) {
   var id;
   if (alias instanceof Alias) {
     id = alias.getId();
@@ -194,17 +195,17 @@ Helper.prototype.createLayoutAlias = function(alias) {
     id = this.idCounter++;
   }
   var result = new LayoutAlias({
-    idObject : id,
-    value : 0.2,
-    color : {
-      a : 23
+    idObject: id,
+    value: 0.2,
+    color: {
+      a: 23
     },
-    geneVariations : [ {} ]
+    geneVariations: [{}]
   });
   return result;
 };
 
-Helper.prototype.createLayoutReaction = function(reaction) {
+Helper.prototype.createLayoutReaction = function (reaction) {
   var reactionId;
   if (reaction instanceof Reaction) {
     reactionId = reaction.getId();
@@ -213,28 +214,28 @@ Helper.prototype.createLayoutReaction = function(reaction) {
   }
 
   var result = new LayoutReaction({
-    idObject : reactionId,
-    width : 3.4,
-    color : {
-      a : 24,
+    idObject: reactionId,
+    width: 3.4,
+    color: {
+      a: 24,
     },
-    reverse : true
+    reverse: true
   });
   return result;
 };
 
-Helper.prototype.createIdentifiedElement = function(element) {
+Helper.prototype.createIdentifiedElement = function (element) {
   if (element === undefined) {
     return new IdentifiedElement({
-      type : "ALIAS",
-      id : this.idCounter++,
-      modelId : this.idCounter++,
+      type: "ALIAS",
+      id: this.idCounter++,
+      modelId: this.idCounter++,
     });
   }
   return new IdentifiedElement(element);
 };
 
-Helper.prototype.createReaction = function(map) {
+Helper.prototype.createReaction = function (map) {
   var mapId = null;
   if (map !== undefined) {
     mapId = map.getId();
@@ -242,49 +243,49 @@ Helper.prototype.createReaction = function(map) {
     mapId = this.idCounter++;
   }
   var result = new Reaction({
-    idObject : this.idCounter++,
-    lines : [ {
-      start : {
-        x : 434.8904109589041,
-        y : 85.0
+    idObject: this.idCounter++,
+    lines: [{
+      start: {
+        x: 434.8904109589041,
+        y: 85.0
       },
-      end : {
-        x : 410.8341500923087,
-        y : 104.95576185524392
+      end: {
+        x: 410.8341500923087,
+        y: 104.95576185524392
       },
-      type : "START"
+      type: "START"
     }, {
-      start : {
-        x : 404.6769250286157,
-        y : 110.06345991944379
+      start: {
+        x: 404.6769250286157,
+        y: 110.06345991944379
       },
-      end : {
-        x : 380.62066416202026,
-        y : 130.0192217746877
+      end: {
+        x: 380.62066416202026,
+        y: 130.0192217746877
       },
-      type : "END"
-    } ],
-    centerPoint : new google.maps.Point(0, 0),
-    modelId : mapId,
-    references : [],
+      type: "END"
+    }],
+    centerPoint: new google.maps.Point(0, 0),
+    modelId: mapId,
+    references: [],
   });
   return result;
 };
 
-Helper.prototype.createOptions = function(project) {
+Helper.prototype.createOptions = function (project) {
   if (project === undefined) {
     project = this.createProject();
   }
 
   var options = {
-    mapDiv : testDiv,
-    element : testDiv,
-    project : project,
+    mapDiv: testDiv,
+    element: testDiv,
+    project: project,
   };
   return options;
 };
 
-Helper.prototype.createModel = function() {
+Helper.prototype.createModel = function () {
   var result = new Model();
   result.setId(this.idCounter++);
   result.setTileSize(256);
@@ -293,16 +294,16 @@ Helper.prototype.createModel = function() {
   result.setMaxZoom(8);
   result.setMinZoom(2);
   result.setCenterLatLng({
-    lat : 10,
-    lng : 20
+    lat: 10,
+    lng: 20
   });
   result.setTopLeftLatLng({
-    lat : 8,
-    lng : 8
+    lat: 8,
+    lng: 8
   });
   result.setBottomRightLatLng({
-    lat : 30,
-    lng : 30
+    lat: 30,
+    lng: 30
   });
 
   var layout = this.createLayout();
@@ -310,51 +311,51 @@ Helper.prototype.createModel = function() {
   return result;
 };
 
-Helper.prototype.createLayout = function() {
+Helper.prototype.createLayout = function () {
   var id = this.idCounter++;
   var layout = new LayoutData({
-    idObject : id,
-    name : "testLayout" + id,
+    idObject: id,
+    name: "testLayout" + id,
   });
   return layout;
 };
 
-Helper.prototype.createGoogleMap = function() {
+Helper.prototype.createGoogleMap = function () {
   var result = new google.maps.Map(testDiv, {
-    center : {
-      lat : -34.397,
-      lng : 150.644
+    center: {
+      lat: -34.397,
+      lng: 150.644
     },
-    scrollwheel : false,
-    zoom : 8
+    scrollwheel: false,
+    zoom: 8
   });
   return result;
 };
 
-Helper.prototype.createCustomMapOptions = function(project) {
+Helper.prototype.createCustomMapOptions = function (project) {
   if (project === undefined) {
     project = this.createProject();
   }
 
   var result = new CustomMapOptions({
-    markerOptimization : true,
-    project : project,
-    element : testDiv,
-    mapDiv : testDiv,
-    configuration : this.getConfiguration(),
+    markerOptimization: true,
+    project: project,
+    element: testDiv,
+    mapDiv: testDiv,
+    configuration: this.getConfiguration(),
   });
 
   return result;
 };
 
-Helper.prototype.createAbstractCustomMap = function() {
+Helper.prototype.createAbstractCustomMap = function () {
   var options = this.createCustomMapOptions();
   var result = new AbstractCustomMap(options.getProject().getModel(), options);
 
   return result;
 };
 
-Helper.prototype.createCustomMap = function(project) {
+Helper.prototype.createCustomMap = function (project) {
   if (project === null) {
     throw new Error("Project cannot be null");
   }
@@ -366,17 +367,29 @@ Helper.prototype.createCustomMap = function(project) {
 /**
  * Changes url but saves the cookies.
  */
-Helper.prototype.setUrl = function(url) {
+Helper.prototype.setUrl = function (url) {
   var cookies = Cookies.get();
   global.dom.reconfigure({
-    url : url
+    url: url
   });
-  for ( var cookie in cookies) {
+  for (var cookie in cookies) {
     Cookies.set(cookie, cookies[cookie]);
   }
   GuiConnector.init();
 };
 
+Helper.prototype.readFile = function (filename) {
+  return new Promise(function (resolve, reject) {
+    fs.readFile(filename, 'utf8', function (err, content) {
+      if (err) {
+        reject(err);
+      } else {
+        resolve(content);
+      }
+    });
+  });
+};
+
 Helper.EPSILON = 1e-6;
 
 module.exports = Helper;
diff --git a/frontend-js/src/test/js/map/data/UserPreferences-test.js b/frontend-js/src/test/js/map/data/UserPreferences-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..2f9c8e86e455206c03fe93135dbd7ce5cfea3fdd
--- /dev/null
+++ b/frontend-js/src/test/js/map/data/UserPreferences-test.js
@@ -0,0 +1,30 @@
+"use strict";
+
+require("../../mocha-config")
+/* exported logger */
+
+var UserPreferences = require('../../../../main/js/map/data/UserPreferences');
+
+var logger = require('../../logger');
+
+var chai = require('chai');
+var assert = chai.assert;
+
+var fs = require('fs');
+var Promise = require('fs');
+
+describe('UserPreferences', function () {
+  it("constructor", function () {
+    return helper.readFile("testFiles/preferences.json").then(function (content) {
+      var object = new UserPreferences(JSON.parse(content));
+      assert.ok(object);
+      assert.notOk(object.getProjectUpload().autoResize);
+      assert.ok(object.getProjectUpload().cacheData);
+
+      assert.ok(object.getElementAnnotators("lcsb.mapviewer.model.map.species.Protein").length > 0);
+      assert.ok(object.getElementValidAnnotations("lcsb.mapviewer.model.map.species.Protein").length > 0);
+      assert.ok(object.getElementRequiredAnnotations("lcsb.mapviewer.model.map.species.Protein").requiredAtLeastOnce);
+      assert.ok(object.getElementRequiredAnnotations("lcsb.mapviewer.model.map.species.Protein").list.length > 0);
+    })
+  });
+});
diff --git a/frontend-js/testFiles/preferences.json b/frontend-js/testFiles/preferences.json
new file mode 100644
index 0000000000000000000000000000000000000000..5f017aff41908460c352cd9f128b38771241ae54
--- /dev/null
+++ b/frontend-js/testFiles/preferences.json
@@ -0,0 +1,753 @@
+{
+  "element-required-annotations": {
+    "lcsb.mapviewer.model.map.reaction.type.UnknownReducedTriggerReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.compartment.BottomSquareCompartment": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.ReducedPhysicalStimulationReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.Chemical": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "CHEBI",
+        "PUBCHEM",
+        "PUBCHEM_SUBSTANCE"
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.Degraded": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.compartment.PathwayCompartment": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.SimpleMolecule": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "CHEBI",
+        "PUBCHEM",
+        "PUBCHEM_SUBSTANCE"
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.BooleanLogicGateReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.ReceptorProtein": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "HGNC",
+        "HGNC_SYMBOL"
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.UnknownTransitionReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.TranscriptionReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.Gene": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "HGNC",
+        "HGNC_SYMBOL"
+      ]
+    },
+    "lcsb.mapviewer.model.map.compartment.OvalCompartment": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.PositiveInfluenceReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.ReducedTriggerReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.Protein": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "HGNC",
+        "HGNC_SYMBOL"
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.UnknownReducedPhysicalStimulationReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.BioEntity": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.GenericProtein": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "HGNC",
+        "HGNC_SYMBOL"
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.TransportReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.IonChannelProtein": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "HGNC",
+        "HGNC_SYMBOL"
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.UnknownReducedModulationReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.Phenotype": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.Drug": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.Element": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.DissociationReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.compartment.SquareCompartment": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.Ion": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "CHEBI",
+        "PUBCHEM",
+        "PUBCHEM_SUBSTANCE"
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.Reaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.HeterodimerAssociationReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.compartment.RightSquareCompartment": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.TranslationReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.UnknownPositiveInfluenceReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.ReducedModulationReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.AntisenseRna": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.Complex": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.Unknown": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.TruncationReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.compartment.LeftSquareCompartment": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.UnknownNegativeInfluenceReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.NegativeInfluenceReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.TruncatedProtein": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "HGNC",
+        "HGNC_SYMBOL"
+      ]
+    },
+    "lcsb.mapviewer.model.map.compartment.Compartment": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.compartment.TopSquareCompartment": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.Species": {
+      "require-at-least-one": true,
+      "annotation-list": [
+      ]
+    },
+    "lcsb.mapviewer.model.map.species.Rna": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "HGNC",
+        "HGNC_SYMBOL"
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.KnownTransitionOmittedReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    },
+    "lcsb.mapviewer.model.map.reaction.type.StateTransitionReaction": {
+      "require-at-least-one": true,
+      "annotation-list": [
+        "PUBMED"
+      ]
+    }
+  },
+  "element-valid-annotations": {
+    "lcsb.mapviewer.model.map.reaction.type.UnknownReducedTriggerReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.compartment.BottomSquareCompartment": [
+      "GO",
+      "MESH_2012",
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.ReducedPhysicalStimulationReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.species.Chemical": [
+      "CHEBI",
+      "HMDB",
+      "KEGG_COMPOUND",
+      "PUBCHEM",
+      "PUBCHEM_SUBSTANCE",
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.species.Degraded": [
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.compartment.PathwayCompartment": [
+      "GO",
+      "MESH_2012",
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.species.SimpleMolecule": [
+      "CHEBI",
+      "HMDB",
+      "KEGG_COMPOUND",
+      "PUBCHEM",
+      "PUBCHEM_SUBSTANCE",
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.BooleanLogicGateReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.species.ReceptorProtein": [
+      "CHEMBL_TARGET",
+      "EC",
+      "ENSEMBL",
+      "ENTREZ",
+      "HGNC",
+      "HGNC_SYMBOL",
+      "INTERPRO",
+      "KEGG_GENES",
+      "MGD",
+      "PANTHER",
+      "PUBMED",
+      "REFSEQ",
+      "UNIPROT",
+      "UNIPROT_ISOFORM"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.UnknownTransitionReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.TranscriptionReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.species.Gene": [
+      "ENSEMBL",
+      "ENTREZ",
+      "HGNC",
+      "HGNC_SYMBOL",
+      "KEGG_GENES",
+      "MGD",
+      "PANTHER",
+      "PUBMED",
+      "REFSEQ",
+      "UNIPROT"
+    ],
+    "lcsb.mapviewer.model.map.compartment.OvalCompartment": [
+      "GO",
+      "MESH_2012",
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.PositiveInfluenceReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.ReducedTriggerReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.species.Protein": [
+      "CHEMBL_TARGET",
+      "EC",
+      "ENSEMBL",
+      "ENTREZ",
+      "HGNC",
+      "HGNC_SYMBOL",
+      "INTERPRO",
+      "KEGG_GENES",
+      "MGD",
+      "PANTHER",
+      "PUBMED",
+      "REFSEQ",
+      "UNIPROT",
+      "UNIPROT_ISOFORM"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.UnknownReducedPhysicalStimulationReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.BioEntity": [
+    ],
+    "lcsb.mapviewer.model.map.species.GenericProtein": [
+      "CHEMBL_TARGET",
+      "EC",
+      "ENSEMBL",
+      "ENTREZ",
+      "HGNC",
+      "HGNC_SYMBOL",
+      "INTERPRO",
+      "KEGG_GENES",
+      "MGD",
+      "PANTHER",
+      "PUBMED",
+      "REFSEQ",
+      "UNIPROT",
+      "UNIPROT_ISOFORM"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.TransportReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.species.IonChannelProtein": [
+      "CHEMBL_TARGET",
+      "EC",
+      "ENSEMBL",
+      "ENTREZ",
+      "HGNC",
+      "HGNC_SYMBOL",
+      "INTERPRO",
+      "KEGG_GENES",
+      "MGD",
+      "PANTHER",
+      "PUBMED",
+      "REFSEQ",
+      "UNIPROT",
+      "UNIPROT_ISOFORM"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.UnknownReducedModulationReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.species.Phenotype": [
+      "GO",
+      "MESH_2012",
+      "OMIM",
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.species.Drug": [
+      "CHEBI",
+      "CHEMBL_COMPOUND",
+      "DRUGBANK",
+      "HMDB",
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.species.Element": [
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.DissociationReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.compartment.SquareCompartment": [
+      "GO",
+      "MESH_2012",
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.species.Ion": [
+      "CHEBI",
+      "HMDB",
+      "KEGG_COMPOUND",
+      "PUBCHEM",
+      "PUBCHEM_SUBSTANCE",
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.reaction.Reaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.HeterodimerAssociationReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.compartment.RightSquareCompartment": [
+      "GO",
+      "MESH_2012",
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.TranslationReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.UnknownPositiveInfluenceReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.ReducedModulationReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.species.AntisenseRna": [
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.species.Complex": [
+      "CHEMBL_TARGET",
+      "EC",
+      "GO",
+      "INTERPRO",
+      "MESH_2012",
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.species.Unknown": [
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.TruncationReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.compartment.LeftSquareCompartment": [
+      "GO",
+      "MESH_2012",
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.UnknownNegativeInfluenceReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.NegativeInfluenceReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.species.TruncatedProtein": [
+      "CHEMBL_TARGET",
+      "EC",
+      "ENSEMBL",
+      "ENTREZ",
+      "HGNC",
+      "HGNC_SYMBOL",
+      "INTERPRO",
+      "KEGG_GENES",
+      "MGD",
+      "PANTHER",
+      "PUBMED",
+      "REFSEQ",
+      "UNIPROT",
+      "UNIPROT_ISOFORM"
+    ],
+    "lcsb.mapviewer.model.map.compartment.Compartment": [
+      "GO",
+      "MESH_2012",
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.compartment.TopSquareCompartment": [
+      "GO",
+      "MESH_2012",
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.species.Species": [
+      "PUBMED"
+    ],
+    "lcsb.mapviewer.model.map.species.Rna": [
+      "ENSEMBL",
+      "ENTREZ",
+      "HGNC",
+      "HGNC_SYMBOL",
+      "KEGG_GENES",
+      "MGD",
+      "PANTHER",
+      "PUBMED",
+      "REFSEQ",
+      "UNIPROT"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.KnownTransitionOmittedReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.StateTransitionReaction": [
+      "KEGG_PATHWAY",
+      "KEGG_REACTION",
+      "PUBMED",
+      "REACTOME"
+    ]
+  },
+  "element-annotators": {
+    "lcsb.mapviewer.model.map.reaction.type.UnknownReducedTriggerReaction": [
+    ],
+    "lcsb.mapviewer.model.map.compartment.BottomSquareCompartment": [
+      "Gene Ontology"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.ReducedPhysicalStimulationReaction": [
+    ],
+    "lcsb.mapviewer.model.map.species.Chemical": [
+      "Chebi"
+    ],
+    "lcsb.mapviewer.model.map.species.Degraded": [
+    ],
+    "lcsb.mapviewer.model.map.compartment.PathwayCompartment": [
+      "Gene Ontology"
+    ],
+    "lcsb.mapviewer.model.map.species.SimpleMolecule": [
+      "Chebi"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.BooleanLogicGateReaction": [
+    ],
+    "lcsb.mapviewer.model.map.species.ReceptorProtein": [
+      "Biocompendium",
+      "HGNC"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.UnknownTransitionReaction": [
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.TranscriptionReaction": [
+    ],
+    "lcsb.mapviewer.model.map.species.Gene": [
+      "HGNC"
+    ],
+    "lcsb.mapviewer.model.map.compartment.OvalCompartment": [
+      "Gene Ontology"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.PositiveInfluenceReaction": [
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.ReducedTriggerReaction": [
+    ],
+    "lcsb.mapviewer.model.map.species.Protein": [
+      "Biocompendium",
+      "HGNC"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.UnknownReducedPhysicalStimulationReaction": [
+    ],
+    "lcsb.mapviewer.model.map.BioEntity": [
+    ],
+    "lcsb.mapviewer.model.map.species.GenericProtein": [
+      "Biocompendium",
+      "HGNC"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.TransportReaction": [
+    ],
+    "lcsb.mapviewer.model.map.species.IonChannelProtein": [
+      "Biocompendium",
+      "HGNC"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.UnknownReducedModulationReaction": [
+    ],
+    "lcsb.mapviewer.model.map.species.Phenotype": [
+      "Gene Ontology"
+    ],
+    "lcsb.mapviewer.model.map.species.Drug": [
+    ],
+    "lcsb.mapviewer.model.map.species.Element": [
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.DissociationReaction": [
+    ],
+    "lcsb.mapviewer.model.map.compartment.SquareCompartment": [
+      "Gene Ontology"
+    ],
+    "lcsb.mapviewer.model.map.species.Ion": [
+      "Chebi"
+    ],
+    "lcsb.mapviewer.model.map.reaction.Reaction": [
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.HeterodimerAssociationReaction": [
+    ],
+    "lcsb.mapviewer.model.map.compartment.RightSquareCompartment": [
+      "Gene Ontology"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.TranslationReaction": [
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.UnknownPositiveInfluenceReaction": [
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.ReducedModulationReaction": [
+    ],
+    "lcsb.mapviewer.model.map.species.AntisenseRna": [
+    ],
+    "lcsb.mapviewer.model.map.species.Complex": [
+      "Gene Ontology"
+    ],
+    "lcsb.mapviewer.model.map.species.Unknown": [
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.TruncationReaction": [
+    ],
+    "lcsb.mapviewer.model.map.compartment.LeftSquareCompartment": [
+      "Gene Ontology"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.UnknownNegativeInfluenceReaction": [
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.NegativeInfluenceReaction": [
+    ],
+    "lcsb.mapviewer.model.map.species.TruncatedProtein": [
+      "Biocompendium",
+      "HGNC"
+    ],
+    "lcsb.mapviewer.model.map.compartment.Compartment": [
+      "Gene Ontology"
+    ],
+    "lcsb.mapviewer.model.map.compartment.TopSquareCompartment": [
+      "Gene Ontology"
+    ],
+    "lcsb.mapviewer.model.map.species.Species": [
+    ],
+    "lcsb.mapviewer.model.map.species.Rna": [
+      "HGNC"
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.KnownTransitionOmittedReaction": [
+    ],
+    "lcsb.mapviewer.model.map.reaction.type.StateTransitionReaction": [
+    ]
+  },
+  "project-upload": {
+    "auto-resize": false,
+    "sbgn": false,
+    "cache-data": true,
+    "semantic-zooming": false,
+    "annotate-model": false,
+    "validate-miriam": false
+  }
+}
\ No newline at end of file
diff --git a/persist/src/db/11.1.0/fix_db_20170829.sql b/persist/src/db/11.1.0/fix_db_20170829.sql
index c5d18a2ac2cca017e749cd449d76970d507c4047..43eead655e216bcbb59e7ed06b9e8befea12e27b 100644
--- a/persist/src/db/11.1.0/fix_db_20170829.sql
+++ b/persist/src/db/11.1.0/fix_db_20170829.sql
@@ -4,3 +4,10 @@ alter table user_annotation_schema_table add column autoresizemap boolean defaul
 alter table user_annotation_schema_table add column cachedata boolean default true;
 alter table user_annotation_schema_table add column semanticzooming boolean default false;
 alter table class_required_annotation_table RENAME column requireatlestoneannotation to requireatleastoneannotation;
+
+-- rename config annotation class name
+update class_annotator_table set classname ='lcsb.mapviewer.model.map.BioEntity' where classname ='lcsb.mapviewer.model.map.AnnotatedObject';
+update class_required_annotation_table set classname ='lcsb.mapviewer.model.map.BioEntity' where classname ='lcsb.mapviewer.model.map.AnnotatedObject';
+update class_valid_annotation_table set classname ='lcsb.mapviewer.model.map.BioEntity' where classname ='lcsb.mapviewer.model.map.AnnotatedObject';
+
+
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java
index 0ed3cd9889fe6e0510dbe6773e1e5e8146a50b03..b3dbe1354330db2b53e19797776072ead5ffca71 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java
@@ -128,7 +128,7 @@ public class UserRestImpl extends BaseRestImpl {
 	private Map<String, Object> prepareValidAnnotations(List<UserClassValidAnnotations> classValidAnnotators) {
 		Map<String, Object> result = new HashMap<>();
 		for (UserClassValidAnnotations userClassAnnotators : classValidAnnotators) {
-			result.put(userClassAnnotators.getClassName(), userClassAnnotators.getValidMiriamTypes());
+			result.put(userClassAnnotators.getClassName(), new ArrayList<>(userClassAnnotators.getValidMiriamTypes()));
 		}
 		return result;
 	}
@@ -158,7 +158,12 @@ public class UserRestImpl extends BaseRestImpl {
 		for (UserClassRequiredAnnotations requiredAnnotations : classRequiredAnnotators) {
 			Map<String, Object> row = new HashMap<>();
 			row.put("require-at-least-one", requiredAnnotations.getRequireAtLeastOneAnnotation());
-			row.put("annotation-list", requiredAnnotations.getRequiredMiriamTypes());
+			List<String> miriamTypes = new ArrayList<>();
+
+			for (MiriamType mt : requiredAnnotations.getRequiredMiriamTypes()) {
+				miriamTypes.add(mt.name());
+			}
+			row.put("annotation-list", miriamTypes);
 			result.put(requiredAnnotations.getClassName(), row);
 		}
 		return result;
@@ -200,7 +205,7 @@ public class UserRestImpl extends BaseRestImpl {
 	private Map<String, Object> prepareElementAnnotators(List<UserClassAnnotators> classAnnotators) {
 		Map<String, Object> result = new HashMap<>();
 		for (UserClassAnnotators userClassAnnotators : classAnnotators) {
-			result.put(userClassAnnotators.getClassName(), userClassAnnotators.getAnnotators());
+			result.put(userClassAnnotators.getClassName(), new ArrayList<>(userClassAnnotators.getAnnotators()));
 		}
 		return result;
 	}