diff --git a/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserController.js b/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserController.js
index 511531b6a5ed5109be823b7cb1e3f86becdfad79..f59af8844edde5293776e93ff79890b4df87ed20 100644
--- a/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserController.js
+++ b/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserController.js
@@ -1,7 +1,6 @@
 import BrowserController from '@src/js/components/common/browser2/BrowserController.js'
 import TypeBrowserControllerLoadNodePath from '@src/js/components/types/browser2/TypeBrowserControllerLoadNodePath.js'
-import TypeBrowserControllerLoadNodesFiltered from '@src/js/components/types/browser2/TypeBrowserControllerLoadNodesFiltered.js'
-import TypeBrowserControllerLoadNodesUnfiltered from '@src/js/components/types/browser2/TypeBrowserControllerLoadNodesUnfiltered.js'
+import TypeBrowserControllerLoadNodes from '@src/js/components/types/browser2/TypeBrowserControllerLoadNodes.js'
 import TypeBrowserControllerAddNode from '@src/js/components/types/browser2/TypeBrowserControllerAddNode.js'
 import TypeBrowserControllerRemoveNode from '@src/js/components/types/browser2/TypeBrowserControllerRemoveNode.js'
 import TypeBrowserControllerReload from '@src/js/components/types/browser2/TypeBrowserControllerReload.js'
