diff --git a/src/python/OBis/obis/dm/config.py b/src/python/OBis/obis/dm/config.py
index 627b0c7ef56516d4c3f78185c299c9dc1d36035c..4ddb2ab2da539b227d06e6ab08f788cea9a5e37f 100644
--- a/src/python/OBis/obis/dm/config.py
+++ b/src/python/OBis/obis/dm/config.py
@@ -87,11 +87,8 @@ class ConfigEnv(object):
         self.add_param(ConfigParam(name='openbis_url', private=False))
         self.add_param(ConfigParam(name='user', private=True))
         self.add_param(ConfigParam(name='verify_certificates', private=True, is_json=True))
-        self.add_param(ConfigParam(name='external_dms_id', private=True))
-        self.add_param(ConfigParam(name='repository_id', private=True))
         self.add_param(ConfigParam(name='object_id', private=False, ignore_global=True))
         self.add_param(ConfigParam(name='collection_id', private=False, ignore_global=True))
-        self.add_param(ConfigParam(name='data_set_id', private=False))
         self.add_param(ConfigParam(name='data_set_type', private=False))
         self.add_param(ConfigParam(name='data_set_properties', private=False, is_json=True))
         self.add_param(ConfigParam(name='hostname', private=False))
@@ -105,6 +102,21 @@ class ConfigEnv(object):
             location = location[path]
         return location
 
+    def is_usersetting(self):
+        return True
+
+
+class PropertiesEnv(ConfigEnv):
+    """ These are properties which are not configured by the user but set by obis. """
+
+    def initialize_params(self):
+        self.add_param(ConfigParam(name='external_dms_id', private=True))
+        self.add_param(ConfigParam(name='repository_id', private=True))
+        self.add_param(ConfigParam(name='data_set_id', private=False))
+
+    def is_usersetting(self):
+        return False
+
 
 class LocationResolver(object):
     def __init__(self):
@@ -118,15 +130,16 @@ class LocationResolver(object):
         return os.path.join(root, location.basename)
 
 
-class ConfigResolver(object):
+class ConfigResolverImpl(object):
     """Construct a config dictionary."""
 
-    def __init__(self, env=None, location_resolver=None):
+    def __init__(self, env=None, location_resolver=None, config_file='config.json'):
         self.env = env if env is not None else ConfigEnv()
         self.location_resolver = location_resolver if location_resolver is not None else LocationResolver()
         self.location_search_order = ['global', 'local']
         self.location_cache = {}
         self.is_initialized = False
+        self.config_file = config_file
 
     def initialize_location_cache(self):
         env = self.env
@@ -140,7 +153,7 @@ class ConfigResolver(object):
                 self.initialize_location(k, v, cache[key])
         else:
             root_path = self.location_resolver.resolve_location(loc)
-            config_path = os.path.join(root_path, 'config.json')
+            config_path = os.path.join(root_path, self.config_file)
             if os.path.exists(config_path):
                 with open(config_path) as f:
                     config = json.load(f)
@@ -184,7 +197,7 @@ class ConfigResolver(object):
         location_dir_path = self.location_resolver.resolve_location(location)
         if not os.path.exists(location_dir_path):
             os.makedirs(location_dir_path)
-        config_path = os.path.join(location_dir_path, 'config.json')
+        config_path = os.path.join(location_dir_path, self.config_file)
         with open(config_path, "w") as f:
             json.dump(location_config_dict, f, sort_keys=True)
 
@@ -209,7 +222,7 @@ class ConfigResolver(object):
 
     def local_public_config_folder_path(self):
         loc = self.env.location_at_path(['local', 'public'])
-        return self.location_resolver.resolve_location(loc)
+        return self.location_resolver.resolve_location(loc) + '/' + self.config_file
 
     def copy_global_to_local(self):
         config = self.config_dict(False)
