diff --git a/openbis_ng_ui/src/js/components/users/Users.jsx b/openbis_ng_ui/src/js/components/users/Users.jsx
index ff37c9faaea02f0e01c53274de1b241d5b0ec049..f72928d31d5886ccb45c2f5821ff68227dabf53f 100644
--- a/openbis_ng_ui/src/js/components/users/Users.jsx
+++ b/openbis_ng_ui/src/js/components/users/Users.jsx
@@ -2,7 +2,7 @@ import React from 'react'
 import { withStyles } from '@material-ui/core/styles'
 import Content from '@src/js/components/common/content/Content.jsx'
 import ContentTab from '@src/js/components/common/content/ContentTab.jsx'
-import UserBrowser from '@src/js/components/users/browser2/UserBrowser.jsx'
+import UserBrowser from '@src/js/components/users/browser/UserBrowser.jsx'
 import UserSearch from '@src/js/components/users/search/UserSearch.jsx'
 import UserForm from '@src/js/components/users/form/user/UserForm.jsx'
 import UserGroupForm from '@src/js/components/users/form/usergroup/UserGroupForm.jsx'
diff --git a/openbis_ng_ui/src/js/components/users/browser/UserBrowser.jsx b/openbis_ng_ui/src/js/components/users/browser/UserBrowser.jsx
index f4039f3505949dec75fddffd6403254e88827041..aba73bc0286077dac1cc7acd7e6e37f944ec843a 100644
--- a/openbis_ng_ui/src/js/components/users/browser/UserBrowser.jsx
+++ b/openbis_ng_ui/src/js/components/users/browser/UserBrowser.jsx
@@ -1,18 +1,78 @@
+import _ from 'lodash'
 import React from 'react'
-import Browser from '@src/js/components/common/browser/Browser.jsx'
+import autoBind from 'auto-bind'
+import BrowserWithOpenbis from '@src/js/components/common/browser2/BrowserWithOpenbis.jsx'
+import BrowserButtonsAddRemove from '@src/js/components/common/browser2/BrowserButtonsAddRemove.jsx'
 import UserBrowserController from '@src/js/components/users/browser/UserBrowserController.js'
+import AppController from '@src/js/components/AppController.js'
+import pages from '@src/js/common/consts/pages.js'
+import ids from '@src/js/common/consts/ids.js'
 import logger from '@src/js/common/logger.js'
 