@@ -12,17 +11,7 @@ export default class TypeBrowserController extends BrowserController {
   }
 
   async doLoadNodes(params) {
-    const { filter } = params
-
-    if (filter) {
-      return await new TypeBrowserControllerLoadNodesFiltered().doLoadFilteredNodes(
-        params
-      )
-    } else {
-      return await new TypeBrowserControllerLoadNodesUnfiltered().doLoadUnfilteredNodes(
-        params
-      )
-    }
+    return await new TypeBrowserControllerLoadNodes().doLoadNodes(params)
   }
 
   async reload(objectModifications) {
diff --git a/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserControllerLoadNodePath.js b/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserControllerLoadNodePath.js
index 6dbea1ea9897c49611f898d8f7d959bf7e32f4a8..03292d84422bd4f3cf52528251857f3bc12b5464 100644
--- a/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserControllerLoadNodePath.js
+++ b/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserControllerLoadNodePath.js
@@ -45,7 +45,7 @@ export default class TypeBrowserConstsLoadNodePath {
       const types = await openbis.getSampleTypes([id], fetchOptions)
       const type = types[object.id]
 
-      return this.createTypePath(
+      return this.createNodePath(
         object,
         type,
         objectType.OBJECT_TYPE,
@@ -58,7 +58,7 @@ export default class TypeBrowserConstsLoadNodePath {
       const types = await openbis.getExperimentTypes([id], fetchOptions)
       const type = types[object.id]
 
-      return this.createTypePath(
+      return this.createNodePath(
         object,
         type,
         objectType.COLLECTION_TYPE,
@@ -71,7 +71,7 @@ export default class TypeBrowserConstsLoadNodePath {
       const types = await openbis.getDataSetTypes([id], fetchOptions)
       const type = types[object.id]
 
-      return this.createTypePath(
+      return this.createNodePath(
         object,
         type,
         objectType.DATA_SET_TYPE,
@@ -84,7 +84,7 @@ export default class TypeBrowserConstsLoadNodePath {
       const types = await openbis.getMaterialTypes([id], fetchOptions)
       const type = types[object.id]
 
-      return this.createTypePath(
+      return this.createNodePath(
         object,
         type,
         objectType.MATERIAL_TYPE,
@@ -97,7 +97,7 @@ export default class TypeBrowserConstsLoadNodePath {
       const types = await openbis.getVocabularies([id], fetchOptions)
       const type = types[object.id]
 
-      return this.createTypePath(
+      return this.createNodePath(
         object,
         type,
         objectType.VOCABULARY_TYPE,
@@ -121,7 +121,7 @@ export default class TypeBrowserConstsLoadNodePath {
     ]
   }
 
-  createTypePath(object, type, folderObjectType, folderText) {
+  createNodePath(object, type, folderObjectType, folderText) {
     if (type) {
       const folderPath = this.createFolderPath(folderObjectType, folderText)
       return [
diff --git a/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserControllerLoadNodes.js b/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserControllerLoadNodes.js
new file mode 100644
index 0000000000000000000000000000000000000000..15de855b888e5a7866c72d38340ad9f6a0153c5b
--- /dev/null
+++ b/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserControllerLoadNodes.js
@@ -0,0 +1,311 @@
+import _ from 'lodash'
+import TypeBrowserConsts from '@src/js/components/types/browser2/TypeBrowserConsts.js'
+import openbis from '@src/js/services/openbis.js'
+import objectType from '@src/js/common/consts/objectType.js'
+import messages from '@src/js/common/messages.js'
+import compare from '@src/js/common/compare.js'
+
+const LOAD_LIMIT = 100
+const TOTAL_LOAD_LIMIT = 500
+
+export default class TypeBrowserConstsLoadNodesUnfiltered {
+  async doLoadNodes(params) {
+    const { node } = params
+
+    if (node.internalRoot) {
+      return {
+        nodes: [
+          {
+            id: TypeBrowserConsts.TYPE_ROOT,
+            object: {
+              type: TypeBrowserConsts.TYPE_ROOT
+            },
+            canHaveChildren: true
+          }
+        ]
+      }
+    } else if (node.object.type === TypeBrowserConsts.TYPE_ROOT) {
+      const [
+        objectTypes,
+        collectionTypes,
+        dataSetTypes,
+        materialTypes,
+        vocabularyTypes
+      ] = await Promise.all([
+        this.searchObjectTypes(params),
+        this.searchCollectionTypes(params),
+        this.searchDataSetTypes(params),
+        this.searchMaterialTypes(params),
+        this.searchVocabularyTypes(params)
+      ])
+
+      if (params.filter) {
+        const totalCount =
+          objectTypes.getTotalCount() +
+          collectionTypes.getTotalCount() +
+          dataSetTypes.getTotalCount() +
+          materialTypes.getTotalCount() +
+          vocabularyTypes.getTotalCount()
+
+        if (totalCount > TOTAL_LOAD_LIMIT) {
+          return this.tooManyResultsFound(node)
+        }
+      }
+
+      let nodes = [
+        this.createObjectTypesNode(node, objectTypes),
+        this.createCollectionTypesNode(node, collectionTypes),
+        this.createDataSetTypesNode(node, dataSetTypes),
+        this.createMaterialTypesNode(node, materialTypes),
+        this.createVocabularyTypesNode(node, vocabularyTypes),
+        this.createPropertyTypesNode(node, null)
+      ]
+
+      if (params.filter) {
+        nodes = nodes.filter(node => !_.isEmpty(node.children))
+      }
+
+      return {
+        nodes: nodes
+      }
+    } else if (node.object.type === objectType.OVERVIEW) {
+      let types = null
+
+      if (node.object.id === objectType.OBJECT_TYPE) {
+        types = await this.searchObjectTypes(params)
+      } else if (node.object.id === objectType.COLLECTION_TYPE) {
+        types = await this.searchCollectionTypes(params)
+      } else if (node.object.id === objectType.DATA_SET_TYPE) {
+        types = await this.searchDataSetTypes(params)
+      } else if (node.object.id === objectType.MATERIAL_TYPE) {
+        types = await this.searchMaterialTypes(params)
+      } else if (node.object.id === objectType.VOCABULARY_TYPE) {
+        types = await this.searchVocabularyTypes(params)
+      }
+
+      if (types) {
+        return this.createNodes(node, types, node.object.id)
+      } else {
+        return {
+          nodes: []
+        }
+      }
+    } else {
+      return null
+    }
+  }
+
+  tooManyResultsFound(node) {
+    return {
+      nodes: [
+        {
+          id: TypeBrowserConsts.nodeId(node.id, TypeBrowserConsts.TYPE_WARNING),
+          message: {
+            type: 'warning',
+            text: messages.get(messages.TOO_MANY_FILTERED_RESULTS_FOUND)
+          },
+          selectable: false
+        }
+      ]
+    }
+  }
+
+  async searchObjectTypes(params) {
+    const { filter, offset, limit } = params
+
+    const criteria = new openbis.SampleTypeSearchCriteria()
+    if (filter) {
+      criteria.withCode().thatContains(filter)
+    }
+    const fetchOptions = new openbis.SampleTypeFetchOptions()
+
+    const result = await openbis.searchSampleTypes(criteria, fetchOptions)
+    result.criteria = {
+      filter,
+      offset,
+      limit
+    }
+    return result
+  }
+
+  async searchCollectionTypes(params) {
+    const { filter, offset, limit } = params
+
+    const criteria = new openbis.ExperimentTypeSearchCriteria()
+    if (filter) {
+      criteria.withCode().thatContains(filter)
+    }
+    const fetchOptions = new openbis.ExperimentTypeFetchOptions()
+
+    const result = await openbis.searchExperimentTypes(criteria, fetchOptions)
+    result.criteria = {
+      filter,
+      offset,
+      limit
+    }
+    return result
+  }
+
+  async searchDataSetTypes(params) {
+    const { filter, offset, limit } = params
+
+    const criteria = new openbis.DataSetTypeSearchCriteria()
+    if (filter) {
+      criteria.withCode().thatContains(filter)
+    }
+    const fetchOptions = new openbis.DataSetTypeFetchOptions()
+
+    const result = await openbis.searchDataSetTypes(criteria, fetchOptions)
+    result.criteria = {
+      filter,
+      offset,
+      limit
+    }
+    return result
+  }
+
+  async searchMaterialTypes(params) {
+    const { filter, offset, limit } = params
+
+    const criteria = new openbis.MaterialTypeSearchCriteria()
+    if (filter) {
+      criteria.withCode().thatContains(filter)
+    }
+    const fetchOptions = new openbis.MaterialTypeFetchOptions()
+
+    const result = await openbis.searchMaterialTypes(criteria, fetchOptions)
+    result.criteria = {
+      filter,
+      offset,
+      limit
+    }
+    return result
+  }
+
+  async searchVocabularyTypes(params) {
+    const { filter, offset, limit } = params
+
+    const criteria = new openbis.VocabularySearchCriteria()
+    if (filter) {
+      criteria.withCode().thatContains(filter)
+    }
+    const fetchOptions = new openbis.VocabularyFetchOptions()
+
+    const result = await openbis.searchVocabularies(criteria, fetchOptions)
+    result.criteria = {
+      filter,
+      offset,
+      limit
+    }
+    return result
+  }
+
+  createObjectTypesNode(parent, result) {
+    return this.createFolderNode(
+      parent,
+      result,
+      objectType.OBJECT_TYPE,
+      TypeBrowserConsts.TEXT_OBJECT_TYPES
+    )
+  }
+
+  createCollectionTypesNode(parent, result) {
+    return this.createFolderNode(
+      parent,
+      result,
+      objectType.COLLECTION_TYPE,
+      TypeBrowserConsts.TEXT_COLLECTION_TYPES
+    )
+  }
+
+  createDataSetTypesNode(parent, result) {
+    return this.createFolderNode(
+      parent,
+      result,
+      objectType.DATA_SET_TYPE,
+      TypeBrowserConsts.TEXT_DATA_SET_TYPES
+    )
+  }
+
+  createMaterialTypesNode(parent, result) {
+    return this.createFolderNode(
+      parent,
+      result,
+      objectType.MATERIAL_TYPE,
+      TypeBrowserConsts.TEXT_MATERIAL_TYPES
+    )
+  }
+
+  createVocabularyTypesNode(parent, result) {
+    return this.createFolderNode(
+      parent,
+      result,
+      objectType.VOCABULARY_TYPE,
+      TypeBrowserConsts.TEXT_VOCABULARY_TYPES
+    )
+  }
+
+  createPropertyTypesNode(parent, result) {
+    return this.createFolderNode(
+      parent,
+      result,
+      objectType.PROPERTY_TYPE,
+      TypeBrowserConsts.TEXT_PROPERTY_TYPES
+    )
+  }
+
+  createFolderNode(parent, result, folderObjectType, folderText) {
+    const folderNode = {
+      id: TypeBrowserConsts.nodeId(parent.id, folderObjectType),
+      text: folderText,
+      object: {
+        type: objectType.OVERVIEW,
+        id: folderObjectType
+      },
+      canHaveChildren: !!result,
+      selectable: true,
+      expanded: true
+    }
+
+    if (result) {
+      folderNode.children = this.createNodes(
+        folderNode,
+        result,
+        folderObjectType
+      )
+    }
+
+    return folderNode
+  }
+
+  createNodes(parent, result, objectType) {
+    const { offset } = result.criteria
+
+    let objects = result.getObjects()
+    objects.sort((o1, o2) => compare(o1.code, o2.code))
+    objects = objects.slice(offset, offset + LOAD_LIMIT)
+
+    let nodes = objects.map(type => ({
+      id: TypeBrowserConsts.nodeId(parent.id, objectType, type.getCode()),
+      text: type.getCode(),
+      object: {
+        type: objectType,
+        id: type.getCode()
+      }
+    }))
+
+    if (_.isEmpty(nodes)) {
+      return null
+    } else {
+      return {
+        nodes: nodes,
+        loadMore: {
+          offset: offset + nodes.length,
+          loadedCount: offset + nodes.length,
+          totalCount: result.getTotalCount(),
+          append: true
+        }
+      }
+    }
+  }
+}
diff --git a/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserControllerLoadNodesFiltered.js b/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserControllerLoadNodesFiltered.js
deleted file mode 100644
index 68a90958c2b588b40b7711048d5982e703e2e202..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserControllerLoadNodesFiltered.js
+++ /dev/null
@@ -1,282 +0,0 @@
-import _ from 'lodash'
-import TypeBrowserConsts from '@src/js/components/types/browser2/TypeBrowserConsts.js'
-import openbis from '@src/js/services/openbis.js'
-import objectType from '@src/js/common/consts/objectType.js'
-import messages from '@src/js/common/messages.js'
-import compare from '@src/js/common/compare.js'
-
-const LOAD_LIMIT = 50
-const TOTAL_LOAD_LIMIT = 500
-
-export default class TypeBrowserConstsLoadNodesFiltered {
-  async doLoadFilteredNodes(params) {
-    const { node } = params
-
-    const [
-      objectTypes,
-      collectionTypes,
-      dataSetTypes,
-      materialTypes,
-      vocabularyTypes
-    ] = await Promise.all([
-      this.searchObjectTypes(params),
-      this.searchCollectionTypes(params),
-      this.searchDataSetTypes(params),
-      this.searchMaterialTypes(params),
-      this.searchVocabularyTypes(params)
-    ])
-
-    const loadedCount =
-      objectTypes.getObjects().length +
-      collectionTypes.getObjects().length +
-      dataSetTypes.getObjects().length +
-      materialTypes.getObjects().length +
-      vocabularyTypes.getObjects().length
-
-    const totalCount =
-      objectTypes.getTotalCount() +
-      collectionTypes.getTotalCount() +
-      dataSetTypes.getTotalCount() +
-      materialTypes.getTotalCount() +
-      vocabularyTypes.getTotalCount()
-
-    if (totalCount > TOTAL_LOAD_LIMIT) {
-      return this.tooManyResultsFound(node)
-    }
-
-    const result = {
-      nodes: [],
-      loadMore: {
-        offset: 0,
-        limit: TOTAL_LOAD_LIMIT,
-        loadedCount: loadedCount,
-        totalCount: totalCount,
-        append: false
-      }
-    }
-
-    if (node.internalRoot) {
-      const root = {
-        id: TypeBrowserConsts.TYPE_ROOT,
-        object: {
-          type: TypeBrowserConsts.TYPE_ROOT
-        },
-        canHaveChildren: true
-      }
-      root.children = this.doLoadFilteredNodes({
-        ...params,
-        node: root
-      })
-      result.nodes.push(root)
-    } else if (node.object.type === TypeBrowserConsts.TYPE_ROOT) {
-      if (!_.isEmpty(objectTypes.getObjects())) {
-        const objectTypesNode = this.createObjectTypesNode(
-          params,
-          objectTypes.getObjects()
-        )
-        result.nodes.push(objectTypesNode)
-      }
-      if (!_.isEmpty(collectionTypes.getObjects())) {
-        const collectionTypesNode = this.createCollectionTypesNode(
-          params,
-          collectionTypes.getObjects()
-        )
-        result.nodes.push(collectionTypesNode)
-      }
-      if (!_.isEmpty(dataSetTypes.getObjects())) {
-        const dataSetTypesNode = this.createDataSetTypesNode(
-          params,
-          dataSetTypes.getObjects()
-        )
-        result.nodes.push(dataSetTypesNode)
-      }
-      if (!_.isEmpty(materialTypes.getObjects())) {
-        const materialTypesNode = this.createMaterialTypesNode(
-          params,
-          materialTypes.getObjects()
-        )
-        result.nodes.push(materialTypesNode)
-      }
-      if (!_.isEmpty(vocabularyTypes.getObjects())) {
-        const vocabularyTypesNode = this.createVocabularyTypesNode(
-          params,
-          vocabularyTypes.getObjects()
-        )
-        result.nodes.push(vocabularyTypesNode)
-      }
-    }
-
-    return result
-  }
-
-  tooManyResultsFound(node) {
-    return {
-      nodes: [
-        {
-          id: TypeBrowserConsts.nodeId(node.id, TypeBrowserConsts.TYPE_WARNING),
-          message: {
-            type: 'warning',
-            text: messages.get(messages.TOO_MANY_FILTERED_RESULTS_FOUND)
-          },
-          selectable: false
-        }
-      ]
-    }
-  }
-
-  async searchObjectTypes(params) {
-    const { filter, offset, limit } = params
-
-    const criteria = new openbis.SampleTypeSearchCriteria()
-    criteria.withCode().thatContains(filter)
-
-    const fetchOptions = new openbis.SampleTypeFetchOptions()
-    fetchOptions.from(offset)
-    fetchOptions.count(limit || LOAD_LIMIT)
-
-    const result = await openbis.searchSampleTypes(criteria, fetchOptions)
-
-    return result
-  }
-
-  async searchCollectionTypes(params) {
-    const { filter, offset, limit } = params
-
-    const criteria = new openbis.ExperimentTypeSearchCriteria()
-    criteria.withCode().thatContains(filter)
-
-    const fetchOptions = new openbis.ExperimentTypeFetchOptions()
-    fetchOptions.from(offset)
-    fetchOptions.count(limit || LOAD_LIMIT)
-
-    const result = await openbis.searchExperimentTypes(criteria, fetchOptions)
-
-    return result
-  }
-
-  async searchDataSetTypes(params) {
-    const { filter, offset, limit } = params
-
-    const criteria = new openbis.DataSetTypeSearchCriteria()
-    criteria.withCode().thatContains(filter)
-
-    const fetchOptions = new openbis.DataSetTypeFetchOptions()
-    fetchOptions.from(offset)
-    fetchOptions.count(limit || LOAD_LIMIT)
-
-    const result = await openbis.searchDataSetTypes(criteria, fetchOptions)
-
-    return result
-  }
-
-  async searchMaterialTypes(params) {
-    const { filter, offset, limit } = params
-
-    const criteria = new openbis.MaterialTypeSearchCriteria()
-    criteria.withCode().thatContains(filter)
-
-    const fetchOptions = new openbis.MaterialTypeFetchOptions()
-    fetchOptions.from(offset)
-    fetchOptions.count(limit || LOAD_LIMIT)
-
-    const result = await openbis.searchMaterialTypes(criteria, fetchOptions)
-
-    return result
-  }
-
-  async searchVocabularyTypes(params) {
-    const { filter, offset, limit } = params
-
-    const criteria = new openbis.VocabularySearchCriteria()
-    criteria.withCode().thatContains(filter)
-
-    const fetchOptions = new openbis.VocabularyFetchOptions()
-    fetchOptions.from(offset)
-    fetchOptions.count(limit || LOAD_LIMIT)
-
-    const result = await openbis.searchVocabularies(criteria, fetchOptions)
-
-    return result
-  }
-
-  createObjectTypesNode(params, types) {
-    return this.createNodesFolder(
-      params,
-      types,
-      objectType.OBJECT_TYPE,
-      TypeBrowserConsts.TEXT_OBJECT_TYPES
-    )
-  }
-
-  createCollectionTypesNode(params, types) {
-    return this.createNodesFolder(
-      params,
-      types,
-      objectType.COLLECTION_TYPE,
-      TypeBrowserConsts.TEXT_COLLECTION_TYPES
-    )
-  }
-
-  createDataSetTypesNode(params, types) {
-    return this.createNodesFolder(
-      params,
-      types,
-      objectType.DATA_SET_TYPE,
-      TypeBrowserConsts.TEXT_DATA_SET_TYPES
-    )
-  }
-
-  createMaterialTypesNode(params, types) {
-    return this.createNodesFolder(
-      params,
-      types,
-      objectType.MATERIAL_TYPE,
-      TypeBrowserConsts.TEXT_MATERIAL_TYPES
-    )
-  }
-
-  createVocabularyTypesNode(params, types) {
-    return this.createNodesFolder(
-      params,
-      types,
-      objectType.VOCABULARY_TYPE,
-      TypeBrowserConsts.TEXT_VOCABULARY_TYPES
-    )
-  }
-
-  createNodesFolder(params, types, folderObjectType, folderText) {
-    const { node } = params
-
-    const folderNode = {
-      id: TypeBrowserConsts.nodeId(node.id, folderObjectType),
-      text: folderText,
-      object: {
-        type: objectType.OVERVIEW,
-        id: folderObjectType
-      },
-      canHaveChildren: true,
-      children: { nodes: [] },
-      expanded: true
-    }
-
-    types.sort((o1, o2) => compare(o1.code, o2.code))
-
-    types.forEach(type => {
-      const typeNode = {
-        id: TypeBrowserConsts.nodeId(
-          folderNode.id,
-          folderObjectType,
-          type.code
-        ),
-        text: type.code,
-        object: {
-          type: folderObjectType,
-          id: type.code
-        }
-      }
-      folderNode.children.nodes.push(typeNode)
-    })
-
-    return folderNode
-  }
-}
diff --git a/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserControllerLoadNodesUnfiltered.js b/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserControllerLoadNodesUnfiltered.js
deleted file mode 100644
index c8f8a1f11f0aa4132d65272f7b5d31ebc296f5c8..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/src/js/components/types/browser2/TypeBrowserControllerLoadNodesUnfiltered.js
+++ /dev/null
@@ -1,231 +0,0 @@
-import _ from 'lodash'
-import TypeBrowserConsts from '@src/js/components/types/browser2/TypeBrowserConsts.js'
-import openbis from '@src/js/services/openbis.js'
-import objectType from '@src/js/common/consts/objectType.js'
-import compare from '@src/js/common/compare.js'
-
-const LOAD_LIMIT = 50
-
-export default class TypeBrowserConstsLoadNodesUnfiltered {
-  async doLoadUnfilteredNodes(params) {
-    const { node } = params
-
-    if (node.internalRoot) {
-      return {
-        nodes: [
-          {
-            id: TypeBrowserConsts.TYPE_ROOT,
-            object: {
-              type: TypeBrowserConsts.TYPE_ROOT
-            },
-            canHaveChildren: true
-          }
-        ]
-      }
-    } else if (node.object.type === TypeBrowserConsts.TYPE_ROOT) {
-      const nodes = []
-
-      await this.addObjectTypesNode(params, nodes)
-      await this.addCollectionTypesNode(params, nodes)
-      await this.addDataSetTypesNode(params, nodes)
-      await this.addMaterialTypesNode(params, nodes)
-      await this.addVocabularyTypesNode(params, nodes)
-      await this.addPropertyTypesNode(params, nodes)
-
-      return {
-        nodes: nodes
-      }
-    } else if (node.object.type === objectType.OVERVIEW) {
-      if (node.object.id === objectType.OBJECT_TYPE) {
-        return await this.searchObjectTypes(params)
-      } else if (node.object.id === objectType.COLLECTION_TYPE) {
-        return await this.searchCollectionTypes(params)
-      } else if (node.object.id === objectType.DATA_SET_TYPE) {
-        return await this.searchDataSetTypes(params)
-      } else if (node.object.id === objectType.MATERIAL_TYPE) {
-        return await this.searchMaterialTypes(params)
-      } else if (node.object.id === objectType.VOCABULARY_TYPE) {
-        return await this.searchVocabularyTypes(params)
-      } else if (node.object.id === objectType.PROPERTY_TYPE) {
-        return await this.searchPropertyTypes(params)
-      }
-    } else {
-      return null
-    }
-  }
-
-  async searchObjectTypes(params) {
-    const criteria = new openbis.SampleTypeSearchCriteria()
-    const fetchOptions = new openbis.SampleTypeFetchOptions()
-
-    const result = await openbis.searchSampleTypes(criteria, fetchOptions)
-
-    return this.createNodes(params, objectType.OBJECT_TYPE, result)
-  }
-
-  async searchCollectionTypes(params) {
-    const criteria = new openbis.ExperimentTypeSearchCriteria()
-    const fetchOptions = new openbis.ExperimentTypeFetchOptions()
-
-    const result = await openbis.searchExperimentTypes(criteria, fetchOptions)
-
-    return this.createNodes(params, objectType.COLLECTION_TYPE, result)
-  }
-
-  async searchDataSetTypes(params) {
-    const criteria = new openbis.DataSetTypeSearchCriteria()
-    const fetchOptions = new openbis.DataSetTypeFetchOptions()
-
-    const result = await openbis.searchDataSetTypes(criteria, fetchOptions)
-
-    return this.createNodes(params, objectType.DATA_SET_TYPE, result)
-  }
-
-  async searchMaterialTypes(params) {
-    const criteria = new openbis.MaterialTypeSearchCriteria()
-    const fetchOptions = new openbis.MaterialTypeFetchOptions()
-
-    const result = await openbis.searchMaterialTypes(criteria, fetchOptions)
-
-    return this.createNodes(params, objectType.MATERIAL_TYPE, result)
-  }
-
-  async searchVocabularyTypes(params) {
-    const criteria = new openbis.VocabularySearchCriteria()
-    const fetchOptions = new openbis.VocabularyFetchOptions()
-
-    const result = await openbis.searchVocabularies(criteria, fetchOptions)
-
-    return this.createNodes(params, objectType.VOCABULARY_TYPE, result)
-  }
-
-  async addObjectTypesNode(params, nodes) {
-    const folderNode = await this.createNodesFolder(
-      params,
-      objectType.OBJECT_TYPE,
-      TypeBrowserConsts.TEXT_OBJECT_TYPES,
-      this.searchObjectTypes.bind(this)
-    )
-    if (folderNode) {
-      nodes.push(folderNode)
-    }
-  }
-
-  async addCollectionTypesNode(params, nodes) {
-    const folderNode = await this.createNodesFolder(
-      params,
-      objectType.COLLECTION_TYPE,
-      TypeBrowserConsts.TEXT_COLLECTION_TYPES,
-      this.searchCollectionTypes.bind(this)
-    )
-    if (folderNode) {
-      nodes.push(folderNode)
-    }
-  }
-
-  async addDataSetTypesNode(params, nodes) {
-    const folderNode = await this.createNodesFolder(
-      params,
-      objectType.DATA_SET_TYPE,
-      TypeBrowserConsts.TEXT_DATA_SET_TYPES,
-      this.searchDataSetTypes.bind(this)
-    )
-    if (folderNode) {
-      nodes.push(folderNode)
-    }
-  }
-
-  async addMaterialTypesNode(params, nodes) {
-    const folderNode = await this.createNodesFolder(
-      params,
-      objectType.MATERIAL_TYPE,
-      TypeBrowserConsts.TEXT_MATERIAL_TYPES,
-      this.searchMaterialTypes.bind(this)
-    )
-    if (folderNode) {
-      nodes.push(folderNode)
-    }
-  }
-
-  async addVocabularyTypesNode(params, nodes) {
-    const folderNode = await this.createNodesFolder(
-      params,
-      objectType.VOCABULARY_TYPE,
-      TypeBrowserConsts.TEXT_VOCABULARY_TYPES,
-      this.searchVocabularyTypes.bind(this)
-    )
-    if (folderNode) {
-      nodes.push(folderNode)
-    }
-  }
-
-  async addPropertyTypesNode(params, nodes) {
-    const folderNode = await this.createNodesFolder(
-      params,
-      objectType.PROPERTY_TYPE,
-      TypeBrowserConsts.TEXT_PROPERTY_TYPES,
-      () => []
-    )
-    if (folderNode) {
-      folderNode.canHaveChildren = false
-      nodes.push(folderNode)
-    }
-  }
-
-  createNodes(params, objectType, result) {
-    const { node, offset } = params
-
-    let nodes = result.getObjects().map(type => ({
-      id: TypeBrowserConsts.nodeId(node.id, objectType, type.getCode()),
-      text: type.getCode(),
-      object: {
-        type: objectType,
-        id: type.getCode()
-      }
-    }))
-
-    nodes.sort((n1, n2) => compare(n1.text, n2.text))
-    nodes = nodes.slice(offset, offset + LOAD_LIMIT)
-
-    if (_.isEmpty(nodes)) {
-      return null
-    } else {
-      return {
-        nodes: nodes,
-        loadMore: {
-          offset: offset + nodes.length,
-          loadedCount: offset + nodes.length,
-          totalCount: result.getTotalCount(),
-          append: offset > 0
-        }
-      }
-    }
-  }
-
-  async createNodesFolder(params, folderObjectType, folderText, search) {
-    const { node } = params
-
-    const folderNode = {
-      id: TypeBrowserConsts.nodeId(node.id, folderObjectType),
-      text: folderText,
-      object: {
-        type: objectType.OVERVIEW,
-        id: folderObjectType
-      },
-      canHaveChildren: true,
-      selectable: true
-    }
-
-    const nodes = await search({
-      ...params,
-      node: folderNode
-    })
-
-    if (nodes) {
-      folderNode.children = nodes
-      return folderNode
-    } else {
-      return null
-    }
-  }
-}