diff --git a/src/python/OBis/obis/dm/config.py b/src/python/OBis/obis/dm/config.py
index 9d02957d7a68217140a0844df2eadaa8267c94c7..2aa742bb13884aef564485c7b6ebcecf0a4c3e39 100644
--- a/src/python/OBis/obis/dm/config.py
+++ b/src/python/OBis/obis/dm/config.py
@@ -103,10 +103,6 @@ class ConfigEnv(object):
         self.add_param(ConfigParam(name='fileservice_url', private=False))
         self.add_param(ConfigParam(name='user', private=True))
         self.add_param(ConfigParam(name='verify_certificates', private=True, is_json=True, default_value=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_type', private=False))
-        self.add_param(ConfigParam(name='data_set_properties', private=False, is_json=True))
         self.add_param(ConfigParam(name='hostname', private=False))
         self.add_param(ConfigParam(name='git_annex_hash_as_checksum', private=False, is_json=True, default_value=True))
 
@@ -123,6 +119,18 @@ class ConfigEnv(object):
         return True
 
 
+class CollectionEnv(ConfigEnv):
+
+    def initialize_params(self):
+        self.add_param(ConfigParam(name='collection_id', private=False, ignore_global=True))
+
+
+class ObjectEnv(ConfigEnv):
+
+    def initialize_params(self):
+        self.add_param(ConfigParam(name='object_id', private=False, ignore_global=True))
+
+
 class DataSetEnv(ConfigEnv):
 
     # TODO remove data_set from property names
@@ -136,6 +144,7 @@ class RepositoryEnv(ConfigEnv):
 
     def initialize_params(self):
         self.add_param(ConfigParam(name='external_dms_id', private=True))
+        # TODO remove repository_
         self.add_param(ConfigParam(name='repository_id', private=True))
         self.add_param(ConfigParam(name='data_set_id', private=False))
 
@@ -166,6 +175,9 @@ class ConfigResolver(object):
         self.is_initialized = False
         self.config_file = config_file
 
+    def set_location_search_order(self, order):
+        self.location_search_order = order
+
     def initialize_location_cache(self):
         env = self.env
         for k, v in env.locations.items():
@@ -297,11 +309,17 @@ class SettingsResolver(object):
 
     def __init__(self, location_resolver=None):
         self.repository_resolver = ConfigResolver(location_resolver=location_resolver, env=RepositoryEnv(), config_file='repository.json')
-        # TODO remove config_resolver in the end
+        self.data_set_resolver = ConfigResolver(location_resolver=location_resolver, env=DataSetEnv(), config_file='data_set.json')
+        self.object_resolver = ConfigResolver(location_resolver=location_resolver, env=ObjectEnv(), config_file='object.json')
+        self.collection_resolver = ConfigResolver(location_resolver=location_resolver, env=CollectionEnv(), config_file='collection.json')
         self.config_resolver = ConfigResolver(location_resolver=location_resolver, env=ConfigEnv())
+        # TODO remove self.resolvers and all methods
         self.resolvers = []
-        self.resolvers.append(self.config_resolver)
         self.resolvers.append(self.repository_resolver)
+        self.resolvers.append(self.data_set_resolver)
+        self.resolvers.append(self.object_resolver)
+        self.resolvers.append(self.collection_resolver)
+        self.resolvers.append(self.config_resolver)
 
     def config_dict(self, local_only=False):
         combined_dict = {}
diff --git a/src/python/OBis/obis/scripts/cli.py b/src/python/OBis/obis/scripts/cli.py
index f304913304d3ed08dd0de3ec6e377f7ea8fb3ad2..6f11d4cd9b37b1b18fac407e1b63e60fcb492835 100644
--- a/src/python/OBis/obis/scripts/cli.py
+++ b/src/python/OBis/obis/scripts/cli.py
@@ -139,29 +139,29 @@ def init_handle_cleanup(result, object_id, collection_id, folder, data_mgmt):
             return check_result("init_data", set_property(data_mgmt, 'collection_id', collection_id, False, False))
 
 
-# setting commands
-# obis [type] [get|set] [-g]? [-p]? [[key]+ | [key=value]+]?
+# settings commands
 
 
-class GetOrSet(click.ParamType):
-    name = 'get_or_set'
+class SettingsGet(click.ParamType):
+    name = 'settings_get'
 
     def convert(self, value, param, ctx):
-        result = {}
-        result['get'] = value == 'get'
-        result['set'] = value == 'set'
-        if result['get'] == False and result['set'] == False:
-            self.fail(param=param, message='Parameter has to be \'get\' or \'set\'.')
-        return result
+        try:
+            split = list(filter(lambda term: len(term) > 0, value.split(',')))
+            return split
+        except:
+            self._fail(param)
 
+    def _fail(self, param):
+            self.fail(param=param, message='Settings must be in the format: key1, key2, ...')
 
-class Settings(click.ParamType):
-    name = 'settings'
+
+class SettingsSet(click.ParamType):
+    name = 'settings_set'
 
     def convert(self, value, param, ctx):
-        print(value)
         try:
-            properties = {}
+            settings = {}
             split = list(filter(lambda term: len(term) > 0, value.split(',')))
             for setting in split:
                 setting_split = setting.split('=')
@@ -169,8 +169,8 @@ class Settings(click.ParamType):
                     self._fail(param)
                 key = setting_split[0]
                 value = setting_split[1]
-                properties[key] = value
-            return properties
+                settings[key] = value
+            return settings
         except:
             self._fail(param)
 
@@ -178,7 +178,7 @@ class Settings(click.ParamType):
             self.fail(param=param, message='Settings must be in the format: key1=value1, key2=value2, ...')
 
 
-def _join_settings(setting_dicts):
+def _join_settings_set(setting_dicts):
     joined = {}
     for setting_dict in setting_dicts:
         for key, value in setting_dict.items():
@@ -186,23 +186,15 @@ def _join_settings(setting_dicts):
     return joined
 
 
-@cli.command()
-@click.argument('get_or_set', type=GetOrSet())
-@click.option('-g', '--is_global', default=False, is_flag=True, help='Configure global or local.')
-@click.argument('settings', type=Settings(), nargs=-1)
-@click.pass_context
-def repository(ctx, get_or_set, is_global, settings):
-    print(get_or_set)
-    print(is_global)
-    settings_dict = _join_settings(settings)
-    print(settings_dict)
-    for prop, value in settings_dict.items():
-        data_mgmt = shared_data_mgmt(ctx.obj)
-        resolver = data_mgmt.settings_resolver.properties_resolver
-        config_internal_new(data_mgmt, resolver, is_global, False, prop, value)
+def _join_settings_get(setting_lists):
+    joined = []
+    for setting_list in setting_lists:
+        joined += setting_list
+    return joined
 
 
-def config_internal_new(data_mgmt, resolver, is_global, is_data_set_property, prop, value):
+# TODO also get for is_data_set_property
+def _config_internal_new(data_mgmt, resolver, is_global, is_data_set_property, prop, value):
     if is_global:
         resolver.set_location_search_order(['global'])
     else:
@@ -225,45 +217,176 @@ def config_internal_new(data_mgmt, resolver, is_global, is_data_set_property, pr
         return check_result("config", set_property(data_mgmt, prop, value, is_global, is_data_set_property))
 
 
+def _set(ctx, settings):
+    is_global = ctx.obj['is_global']
+    data_mgmt = ctx.obj['data_mgmt']
+    resolver = ctx.obj['resolver']
+    is_data_set_property = ctx.obj['is_data_set_property'] == True
+    settings_dict = _join_settings_set(settings)
+    for prop, value in settings_dict.items():
+        _config_internal_new(data_mgmt, resolver, is_global, is_data_set_property, prop, value)
 
-## repository -> properties.json
-### repository_id
-### external_dms_id
-### data_set_id
 
-## config -> config.json
-### fileservice_url
-### git_annex_hash_as_checksum
-### hostname
-### openbis_url
-### user
-### verify_certificates
+def _get(ctx, settings):
+    is_global = ctx.obj['is_global']
+    data_mgmt = ctx.obj['data_mgmt']
+    resolver = ctx.obj['resolver']
+    if 'is_data_set_property' in ctx.obj:
+        is_data_set_property = ctx.obj['is_data_set_property']
+    else:
+        is_data_set_property = False
+    settings_list = _join_settings_get(settings)
+    if len(settings_list) == 0:
+        settings_list = [None]
+    for prop in settings_list:
+        _config_internal_new(data_mgmt, resolver, is_global, is_data_set_property, prop, None)
 
-## object -> config.json
-### id
 
-## collection -> config.json
-### id
+## repository: repository_id, external_dms_id, data_set_id
 
-## data_set -> config.json
-### type
-### properties
+@cli.group()
+@click.option('-g', '--is_global', default=False, is_flag=True, help='Set/get global or local.')
+@click.pass_context
+def repository(ctx, is_global):
+    ctx.obj['is_global'] = is_global
+    ctx.obj['data_mgmt'] = shared_data_mgmt(ctx.obj)
+    ctx.obj['resolver'] = ctx.obj['data_mgmt'].settings_resolver.repository_resolver
 
 
-# TODO replace by multiple commands
-@cli.command()
-@click.option('-g', '--is_global', default=False, is_flag=True, help='Configure global or local.')
+@repository.command('set')
+@click.argument('settings', type=SettingsSet(), nargs=-1)
+@click.pass_context
+def repository_set(ctx, settings):
+    _set(ctx, settings)
+
+
+@repository.command('get')
+@click.argument('settings', type=SettingsGet(), nargs=-1)
+@click.pass_context
+def repository_get(ctx, settings):
+    _get(ctx, settings)
+
+
+## data_set: type, properties
+
+
+@cli.group()
+@click.option('-g', '--is_global', default=False, is_flag=True, help='Set/get global or local.')
 @click.option('-p', '--is_data_set_property', default=False, is_flag=True, help='Configure data set property.')
-@click.argument('prop', default="")
-@click.argument('value', default="")
 @click.pass_context
-def config(ctx, is_global, is_data_set_property, prop, value):
-    """Configure the openBIS setup.
+def data_set(ctx, is_global, is_data_set_property):
+    ctx.obj['is_global'] = is_global
+    ctx.obj['is_data_set_property'] = is_data_set_property
+    ctx.obj['data_mgmt'] = shared_data_mgmt(ctx.obj)
+    ctx.obj['resolver'] = ctx.obj['data_mgmt'].settings_resolver.data_set_resolver
 
-    Configure the openBIS server url, the data set type, and the data set properties.
-    """
-    data_mgmt = shared_data_mgmt(ctx.obj)
-    config_internal(data_mgmt, is_global, is_data_set_property, prop, value)
+
+@data_set.command('set')
+@click.argument('settings', type=SettingsSet(), nargs=-1)
+@click.pass_context
+def data_set_set(ctx, settings):
+    _set(ctx, settings)
+
+
+@data_set.command('get')
+@click.argument('settings', type=SettingsGet(), nargs=-1)
+@click.pass_context
+def data_set_get(ctx, settings):
+    _get(ctx, settings)
+
+
+## object: object_id
+
+
+@cli.group()
+@click.option('-g', '--is_global', default=False, is_flag=True, help='Set/get global or local.')
+@click.pass_context
+def object(ctx, is_global):
+    ctx.obj['is_global'] = is_global
+    ctx.obj['data_mgmt'] = shared_data_mgmt(ctx.obj)
+    ctx.obj['resolver'] = ctx.obj['data_mgmt'].settings_resolver.object_resolver
+
+
+@object.command('set')
+@click.argument('settings', type=SettingsSet(), nargs=-1)
+@click.pass_context
+def object_set(ctx, settings):
+    _set(ctx, settings)
+
+
+@object.command('get')
+@click.argument('settings', type=SettingsGet(), nargs=-1)
+@click.pass_context
+def object_get(ctx, settings):
+    _get(ctx, settings)
+
+
+## collection: collection_id
+
+
+@cli.group()
+@click.option('-g', '--is_global', default=False, is_flag=True, help='Set/get global or local.')
+@click.pass_context
+def collection(ctx, is_global):
+    ctx.obj['is_global'] = is_global
+    ctx.obj['data_mgmt'] = shared_data_mgmt(ctx.obj)
+    ctx.obj['resolver'] = ctx.obj['data_mgmt'].settings_resolver.collection_resolver
+
+
+@collection.command('set')
+@click.argument('settings', type=SettingsSet(), nargs=-1)
+@click.pass_context
+def collection_set(ctx, settings):
+    _set(ctx, settings)
+
+
+@collection.command('get')
+@click.argument('settings', type=SettingsGet(), nargs=-1)
+@click.pass_context
+def collection_get(ctx, settings):
+    _get(ctx, settings)
+
+
+## config: fileservice_url, git_annex_hash_as_checksum, hostname, openbis_url, user, verify_certificates
+
+
+@cli.group()
+@click.option('-g', '--is_global', default=False, is_flag=True, help='Set/get global or local.')
+@click.pass_context
+def config(ctx, is_global):
+    ctx.obj['is_global'] = is_global
+    ctx.obj['data_mgmt'] = shared_data_mgmt(ctx.obj)
+    ctx.obj['resolver'] = ctx.obj['data_mgmt'].settings_resolver.config_resolver
+
+
+@config.command('set')
+@click.argument('settings', type=SettingsSet(), nargs=-1)
+@click.pass_context
+def config_set(ctx, settings):
+    _set(ctx, settings)
+
+
+@config.command('get')
+@click.argument('settings', type=SettingsGet(), nargs=-1)
+@click.pass_context
+def config_get(ctx, settings):
+    _get(ctx, settings)
+
+
+# TODO replace by multiple commands
+# @cli.command()
+# @click.option('-g', '--is_global', default=False, is_flag=True, help='Configure global or local.')
+# @click.option('-p', '--is_data_set_property', default=False, is_flag=True, help='Configure data set property.')
+# @click.argument('prop', default="")
+# @click.argument('value', default="")
+# @click.pass_context
+# def config(ctx, is_global, is_data_set_property, prop, value):
+#     """Configure the openBIS setup.
+
+#     Configure the openBIS server url, the data set type, and the data set properties.
+#     """
+#     data_mgmt = shared_data_mgmt(ctx.obj)
+#     config_internal(data_mgmt, is_global, is_data_set_property, prop, value)
 
 
 # repository commands: status, sync, commit, init, addref, removeref, init_analysis