-class UserBrowser extends React.Component {
+export class UserBrowser extends React.Component {
   constructor(props) {
     super(props)
+    autoBind(this)
     this.controller = this.props.controller || new UserBrowserController()
   }
 
+  componentDidMount() {
+    this.componentDidUpdate({})
+  }
+
+  componentDidUpdate(prevProps) {
+    if (!_.isEqual(this.props.selectedObject, prevProps.selectedObject)) {
+      this.controller.selectObject(this.props.selectedObject)
+    }
+
+    if (
+      !_.isEqual(
+        this.props.lastObjectModifications,
+        prevProps.lastObjectModifications
+      )
+    ) {
+      this.controller.reload(this.props.lastObjectModifications)
+    }
+  }
+
   render() {
     logger.log(logger.DEBUG, 'UserBrowser.render')
-    return <Browser controller={this.controller} />
+
+    return (
+      <BrowserWithOpenbis
+        id={ids.USER_BROWSER_ID}
+        controller={this.controller}
+        renderFooter={this.renderFooter}
+        onSelectedChange={selectedObject => {
+          if (selectedObject) {
+            AppController.getInstance().objectOpen(
+              pages.USERS,
+              selectedObject.type,
+              selectedObject.id
+            )
+          }
+        }}
+      />
+    )
+  }
+
+  renderFooter() {
+    return (
+      <div>
+        <BrowserButtonsAddRemove
+          selectedObject={this.controller.getSelectedObject()}
+          addEnabled={this.controller.canAddNode()}
+          removeEnabled={this.controller.canRemoveNode()}
+          onAdd={this.controller.addNode}
+          onRemove={this.controller.removeNode}
+        />
+      </div>
+    )
   }
 }
 
-export default UserBrowser
+export default AppController.getInstance().withState(() => ({
+  selectedObject: AppController.getInstance().getSelectedObject(pages.USERS),
+  lastObjectModifications:
+    AppController.getInstance().getLastObjectModifications()
+}))(UserBrowser)
diff --git a/openbis_ng_ui/src/js/components/users/browser2/UserBrowserConsts.js b/openbis_ng_ui/src/js/components/users/browser/UserBrowserConsts.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/browser2/UserBrowserConsts.js
rename to openbis_ng_ui/src/js/components/users/browser/UserBrowserConsts.js
diff --git a/openbis_ng_ui/src/js/components/users/browser/UserBrowserController.js b/openbis_ng_ui/src/js/components/users/browser/UserBrowserController.js
index b32cf50aac4006076e88a4d2ec1cd2d23026df8e..f9ef8ba8160bb9d0a446b39d9528762dea54b2f5 100644
--- a/openbis_ng_ui/src/js/components/users/browser/UserBrowserController.js
+++ b/openbis_ng_ui/src/js/components/users/browser/UserBrowserController.js
@@ -1,146 +1,42 @@
-import openbis from '@src/js/services/openbis.js'
-import pages from '@src/js/common/consts/pages.js'
-import objectType from '@src/js/common/consts/objectType.js'
-import objectOperation from '@src/js/common/consts/objectOperation.js'
-import BrowserController from '@src/js/components/common/browser/BrowserController.js'
-import AppController from '@src/js/components/AppController.js'
-import messages from '@src/js/common/messages.js'
+import BrowserController from '@src/js/components/common/browser2/BrowserController.js'
+import UserBrowserControllerLoadNodePath from '@src/js/components/users/browser/UserBrowserControllerLoadNodePath.js'
+import UserBrowserControllerLoadNodes from '@src/js/components/users/browser/UserBrowserControllerLoadNodes.js'
+import UserBrowserControllerAddNode from '@src/js/components/users/browser/UserBrowserControllerAddNode.js'
+import UserBrowserControllerRemoveNode from '@src/js/components/users/browser/UserBrowserControllerRemoveNode.js'
+import UserBrowserControllerReload from '@src/js/components/users/browser/UserBrowserControllerReload.js'
 
 export default class UserBrowserController extends BrowserController {
-  doGetPage() {
-    return pages.USERS
+  async doLoadNodePath(params) {
+    return await new UserBrowserControllerLoadNodePath().doLoadNodePath(params)
   }
 
-  async doLoadNodes() {
-    return Promise.all([
-      openbis.searchPersons(
-        new openbis.PersonSearchCriteria(),
-        new openbis.PersonFetchOptions()
-      ),
-      openbis.searchAuthorizationGroups(
-        new openbis.AuthorizationGroupSearchCriteria(),
-        new openbis.AuthorizationGroupFetchOptions()
-      )
-    ]).then(([users, groups]) => {
-      const userNodes = users.getObjects().map(user => {
-        return {
-          id: `users/${user.userId}`,
-          text: user.userId,
-          object: { type: objectType.USER, id: user.userId },
-          canMatchFilter: true,
-          canRemove: true
-        }
-      })
-
-      const groupNodes = groups.getObjects().map(group => {
-        return {
-          id: `groups/${group.code}`,
-          text: group.code,
-          object: { type: objectType.USER_GROUP, id: group.code },
-          canMatchFilter: true,
-          canRemove: true
-        }
-      })
-
-      let nodes = [
-        {
-          id: 'users',
-          text: messages.get(messages.USERS),
-          object: { type: objectType.OVERVIEW, id: objectType.USER },
-          children: userNodes,
-          childrenType: objectType.NEW_USER,
-          canAdd: true
-        },
-        {
-          id: 'groups',
-          text: messages.get(messages.GROUPS),
-          object: { type: objectType.OVERVIEW, id: objectType.USER_GROUP },
-          children: groupNodes,
-          childrenType: objectType.NEW_USER_GROUP,
-          canAdd: true
-        }
-      ]
-
-      return nodes
-    })
+  async doLoadNodes(params) {
+    return await new UserBrowserControllerLoadNodes().doLoadNodes(params)
   }
 
-  doNodeAdd(node) {
-    if (node && node.childrenType) {
-      AppController.getInstance().objectNew(this.getPage(), node.childrenType)
-    }
-  }
-
-  doNodeRemove(node) {
-    if (!node.object) {
-      return Promise.resolve()
-    }
-
-    const { type, id } = node.object
-    const reason = 'deleted via ng_ui'
-
-    return this._prepareRemoveOperations(type, id, reason)
-      .then(operations => {
-        const options = new openbis.SynchronousOperationExecutionOptions()
-        options.setExecuteInOrder(true)
-        return openbis.executeOperations(operations, options)
-      })
-      .then(() => {
-        AppController.getInstance().objectDelete(this.getPage(), type, id)
-      })
-      .catch(error => {
-        if (
-          error &&
-          error.message &&
-          error.message.startsWith('Could not commit Hibernate transaction')
-        ) {
-          AppController.getInstance().errorChange(
-            messages.get(
-              messages.USERS_WHO_REGISTERED_SOME_DATA_CANNOT_BE_REMOVED
-            )
-          )
-        } else {
-          AppController.getInstance().errorChange(error)
-        }
-      })
+  async reload(objectModifications) {
+    new UserBrowserControllerReload(this).reload(objectModifications)
   }
 
-  _prepareRemoveOperations(type, id, reason) {
-    if (type === objectType.USER_GROUP) {
-      return this._prepareRemoveUserGroupOperations(id, reason)
-    } else if (type === objectType.USER) {
-      return this._prepareRemoveUserOperations(id, reason)
-    } else {
-      throw new Error('Unsupported type: ' + type)
-    }
+  canAddNode() {
+    return new UserBrowserControllerAddNode().canAddNode(
+      this.getSelectedObject()
+    )
   }
 
-  _prepareRemoveUserGroupOperations(id, reason) {
-    const options = new openbis.AuthorizationGroupDeletionOptions()
-    options.setReason(reason)
-    return Promise.resolve([
-      new openbis.DeleteAuthorizationGroupsOperation(
-        [new openbis.AuthorizationGroupPermId(id)],
-        options
-      )
-    ])
+  async addNode() {
+    await new UserBrowserControllerAddNode().doAddNode(this.getSelectedObject())
   }
 
-  _prepareRemoveUserOperations(id, reason) {
-    const options = new openbis.PersonDeletionOptions()
-    options.setReason(reason)
-    return Promise.resolve([
-      new openbis.DeletePersonsOperation(
-        [new openbis.PersonPermId(id)],
-        options
-      )
-    ])
+  canRemoveNode() {
+    return new UserBrowserControllerRemoveNode().canRemoveNode(
+      this.getSelectedObject()
+    )
   }
 
-  doGetObservedModifications() {
-    return {
-      [objectType.USER]: [objectOperation.CREATE, objectOperation.DELETE],
-      [objectType.USER_GROUP]: [objectOperation.CREATE, objectOperation.DELETE]
-    }
+  async removeNode() {
+    await new UserBrowserControllerRemoveNode().doRemoveNode(
+      this.getSelectedObject()
+    )
   }
 }
diff --git a/openbis_ng_ui/src/js/components/users/browser2/UserBrowserControllerAddNode.js b/openbis_ng_ui/src/js/components/users/browser/UserBrowserControllerAddNode.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/browser2/UserBrowserControllerAddNode.js
rename to openbis_ng_ui/src/js/components/users/browser/UserBrowserControllerAddNode.js
diff --git a/openbis_ng_ui/src/js/components/users/browser2/UserBrowserControllerLoadNodePath.js b/openbis_ng_ui/src/js/components/users/browser/UserBrowserControllerLoadNodePath.js
similarity index 96%
rename from openbis_ng_ui/src/js/components/users/browser2/UserBrowserControllerLoadNodePath.js
rename to openbis_ng_ui/src/js/components/users/browser/UserBrowserControllerLoadNodePath.js
index cd7e4f94bc524d2c752bbd5dfacbfca6e0a4d0c5..4e17665fdce91f76cbf9eda25e367984363a0b17 100644
--- a/openbis_ng_ui/src/js/components/users/browser2/UserBrowserControllerLoadNodePath.js
+++ b/openbis_ng_ui/src/js/components/users/browser/UserBrowserControllerLoadNodePath.js
@@ -1,4 +1,4 @@
-import UserBrowserConsts from '@src/js/components/users/browser2/UserBrowserConsts.js'
+import UserBrowserConsts from '@src/js/components/users/browser/UserBrowserConsts.js'
 import openbis from '@src/js/services/openbis.js'
 import objectType from '@src/js/common/consts/objectType.js'
 
diff --git a/openbis_ng_ui/src/js/components/users/browser2/UserBrowserControllerLoadNodes.js b/openbis_ng_ui/src/js/components/users/browser/UserBrowserControllerLoadNodes.js
similarity index 98%
rename from openbis_ng_ui/src/js/components/users/browser2/UserBrowserControllerLoadNodes.js
rename to openbis_ng_ui/src/js/components/users/browser/UserBrowserControllerLoadNodes.js
index f20488a2878bf612cfe4c3680ec8c183ef0871be..0ea2fa6a2bdf884e57ffcf6ccdcce01c588e0227 100644
--- a/openbis_ng_ui/src/js/components/users/browser2/UserBrowserControllerLoadNodes.js
+++ b/openbis_ng_ui/src/js/components/users/browser/UserBrowserControllerLoadNodes.js
@@ -1,5 +1,5 @@
 import _ from 'lodash'
-import UserBrowserConsts from '@src/js/components/users/browser2/UserBrowserConsts.js'
+import UserBrowserConsts from '@src/js/components/users/browser/UserBrowserConsts.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'
diff --git a/openbis_ng_ui/src/js/components/users/browser2/UserBrowserControllerReload.js b/openbis_ng_ui/src/js/components/users/browser/UserBrowserControllerReload.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/browser2/UserBrowserControllerReload.js
rename to openbis_ng_ui/src/js/components/users/browser/UserBrowserControllerReload.js
diff --git a/openbis_ng_ui/src/js/components/users/browser2/UserBrowserControllerRemoveNode.js b/openbis_ng_ui/src/js/components/users/browser/UserBrowserControllerRemoveNode.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/browser2/UserBrowserControllerRemoveNode.js
rename to openbis_ng_ui/src/js/components/users/browser/UserBrowserControllerRemoveNode.js
diff --git a/openbis_ng_ui/src/js/components/users/browser2/UserBrowser.jsx b/openbis_ng_ui/src/js/components/users/browser2/UserBrowser.jsx
deleted file mode 100644
index 697c64eea85af5269ce58344ea57b1c52bc30c82..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/src/js/components/users/browser2/UserBrowser.jsx
+++ /dev/null
@@ -1,78 +0,0 @@
-import _ from 'lodash'
-import React from 'react'
-import autoBind from 'auto-bind'
-import BrowserWithOpenbis from '@src/js/components/common/browser2/BrowserWithOpenbis.jsx'
-import BrowserButtonsAddRemove from '@src/js/components/common/browser2/BrowserButtonsAddRemove.jsx'
-import UserBrowserController from '@src/js/components/users/browser2/UserBrowserController.js'
-import AppController from '@src/js/components/AppController.js'
-import pages from '@src/js/common/consts/pages.js'
-import ids from '@src/js/common/consts/ids.js'
-import logger from '@src/js/common/logger.js'
-
-export class UserBrowser extends React.Component {
-  constructor(props) {
-    super(props)
-    autoBind(this)
-    this.controller = this.props.controller || new UserBrowserController()
-  }
-
-  componentDidMount() {
-    this.componentDidUpdate({})
-  }
-
-  componentDidUpdate(prevProps) {
-    if (!_.isEqual(this.props.selectedObject, prevProps.selectedObject)) {
-      this.controller.selectObject(this.props.selectedObject)
-    }
-
-    if (
-      !_.isEqual(
-        this.props.lastObjectModifications,
-        prevProps.lastObjectModifications
-      )
-    ) {
-      this.controller.reload(this.props.lastObjectModifications)
-    }
-  }
-
-  render() {
-    logger.log(logger.DEBUG, 'UserBrowser.render')
-
-    return (
-      <BrowserWithOpenbis
-        id={ids.USER_BROWSER_ID}
-        controller={this.controller}
-        renderFooter={this.renderFooter}
-        onSelectedChange={selectedObject => {
-          if (selectedObject) {
-            AppController.getInstance().objectOpen(
-              pages.USERS,
-              selectedObject.type,
-              selectedObject.id
-            )
-          }
-        }}
-      />
-    )
-  }
-
-  renderFooter() {
-    return (
-      <div>
-        <BrowserButtonsAddRemove
-          selectedObject={this.controller.getSelectedObject()}
-          addEnabled={this.controller.canAddNode()}
-          removeEnabled={this.controller.canRemoveNode()}
-          onAdd={this.controller.addNode}
-          onRemove={this.controller.removeNode}
-        />
-      </div>
-    )
-  }
-}
-
-export default AppController.getInstance().withState(() => ({
-  selectedObject: AppController.getInstance().getSelectedObject(pages.USERS),
-  lastObjectModifications:
-    AppController.getInstance().getLastObjectModifications()
-}))(UserBrowser)
diff --git a/openbis_ng_ui/src/js/components/users/browser2/UserBrowserController.js b/openbis_ng_ui/src/js/components/users/browser2/UserBrowserController.js
deleted file mode 100644
index 6e4d6ac55c0dcf583f8731218469936a4a4f9876..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/src/js/components/users/browser2/UserBrowserController.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import BrowserController from '@src/js/components/common/browser2/BrowserController.js'
-import UserBrowserControllerLoadNodePath from '@src/js/components/users/browser2/UserBrowserControllerLoadNodePath.js'
-import UserBrowserControllerLoadNodes from '@src/js/components/users/browser2/UserBrowserControllerLoadNodes.js'
-import UserBrowserControllerAddNode from '@src/js/components/users/browser2/UserBrowserControllerAddNode.js'
-import UserBrowserControllerRemoveNode from '@src/js/components/users/browser2/UserBrowserControllerRemoveNode.js'
-import UserBrowserControllerReload from '@src/js/components/users/browser2/UserBrowserControllerReload.js'
-
-export default class UserBrowserController extends BrowserController {
-  async doLoadNodePath(params) {
-    return await new UserBrowserControllerLoadNodePath().doLoadNodePath(params)
-  }
-
-  async doLoadNodes(params) {
-    return await new UserBrowserControllerLoadNodes().doLoadNodes(params)
-  }
-
-  async reload(objectModifications) {
-    new UserBrowserControllerReload(this).reload(objectModifications)
-  }
-
-  canAddNode() {
-    return new UserBrowserControllerAddNode().canAddNode(
-      this.getSelectedObject()
-    )
-  }
-
-  async addNode() {
-    await new UserBrowserControllerAddNode().doAddNode(this.getSelectedObject())
-  }
-
-  canRemoveNode() {
-    return new UserBrowserControllerRemoveNode().canRemoveNode(
-      this.getSelectedObject()
-    )
-  }
-
-  async removeNode() {
-    await new UserBrowserControllerRemoveNode().doRemoveNode(
-      this.getSelectedObject()
-    )
-  }
-}
diff --git a/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserComponentFilter.test.js b/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserComponentFilter.test.js
deleted file mode 100644
index 04f1956e8d8005d8753fdeaf4a7c6a0bf17a8184..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserComponentFilter.test.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import UserBrowserComponentTest from '@srcTest/js/components/users/browser/UserBrowserComponentTest.js'
-import fixture from '@srcTest/js/common/fixture.js'
-
-let common = null
-
-beforeEach(() => {
-  common = new UserBrowserComponentTest()
-  common.beforeEach()
-})
-
-describe(UserBrowserComponentTest.SUITE, () => {
-  test('filter', testFilter)
-})
-
-async function testFilter() {
-  const browser = await common.mount()
-
-  browser.getFilter().change(fixture.ANOTHER_USER_GROUP_DTO.code.toUpperCase())
-  await browser.update()
-
-  browser.expectJSON({
-    filter: {
-      value: fixture.ANOTHER_USER_GROUP_DTO.code.toUpperCase()
-    },
-    nodes: [
-      { level: 0, text: 'Groups' },
-      { level: 1, text: fixture.ANOTHER_USER_GROUP_DTO.code }
-    ]
-  })
-
-  browser.getFilter().getClearIcon().click()
-  await browser.update()
-
-  browser.expectJSON({
-    filter: {
-      value: null
-    },
-    nodes: [
-      { level: 0, text: 'Users' },
-      { level: 1, text: fixture.ANOTHER_USER_DTO.userId },
-      { level: 1, text: fixture.TEST_USER_DTO.userId },
-      { level: 0, text: 'Groups' },
-      { level: 1, text: fixture.ALL_USERS_GROUP_DTO.code },
-      { level: 1, text: fixture.ANOTHER_USER_GROUP_DTO.code },
-      { level: 1, text: fixture.TEST_USER_GROUP_DTO.code }
-    ]
-  })
-}
diff --git a/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerExpandCollapseNode.test.js b/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerExpandCollapseNode.test.js
index f70ef5e2de674bebd552ff74f5e398bd611b3684..f02f27f6f5f89ff1f9f63cc8d69fd749045c4573 100644
--- a/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerExpandCollapseNode.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerExpandCollapseNode.test.js
@@ -1,4 +1,6 @@
+import UserBrowserConsts from '@src/js/components/users/browser/UserBrowserConsts.js'
 import UserBrowserControllerTest from '@srcTest/js/components/users/browser/UserBrowserControllerTest.js'
+import objectType from '@src/js/common/consts/objectType.js'
 import openbis from '@srcTest/js/services/openbis.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
@@ -18,33 +20,43 @@ async function testExpandAndCollapseNode() {
   openbis.mockSearchGroups([fixture.TEST_USER_GROUP_DTO])
 
   await common.controller.load()
-  common.controller.nodeExpand('groups')
-
-  expect(common.controller.getNodes()).toMatchObject([
-    {
-      text: 'Users',
-      expanded: false,
-      selected: false
-    },
-    {
-      text: 'Groups',
-      expanded: true,
-      selected: false
-    }
-  ])
-
-  common.controller.nodeCollapse('groups')
-
-  expect(common.controller.getNodes()).toMatchObject([
-    {
-      text: 'Users',
-      expanded: false,
-      selected: false
-    },
-    {
-      text: 'Groups',
-      expanded: false,
-      selected: false
-    }
-  ])
+  await common.controller.expandNode(
+    UserBrowserConsts.nodeId(UserBrowserConsts.TYPE_ROOT, objectType.USER_GROUP)
+  )
+
+  expect(common.controller.getTree()).toMatchObject({
+    id: 'root',
+    children: [
+      {
+        text: 'Users',
+        expanded: false,
+        selected: false
+      },
+      {
+        text: 'Groups',
+        expanded: true,
+        selected: false
+      }
+    ]
+  })
+
+  await common.controller.collapseNode(
+    UserBrowserConsts.nodeId(UserBrowserConsts.TYPE_ROOT, objectType.USER_GROUP)
+  )
+
+  expect(common.controller.getTree()).toMatchObject({
+    id: 'root',
+    children: [
+      {
+        text: 'Users',
+        expanded: false,
+        selected: false
+      },
+      {
+        text: 'Groups',
+        expanded: false,
+        selected: false
+      }
+    ]
+  })
 }
diff --git a/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerFilter.test.js b/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerFilter.test.js
deleted file mode 100644
index 6ea196f19c3c940945feb6eadd49ce5f08ed6e5d..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerFilter.test.js
+++ /dev/null
@@ -1,53 +0,0 @@
-import UserBrowserControllerTest from '@srcTest/js/components/users/browser/UserBrowserControllerTest.js'
-import openbis from '@srcTest/js/services/openbis.js'
-import fixture from '@srcTest/js/common/fixture.js'
-
-let common = null
-
-beforeEach(() => {
-  common = new UserBrowserControllerTest()
-  common.beforeEach()
-})
-
-describe(UserBrowserControllerTest.SUITE, () => {
-  test('filter', testFilter)
-})
-
-async function testFilter() {
-  openbis.mockSearchPersons([fixture.TEST_USER_DTO, fixture.ANOTHER_USER_DTO])
-  openbis.mockSearchGroups([
-    fixture.TEST_USER_GROUP_DTO,
-    fixture.ANOTHER_USER_GROUP_DTO,
-    fixture.ALL_USERS_GROUP_DTO
-  ])
-
-  await common.controller.load()
-  common.controller.filterChange('ANOTHER')
-
-  expect(common.controller.getNodes()).toMatchObject([
-    {
-      text: 'Users',
-      expanded: true,
-      selected: false,
-      children: [
-        {
-          text: fixture.ANOTHER_USER_DTO.userId,
-          expanded: false,
-          selected: false
-        }
-      ]
-    },
-    {
-      text: 'Groups',
-      expanded: true,
-      selected: false,
-      children: [
-        {
-          text: fixture.ANOTHER_USER_GROUP_DTO.code,
-          expanded: false,
-          selected: false
-        }
-      ]
-    }
-  ])
-}
diff --git a/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerLoad.test.js b/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerLoad.test.js
index 2a575e4990bea2cf0c1eb44f9ae4a946be68565c..a5b1874c25663ffae04cfb7a9e15bca985ee0b53 100644
--- a/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerLoad.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerLoad.test.js
@@ -23,16 +23,19 @@ async function testLoad() {
 
   await common.controller.load()
 
-  expect(common.controller.getNodes()).toMatchObject([
-    {
-      text: 'Users',
-      expanded: false,
-      selected: false
-    },
-    {
-      text: 'Groups',
-      expanded: false,
-      selected: false
-    }
-  ])
+  expect(common.controller.getTree()).toMatchObject({
+    id: 'root',
+    children: [
+      {
+        text: 'Users',
+        expanded: false,
+        selected: false
+      },
+      {
+        text: 'Groups',
+        expanded: false,
+        selected: false
+      }
+    ]
+  })
 }
diff --git a/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerSelectNode.test.js b/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerSelectNode.test.js
index 5f560d5f5027ef458177e659669ab187fd21334d..643a862b0e4d7d77835c51787af62d27838dcc9c 100644
--- a/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerSelectNode.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerSelectNode.test.js
@@ -1,4 +1,5 @@
 import UserBrowserControllerTest from '@srcTest/js/components/users/browser/UserBrowserControllerTest.js'
+import objectType from '@src/js/common/consts/objectType.js'
 import openbis from '@srcTest/js/services/openbis.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
@@ -24,96 +25,107 @@ async function testSelectNode() {
   ])
 
   await common.controller.load()
-
-  common.controller.nodeSelect('users/' + fixture.TEST_USER_DTO.userId)
-
-  expect(common.controller.getNodes()).toMatchObject([
-    {
-      text: 'Users',
-      expanded: false,
-      selected: false,
-      children: [
-        {
-          text: fixture.ANOTHER_USER_DTO.userId,
-          expanded: false,
-          selected: false
-        },
-        {
-          text: fixture.TEST_USER_DTO.userId,
-          expanded: false,
-          selected: true
-        }
-      ]
-    },
-    {
-      text: 'Groups',
-      expanded: false,
-      selected: false,
-      children: [
-        {
-          text: fixture.ALL_USERS_GROUP_DTO.code,
-          expanded: false,
-          selected: false
-        },
-        {
-          text: fixture.ANOTHER_USER_GROUP_DTO.code,
-          expanded: false,
-          selected: false
-        },
-        {
-          text: fixture.TEST_USER_GROUP_DTO.code,
-          expanded: false,
-          selected: false
-        }
-      ]
-    }
-  ])
-  common.expectOpenUserAction(fixture.TEST_USER_DTO.userId)
-
-  common.controller.nodeSelect('groups/' + fixture.ANOTHER_USER_GROUP_DTO.code)
-
-  expect(common.controller.getNodes()).toMatchObject([
-    {
-      text: 'Users',
-      expanded: false,
-      selected: false,
-      children: [
-        {
-          text: fixture.ANOTHER_USER_DTO.userId,
-          expanded: false,
-          selected: false
-        },
-        {
-          text: fixture.TEST_USER_DTO.userId,
-          expanded: false,
-          selected: false
-        }
-      ]
-    },
-    {
-      text: 'Groups',
-      expanded: false,
-      selected: false,
-      children: [
-        {
-          text: fixture.ALL_USERS_GROUP_DTO.code,
-          expanded: false,
-          selected: false
-        },
-        {
-          text: fixture.ANOTHER_USER_GROUP_DTO.code,
-          expanded: false,
-          selected: true
-        },
-        {
-          text: fixture.TEST_USER_GROUP_DTO.code,
-          expanded: false,
-          selected: false
-        }
-      ]
-    }
-  ])
-  common.expectOpenGroupAction(fixture.ANOTHER_USER_GROUP_DTO.code)
+  await common.controller.changeAutoShowSelectedObject()
+
+  await common.controller.selectObject({
+    type: objectType.USER,
+    id: fixture.TEST_USER_DTO.userId
+  })
+
+  expect(common.controller.getTree()).toMatchObject({
+    id: 'root',
+    children: [
+      {
+        text: 'Users',
+        expanded: false,
+        selected: false,
+        children: [
+          {
+            text: fixture.ANOTHER_USER_DTO.userId,
+            expanded: false,
+            selected: false
+          },
+          {
+            text: fixture.TEST_USER_DTO.userId,
+            expanded: false,
+            selected: true
+          }
+        ]
+      },
+      {
+        text: 'Groups',
+        expanded: false,
+        selected: false,
+        children: [
+          {
+            text: fixture.ALL_USERS_GROUP_DTO.code,
+            expanded: false,
+            selected: false
+          },
+          {
+            text: fixture.ANOTHER_USER_GROUP_DTO.code,
+            expanded: false,
+            selected: false
+          },
+          {
+            text: fixture.TEST_USER_GROUP_DTO.code,
+            expanded: false,
+            selected: false
+          }
+        ]
+      }
+    ]
+  })
+
+  await common.controller.selectObject({
+    type: objectType.USER_GROUP,
+    id: fixture.ANOTHER_USER_GROUP_DTO.code
+  })
+
+  expect(common.controller.getTree()).toMatchObject({
+    id: 'root',
+    children: [
+      {
+        text: 'Users',
+        expanded: false,
+        selected: false,
+        children: [
+          {
+            text: fixture.ANOTHER_USER_DTO.userId,
+            expanded: false,
+            selected: false
+          },
+          {
+            text: fixture.TEST_USER_DTO.userId,
+            expanded: false,
+            selected: false
+          }
+        ]
+      },
+      {
+        text: 'Groups',
+        expanded: false,
+        selected: false,
+        children: [
+          {
+            text: fixture.ALL_USERS_GROUP_DTO.code,
+            expanded: false,
+            selected: false
+          },
+          {
+            text: fixture.ANOTHER_USER_GROUP_DTO.code,
+            expanded: false,
+            selected: true
+          },
+          {
+            text: fixture.TEST_USER_GROUP_DTO.code,
+            expanded: false,
+            selected: false
+          }
+        ]
+      }
+    ]
+  })
 }
 
 async function testSelectAnotherNode() {
@@ -121,37 +133,46 @@ async function testSelectAnotherNode() {
   openbis.mockSearchGroups([])
 
   await common.controller.load()
-  common.controller.nodeSelect('users/' + fixture.TEST_USER_DTO.userId)
-  common.controller.nodeSelect('users/' + fixture.ANOTHER_USER_DTO.userId)
-
-  expect(common.controller.getNodes()).toMatchObject([
-    {
-      text: 'Users',
-      expanded: false,
-      selected: false,
-      children: [
-        {
-          text: fixture.ANOTHER_USER_DTO.userId,
-          expanded: false,
-          selected: true
-        },
-        {
-          text: fixture.TEST_USER_DTO.userId,
-          expanded: false,
-          selected: false
-        }
-      ]
-    },
-    {
-      text: 'Groups',
-      expanded: false,
-      selected: false,
-      children: []
-    }
-  ])
-
-  common.expectOpenUserAction(fixture.TEST_USER_DTO.userId)
-  common.expectOpenUserAction(fixture.ANOTHER_USER_DTO.userId)
+  await common.controller.changeAutoShowSelectedObject()
+
+  await common.controller.selectObject({
+    type: objectType.USER,
+    id: fixture.TEST_USER_DTO.userId
+  })
+
+  await common.controller.selectObject({
+    type: objectType.USER,
+    id: fixture.ANOTHER_USER_DTO.userId
+  })
+
+  expect(common.controller.getTree()).toMatchObject({
+    id: 'root',
+    children: [
+      {
+        text: 'Users',
+        expanded: false,
+        selected: false,
+        children: [
+          {
+            text: fixture.ANOTHER_USER_DTO.userId,
+            expanded: false,
+            selected: true
+          },
+          {
+            text: fixture.TEST_USER_DTO.userId,
+            expanded: false,
+            selected: false
+          }
+        ]
+      },
+      {
+        text: 'Groups',
+        expanded: false,
+        selected: false,
+        children: []
+      }
+    ]
+  })
 }
 
 async function testSelectVirtualNode() {
@@ -159,20 +180,26 @@ async function testSelectVirtualNode() {
   openbis.mockSearchGroups([])
 
   await common.controller.load()
-  common.controller.nodeSelect('users')
-
-  expect(common.controller.getNodes()).toMatchObject([
-    {
-      text: 'Users',
-      expanded: false,
-      selected: true
-    },
-    {
-      text: 'Groups',
-      expanded: false,
-      selected: false
-    }
-  ])
-
-  common.expectOpenUsersOverviewAction()
+  await common.controller.changeAutoShowSelectedObject()
+
+  await common.controller.selectObject({
+    type: objectType.OVERVIEW,
+    id: objectType.USER
+  })
+
+  expect(common.controller.getTree()).toMatchObject({
+    id: 'root',
+    children: [
+      {
+        text: 'Users',
+        expanded: false,
+        selected: true
+      },
+      {
+        text: 'Groups',
+        expanded: false,
+        selected: false
+      }
+    ]
+  })
 }
diff --git a/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerTest.js b/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerTest.js
index 6b9ded291161203c37fb2d880e26e6d0412419b7..eec47e475519384870fcb826f3fab449a748dc10 100644
--- a/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerTest.js
+++ b/openbis_ng_ui/srcTest/js/components/users/browser/UserBrowserControllerTest.js
@@ -2,8 +2,6 @@ import AppController from '@src/js/components/AppController.js'
 import TestAppController from '@srcTest/js/components/AppController.js'
 import UserBrowserController from '@src/js/components/users/browser/UserBrowserController.js'
 import ComponentContext from '@srcTest/js/components/common/ComponentContext.js'
-import pages from '@src/js/common/consts/pages.js'
-import objectType from '@src/js/common/consts/objectType.js'
 
 export default class UserBrowserControllerTest {
   static SUITE = 'UserBrowserController'
@@ -18,28 +16,4 @@ export default class UserBrowserControllerTest {
     this.controller = new UserBrowserController()
     this.controller.init(this.context)
   }
-
-  expectOpenUserAction(userId) {
-    expect(AppController.getInstance().objectOpen).toHaveBeenCalledWith(
-      pages.USERS,
-      objectType.USER,
-      userId
-    )
-  }
-
-  expectOpenGroupAction(groupId) {
-    expect(AppController.getInstance().objectOpen).toHaveBeenCalledWith(
-      pages.USERS,
-      objectType.USER_GROUP,
-      groupId
-    )
-  }
-
-  expectOpenUsersOverviewAction() {
-    expect(AppController.getInstance().objectOpen).toHaveBeenCalledWith(
-      pages.USERS,
-      objectType.OVERVIEW,
-      objectType.USER
-    )
-  }
 }
diff --git a/openbis_ng_ui/srcTest/js/components/users/wrapper/UsersWrapper.js b/openbis_ng_ui/srcTest/js/components/users/wrapper/UsersWrapper.js
index c69b316f85956a61336b49b9fd365653e1a604e0..730410e15fb54142a77d2163731e2427e55a6f40 100644
--- a/openbis_ng_ui/srcTest/js/components/users/wrapper/UsersWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/users/wrapper/UsersWrapper.js
@@ -1,5 +1,5 @@
 import Content from '@src/js/components/common/content/Content.jsx'
-import { UserBrowser } from '@src/js/components/users/browser2/UserBrowser.jsx'
+import { UserBrowser } from '@src/js/components/users/browser/UserBrowser.jsx'
 import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
 import BrowserWrapper from '@srcTest/js/components/common/browser/wrapper/BrowserWrapper.js'
 import ContentWrapper from '@srcTest/js/components/common/content/wrapper/ContentWrapper.js'