@@ -223,3 +236,48 @@ class ConfigResolver(object):
             if param.ignore_global:
                 continue
             self.set_value_for_parameter(k, v, 'local')
+
+    def is_usersetting(self):
+        return self.env.is_usersetting()
+
+
+class ConfigResolver(object):
+    """ This class functions as a wrapper since we have multiple config resolvers. """
+    
+    def __init__(self, location_resolver=None):
+        self.resolvers = []
+        self.resolvers.append(ConfigResolverImpl(env=ConfigEnv()))
+        self.resolvers.append(ConfigResolverImpl(env=PropertiesEnv(), config_file='properties.json'))
+
+    def config_dict(self, local_only=False):
+        combined_dict = {}
+        for resolver in self.resolvers:
+            combined_dict.update(resolver.config_dict(local_only=local_only))
+        return combined_dict
+
+    def set_value_for_parameter(self, name, value, loc):
+        for resolver in self.resolvers:
+            if name in resolver.env.params:
+                return resolver.set_value_for_parameter(name, value, loc)
+
+    def local_public_properties_path(self):
+        for resolver in self.resolvers:
+            if not resolver.is_usersetting():
+                return resolver.local_public_config_folder_path()        
+
+    def copy_global_to_local(self):
+        for resolver in self.resolvers:
+            resolver.copy_global_to_local()
+
+    def set_resolver_location_roots(self, key, value):
+        for resolver in self.resolvers:
+            resolver.location_resolver.location_roots[key] = value
+
+    def set_location_search_order(self, order):
+        for resolver in self.resolvers:
+            resolver.location_search_order = order
+
+    def is_usersetting(self, name):
+        for resolver in self.resolvers:
+            if name in resolver.env.params:
+                return resolver.is_usersetting()
diff --git a/src/python/OBis/obis/dm/data_mgmt.py b/src/python/OBis/obis/dm/data_mgmt.py
index c64f9ac2cc1114a401195030e5f940275d3230a4..3eb0e4c9d45d0fb654c3dbe4c59b43770cca66ef 100644
--- a/src/python/OBis/obis/dm/data_mgmt.py
+++ b/src/python/OBis/obis/dm/data_mgmt.py
@@ -42,7 +42,7 @@ def DataMgmt(echo_func=None, config_resolver=None, openbis_config={}, git_config
         config_resolver = dm_config.ConfigResolver()
         result = git_wrapper.git_top_level_path()
         if result.success():
-            config_resolver.location_resolver.location_roots['data_set'] = result.output
+            config_resolver.set_resolver_location_roots('data_set', result.output)
     complete_openbis_config(openbis_config, config_resolver)
 
     return GitDataMgmt(config_resolver, openbis_config, git_wrapper, openbis)
@@ -159,7 +159,7 @@ class GitDataMgmt(AbstractDataMgmt):
 
     def setup_local_config(self, config, path):
         with cd(path):
-            self.config_resolver.location_resolver.location_roots['data_set'] = '.'
+            self.config_resolver.set_resolver_location_roots('data_set', '.')
             for key, value in config.items():
                 self.config_resolver.set_value_for_parameter(key, value, 'local')
 
@@ -194,7 +194,7 @@ class GitDataMgmt(AbstractDataMgmt):
             return result
         with cd(path):
             # Update the resolvers location
-            self.config_resolver.location_resolver.location_roots['data_set'] = '.'
+            self.config_resolver.set_resolver_location_roots('data_set', '.')
             self.config_resolver.copy_global_to_local()
             self.commit_metadata_updates('local with global')
         return result
@@ -266,12 +266,12 @@ class GitDataMgmt(AbstractDataMgmt):
         return self.git_wrapper.git_status()
 
     def commit_metadata_updates(self, msg_fragment=None):
-        folder = self.config_resolver.local_public_config_folder_path()
-        status = self.git_wrapper.git_status(folder)
+        properties_path = self.config_resolver.local_public_properties_path()
+        status = self.git_wrapper.git_status(properties_path)
         if len(status.output.strip()) < 1:
             # Nothing to commit
             return CommandResult(returncode=0, output="")
-        self.git_wrapper.git_add(folder)
+        self.git_wrapper.git_add(properties_path)
         if msg_fragment is None:
             msg = "OBIS: Update openBIS metadata cache."
         else:
@@ -283,8 +283,8 @@ class GitDataMgmt(AbstractDataMgmt):
 
     def restore(self):
         self.git_wrapper.git_reset_to(self.previous_git_commit_hash)
-        folder = self.config_resolver.local_public_config_folder_path()
-        self.git_wrapper.git_checkout(folder)
+        properties_path = self.config_resolver.local_public_properties_path()
+        self.git_wrapper.git_checkout(properties_path)
 
     def clone(self, data_set_id, ssh_user, content_copy_index):
         try:
diff --git a/src/python/OBis/obis/dm/data_mgmt_test.py b/src/python/OBis/obis/dm/data_mgmt_test.py
index 781e2734b8c42a61d287f04d1b871ece14beeba2..908cd5b8536ebea9e26eac7f383306e47e91ed6d 100644
--- a/src/python/OBis/obis/dm/data_mgmt_test.py
+++ b/src/python/OBis/obis/dm/data_mgmt_test.py
@@ -153,7 +153,7 @@ def test_child_data_set(tmpdir):
         child_ds_code = dm.config_resolver.config_dict()['data_set_id']
         assert parent_ds_code != child_ds_code
         commit_id = dm.git_wrapper.git_commit_hash().output
-        repository_id = dm.config_resolver.config_dict()['repository_id'] # TODO fail
+        repository_id = dm.config_resolver.config_dict()['repository_id']
         assert repository_id is not None
 
         contents = git.GitRepoFileInfo(dm.git_wrapper).contents()
diff --git a/src/python/OBis/obis/dm/repo.py b/src/python/OBis/obis/dm/repo.py
index 58d95998bd362590054a28fb3bfcd3df776f2324..9a5060e136b4e61f85471b5563336168606bd61d 100644
--- a/src/python/OBis/obis/dm/repo.py
+++ b/src/python/OBis/obis/dm/repo.py
@@ -20,7 +20,7 @@ class DataRepo(object):
         """
         self.root = root
         self.dm_api = data_mgmt.DataMgmt(git_config={'find_git': True})
-        self.dm_api.config_resolver.location_resolver.location_roots['data_set'] = self.root
+        self.dm_api.config_resolver.set_resolver_location_roots('data_set', self.root)
 
     def init(self, desc=None):
         return self.dm_api.init_data(self.root, desc)
diff --git a/src/python/OBis/obis/scripts/cli.py b/src/python/OBis/obis/scripts/cli.py
index 8bc538b496bfea6db7bd46f2c11b643e82e1720c..2a9b24237513bd946665c855581e7852d9a58e39 100644
--- a/src/python/OBis/obis/scripts/cli.py
+++ b/src/python/OBis/obis/scripts/cli.py
@@ -110,14 +110,14 @@ def config(ctx, is_global, prop, value):
 def config_internal(data_mgmt, is_global, prop, value):
     resolver = data_mgmt.config_resolver
     if is_global:
-        resolver.location_search_order = ['global']
+        resolver.set_location_search_order(['global'])
     else:
         top_level_path = data_mgmt.git_wrapper.git_top_level_path()
         if top_level_path.success():
-            resolver.location_resolver.location_roots['data_set'] = top_level_path.output
-            resolver.location_search_order = ['local']
+            resolver.set_resolver_location_roots('data_set', top_level_path.output)
+            resolver.set_location_search_order(['local'])
         else:
-            resolver.location_search_order = ['global']
+            resolver.set_location_search_order(['global'])
 
     config_dict = resolver.config_dict()
     if not prop: