ref #10398: make it configurable how the specimen/taxon rel should be
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / preference / PreferencesUtil.java
index bb2b08ff4ed179ed6dadb1ea5ddc5c15e6943856..194a5edc4ee897af88681a4f4a1a7e4c4265ba37 100644 (file)
  * The contents of this file are subject to the Mozilla Public License Version 1.1
  * See LICENSE.TXT at the top of this package for the full license terms.
  */
-
 package eu.etaxonomy.taxeditor.preference;
 
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.net.URI;
+import java.lang.reflect.Field;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.UUID;
 
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.eclipse.core.runtime.preferences.ConfigurationScope;
 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
 import org.eclipse.equinox.internal.p2.ui.model.MetadataRepositoryElement;
 import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.window.Window;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
 import org.osgi.service.prefs.BackingStoreException;
 import org.osgi.service.prefs.Preferences;
 
+import eu.etaxonomy.cdm.api.application.CdmApplicationState;
 import eu.etaxonomy.cdm.api.application.ICdmRepository;
-import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeConfigurator;
-import eu.etaxonomy.cdm.api.service.ITermService;
 import eu.etaxonomy.cdm.api.service.ITermTreeService;
+import eu.etaxonomy.cdm.api.service.IVocabularyService;
 import eu.etaxonomy.cdm.api.service.config.FindTaxaAndNamesConfiguratorImpl;
 import eu.etaxonomy.cdm.api.service.config.IFindTaxaAndNamesConfigurator;
+import eu.etaxonomy.cdm.api.service.config.SecundumForSubtreeConfigurator;
 import eu.etaxonomy.cdm.common.CdmUtils;
+import eu.etaxonomy.cdm.common.URI;
+import eu.etaxonomy.cdm.facade.DerivedUnitFacadeConfigurator;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.io.specimen.abcd206.in.Abcd206ImportConfigurator;
-import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.cdm.model.common.Language;
 import eu.etaxonomy.cdm.model.common.MarkerType;
+import eu.etaxonomy.cdm.model.description.Feature;
 import eu.etaxonomy.cdm.model.metadata.CdmPreference;
 import eu.etaxonomy.cdm.model.metadata.CdmPreference.PrefKey;
+import eu.etaxonomy.cdm.model.metadata.DistributionDescription;
+import eu.etaxonomy.cdm.model.metadata.EnabledComputedDescription;
 import eu.etaxonomy.cdm.model.metadata.IPreferencePredicate;
 import eu.etaxonomy.cdm.model.metadata.PreferencePredicate;
 import eu.etaxonomy.cdm.model.metadata.PreferenceSubject;
+import eu.etaxonomy.cdm.model.metadata.SecReferenceHandlingEnum;
+import eu.etaxonomy.cdm.model.metadata.SecReferenceHandlingSwapEnum;
 import eu.etaxonomy.cdm.model.metadata.TermDisplayEnum;
+import eu.etaxonomy.cdm.model.metadata.TermOrder;
 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
 import eu.etaxonomy.cdm.model.term.IDefinedTerm;
 import eu.etaxonomy.cdm.model.term.ISimpleTerm;
-import eu.etaxonomy.cdm.model.term.TermBase;
 import eu.etaxonomy.cdm.model.term.TermTree;
+import eu.etaxonomy.cdm.model.term.TermType;
+import eu.etaxonomy.cdm.model.term.TermVocabulary;
+import eu.etaxonomy.cdm.model.term.VocabularyEnum;
+import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
+import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDtoByNameComparator;
+import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDtoByRankAndNameComparator;
+import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDtoNaturalComparator;
 import eu.etaxonomy.cdm.strategy.match.DefaultMatchStrategy;
 import eu.etaxonomy.cdm.strategy.match.FieldMatcher;
 import eu.etaxonomy.cdm.strategy.match.IMatchStrategy;
 import eu.etaxonomy.cdm.strategy.match.MatchException;
 import eu.etaxonomy.cdm.strategy.match.MatchMode;
-import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.editor.definedterm.input.TermEditorInput;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.model.NomenclaturalCodeHelper;
-import eu.etaxonomy.taxeditor.remoting.source.CdmRemoteSource;
+import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
 import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.store.TermStore;
 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
-import eu.etaxonomy.taxeditor.ui.dialog.DefaultLanguageDialog;
 
 /**
- * <p>
- * PreferencesUtil class.
- * </p>
- *
  * @author p.ciardelli
  * @author n.hoffmann
  * @created 05.12.2008
  */
 public class PreferencesUtil implements IPreferenceKeys {
+
+    private final static Logger logger = LogManager.getLogger(PreferencesUtil.class);
+
     private final static String EDITOR_PREFERENCES_NODE = "eu.etaxonomy.taxeditor";
 
     public static final String PREFERRED_TERMS_CHANGE = "preferred_terms";
-
+    public static final String UPDATE_NAVIGATOR = "update_navigator";
     public static final String P2_REPOSITORIES_DELIM = ",";
     public static final String P2_REPOSITORY_FIELDS_DELIM = ";";
     public static final String SUBJECT_DELIM = "/";
-    private final static Logger logger = Logger.getLogger(PreferencesUtil.class);
+
+    private static TermTree<Feature> preferredNameFeatureTree;
+
+    private static TermTree<Feature> preferredTaxonFeatureTree;
+
 
     public static IPreferenceStore getPreferenceStore() {
        return TaxeditorStorePlugin.getDefault().getPreferenceStore();
@@ -109,9 +125,11 @@ public class PreferencesUtil implements IPreferenceKeys {
 
     public static String getPreferenceValue(PrefKey prefKey){
         try {
+            //check if there exist a node for the predicate
             if(getEditorPreferences().nodeExists(prefKey.getPredicate())){
                 Preferences predicateNode = getEditorPreferences().node(prefKey.getPredicate());
                 String[] splittedSubject = extractSubjectParts(prefKey.getSubject());
+                //check if the predicate node contains a node for the subject, this should be the last part
                 String value = predicateNode.get(splittedSubject[splittedSubject.length-1], PreferencePredicate.getByKey(prefKey.getPredicate()).getDefaultValue() != null? PreferencePredicate.getByKey(prefKey.getPredicate()).getDefaultValue().toString(): "");
                 int index = splittedSubject.length -2;
                 while (value != null && index >= 0){
@@ -130,7 +148,7 @@ public class PreferencesUtil implements IPreferenceKeys {
 
     public static List<CdmPreference> getPreference(PreferencePredicate prefPredicate){
         try {
-            List<CdmPreference> prefs = new ArrayList();
+            List<CdmPreference> prefs = new ArrayList<>();
             CdmPreference pref;
             PreferenceSubject subject;
             if(getEditorPreferences().nodeExists(prefPredicate.getKey())){
@@ -144,9 +162,7 @@ public class PreferencesUtil implements IPreferenceKeys {
                     pref = CdmPreference.NewInstance(subject, prefPredicate, value);
                     prefs.add(pref);
                 }
-
             }
-
         } catch (BackingStoreException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
@@ -154,10 +170,6 @@ public class PreferencesUtil implements IPreferenceKeys {
         return null;
     }
 
-    /**
-     * @param childName
-     * @param child
-     */
     private static String createSubjectStringForChildNodes(String subject, Preferences parent) {
         try {
             for (String childName: parent.childrenNames()){
@@ -174,7 +186,7 @@ public class PreferencesUtil implements IPreferenceKeys {
     }
 
     private static String prefKey(String name) {
-        return name + "_"+  ((CdmRemoteSource)CdmStore.getActiveCdmSource()).toString();
+        return name + "_"+  ((ICdmRemoteSource)CdmStore.getActiveCdmSource()).toString();
     }
 
     public static String prefOverrideKey(String name) {
@@ -185,7 +197,7 @@ public class PreferencesUtil implements IPreferenceKeys {
         if (value != null){
             getPreferenceStore().setValue(prefKey(name), value);
         }else{
-            getPreferenceStore().setToDefault(name);
+            getPreferenceStore().setToDefault(prefKey(name));
         }
     }
 
@@ -212,23 +224,37 @@ public class PreferencesUtil implements IPreferenceKeys {
     public static String getStringValue(String name, boolean local) {
 
         CdmPreference pref = getDBPreferenceValue(name);
-        String prefValue = null;
-        String overrideKey =  createPreferenceString(createOverridePreferenceString(name));
-        boolean override = getPreferenceStore().getBoolean(overrideKey);
 
-        if (local || pref == null || (pref != null && pref.isAllowOverride() && override)){
+        boolean override = getOverrideForPreference(name);
+
+        if (local || (pref == null && override)|| (pref != null && pref.isAllowOverride() && override)){
+            //local preference
             String dbSpecific = prefKey(name);
             if (getPreferenceStore().contains(dbSpecific)){
-                prefValue = getPreferenceStore().getString(dbSpecific);
-            }else{
-                prefValue = getPreferenceStore().
-                        getString(name);
+                return getPreferenceStore().getString(dbSpecific);
             }
-       }else if (pref != null){
-           prefValue = pref.getValue();
-       }
-        return prefValue;
-
+         }else if (pref != null){
+             //db preference
+             if (pref.getValue() == null){
+                 Object result = PreferencePredicate.getByKey(pref.getPredicate()).getDefaultValue();
+                 if (result instanceof String){
+                     return (String)result;
+                 }else{
+                     return result != null?result.toString(): null;
+                 }
+             }
+            return pref.getValue();
+        }
+        //no override but default value
+        IPreferencePredicate<?> pred = PreferencePredicate.getByKey(name);
+        if (pred != null){
+            if (pred.getDefaultValue() instanceof String){
+                return (String)pred.getDefaultValue();
+            }else if (pred.getDefaultValue() != null){
+                return pred.getDefaultValue().toString();
+            }
+        }
+        return null;
     }
 
     public static String getStringValue(String name){
@@ -238,20 +264,8 @@ public class PreferencesUtil implements IPreferenceKeys {
     private static CdmPreference getDBPreferenceValue(String name) {
         CdmPreferenceCache cache = CdmPreferenceCache.instance();
         CdmPreference pref = null;
-//
         pref = cache.get(name);
-        if (pref == null ){
-            //get default value for Predicate
-            IPreferencePredicate pred = PreferencePredicate.getByKey(name);
-            if (pred != null){
-                if (pred.getDefaultValue() != null){
-                    pref = CdmPreference.NewTaxEditorInstance(pred, pred.getDefaultValue().toString());
-                }else{
-                    pref = CdmPreference.NewTaxEditorInstance(pred, null);
-                }
-                pref.setAllowOverride(true);
-            }
-        }
+
         return pref;
     }
 
@@ -265,25 +279,36 @@ public class PreferencesUtil implements IPreferenceKeys {
         try{
             result = Integer.parseInt(prefValue);
         }catch(NumberFormatException e){
-            logger.debug("Preference value of " + name + " is not a number");
+            logger.debug("Preference value of " + name + " is not an integer");
         }
 
-        String overrideKey =  createPreferenceString(createOverridePreferenceString(name));
-        boolean override = true;
-        if (getPreferenceStore().contains(overrideKey)){
-            override = getPreferenceStore().getBoolean(overrideKey);
-        }
-        if (local || pref == null || (pref != null && pref.isAllowOverride() && override)){
+        boolean override = getOverrideForPreference(name);
+        if (local || (pref == null && override) || (pref != null && pref.isAllowOverride() && override)){
             String dbSpecific = prefKey(name);
             if (getPreferenceStore().contains(dbSpecific)){
                 result = getPreferenceStore().getInt(dbSpecific);
-            }else{
-                result =  getPreferenceStore().
-                        getInt(name);
+            }
+        }
+        if (result == null){
+            IPreferencePredicate<?> pred = PreferencePredicate.getByKey(name);
+            if (pred != null){
+                if (pred.getDefaultValue() instanceof Integer){
+                    result = (Integer)pred.getDefaultValue();
+                }else if (pred.getDefaultValue() != null){
+                    try{
+                        result = Integer.valueOf(pred.getDefaultValue().toString());
+                    }catch(NumberFormatException e){
+                        logger.debug("Preference value of " + name + " is not a number");
+                        result = 0;
+                    }
+                }
+            }
+            //if no default value available
+            if (result == null){
+                result = 0;
             }
         }
         return result;
-
     }
 
     public static boolean getBooleanValue(String name) {
@@ -293,56 +318,44 @@ public class PreferencesUtil implements IPreferenceKeys {
         }else{
             return result;
         }
-
     }
 
     public static Boolean getBooleanValue(String name, boolean local) {
         if (CdmStore.isActive()){
             CdmPreference pref = getDBPreferenceValue(name);
-
             String overrideKey =  createPreferenceString(createOverridePreferenceString(name));
             boolean override = getPreferenceStore().getBoolean(overrideKey);
-
-            if (local || pref == null || (pref != null && pref.isAllowOverride() && override)){
+            if (local || (pref == null && override)|| (pref != null && pref.isAllowOverride() && override)){
+                //local preference
                 String dbSpecific = prefKey(name);
-                if (getPreferenceStore().contains(dbSpecific)){
-                    return getPreferenceStore().getBoolean(dbSpecific);
-                }else{
-                    return null;
-                }
-             }else{
+                return getPreferenceStore().getBoolean(dbSpecific);
+
+             }else if (pref != null){
+                 //db preference is available and override == false
+                 if (pref.getValue() == null){
+                     Object result = PreferencePredicate.getByKey(pref.getPredicate()).getDefaultValue();
+                     if (result instanceof Boolean){
+                         return (Boolean)result;
+                     }else{
+                         return Boolean.valueOf(result.toString());
+                     }
+                 }
                 return Boolean.valueOf(pref.getValue());
             }
-
+            //no override but default value
+            IPreferencePredicate<?> pred = PreferencePredicate.getByKey(name);
+            if (pred != null){
+                if (pred.getDefaultValue() instanceof Boolean){
+                    return (Boolean)pred.getDefaultValue();
+                }else if (pred.getDefaultValue() != null){
+                    return Boolean.valueOf(pred.getDefaultValue().toString());
+                }
+            }
+            return false;
         }else{
+            // no connection to db, use local preference
             return getPreferenceStore().getBoolean(name);
         }
-
-    }
-
-    public static double getDoubleValue(String name) {
-        CdmPreference pref = getDBPreferenceValue(name);
-        String prefValue = null;
-        if (pref != null){
-            prefValue = pref.getValue();
-        }
-        Double result = null;
-        try{
-            result = Double.parseDouble(prefValue);
-        }catch(NumberFormatException e){
-            logger.debug("Preference value of " + name + " is not a number");
-        }
-        if (result == null){
-            String dbSpecific = prefKey(name);
-            if (getPreferenceStore().contains(dbSpecific)){
-                result = getPreferenceStore().getDouble(dbSpecific);
-            }else{
-                result =  getPreferenceStore().
-                        getDouble(name);
-            }
-        }
-        return result;
-
     }
 
     public static float getFloatValue(String name, boolean local) {
@@ -353,47 +366,29 @@ public class PreferencesUtil implements IPreferenceKeys {
         }
         Float result = null;
         try{
-            result = Float.parseFloat(prefValue);
-        }catch(NumberFormatException e){
-            logger.debug("Preference value of " + name + " is not a number");
-        }
-        String overrideKey =  createPreferenceString(createOverridePreferenceString(name));
-        boolean override = true;
-        if (getPreferenceStore().contains(overrideKey)){
-            override = getPreferenceStore().getBoolean(overrideKey);
-        }
-        if (local || pref == null || (pref != null && pref.isAllowOverride() && override)){
-            String dbSpecific = prefKey(name);
-            if (getPreferenceStore().contains(dbSpecific)){
-                result = getPreferenceStore().getFloat(dbSpecific);
-            }else{
-                result =  getPreferenceStore().
-                        getFloat(name);
+            if (prefValue != null){
+                result = Float.parseFloat(prefValue);
             }
+        }catch(NumberFormatException e){
+            logger.debug("Preference value of " + name + " is not a float");
         }
-        return result;
 
-    }
+        boolean override = getOverrideForPreference(name);
 
-    public static long getLongValue(String name) {
-        CdmPreference pref = getDBPreferenceValue(name);
-        String prefValue = null;
-        if (pref != null){
-            prefValue = pref.getValue();
-        }
-        Long result = null;
-        try{
-            result = Long.parseLong(prefValue);
-        }catch(NumberFormatException e){
-            logger.debug("Preference value of " + name + " is not a number");
-        }
-        if (result == null){
+        if (local || pref == null || (pref.isAllowOverride() && override)){
             String dbSpecific = prefKey(name);
             if (getPreferenceStore().contains(dbSpecific)){
-                result = getPreferenceStore().getLong(dbSpecific);
+                result = getPreferenceStore().getFloat(dbSpecific);
             }else{
-                result =  getPreferenceStore().
-                        getLong(name);
+                IPreferencePredicate<?> pred = PreferencePredicate.getByKey(name);
+                if (pred != null){
+                    if (pred.getDefaultValue() instanceof Float){
+                        return (float)pred.getDefaultValue();
+                    }else if (pred.getDefaultValue() != null){
+                        return Float.valueOf(pred.getDefaultValue().toString());
+                    }
+                }
+                return 0;
             }
         }
         return result;
@@ -402,7 +397,7 @@ public class PreferencesUtil implements IPreferenceKeys {
     public static CdmPreference setPreferredNomenclaturalCode(
             String preferenceValue, boolean local) {
         if (local){
-            setStringValue(PREFERRED_NOMENCLATURAL_CODE_KEY,
+            setStringValue(PreferencePredicate.NomenclaturalCode.getKey(),
                     preferenceValue);
         }
         else{
@@ -424,7 +419,7 @@ public class PreferencesUtil implements IPreferenceKeys {
                 if (preference == null){
                     return null;
                 } else{
-                    setStringValue(PREFERRED_NOMENCLATURAL_CODE_KEY,
+                    setStringValue(PreferencePredicate.NomenclaturalCode.getKey(),
                             preference.getValue());
 
                     return preference;
@@ -436,9 +431,6 @@ public class PreferencesUtil implements IPreferenceKeys {
             }
         }
         return null;
-
-
-
     }
 
     public static void setPreferredNomenclaturalCode(
@@ -449,42 +441,30 @@ public class PreferencesUtil implements IPreferenceKeys {
         if (controller == null){
             return;
         }
-        PrefKey key = null;
-        try{
-            key = CdmPreference.NewKey(PreferenceSubject.NewDatabaseInstance(), PreferencePredicate.NomenclaturalCode);
-        }catch (Exception e){
-            System.out.println(e.getStackTrace());
-        }
-
-        controller.getPreferenceService().set(preference);
-
-    }
-
-    public static NomenclaturalCode getPreferredNomenclaturalCode() {
-
-        CdmPreference pref = getPreferenceFromDB(PreferencePredicate.NomenclaturalCode);
-
-
-        String preferredCode;
-        if(pref == null || (pref.isAllowOverride() && getBooleanValue(prefOverrideKey(PreferencePredicate.NomenclaturalCode.getKey())))){
-            preferredCode = getStringValue(
-                    PreferencePredicate.NomenclaturalCode.getKey(), true);
 
+        if (preference == null){
+            PrefKey key = null;
+              try{
+                  key = CdmPreference.NewKey(PreferenceSubject.NewDatabaseInstance(), PreferencePredicate.NomenclaturalCode);
+              }catch (Exception e){
+                  System.out.println(e.getStackTrace());
+              }
+            controller.getPreferenceService().remove(key);
         }else{
-            preferredCode = pref.getValue();
-        }
-        if (StringUtils.isBlank(preferredCode)){
-            preferredCode = getPreferenceKey((NomenclaturalCode)PreferencePredicate.NomenclaturalCode.getDefaultValue());
+            controller.getPreferenceService().set(preference);
         }
+    }
 
-        return getPreferredNomenclaturalCode(preferredCode);
+    public static NomenclaturalCode getPreferredNomenclaturalCode() {
 
+        String nomString = getStringValue(PreferencePredicate.NomenclaturalCode.getKey());
+        return getPreferredNomenclaturalCode(nomString);
     }
 
     public static NomenclaturalCode getPreferredNomenclaturalCode(String preferenceKeyNomenclaturalCode) {
 
         for (NomenclaturalCode code : NomenclaturalCodeHelper.getAllCodes()) {
-            if (getPreferenceKey(code).equals(preferenceKeyNomenclaturalCode)) {
+            if (getPreferenceKey(code).equals(preferenceKeyNomenclaturalCode) || code.getKey().equals(preferenceKeyNomenclaturalCode)) {
                 return code;
             }
         }
@@ -511,7 +491,7 @@ public class PreferencesUtil implements IPreferenceKeys {
         return result;
     }
 
-    public static CdmPreference getPreferenceFromDB(IPreferencePredicate predicate){
+    public static CdmPreference getPreferenceFromDB(IPreferencePredicate<?> predicate){
         ICdmRepository controller;
         CdmPreference pref = null;
 
@@ -526,10 +506,9 @@ public class PreferencesUtil implements IPreferenceKeys {
         }
 
         return pref;
-
     }
 
-    public static List<CdmPreference> getPreferencesFromDB(IPreferencePredicate predicate){
+    public static List<CdmPreference> getPreferencesFromDB(IPreferencePredicate<?> predicate){
         ICdmRepository controller;
         List<CdmPreference> prefs = null;
 
@@ -562,9 +541,6 @@ public class PreferencesUtil implements IPreferenceKeys {
         }catch(Exception e){
             e.printStackTrace();
         }
-
-
-
     }
 
     public static CdmPreference getPreferenceFromDB(PrefKey key){
@@ -599,19 +575,39 @@ public class PreferencesUtil implements IPreferenceKeys {
         }catch(Exception e){
             e.printStackTrace();
         }
-
     }
 
     public static String getPreferredDefaultLangugae(){
-        String preferredLanguage = getStringValue(DEFAULT_LANGUAGE_EDITOR);
+        String preferredLanguage = getStringValue(DEFAULT_LANGUAGE_EDITOR, true);
         if(StringUtils.isNotEmpty(preferredLanguage) && StringUtils.isNotBlank(preferredLanguage)){
             return preferredLanguage;
         }
         return null;
     }
 
+    public static Language getPreferredDefaultLanguage(){
+        
+        String prop = System.getProperty("osgi.nl");
+        if (prop.startsWith("de")) {
+            return Language.GERMAN();
+        }else {
+            return Language.ENGLISH();
+        }
+//        String preferredLanguage = getStringValue(DEFAULT_LANGUAGE_EDITOR, true);
+//        if(StringUtils.isNotEmpty(preferredLanguage) && StringUtils.isNotBlank(preferredLanguage)){
+//            if (preferredLanguage.equals(Language.uuidEnglish.toString())) {
+//             return Language.ENGLISH();
+//            }else if (preferredLanguage.equals(Language.uuidGerman.toString())) {
+//             return Language.GERMAN();
+//            }else {
+//             return Language.ENGLISH();
+//            }
+//        }
+//        return Language.getDefaultLanguage();
+    }
+
     public static boolean isShowMediaPreview(){
-        boolean isShowMediaPreview = getBooleanValue(SHOW_MEDIA_PREVIEW);
+        boolean isShowMediaPreview = getBooleanValue(SHOW_MEDIA_PREVIEW, true);
         return isShowMediaPreview;
     }
 
@@ -625,14 +621,14 @@ public class PreferencesUtil implements IPreferenceKeys {
      */
     public static IMatchStrategy getMatchStrategy(Class<?> clazz) {
         String className = clazz.getName();
-        if (getBooleanValue(MATCH_STRATEGY_PREFIX + className)) {
+        if (getBooleanValue(MATCH_STRATEGY_PREFIX + className, true)) {
             IMatchStrategy matchStrategy = getDefaultMatchStrategy(clazz);
 
             //TODO CacheMatchers (or multiple field matchers in future) are missing here
             for (FieldMatcher fieldMatcher : matchStrategy.getMatching().getFieldMatchers(false)) {
                 String fieldName = fieldMatcher.getPropertyName();
                 String matchModeName = getStringValue(
-                        getMatchStrategyFieldName(className, fieldName));
+                        getMatchStrategyFieldName(className, fieldName), true);
                 MatchMode matchMode = MatchMode.valueOf(matchModeName);
                 try {
                     matchStrategy.setMatchMode(fieldName, matchMode);
@@ -697,64 +693,28 @@ public class PreferencesUtil implements IPreferenceKeys {
         return pattern;
     }
 
-    public static <T extends TermBase> void addTermToPreferredTerms(T term) {
-
-        // VocabularyEnum vocabulary =
-        // VocabularyEnum.getVocabularyEnum(term.getClass());
-        //
-        // getPreferenceStore().setValue(getPreferenceKey(term),
-        // VocabularyStore.getTermVocabulary(vocabulary).getTerms().contains(term));
-        //
-        // firePreferencesChanged(term.getClass());
-    }
-
     /**
      * Construct a unique key using the CdmBase object's uuid
-     *
-     * @param cdmBase
-     * @return
-     */
-    private static String getPreferenceKey(ICdmBase cdmBase) {
-        cdmBase = HibernateProxyHelper.deproxy(cdmBase);
-
-        String key = cdmBase.getClass().getName().concat(".")
-                .concat(cdmBase.getUuid().toString());
-        if (key.contains("javassist")) {
-            MessagingUtils.info("proxy");
-        }
-        return key;
-    }
-
-    /**
-     * Construct a unique key using the CdmBase object's uuid
-     *
-     * @param cdmBase
-     * @return
      */
-    public static String getPreferenceKey(ISimpleTerm simpleTerm) {
+    public static String getPreferenceKey(ISimpleTerm<?> simpleTerm) {
         simpleTerm = HibernateProxyHelper.deproxy(simpleTerm);
         String key = simpleTerm.getClass().getName().concat(".")
                 .concat(simpleTerm.getUuid().toString());
-        if (key.contains("javassist")) {
+        if (key.contains("javassist")) { //Note by AM (2022-06): javassist is not used anymore, instead hibernate uses bytebuddy which is not contained in class names so this logging will not work anymore
             MessagingUtils.warn(PreferencesUtil.class,
                     "Trying to persist a preference based on a proxy class.");
         }
         return key;
     }
 
-
-
     /**
      * Construct a unique key using the CdmBase object's uuid
-     *
-     * @param cdmBase
-     * @return
      */
     public static String getPreferenceKey(IDefinedTerm definedTerm) {
         definedTerm = HibernateProxyHelper.deproxy(definedTerm);
         String key = definedTerm.getClass().getName().concat(".")
                 .concat(definedTerm.getUuid().toString());
-        if (key.contains("javassist")) {
+        if (key.contains("javassist")) { //Note by AM (2022-06): javassist is not used anymore, instead hibernate uses bytebuddy which is not contained in class names so this logging will not work anymore
             MessagingUtils.warn(PreferencesUtil.class,
                     "Trying to persist a preference based on a proxy class.");
         }
@@ -769,14 +729,18 @@ public class PreferencesUtil implements IPreferenceKeys {
     public static IFindTaxaAndNamesConfigurator getSearchConfigurator() {
         IFindTaxaAndNamesConfigurator configurator = initializeSearchConfigurator();
 
-        configurator.setDoTaxa(getBooleanValue(
-                TAXON_SERVICE_CONFIGURATOR_TAXA));
-        configurator.setDoSynonyms(getBooleanValue(
-                TAXON_SERVICE_CONFIGURATOR_SYNONYMS));
-        configurator.setDoNamesWithoutTaxa(getBooleanValue(
-                TAXON_SERVICE_CONFIGURATOR_NAMES));
-        configurator.setDoTaxaByCommonNames(getBooleanValue(
-                TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES));
+        configurator.setDoTaxa(PreferencesUtil.getPreferenceStore().contains(IPreferenceKeys.TAXON_SERVICE_CONFIGURATOR_TAXA)? PreferencesUtil.getPreferenceStore().getBoolean(
+                IPreferenceKeys.TAXON_SERVICE_CONFIGURATOR_TAXA): true);
+        configurator.setDoSynonyms(PreferencesUtil.getPreferenceStore().contains(IPreferenceKeys.TAXON_SERVICE_CONFIGURATOR_SYNONYMS)? PreferencesUtil.getPreferenceStore().getBoolean(
+                IPreferenceKeys.TAXON_SERVICE_CONFIGURATOR_SYNONYMS): true);
+        configurator.setDoNamesWithoutTaxa(PreferencesUtil.getPreferenceStore().contains(IPreferenceKeys.TAXON_SERVICE_CONFIGURATOR_NAMES)? PreferencesUtil.getPreferenceStore().getBoolean(
+                IPreferenceKeys.TAXON_SERVICE_CONFIGURATOR_NAMES): true);
+        configurator.setDoTaxaByCommonNames(PreferencesUtil.getPreferenceStore().contains(IPreferenceKeys.TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES)? PreferencesUtil.getPreferenceStore().getBoolean(
+                IPreferenceKeys.TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES): true);
+        configurator.setDoIncludeAuthors(PreferencesUtil.getPreferenceStore().contains(IPreferenceKeys.TAXON_SERVICE_CONFIGURATOR_WITH_AUTHORS)? PreferencesUtil.getPreferenceStore().getBoolean(
+                IPreferenceKeys.TAXON_SERVICE_CONFIGURATOR_WITH_AUTHORS): false);
+        configurator.setIncludeUnpublished(PreferencesUtil.getPreferenceStore().contains(IPreferenceKeys.TAXON_SERVICE_CONFIGURATOR_UNPUBLISHED)? PreferencesUtil.getPreferenceStore().getBoolean(
+                IPreferenceKeys.TAXON_SERVICE_CONFIGURATOR_UNPUBLISHED): true);
         //configurator.setMatchMode(eu.etaxonomy.cdm.persistence.query.MatchMode.valueOf(getStringValue(TAXON_SERVICE_CONFIGURATOR_MATCH_MODE)));
 
         return configurator;
@@ -796,7 +760,8 @@ public class PreferencesUtil implements IPreferenceKeys {
         configurator.setDoSynonyms(true);
         configurator.setDoNamesWithoutTaxa(true);
         configurator.setDoTaxaByCommonNames(true);
-
+        configurator.setIncludeUnpublished(true);
+        configurator.setDoIncludeAuthors(false);
         configurator.setTaxonPropertyPath(Arrays.asList("$", "titleCache",
                 "name", "name.$", "relationsFromThisTaxon.$"));
 
@@ -834,6 +799,10 @@ public class PreferencesUtil implements IPreferenceKeys {
                 configurator.isDoNamesWithoutTaxa());
         getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES,
                 configurator.isDoTaxaByCommonNames());
+        getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_WITH_AUTHORS,
+                configurator.isDoIncludeAuthors());
+        getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_UNPUBLISHED,
+                configurator.isIncludeUnpublished());
     }
 
     public static void firePreferencesChanged(Class clazz) {
@@ -841,44 +810,44 @@ public class PreferencesUtil implements IPreferenceKeys {
                 null, clazz);
     }
 
+    public static void firePreferencesChangedForNavigator() {
+        getPreferenceStore().firePropertyChangeEvent(UPDATE_NAVIGATOR,
+                null, null);
+    }
+
 
     public static String createPreferenceString(String property){
        return prefKey(property);
-
     }
     public static String createOverridePreferenceString(String property){
            return prefOverrideKey(property);
+    }
 
-        }
+    public static boolean getOverrideForPreference(String preferenceString){
+        return PreferencesUtil.getBooleanValue(PreferencesUtil.createOverridePreferenceString(preferenceString), true);
+    }
 
     /**
      * Set default values for preferences
      */
     public static void setDefaults() {
-        getPreferenceStore().setDefault(TAXON_SERVICE_CONFIGURATOR_TAXA, true);
-        getPreferenceStore().setDefault(TAXON_SERVICE_CONFIGURATOR_SYNONYMS,
-                true);
-        getPreferenceStore().setDefault(createPreferenceString(EDIT_MAP_SERVICE_ACCES_POINT),
+
+        getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.EditMapServiceAccessPoint.getKey()),
                 "http://edit.africamuseum.be/edit_wp5/v1.2/rest_gen.php");
         //FIXME : changed default for SHOULD_CONNECT_AT_STARTUP to false (ticket 3828) until resolution
         getPreferenceStore().setDefault(createPreferenceString(SHOULD_CONNECT_AT_STARTUP), false);
-        getPreferenceStore().setDefault(createPreferenceString(OPENURL_ACCESS_POINT),
+        getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.MobotOpenUrlServiceAccessPoint.getKey()),
                 "http://www.biodiversitylibrary.org/openurl");
-        getPreferenceStore().setDefault(createPreferenceString(OPENURL_IMAGE_MAX_WIDTH), "1000");
-        getPreferenceStore().setDefault(createPreferenceString(OPENURL_IMAGE_MAX_HEIGHT), "1000");
+        getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.MobotOpenUrlServiceMaxWidth.getKey()), "1000");
+        getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.MobotOpenUrlServiceMaxHeight.getKey()), "1000");
         getPreferenceStore().setDefault(TAXON_SERVICE_CONFIGURATOR_TAXA, true);
         getPreferenceStore().setDefault(TAXON_SERVICE_CONFIGURATOR_SYNONYMS, true);
         getPreferenceStore().setDefault(TAXON_SERVICE_CONFIGURATOR_NAMES, true);
         getPreferenceStore().setDefault(TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES, true);
-
-        //Distribution Editor:
-//      getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.DistributionEditorActivated.getKey()), Boolean.valueOf(PreferencePredicate.DistributionEditorActivated.getDefaultValue().toString()));
-//      getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.DisplayOfAreasInDistributionEditor.getKey()), PreferencePredicate.DisplayOfAreasInDistributionEditor.getDefaultValue().toString());
-//      getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.DisplayOfStatus.getKey()), PreferencePredicate.DisplayOfStatus.getDefaultValue().toString());
-
+        getPreferenceStore().setDefault(TAXON_SERVICE_CONFIGURATOR_WITH_AUTHORS, false);
 
         //Name Details
-        getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.NameDetailsView.getKey()), new NameDetailsConfigurator(false).toString());
+       // getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.NameDetailsView.getKey()), new NameDetailsConfigurator(false).toString());
 
         //Navigator preferences
         getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.TaxonNodeOrder.getKey()), NavigatorOrderEnum.RankAndNameOrder.getKey());
@@ -890,21 +859,22 @@ public class PreferencesUtil implements IPreferenceKeys {
         getPreferenceStore().setDefault(createPreferenceString(SHOW_MEDIA_PREVIEW), false);
         //override db preferences
         getPreferenceStore().setDefault(createPreferenceString(prefOverrideKey(PreferencePredicate.AbcdImportConfig.getKey())), false);
-        getPreferenceStore().setDefault(createPreferenceString(prefOverrideKey(PreferencePredicate.ShowSpecimen.getKey())), true);
         getPreferenceStore().setDefault(createPreferenceString(prefOverrideKey(PreferencePredicate.NameDetailsView.getKey())), false);
-        getPreferenceStore().setDefault(createPreferenceString(prefOverrideKey(PreferencePredicate.DistributionEditorActivated.getKey())), true);
-        getPreferenceStore().setDefault(createPreferenceString(prefOverrideKey(PreferencePredicate.AvailableDistributionStatus.getKey())), true);
-        getPreferenceStore().setDefault(createPreferenceString(prefOverrideKey(PreferencePredicate.AvailableDistributionAreaTerms.getKey())), true);
-        getPreferenceStore().setDefault(createPreferenceString(prefOverrideKey(PreferencePredicate.AvailableDistributionAreaVocabularies.getKey())), true);
         getPreferenceStore().setDefault(createPreferenceString(prefOverrideKey(PreferencePredicate.CommonNameAreaVocabularies.getKey())), false);
-        getPreferenceStore().setDefault(createPreferenceString(FILTER_COMMON_NAME_REFERENCES), false);
+        getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.CommonNameReferencesWithMarker.getKey()), false);
         getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.ShowTaxonNodeWizard.getKey()), Boolean.valueOf(PreferencePredicate.ShowTaxonNodeWizard.getDefaultValue().toString()));
         getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.ShowNamespaceInSource.getKey()), Boolean.valueOf(PreferencePredicate.ShowNamespaceInSource.getDefaultValue().toString()));
         getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.ShowIdInSource.getKey()), Boolean.valueOf(PreferencePredicate.ShowIdInSource.getDefaultValue().toString()));
         getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.DisableMultiClassification.getKey()), Boolean.valueOf(PreferencePredicate.DisableMultiClassification.getDefaultValue().toString()));
         getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.ShowImportExportMenu.getKey()), Boolean.valueOf(PreferencePredicate.ShowImportExportMenu.getDefaultValue().toString()));
         getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.ShowSpecimen.getKey()), Boolean.valueOf(PreferencePredicate.ShowSpecimen.getDefaultValue().toString()));
-
+        getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.SearchForIdentifierAndTitleCache.getKey()), Boolean.valueOf(PreferencePredicate.SearchForIdentifierAndTitleCache.getDefaultValue().toString()));
+        getPreferenceStore().setDefault(createPreferenceString(prefOverrideKey(PreferencePredicate.SearchForIdentifierAndTitleCache.getKey())), false);
+        getPreferenceStore().setDefault(createPreferenceString(PreferencePredicate.SearchForIdentifierAsDefault.getKey()), Boolean.valueOf(PreferencePredicate.SearchForIdentifierAsDefault.getDefaultValue().toString()));
+        getPreferenceStore().setDefault(createPreferenceString(prefOverrideKey(PreferencePredicate.SearchForIdentifierAsDefault.getKey())), false);
+        getPreferenceStore().setDefault(createPreferenceString(prefOverrideKey(PreferencePredicate.ShowModifierFreeText.getKey())), false);
+        getPreferenceStore().setDefault(createPreferenceString(prefOverrideKey(PreferencePredicate.ShowModifier.getKey())), false);
+        getPreferenceStore().setDefault(createPreferenceString(prefOverrideKey(PreferencePredicate.DistributionEditorActivated.getKey())), false);
     }
 
     public static void checkNomenclaturalCode() {
@@ -912,10 +882,8 @@ public class PreferencesUtil implements IPreferenceKeys {
         if (PreferencesUtil.getPreferredNomenclaturalCode() == null) {
             PreferencesUtil.setPreferredNomenclaturalCode(getPreferenceKey(NomenclaturalCode.ICNAFP), true);
         }
-
-
-
     }
+
     public static void setNomenclaturalCodePreferences(){
         ICdmRepository controller;
         controller = CdmStore.getCurrentApplicationConfiguration();
@@ -934,26 +902,25 @@ public class PreferencesUtil implements IPreferenceKeys {
         UUID uuid = UUID.fromString(preference.getValue().substring(index +1, preference.getValue().length()));
         NomenclaturalCode preferredCode = NomenclaturalCode.getByUuid(uuid);
 
-        setStringValue(PREFERRED_NOMENCLATURAL_CODE_KEY,
+        setStringValue(PreferencePredicate.NomenclaturalCode.getKey(),
                 getPreferenceKey(preferredCode));
-
     }
 
-    public static void checkDefaultLanguage(){
-        if(PreferencesUtil.getPreferredDefaultLangugae() == null){
-           Shell shell = AbstractUtility.getShell();
-           int open = new DefaultLanguageDialog(shell).open();
-           if(open == Window.OK){
-               PlatformUI.getWorkbench().restart();
-           }
-        }else{
-            //TODO:In case of a reinstall, the config.ini will be overwritten
-            //     here you create config.ini with the stored key from preferences
-        }
-    }
+//    public static void checkDefaultLanguage(){
+//        if(PreferencesUtil.getPreferredDefaultLangugae() == null){
+//           Shell shell = AbstractUtility.getShell();
+//           int open = new DefaultLanguageDialog(shell).open();
+//           if(open == Window.OK){
+//               PlatformUI.getWorkbench().restart();
+//           }
+//        }else{
+//            //TODO:In case of a reinstall, the config.ini will be overwritten
+//            //     here you create config.ini with the stored key from preferences
+//        }
+//    }
 
     public static String getMapServiceAccessPoint() {
-        return getStringValue(EDIT_MAP_SERVICE_ACCES_POINT);
+        return getStringValue(PreferencePredicate.EditMapServiceAccessPoint.getKey());
     }
 
     public static boolean shouldConnectAtStartUp() {
@@ -962,78 +929,85 @@ public class PreferencesUtil implements IPreferenceKeys {
         return false;
     }
 
-    public static TermTree getDefaultFeatureTreeForTextualDescription() {
+    public static TermTree<?> getDefaultFeatureTreeForTextualDescription() {
         String uuidString = getStringValue(
-                FEATURE_TREE_DEFAULT_TEXT);
+                FEATURE_TREE_DEFAULT_TEXT, true);
         if (StringUtils.isBlank(uuidString)) {
             return null;
         }
-        TermTree tree = CdmStore.getService(
+        TermTree<?> tree = CdmStore.getService(
                 ITermTreeService.class).load(UUID.fromString(uuidString));
-        if (tree.getId() == 0) {
+
+        if (tree == null || tree.getId() == 0) {
             return null;
         }
         return tree;
     }
 
-    public static TermTree getDefaultFeatureTreeForStructuredDescription() {
+    public static TermTree<?> getDefaultFeatureTreeForStructuredDescription() {
         String uuidString = getStringValue(
-                FEATURE_TREE_DEFAULT_STRUCTURE);
+                FEATURE_TREE_DEFAULT_STRUCTURE, true);
         return StringUtils.isBlank(uuidString) ? null : CdmStore.getService(
                 ITermTreeService.class).load(UUID.fromString(uuidString));
     }
 
     public static void setSortRanksHierarchichally(boolean selection) {
-        setBooleanValue(SORT_RANKS_HIERARCHICHALLY, selection);
+        setBooleanValue(PreferencePredicate.SortRanksHierarchichally.getKey(), selection);
     }
 
     public static boolean getSortRanksHierarchichally() {
-        return getBooleanValue(SORT_RANKS_HIERARCHICHALLY);
+        return getBooleanValue(PreferencePredicate.SortRanksHierarchichally.getKey());
     }
 
     public static boolean isMultilanguageTextEditingCapability() {
         return getBooleanValue(
-                MULTILANGUAGE_TEXT_EDITING_CAPABILITY);
+                PreferencePredicate.MultiLanguageTextEditing.getKey());
     }
 
     public static Language getGlobalLanguage() {
 
-
         String languageUuidString = getStringValue(
-                GLOBAL_LANGUAGE_UUID);
+                PreferencePredicate.TermLanguage.getKey(), true);
 
-        if(!CdmStore.isActive()) {
-            MessagingUtils.noDataSourceWarningDialog(languageUuidString);
-            return null;
-        }
+        CdmPreference dbPref = getDBPreferenceValue(PreferencePredicate.TermLanguage.getKey());
 
-        if (CdmUtils.isBlank(languageUuidString)) {
-            return Language.getDefaultLanguage();
+        if (dbPref == null || (dbPref != null && dbPref.isAllowOverride() && getOverrideForPreference(PreferencePredicate.TermLanguage.getKey()))) {
+            if (CdmUtils.isBlank(languageUuidString)) {
+                return Language.getDefaultLanguage();
+            }else {
+                return Language.getLanguageFromUuid(UUID.fromString(languageUuidString));
+            }
+        }else {
+            languageUuidString = dbPref.getValue();
         }
-
         UUID languageUuid = UUID.fromString(languageUuidString);
-        return (Language) CdmStore.getService(ITermService.class).load(
-                languageUuid);
+        Language language = (Language)CdmApplicationState.getTermProxy().load(languageUuid);
+        if (language != null){
+            return language;
+        }else{
+            MessagingUtils.noDataSourceWarningDialog(languageUuidString);
+            return null;
+        }
     }
 
     public static void setGlobalLanguage(Language language) {
         if(language != null) {
-            setStringValue(GLOBAL_LANGUAGE_UUID,language.getUuid().toString());
+            setStringValue(PreferencePredicate.TermLanguage.getKey(),language.getUuid().toString());
             CdmStore.setDefaultLanguage(language);
+        }else {
+            CdmStore.setDefaultLanguage(Language.getDefaultLanguage());
         }
-
     }
 
     public static Map<MarkerType, Boolean> getEditMarkerTypePreferences() {
         List<MarkerType> markerTypes = CdmStore.getTermManager()
                 .getPreferredTerms(MarkerType.class);
 
-        Map<MarkerType, Boolean> result = new HashMap<MarkerType, Boolean>();
+        Map<MarkerType, Boolean> result = new HashMap<>();
 
         for (MarkerType markerType : markerTypes) {
             String name = getMarkerTypeEditingPreferenceKey(markerType);
             Boolean value = getBooleanValue(name);
-
             result.put(markerType, value);
         }
 
@@ -1047,7 +1021,6 @@ public class PreferencesUtil implements IPreferenceKeys {
             setBooleanValue(name,
                     markerTypeEditingMap.get(markerType));
         }
-
     }
 
     private static String getMarkerTypeEditingPreferenceKey(
@@ -1077,26 +1050,29 @@ public class PreferencesUtil implements IPreferenceKeys {
      * @param setLanguage 0 is for german and 1 for english.
      * @throws IOException
      */
-    public void writePropertyToConfigFile(int setLanguage) throws IOException {
+    public static void writePropertyToConfigFile(int setLanguage) throws IOException {
         File file = org.eclipse.core.runtime.preferences.ConfigurationScope.INSTANCE.getLocation().toFile();
         //give warning to user if the directory has no write access
         if(file == null){
             throw new IOException();
         }
-        Properties properties = load(file.getAbsolutePath()+"/config.ini");
+        Properties properties;
+        properties = load(file.getAbsolutePath()+"/config.ini");
         switch(setLanguage){
         case 0:
             properties.setProperty("osgi.nl", "de");
-            setStringValue(IPreferenceKeys.DEFAULT_LANGUAGE_EDITOR, "de");
+            setStringValue(IPreferenceKeys.DEFAULT_LANGUAGE_EDITOR, Language.uuidGerman.toString());
             break;
         case 1:
             properties.setProperty("osgi.nl", "en");
-            setStringValue(IPreferenceKeys.DEFAULT_LANGUAGE_EDITOR, "en");
+            setStringValue(IPreferenceKeys.DEFAULT_LANGUAGE_EDITOR, Language.uuidEnglish.toString());
             break;
         default:
             break;
         }
         save(file+"/config.ini", properties);
+        
+        
     }
 
     /**
@@ -1106,7 +1082,7 @@ public class PreferencesUtil implements IPreferenceKeys {
      * @return
      * @throws IOException
      */
-    private Properties load(String filename) throws IOException {
+    private static Properties load(String filename) throws IOException {
         FileInputStream in = new FileInputStream(filename);
         Properties prop = new Properties();
         prop.load(in);
@@ -1121,7 +1097,7 @@ public class PreferencesUtil implements IPreferenceKeys {
      * @param properties
      * @throws IOException
      */
-    private void save(String filename, Properties properties) throws IOException{
+    private static void save(String filename, Properties properties) throws IOException{
         FileOutputStream fos =  new FileOutputStream(filename);
         properties.store(fos, "");
         fos.close();
@@ -1152,12 +1128,10 @@ public class PreferencesUtil implements IPreferenceKeys {
 
     /**
      * Retrieves a list of previously saved P2 repositories
-     *
-     * @return
      */
     public static List<MetadataRepositoryElement> getP2Repositories() {
         List<MetadataRepositoryElement> p2Repos = new ArrayList<MetadataRepositoryElement>();
-        String p2ReposPref =  getStringValue(P2_REPOSITORY_LIST);
+        String p2ReposPref =  getStringValue(P2_REPOSITORY_LIST, true);
         if(p2ReposPref != null && !p2ReposPref.isEmpty()) {
             StringTokenizer p2ReposPrefST = new StringTokenizer(p2ReposPref,P2_REPOSITORIES_DELIM);
 
@@ -1173,7 +1147,7 @@ public class PreferencesUtil implements IPreferenceKeys {
                         continue;
                     }
                     boolean enabled = Boolean.parseBoolean(p2ReposStrST.nextToken());
-                    MetadataRepositoryElement mre = new MetadataRepositoryElement(null, uri, true);
+                    MetadataRepositoryElement mre = new MetadataRepositoryElement(null, uri.getJavaUri(), true);
                     mre.setNickname(nickname);
                     mre.setEnabled(enabled);
                     p2Repos.add(mre);
@@ -1202,46 +1176,63 @@ public class PreferencesUtil implements IPreferenceKeys {
     }
 
     public static void setSortNodes(NavigatorOrderEnum nodesOrder) {
-        setStringValue(PreferencePredicate.TaxonNodeOrder.getKey(), nodesOrder.key);
-
+        if (nodesOrder == null){
+            setStringValue(PreferencePredicate.TaxonNodeOrder.getKey(), null);
+        }else{
+            setStringValue(PreferencePredicate.TaxonNodeOrder.getKey(), nodesOrder.key);
+        }
     }
 
     public static NavigatorOrderEnum getSortNodes() {
         return NavigatorOrderEnum.valueOf(getStringValue(PreferencePredicate.TaxonNodeOrder.getKey()));
-
     }
 
     public static boolean isNodesSortedNaturally() {
         NavigatorOrderEnum value = NavigatorOrderEnum.valueOf(getStringValue(PreferencePredicate.TaxonNodeOrder.getKey()));
         return value.equals(NavigatorOrderEnum.NaturalOrder);
-
     }
 
     public static boolean isNodesSortedByName() {
         NavigatorOrderEnum value = NavigatorOrderEnum.valueOf(getStringValue(PreferencePredicate.TaxonNodeOrder.getKey()));
         return value.equals(NavigatorOrderEnum.AlphabeticalOrder);
-
     }
 
     public static boolean isNodesSortedByNameAndRank() {
         NavigatorOrderEnum value = NavigatorOrderEnum.valueOf(getStringValue(PreferencePredicate.TaxonNodeOrder.getKey()));
         return value.equals(NavigatorOrderEnum.RankAndNameOrder);
-
     }
 
+    public static Comparator<TaxonNodeDto> getNodeComparator() {
+               Comparator<TaxonNodeDto> comparator;
+        NavigatorOrderEnum orderValue = NavigatorOrderEnum.RankAndNameOrder;
+               try{
+                   orderValue = PreferencesUtil.getSortNodes();
+               }catch(IllegalArgumentException e){
+
+               }
+
+               if (orderValue.equals(NavigatorOrderEnum.NaturalOrder)){
+                       comparator = new TaxonNodeDtoNaturalComparator();
+               } else if (orderValue.equals(NavigatorOrderEnum.AlphabeticalOrder)){
+                       comparator = new TaxonNodeDtoByNameComparator();
+               }else {
+                       comparator = new TaxonNodeDtoByRankAndNameComparator();
+               }
+               return comparator;
+       }
+
     public static boolean isStoreNavigatorState() {
         return getBooleanValue(RESTORE_NAVIGATOR_STATE);
-
     }
 
     public static void setStoreNavigatorState(boolean selection) {
         setBooleanValue(RESTORE_NAVIGATOR_STATE, selection);
-
     }
 
     public static boolean isShowUpWidgetIsDisposedMessages() {
        return getBooleanValue(IS_SHOW_UP_WIDGET_IS_DISPOSED);
     }
+
     public static void setShowUpWidgetIsDisposedMessages(boolean selection) {
         setBooleanValue(IS_SHOW_UP_WIDGET_IS_DISPOSED, selection);
     }
@@ -1261,7 +1252,7 @@ public class PreferencesUtil implements IPreferenceKeys {
         }else{
             return false;
         }
-     }
+    }
     public static boolean isShowSymbol2InChecklistEditor() {
         String area_display = getStringValue(PreferencePredicate.DisplayOfAreasInDistributionEditor.getKey());
         if (area_display.equals(TermDisplayEnum.Symbol2.getKey())) {
@@ -1269,48 +1260,61 @@ public class PreferencesUtil implements IPreferenceKeys {
         }else{
             return false;
         }
-     }
+    }
+
     public static void setAreaDisplayInChecklistEditor(String selection) {
         setStringValue(PreferencePredicate.DisplayOfAreasInDistributionEditor.getKey(), selection);
     }
 
-    public static void setOwnDescriptionForChecklistEditor(boolean selection) {
-        setBooleanValue(PreferencePredicate.OwnDescriptionForDistributionEditor.getKey(), selection);
+    public static void setDescriptionForChecklistEditor(DistributionDescription selection) {
+        setStringValue(PreferencePredicate.DescriptionForDistributionEditor.getKey(), selection.getKey());
     }
 
-    public static boolean isOwnDescriptionForChecklistEditor() {
-        return getBooleanValue(PreferencePredicate.OwnDescriptionForDistributionEditor.getKey());
+    public static DistributionDescription getDescriptionForChecklistEditor() {
+        String str =  getStringValue(PreferencePredicate.DescriptionForDistributionEditor.getKey());
+        DistributionDescription result = null;
+        try {
+            result = DistributionDescription.byKey(str);
+        }catch(IllegalArgumentException e) {
+            result = (DistributionDescription)PreferencePredicate.DescriptionForDistributionEditor.getDefaultValue();
+        }
+        return result;
     }
 
-    public static String displayAreaInChecklistEditor() {
-        String result = getStringValue(PreferencePredicate.DisplayOfAreasInDistributionEditor.getKey());
-        if (StringUtils.isBlank(result)){
-            return ((TermDisplayEnum) PreferencePredicate.DisplayOfAreasInDistributionEditor.getDefaultValue()).getKey();
+    public static TermDisplayEnum displayAreaInChecklistEditor() {
+        TermDisplayEnum result;
+        try{
+            result = TermDisplayEnum.byKey(getStringValue(PreferencePredicate.DisplayOfAreasInDistributionEditor.getKey()));
+        }catch (IllegalArgumentException e){
+           result = ((TermDisplayEnum) PreferencePredicate.DisplayOfAreasInDistributionEditor.getDefaultValue());
         }
        return result;
     }
 
-    public static String displayStatusInChecklistEditor() {
-        String result = getStringValue(PreferencePredicate.DisplayOfStatus.getKey());
-        if (StringUtils.isBlank(result)){
-            return((TermDisplayEnum) PreferencePredicate.DisplayOfStatus.getDefaultValue()).getKey();
+    public static TermDisplayEnum displayStatusInChecklistEditor() {
+        TermDisplayEnum result;
+        try{
+            result = TermDisplayEnum.byKey(getStringValue(PreferencePredicate.DisplayOfStatus.getKey()));
+        }catch (IllegalArgumentException e){
+           result = ((TermDisplayEnum) PreferencePredicate.DisplayOfStatus.getDefaultValue());
         }
        return result;
     }
+
     public static void setDisplayStatusInChecklistEditor(String selection) {
         setStringValue(PreferencePredicate.DisplayOfStatus.getKey(), selection);
-
     }
 
     public static boolean isShowRankInChecklistEditor() {
         return getBooleanValue(PreferencePredicate.ShowRankInDistributionEditor.getKey());
     }
+
     public static void setShowRankInChecklistEditor(boolean selection) {
        setBooleanValue(PreferencePredicate.ShowRankInDistributionEditor.getKey(), selection);
     }
 
     public static NameDetailsConfigurator getPreferredNameDetailsConfiguration( boolean local) {
-        NameDetailsConfigurator config = new NameDetailsConfigurator(true);
+        NameDetailsConfigurator config = new NameDetailsConfigurator();
         CdmPreferenceCache cache = CdmPreferenceCache.instance();
         CdmPreference preference = null;
         String value;
@@ -1330,78 +1334,45 @@ public class PreferencesUtil implements IPreferenceKeys {
             value = getStringValue(PreferencePredicate.NameDetailsView.getKey(), local);
         }
         if (value!= null){
-            String [] sections = value.split(";");
-            Map<String, Boolean> sectionMap = new HashMap<String, Boolean>();
-            String[] sectionValues;
-            for (String sectionValue: sections){
+            fillNameDetailsConfigurator(config, value);
+
+
+        }else {
+            return null;
+        }
+        return config;
+    }
+
+    public static void fillNameDetailsConfigurator(NameDetailsConfigurator config, String value) {
+        String [] sections = value.split(";");
+        Map<String, Boolean> sectionMap = new HashMap<>();
+        String[] sectionValues;
+        for (String sectionValue: sections){
+            if (sectionValue.contains(":")){
                 sectionValues = sectionValue.split(":");
                 sectionMap.put(sectionValues[0], Boolean.valueOf(sectionValues[1]));
             }
-            config.setSimpleDetailsViewActivated(getValue(sectionMap, "simpleViewActivated"));
-            config.setTaxonSectionActivated(getValue(sectionMap, "taxon"));
-            config.setSecDetailsActivated(getValue(sectionMap, "taxon.SecDetails"));
-            config.setSecEnabled(getValue(sectionMap, "taxon.SecEnabled"));
-            config.setLSIDActivated(getValue(sectionMap, "lsid"));
-            config.setNomenclaturalCodeActived(getValue(sectionMap, "nc"));
-            config.setAppendedPhraseActivated(getValue(sectionMap, "ap"));
-            config.setRankActivated(getValue(sectionMap, "rank"));
-            config.setAtomisedEpithetsActivated(getValue(sectionMap, "atomisedEpithets"));
-            config.setAuthorshipSectionActivated(getValue(sectionMap,"author"));
-            config.setNomenclaturalReferenceSectionActivated(sectionMap.get("nomRef"));
-            config.setNomenclaturalStatusSectionActivated(getValue(sectionMap, "nomStat"));
-            config.setProtologueActivated(getValue(sectionMap,"protologue"));
-            config.setTypeDesignationSectionActivated(getValue(sectionMap,"typeDes"));
-            config.setNameRelationsSectionActivated(getValue(sectionMap,"nameRelation"));
-            config.setHybridActivated(getValue(sectionMap,"hybrid"));
         }
-        return config;
+        for (Field field: config.getClass().getDeclaredFields()){
+            try {
+                config.getClass().getDeclaredField(field.getName()).set(config, getValue(sectionMap, field.getName()));
+            } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException
+                    | SecurityException e) {
+               logger.debug(e.getMessage());
+            }
+        }
     }
 
     public static NameDetailsConfigurator getPreferredNameDetailsConfiguration() {
-        NameDetailsConfigurator config = new NameDetailsConfigurator(true);
+        NameDetailsConfigurator config = new NameDetailsConfigurator();
 
         String value;
 
         value = getStringValue(PreferencePredicate.NameDetailsView.getKey(), false);
         if (value != null){
-            String [] sections = value.split(";");
-            Map<String, Boolean> sectionMap = new HashMap<String, Boolean>();
-            String[] sectionValues;
-            for (String sectionValue: sections){
-                sectionValues = sectionValue.split(":");
-                sectionMap.put(sectionValues[0], Boolean.valueOf(sectionValues[1]));
-            }
-
-            config.setSimpleDetailsViewActivated(getValue(sectionMap, "simpleViewActivated"));
-
-            config.setTaxonSectionActivated(getValue(sectionMap, "taxon"));
-
-            config.setSecDetailsActivated(getValue(sectionMap, "taxon.SecDetails"));
-            config.setSecEnabled(getValue(sectionMap, "taxon.SecEnabled"));
-
-            config.setLSIDActivated(getValue(sectionMap, "lsid"));
-
-            config.setNomenclaturalCodeActived(getValue(sectionMap, "nc"));
-
-            config.setAppendedPhraseActivated(getValue(sectionMap, "ap"));
-
-            config.setRankActivated(getValue(sectionMap, "rank"));
-
-            config.setAtomisedEpithetsActivated(getValue(sectionMap, "atomisedEpithets"));
-
-            config.setAuthorshipSectionActivated(getValue(sectionMap,"author"));
-
-            config.setNomenclaturalReferenceSectionActivated(sectionMap.get("nomRef"));
-
-            config.setNomenclaturalStatusSectionActivated(getValue(sectionMap, "nomStat"));
-
-            config.setProtologueActivated(getValue(sectionMap,"protologue"));
-
-            config.setTypeDesignationSectionActivated(getValue(sectionMap,"typeDes"));
-
-            config.setNameRelationsSectionActivated(getValue(sectionMap,"nameRelation"));
-
-                config.setHybridActivated(getValue(sectionMap,"hybrid"));
+            fillNameDetailsConfigurator(config, value);
+        }else {
+            return null;
         }
         return config;
     }
@@ -1417,8 +1388,6 @@ public class PreferencesUtil implements IPreferenceKeys {
         else{
             setStringValue(PreferencePredicate.NameDetailsView.getKey(), config.toString());
         }
-
-
     }
 
     private static Boolean getValue(Map<String, Boolean> sectionMap, String string) {
@@ -1427,7 +1396,45 @@ public class PreferencesUtil implements IPreferenceKeys {
         }else{
             return true;
         }
+    }
+
+    public static void extractSecundumForSubtreeConfiguratorFromPreferenceString(SecundumForSubtreeConfigurator config,
+            String configString) {
+        if(configString != null){
+             String[] configArray = configString.split(";");
+
+             for (String configItem: configArray){
+                 String[] keyValue = configItem.split(":");
+                 String keyString = keyValue[0];
+                 String valueString = null;
+                 if (keyValue.length>1){
+                     valueString = keyValue[1];
+                     if (keyValue.length>2){
 
+                         for (int index = 2; index< keyValue.length; index++){
+                             valueString += ":"+ keyValue[index];
+                         }
+                     }
+                 }
+                 if (keyString.equals("includeAcceptedTaxa")){
+                     config.setIncludeAcceptedTaxa(Boolean.valueOf(valueString));
+                 }else if (keyString.equals("includeSynonyms")){
+                     config.setIncludeSynonyms(Boolean.valueOf(valueString));
+                 }else if (keyString.equals("includeSharedTaxa")){
+                     config.setIncludeSharedTaxa(Boolean.valueOf(valueString));
+                 }else if (keyString.equals("includeProParteSynonyms")){
+                     config.setIncludeProParteSynonyms(Boolean.valueOf(valueString));
+                 }else if (keyString.equals("includeMisapplications")){
+                     config.setIncludeMisapplications(Boolean.valueOf(valueString));
+                 }else if (keyString.equals("overwriteExisting")){
+                     config.setOverwriteExisting(Boolean.valueOf(valueString));
+                 }else if (keyString.equals("emptySecundumDetail")){
+                     config.setEmptySecundumDetail(Boolean.valueOf(valueString));
+                 }else{
+                     logger.debug("This key of the set secundum configurator needs to be added to the transformer: " + keyString);
+                 }
+             }
+         }
     }
 
     public static Abcd206ImportConfigurator getDBAbcdImportConfigurationPreference() {
@@ -1452,7 +1459,7 @@ public class PreferencesUtil implements IPreferenceKeys {
 
     public static void extractAbcdConfiguratorFromPreferenceString(Abcd206ImportConfigurator config,
             String configString) {
-        if(configString!=null){
+        if(configString != null){
              String[] configArray = configString.split(";");
 
              for (String configItem: configArray){
@@ -1470,8 +1477,10 @@ public class PreferencesUtil implements IPreferenceKeys {
                  }
                  if (keyString.equals("ignoreImportOfExistingSpecimen")){
                      config.setIgnoreImportOfExistingSpecimen(Boolean.valueOf(valueString));
-                 }else if (keyString.equals("addIndividualsAssociationsSuchAsSpecimenAndObservations")){
-                     config.setAddIndividualsAssociationsSuchAsSpecimenAndObservations(Boolean.valueOf(valueString));
+                 }else if (keyString.equals("addIndividualsAssociations")){
+                     config.setAddIndividualsAssociations(Boolean.valueOf(valueString));
+                 }else if (keyString.equals("addDeterminations")){
+                     config.setAddDeterminations(Boolean.valueOf(valueString));
                  }else if (keyString.equals("reuseExistingTaxaWhenPossible")){
                      config.setReuseExistingTaxaWhenPossible(Boolean.valueOf(valueString));
                  }else if (keyString.equals("ignoreAuthorship")){
@@ -1504,29 +1513,72 @@ public class PreferencesUtil implements IPreferenceKeys {
                      config.setRemoveCountryFromLocalityText(Boolean.valueOf(valueString));
                  }else if (keyString.equals("getSiblings")){
                      config.setGetSiblings(Boolean.valueOf(valueString));
+                 }else if (keyString.equals("classificationUUID")){
+                     if (valueString != null){
+                         config.setClassificationUuid(UUID.fromString(valueString));
+                     }
+                 }else if (keyString.equals("classificationName")){
+                     config.setClassificationName(valueString);
                  }else if (keyString.equals("dnaSource")){
                      try{
-                         config.setDnaSoure(URI.create(valueString));
+                         if (StringUtils.isNotBlank(valueString)){
+                             config.setDnaSoure(URI.create(valueString));
+                         }
                      }catch(Exception e){
                          config.setDnaSoure(null);
                      }
                  }else{
                      logger.debug("This key of the abcd configurator needs to be added to the transformer: " + keyString);
                  }
-
-
              }
          }
     }
 
     public static Abcd206ImportConfigurator getLocalAbcdImportConfigurator(){
+        return getLocalAbcdImportConfigurator(true);
+    }
+
+    public static Abcd206ImportConfigurator getLocalAbcdImportConfigurator(boolean skipCheckOverride){
        Abcd206ImportConfigurator config = Abcd206ImportConfigurator.NewInstance(null,null);
-       String configString = getStringValue(PreferencePredicate.AbcdImportConfig.getKey(), true);
-       extractAbcdConfiguratorFromPreferenceString(config, configString);
+       CdmPreference pref = CdmPreferenceCache.instance().get(PreferencePredicate.AbcdImportConfig.getKey());
+       if (pref  == null || pref.isAllowOverride()){
+       String configString = PreferencesUtil.getStringValue(PreferencePredicate.AbcdImportConfig.getKey());
+           if (StringUtils.isBlank(configString)){
+               configString = getStringValue(PreferencePredicate.AbcdImportConfig.getKey(), skipCheckOverride);
+               extractAbcdConfiguratorFromPreferenceString(config, configString);
+               if (config.getNomenclaturalCode() == null){
+                   config.setNomenclaturalCode(getPreferredNomenclaturalCode());
+               }
+           }else{
+               config = Abcd206ImportConfigurator.NewInstance(null, null);
+               PreferencesUtil.extractAbcdConfiguratorFromPreferenceString(config, configString);
+           }
+       }else{
+           extractAbcdConfiguratorFromPreferenceString(config, pref.getValue());
+       }
+
        return config;
 
     }
 
+    public static Abcd206ImportConfigurator getLastUsedAbcdImportConfigurator(){
+        Abcd206ImportConfigurator config = Abcd206ImportConfigurator.NewInstance(null,null);
+
+        String configString = PreferencesUtil.getStringValue(IPreferenceKeys.LAST_USED_ABCD_CONFIG, true);
+        if (configString != null){
+            extractAbcdConfiguratorFromPreferenceString(config, configString);
+            if (config != null){
+                if (config.getNomenclaturalCode() == null){
+                    config.setNomenclaturalCode(getPreferredNomenclaturalCode());
+                }
+            }
+        }else{
+            config = PreferencesUtil.getLocalAbcdImportConfigurator(false);
+        }
+
+        return config;
+    }
+
     public static void updateAbcdImportConfigurationPreference() {
         CdmPreferenceCache cache = CdmPreferenceCache.instance();
 
@@ -1534,41 +1586,42 @@ public class PreferencesUtil implements IPreferenceKeys {
 
         if (!getBooleanValue(prefOverrideKey(PreferencePredicate.AbcdImportConfig.getKey())) || !pref.isAllowOverride()){
             resetToDBPreferenceAbcdCOnfigurator();
-
         }
     }
 
     public static void resetToDBPreferenceAbcdCOnfigurator(){
         Abcd206ImportConfigurator config = getDBAbcdImportConfigurationPreference();
         setStringValue(PreferencePredicate.AbcdImportConfig.getKey(), config.toString());
-
     }
 
     public static boolean isSortTaxaByRankAndName() {
-
-        return getBooleanValue(IPreferenceKeys.SORT_TAXA_BY_RANK_AND_NAME);
+        return getBooleanValue(PreferencePredicate.SortTaxaByRankAndName.getKey());
     }
 
-    public static String getSortNamedAreasInDistributionEditor() {
-
-        return getStringValue(PreferencePredicate.AreasSortedInDistributionEditor.getKey());
+    public static TermOrder getSortNamedAreasInDistributionEditor() {
+        TermOrder result;
+        try{
+            result = TermOrder.valueOf(getStringValue(PreferencePredicate.AreasSortedInDistributionEditor.getKey()));
+        }catch (IllegalArgumentException e){
+            result = (TermOrder)PreferencePredicate.AreasSortedInDistributionEditor.getDefaultValue();
+        }
+        return result;
     }
 
     public static void setSortNamedAreasInDistributionEditor(String isSortByVocabularyOrder) {
         setStringValue(PreferencePredicate.AreasSortedInDistributionEditor.getKey(), isSortByVocabularyOrder);
-
     }
 
     public static void setLastSelectedReference(
             List<String> lastSelectedReferences) {
 
-        setStringValue(PreferencesUtil.LAST_SELECTED_REFERENCES, lastSelectedReferences.toString());
+        setStringValue(IPreferenceKeys.LAST_SELECTED_REFERENCES, lastSelectedReferences.toString());
     }
 
     public static List<String> getLastSelectedReferences() {
 
         //IPreferenceStore preferenceStore = PreferencesUtil.getPreferenceStore();
-        String lastSelected = getStringValue(PreferencesUtil.LAST_SELECTED_REFERENCES);
+        String lastSelected = getStringValue(IPreferenceKeys.LAST_SELECTED_REFERENCES, true);
         List<String> result = new ArrayList<>();
         if (!StringUtils.isBlank(lastSelected)){
             Collections.addAll(result, lastSelected.substring(1,lastSelected.length()-1).split(", "));
@@ -1580,7 +1633,6 @@ public class PreferencesUtil implements IPreferenceKeys {
             String saveCheckedElements, String saveGrayedElements, boolean local) {
         if (local){
             setStringValue(PreferencePredicate.AvailableDistributionAreaTerms.getKey(), saveCheckedElements);
-
         }
         else{
             CdmPreference preference = null;
@@ -1595,17 +1647,14 @@ public class PreferencesUtil implements IPreferenceKeys {
                             saveCheckedElements);
                     preference = CdmPreference.NewInstance(PreferenceSubject.NewTaxEditorInstance(), PreferencePredicate.AvailableDistributionAreaTerms, saveCheckedElements);
                     setPreferenceToDB(preference);
-
                 }
             } else{
                 preference = CdmPreference.NewInstance(PreferenceSubject.NewTaxEditorInstance(), PreferencePredicate.AvailableDistributionAreaTerms, saveCheckedElements);
                 setPreferenceToDB(preference);
                 setStringValue(PreferencePredicate.AvailableDistributionAreaTerms.getKey(),
                         saveCheckedElements);
-
             }
         }
-
     }
 
     public static void setPreferredVocabulariesForDistributionEditor(String saveCheckedElements,
@@ -1615,7 +1664,6 @@ public class PreferencesUtil implements IPreferenceKeys {
             setBooleanValue(prefOverrideKey(PreferencePredicate.AvailableDistributionAreaVocabularies.getKey()), isOverride);
         }
         else{
-            ICdmRepository controller;
             CdmPreference preference = null;
 
             if (saveCheckedElements == null){
@@ -1636,7 +1684,6 @@ public class PreferencesUtil implements IPreferenceKeys {
                 setPreferenceToDB(preference);
                 setStringValue(PreferencePredicate.AvailableDistributionAreaVocabularies.getKey(),
                         saveCheckedElements);
-
             }
         }
     }
@@ -1655,17 +1702,24 @@ public class PreferencesUtil implements IPreferenceKeys {
             } else{
                 return preference.getValue();
             }
-
         }
     }
 
-    public static List<UUID> createUUIDListFromStringPref(String prefKey) {
-        String prefValue = PreferencesUtil.getStringValue(prefKey);
+    public static List<UUID> createUUIDListFromStringPref(String prefKey, boolean local) {
+        if (prefKey == null){
+            return null;
+        }
+        String prefValue = PreferencesUtil.getStringValue(prefKey, local);
         if (prefValue == null){
             return null;
         }
+        List<UUID> uuidList = createUuidList(prefValue);
+        return uuidList;
+    }
+
+    public static List<UUID> createUuidList(String prefValue) {
         String[] stringArray = prefValue.split(";");
-        List<UUID> uuidList = new ArrayList();
+        List<UUID> uuidList = new ArrayList<>();
         for (String uuid: stringArray){
             if (!StringUtils.isBlank(uuid)){
                 uuidList.add(UUID.fromString(uuid));
@@ -1675,55 +1729,32 @@ public class PreferencesUtil implements IPreferenceKeys {
     }
 
     public static boolean getFilterCommonNameReferences(){
-        Boolean result = getBooleanValue(PreferencesUtil.FILTER_COMMON_NAME_REFERENCES);
-        if (result == null){
-            return false;
-        }
-        return result;
+        return getBooleanValue(PreferencePredicate.CommonNameReferencesWithMarker.getKey());
     }
 
     public static void updateDBPreferences() {
 
-
         CdmPreferenceCache cache = CdmPreferenceCache.instance();
         cache.getAllTaxEditorDBPreferences();
 
-        //ABCD Configurator
-
-        //updateAbcdImportConfigurationPreference();
-
         //Name Details
         NameDetailsConfigurator config = getPreferredNameDetailsConfiguration(false);
-        //    if (config != null ){
-        //        if (!getBooleanValue(OVERRIDE_NAME_DETAILS) ||  !getBooleanValue(ALLOW_OVERRIDE_NAME_DETAILS)){
-        //            setPreferredNameDetailsConfiguration(config, false);
-        //        }
-        //    }
-
     }
 
     public static void setPreferencesToDB(List<CdmPreference> preferences) {
 
         ICdmRepository controller;
-        //try{
-            if(CdmStore.isActive()){
-                controller = CdmStore.getCurrentApplicationConfiguration();
-                for (CdmPreference preference: preferences){
-                    if (preference.getValue() == null && preference.isAllowOverride()){
-                        controller.getPreferenceService().remove(preference.getKey());
-
-                    }else{
-                        controller.getPreferenceService().set(preference);
-
-                    }
-
+        if(CdmStore.isActive()){
+            controller = CdmStore.getCurrentApplicationConfiguration();
+            for (CdmPreference preference: preferences){
+                if (preference.getValue() == null && preference.isAllowOverride()){
+                    controller.getPreferenceService().remove(preference.getKey());
+                }else{
+                    controller.getPreferenceService().set(preference);
                 }
-                CdmPreferenceCache.instance().getAllTaxEditorDBPreferences();
-
             }
-        /*}catch(Exception e){
-            e.printStackTrace();
-        }*/
+            CdmPreferenceCache.instance().getAllTaxEditorDBPreferences();
+        }
     }
 
     /**
@@ -1735,6 +1766,162 @@ public class PreferencesUtil implements IPreferenceKeys {
         return getPreferenceStore().contains(prefKey(prefKey));
     }
 
+    public static TermTree<Feature> getPreferredFeatureTreeForNameDescription(boolean createNew) {
+        if(preferredNameFeatureTree != null && !createNew){
+            return preferredNameFeatureTree;
+        }
+        createPreferredFeatureTreeForNameDescription();
+        return preferredNameFeatureTree;
+    }
+
+    public static void createPreferredFeatureTreeForNameDescription() {
 
+        CdmPreferenceCache cache = CdmPreferenceCache.instance();
+        CdmPreference pref = cache.get(PreferencePredicate.NameFeatures.getKey());
+        List<Feature> terms = new ArrayList<>();
+        boolean override = PreferencesUtil.getOverrideForPreference(PreferencePredicate.NameFeatures.getKey());
+
+        List<UUID> uuids = PreferencesUtil.createUUIDListFromStringPref(PreferencePredicate.NameFeatures.getKey(), false);
+        if (uuids != null && !uuids.isEmpty()){
+            terms = CdmStore.getTermManager().getTerms(uuids, Feature.class);
+        }
+
+       if (terms.isEmpty()){
+           terms.addAll(TermStore.getTerms(CdmStore.getService(IVocabularyService.class).load(VocabularyEnum.NameFeature.getUuid()), null));
+        }
+        terms.remove(Feature.PROTOLOGUE());
+        if (terms.isEmpty()){
+            preferredNameFeatureTree = TermEditorInput.getDefaultNameFeatureTree();
+        }else{
+            preferredNameFeatureTree = TermTree.NewFeatureInstance(terms);
+        }
+    }
+
+    public static void removeFromDB(List<CdmPreference> prefsToDelete) {
+        ICdmRepository controller;
+        //try{
+            if(CdmStore.isActive()){
+                controller = CdmStore.getCurrentApplicationConfiguration();
+                for (CdmPreference preference: prefsToDelete){
+                    controller.getPreferenceService().remove(preference.getKey());
+                }
+                CdmPreferenceCache.instance().getAllTaxEditorDBPreferences();
+            }
+    }
+
+    public static void removeFromDB(CdmPreference prefToDelete) {
+        ICdmRepository controller;
+
+        if(CdmStore.isActive()){
+            controller = CdmStore.getCurrentApplicationConfiguration();
+            controller.getPreferenceService().remove(prefToDelete.getKey());
+
+            CdmPreferenceCache.instance().getAllTaxEditorDBPreferences();
+        }
+    }
+
+    public static TermTree<?> getPreferredFeatureTreeForTaxonDescription(boolean createNew) {
+        if(preferredTaxonFeatureTree != null && !createNew){
+            return preferredTaxonFeatureTree;
+        }
+        createPreferredFeatureTreeForTaxonDescription();
+        return preferredTaxonFeatureTree;
+    }
+
+    public static void createPreferredFeatureTreeForTaxonDescription() {
+
+        CdmPreferenceCache cache = CdmPreferenceCache.instance();
+        CdmPreference pref = cache.get(PreferencePredicate.TaxonFeatures.getKey());
+        List<Feature> terms = null;
+        boolean override = PreferencesUtil.getOverrideForPreference(PreferencePredicate.TaxonFeatures.getKey());
+        List<UUID> uuids = PreferencesUtil.createUUIDListFromStringPref(PreferencePredicate.TaxonFeatures.getKey(), false);
+        if (uuids != null && !uuids.isEmpty()){
+            terms = CdmStore.getTermManager().getTerms(uuids, Feature.class);
+        }
+        if (terms == null || terms.isEmpty()){
+            terms= CdmStore.getTermManager().getPreferredTerms(TermType.Feature);
+            TermVocabulary nameVocabulary = CdmStore.getService(IVocabularyService.class).load(VocabularyEnum.NameFeature.getUuid());
+            Set<Feature> nameFeature = nameVocabulary.getTerms();
+            terms.removeAll(nameFeature);
+
+        }
+
+        if (terms.isEmpty()){
+            preferredTaxonFeatureTree = TermEditorInput.getDefaultFeatureTree();
+        }else{
+            preferredTaxonFeatureTree = TermTree.NewFeatureInstance(terms);
+        }
+    }
+
+    public static void setLastSelectedBiocaseProvider(String lastAccessPoint) {
+        setStringValue(LAST_USED_BIOCASE_PROVIDER, lastAccessPoint);
+    }
+
+    /**
+     * @return
+     */
+    public static boolean getLocalActive() {
+        // TODO: this needs to be adapted!!!
+        return true;
+    }
+
+    /**
+     * @return
+     */
+    public static boolean showGfbioMetaData() {
+        //TODO: needs to be adapted!!!
+        return false;
+    }
+
+    public static SecReferenceHandlingEnum getSecReferenceHandlingPreference(){
+
+        String defaultBehaviour = getStringValue(PreferencePredicate.DefaultBehaviourForSecundum.getKey());
+        SecReferenceHandlingEnum handling = null;
+        try{
+            handling = SecReferenceHandlingEnum.valueOf(defaultBehaviour);
+        }catch(IllegalArgumentException e){
+            handling = (SecReferenceHandlingEnum)PreferencePredicate.DefaultBehaviourForSecundum.getDefaultValue();
+        }
+        return handling;
+
+    }
+
+    public static SecReferenceHandlingSwapEnum getSecReferenceHandlingSwapPreference(){
+        String defaultBehaviour = getStringValue(PreferencePredicate.DefaultBehaviourForSecundumWhenSwap.getKey());
+        SecReferenceHandlingSwapEnum handling = null;
+        try{
+            handling = SecReferenceHandlingSwapEnum.valueOf(defaultBehaviour);
+        }catch (IllegalArgumentException e){
+            handling = (SecReferenceHandlingSwapEnum)PreferencePredicate.DefaultBehaviourForSecundumWhenSwap.getDefaultValue();
+        }
+        return handling;
+
+    }
+
+    public static EnabledComputedDescription getComputedDesciptionHandlingPreference(){
+        String defaultBehaviour= getStringValue(PreferencePredicate.EnableComputedDescription.getKey());
+        EnabledComputedDescription computedDescriptionsEnabled = (EnabledComputedDescription)PreferencePredicate.EnableComputedDescription.getDefaultValue();
+        if (StringUtils.isNotBlank(defaultBehaviour)){
+            try{
+                computedDescriptionsEnabled = EnabledComputedDescription.byKey(defaultBehaviour);
+            }catch(IllegalArgumentException e){
+                //do nothing, keep default value;
+            }
+        }
+        return computedDescriptionsEnabled;
+
+    }
+
+    public static boolean isComputedDesciptionHandlingDisabled(){
+        String defaultBehaviour= getStringValue(PreferencePredicate.EnableComputedDescription.getKey());
+        EnabledComputedDescription computedDescriptionsEnabled = null;
+        try{
+            computedDescriptionsEnabled = EnabledComputedDescription.byKey(defaultBehaviour);
+        }catch (IllegalArgumentException e){
+            computedDescriptionsEnabled = (EnabledComputedDescription)PreferencePredicate.EnableComputedDescription.getDefaultValue();
+        }
+        return computedDescriptionsEnabled.equals(EnabledComputedDescription.Disabled);
+
+    }
 
 }