diff --git a/openbis_ng_ui/src/js/common/consts/ids.js b/openbis_ng_ui/src/js/common/consts/ids.js
index 9256e4b3e18d0efd3de1f934b19dad9736dabb3d..8bbfa70cf03c1c79c66eb5bce49b541ab68a9469 100644
--- a/openbis_ng_ui/src/js/common/consts/ids.js
+++ b/openbis_ng_ui/src/js/common/consts/ids.js
@@ -4,6 +4,7 @@ const COLLECTION_TYPES_GRID_ID = 'collection_types_grid'
 const DATA_SET_TYPES_GRID_ID = 'data_set_types_grid'
 const MATERIAL_TYPES_GRID_ID = 'material_types_grid'
 const VOCABULARY_TYPES_GRID_ID = 'vocabulary_types_grid'
+const PROPERTY_TYPES_GRID_ID = 'property_types_grid'
 const USERS_GRID_ID = 'users_grid'
 const USERS_OF_GROUP_GRID_ID = 'users_of_group_grid'
 const GROUPS_GRID_ID = 'groups_grid'
@@ -26,6 +27,7 @@ export default {
   DATA_SET_TYPES_GRID_ID,
   MATERIAL_TYPES_GRID_ID,
   VOCABULARY_TYPES_GRID_ID,
+  PROPERTY_TYPES_GRID_ID,
   USERS_GRID_ID,
   USERS_OF_GROUP_GRID_ID,
   GROUPS_GRID_ID,
diff --git a/openbis_ng_ui/src/js/common/consts/objectType.js b/openbis_ng_ui/src/js/common/consts/objectType.js
index 85e802cbec7cac8d2b9da817f7a537668356f430..b785167334b57f24e64a43071df43ccca953eb11 100644
--- a/openbis_ng_ui/src/js/common/consts/objectType.js
+++ b/openbis_ng_ui/src/js/common/consts/objectType.js
@@ -14,6 +14,7 @@ const COLLECTION_TYPE = 'collectionType'
 const DATA_SET_TYPE = 'dataSetType'
 const MATERIAL_TYPE = 'materialType'
 const VOCABULARY_TYPE = 'vocabularyType'
+const PROPERTY_TYPE = 'propertyType'
 const USER = 'user'
 const USER_GROUP = 'userGroup'
 const DYNAMIC_PROPERTY_PLUGIN = 'dynamicPropertyPlugin'
@@ -41,6 +42,7 @@ export default {
   DATA_SET_TYPE,
   MATERIAL_TYPE,
   VOCABULARY_TYPE,
+  PROPERTY_TYPE,
   USER,
   USER_GROUP,
   DYNAMIC_PROPERTY_PLUGIN,
diff --git a/openbis_ng_ui/src/js/common/consts/routes.js b/openbis_ng_ui/src/js/common/consts/routes.js
index fc22871b9aae2df3d39b2e6c33f5f9668605a2e0..5b362e9e13eff3b42c10d7d2659f9a3e4a30f3e7 100644
--- a/openbis_ng_ui/src/js/common/consts/routes.js
+++ b/openbis_ng_ui/src/js/common/consts/routes.js
@@ -124,6 +124,11 @@ const routes = {
     type: objectTypes.OVERVIEW,
     id: objectTypes.VOCABULARY_TYPE
   }),
+  PROPERTY_TYPE_OVERVIEW: new Route('/property-type-overview', {
+    page: pages.TYPES,
+    type: objectTypes.OVERVIEW,
+    id: objectTypes.PROPERTY_TYPE
+  }),
   USERS: new Route('/users', {
     page: pages.USERS
   }),
diff --git a/openbis_ng_ui/src/js/common/messages.js b/openbis_ng_ui/src/js/common/messages.js
index 45338caf0c00ae33984b5ec8254b71cdc6d28bd1..6eddc08919826d02a485a64d49720c631d04ae30 100644
--- a/openbis_ng_ui/src/js/common/messages.js
+++ b/openbis_ng_ui/src/js/common/messages.js
@@ -109,6 +109,7 @@ const keys = {
   MANDATORY: 'MANDATORY',
   MATERIAL_TYPE: 'MATERIAL_TYPE',
   MATERIAL_TYPES: 'MATERIAL_TYPES',
+  META_DATA: 'META_DATA',
   NAME: 'NAME',
   NEW_COLLECTION_TYPE: 'NEW_COLLECTION_TYPE',
   NEW_DATA_SET_TYPE: 'NEW_DATA_SET_TYPE',
@@ -155,6 +156,7 @@ const keys = {
   PROPERTY_IS_NOT_USED: 'PROPERTY_IS_NOT_USED',
   PROPERTY_IS_USED: 'PROPERTY_IS_USED',
   PROPERTY_PARAMETERS_CANNOT_BE_CHANGED: 'PROPERTY_PARAMETERS_CANNOT_BE_CHANGED',
+  PROPERTY_TYPES: 'PROPERTY_TYPES',
   PUBLIC: 'PUBLIC',
   QUERIES: 'QUERIES',
   QUERY: 'QUERY',
@@ -207,6 +209,7 @@ const keys = {
   UPDATE_IF_EXISTS: 'UPDATE_IF_EXISTS',
   UPDATE_MODE: "UPDATE_MODE",
   URL_TEMPLATE: 'URL_TEMPLATE',
+  USAGES: 'USAGES',
   USER: 'USER',
   USERS: 'USERS',
   USERS_WHO_REGISTERED_SOME_DATA_CANNOT_BE_REMOVED: 'USERS_WHO_REGISTERED_SOME_DATA_CANNOT_BE_REMOVED',
@@ -340,6 +343,7 @@ const messages_en = {
   [keys.MANDATORY]: 'Mandatory',
   [keys.MATERIAL_TYPES]: 'Material Types',
   [keys.MATERIAL_TYPE]: 'Material Type',
+  [keys.META_DATA]: 'Meta Data',
   [keys.NAME]: 'Name',
   [keys.NEW_COLLECTION_TYPE]: 'New Collection Type',
   [keys.NEW_DATA_SET_TYPE]: 'New Data Set Type',
@@ -386,6 +390,7 @@ const messages_en = {
   [keys.PROPERTY_IS_NOT_USED]: 'This property assignment is not yet used by any entities of "${0}" type.',
   [keys.PROPERTY_IS_USED]: 'This property assignment is already used by existing entities of "${0}" type. Removing it is also going to remove ${1} existing property value(s) - data will be lost! Are you sure you want to proceed?',
   [keys.PROPERTY_PARAMETERS_CANNOT_BE_CHANGED]: 'The property parameters cannot be changed.',
+  [keys.PROPERTY_TYPES]: 'Property Types',
   [keys.PUBLIC]: 'Public',
   [keys.QUERIES]: 'Queries',
   [keys.QUERY]: 'Query',
@@ -438,6 +443,7 @@ const messages_en = {
   [keys.UPDATE_IF_EXISTS]: 'Update if exists',
   [keys.UPDATE_MODE]: 'Update Mode',
   [keys.URL_TEMPLATE]: 'URL Template',
+  [keys.USAGES]: 'Usages',
   [keys.USERS]: 'Users',
   [keys.USERS_WHO_REGISTERED_SOME_DATA_CANNOT_BE_REMOVED]: 'Users who have already registered some data cannot be removed.',
   [keys.USER]: 'User',
diff --git a/openbis_ng_ui/src/js/components/common/browser/BrowserController.js b/openbis_ng_ui/src/js/components/common/browser/BrowserController.js
index cd761932f46140174224d31fe6650315e1b53e7d..2565f94de6b20b77c9355d033165a324af8f39d9 100644
--- a/openbis_ng_ui/src/js/components/common/browser/BrowserController.js
+++ b/openbis_ng_ui/src/js/components/common/browser/BrowserController.js
@@ -43,12 +43,8 @@ export default class BrowserController {
 
   load() {
     return this.doLoadNodes().then(loadedNodes => {
-      const {
-        filter,
-        nodes,
-        selectedId,
-        selectedObject
-      } = this.context.getState()
+      const { filter, nodes, selectedId, selectedObject } =
+        this.context.getState()
 
       let newNodes = this._createNodes(loadedNodes)
       newNodes = this._filterNodes(newNodes, filter)
@@ -120,12 +116,8 @@ export default class BrowserController {
   }
 
   filterChange(newFilter) {
-    const {
-      filter,
-      nodes,
-      selectedId,
-      selectedObject
-    } = this.context.getState()
+    const { filter, nodes, selectedId, selectedObject } =
+      this.context.getState()
 
     let initialNodes = null
 
diff --git a/openbis_ng_ui/src/js/components/common/link/TypeLink.jsx b/openbis_ng_ui/src/js/components/common/link/EntityTypeLink.jsx
similarity index 89%
rename from openbis_ng_ui/src/js/components/common/link/TypeLink.jsx
rename to openbis_ng_ui/src/js/components/common/link/EntityTypeLink.jsx
index 0785c15fee6a419cab094181cdde4ea3c0f1a32d..c0b3d1712b9bb2c41c2efb09da2263b933a9a5b5 100644
--- a/openbis_ng_ui/src/js/components/common/link/TypeLink.jsx
+++ b/openbis_ng_ui/src/js/components/common/link/EntityTypeLink.jsx
@@ -5,9 +5,9 @@ import objectTypes from '@src/js/common/consts/objectType.js'
 import openbis from '@src/js/services/openbis.js'
 import logger from '@src/js/common/logger.js'
 
-class TypeLink extends React.PureComponent {
+class EntityTypeLink extends React.PureComponent {
   render() {
-    logger.log(logger.DEBUG, 'TypeLink.render')
+    logger.log(logger.DEBUG, 'EntityTypeLink.render')
 
     const { typeCode, typeKind } = this.props
 
@@ -43,4 +43,4 @@ class TypeLink extends React.PureComponent {
   }
 }
 
-export default TypeLink
+export default EntityTypeLink
diff --git a/openbis_ng_ui/src/js/components/common/link/PropertyTypeLink.jsx b/openbis_ng_ui/src/js/components/common/link/PropertyTypeLink.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..db9f2b5868c191395fd4cee27248988b5c9b75bf
--- /dev/null
+++ b/openbis_ng_ui/src/js/components/common/link/PropertyTypeLink.jsx
@@ -0,0 +1,31 @@
+import React from 'react'
+import LinkToObject from '@src/js/components/common/form/LinkToObject.jsx'
+import pages from '@src/js/common/consts/pages.js'
+import objectTypes from '@src/js/common/consts/objectType.js'
+import logger from '@src/js/common/logger.js'
+
+class PropertyTypeLink extends React.PureComponent {
+  render() {
+    logger.log(logger.DEBUG, 'PropertyTypeLink.render')
+
+    const { propertyTypeCode } = this.props
+
+    if (propertyTypeCode) {
+      return (
+        <LinkToObject
+          page={pages.TYPES}
+          object={{
+            type: objectTypes.PROPERTY_TYPE,
+            id: propertyTypeCode
+          }}
+        >
+          {propertyTypeCode}
+        </LinkToObject>
+      )
+    } else {
+      return null
+    }
+  }
+}
+
+export default PropertyTypeLink
diff --git a/openbis_ng_ui/src/js/components/common/link/VocabularyLink.jsx b/openbis_ng_ui/src/js/components/common/link/VocabularyTypeLink.jsx
similarity index 81%
rename from openbis_ng_ui/src/js/components/common/link/VocabularyLink.jsx
rename to openbis_ng_ui/src/js/components/common/link/VocabularyTypeLink.jsx
index 54404ff3b65b92ffd77c50562d16d03141fa2c52..6ac092e6b6386f1a8999c195eb73a6590f6aca19 100644
--- a/openbis_ng_ui/src/js/components/common/link/VocabularyLink.jsx
+++ b/openbis_ng_ui/src/js/components/common/link/VocabularyTypeLink.jsx
@@ -4,9 +4,9 @@ import pages from '@src/js/common/consts/pages.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import logger from '@src/js/common/logger.js'
 
-class VocabularyLink extends React.PureComponent {
+class VocabularyTypeLink extends React.PureComponent {
   render() {
-    logger.log(logger.DEBUG, 'VocabularyLink.render')
+    logger.log(logger.DEBUG, 'VocabularyTypeLink.render')
 
     const { vocabularyCode } = this.props
 
@@ -28,4 +28,4 @@ class VocabularyLink extends React.PureComponent {
   }
 }
 
-export default VocabularyLink
+export default VocabularyTypeLink
diff --git a/openbis_ng_ui/src/js/components/common/page/PageWithTwoPanels.jsx b/openbis_ng_ui/src/js/components/common/page/PageWithTwoPanels.jsx
index 7072d5387e95e7640b250a918b2937ee8ef4e1ec..98bd458df9a7c2d48b7551aa98493d767d910fed 100644
--- a/openbis_ng_ui/src/js/components/common/page/PageWithTwoPanels.jsx
+++ b/openbis_ng_ui/src/js/components/common/page/PageWithTwoPanels.jsx
@@ -66,17 +66,19 @@ class PageWithTwoPanels extends React.PureComponent {
     const { classes, renderMainPanel, renderAdditionalPanel, renderButtons } =
       this.props
 
-    const mainPanel = renderMainPanel ? renderMainPanel() : null
-    const additionalPanel = renderAdditionalPanel
-      ? renderAdditionalPanel()
-      : null
-    const buttons = renderButtons ? renderButtons() : null
+    const mainPanel = renderMainPanel ? renderMainPanel() : <div></div>
+    const additionalPanel = renderAdditionalPanel ? (
+      renderAdditionalPanel()
+    ) : (
+      <div></div>
+    )
+    const buttons = renderButtons ? renderButtons() : <div></div>
 
     return (
       <div className={classes.container}>
         <div className={classes.content}>
-          {mainPanel && <div className={classes.mainPanel}>{mainPanel}</div>}
-          {additionalPanel && (
+          {<div className={classes.mainPanel}>{mainPanel}</div>}
+          {
             <Resizable
               defaultSize={{
                 width: 400,
@@ -95,9 +97,9 @@ class PageWithTwoPanels extends React.PureComponent {
             >
               <div className={classes.additionalPanel}>{additionalPanel}</div>
             </Resizable>
-          )}
+          }
         </div>
-        {buttons && <div className={classes.buttons}>{buttons}</div>}
+        {<div className={classes.buttons}>{buttons}</div>}
       </div>
     )
   }
diff --git a/openbis_ng_ui/src/js/components/tools/form/import/all/ImportAllFormControllerChange.js b/openbis_ng_ui/src/js/components/tools/form/import/all/ImportAllFormControllerChange.js
index ad1511f68e75421fa373496e42875fa954bb8d94..56eb5061437eddc1af03e5778a112214a208230d 100644
--- a/openbis_ng_ui/src/js/components/tools/form/import/all/ImportAllFormControllerChange.js
+++ b/openbis_ng_ui/src/js/components/tools/form/import/all/ImportAllFormControllerChange.js
@@ -10,7 +10,6 @@ export default class ImportAllFormControllerChange extends PageControllerChange
         params.value
       )
       return {
-        ...oldState,
         fields: newObject
       }
     })
diff --git a/openbis_ng_ui/src/js/components/types/Types.jsx b/openbis_ng_ui/src/js/components/types/Types.jsx
index bc15333b23660f05b3580a7594a73846100510c2..2e3a0576fce2003017c33574d1b3718ce77d539e 100644
--- a/openbis_ng_ui/src/js/components/types/Types.jsx
+++ b/openbis_ng_ui/src/js/components/types/Types.jsx
@@ -4,8 +4,8 @@ import Content from '@src/js/components/common/content/Content.jsx'
 import ContentTab from '@src/js/components/common/content/ContentTab.jsx'
 import TypeBrowser from '@src/js/components/types/browser/TypeBrowser.jsx'
 import TypeSearch from '@src/js/components/types/search/TypeSearch.jsx'
-import TypeForm from '@src/js/components/types/form/TypeForm.jsx'
-import VocabularyForm from '@src/js/components/types/form/VocabularyForm.jsx'
+import EntityTypeForm from '@src/js/components/types/form/entitytype/EntityTypeForm.jsx'
+import VocabularyTypeForm from '@src/js/components/types/form/vocabularytype/VocabularyTypeForm.jsx'
 import pages from '@src/js/common/consts/pages.js'
 import objectType from '@src/js/common/consts/objectType.js'
 import messages from '@src/js/common/messages.js'
@@ -46,9 +46,9 @@ class Types extends React.Component {
       object.type === objectType.VOCABULARY_TYPE ||
       object.type === objectType.NEW_VOCABULARY_TYPE
     ) {
-      return <VocabularyForm object={object} />
+      return <VocabularyTypeForm object={object} />
     } else {
-      return <TypeForm object={object} />
+      return <EntityTypeForm object={object} />
     }
   }
 
@@ -63,7 +63,8 @@ class Types extends React.Component {
         [objectType.COLLECTION_TYPE]: messages.get(messages.COLLECTION_TYPES),
         [objectType.DATA_SET_TYPE]: messages.get(messages.DATA_SET_TYPES),
         [objectType.MATERIAL_TYPE]: messages.get(messages.MATERIAL_TYPES),
-        [objectType.VOCABULARY_TYPE]: messages.get(messages.VOCABULARY_TYPES)
+        [objectType.VOCABULARY_TYPE]: messages.get(messages.VOCABULARY_TYPES),
+        [objectType.PROPERTY_TYPE]: messages.get(messages.PROPERTY_TYPES)
       }
       label = labels[object.id]
     } else {
diff --git a/openbis_ng_ui/src/js/components/types/browser/TypeBrowserController.js b/openbis_ng_ui/src/js/components/types/browser/TypeBrowserController.js
index e11c646c3d1ceaf51b9bc7594444a36a8117e51f..c0e8d02a6802019adaad97de3078fe2bef01d4da 100644
--- a/openbis_ng_ui/src/js/components/types/browser/TypeBrowserController.js
+++ b/openbis_ng_ui/src/js/components/types/browser/TypeBrowserController.js
@@ -14,8 +14,6 @@ export default class TypeBrowserController extends BrowserController {
   }
 
   async doLoadNodes() {
-    const vocabularyFetchOptions = new openbis.VocabularyFetchOptions()
-
     return Promise.all([
       openbis.searchSampleTypes(
         new openbis.SampleTypeSearchCriteria(),
@@ -35,7 +33,7 @@ export default class TypeBrowserController extends BrowserController {
       ),
       openbis.searchVocabularies(
         new openbis.VocabularySearchCriteria(),
-        vocabularyFetchOptions
+        new openbis.VocabularyFetchOptions()
       )
     ]).then(
       ([
@@ -131,6 +129,14 @@ export default class TypeBrowserController extends BrowserController {
             children: vocabularyTypeNodes,
             childrenType: objectType.NEW_VOCABULARY_TYPE,
             canAdd: true
+          },
+          {
+            id: 'propertyTypes',
+            text: messages.get(messages.PROPERTY_TYPES),
+            object: {
+              type: objectType.OVERVIEW,
+              id: objectType.PROPERTY_TYPE
+            }
           }
         ]
 
@@ -147,7 +153,7 @@ export default class TypeBrowserController extends BrowserController {
     }
   }
 
-  doNodeRemove(node) {
+  async doNodeRemove(node) {
     if (!node.object) {
       return Promise.resolve()
     }
@@ -155,34 +161,31 @@ export default class TypeBrowserController extends BrowserController {
     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(() => {
-        this.context.dispatch(actions.objectDelete(this.getPage(), type, id))
-      })
-      .catch(error => {
-        this.context.dispatch(actions.errorChange(error))
-      })
+    try {
+      const operations = await this._prepareRemoveOperations(type, id, reason)
+      const options = new openbis.SynchronousOperationExecutionOptions()
+      options.setExecuteInOrder(true)
+      await openbis.executeOperations(operations, options)
+      this.context.dispatch(actions.objectDelete(this.getPage(), type, id))
+    } catch (error) {
+      this.context.dispatch(actions.errorChange(error))
+    }
   }
 
-  _prepareRemoveOperations(type, id, reason) {
+  async _prepareRemoveOperations(type, id, reason) {
     if (
       type === objectType.OBJECT_TYPE ||
       type === objectType.COLLECTION_TYPE ||
       type === objectType.DATA_SET_TYPE ||
       type === objectType.MATERIAL_TYPE
     ) {
-      return this._prepareRemoveEntityTypeOperations(type, id, reason)
+      return await this._prepareRemoveEntityTypeOperations(type, id, reason)
     } else if (type === objectType.VOCABULARY_TYPE) {
-      return this._prepareRemoveVocabularyTypeOperations(type, id, reason)
+      return await this._prepareRemoveVocabularyTypeOperations(type, id, reason)
     }
   }
 
-  _prepareRemoveEntityTypeOperations(type, id, reason) {
+  async _prepareRemoveEntityTypeOperations(type, id, reason) {
     const operations = []
 
     if (type === objectType.OBJECT_TYPE) {
@@ -223,32 +226,78 @@ export default class TypeBrowserController extends BrowserController {
       )
     }
 
-    const criteria = new openbis.PropertyTypeSearchCriteria()
-    criteria.withCode().thatStartsWith(id + '.')
-    const fo = new openbis.PropertyTypeFetchOptions()
+    const removeUnusuedPropertyTypesOperation =
+      await this._prepareRemoveUnusedPropertyTypesOperations(type, id)
 
-    return openbis.searchPropertyTypes(criteria, fo).then(results => {
-      const ids = results
-        .getObjects()
-        .map(propertyType => propertyType.getPermId())
-      if (!_.isEmpty(ids)) {
-        const options = new openbis.PropertyTypeDeletionOptions()
-        options.setReason(reason)
-        operations.push(new openbis.DeletePropertyTypesOperation(ids, options))
+    if (removeUnusuedPropertyTypesOperation) {
+      operations.push(removeUnusuedPropertyTypesOperation)
+    }
+
+    return operations
+  }
+
+  async _prepareRemoveUnusedPropertyTypesOperations(type, id) {
+    const entityKind = this.getEntityKind(type)
+
+    const propertyAssignmentFetchOptions =
+      new openbis.PropertyAssignmentFetchOptions()
+    propertyAssignmentFetchOptions.withPropertyType()
+    propertyAssignmentFetchOptions.withEntityType()
+
+    const propertyAssignments = await openbis.searchPropertyAssignments(
+      new openbis.PropertyAssignmentSearchCriteria(),
+      propertyAssignmentFetchOptions
+    )
+
+    const potentialPropertyTypesToDelete = []
+    const propertyTypeUsages = {}
+
+    propertyAssignments.objects.forEach(propertyAssignment => {
+      const propertyTypeCode = propertyAssignment.propertyType.code
+
+      propertyTypeUsages[propertyTypeCode] =
+        (propertyTypeUsages[propertyTypeCode] || 0) + 1
+
+      if (
+        propertyAssignment.entityType.permId.permId === id &&
+        propertyAssignment.entityType.permId.entityKind === entityKind &&
+        !propertyAssignment.propertyType.managedInternally
+      ) {
+        potentialPropertyTypesToDelete.push(propertyTypeCode)
       }
-      return operations
     })
+
+    if (potentialPropertyTypesToDelete.length > 0) {
+      const propertyTypesToDelete = []
+
+      potentialPropertyTypesToDelete.forEach(propertyTypeCode => {
+        if (propertyTypeUsages[propertyTypeCode] === 1) {
+          propertyTypesToDelete.push(
+            new openbis.PropertyTypePermId(propertyTypeCode)
+          )
+        }
+      })
+
+      if (propertyTypesToDelete.length > 0) {
+        const options = new openbis.PropertyTypeDeletionOptions()
+        options.setReason('deleted via ng_ui')
+        return new openbis.DeletePropertyTypesOperation(
+          propertyTypesToDelete,
+          options
+        )
+      }
+    }
+
+    return null
   }
 
-  _prepareRemoveVocabularyTypeOperations(type, id, reason) {
+  async _prepareRemoveVocabularyTypeOperations(type, id, reason) {
     const options = new openbis.VocabularyDeletionOptions()
     options.setReason(reason)
-    return Promise.resolve([
-      new openbis.DeleteVocabulariesOperation(
-        [new openbis.VocabularyPermId(id)],
-        options
-      )
-    ])
+    return new openbis.DeleteVocabulariesOperation(
+      [new openbis.VocabularyPermId(id)],
+      options
+    )
   }
 
   doGetObservedModifications() {
@@ -276,6 +325,18 @@ export default class TypeBrowserController extends BrowserController {
     }
   }
 
+  getEntityKind(type) {
+    if (type === objectType.OBJECT_TYPE) {
+      return openbis.EntityKind.SAMPLE
+    } else if (type === objectType.COLLECTION_TYPE) {
+      return openbis.EntityKind.EXPERIMENT
+    } else if (type === objectType.DATA_SET_TYPE) {
+      return openbis.EntityKind.DATA_SET
+    } else if (type === objectType.MATERIAL_TYPE) {
+      return openbis.EntityKind.MATERIAL
+    }
+  }
+
   isSystemUser() {
     return (
       this.context.getProps().session &&
diff --git a/openbis_ng_ui/src/js/components/types/common/TypesGrid.jsx b/openbis_ng_ui/src/js/components/types/common/EntityTypesGrid.jsx
similarity index 91%
rename from openbis_ng_ui/src/js/components/types/common/TypesGrid.jsx
rename to openbis_ng_ui/src/js/components/types/common/EntityTypesGrid.jsx
index c9c2d58a45943d71ec5b4e73c9973637052981b8..ca7e09d3b7847f4e6a148e930e5412d625083c6c 100644
--- a/openbis_ng_ui/src/js/components/types/common/TypesGrid.jsx
+++ b/openbis_ng_ui/src/js/components/types/common/EntityTypesGrid.jsx
@@ -1,14 +1,14 @@
 import React from 'react'
 import GridWithSettings from '@src/js/components/common/grid/GridWithSettings.jsx'
-import TypeLink from '@src/js/components/common/link/TypeLink.jsx'
+import EntityTypeLink from '@src/js/components/common/link/EntityTypeLink.jsx'
 import PluginLink from '@src/js/components/common/link/PluginLink.jsx'
 import openbis from '@src/js/services/openbis.js'
 import messages from '@src/js/common/messages.js'
 import logger from '@src/js/common/logger.js'
 
-class TypesGrid extends React.PureComponent {
+class EntityTypesGrid extends React.PureComponent {
   render() {
-    logger.log(logger.DEBUG, 'TypesGrid.render')
+    logger.log(logger.DEBUG, 'EntityTypesGrid.render')
 
     const { id, rows, selectedRowId, onSelectedRowChange, controllerRef } =
       this.props
@@ -51,7 +51,7 @@ class TypesGrid extends React.PureComponent {
       label: messages.get(messages.CODE),
       getValue: ({ row }) => row.code,
       renderValue: ({ row }) => {
-        return <TypeLink typeCode={row.code} typeKind={kind} />
+        return <EntityTypeLink typeCode={row.code} typeKind={kind} />
       }
     })
 
@@ -119,4 +119,4 @@ class TypesGrid extends React.PureComponent {
   }
 }
 
-export default TypesGrid
+export default EntityTypesGrid
diff --git a/openbis_ng_ui/src/js/components/types/common/PropertyTypesGrid.jsx b/openbis_ng_ui/src/js/components/types/common/PropertyTypesGrid.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..1b879db7380652004fe3e866d6e006eadc837db9
--- /dev/null
+++ b/openbis_ng_ui/src/js/components/types/common/PropertyTypesGrid.jsx
@@ -0,0 +1,115 @@
+import React from 'react'
+import GridWithSettings from '@src/js/components/common/grid/GridWithSettings.jsx'
+import EntityTypeLink from '@src/js/components/common/link/EntityTypeLink.jsx'
+import VocabularyTypeLink from '@src/js/components/common/link/VocabularyTypeLink.jsx'
+import PropertyTypesGridUsagesCell from '@src/js/components/types/common/PropertyTypesGridUsagesCell.jsx'
+import PropertyTypesGridXMLCell from '@src/js/components/types/common/PropertyTypesGridXMLCell.jsx'
+import openbis from '@src/js/services/openbis.js'
+import messages from '@src/js/common/messages.js'
+import logger from '@src/js/common/logger.js'
+
+class PropertyTypesGrid extends React.PureComponent {
+  render() {
+    logger.log(logger.DEBUG, 'PropertyTypesGrid.render')
+
+    const { id, rows, selectedRowId, onSelectedRowChange, controllerRef } =
+      this.props
+
+    return (
+      <GridWithSettings
+        id={id}
+        controllerRef={controllerRef}
+        header={messages.get(messages.PROPERTY_TYPES)}
+        columns={[
+          {
+            name: 'code',
+            label: messages.get(messages.CODE),
+            getValue: ({ row }) => row.code
+          },
+          {
+            name: 'label',
+            label: messages.get(messages.LABEL),
+            getValue: ({ row }) => row.label
+          },
+          {
+            name: 'description',
+            label: messages.get(messages.DESCRIPTION),
+            getValue: ({ row }) => row.description
+          },
+          {
+            name: 'dataType',
+            label: messages.get(messages.DATA_TYPE),
+            getValue: ({ row }) => row.dataType
+          },
+          {
+            name: 'vocabulary',
+            label: messages.get(messages.VOCABULARY_TYPE),
+            getValue: ({ row }) => row.vocabulary,
+            renderValue: ({ row }) => (
+              <VocabularyTypeLink vocabularyCode={row.vocabulary} />
+            )
+          },
+          {
+            name: 'materialType',
+            label: messages.get(messages.MATERIAL_TYPE),
+            getValue: ({ row }) => row.materialType,
+            renderValue: ({ row }) => (
+              <EntityTypeLink
+                typeKind={openbis.EntityKind.MATERIAL}
+                typeCode={row.materialType}
+              />
+            )
+          },
+          {
+            name: 'sampleType',
+            label: messages.get(messages.OBJECT_TYPE),
+            getValue: ({ row }) => row.sampleType,
+            renderValue: ({ row }) => (
+              <EntityTypeLink
+                typeKind={openbis.EntityKind.SAMPLE}
+                typeCode={row.sampleType}
+              />
+            )
+          },
+          {
+            name: 'schema',
+            label: messages.get(messages.XML_SCHEMA),
+            getValue: ({ row }) => row.schema,
+            renderValue: ({ row }) => {
+              return <PropertyTypesGridXMLCell value={row.schema} />
+            }
+          },
+          {
+            name: 'transformation',
+            label: messages.get(messages.XSLT_SCRIPT),
+            getValue: ({ row }) => row.transformation,
+            renderValue: ({ row }) => {
+              return <PropertyTypesGridXMLCell value={row.transformation} />
+            }
+          },
+          {
+            name: 'usages',
+            label: messages.get(messages.USAGES),
+            getValue: ({ row }) =>
+              row.usages ? JSON.stringify(row.usages) : null,
+            compareValue: ({ row1, row2, defaultCompare }) => {
+              const value1 = row1.usages ? row1.usages.count : 0
+              const value2 = row2.usages ? row2.usages.count : 0
+              return defaultCompare(value1, value2)
+            },
+            renderValue: ({ row }) => {
+              return <PropertyTypesGridUsagesCell value={row.usages} />
+            }
+          }
+        ]}
+        rows={rows}
+        sort='code'
+        selectable={true}
+        selectedRowId={selectedRowId}
+        onSelectedRowChange={onSelectedRowChange}
+      />
+    )
+  }
+}
+
+export default PropertyTypesGrid
diff --git a/openbis_ng_ui/src/js/components/types/common/PropertyTypesGridUsagesCell.jsx b/openbis_ng_ui/src/js/components/types/common/PropertyTypesGridUsagesCell.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..3cbc21e132f2f33db2e92f555cc12f7a78031817
--- /dev/null
+++ b/openbis_ng_ui/src/js/components/types/common/PropertyTypesGridUsagesCell.jsx
@@ -0,0 +1,111 @@
+import React from 'react'
+import { withStyles } from '@material-ui/core/styles'
+import Collapse from '@material-ui/core/Collapse'
+import Link from '@material-ui/core/Link'
+import EntityTypeLink from '@src/js/components/common/link/EntityTypeLink.jsx'
+import openbis from '@src/js/services/openbis.js'
+import messages from '@src/js/common/messages.js'
+import logger from '@src/js/common/logger.js'
+
+const styles = theme => ({
+  usages: {
+    padding: 0,
+    margin: 0,
+    marginTop: theme.spacing(1)
+  },
+  usage: {
+    listStyle: 'none',
+    margin: 0,
+    padding: 0
+  }
+})
+
+class PropertyTypesGridUsagesCell extends React.PureComponent {
+  constructor(props) {
+    super(props)
+    this.state = {
+      visible: false
+    }
+    this.handleVisibilityChange = this.handleVisibilityChange.bind(this)
+  }
+
+  handleVisibilityChange() {
+    this.setState(state => ({
+      visible: !state.visible
+    }))
+  }
+
+  render() {
+    logger.log(logger.DEBUG, 'PropertyTypesGridUsagesCell.render')
+
+    const { value } = this.props
+    const { visible } = this.state
+
+    if (value) {
+      return (
+        <div>
+          <div>
+            {value.count} (
+            <Link
+              onClick={() => {
+                this.handleVisibilityChange()
+              }}
+            >
+              {visible
+                ? messages.get(messages.HIDE)
+                : messages.get(messages.SHOW)}
+            </Link>
+            )
+          </div>
+          <Collapse in={visible} mountOnEnter={true} unmountOnExit={true}>
+            <div>
+              {this.renderUsages(
+                openbis.EntityKind.EXPERIMENT,
+                messages.get(messages.COLLECTION_TYPES),
+                value.experimentTypes
+              )}
+              {this.renderUsages(
+                openbis.EntityKind.SAMPLE,
+                messages.get(messages.OBJECT_TYPES),
+                value.sampleTypes
+              )}
+              {this.renderUsages(
+                openbis.EntityKind.DATA_SET,
+                messages.get(messages.DATA_SET_TYPES),
+                value.dataSetTypes
+              )}
+              {this.renderUsages(
+                openbis.EntityKind.MATERIAL,
+                messages.get(messages.MATERIAL_TYPES),
+                value.materialTypes
+              )}
+            </div>
+          </Collapse>
+        </div>
+      )
+    } else {
+      return 0
+    }
+  }
+
+  renderUsages(usageKind, usagesHeader, usagesList) {
+    if (usagesList.length === 0) {
+      return null
+    }
+
+    const { classes } = this.props
+
+    return (
+      <ul className={classes.usages}>
+        {usagesHeader}:
+        {usagesList.map(usage => (
+          <li key={usage} className={classes.usage}>
+            <EntityTypeLink typeKind={usageKind} typeCode={usage} />
+          </li>
+        ))}
+      </ul>
+    )
+  }
+}
+
+export default withStyles(styles)(PropertyTypesGridUsagesCell)
diff --git a/openbis_ng_ui/src/js/components/types/common/PropertyTypesGridXMLCell.jsx b/openbis_ng_ui/src/js/components/types/common/PropertyTypesGridXMLCell.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..68d4607ee275b84d63acf9feb507b4b070fb469f
--- /dev/null
+++ b/openbis_ng_ui/src/js/components/types/common/PropertyTypesGridXMLCell.jsx
@@ -0,0 +1,53 @@
+import React from 'react'
+import Collapse from '@material-ui/core/Collapse'
+import Link from '@material-ui/core/Link'
+import messages from '@src/js/common/messages.js'
+import logger from '@src/js/common/logger.js'
+
+class PropertyTypesGridXMLCell extends React.PureComponent {
+  constructor(props) {
+    super(props)
+    this.state = {
+      visible: false
+    }
+    this.handleVisibilityChange = this.handleVisibilityChange.bind(this)
+  }
+
+  handleVisibilityChange() {
+    this.setState(state => ({
+      visible: !state.visible
+    }))
+  }
+
+  render() {
+    logger.log(logger.DEBUG, 'PropertyTypesGridXMLCell.render')
+
+    const { value } = this.props
+    const { visible } = this.state
+
+    if (value) {
+      return (
+        <div>
+          <div>
+            <Link
+              onClick={() => {
+                this.handleVisibilityChange()
+              }}
+            >
+              {visible
+                ? messages.get(messages.HIDE)
+                : messages.get(messages.SHOW)}
+            </Link>
+          </div>
+          <Collapse in={visible} mountOnEnter={true} unmountOnExit={true}>
+            <pre>{value}</pre>
+          </Collapse>
+        </div>
+      )
+    } else {
+      return null
+    }
+  }
+}
+
+export default PropertyTypesGridXMLCell
diff --git a/openbis_ng_ui/src/js/components/types/common/VocabulariesGrid.jsx b/openbis_ng_ui/src/js/components/types/common/VocabularyTypesGrid.jsx
similarity index 79%
rename from openbis_ng_ui/src/js/components/types/common/VocabulariesGrid.jsx
rename to openbis_ng_ui/src/js/components/types/common/VocabularyTypesGrid.jsx
index ab7ee679c7a986a9d573366fb03f2a3c4cc0eb51..34ab388f9c33b788dbb15a1f2e4aad03cb8f7eb7 100644
--- a/openbis_ng_ui/src/js/components/types/common/VocabulariesGrid.jsx
+++ b/openbis_ng_ui/src/js/components/types/common/VocabularyTypesGrid.jsx
@@ -1,12 +1,12 @@
 import React from 'react'
 import GridWithSettings from '@src/js/components/common/grid/GridWithSettings.jsx'
-import VocabularyLink from '@src/js/components/common/link/VocabularyLink.jsx'
+import VocabularyTypeLink from '@src/js/components/common/link/VocabularyTypeLink.jsx'
 import messages from '@src/js/common/messages.js'
 import logger from '@src/js/common/logger.js'
 
-class VocabulariesGrid extends React.PureComponent {
+class VocabularyTypesGrid extends React.PureComponent {
   render() {
-    logger.log(logger.DEBUG, 'VocabulariesGrid.render')
+    logger.log(logger.DEBUG, 'VocabularyTypesGrid.render')
 
     const { id, rows, selectedRowId, onSelectedRowChange, controllerRef } =
       this.props
@@ -22,7 +22,7 @@ class VocabulariesGrid extends React.PureComponent {
             label: messages.get(messages.CODE),
             getValue: ({ row }) => row.code,
             renderValue: ({ row }) => {
-              return <VocabularyLink vocabularyCode={row.code} />
+              return <VocabularyTypeLink vocabularyCode={row.code} />
             }
           },
           {
@@ -46,4 +46,4 @@ class VocabulariesGrid extends React.PureComponent {
   }
 }
 
-export default VocabulariesGrid
+export default VocabularyTypesGrid
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormController.js b/openbis_ng_ui/src/js/components/types/form/TypeFormController.js
deleted file mode 100644
index 7e59015623a100ecb6bcccf5a474a67cdfda18df..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormController.js
+++ /dev/null
@@ -1,72 +0,0 @@
-import PageController from '@src/js/components/common/page/PageController.js'
-import TypeFormControllerLoad from '@src/js/components/types/form/TypeFormControllerLoad.js'
-import TypeFormControllerValidate from '@src/js/components/types/form/TypeFormControllerValidate.js'
-import TypeFormControllerSave from '@src/js/components/types/form/TypeFormControllerSave.js'
-import TypeFormControllerRemove from '@src/js/components/types/form/TypeFormControllerRemove.js'
-import TypeFormControllerAddSection from '@src/js/components/types/form/TypeFormControllerAddSection.js'
-import TypeFormControllerAddProperty from '@src/js/components/types/form/TypeFormControllerAddProperty.js'
-import TypeFormControllerChange from '@src/js/components/types/form/TypeFormControllerChange.js'
-import TypeFormControllerOrderChange from '@src/js/components/types/form/TypeFormControllerOrderChange.js'
-import TypeFormControllerStrategies from '@src/js/components/types/form/TypeFormControllerStrategies.js'
-import pages from '@src/js/common/consts/pages.js'
-
-export default class TypeFormController extends PageController {
-  getPage() {
-    return pages.TYPES
-  }
-
-  getNewObjectType() {
-    const strategies = new TypeFormControllerStrategies()
-    return strategies.getStrategy(this.object.type).getNewObjectType()
-  }
-
-  getExistingObjectType() {
-    const strategies = new TypeFormControllerStrategies()
-    return strategies.getStrategy(this.object.type).getExistingObjectType()
-  }
-
-  load() {
-    return new TypeFormControllerLoad(this).execute()
-  }
-
-  validate(autofocus) {
-    return new TypeFormControllerValidate(this).execute(autofocus)
-  }
-
-  handleOrderChange(type, params) {
-    new TypeFormControllerOrderChange(this).execute(type, params)
-  }
-
-  handleChange(type, params) {
-    new TypeFormControllerChange(this).execute(type, params)
-  }
-
-  handleAddSection() {
-    new TypeFormControllerAddSection(this).execute()
-  }
-
-  handleAddProperty() {
-    new TypeFormControllerAddProperty(this).execute()
-  }
-
-  handleRemove() {
-    new TypeFormControllerRemove(this).executeRemove()
-  }
-
-  handleRemoveConfirm() {
-    new TypeFormControllerRemove(this).executeRemove(true)
-  }
-
-  handleRemoveCancel() {
-    new TypeFormControllerRemove(this).executeCancel()
-  }
-
-  handleSave() {
-    return new TypeFormControllerSave(this).execute()
-  }
-
-  getDictionaries() {
-    const { dictionaries } = this.context.getState()
-    return dictionaries || {}
-  }
-}
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyFormController.js b/openbis_ng_ui/src/js/components/types/form/VocabularyFormController.js
deleted file mode 100644
index c914de25a80894e5cc11e0a7898fd3cbd1e43013..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyFormController.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import PageController from '@src/js/components/common/page/PageController.js'
-import VocabularyFormControllerLoad from '@src/js/components/types/form/VocabularyFormControllerLoad.js'
-import VocabularyFormControllerAdd from '@src/js/components/types/form/VocabularyFormControllerAdd.js'
-import VocabularyFormControllerRemove from '@src/js/components/types/form/VocabularyFormControllerRemove.js'
-import VocabularyFormControllerValidate from '@src/js/components/types/form/VocabularyFormControllerValidate.js'
-import VocabularyFormControllerChange from '@src/js/components/types/form/VocabularyFormControllerChange.js'
-import VocabularyFormControllerSelectionChange from '@src/js/components/types/form/VocabularyFormControllerSelectionChange.js'
-import VocabularyFormControllerSave from '@src/js/components/types/form/VocabularyFormControllerSave.js'
-import pages from '@src/js/common/consts/pages.js'
-import objectTypes from '@src/js/common/consts/objectType.js'
-
-export default class VocabularyFormController extends PageController {
-  constructor(facade) {
-    super(facade)
-  }
-
-  getPage() {
-    return pages.TYPES
-  }
-
-  getNewObjectType() {
-    return objectTypes.NEW_VOCABULARY_TYPE
-  }
-
-  getExistingObjectType() {
-    return objectTypes.VOCABULARY_TYPE
-  }
-
-  load() {
-    return new VocabularyFormControllerLoad(this).execute()
-  }
-
-  validate(autofocus) {
-    return new VocabularyFormControllerValidate(this).execute(autofocus)
-  }
-
-  handleAdd() {
-    return new VocabularyFormControllerAdd(this).execute()
-  }
-
-  handleRemove() {
-    return new VocabularyFormControllerRemove(this).execute()
-  }
-
-  handleChange(type, params) {
-    return new VocabularyFormControllerChange(this).execute(type, params)
-  }
-
-  handleSelectionChange(type, params) {
-    return new VocabularyFormControllerSelectionChange(this).execute(
-      type,
-      params
-    )
-  }
-
-  handleSave() {
-    return new VocabularyFormControllerSave(this).execute()
-  }
-}
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeForm.jsx b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeForm.jsx
similarity index 73%
rename from openbis_ng_ui/src/js/components/types/form/TypeForm.jsx
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeForm.jsx
index 819a60b4bf9c5659ef376ec0337247f1c9e51981..d4771d4c5a29e62bde3b74bd0991832ebd1ddf40 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeForm.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeForm.jsx
@@ -4,13 +4,13 @@ import { connect } from 'react-redux'
 import { withStyles } from '@material-ui/core/styles'
 import ComponentContext from '@src/js/components/common/ComponentContext.js'
 import PageWithTwoPanels from '@src/js/components/common/page/PageWithTwoPanels.jsx'
-import TypeFormController from '@src/js/components/types/form/TypeFormController.js'
-import TypeFormFacade from '@src/js/components/types/form/TypeFormFacade.js'
-import TypeFormButtons from '@src/js/components/types/form/TypeFormButtons.jsx'
-import TypeFormParameters from '@src/js/components/types/form/TypeFormParameters.jsx'
-import TypeFormPreview from '@src/js/components/types/form/TypeFormPreview.jsx'
-import TypeFormDialogRemoveSection from '@src/js/components/types/form/TypeFormDialogRemoveSection.jsx'
-import TypeFormDialogRemoveProperty from '@src/js/components/types/form/TypeFormDialogRemoveProperty.jsx'
+import EntityTypeFormController from '@src/js/components/types/form/entitytype/EntityTypeFormController.js'
+import EntityTypeFormFacade from '@src/js/components/types/form/entitytype/EntityTypeFormFacade.js'
+import EntityTypeFormButtons from '@src/js/components/types/form/entitytype/EntityTypeFormButtons.jsx'
+import EntityTypeFormParameters from '@src/js/components/types/form/entitytype/EntityTypeFormParameters.jsx'
+import EntityTypeFormPreview from '@src/js/components/types/form/entitytype/EntityTypeFormPreview.jsx'
+import EntityTypeFormDialogRemoveSection from '@src/js/components/types/form/entitytype/EntityTypeFormDialogRemoveSection.jsx'
+import EntityTypeFormDialogRemoveProperty from '@src/js/components/types/form/entitytype/EntityTypeFormDialogRemoveProperty.jsx'
 import selectors from '@src/js/store/selectors/selectors.js'
 import logger from '@src/js/common/logger.js'
 
@@ -22,7 +22,7 @@ function mapStateToProps(state) {
   }
 }
 
-class TypeForm extends React.PureComponent {
+class EntityTypeForm extends React.PureComponent {
   constructor(props) {
     super(props)
 
@@ -31,7 +31,7 @@ class TypeForm extends React.PureComponent {
     if (this.props.controller) {
       this.controller = this.props.controller
     } else {
-      this.controller = new TypeFormController(new TypeFormFacade())
+      this.controller = new EntityTypeFormController(new EntityTypeFormFacade())
     }
 
     this.controller.init(new ComponentContext(this))
@@ -42,7 +42,7 @@ class TypeForm extends React.PureComponent {
   }
 
   render() {
-    logger.log(logger.DEBUG, 'TypeForm.render')
+    logger.log(logger.DEBUG, 'EntityTypeForm.render')
 
     const { loading, loaded, type } = this.state
 
@@ -63,7 +63,7 @@ class TypeForm extends React.PureComponent {
     const { type, properties, sections, preview, selection, mode } = this.state
 
     return (
-      <TypeFormPreview
+      <EntityTypeFormPreview
         controller={controller}
         type={type}
         properties={properties}
@@ -83,7 +83,7 @@ class TypeForm extends React.PureComponent {
     let { type, properties, sections, selection, mode } = this.state
 
     return (
-      <TypeFormParameters
+      <EntityTypeFormParameters
         controller={controller}
         type={type}
         properties={properties}
@@ -112,7 +112,7 @@ class TypeForm extends React.PureComponent {
 
     return (
       <React.Fragment>
-        <TypeFormButtons
+        <EntityTypeFormButtons
           onAddSection={controller.handleAddSection}
           onAddProperty={controller.handleAddProperty}
           onRemove={controller.handleRemove}
@@ -126,7 +126,7 @@ class TypeForm extends React.PureComponent {
           changed={changed}
           mode={mode}
         />
-        <TypeFormDialogRemoveSection
+        <EntityTypeFormDialogRemoveSection
           open={removeSectionDialogOpen}
           object={object}
           selection={selection}
@@ -134,7 +134,7 @@ class TypeForm extends React.PureComponent {
           onConfirm={controller.handleRemoveConfirm}
           onCancel={controller.handleRemoveCancel}
         />
-        <TypeFormDialogRemoveProperty
+        <EntityTypeFormDialogRemoveProperty
           open={removePropertyDialogOpen}
           object={object}
           selection={selection}
@@ -147,4 +147,7 @@ class TypeForm extends React.PureComponent {
   }
 }
 
-export default _.flow(connect(mapStateToProps), withStyles(styles))(TypeForm)
+export default _.flow(
+  connect(mapStateToProps),
+  withStyles(styles)
+)(EntityTypeForm)
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormButtons.jsx b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormButtons.jsx
similarity index 79%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormButtons.jsx
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormButtons.jsx
index bb4029707613b5ca38bc9d774bab7813921cd004..94558b7a3c371ee59e1726d51c47d23ba094887d 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormButtons.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormButtons.jsx
@@ -3,8 +3,8 @@ import { connect } from 'react-redux'
 import PageMode from '@src/js/components/common/page/PageMode.js'
 import PageButtons from '@src/js/components/common/page/PageButtons.jsx'
 import Button from '@src/js/components/common/form/Button.jsx'
-import TypeFormControllerStrategies from '@src/js/components/types/form/TypeFormControllerStrategies.js'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormControllerStrategies from '@src/js/components/types/form/entitytype/EntityTypeFormControllerStrategies.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import users from '@src/js/common/consts/users.js'
 import messages from '@src/js/common/messages.js'
 import selectors from '@src/js/store/selectors/selectors.js'
@@ -16,17 +16,19 @@ function mapStateToProps(state) {
   }
 }
 
-class TypeFormButtons extends React.PureComponent {
+class EntityTypeFormButtons extends React.PureComponent {
   constructor(props) {
     super(props)
   }
 
   render() {
-    logger.log(logger.DEBUG, 'TypeFormButtons.render')
+    logger.log(logger.DEBUG, 'EntityTypeFormButtons.render')
 
     const { mode, onEdit, onSave, onCancel, changed, object } = this.props
 
-    const strategy = new TypeFormControllerStrategies().getStrategy(object.type)
+    const strategy = new EntityTypeFormControllerStrategies().getStrategy(
+      object.type
+    )
     const existing = object.type === strategy.getExistingObjectType()
 
     return (
@@ -84,15 +86,15 @@ class TypeFormButtons extends React.PureComponent {
     const { selection } = this.props
     return (
       selection &&
-      (selection.type === TypeFormSelectionType.PROPERTY ||
-        selection.type === TypeFormSelectionType.SECTION)
+      (selection.type === EntityTypeFormSelectionType.PROPERTY ||
+        selection.type === EntityTypeFormSelectionType.SECTION)
     )
   }
 
   isNonSystemInternalSectionSelected() {
     const { selection, sections, properties } = this.props
 
-    if (selection && selection.type === TypeFormSelectionType.SECTION) {
+    if (selection && selection.type === EntityTypeFormSelectionType.SECTION) {
       const section = sections.find(
         section => section.id === selection.params.id
       )
@@ -108,7 +110,7 @@ class TypeFormButtons extends React.PureComponent {
   isNonSystemInternalPropertySelected() {
     const { selection, properties } = this.props
 
-    if (selection && selection.type === TypeFormSelectionType.PROPERTY) {
+    if (selection && selection.type === EntityTypeFormSelectionType.PROPERTY) {
       const property = properties.find(
         property => property.id === selection.params.id
       )
@@ -123,4 +125,4 @@ class TypeFormButtons extends React.PureComponent {
   }
 }
 
-export default connect(mapStateToProps)(TypeFormButtons)
+export default connect(mapStateToProps)(EntityTypeFormButtons)
diff --git a/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormController.js b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormController.js
new file mode 100644
index 0000000000000000000000000000000000000000..b06e7fc8a273149c4f966364c9642f3764460178
--- /dev/null
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormController.js
@@ -0,0 +1,72 @@
+import PageController from '@src/js/components/common/page/PageController.js'
+import EntityTypeFormControllerLoad from '@src/js/components/types/form/entitytype/EntityTypeFormControllerLoad.js'
+import EntityTypeFormControllerValidate from '@src/js/components/types/form/entitytype/EntityTypeFormControllerValidate.js'
+import EntityTypeFormControllerSave from '@src/js/components/types/form/entitytype/EntityTypeFormControllerSave.js'
+import EntityTypeFormControllerRemove from '@src/js/components/types/form/entitytype/EntityTypeFormControllerRemove.js'
+import EntityTypeFormControllerAddSection from '@src/js/components/types/form/entitytype/EntityTypeFormControllerAddSection.js'
+import EntityTypeFormControllerAddProperty from '@src/js/components/types/form/entitytype/EntityTypeFormControllerAddProperty.js'
+import EntityTypeFormControllerChange from '@src/js/components/types/form/entitytype/EntityTypeFormControllerChange.js'
+import EntityTypeFormControllerOrderChange from '@src/js/components/types/form/entitytype/EntityTypeFormControllerOrderChange.js'
+import EntityTypeFormControllerStrategies from '@src/js/components/types/form/entitytype/EntityTypeFormControllerStrategies.js'
+import pages from '@src/js/common/consts/pages.js'
+
+export default class EntityTypeFormController extends PageController {
+  getPage() {
+    return pages.TYPES
+  }
+
+  getNewObjectType() {
+    const strategies = new EntityTypeFormControllerStrategies()
+    return strategies.getStrategy(this.object.type).getNewObjectType()
+  }
+
+  getExistingObjectType() {
+    const strategies = new EntityTypeFormControllerStrategies()
+    return strategies.getStrategy(this.object.type).getExistingObjectType()
+  }
+
+  load() {
+    return new EntityTypeFormControllerLoad(this).execute()
+  }
+
+  validate(autofocus) {
+    return new EntityTypeFormControllerValidate(this).execute(autofocus)
+  }
+
+  handleOrderChange(type, params) {
+    new EntityTypeFormControllerOrderChange(this).execute(type, params)
+  }
+
+  handleChange(type, params) {
+    new EntityTypeFormControllerChange(this).execute(type, params)
+  }
+
+  handleAddSection() {
+    new EntityTypeFormControllerAddSection(this).execute()
+  }
+
+  handleAddProperty() {
+    new EntityTypeFormControllerAddProperty(this).execute()
+  }
+
+  handleRemove() {
+    new EntityTypeFormControllerRemove(this).executeRemove()
+  }
+
+  handleRemoveConfirm() {
+    new EntityTypeFormControllerRemove(this).executeRemove(true)
+  }
+
+  handleRemoveCancel() {
+    new EntityTypeFormControllerRemove(this).executeCancel()
+  }
+
+  handleSave() {
+    return new EntityTypeFormControllerSave(this).execute()
+  }
+
+  getDictionaries() {
+    const { dictionaries } = this.context.getState()
+    return dictionaries || {}
+  }
+}
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerAddProperty.js b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerAddProperty.js
similarity index 88%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormControllerAddProperty.js
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerAddProperty.js
index dfb05d7048c2d97ac8d6dc15235eff58ee7af73f..8f01f5cced203dad290881e62d67ca8602ce40d5 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerAddProperty.js
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerAddProperty.js
@@ -1,7 +1,7 @@
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 
-export default class TypeFormControllerAddProperty {
+export default class EntityTypeFormControllerAddProperty {
   constructor(controller) {
     this.controller = controller
     this.context = controller.context
@@ -15,12 +15,12 @@ export default class TypeFormControllerAddProperty {
     let sectionPropertyIndex = null
 
     if (selection) {
-      if (selection.type === TypeFormSelectionType.SECTION) {
+      if (selection.type === EntityTypeFormSelectionType.SECTION) {
         sectionIndex = sections.findIndex(
           section => section.id === selection.params.id
         )
         sectionPropertyIndex = sections[sectionIndex].properties.length
-      } else if (selection.type === TypeFormSelectionType.PROPERTY) {
+      } else if (selection.type === EntityTypeFormSelectionType.PROPERTY) {
         sections.forEach((section, i) => {
           section.properties.forEach((property, j) => {
             if (property === selection.params.id) {
@@ -91,7 +91,7 @@ export default class TypeFormControllerAddProperty {
     newSections[sectionIndex] = newSection
 
     let newSelection = {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: {
         id: newProperty.id,
         part: 'code'
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerAddSection.js b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerAddSection.js
similarity index 76%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormControllerAddSection.js
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerAddSection.js
index 994e35bc255beead815da4627756752f15b61779..f2e24655e7d9db659f8d8b06d9f630608abe6e6d 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerAddSection.js
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerAddSection.js
@@ -1,7 +1,7 @@
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 
-export default class TypeFormControllerAddSection {
+export default class EntityTypeFormControllerAddSection {
   constructor(controller) {
     this.controller = controller
     this.context = controller.context
@@ -17,19 +17,19 @@ export default class TypeFormControllerAddSection {
       properties: []
     }
     let newSelection = {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: {
         id: newSection.id
       }
     }
 
     if (selection) {
-      if (selection.type === TypeFormSelectionType.SECTION) {
+      if (selection.type === EntityTypeFormSelectionType.SECTION) {
         let index = sections.findIndex(
           section => section.id === selection.params.id
         )
         newSections.splice(index + 1, 0, newSection)
-      } else if (selection.type === TypeFormSelectionType.PROPERTY) {
+      } else if (selection.type === EntityTypeFormSelectionType.PROPERTY) {
         let index = sections.findIndex(
           section => section.properties.indexOf(selection.params.id) !== -1
         )
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerChange.js b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerChange.js
similarity index 95%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormControllerChange.js
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerChange.js
index 4dfbad9d09082ccdb40b665b755b77afaa8140c3..893044ebd1b0c72574415555ee5cb135ffaae46e 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerChange.js
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerChange.js
@@ -1,19 +1,19 @@
 import _ from 'lodash'
 import openbis from '@src/js/services/openbis.js'
 import PageControllerChange from '@src/js/components/common/page/PageControllerChange.js'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 import users from '@src/js/common/consts/users.js'
 
-export default class TypeFormControllerChange extends PageControllerChange {
+export default class EntityTypeFormControllerChange extends PageControllerChange {
   async execute(type, params) {
-    if (type === TypeFormSelectionType.TYPE) {
+    if (type === EntityTypeFormSelectionType.TYPE) {
       await this._handleChangeType(params)
-    } else if (type === TypeFormSelectionType.SECTION) {
+    } else if (type === EntityTypeFormSelectionType.SECTION) {
       await this._handleChangeSection(params)
-    } else if (type === TypeFormSelectionType.PROPERTY) {
+    } else if (type === EntityTypeFormSelectionType.PROPERTY) {
       await this._handleChangeProperty(params)
-    } else if (type === TypeFormSelectionType.PREVIEW) {
+    } else if (type === EntityTypeFormSelectionType.PREVIEW) {
       await this._handleChangePreview(params)
     }
   }
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerLoad.js b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerLoad.js
similarity index 94%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormControllerLoad.js
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerLoad.js
index bac942c5dd90f0fbed966360c5b48ec75d5046c3..bda39cc2fdf461773c975df317431d5aca211403 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerLoad.js
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerLoad.js
@@ -1,13 +1,13 @@
 import _ from 'lodash'
 import openbis from '@src/js/services/openbis.js'
 import PageControllerLoad from '@src/js/components/common/page/PageControllerLoad.js'
-import TypeFormControllerStrategies from '@src/js/components/types/form/TypeFormControllerStrategies.js'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormControllerStrategies from '@src/js/components/types/form/entitytype/EntityTypeFormControllerStrategies.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 import users from '@src/js/common/consts/users.js'
 import util from '@src/js/common/util.js'
 
-export default class TypeFormControllerLoad extends PageControllerLoad {
+export default class EntityTypeFormControllerLoad extends PageControllerLoad {
   async load(object, isNew) {
     return Promise.all([
       this._loadDictionaries(object),
@@ -251,7 +251,7 @@ export default class TypeFormControllerLoad extends PageControllerLoad {
 
     if (!oldSelection) {
       return null
-    } else if (oldSelection.type === TypeFormSelectionType.SECTION) {
+    } else if (oldSelection.type === EntityTypeFormSelectionType.SECTION) {
       let sectionIndex = -1
 
       oldSections.forEach((oldSection, i) => {
@@ -263,14 +263,14 @@ export default class TypeFormControllerLoad extends PageControllerLoad {
       if (sectionIndex >= 0 && sectionIndex < newSections.length) {
         const newSection = newSections[sectionIndex]
         return {
-          type: TypeFormSelectionType.SECTION,
+          type: EntityTypeFormSelectionType.SECTION,
           params: {
             id: newSection.id,
             part: oldSelection.params.part
           }
         }
       }
-    } else if (oldSelection.type === TypeFormSelectionType.PROPERTY) {
+    } else if (oldSelection.type === EntityTypeFormSelectionType.PROPERTY) {
       let sectionIndex = -1
       let propertyIndex = -1
 
@@ -291,7 +291,7 @@ export default class TypeFormControllerLoad extends PageControllerLoad {
         ) {
           const newProperty = newSection.properties[propertyIndex]
           return {
-            type: TypeFormSelectionType.PROPERTY,
+            type: EntityTypeFormSelectionType.PROPERTY,
             params: {
               id: newProperty,
               part: oldSelection.params.part
@@ -312,7 +312,7 @@ export default class TypeFormControllerLoad extends PageControllerLoad {
   }
 
   _getStrategy() {
-    const strategies = new TypeFormControllerStrategies()
+    const strategies = new EntityTypeFormControllerStrategies()
     strategies.extendObjectTypeStrategy(new ObjectTypeStrategy())
     strategies.extendCollectionTypeStrategy(new CollectionTypeStrategy())
     strategies.extendDataSetTypeStrategy(new DataSetTypeStrategy())
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerOrderChange.js b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerOrderChange.js
similarity index 90%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormControllerOrderChange.js
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerOrderChange.js
index a0a5a3d190ae607306a01cdc4740ed53670d4db3..7a7ff69fa2675afe82a158d816d29e47c86fd610 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerOrderChange.js
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerOrderChange.js
@@ -1,17 +1,17 @@
 import _ from 'lodash'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 
-export default class TypeFormControllerOrderChange {
+export default class EntityTypeFormControllerOrderChange {
   constructor(controller) {
     this.controller = controller
     this.context = controller.context
   }
 
   execute(type, params) {
-    if (type === TypeFormSelectionType.SECTION) {
+    if (type === EntityTypeFormSelectionType.SECTION) {
       let { fromIndex, toIndex } = params
       this._handleOrderChangeSection(fromIndex, toIndex)
-    } else if (type === TypeFormSelectionType.PROPERTY) {
+    } else if (type === EntityTypeFormSelectionType.PROPERTY) {
       let { fromSectionId, toSectionId, fromIndex, toIndex } = params
       this._handleOrderChangeProperty(
         fromSectionId,
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerRemove.js b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerRemove.js
similarity index 90%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormControllerRemove.js
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerRemove.js
index 10094ef44583f049b2116e9164f5f9a4ebf2dbbd..e6af0e104ed283f64cec094f599e2b31d72ac450 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerRemove.js
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerRemove.js
@@ -1,7 +1,7 @@
 import _ from 'lodash'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 
-export default class TypeFormControllerRemove {
+export default class EntityTypeFormControllerRemove {
   constructor(controller) {
     this.controller = controller
     this.context = controller.context
@@ -11,20 +11,20 @@ export default class TypeFormControllerRemove {
 
   executeRemove(confirmed = false) {
     const { selection } = this.context.getState()
-    if (selection.type === TypeFormSelectionType.SECTION) {
+    if (selection.type === EntityTypeFormSelectionType.SECTION) {
       this._handleRemoveSection(selection.params.id, confirmed)
-    } else if (selection.type === TypeFormSelectionType.PROPERTY) {
+    } else if (selection.type === EntityTypeFormSelectionType.PROPERTY) {
       this._handleRemoveProperty(selection.params.id, confirmed)
     }
   }
 
   executeCancel() {
     const { selection } = this.context.getState()
-    if (selection.type === TypeFormSelectionType.SECTION) {
+    if (selection.type === EntityTypeFormSelectionType.SECTION) {
       this.context.setState({
         removeSectionDialogOpen: false
       })
-    } else if (selection.type === TypeFormSelectionType.PROPERTY) {
+    } else if (selection.type === EntityTypeFormSelectionType.PROPERTY) {
       this.context.setState({
         removePropertyDialogOpen: false
       })
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerSave.js b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerSave.js
similarity index 85%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormControllerSave.js
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerSave.js
index b7fbf2424390fb42010cb58abb9be3f0cb5b68d9..175382d3cb16860189140b1548adc8704f157019 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerSave.js
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerSave.js
@@ -1,11 +1,11 @@
 import _ from 'lodash'
 import PageControllerSave from '@src/js/components/common/page/PageControllerSave.js'
-import TypeFormControllerStrategies from '@src/js/components/types/form/TypeFormControllerStrategies.js'
+import EntityTypeFormControllerStrategies from '@src/js/components/types/form/entitytype/EntityTypeFormControllerStrategies.js'
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 import users from '@src/js/common/consts/users.js'
 import openbis from '@src/js/services/openbis.js'
 
-export default class TypeFormControllerSave extends PageControllerSave {
+export default class EntityTypeFormControllerSave extends PageControllerSave {
   async save() {
     const state = this.context.getState()
     const type = this._prepareType(state.type)
@@ -48,6 +48,13 @@ export default class TypeFormControllerSave extends PageControllerSave {
       operations.push(this._createTypeOperation(type, assignments))
     }
 
+    const deleteUnusedPropertyTypesOperation =
+      await this._deleteUnusedPropertyTypesOperation(type, properties)
+
+    if (deleteUnusedPropertyTypesOperation) {
+      operations.push(deleteUnusedPropertyTypesOperation)
+    }
+
     const options = new openbis.SynchronousOperationExecutionOptions()
     options.setExecuteInOrder(true)
     await this.facade.executeOperations(operations, options)
@@ -173,6 +180,47 @@ export default class TypeFormControllerSave extends PageControllerSave {
     return new openbis.UpdatePropertyTypesOperation([update])
   }
 
+  async _deleteUnusedPropertyTypesOperation(type, properties) {
+    const potentialPropertyTypesToDelete = []
+
+    if (type.original) {
+      type.original.properties.forEach(originalProperty => {
+        const property = _.find(properties, [
+          'code.value',
+          originalProperty.code.value
+        ])
+        if (!property && !originalProperty.internal.value) {
+          potentialPropertyTypesToDelete.push(originalProperty)
+        }
+      })
+    }
+
+    if (potentialPropertyTypesToDelete.length > 0) {
+      const propertyTypesToDelete = []
+
+      const assignments = await this.facade.loadAssignments()
+      potentialPropertyTypesToDelete.forEach(propertyType => {
+        const propertyTypeAssignments = assignments[propertyType.code.value]
+        if (propertyTypeAssignments === 1) {
+          propertyTypesToDelete.push(
+            new openbis.PropertyTypePermId(propertyType.code.value)
+          )
+        }
+      })
+
+      if (propertyTypesToDelete.length > 0) {
+        const options = new openbis.PropertyTypeDeletionOptions()
+        options.setReason('deleted via ng_ui')
+        return new openbis.DeletePropertyTypesOperation(
+          propertyTypesToDelete,
+          options
+        )
+      }
+    }
+
+    return null
+  }
+
   _propertyAssignmentCreation(property, index) {
     let creation = new openbis.PropertyAssignmentCreation()
     creation.setOrdinal(index + 1)
@@ -237,7 +285,7 @@ export default class TypeFormControllerSave extends PageControllerSave {
   }
 
   _getStrategy() {
-    const strategies = new TypeFormControllerStrategies()
+    const strategies = new EntityTypeFormControllerStrategies()
     strategies.extendObjectTypeStrategy(new ObjectTypeStrategy())
     strategies.extendCollectionTypeStrategy(new CollectionTypeStrategy())
     strategies.extendDataSetTypeStrategy(new DataSetTypeStrategy())
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerStrategies.js b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerStrategies.js
similarity index 97%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormControllerStrategies.js
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerStrategies.js
index eecde473fa960a1d319ff381c22fd07e9b716349..c4b530479a0e3e1c7d231beb22dbb57cb6f124f5 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerStrategies.js
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerStrategies.js
@@ -1,7 +1,7 @@
 import objectTypes from '@src/js/common/consts/objectType.js'
 import openbis from '@src/js/services/openbis.js'
 
-export default class TypeFormControllerStrategies {
+export default class EntityTypeFormControllerStrategies {
   constructor() {
     this.objectTypeStrategy = {
       getEntityKind: function () {
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerValidate.js b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerValidate.js
similarity index 86%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormControllerValidate.js
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerValidate.js
index c3d6dd9c85714c9885f2035ccae1e228343a9187..100cb409b17f807a6a1207f4d5669c65acd85721 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerValidate.js
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormControllerValidate.js
@@ -1,9 +1,9 @@
 import PageControllerValidate from '@src/js/components/common/page/PageConrollerValidate.js'
-import TypeFormControllerStrategies from '@src/js/components/types/form/TypeFormControllerStrategies.js'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormControllerStrategies from '@src/js/components/types/form/entitytype/EntityTypeFormControllerStrategies.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import messages from '@src/js/common/messages.js'
 
-export default class TypeFormControllerValidate extends PageControllerValidate {
+export default class EntityTypeFormControllerValidate extends PageControllerValidate {
   validate(validator) {
     const { type, properties } = this.context.getState()
 
@@ -21,14 +21,14 @@ export default class TypeFormControllerValidate extends PageControllerValidate {
 
     if (firstError.object === type) {
       await this.setSelection({
-        type: TypeFormSelectionType.TYPE,
+        type: EntityTypeFormSelectionType.TYPE,
         params: {
           part: firstError.name
         }
       })
     } else if (properties.includes(firstError.object)) {
       await this.setSelection({
-        type: TypeFormSelectionType.PROPERTY,
+        type: EntityTypeFormSelectionType.PROPERTY,
         params: {
           id: firstError.object.id,
           part: firstError.name
@@ -94,7 +94,7 @@ export default class TypeFormControllerValidate extends PageControllerValidate {
   }
 
   _getStrategy() {
-    const strategies = new TypeFormControllerStrategies()
+    const strategies = new EntityTypeFormControllerStrategies()
     strategies.extendObjectTypeStrategy(new ObjectTypeStrategy())
     strategies.extendCollectionTypeStrategy(new CollectionTypeStrategy())
     strategies.extendDataSetTypeStrategy(new DataSetTypeStrategy())
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormDialogRemoveProperty.jsx b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormDialogRemoveProperty.jsx
similarity index 76%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormDialogRemoveProperty.jsx
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormDialogRemoveProperty.jsx
index aa9b26f72f63da0eac12a73c5727a71d8779728a..6af5960c081aa3f6a1092a32cc39441abe44c5ba 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormDialogRemoveProperty.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormDialogRemoveProperty.jsx
@@ -1,13 +1,13 @@
 import _ from 'lodash'
 import React from 'react'
 import ConfirmationDialog from '@src/js/components/common/dialog/ConfirmationDialog.jsx'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import messages from '@src/js/common/messages.js'
 import logger from '@src/js/common/logger.js'
 
-class TypeFormDialogRemoveProperty extends React.Component {
+class EntityTypeFormDialogRemoveProperty extends React.Component {
   render() {
-    logger.log(logger.DEBUG, 'TypeFormDialogRemoveProperty.render')
+    logger.log(logger.DEBUG, 'EntityTypeFormDialogRemoveProperty.render')
 
     const { open, object, onConfirm, onCancel } = this.props
 
@@ -44,7 +44,7 @@ class TypeFormDialogRemoveProperty extends React.Component {
   getProperty() {
     const { selection, properties } = this.props
 
-    if (selection && selection.type === TypeFormSelectionType.PROPERTY) {
+    if (selection && selection.type === EntityTypeFormSelectionType.PROPERTY) {
       return _.find(properties, ['id', selection.params.id])
     } else {
       return null
@@ -52,4 +52,4 @@ class TypeFormDialogRemoveProperty extends React.Component {
   }
 }
 
-export default TypeFormDialogRemoveProperty
+export default EntityTypeFormDialogRemoveProperty
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormDialogRemoveSection.jsx b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormDialogRemoveSection.jsx
similarity index 77%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormDialogRemoveSection.jsx
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormDialogRemoveSection.jsx
index a3a38b8667682d0c51031594cfc6d111f0fa4693..d0dc77bb89854151d904e08acf20bd9850a3f092 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormDialogRemoveSection.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormDialogRemoveSection.jsx
@@ -1,13 +1,13 @@
 import _ from 'lodash'
 import React from 'react'
 import ConfirmationDialog from '@src/js/components/common/dialog/ConfirmationDialog.jsx'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import messages from '@src/js/common/messages.js'
 import logger from '@src/js/common/logger.js'
 
-class TypeFormDialogRemoveSection extends React.Component {
+class EntityTypeFormDialogRemoveSection extends React.Component {
   render() {
-    logger.log(logger.DEBUG, 'TypeFormDialogRemoveSection.render')
+    logger.log(logger.DEBUG, 'EntityTypeFormDialogRemoveSection.render')
 
     const { open, object, onConfirm, onCancel } = this.props
 
@@ -48,7 +48,7 @@ class TypeFormDialogRemoveSection extends React.Component {
   getSection() {
     const { selection, sections } = this.props
 
-    if (selection && selection.type === TypeFormSelectionType.SECTION) {
+    if (selection && selection.type === EntityTypeFormSelectionType.SECTION) {
       return _.find(sections, ['id', selection.params.id])
     } else {
       return null
@@ -56,4 +56,4 @@ class TypeFormDialogRemoveSection extends React.Component {
   }
 }
 
-export default TypeFormDialogRemoveSection
+export default EntityTypeFormDialogRemoveSection
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormFacade.js b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormFacade.js
similarity index 97%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormFacade.js
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormFacade.js
index 0dd93f830b7467fd0610ae8f049156786416e981..f096aa89d1e41e4da01a9f439597640e2ce87d5b 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormFacade.js
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormFacade.js
@@ -1,7 +1,7 @@
 import openbis from '@src/js/services/openbis.js'
-import TypeFormControllerStrategies from '@src/js/components/types/form/TypeFormControllerStrategies.js'
+import EntityTypeFormControllerStrategies from '@src/js/components/types/form/entitytype/EntityTypeFormControllerStrategies.js'
 
-export default class TypeFormFacade {
+export default class EntityTypeFormFacade {
   async loadType(object) {
     const strategy = this._getStrategy(object.type)
     const id = new openbis.EntityTypePermId(object.id)
@@ -199,7 +199,7 @@ export default class TypeFormFacade {
   }
 
   _getStrategy(type) {
-    const strategies = new TypeFormControllerStrategies()
+    const strategies = new EntityTypeFormControllerStrategies()
     strategies.extendObjectTypeStrategy(new ObjectTypeStrategy())
     strategies.extendCollectionTypeStrategy(new CollectionTypeStrategy())
     strategies.extendDataSetTypeStrategy(new DataSetTypeStrategy())
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormParameters.jsx b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormParameters.jsx
similarity index 62%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormParameters.jsx
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormParameters.jsx
index 2c88ee90587e2218789b248f9cf109b5a246c889..a8e3e5e0e0a7bb1d8b4ce496639ba1d59515e8b6 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormParameters.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormParameters.jsx
@@ -1,19 +1,19 @@
 import React from 'react'
 import { withStyles } from '@material-ui/core/styles'
-import TypeFormParametersType from '@src/js/components/types/form/TypeFormParametersType.jsx'
-import TypeFormParametersProperty from '@src/js/components/types/form/TypeFormParametersProperty.jsx'
-import TypeFormParametersSection from '@src/js/components/types/form/TypeFormParametersSection.jsx'
+import EntityTypeFormParametersType from '@src/js/components/types/form/entitytype/EntityTypeFormParametersType.jsx'
+import EntityTypeFormParametersProperty from '@src/js/components/types/form/entitytype/EntityTypeFormParametersProperty.jsx'
+import EntityTypeFormParametersSection from '@src/js/components/types/form/entitytype/EntityTypeFormParametersSection.jsx'
 import logger from '@src/js/common/logger.js'
 
 const styles = () => ({})
 
-class TypeFormParameters extends React.PureComponent {
+class EntityTypeFormParameters extends React.PureComponent {
   constructor(props) {
     super(props)
   }
 
   render() {
-    logger.log(logger.DEBUG, 'TypeFormParameters.render')
+    logger.log(logger.DEBUG, 'EntityTypeFormParameters.render')
 
     const {
       controller,
@@ -29,7 +29,7 @@ class TypeFormParameters extends React.PureComponent {
 
     return (
       <div>
-        <TypeFormParametersType
+        <EntityTypeFormParametersType
           controller={controller}
           type={type}
           selection={selection}
@@ -38,7 +38,7 @@ class TypeFormParameters extends React.PureComponent {
           onSelectionChange={onSelectionChange}
           onBlur={onBlur}
         />
-        <TypeFormParametersSection
+        <EntityTypeFormParametersSection
           sections={sections}
           selection={selection}
           mode={mode}
@@ -46,7 +46,7 @@ class TypeFormParameters extends React.PureComponent {
           onSelectionChange={onSelectionChange}
           onBlur={onBlur}
         />
-        <TypeFormParametersProperty
+        <EntityTypeFormParametersProperty
           controller={controller}
           type={type}
           properties={properties}
@@ -61,4 +61,4 @@ class TypeFormParameters extends React.PureComponent {
   }
 }
 
-export default withStyles(styles)(TypeFormParameters)
+export default withStyles(styles)(EntityTypeFormParameters)
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormParametersProperty.jsx b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormParametersProperty.jsx
similarity index 96%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormParametersProperty.jsx
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormParametersProperty.jsx
index a322a6c66936b634e990055e21860f84ffa3c405..a06099fad174b6451f10f479976442278eca15be 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormParametersProperty.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormParametersProperty.jsx
@@ -9,7 +9,7 @@ import CheckboxField from '@src/js/components/common/form/CheckboxField.jsx'
 import TextField from '@src/js/components/common/form/TextField.jsx'
 import SelectField from '@src/js/components/common/form/SelectField.jsx'
 import Message from '@src/js/components/common/form/Message.jsx'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import DataType from '@src/js/components/common/dto/DataType.js'
 import openbis from '@src/js/services/openbis.js'
 import users from '@src/js/common/consts/users.js'
@@ -29,7 +29,7 @@ function mapStateToProps(state) {
   }
 }
 
-class TypeFormParametersProperty extends React.PureComponent {
+class EntityTypeFormParametersProperty extends React.PureComponent {
   constructor(props) {
     super(props)
     this.state = {}
@@ -82,7 +82,7 @@ class TypeFormParametersProperty extends React.PureComponent {
 
   handleChange(event) {
     const property = this.getProperty(this.props)
-    this.props.onChange(TypeFormSelectionType.PROPERTY, {
+    this.props.onChange(EntityTypeFormSelectionType.PROPERTY, {
       id: property.id,
       field: event.target.name,
       value: event.target.value
@@ -91,7 +91,7 @@ class TypeFormParametersProperty extends React.PureComponent {
 
   handleFocus(event) {
     const property = this.getProperty(this.props)
-    this.props.onSelectionChange(TypeFormSelectionType.PROPERTY, {
+    this.props.onSelectionChange(EntityTypeFormSelectionType.PROPERTY, {
       id: property.id,
       part: event.target.name
     })
@@ -102,7 +102,7 @@ class TypeFormParametersProperty extends React.PureComponent {
   }
 
   render() {
-    logger.log(logger.DEBUG, 'TypeFormParametersProperty.render')
+    logger.log(logger.DEBUG, 'EntityTypeFormParametersProperty.render')
 
     const property = this.getProperty(this.props)
     if (!property) {
@@ -497,7 +497,7 @@ class TypeFormParametersProperty extends React.PureComponent {
           name='schema'
           error={error}
           disabled={!enabled}
-          value={value}
+          value={mode === 'view' ? <pre>{value}</pre> : value}
           multiline={true}
           mode={mode}
           onChange={this.handleChange}
@@ -525,7 +525,7 @@ class TypeFormParametersProperty extends React.PureComponent {
           name='transformation'
           error={error}
           disabled={!enabled}
-          value={value}
+          value={mode === 'view' ? <pre>{value}</pre> : value}
           multiline={true}
           mode={mode}
           onChange={this.handleChange}
@@ -693,7 +693,7 @@ class TypeFormParametersProperty extends React.PureComponent {
   getProperty(props) {
     let { properties, selection } = props
 
-    if (selection && selection.type === TypeFormSelectionType.PROPERTY) {
+    if (selection && selection.type === EntityTypeFormSelectionType.PROPERTY) {
       let [property] = properties.filter(
         property => property.id === selection.params.id
       )
@@ -707,4 +707,4 @@ class TypeFormParametersProperty extends React.PureComponent {
 export default _.flow(
   connect(mapStateToProps),
   withStyles(styles)
-)(TypeFormParametersProperty)
+)(EntityTypeFormParametersProperty)
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormParametersSection.jsx b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormParametersSection.jsx
similarity index 83%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormParametersSection.jsx
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormParametersSection.jsx
index 35f0f6eee5a8461b891c3f67021c5fd7c35fe3f3..e351f630d1d442949bd517abc3cec5c3cb027207 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormParametersSection.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormParametersSection.jsx
@@ -3,7 +3,7 @@ import { withStyles } from '@material-ui/core/styles'
 import Container from '@src/js/components/common/form/Container.jsx'
 import Header from '@src/js/components/common/form/Header.jsx'
 import TextField from '@src/js/components/common/form/TextField.jsx'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import messages from '@src/js/common/messages.js'
 import logger from '@src/js/common/logger.js'
 
@@ -13,7 +13,7 @@ const styles = theme => ({
   }
 })
 
-class TypeFormParametersSection extends React.PureComponent {
+class EntityTypeFormParametersSection extends React.PureComponent {
   constructor(props) {
     super(props)
     this.reference = React.createRef()
@@ -43,7 +43,7 @@ class TypeFormParametersSection extends React.PureComponent {
 
   handleChange(event) {
     const section = this.getSection(this.props)
-    this.props.onChange(TypeFormSelectionType.SECTION, {
+    this.props.onChange(EntityTypeFormSelectionType.SECTION, {
       id: section.id,
       field: event.target.name,
       value: event.target.value
@@ -55,7 +55,7 @@ class TypeFormParametersSection extends React.PureComponent {
   }
 
   render() {
-    logger.log(logger.DEBUG, 'TypeFormParametersSection.render')
+    logger.log(logger.DEBUG, 'EntityTypeFormParametersSection.render')
 
     const section = this.getSection(this.props)
     if (!section) {
@@ -98,7 +98,7 @@ class TypeFormParametersSection extends React.PureComponent {
   getSection(props) {
     let { sections, selection } = props
 
-    if (selection && selection.type === TypeFormSelectionType.SECTION) {
+    if (selection && selection.type === EntityTypeFormSelectionType.SECTION) {
       let [section] = sections.filter(
         section => section.id === selection.params.id
       )
@@ -109,4 +109,4 @@ class TypeFormParametersSection extends React.PureComponent {
   }
 }
 
-export default withStyles(styles)(TypeFormParametersSection)
+export default withStyles(styles)(EntityTypeFormParametersSection)
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormParametersType.jsx b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormParametersType.jsx
similarity index 94%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormParametersType.jsx
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormParametersType.jsx
index e9a95465b6198ec95e1c8d0e74a26bb5c629b904..1d9ec2f65ccb145a38a0294dd9c09fa0d8bd6657 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormParametersType.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormParametersType.jsx
@@ -5,7 +5,7 @@ import Header from '@src/js/components/common/form/Header.jsx'
 import CheckboxField from '@src/js/components/common/form/CheckboxField.jsx'
 import TextField from '@src/js/components/common/form/TextField.jsx'
 import SelectField from '@src/js/components/common/form/SelectField.jsx'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import messages from '@src/js/common/messages.js'
 import logger from '@src/js/common/logger.js'
@@ -16,7 +16,7 @@ const styles = theme => ({
   }
 })
 
-class TypeFormParametersType extends React.PureComponent {
+class EntityTypeFormParametersType extends React.PureComponent {
   constructor(props) {
     super(props)
     this.state = {}
@@ -60,14 +60,14 @@ class TypeFormParametersType extends React.PureComponent {
   }
 
   handleChange(event) {
-    this.props.onChange(TypeFormSelectionType.TYPE, {
+    this.props.onChange(EntityTypeFormSelectionType.TYPE, {
       field: event.target.name,
       value: event.target.value
     })
   }
 
   handleFocus(event) {
-    this.props.onSelectionChange(TypeFormSelectionType.TYPE, {
+    this.props.onSelectionChange(EntityTypeFormSelectionType.TYPE, {
       part: event.target.name
     })
   }
@@ -77,7 +77,7 @@ class TypeFormParametersType extends React.PureComponent {
   }
 
   render() {
-    logger.log(logger.DEBUG, 'TypeFormParametersType.render')
+    logger.log(logger.DEBUG, 'EntityTypeFormParametersType.render')
 
     const type = this.getType(this.props)
     if (!type) {
@@ -369,7 +369,7 @@ class TypeFormParametersType extends React.PureComponent {
   getType(props) {
     let { type, selection } = props
 
-    if (!selection || selection.type === TypeFormSelectionType.TYPE) {
+    if (!selection || selection.type === EntityTypeFormSelectionType.TYPE) {
       return type
     } else {
       return null
@@ -377,4 +377,4 @@ class TypeFormParametersType extends React.PureComponent {
   }
 }
 
-export default withStyles(styles)(TypeFormParametersType)
+export default withStyles(styles)(EntityTypeFormParametersType)
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormPreview.jsx b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormPreview.jsx
similarity index 74%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormPreview.jsx
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormPreview.jsx
index cb11d7b235191db61e0c516367ca628d41df48e8..7d9a9c2e155636739f91aeba319cd5324995b7f6 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormPreview.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormPreview.jsx
@@ -3,10 +3,10 @@ import React from 'react'
 import { DragDropContext, Droppable } from 'react-beautiful-dnd'
 import { withStyles } from '@material-ui/core/styles'
 import Container from '@src/js/components/common/form/Container.jsx'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
-import TypeFormPreviewHeader from '@src/js/components/types/form/TypeFormPreviewHeader.jsx'
-import TypeFormPreviewProperty from '@src/js/components/types/form/TypeFormPreviewProperty.jsx'
-import TypeFormPreviewSection from '@src/js/components/types/form/TypeFormPreviewSection.jsx'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
+import EntityTypeFormPreviewHeader from '@src/js/components/types/form/entitytype/EntityTypeFormPreviewHeader.jsx'
+import EntityTypeFormPreviewProperty from '@src/js/components/types/form/entitytype/EntityTypeFormPreviewProperty.jsx'
+import EntityTypeFormPreviewSection from '@src/js/components/types/form/entitytype/EntityTypeFormPreviewSection.jsx'
 import logger from '@src/js/common/logger.js'
 
 const styles = () => ({
@@ -25,7 +25,7 @@ const styles = () => ({
   }
 })
 
-class TypeFormPreview extends React.PureComponent {
+class EntityTypeFormPreview extends React.PureComponent {
   constructor(props) {
     super(props)
     this.state = {}
@@ -56,13 +56,13 @@ class TypeFormPreview extends React.PureComponent {
       return
     }
 
-    if (result.type === TypeFormSelectionType.SECTION) {
-      this.props.onOrderChange(TypeFormSelectionType.SECTION, {
+    if (result.type === EntityTypeFormSelectionType.SECTION) {
+      this.props.onOrderChange(EntityTypeFormSelectionType.SECTION, {
         fromIndex: result.source.index,
         toIndex: result.destination.index
       })
-    } else if (result.type === TypeFormSelectionType.PROPERTY) {
-      this.props.onOrderChange(TypeFormSelectionType.PROPERTY, {
+    } else if (result.type === EntityTypeFormSelectionType.PROPERTY) {
+      this.props.onOrderChange(EntityTypeFormSelectionType.PROPERTY, {
         fromSectionId: result.source.droppableId,
         fromIndex: result.source.index,
         toSectionId: result.destination.droppableId,
@@ -72,14 +72,14 @@ class TypeFormPreview extends React.PureComponent {
   }
 
   render() {
-    logger.log(logger.DEBUG, 'TypeFormPreview.render')
+    logger.log(logger.DEBUG, 'EntityTypeFormPreview.render')
 
     const { mode, classes, type, sections, preview, onChange } = this.props
 
     return (
       <Container className={classes.container} onClick={this.handleClick}>
         <div className={classes.form}>
-          <TypeFormPreviewHeader
+          <EntityTypeFormPreviewHeader
             type={type}
             preview={preview}
             mode={mode}
@@ -89,7 +89,10 @@ class TypeFormPreview extends React.PureComponent {
             onDragStart={this.handleDragStart}
             onDragEnd={this.handleDragEnd}
           >
-            <Droppable droppableId='root' type={TypeFormSelectionType.SECTION}>
+            <Droppable
+              droppableId='root'
+              type={EntityTypeFormSelectionType.SECTION}
+            >
               {provided => (
                 <div
                   ref={provided.innerRef}
@@ -117,7 +120,7 @@ class TypeFormPreview extends React.PureComponent {
     )
 
     return (
-      <TypeFormPreviewSection
+      <EntityTypeFormPreviewSection
         key={section.id}
         section={section}
         index={index}
@@ -126,7 +129,7 @@ class TypeFormPreview extends React.PureComponent {
         onSelectionChange={onSelectionChange}
       >
         {this.renderProperties(sectionProperties, 0)}
-      </TypeFormPreviewSection>
+      </EntityTypeFormPreviewSection>
     )
   }
 
@@ -143,7 +146,7 @@ class TypeFormPreview extends React.PureComponent {
     return properties.map((property, offset) => {
       const value = _.get(preview, [property.id, 'value'])
       return (
-        <TypeFormPreviewProperty
+        <EntityTypeFormPreviewProperty
           key={property.id}
           controller={controller}
           property={property}
@@ -159,4 +162,4 @@ class TypeFormPreview extends React.PureComponent {
   }
 }
 
-export default withStyles(styles)(TypeFormPreview)
+export default withStyles(styles)(EntityTypeFormPreview)
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormPreviewHeader.jsx b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormPreviewHeader.jsx
similarity index 80%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormPreviewHeader.jsx
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormPreviewHeader.jsx
index 96b21a55698e5022c0585679753c695e114007a9..19df5c68b15d055c3a914101128f98eca0fe92fc 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormPreviewHeader.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormPreviewHeader.jsx
@@ -4,7 +4,7 @@ import { withStyles } from '@material-ui/core/styles'
 import PageMode from '@src/js/components/common/page/PageMode.js'
 import Header from '@src/js/components/common/form/Header.jsx'
 import TextField from '@src/js/components/common/form/TextField.jsx'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import messages from '@src/js/common/messages.js'
 import logger from '@src/js/common/logger.js'
 
@@ -14,21 +14,21 @@ const styles = theme => ({
   }
 })
 
-class TypeFormPreviewHeader extends React.PureComponent {
+class EntityTypeFormPreviewHeader extends React.PureComponent {
   constructor(props) {
     super(props)
     this.handleChange = this.handleChange.bind(this)
   }
 
   handleChange(event) {
-    this.props.onChange(TypeFormSelectionType.PREVIEW, {
+    this.props.onChange(EntityTypeFormSelectionType.PREVIEW, {
       field: event.target.name,
       value: event.target.value
     })
   }
 
   render() {
-    logger.log(logger.DEBUG, 'TypeFormPreviewHeader.render')
+    logger.log(logger.DEBUG, 'EntityTypeFormPreviewHeader.render')
 
     return (
       <div>
@@ -69,4 +69,4 @@ class TypeFormPreviewHeader extends React.PureComponent {
   }
 }
 
-export default _.flow(withStyles(styles))(TypeFormPreviewHeader)
+export default _.flow(withStyles(styles))(EntityTypeFormPreviewHeader)
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormPreviewProperty.jsx b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormPreviewProperty.jsx
similarity index 96%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormPreviewProperty.jsx
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormPreviewProperty.jsx
index 9a2d17d322a60d15d0eaf85cf3d2f03d5c7621a1..d32609d2c0f078254531ba0479b84006724d744f 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormPreviewProperty.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormPreviewProperty.jsx
@@ -7,7 +7,7 @@ import Message from '@src/js/components/common/form/Message.jsx'
 import CheckboxField from '@src/js/components/common/form/CheckboxField.jsx'
 import TextField from '@src/js/components/common/form/TextField.jsx'
 import SelectField from '@src/js/components/common/form/SelectField.jsx'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import DataType from '@src/js/components/common/dto/DataType.js'
 import openbis from '@src/js/services/openbis.js'
 import actions from '@src/js/store/actions/actions.js'
@@ -76,7 +76,7 @@ const styles = theme => ({
   }
 })
 
-class TypeFormPreviewProperty extends React.PureComponent {
+class EntityTypeFormPreviewProperty extends React.PureComponent {
   constructor(props) {
     super(props)
     this.state = {
@@ -205,7 +205,7 @@ class TypeFormPreviewProperty extends React.PureComponent {
 
   handleDraggableClick(event) {
     let newSelection = {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: {
         id: this.props.property.id
       }
@@ -215,7 +215,7 @@ class TypeFormPreviewProperty extends React.PureComponent {
 
   handlePropertyClick(event) {
     let newSelection = {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: {
         id: this.props.property.id
       }
@@ -232,20 +232,20 @@ class TypeFormPreviewProperty extends React.PureComponent {
   }
 
   handleChange(event) {
-    this.props.onChange(TypeFormSelectionType.PREVIEW, {
+    this.props.onChange(EntityTypeFormSelectionType.PREVIEW, {
       field: this.props.property.id,
       value: event.target.value
     })
   }
 
   render() {
-    logger.log(logger.DEBUG, 'TypeFormPreviewProperty.render')
+    logger.log(logger.DEBUG, 'EntityTypeFormPreviewProperty.render')
 
     let { mode, property, selection, index, classes } = this.props
 
     const selected =
       selection &&
-      selection.type === TypeFormSelectionType.PROPERTY &&
+      selection.type === EntityTypeFormSelectionType.PROPERTY &&
       selection.params.id === property.id
 
     return (
@@ -572,7 +572,7 @@ class TypeFormPreviewProperty extends React.PureComponent {
     const parts = ['code', 'label', 'dataType', 'mandatory', 'description']
     const selectedPart =
       selection &&
-      selection.type === TypeFormSelectionType.PROPERTY &&
+      selection.type === EntityTypeFormSelectionType.PROPERTY &&
       selection.params.id === property.id &&
       selection.params.part
 
@@ -608,4 +608,4 @@ class TypeFormPreviewProperty extends React.PureComponent {
   }
 }
 
-export default _.flow(withStyles(styles))(TypeFormPreviewProperty)
+export default _.flow(withStyles(styles))(EntityTypeFormPreviewProperty)
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormPreviewSection.jsx b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormPreviewSection.jsx
similarity index 82%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormPreviewSection.jsx
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormPreviewSection.jsx
index d969e8e1b222cbddf45eb91f08346ca60cc2e790..685bbf3a1c39ba9ee734825a67e46b64070d1764 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormPreviewSection.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormPreviewSection.jsx
@@ -4,7 +4,7 @@ import Typography from '@material-ui/core/Typography'
 import { Draggable, Droppable } from 'react-beautiful-dnd'
 import { withStyles } from '@material-ui/core/styles'
 import PageMode from '@src/js/components/common/page/PageMode.js'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import logger from '@src/js/common/logger.js'
 import util from '@src/js/common/util.js'
 
@@ -39,7 +39,7 @@ const styles = theme => ({
   }
 })
 
-class TypeFormPreviewSection extends React.PureComponent {
+class EntityTypeFormPreviewSection extends React.PureComponent {
   constructor(props) {
     super(props)
     this.handleClick = this.handleClick.bind(this)
@@ -49,7 +49,7 @@ class TypeFormPreviewSection extends React.PureComponent {
     event.stopPropagation()
 
     const newSelection = {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: {
         id: this.props.section.id,
         part: 'name'
@@ -60,14 +60,14 @@ class TypeFormPreviewSection extends React.PureComponent {
   }
 
   render() {
-    logger.log(logger.DEBUG, 'TypeFormPreviewSection.render')
+    logger.log(logger.DEBUG, 'EntityTypeFormPreviewSection.render')
 
     let { mode, section, index, children, selection, classes } = this.props
     let { id, name } = section
 
     const selected =
       selection &&
-      selection.type === TypeFormSelectionType.SECTION &&
+      selection.type === EntityTypeFormSelectionType.SECTION &&
       selection.params.id === section.id
 
     return (
@@ -88,7 +88,10 @@ class TypeFormPreviewSection extends React.PureComponent {
             )}
             onClick={this.handleClick}
           >
-            <Droppable droppableId={id} type={TypeFormSelectionType.PROPERTY}>
+            <Droppable
+              droppableId={id}
+              type={EntityTypeFormSelectionType.PROPERTY}
+            >
               {provided => (
                 <div>
                   <Typography variant='body2' data-part='name'>
@@ -112,4 +115,4 @@ class TypeFormPreviewSection extends React.PureComponent {
   }
 }
 
-export default _.flow(withStyles(styles))(TypeFormPreviewSection)
+export default _.flow(withStyles(styles))(EntityTypeFormPreviewSection)
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormSelectionType.js b/openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/types/form/TypeFormSelectionType.js
rename to openbis_ng_ui/src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyForm.jsx b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeForm.jsx
similarity index 79%
rename from openbis_ng_ui/src/js/components/types/form/VocabularyForm.jsx
rename to openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeForm.jsx
index dd6985f7036b90c444253e6f0115a5cf4573edbd..e89517281ec1a14ff9216da3e789ba6929c0f7a6 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyForm.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeForm.jsx
@@ -7,11 +7,11 @@ import ComponentContext from '@src/js/components/common/ComponentContext.js'
 import PageWithTwoPanels from '@src/js/components/common/page/PageWithTwoPanels.jsx'
 import GridWithSettings from '@src/js/components/common/grid/GridWithSettings.jsx'
 import GridContainer from '@src/js/components/common/grid/GridContainer.jsx'
-import VocabularyFormSelectionType from '@src/js/components/types/form/VocabularyFormSelectionType.js'
-import VocabularyFormController from '@src/js/components/types/form/VocabularyFormController.js'
-import VocabularyFormFacade from '@src/js/components/types/form/VocabularyFormFacade.js'
-import VocabularyFormParameters from '@src/js/components/types/form/VocabularyFormParameters.jsx'
-import VocabularyFormButtons from '@src/js/components/types/form/VocabularyFormButtons.jsx'
+import VocabularyTypeFormSelectionType from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormSelectionType.js'
+import VocabularyTypeFormController from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormController.js'
+import VocabularyTypeFormFacade from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormFacade.js'
+import VocabularyTypeFormParameters from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormParameters.jsx'
+import VocabularyTypeFormButtons from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormButtons.jsx'
 import selectors from '@src/js/store/selectors/selectors.js'
 import ids from '@src/js/common/consts/ids.js'
 import messages from '@src/js/common/messages.js'
@@ -48,7 +48,7 @@ function mapStateToProps(state) {
   }
 }
 
-class VocabularyForm extends React.PureComponent {
+class VocabularyTypeForm extends React.PureComponent {
   constructor(props) {
     super(props)
     autoBind(this)
@@ -58,7 +58,9 @@ class VocabularyForm extends React.PureComponent {
     if (this.props.controller) {
       this.controller = this.props.controller
     } else {
-      this.controller = new VocabularyFormController(new VocabularyFormFacade())
+      this.controller = new VocabularyTypeFormController(
+        new VocabularyTypeFormFacade()
+      )
     }
 
     this.controller.init(new ComponentContext(this))
@@ -75,7 +77,7 @@ class VocabularyForm extends React.PureComponent {
   handleSelectedRowChange(row) {
     const { controller } = this
     if (row) {
-      controller.handleSelectionChange(VocabularyFormSelectionType.TERM, {
+      controller.handleSelectionChange(VocabularyTypeFormSelectionType.TERM, {
         id: row.id
       })
     } else {
@@ -88,7 +90,7 @@ class VocabularyForm extends React.PureComponent {
   }
 
   render() {
-    logger.log(logger.DEBUG, 'VocabularyForm.render')
+    logger.log(logger.DEBUG, 'VocabularyTypeForm.render')
 
     const { loadId, loading, loaded, vocabulary } = this.state
 
@@ -119,7 +121,7 @@ class VocabularyForm extends React.PureComponent {
           sort='code'
           selectable={true}
           selectedRowId={
-            selection && selection.type === VocabularyFormSelectionType.TERM
+            selection && selection.type === VocabularyTypeFormSelectionType.TERM
               ? selection.params.id
               : null
           }
@@ -134,7 +136,7 @@ class VocabularyForm extends React.PureComponent {
     const { vocabulary, terms, selection, selectedRow, mode } = this.state
 
     return (
-      <VocabularyFormParameters
+      <VocabularyTypeFormParameters
         controller={controller}
         vocabulary={vocabulary}
         terms={terms}
@@ -153,7 +155,7 @@ class VocabularyForm extends React.PureComponent {
     const { vocabulary, terms, selection, changed, mode } = this.state
 
     return (
-      <VocabularyFormButtons
+      <VocabularyTypeFormButtons
         onEdit={controller.handleEdit}
         onSave={controller.handleSave}
         onCancel={controller.handleCancel}
@@ -172,4 +174,4 @@ class VocabularyForm extends React.PureComponent {
 export default _.flow(
   connect(mapStateToProps),
   withStyles(styles)
-)(VocabularyForm)
+)(VocabularyTypeForm)
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyFormButtons.jsx b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormButtons.jsx
similarity index 84%
rename from openbis_ng_ui/src/js/components/types/form/VocabularyFormButtons.jsx
rename to openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormButtons.jsx
index 4f45acd5d1ab927b1d1e7df7ab2c2ea9c3c5d62b..d88bedcdec2cdc0680b9c4d0d70cc16834e6b605 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyFormButtons.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormButtons.jsx
@@ -3,7 +3,7 @@ import { connect } from 'react-redux'
 import PageMode from '@src/js/components/common/page/PageMode.js'
 import PageButtons from '@src/js/components/common/page/PageButtons.jsx'
 import Button from '@src/js/components/common/form/Button.jsx'
-import VocabularyFormSelectionType from '@src/js/components/types/form/VocabularyFormSelectionType.js'
+import VocabularyTypeFormSelectionType from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormSelectionType.js'
 import users from '@src/js/common/consts/users.js'
 import messages from '@src/js/common/messages.js'
 import selectors from '@src/js/store/selectors/selectors.js'
@@ -15,13 +15,13 @@ function mapStateToProps(state) {
   }
 }
 
-class VocabularyFormButtons extends React.PureComponent {
+class VocabularyTypeFormButtons extends React.PureComponent {
   constructor(props) {
     super(props)
   }
 
   render() {
-    logger.log(logger.DEBUG, 'VocabularyFormButtons.render')
+    logger.log(logger.DEBUG, 'VocabularyTypeFormButtons.render')
 
     const { mode, onEdit, onSave, onCancel, changed, vocabulary } = this.props
 
@@ -68,7 +68,7 @@ class VocabularyFormButtons extends React.PureComponent {
   isNonSystemInternalTermSelected() {
     const { selection, vocabulary, terms } = this.props
 
-    if (selection && selection.type === VocabularyFormSelectionType.TERM) {
+    if (selection && selection.type === VocabularyTypeFormSelectionType.TERM) {
       const term = terms.find(term => term.id === selection.params.id)
       return !(
         vocabulary.internal.value && term.registrator.value === users.SYSTEM
@@ -83,4 +83,4 @@ class VocabularyFormButtons extends React.PureComponent {
   }
 }
 
-export default connect(mapStateToProps)(VocabularyFormButtons)
+export default connect(mapStateToProps)(VocabularyTypeFormButtons)
diff --git a/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormController.js b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormController.js
new file mode 100644
index 0000000000000000000000000000000000000000..3603a0426de80734f23046bc5accf01bcd16003b
--- /dev/null
+++ b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormController.js
@@ -0,0 +1,59 @@
+import PageController from '@src/js/components/common/page/PageController.js'
+import VocabularyTypeFormControllerLoad from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerLoad.js'
+import VocabularyTypeFormControllerAdd from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerAdd.js'
+import VocabularyTypeFormControllerRemove from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerRemove.js'
+import VocabularyTypeFormControllerValidate from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerValidate.js'
+import VocabularyTypeFormControllerChange from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerChange.js'
+import VocabularyTypeFormControllerSelectionChange from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerSelectionChange.js'
+import VocabularyTypeFormControllerSave from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerSave.js'
+import pages from '@src/js/common/consts/pages.js'
+import objectTypes from '@src/js/common/consts/objectType.js'
+
+export default class VocabularyTypeFormController extends PageController {
+  constructor(facade) {
+    super(facade)
+  }
+
+  getPage() {
+    return pages.TYPES
+  }
+
+  getNewObjectType() {
+    return objectTypes.NEW_VOCABULARY_TYPE
+  }
+
+  getExistingObjectType() {
+    return objectTypes.VOCABULARY_TYPE
+  }
+
+  load() {
+    return new VocabularyTypeFormControllerLoad(this).execute()
+  }
+
+  validate(autofocus) {
+    return new VocabularyTypeFormControllerValidate(this).execute(autofocus)
+  }
+
+  handleAdd() {
+    return new VocabularyTypeFormControllerAdd(this).execute()
+  }
+
+  handleRemove() {
+    return new VocabularyTypeFormControllerRemove(this).execute()
+  }
+
+  handleChange(type, params) {
+    return new VocabularyTypeFormControllerChange(this).execute(type, params)
+  }
+
+  handleSelectionChange(type, params) {
+    return new VocabularyTypeFormControllerSelectionChange(this).execute(
+      type,
+      params
+    )
+  }
+
+  handleSave() {
+    return new VocabularyTypeFormControllerSave(this).execute()
+  }
+}
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerAdd.js b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerAdd.js
similarity index 85%
rename from openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerAdd.js
rename to openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerAdd.js
index 072ec9133628da1918e63275fdc17f899950f296..2ab17e978b9eaae67924604e02a9e73e87991249 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerAdd.js
+++ b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerAdd.js
@@ -1,7 +1,7 @@
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
-import VocabularyFormSelectionType from '@src/js/components/types/form/VocabularyFormSelectionType.js'
+import VocabularyTypeFormSelectionType from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormSelectionType.js'
 
-export default class VocabularyFormControllerAdd {
+export default class VocabularyTypeFormControllerAdd {
   constructor(controller) {
     this.controller = controller
     this.context = controller.context
@@ -35,7 +35,7 @@ export default class VocabularyFormControllerAdd {
       terms: newTerms,
       termsCounter,
       selection: {
-        type: VocabularyFormSelectionType.TERM,
+        type: VocabularyTypeFormSelectionType.TERM,
         params: {
           id: newTerm.id,
           part: 'code'
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerChange.js b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerChange.js
similarity index 77%
rename from openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerChange.js
rename to openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerChange.js
index ef564ac5acf84917986436af2e5f1ff8bed91dda..c747ca5e85d60ddb53c26741420c5bc14c3910cd 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerChange.js
+++ b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerChange.js
@@ -1,17 +1,17 @@
 import PageControllerChange from '@src/js/components/common/page/PageControllerChange.js'
-import VocabularyFormSelectionType from '@src/js/components/types/form/VocabularyFormSelectionType.js'
+import VocabularyTypeFormSelectionType from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormSelectionType.js'
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 
-export default class VocabularyFormControllerChange extends PageControllerChange {
+export default class VocabularyTypeFormControllerChange extends PageControllerChange {
   constructor(controller) {
     super(controller)
     this.gridController = controller.gridController
   }
 
   async execute(type, params) {
-    if (type === VocabularyFormSelectionType.VOCABULARY) {
+    if (type === VocabularyTypeFormSelectionType.VOCABULARY) {
       await this._handleChangeVocabulary(params)
-    } else if (type === VocabularyFormSelectionType.TERM) {
+    } else if (type === VocabularyTypeFormSelectionType.TERM) {
       await this._handleChangeTerm(params)
     }
   }
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerLoad.js b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerLoad.js
similarity index 92%
rename from openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerLoad.js
rename to openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerLoad.js
index 74cd2341814f851d1e8805bb2ae30871cbe6bfd2..8539207a4dc2cff26535c1bd675d7fd892150b4b 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerLoad.js
+++ b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerLoad.js
@@ -1,10 +1,10 @@
 import _ from 'lodash'
 import PageControllerLoad from '@src/js/components/common/page/PageControllerLoad.js'
-import VocabularyFormSelectionType from '@src/js/components/types/form/VocabularyFormSelectionType.js'
+import VocabularyTypeFormSelectionType from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormSelectionType.js'
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 import users from '@src/js/common/consts/users.js'
 
-export default class VocabularyFormControllerLoad extends PageControllerLoad {
+export default class VocabularyTypeFormControllerLoad extends PageControllerLoad {
   async load(object, isNew) {
     let loadedVocabulary = null
 
@@ -118,7 +118,7 @@ export default class VocabularyFormControllerLoad extends PageControllerLoad {
 
     if (!oldSelection) {
       return null
-    } else if (oldSelection.type === VocabularyFormSelectionType.TERM) {
+    } else if (oldSelection.type === VocabularyTypeFormSelectionType.TERM) {
       const oldTerm = _.find(
         oldTerms,
         oldTerm => oldTerm.id === oldSelection.params.id
@@ -135,7 +135,7 @@ export default class VocabularyFormControllerLoad extends PageControllerLoad {
 
       if (newTerm) {
         return {
-          type: VocabularyFormSelectionType.TERM,
+          type: VocabularyTypeFormSelectionType.TERM,
           params: {
             id: newTerm.id
           }
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerRemove.js b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerRemove.js
similarity index 75%
rename from openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerRemove.js
rename to openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerRemove.js
index 9ae79f6d1d6dc973a83743ff72e81c81015dc28d..c4eece183de69503d9bbdcb17b78c5fc4b004085 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerRemove.js
+++ b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerRemove.js
@@ -1,6 +1,6 @@
-import VocabularyFormSelectionType from '@src/js/components/types/form/VocabularyFormSelectionType.js'
+import VocabularyTypeFormSelectionType from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormSelectionType.js'
 
-export default class VocabularyFormControllerRemove {
+export default class VocabularyTypeFormControllerRemove {
   constructor(controller) {
     this.controller = controller
     this.context = controller.context
@@ -9,7 +9,7 @@ export default class VocabularyFormControllerRemove {
 
   execute() {
     const { selection } = this.context.getState()
-    if (selection.type === VocabularyFormSelectionType.TERM) {
+    if (selection.type === VocabularyTypeFormSelectionType.TERM) {
       this._handleRemoveTerm(selection.params.id)
     }
   }
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerSave.js b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerSave.js
similarity index 98%
rename from openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerSave.js
rename to openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerSave.js
index 6f2a0ea30996524b0ed64b138a18e0b26ef1b13f..4e2232703fbeefe3ae7806762067ee1d2d7675cd 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerSave.js
+++ b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerSave.js
@@ -3,7 +3,7 @@ import PageControllerSave from '@src/js/components/common/page/PageControllerSav
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 import openbis from '@src/js/services/openbis.js'
 
-export default class VocabularyFormControllerSave extends PageControllerSave {
+export default class VocabularyTypeFormControllerSave extends PageControllerSave {
   async save() {
     const state = this.context.getState()
     const vocabulary = this._prepareVocabulary(state.vocabulary)
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerSelectionChange.js b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerSelectionChange.js
similarity index 83%
rename from openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerSelectionChange.js
rename to openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerSelectionChange.js
index 0155c0dc3be5b613abad9503a8dc13b41e9c4736..246d78b23203f8800eb0cf5b038ed9eee12e6396 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerSelectionChange.js
+++ b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerSelectionChange.js
@@ -1,6 +1,6 @@
 import PageControllerSelectionChange from '@src/js/components/common/page/PageControllerSelectionChange.js'
 
-export default class VocabularyFormControllerSelectionChange extends PageControllerSelectionChange {
+export default class VocabularyTypeFormControllerSelectionChange extends PageControllerSelectionChange {
   constructor(controller) {
     super(controller)
     this.context = controller.context
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerValidate.js b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerValidate.js
similarity index 84%
rename from openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerValidate.js
rename to openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerValidate.js
index c2b0566e66ba1281f5f1041b1d9ffc4ac00be3d5..d21b7c1da49756c7db7f141869c3e7694721ba31 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyFormControllerValidate.js
+++ b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormControllerValidate.js
@@ -1,8 +1,8 @@
 import PageControllerValidate from '@src/js/components/common/page/PageConrollerValidate.js'
-import VocabularyFormSelectionType from '@src/js/components/types/form/VocabularyFormSelectionType.js'
+import VocabularyTypeFormSelectionType from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormSelectionType.js'
 import messages from '@src/js/common/messages.js'
 
-export default class VocabularyFormControllerValidate extends PageControllerValidate {
+export default class VocabularyTypeFormControllerValidate extends PageControllerValidate {
   validate(validator) {
     const { vocabulary, terms } = this.context.getState()
 
@@ -20,14 +20,14 @@ export default class VocabularyFormControllerValidate extends PageControllerVali
 
     if (firstError.object === vocabulary) {
       await this.setSelection({
-        type: VocabularyFormSelectionType.VOCABULARY,
+        type: VocabularyTypeFormSelectionType.VOCABULARY,
         params: {
           part: firstError.name
         }
       })
     } else if (terms.includes(firstError.object)) {
       await this.setSelection({
-        type: VocabularyFormSelectionType.TERM,
+        type: VocabularyTypeFormSelectionType.TERM,
         params: {
           id: firstError.object.id,
           part: firstError.name
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyFormFacade.js b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormFacade.js
similarity index 90%
rename from openbis_ng_ui/src/js/components/types/form/VocabularyFormFacade.js
rename to openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormFacade.js
index 40dd0b44d6daeb178c58c56110db4f95ee26b2c0..8f6a462ff4ff36df76517a3129cd4ef8b28103c1 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyFormFacade.js
+++ b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormFacade.js
@@ -1,6 +1,6 @@
 import openbis from '@src/js/services/openbis.js'
 
-export default class VocabularyFormFacade {
+export default class VocabularyTypeFormFacade {
   async loadVocabulary(code) {
     const id = new openbis.VocabularyPermId(code)
     const fo = new openbis.VocabularyFetchOptions()
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyFormParameters.jsx b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormParameters.jsx
similarity index 63%
rename from openbis_ng_ui/src/js/components/types/form/VocabularyFormParameters.jsx
rename to openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormParameters.jsx
index df3cd983ff1b3ce4fbbb362a24df1fe5ad3d26fc..3d1eb2d64875a3f5ec13f3ee1e4f761750de147b 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyFormParameters.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormParameters.jsx
@@ -1,18 +1,18 @@
 import React from 'react'
 import { withStyles } from '@material-ui/core/styles'
-import VocabularyFormParametersVocabulary from '@src/js/components/types/form/VocabularyFormParametersVocabulary.jsx'
-import VocabularyFormParametersTerm from '@src/js/components/types/form/VocabularyFormParametersTerm.jsx'
+import VocabularyTypeFormParametersVocabulary from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormParametersVocabulary.jsx'
+import VocabularyTypeFormParametersTerm from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormParametersTerm.jsx'
 import logger from '@src/js/common/logger.js'
 
 const styles = () => ({})
 
-class VocabularyFormParameters extends React.PureComponent {
+class VocabularyTypeFormParameters extends React.PureComponent {
   constructor(props) {
     super(props)
   }
 
   render() {
-    logger.log(logger.DEBUG, 'VocabularyFormParameters.render')
+    logger.log(logger.DEBUG, 'VocabularyTypeFormParameters.render')
 
     const {
       controller,
@@ -28,7 +28,7 @@ class VocabularyFormParameters extends React.PureComponent {
 
     return (
       <div>
-        <VocabularyFormParametersVocabulary
+        <VocabularyTypeFormParametersVocabulary
           controller={controller}
           vocabulary={vocabulary}
           selection={selection}
@@ -37,7 +37,7 @@ class VocabularyFormParameters extends React.PureComponent {
           onSelectionChange={onSelectionChange}
           onBlur={onBlur}
         />
-        <VocabularyFormParametersTerm
+        <VocabularyTypeFormParametersTerm
           controller={controller}
           vocabulary={vocabulary}
           terms={terms}
@@ -53,4 +53,4 @@ class VocabularyFormParameters extends React.PureComponent {
   }
 }
 
-export default withStyles(styles)(VocabularyFormParameters)
+export default withStyles(styles)(VocabularyTypeFormParameters)
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyFormParametersTerm.jsx b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormParametersTerm.jsx
similarity index 92%
rename from openbis_ng_ui/src/js/components/types/form/VocabularyFormParametersTerm.jsx
rename to openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormParametersTerm.jsx
index 796c529aacb020f1f44ac92cbf3cdbfe9cfb7e2c..82c483d1c1aed73a88844415117437883b710f0e 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyFormParametersTerm.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormParametersTerm.jsx
@@ -7,7 +7,7 @@ import Header from '@src/js/components/common/form/Header.jsx'
 import TextField from '@src/js/components/common/form/TextField.jsx'
 import CheckboxField from '@src/js/components/common/form/CheckboxField.jsx'
 import Message from '@src/js/components/common/form/Message.jsx'
-import VocabularyFormSelectionType from '@src/js/components/types/form/VocabularyFormSelectionType.js'
+import VocabularyTypeFormSelectionType from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormSelectionType.js'
 import selectors from '@src/js/store/selectors/selectors.js'
 import users from '@src/js/common/consts/users.js'
 import messages from '@src/js/common/messages.js'
@@ -25,7 +25,7 @@ function mapStateToProps(state) {
   }
 }
 
-class VocabularyFormParametersTerm extends React.PureComponent {
+class VocabularyTypeFormParametersTerm extends React.PureComponent {
   constructor(props) {
     super(props)
     this.state = {}
@@ -66,7 +66,7 @@ class VocabularyFormParametersTerm extends React.PureComponent {
 
   handleChange(event) {
     const term = this.getTerm(this.props)
-    this.props.onChange(VocabularyFormSelectionType.TERM, {
+    this.props.onChange(VocabularyTypeFormSelectionType.TERM, {
       id: term.id,
       field: event.target.name,
       value: event.target.value
@@ -75,7 +75,7 @@ class VocabularyFormParametersTerm extends React.PureComponent {
 
   handleFocus(event) {
     const term = this.getTerm(this.props)
-    this.props.onSelectionChange(VocabularyFormSelectionType.TERM, {
+    this.props.onSelectionChange(VocabularyTypeFormSelectionType.TERM, {
       id: term.id,
       part: event.target.name
     })
@@ -86,7 +86,7 @@ class VocabularyFormParametersTerm extends React.PureComponent {
   }
 
   render() {
-    logger.log(logger.DEBUG, 'VocabularyFormParametersTerm.render')
+    logger.log(logger.DEBUG, 'VocabularyTypeFormParametersTerm.render')
 
     const term = this.getTerm(this.props)
     if (!term) {
@@ -260,7 +260,7 @@ class VocabularyFormParametersTerm extends React.PureComponent {
   getTerm(props) {
     let { terms, selection } = props
 
-    if (selection && selection.type === VocabularyFormSelectionType.TERM) {
+    if (selection && selection.type === VocabularyTypeFormSelectionType.TERM) {
       let [term] = terms.filter(term => term.id === selection.params.id)
       return term
     } else {
@@ -272,4 +272,4 @@ class VocabularyFormParametersTerm extends React.PureComponent {
 export default _.flow(
   connect(mapStateToProps),
   withStyles(styles)
-)(VocabularyFormParametersTerm)
+)(VocabularyTypeFormParametersTerm)
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyFormParametersVocabulary.jsx b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormParametersVocabulary.jsx
similarity index 92%
rename from openbis_ng_ui/src/js/components/types/form/VocabularyFormParametersVocabulary.jsx
rename to openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormParametersVocabulary.jsx
index 2ce2d9267745d8a5b657fa155d0aeb87f7be6aa5..ba906b5051a181725bcc1d274d3f079e68e22b4e 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyFormParametersVocabulary.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormParametersVocabulary.jsx
@@ -7,7 +7,7 @@ import Header from '@src/js/components/common/form/Header.jsx'
 import TextField from '@src/js/components/common/form/TextField.jsx'
 import CheckboxField from '@src/js/components/common/form/CheckboxField.jsx'
 import Message from '@src/js/components/common/form/Message.jsx'
-import VocabularyFormSelectionType from '@src/js/components/types/form/VocabularyFormSelectionType.js'
+import VocabularyTypeFormSelectionType from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormSelectionType.js'
 import selectors from '@src/js/store/selectors/selectors.js'
 import users from '@src/js/common/consts/users.js'
 import messages from '@src/js/common/messages.js'
@@ -24,7 +24,7 @@ function mapStateToProps(state) {
   }
 }
 
-class VocabularyFormParametersVocabulary extends React.PureComponent {
+class VocabularyTypeFormParametersVocabulary extends React.PureComponent {
   constructor(props) {
     super(props)
     this.state = {}
@@ -66,14 +66,14 @@ class VocabularyFormParametersVocabulary extends React.PureComponent {
   }
 
   handleChange(event) {
-    this.props.onChange(VocabularyFormSelectionType.VOCABULARY, {
+    this.props.onChange(VocabularyTypeFormSelectionType.VOCABULARY, {
       field: event.target.name,
       value: event.target.value
     })
   }
 
   handleFocus(event) {
-    this.props.onSelectionChange(VocabularyFormSelectionType.VOCABULARY, {
+    this.props.onSelectionChange(VocabularyTypeFormSelectionType.VOCABULARY, {
       part: event.target.name
     })
   }
@@ -83,7 +83,7 @@ class VocabularyFormParametersVocabulary extends React.PureComponent {
   }
 
   render() {
-    logger.log(logger.DEBUG, 'VocabularyFormParametersVocabulary.render')
+    logger.log(logger.DEBUG, 'VocabularyTypeFormParametersVocabulary.render')
 
     const vocabulary = this.getVocabulary(this.props)
     if (!vocabulary) {
@@ -248,7 +248,7 @@ class VocabularyFormParametersVocabulary extends React.PureComponent {
 
     if (
       !selection ||
-      selection.type === VocabularyFormSelectionType.VOCABULARY
+      selection.type === VocabularyTypeFormSelectionType.VOCABULARY
     ) {
       return vocabulary
     } else {
@@ -260,4 +260,4 @@ class VocabularyFormParametersVocabulary extends React.PureComponent {
 export default _.flow(
   connect(mapStateToProps),
   withStyles(styles)
-)(VocabularyFormParametersVocabulary)
+)(VocabularyTypeFormParametersVocabulary)
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyFormSelectionType.js b/openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormSelectionType.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/types/form/VocabularyFormSelectionType.js
rename to openbis_ng_ui/src/js/components/types/form/vocabularytype/VocabularyTypeFormSelectionType.js
diff --git a/openbis_ng_ui/src/js/components/types/search/TypeSearch.jsx b/openbis_ng_ui/src/js/components/types/search/TypeSearch.jsx
index e5b73b77ee6345d7df0e34bcf94432302a053423..be4276197734270d346f2b4d17918b832994f9e8 100644
--- a/openbis_ng_ui/src/js/components/types/search/TypeSearch.jsx
+++ b/openbis_ng_ui/src/js/components/types/search/TypeSearch.jsx
@@ -4,8 +4,9 @@ import React from 'react'
 import { withStyles } from '@material-ui/core/styles'
 import Container from '@src/js/components/common/form/Container.jsx'
 import GridContainer from '@src/js/components/common/grid/GridContainer.jsx'
-import TypesGrid from '@src/js/components/types/common/TypesGrid.jsx'
-import VocabulariesGrid from '@src/js/components/types/common/VocabulariesGrid.jsx'
+import EntityTypesGrid from '@src/js/components/types/common/EntityTypesGrid.jsx'
+import VocabularyTypesGrid from '@src/js/components/types/common/VocabularyTypesGrid.jsx'
+import PropertyTypesGrid from '@src/js/components/types/common/PropertyTypesGrid.jsx'
 import Message from '@src/js/components/common/form/Message.jsx'
 import ids from '@src/js/common/consts/ids.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
@@ -45,7 +46,8 @@ class TypeSearch extends React.Component {
         this.loadCollectionTypes(),
         this.loadDataSetTypes(),
         this.loadMaterialTypes(),
-        this.loadVocabularyTypes()
+        this.loadVocabularyTypes(),
+        this.loadPropertyTypes()
       ])
       this.setState(() => ({
         loaded: true
@@ -193,6 +195,107 @@ class TypeSearch extends React.Component {
     })
   }
 
+  async loadPropertyTypes() {
+    if (!this.shouldLoad(objectTypes.PROPERTY_TYPE)) {
+      return
+    }
+
+    const [propertyTypes, propertyTypeUsages] = await Promise.all([
+      this.loadPropertyTypesTypes(),
+      this.loadPropertyTypesUsages()
+    ])
+
+    const types = util
+      .filter(propertyTypes.objects, this.props.searchText, [
+        'code',
+        'description'
+      ])
+      .map(object => ({
+        id: _.get(object, 'code'),
+        code: _.get(object, 'code'),
+        label: _.get(object, 'label'),
+        description: _.get(object, 'description'),
+        dataType: _.get(object, 'dataType'),
+        vocabulary: _.get(object, 'vocabulary.code'),
+        materialType: _.get(object, 'materialType.code'),
+        sampleType: _.get(object, 'sampleType.code'),
+        schema: _.get(object, 'schema'),
+        transformation: _.get(object, 'transformation'),
+        usages: _.get(propertyTypeUsages, object.code)
+      }))
+
+    this.setState({
+      propertyTypes: types
+    })
+  }
+
+  async loadPropertyTypesTypes() {
+    const fo = new openbis.PropertyTypeFetchOptions()
+    fo.withVocabulary()
+    fo.withMaterialType()
+    fo.withSampleType()
+
+    const propertyTypes = await openbis.searchPropertyTypes(
+      new openbis.PropertyTypeSearchCriteria(),
+      fo
+    )
+
+    return propertyTypes
+  }
+
+  async loadPropertyTypesUsages() {
+    const usages = {}
+
+    const fo = new openbis.PropertyAssignmentFetchOptions()
+    fo.withEntityType()
+    fo.withPropertyType()
+
+    const propertyAssignments = await openbis.searchPropertyAssignments(
+      new openbis.PropertyAssignmentSearchCriteria(),
+      fo
+    )
+
+    propertyAssignments.objects.forEach(propertyAssignment => {
+      let propertyUsages = usages[propertyAssignment.propertyType.code]
+      if (!propertyUsages) {
+        propertyUsages = {
+          sampleTypes: [],
+          experimentTypes: [],
+          dataSetTypes: [],
+          materialTypes: []
+        }
+        usages[propertyAssignment.propertyType.code] = propertyUsages
+      }
+
+      const entityType = propertyAssignment.entityType['@type']
+
+      if (entityType === 'as.dto.sample.SampleType') {
+        propertyUsages.sampleTypes.push(propertyAssignment.entityType.code)
+      } else if (entityType === 'as.dto.experiment.ExperimentType') {
+        propertyUsages.experimentTypes.push(propertyAssignment.entityType.code)
+      } else if (entityType === 'as.dto.dataset.DataSetType') {
+        propertyUsages.dataSetTypes.push(propertyAssignment.entityType.code)
+      } else if (entityType === 'as.dto.material.MaterialType') {
+        propertyUsages.materialTypes.push(propertyAssignment.entityType.code)
+      }
+    })
+
+    Object.keys(usages).forEach(propertyTypeCode => {
+      const propertyUsages = usages[propertyTypeCode]
+      propertyUsages.sampleTypes.sort()
+      propertyUsages.experimentTypes.sort()
+      propertyUsages.dataSetTypes.sort()
+      propertyUsages.materialTypes.sort()
+      propertyUsages.count =
+        propertyUsages.sampleTypes.length +
+        propertyUsages.experimentTypes.length +
+        propertyUsages.dataSetTypes.length +
+        propertyUsages.materialTypes.length
+    })
+
+    return usages
+  }
+
   shouldLoad(objectType) {
     return this.props.objectType === objectType || !this.props.objectType
   }
@@ -231,6 +334,7 @@ class TypeSearch extends React.Component {
         {this.renderDataSetTypes()}
         {this.renderMaterialTypes()}
         {this.renderVocabularyTypes()}
+        {this.renderPropertyTypes()}
       </GridContainer>
     )
   }
@@ -242,7 +346,8 @@ class TypeSearch extends React.Component {
       collectionTypes = [],
       dataSetTypes = [],
       materialTypes = [],
-      vocabularyTypes = []
+      vocabularyTypes = [],
+      propertyTypes = []
     } = this.state
 
     if (
@@ -251,7 +356,8 @@ class TypeSearch extends React.Component {
       collectionTypes.length === 0 &&
       dataSetTypes.length === 0 &&
       materialTypes.length === 0 &&
-      vocabularyTypes.length === 0
+      vocabularyTypes.length === 0 &&
+      propertyTypes.length === 0
     ) {
       return (
         <Container>
@@ -270,7 +376,7 @@ class TypeSearch extends React.Component {
       const { classes } = this.props
       return (
         <div className={classes.grid}>
-          <TypesGrid
+          <EntityTypesGrid
             id={ids.OBJECT_TYPES_GRID_ID}
             controllerRef={controller =>
               (this.gridControllers[objectTypes.OBJECT_TYPE] = controller)
@@ -295,7 +401,7 @@ class TypeSearch extends React.Component {
       const { classes } = this.props
       return (
         <div className={classes.grid}>
-          <TypesGrid
+          <EntityTypesGrid
             id={ids.COLLECTION_TYPES_GRID_ID}
             controllerRef={controller =>
               (this.gridControllers[objectTypes.COLLECTION_TYPE] = controller)
@@ -318,7 +424,7 @@ class TypeSearch extends React.Component {
       const { classes } = this.props
       return (
         <div className={classes.grid}>
-          <TypesGrid
+          <EntityTypesGrid
             id={ids.DATA_SET_TYPES_GRID_ID}
             controllerRef={controller =>
               (this.gridControllers[objectTypes.DATA_SET_TYPE] = controller)
@@ -343,7 +449,7 @@ class TypeSearch extends React.Component {
       const { classes } = this.props
       return (
         <div className={classes.grid}>
-          <TypesGrid
+          <EntityTypesGrid
             id={ids.MATERIAL_TYPES_GRID_ID}
             controllerRef={controller =>
               (this.gridControllers[objectTypes.MATERIAL_TYPE] = controller)
@@ -368,7 +474,7 @@ class TypeSearch extends React.Component {
       const { classes } = this.props
       return (
         <div className={classes.grid}>
-          <VocabulariesGrid
+          <VocabularyTypesGrid
             id={ids.VOCABULARY_TYPES_GRID_ID}
             controllerRef={controller =>
               (this.gridControllers[objectTypes.VOCABULARY_TYPE] = controller)
@@ -385,6 +491,30 @@ class TypeSearch extends React.Component {
     }
   }
 
+  renderPropertyTypes() {
+    if (
+      this.shouldRender(objectTypes.PROPERTY_TYPE, this.state.propertyTypes)
+    ) {
+      const { classes } = this.props
+      return (
+        <div className={classes.grid}>
+          <PropertyTypesGrid
+            id={ids.PROPERTY_TYPES_GRID_ID}
+            controllerRef={controller =>
+              (this.gridControllers[objectTypes.PROPERTY_TYPE] = controller)
+            }
+            rows={this.state.propertyTypes}
+            onSelectedRowChange={this.handleSelectedRowChange(
+              objectTypes.PROPERTY_TYPE
+            )}
+          />
+        </div>
+      )
+    } else {
+      return null
+    }
+  }
+
   shouldRender(objectType, types) {
     return this.props.objectType === objectType || (types && types.length > 0)
   }
diff --git a/openbis_ng_ui/src/js/components/users/Users.jsx b/openbis_ng_ui/src/js/components/users/Users.jsx
index 10414cbdd7fb8b1c0f1d7522079799054996924b..aa2ba2dbdb21bd23c3a9fb5a8d133f82e70994c9 100644
--- a/openbis_ng_ui/src/js/components/users/Users.jsx
+++ b/openbis_ng_ui/src/js/components/users/Users.jsx
@@ -4,8 +4,8 @@ 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/browser/UserBrowser.jsx'
 import UserSearch from '@src/js/components/users/search/UserSearch.jsx'
-import UserForm from '@src/js/components/users/form/UserForm.jsx'
-import UserGroupForm from '@src/js/components/users/form/UserGroupForm.jsx'
+import UserForm from '@src/js/components/users/form/user/UserForm.jsx'
+import UserGroupForm from '@src/js/components/users/form/usergroup/UserGroupForm.jsx'
 import pages from '@src/js/common/consts/pages.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/form/UserForm.jsx b/openbis_ng_ui/src/js/components/users/form/user/UserForm.jsx
similarity index 90%
rename from openbis_ng_ui/src/js/components/users/form/UserForm.jsx
rename to openbis_ng_ui/src/js/components/users/form/user/UserForm.jsx
index a81bb945c9898f323b42c28966c0d83fd33b7280..c93d5aed84061bf128d0751c24c082cd5d86bd06 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserForm.jsx
+++ b/openbis_ng_ui/src/js/components/users/form/user/UserForm.jsx
@@ -6,15 +6,15 @@ import { withStyles } from '@material-ui/core/styles'
 import ComponentContext from '@src/js/components/common/ComponentContext.js'
 import PageWithTwoPanels from '@src/js/components/common/page/PageWithTwoPanels.jsx'
 import GridContainer from '@src/js/components/common/grid/GridContainer.jsx'
-import UserFormController from '@src/js/components/users/form/UserFormController.js'
-import UserFormFacade from '@src/js/components/users/form/UserFormFacade.js'
-import UserFormSelectionType from '@src/js/components/users/form/UserFormSelectionType.js'
-import UserFormParametersUser from '@src/js/components/users/form/UserFormParametersUser.jsx'
-import UserFormParametersGroup from '@src/js/components/users/form/UserFormParametersGroup.jsx'
-import UserFormParametersRole from '@src/js/components/users/form/UserFormParametersRole.jsx'
-import UserFormGridGroups from '@src/js/components/users/form/UserFormGridGroups.jsx'
-import UserFormGridRoles from '@src/js/components/users/form/UserFormGridRoles.jsx'
-import UserFormButtons from '@src/js/components/users/form/UserFormButtons.jsx'
+import UserFormController from '@src/js/components/users/form/user/UserFormController.js'
+import UserFormFacade from '@src/js/components/users/form/user/UserFormFacade.js'
+import UserFormSelectionType from '@src/js/components/users/form/user/UserFormSelectionType.js'
+import UserFormParametersUser from '@src/js/components/users/form/user/UserFormParametersUser.jsx'
+import UserFormParametersGroup from '@src/js/components/users/form/user/UserFormParametersGroup.jsx'
+import UserFormParametersRole from '@src/js/components/users/form/user/UserFormParametersRole.jsx'
+import UserFormGridGroups from '@src/js/components/users/form/user/UserFormGridGroups.jsx'
+import UserFormGridRoles from '@src/js/components/users/form/user/UserFormGridRoles.jsx'
+import UserFormButtons from '@src/js/components/users/form/user/UserFormButtons.jsx'
 import logger from '@src/js/common/logger.js'
 
 const styles = theme => ({
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormButtons.jsx b/openbis_ng_ui/src/js/components/users/form/user/UserFormButtons.jsx
similarity index 98%
rename from openbis_ng_ui/src/js/components/users/form/UserFormButtons.jsx
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormButtons.jsx
index f5a5a519615b33b64c3171fb84835abad01476ee..016bdec18c4ceed7055d0e57367083f897df4488 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserFormButtons.jsx
+++ b/openbis_ng_ui/src/js/components/users/form/user/UserFormButtons.jsx
@@ -2,7 +2,7 @@ import React from 'react'
 import PageMode from '@src/js/components/common/page/PageMode.js'
 import PageButtons from '@src/js/components/common/page/PageButtons.jsx'
 import Button from '@src/js/components/common/form/Button.jsx'
-import UserFormSelectionType from '@src/js/components/users/form/UserFormSelectionType.js'
+import UserFormSelectionType from '@src/js/components/users/form/user/UserFormSelectionType.js'
 import messages from '@src/js/common/messages.js'
 import logger from '@src/js/common/logger.js'
 
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormController.js b/openbis_ng_ui/src/js/components/users/form/user/UserFormController.js
similarity index 84%
rename from openbis_ng_ui/src/js/components/users/form/UserFormController.js
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormController.js
index fc2fd0750830dadb7daba1110e138ce70e9eb46f..76349ed281a8fa3055c60823644477b4fe139c85 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserFormController.js
+++ b/openbis_ng_ui/src/js/components/users/form/user/UserFormController.js
@@ -1,12 +1,12 @@
 import PageController from '@src/js/components/common/page/PageController.js'
-import UserFormControllerLoad from '@src/js/components/users/form/UserFormControllerLoad.js'
-import UserFormControllerAddGroup from '@src/js/components/users/form/UserFormControllerAddGroup.js'
-import UserFormControllerAddRole from '@src/js/components/users/form/UserFormControllerAddRole.js'
-import UserFormControllerRemove from '@src/js/components/users/form/UserFormControllerRemove.js'
-import UserFormControllerValidate from '@src/js/components/users/form/UserFormControllerValidate.js'
-import UserFormControllerChange from '@src/js/components/users/form/UserFormControllerChange.js'
-import UserFormControllerSelectionChange from '@src/js/components/users/form/UserFormControllerSelectionChange.js'
-import UserFormControllerSave from '@src/js/components/users/form/UserFormControllerSave.js'
+import UserFormControllerLoad from '@src/js/components/users/form/user/UserFormControllerLoad.js'
+import UserFormControllerAddGroup from '@src/js/components/users/form/user/UserFormControllerAddGroup.js'
+import UserFormControllerAddRole from '@src/js/components/users/form/user/UserFormControllerAddRole.js'
+import UserFormControllerRemove from '@src/js/components/users/form/user/UserFormControllerRemove.js'
+import UserFormControllerValidate from '@src/js/components/users/form/user/UserFormControllerValidate.js'
+import UserFormControllerChange from '@src/js/components/users/form/user/UserFormControllerChange.js'
+import UserFormControllerSelectionChange from '@src/js/components/users/form/user/UserFormControllerSelectionChange.js'
+import UserFormControllerSave from '@src/js/components/users/form/user/UserFormControllerSave.js'
 import pages from '@src/js/common/consts/pages.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormControllerAddGroup.js b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerAddGroup.js
similarity index 97%
rename from openbis_ng_ui/src/js/components/users/form/UserFormControllerAddGroup.js
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormControllerAddGroup.js
index c76c201850acf677b4537edd86f67d79fc6b6d02..b6faae8702d17cefae36d5f02c6233b39319e573 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserFormControllerAddGroup.js
+++ b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerAddGroup.js
@@ -1,5 +1,5 @@
 import _ from 'lodash'
-import UserFormSelectionType from '@src/js/components/users/form/UserFormSelectionType.js'
+import UserFormSelectionType from '@src/js/components/users/form/user/UserFormSelectionType.js'
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 
 export default class UserFormControllerAddGroup {
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormControllerAddRole.js b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerAddRole.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserFormControllerAddRole.js
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormControllerAddRole.js
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormControllerChange.js b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerChange.js
similarity index 95%
rename from openbis_ng_ui/src/js/components/users/form/UserFormControllerChange.js
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormControllerChange.js
index 89460569c290e666867ca42d14ebe0cce980f800..ff24b4716079edae502f961cb7ee18f5904052bc 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserFormControllerChange.js
+++ b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerChange.js
@@ -1,8 +1,8 @@
 import _ from 'lodash'
 import PageControllerChange from '@src/js/components/common/page/PageControllerChange.js'
 import RoleControllerChange from '@src/js/components/users/form/common/RoleControllerChange.js'
-import UserFormControllerRecalculateInheritedRoles from '@src/js/components/users/form/UserFormControllerRecalculateInheritedRoles.js'
-import UserFormSelectionType from '@src/js/components/users/form/UserFormSelectionType.js'
+import UserFormControllerRecalculateInheritedRoles from '@src/js/components/users/form/user/UserFormControllerRecalculateInheritedRoles.js'
+import UserFormSelectionType from '@src/js/components/users/form/user/UserFormSelectionType.js'
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 
 export default class UserFormControllerChange extends PageControllerChange {
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormControllerLoad.js b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerLoad.js
similarity index 99%
rename from openbis_ng_ui/src/js/components/users/form/UserFormControllerLoad.js
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormControllerLoad.js
index 493ea96615284db5d218fc7b485ca267f9c4f481..c03014d728c29050fc0f11f43e9d16579a0f0e5c 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserFormControllerLoad.js
+++ b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerLoad.js
@@ -1,7 +1,7 @@
 import _ from 'lodash'
 import PageControllerLoad from '@src/js/components/common/page/PageControllerLoad.js'
 import RoleControllerLoad from '@src/js/components/users/form/common/RoleControllerLoad.js'
-import UserFormSelectionType from '@src/js/components/users/form/UserFormSelectionType.js'
+import UserFormSelectionType from '@src/js/components/users/form/user/UserFormSelectionType.js'
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 
 export default class UserFormControllerLoad extends PageControllerLoad {
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormControllerRecalculateInheritedRoles.js b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerRecalculateInheritedRoles.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserFormControllerRecalculateInheritedRoles.js
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormControllerRecalculateInheritedRoles.js
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormControllerRemove.js b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerRemove.js
similarity index 93%
rename from openbis_ng_ui/src/js/components/users/form/UserFormControllerRemove.js
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormControllerRemove.js
index ad10eea380983897428f5c8486657684c15ce6d4..d9df156ffd4fdf8e9422abda2500e7605235ea2b 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserFormControllerRemove.js
+++ b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerRemove.js
@@ -1,6 +1,6 @@
 import RoleControllerRemove from '@src/js/components/users/form/common/RoleControllerRemove.js'
-import UserFormControllerRecalculateInheritedRoles from '@src/js/components/users/form/UserFormControllerRecalculateInheritedRoles.js'
-import UserFormSelectionType from '@src/js/components/users/form/UserFormSelectionType.js'
+import UserFormControllerRecalculateInheritedRoles from '@src/js/components/users/form/user/UserFormControllerRecalculateInheritedRoles.js'
+import UserFormSelectionType from '@src/js/components/users/form/user/UserFormSelectionType.js'
 
 export default class UserFormControllerRemove {
   constructor(controller) {
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormControllerSave.js b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerSave.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserFormControllerSave.js
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormControllerSave.js
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormControllerSelectionChange.js b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerSelectionChange.js
similarity index 97%
rename from openbis_ng_ui/src/js/components/users/form/UserFormControllerSelectionChange.js
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormControllerSelectionChange.js
index bbd889e5f3a9a87902cb411dbc3da1db4f6e11a2..8143564eeb389fe460b0279906e127faf294b162 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserFormControllerSelectionChange.js
+++ b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerSelectionChange.js
@@ -1,5 +1,5 @@
 import PageControllerSelectionChange from '@src/js/components/common/page/PageControllerSelectionChange.js'
-import UserFormSelectionType from '@src/js/components/users/form/UserFormSelectionType.js'
+import UserFormSelectionType from '@src/js/components/users/form/user/UserFormSelectionType.js'
 
 export default class UserFormControllerSelectionChange extends PageControllerSelectionChange {
   constructor(controller) {
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormControllerValidate.js b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerValidate.js
similarity index 98%
rename from openbis_ng_ui/src/js/components/users/form/UserFormControllerValidate.js
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormControllerValidate.js
index 496f512530c9bdda591df136ecee506b9db9b293..c85042857cffe9de59fa6eacd82751e8316259c1 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserFormControllerValidate.js
+++ b/openbis_ng_ui/src/js/components/users/form/user/UserFormControllerValidate.js
@@ -1,6 +1,6 @@
 import PageControllerValidate from '@src/js/components/common/page/PageConrollerValidate.js'
 import RoleControllerValidate from '@src/js/components/users/form/common/RoleControllerValidate.js'
-import UserFormSelectionType from '@src/js/components/users/form/UserFormSelectionType.js'
+import UserFormSelectionType from '@src/js/components/users/form/user/UserFormSelectionType.js'
 import messages from '@src/js/common/messages.js'
 
 export default class UserFormControllerValidate extends PageControllerValidate {
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormFacade.js b/openbis_ng_ui/src/js/components/users/form/user/UserFormFacade.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserFormFacade.js
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormFacade.js
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormGridGroups.jsx b/openbis_ng_ui/src/js/components/users/form/user/UserFormGridGroups.jsx
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserFormGridGroups.jsx
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormGridGroups.jsx
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormGridRoles.jsx b/openbis_ng_ui/src/js/components/users/form/user/UserFormGridRoles.jsx
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserFormGridRoles.jsx
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormGridRoles.jsx
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormParametersGroup.jsx b/openbis_ng_ui/src/js/components/users/form/user/UserFormParametersGroup.jsx
similarity index 99%
rename from openbis_ng_ui/src/js/components/users/form/UserFormParametersGroup.jsx
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormParametersGroup.jsx
index b03293d56dee604a5fa13bebf6ef44b278aac310..bbcb12ea12e2a24d12fb1f19a11e2c53a24b8e27 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserFormParametersGroup.jsx
+++ b/openbis_ng_ui/src/js/components/users/form/user/UserFormParametersGroup.jsx
@@ -4,7 +4,7 @@ import Container from '@src/js/components/common/form/Container.jsx'
 import Header from '@src/js/components/common/form/Header.jsx'
 import SelectField from '@src/js/components/common/form/SelectField.jsx'
 import Message from '@src/js/components/common/form/Message.jsx'
-import UserFormSelectionType from '@src/js/components/users/form/UserFormSelectionType.js'
+import UserFormSelectionType from '@src/js/components/users/form/user/UserFormSelectionType.js'
 import messages from '@src/js/common/messages.js'
 import logger from '@src/js/common/logger.js'
 
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormParametersRole.jsx b/openbis_ng_ui/src/js/components/users/form/user/UserFormParametersRole.jsx
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserFormParametersRole.jsx
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormParametersRole.jsx
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormParametersUser.jsx b/openbis_ng_ui/src/js/components/users/form/user/UserFormParametersUser.jsx
similarity index 99%
rename from openbis_ng_ui/src/js/components/users/form/UserFormParametersUser.jsx
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormParametersUser.jsx
index eb696e2a93a2dffba446bf5345315b8b91f358a1..abb6994351535b09c94e07dfc33e1f5bb7f8de90 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserFormParametersUser.jsx
+++ b/openbis_ng_ui/src/js/components/users/form/user/UserFormParametersUser.jsx
@@ -6,7 +6,7 @@ import TextField from '@src/js/components/common/form/TextField.jsx'
 import SelectField from '@src/js/components/common/form/SelectField.jsx'
 import CheckboxField from '@src/js/components/common/form/CheckboxField.jsx'
 import ConfirmationDialog from '@src/js/components/common/dialog/ConfirmationDialog.jsx'
-import UserFormSelectionType from '@src/js/components/users/form/UserFormSelectionType.js'
+import UserFormSelectionType from '@src/js/components/users/form/user/UserFormSelectionType.js'
 import messages from '@src/js/common/messages.js'
 import logger from '@src/js/common/logger.js'
 
diff --git a/openbis_ng_ui/src/js/components/users/form/UserFormSelectionType.js b/openbis_ng_ui/src/js/components/users/form/user/UserFormSelectionType.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserFormSelectionType.js
rename to openbis_ng_ui/src/js/components/users/form/user/UserFormSelectionType.js
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupForm.jsx b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupForm.jsx
similarity index 92%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupForm.jsx
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupForm.jsx
index 8c107ea9371dcef4a30580fbeb1a0a7184e6532a..726dfa54c30e44974670df4301f2177f83da6e96 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserGroupForm.jsx
+++ b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupForm.jsx
@@ -6,15 +6,15 @@ import { withStyles } from '@material-ui/core/styles'
 import ComponentContext from '@src/js/components/common/ComponentContext.js'
 import PageWithTwoPanels from '@src/js/components/common/page/PageWithTwoPanels.jsx'
 import GridContainer from '@src/js/components/common/grid/GridContainer.jsx'
-import UserGroupFormController from '@src/js/components/users/form/UserGroupFormController.js'
-import UserGroupFormFacade from '@src/js/components/users/form/UserGroupFormFacade.js'
-import UserGroupFormSelectionType from '@src/js/components/users/form/UserGroupFormSelectionType.js'
-import UserGroupFormParametersGroup from '@src/js/components/users/form/UserGroupFormParametersGroup.jsx'
-import UserGroupFormParametersUser from '@src/js/components/users/form/UserGroupFormParametersUser.jsx'
-import UserGroupFormParametersRole from '@src/js/components/users/form/UserGroupFormParametersRole.jsx'
-import UserGroupFormGridUsers from '@src/js/components/users/form/UserGroupFormGridUsers.jsx'
-import UserGroupFormGridRoles from '@src/js/components/users/form/UserGroupFormGridRoles.jsx'
-import UserGroupFormButtons from '@src/js/components/users/form/UserGroupFormButtons.jsx'
+import UserGroupFormController from '@src/js/components/users/form/usergroup/UserGroupFormController.js'
+import UserGroupFormFacade from '@src/js/components/users/form/usergroup/UserGroupFormFacade.js'
+import UserGroupFormSelectionType from '@src/js/components/users/form/usergroup/UserGroupFormSelectionType.js'
+import UserGroupFormParametersGroup from '@src/js/components/users/form/usergroup/UserGroupFormParametersGroup.jsx'
+import UserGroupFormParametersUser from '@src/js/components/users/form/usergroup/UserGroupFormParametersUser.jsx'
+import UserGroupFormParametersRole from '@src/js/components/users/form/usergroup/UserGroupFormParametersRole.jsx'
+import UserGroupFormGridUsers from '@src/js/components/users/form/usergroup/UserGroupFormGridUsers.jsx'
+import UserGroupFormGridRoles from '@src/js/components/users/form/usergroup/UserGroupFormGridRoles.jsx'
+import UserGroupFormButtons from '@src/js/components/users/form/usergroup/UserGroupFormButtons.jsx'
 import logger from '@src/js/common/logger.js'
 
 const styles = theme => ({
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormButtons.jsx b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormButtons.jsx
similarity index 97%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormButtons.jsx
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormButtons.jsx
index 335833822c0329a1861ac5127cbfb43ba5988fc7..d18aa819978a5af2370f60aca1569e3f76f2545a 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserGroupFormButtons.jsx
+++ b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormButtons.jsx
@@ -2,7 +2,7 @@ import React from 'react'
 import PageMode from '@src/js/components/common/page/PageMode.js'
 import PageButtons from '@src/js/components/common/page/PageButtons.jsx'
 import Button from '@src/js/components/common/form/Button.jsx'
-import UserGroupFormSelectionType from '@src/js/components/users/form/UserGroupFormSelectionType.js'
+import UserGroupFormSelectionType from '@src/js/components/users/form/usergroup/UserGroupFormSelectionType.js'
 import messages from '@src/js/common/messages.js'
 import logger from '@src/js/common/logger.js'
 
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormController.js b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormController.js
similarity index 80%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormController.js
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormController.js
index a3dcde07a5474b75aafbb1b7864b8f8a82d6b474..07bee7ef8badf692d800089184b541ba60974c11 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserGroupFormController.js
+++ b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormController.js
@@ -1,12 +1,12 @@
 import PageController from '@src/js/components/common/page/PageController.js'
-import UserGroupFormControllerLoad from '@src/js/components/users/form/UserGroupFormControllerLoad.js'
-import UserGroupFormControllerAddUser from '@src/js/components/users/form/UserGroupFormControllerAddUser.js'
-import UserGroupFormControllerAddRole from '@src/js/components/users/form/UserGroupFormControllerAddRole.js'
-import UserGroupFormControllerRemove from '@src/js/components/users/form/UserGroupFormControllerRemove.js'
-import UserGroupFormControllerValidate from '@src/js/components/users/form/UserGroupFormControllerValidate.js'
-import UserGroupFormControllerChange from '@src/js/components/users/form/UserGroupFormControllerChange.js'
-import UserGroupFormControllerSelectionChange from '@src/js/components/users/form/UserGroupFormControllerSelectionChange.js'
-import UserGroupFormControllerSave from '@src/js/components/users/form/UserGroupFormControllerSave.js'
+import UserGroupFormControllerLoad from '@src/js/components/users/form/usergroup/UserGroupFormControllerLoad.js'
+import UserGroupFormControllerAddUser from '@src/js/components/users/form/usergroup/UserGroupFormControllerAddUser.js'
+import UserGroupFormControllerAddRole from '@src/js/components/users/form/usergroup/UserGroupFormControllerAddRole.js'
+import UserGroupFormControllerRemove from '@src/js/components/users/form/usergroup/UserGroupFormControllerRemove.js'
+import UserGroupFormControllerValidate from '@src/js/components/users/form/usergroup/UserGroupFormControllerValidate.js'
+import UserGroupFormControllerChange from '@src/js/components/users/form/usergroup/UserGroupFormControllerChange.js'
+import UserGroupFormControllerSelectionChange from '@src/js/components/users/form/usergroup/UserGroupFormControllerSelectionChange.js'
+import UserGroupFormControllerSave from '@src/js/components/users/form/usergroup/UserGroupFormControllerSave.js'
 import pages from '@src/js/common/consts/pages.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerAddRole.js b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerAddRole.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerAddRole.js
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerAddRole.js
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerAddUser.js b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerAddUser.js
similarity index 96%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerAddUser.js
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerAddUser.js
index a70ff361b314723add18eb060c56a7d493188620..4459acf6fc5f63e04a886af3384486db18506dd9 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerAddUser.js
+++ b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerAddUser.js
@@ -1,5 +1,5 @@
 import _ from 'lodash'
-import UserGroupFormSelectionType from '@src/js/components/users/form/UserGroupFormSelectionType.js'
+import UserGroupFormSelectionType from '@src/js/components/users/form/usergroup/UserGroupFormSelectionType.js'
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 
 export default class UserGroupFormControllerAddUser {
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerChange.js b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerChange.js
similarity index 98%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerChange.js
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerChange.js
index f29243a4be12fe34bfc0777184e8d4f095b7d43f..ff765ec49018320378a132dc6a089c30d2c7927b 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerChange.js
+++ b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerChange.js
@@ -1,7 +1,7 @@
 import _ from 'lodash'
 import PageControllerChange from '@src/js/components/common/page/PageControllerChange.js'
 import RoleControllerChange from '@src/js/components/users/form/common/RoleControllerChange.js'
-import UserGroupFormSelectionType from '@src/js/components/users/form/UserGroupFormSelectionType.js'
+import UserGroupFormSelectionType from '@src/js/components/users/form/usergroup/UserGroupFormSelectionType.js'
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 
 export default class UserGroupFormControllerChange extends PageControllerChange {
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerLoad.js b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerLoad.js
similarity index 98%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerLoad.js
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerLoad.js
index a06afabf3cdbc57ad04ed9380b8d495664ca2536..6445e6935d8d07206622468719c90df57434fcf1 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerLoad.js
+++ b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerLoad.js
@@ -1,7 +1,7 @@
 import _ from 'lodash'
 import PageControllerLoad from '@src/js/components/common/page/PageControllerLoad.js'
 import RoleControllerLoad from '@src/js/components/users/form/common/RoleControllerLoad.js'
-import UserGroupFormSelectionType from '@src/js/components/users/form/UserGroupFormSelectionType.js'
+import UserGroupFormSelectionType from '@src/js/components/users/form/usergroup/UserGroupFormSelectionType.js'
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 
 export default class UserGroupFormControllerLoad extends PageControllerLoad {
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerRemove.js b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerRemove.js
similarity index 96%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerRemove.js
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerRemove.js
index 34d398cf4a3898e9b2703bfb5b05394d59130db1..6191776f3ac44cc70b3bea6e07516546677db209 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerRemove.js
+++ b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerRemove.js
@@ -1,5 +1,5 @@
 import RoleControllerRemove from '@src/js/components/users/form/common/RoleControllerRemove.js'
-import UserGroupFormSelectionType from '@src/js/components/users/form/UserGroupFormSelectionType.js'
+import UserGroupFormSelectionType from '@src/js/components/users/form/usergroup/UserGroupFormSelectionType.js'
 
 export default class UserGroupFormControllerRemove {
   constructor(controller) {
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerSave.js b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerSave.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerSave.js
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerSave.js
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerSelectionChange.js b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerSelectionChange.js
similarity index 95%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerSelectionChange.js
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerSelectionChange.js
index 6df062aef9e501a8e661255a40ed4c7a998ae903..c6e3d6ea529cc1d53fc3e9dbabf35b474550f8af 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerSelectionChange.js
+++ b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerSelectionChange.js
@@ -1,5 +1,5 @@
 import PageControllerSelectionChange from '@src/js/components/common/page/PageControllerSelectionChange.js'
-import UserGroupFormSelectionType from '@src/js/components/users/form/UserGroupFormSelectionType.js'
+import UserGroupFormSelectionType from '@src/js/components/users/form/usergroup/UserGroupFormSelectionType.js'
 
 export default class UserGroupFormControllerSelectionChange extends PageControllerSelectionChange {
   constructor(controller) {
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerValidate.js b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerValidate.js
similarity index 97%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerValidate.js
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerValidate.js
index a324689be92d37032a14d4e92946a1e5c85afa03..4997b4802e8a50bbd52182ac2fb63024a2485b28 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserGroupFormControllerValidate.js
+++ b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormControllerValidate.js
@@ -1,6 +1,6 @@
 import PageControllerValidate from '@src/js/components/common/page/PageConrollerValidate.js'
 import RoleControllerValidate from '@src/js/components/users/form/common/RoleControllerValidate.js'
-import UserGroupFormSelectionType from '@src/js/components/users/form/UserGroupFormSelectionType.js'
+import UserGroupFormSelectionType from '@src/js/components/users/form/usergroup/UserGroupFormSelectionType.js'
 import messages from '@src/js/common/messages.js'
 
 export default class UserGroupFormControllerValidate extends PageControllerValidate {
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormFacade.js b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormFacade.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormFacade.js
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormFacade.js
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormGridRoles.jsx b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormGridRoles.jsx
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormGridRoles.jsx
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormGridRoles.jsx
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormGridUsers.jsx b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormGridUsers.jsx
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormGridUsers.jsx
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormGridUsers.jsx
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormParametersGroup.jsx b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormParametersGroup.jsx
similarity index 98%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormParametersGroup.jsx
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormParametersGroup.jsx
index 32ac7a5ce1f253331c25b741c16e13981faa820d..83c7c962349ad025e36e3dae89a9a6463114aaae 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserGroupFormParametersGroup.jsx
+++ b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormParametersGroup.jsx
@@ -3,7 +3,7 @@ import { withStyles } from '@material-ui/core/styles'
 import Container from '@src/js/components/common/form/Container.jsx'
 import Header from '@src/js/components/common/form/Header.jsx'
 import TextField from '@src/js/components/common/form/TextField.jsx'
-import UserGroupFormSelectionType from '@src/js/components/users/form/UserGroupFormSelectionType.js'
+import UserGroupFormSelectionType from '@src/js/components/users/form/usergroup/UserGroupFormSelectionType.js'
 import messages from '@src/js/common/messages.js'
 import logger from '@src/js/common/logger.js'
 
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormParametersRole.jsx b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormParametersRole.jsx
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormParametersRole.jsx
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormParametersRole.jsx
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormParametersUser.jsx b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormParametersUser.jsx
similarity index 98%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormParametersUser.jsx
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormParametersUser.jsx
index 5149bfd071d924d4e4ab2ad9dba0f66ac5f1ad12..da13e2f376f2e935671294149e28846d4d85f07c 100644
--- a/openbis_ng_ui/src/js/components/users/form/UserGroupFormParametersUser.jsx
+++ b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormParametersUser.jsx
@@ -4,7 +4,7 @@ import Container from '@src/js/components/common/form/Container.jsx'
 import Header from '@src/js/components/common/form/Header.jsx'
 import SelectField from '@src/js/components/common/form/SelectField.jsx'
 import Message from '@src/js/components/common/form/Message.jsx'
-import UserGroupFormSelectionType from '@src/js/components/users/form/UserGroupFormSelectionType.js'
+import UserGroupFormSelectionType from '@src/js/components/users/form/usergroup/UserGroupFormSelectionType.js'
 import messages from '@src/js/common/messages.js'
 import logger from '@src/js/common/logger.js'
 
diff --git a/openbis_ng_ui/src/js/components/users/form/UserGroupFormSelectionType.js b/openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormSelectionType.js
similarity index 100%
rename from openbis_ng_ui/src/js/components/users/form/UserGroupFormSelectionType.js
rename to openbis_ng_ui/src/js/components/users/form/usergroup/UserGroupFormSelectionType.js
diff --git a/openbis_ng_ui/src/js/services/openbis/api.js b/openbis_ng_ui/src/js/services/openbis/api.js
index d660f5e6c875c451b990f4535379a0a7b72fe491..4ff7c613e4ab7d636971343d5f84d3f5f2ab5023 100644
--- a/openbis_ng_ui/src/js/services/openbis/api.js
+++ b/openbis_ng_ui/src/js/services/openbis/api.js
@@ -1,5 +1,4 @@
 import autoBind from 'auto-bind'
-import dto from '@src/js/services/openbis/dto.js'
 
 class Facade {
   constructor() {
diff --git a/openbis_ng_ui/srcTest/js/common/fixture.js b/openbis_ng_ui/srcTest/js/common/fixture.js
index 6cd9060e2f6e803a2401125315bc11eb82bba7cf..7d198067bc40b6db83db8236afbdcff9512cf8c1 100644
--- a/openbis_ng_ui/srcTest/js/common/fixture.js
+++ b/openbis_ng_ui/srcTest/js/common/fixture.js
@@ -68,7 +68,13 @@ const TEST_PROPERTY_ASSIGNMENT_3 = new openbis.PropertyAssignment()
 TEST_PROPERTY_ASSIGNMENT_3.setPropertyType(TEST_PROPERTY_TYPE_3_DTO)
 TEST_PROPERTY_ASSIGNMENT_3.setSection('TEST_SECTION_2')
 
+const TEST_PROPERTY_ASSIGNMENT_4 = new openbis.PropertyAssignment()
+TEST_PROPERTY_ASSIGNMENT_4.setPropertyType(TEST_PROPERTY_TYPE_1_DTO)
+
 const TEST_SAMPLE_TYPE_DTO = new openbis.SampleType()
+TEST_SAMPLE_TYPE_DTO.setPermId(
+  new openbis.EntityTypePermId('TEST_TYPE', openbis.EntityKind.SAMPLE)
+)
 TEST_SAMPLE_TYPE_DTO.setCode('TEST_TYPE')
 TEST_SAMPLE_TYPE_DTO.setAutoGeneratedCode(false)
 TEST_SAMPLE_TYPE_DTO.setGeneratedCodePrefix('TEST_PREFIX_')
@@ -80,8 +86,18 @@ TEST_SAMPLE_TYPE_DTO.setPropertyAssignments([
   TEST_PROPERTY_ASSIGNMENT_3
 ])
 
+TEST_PROPERTY_ASSIGNMENT_1.setEntityType(TEST_SAMPLE_TYPE_DTO)
+TEST_PROPERTY_ASSIGNMENT_2.setEntityType(TEST_SAMPLE_TYPE_DTO)
+TEST_PROPERTY_ASSIGNMENT_3.setEntityType(TEST_SAMPLE_TYPE_DTO)
+
 const ANOTHER_SAMPLE_TYPE_DTO = new openbis.SampleType()
+ANOTHER_SAMPLE_TYPE_DTO.setPermId(
+  new openbis.EntityTypePermId('ANOTHER_SAMPLE_TYPE', openbis.EntityKind.SAMPLE)
+)
 ANOTHER_SAMPLE_TYPE_DTO.setCode('ANOTHER_SAMPLE_TYPE')
+ANOTHER_SAMPLE_TYPE_DTO.setPropertyAssignments([TEST_PROPERTY_ASSIGNMENT_4])
+
+TEST_PROPERTY_ASSIGNMENT_4.setEntityType(ANOTHER_SAMPLE_TYPE_DTO)
 
 const TEST_EXPERIMENT_TYPE_DTO = new openbis.ExperimentType()
 TEST_EXPERIMENT_TYPE_DTO.setCode('TEST_TYPE')
diff --git a/openbis_ng_ui/srcTest/js/components/AppComponentLogin.test.js b/openbis_ng_ui/srcTest/js/components/AppComponentLogin.test.js
index b480cda823b001765a8f0d42845207f303400a19..c03cd6cc01f455cd67b0e07309b1470c5328febc 100644
--- a/openbis_ng_ui/srcTest/js/components/AppComponentLogin.test.js
+++ b/openbis_ng_ui/srcTest/js/components/AppComponentLogin.test.js
@@ -14,7 +14,7 @@ describe(AppComponentTest.SUITE, () => {
 async function testLogin() {
   const app = await common.mount()
 
-  app.expectJSON({
+  await app.expectJSON({
     login: {
       user: {
         value: null,
@@ -35,7 +35,7 @@ async function testLogin() {
 
   await common.login(app)
 
-  app.expectJSON({
+  await app.expectJSON({
     login: null,
     menu: {
       tabs: [
@@ -63,7 +63,8 @@ async function testLogin() {
           { level: 0, text: 'Collection Types' },
           { level: 0, text: 'Data Set Types' },
           { level: 0, text: 'Material Types' },
-          { level: 0, text: 'Vocabulary Types' }
+          { level: 0, text: 'Vocabulary Types' },
+          { level: 0, text: 'Property Types' }
         ]
       },
       content: {
diff --git a/openbis_ng_ui/srcTest/js/components/AppComponentOpenCloseTypes.test.js b/openbis_ng_ui/srcTest/js/components/AppComponentOpenCloseTypes.test.js
index 91ad207e4ade20a1485cfc2d9349f71a03ab048a..d777de208b0bf397d6c223b8a0adf76b32f2a1c5 100644
--- a/openbis_ng_ui/srcTest/js/components/AppComponentOpenCloseTypes.test.js
+++ b/openbis_ng_ui/srcTest/js/components/AppComponentOpenCloseTypes.test.js
@@ -48,7 +48,8 @@ async function testOpenCloseTypes() {
           { level: 0, text: 'Collection Types', selected: false },
           { level: 0, text: 'Data Set Types', selected: false },
           { level: 0, text: 'Material Types', selected: false },
-          { level: 0, text: 'Vocabulary Types', selected: false }
+          { level: 0, text: 'Vocabulary Types', selected: false },
+          { level: 0, text: 'Property Types', selected: false }
         ]
       },
       content: {
@@ -87,7 +88,8 @@ async function testOpenCloseTypes() {
           { level: 0, text: 'Collection Types', selected: false },
           { level: 0, text: 'Data Set Types', selected: false },
           { level: 0, text: 'Material Types', selected: false },
-          { level: 0, text: 'Vocabulary Types', selected: false }
+          { level: 0, text: 'Vocabulary Types', selected: false },
+          { level: 0, text: 'Property Types', selected: false }
         ]
       },
       content: {
diff --git a/openbis_ng_ui/srcTest/js/components/AppComponentTest.js b/openbis_ng_ui/srcTest/js/components/AppComponentTest.js
index c42a2ed95307490fdd4e09def568869bd84b1bf8..602e651d0a0cbe039be1e7d9b5a530f7c16f24c2 100644
--- a/openbis_ng_ui/srcTest/js/components/AppComponentTest.js
+++ b/openbis_ng_ui/srcTest/js/components/AppComponentTest.js
@@ -24,6 +24,7 @@ export default class AppComponentTest extends ComponentTest {
     openbis.mockSearchDataSetTypes([])
     openbis.mockSearchMaterialTypes([])
     openbis.mockSearchVocabularies([])
+    openbis.mockSearchPropertyTypes([])
     openbis.mockSearchPersons([])
     openbis.mockSearchGroups([])
     openbis.mockSearchPlugins([])
diff --git a/openbis_ng_ui/srcTest/js/components/tools/browser/ToolBrowserComponentFilter.test.js b/openbis_ng_ui/srcTest/js/components/tools/browser/ToolBrowserComponentFilter.test.js
index f65073d1d496743fddaba127e411b9b7898f43ec..f9b6656dfffb5bc8a38d2bd495013de37ef96807 100644
--- a/openbis_ng_ui/srcTest/js/components/tools/browser/ToolBrowserComponentFilter.test.js
+++ b/openbis_ng_ui/srcTest/js/components/tools/browser/ToolBrowserComponentFilter.test.js
@@ -1,6 +1,5 @@
 import ToolBrowserComponentTest from '@srcTest/js/components/tools/browser/ToolBrowserComponentTest.js'
 import ToolBrowserTestData from '@srcTest/js/components/tools/browser/ToolBrowserTestData.js'
-import ImportType from '@src/js/components/tools/form/import/ImportType.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentFilter.test.js b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentFilter.test.js
index d492b88bc3b51f5f654bc4665ccb748b44d273bc..ebdef9e6caf88c0b190058afda2236c9a2b33d51 100644
--- a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentFilter.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentFilter.test.js
@@ -52,7 +52,8 @@ async function testFilter() {
       { level: 1, text: fixture.TEST_MATERIAL_TYPE_DTO.code },
       { level: 0, text: 'Vocabulary Types' },
       { level: 1, text: fixture.ANOTHER_VOCABULARY_DTO.code },
-      { level: 1, text: fixture.TEST_VOCABULARY_DTO.code }
+      { level: 1, text: fixture.TEST_VOCABULARY_DTO.code },
+      { level: 0, text: 'Property Types' }
     ]
   })
 }
diff --git a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentLoad.test.js b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentLoad.test.js
index 6516511132d2148d54a38d9fc6ccd3d849f201d6..3980f5ed8cff6da06e7a6627883059b2a68db65e 100644
--- a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentLoad.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentLoad.test.js
@@ -23,7 +23,8 @@ async function testLoad() {
       { level: 0, text: 'Collection Types' },
       { level: 0, text: 'Data Set Types' },
       { level: 0, text: 'Material Types' },
-      { level: 0, text: 'Vocabulary Types' }
+      { level: 0, text: 'Vocabulary Types' },
+      { level: 0, text: 'Property Types' }
     ]
   })
 }
diff --git a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentOpenClose.test.js b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentOpenClose.test.js
index d389cd3e8c3f3611902c868a8419dd766afc4349..e8fbb653930d80458fa89febc62ec44a3a3c3195 100644
--- a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentOpenClose.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentOpenClose.test.js
@@ -29,7 +29,8 @@ async function testOpenClose() {
       { level: 0, text: 'Collection Types' },
       { level: 0, text: 'Data Set Types' },
       { level: 0, text: 'Material Types' },
-      { level: 0, text: 'Vocabulary Types' }
+      { level: 0, text: 'Vocabulary Types' },
+      { level: 0, text: 'Property Types' }
     ]
   })
 
@@ -45,7 +46,8 @@ async function testOpenClose() {
       { level: 0, text: 'Collection Types' },
       { level: 0, text: 'Data Set Types' },
       { level: 0, text: 'Material Types' },
-      { level: 0, text: 'Vocabulary Types' }
+      { level: 0, text: 'Vocabulary Types' },
+      { level: 0, text: 'Property Types' }
     ]
   })
 }
diff --git a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentSelect.test.js b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentSelect.test.js
index 1e05a49bea1237e227dcdcac83fac4d421cd1e36..1104e369b1cdfbc0046c55d33c6557ada54f5db7 100644
--- a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentSelect.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentSelect.test.js
@@ -22,7 +22,8 @@ async function testSelectEntityKind() {
       { level: 0, text: 'Collection Types', selected: false },
       { level: 0, text: 'Data Set Types', selected: false },
       { level: 0, text: 'Material Types', selected: false },
-      { level: 0, text: 'Vocabulary Types', selected: false }
+      { level: 0, text: 'Vocabulary Types', selected: false },
+      { level: 0, text: 'Property Types', selected: false }
     ],
     buttons: {
       add: {
@@ -43,7 +44,8 @@ async function testSelectEntityKind() {
       { level: 0, text: 'Collection Types', selected: false },
       { level: 0, text: 'Data Set Types', selected: false },
       { level: 0, text: 'Material Types', selected: false },
-      { level: 0, text: 'Vocabulary Types', selected: false }
+      { level: 0, text: 'Vocabulary Types', selected: false },
+      { level: 0, text: 'Property Types', selected: false }
     ],
     buttons: {
       add: {
@@ -70,7 +72,8 @@ async function testSelectEntityType() {
       { level: 0, text: 'Collection Types', selected: false },
       { level: 0, text: 'Data Set Types', selected: false },
       { level: 0, text: 'Material Types', selected: false },
-      { level: 0, text: 'Vocabulary Types', selected: false }
+      { level: 0, text: 'Vocabulary Types', selected: false },
+      { level: 0, text: 'Property Types', selected: false }
     ],
     buttons: {
       add: {
@@ -93,7 +96,8 @@ async function testSelectEntityType() {
       { level: 0, text: 'Collection Types', selected: false },
       { level: 0, text: 'Data Set Types', selected: false },
       { level: 0, text: 'Material Types', selected: false },
-      { level: 0, text: 'Vocabulary Types', selected: false }
+      { level: 0, text: 'Vocabulary Types', selected: false },
+      { level: 0, text: 'Property Types', selected: false }
     ],
     buttons: {
       add: {
diff --git a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentTest.js b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentTest.js
index eb943ad8621690cd2b97e034935f39c648e297bb..024525feeebba919eb24638294dffa7bbf96cdc0 100644
--- a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentTest.js
+++ b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserComponentTest.js
@@ -35,5 +35,10 @@ export default class TypeBrowserComponentTest extends ComponentTest {
       fixture.TEST_VOCABULARY_DTO,
       fixture.ANOTHER_VOCABULARY_DTO
     ])
+
+    openbis.mockSearchPropertyTypes([
+      fixture.TEST_PROPERTY_TYPE_1_DTO,
+      fixture.TEST_PROPERTY_TYPE_2_DTO
+    ])
   }
 }
diff --git a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserControllerLoad.test.js b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserControllerLoad.test.js
index 85c4b3a9138ca1795bf51bff08deb7979569822c..b8aabd2461fb947f5e5c7db42cad164901c6d727 100644
--- a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserControllerLoad.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserControllerLoad.test.js
@@ -39,6 +39,11 @@ async function testLoad() {
       text: 'Vocabulary Types',
       expanded: false,
       selected: false
+    },
+    {
+      text: 'Property Types',
+      expanded: false,
+      selected: false
     }
   ])
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserControllerRemoveNode.test.js b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserControllerRemoveNode.test.js
index 1efd40bd8951934d2f222d913fd1c23a3863bd30..b1315e22b21f108406c907989610ee1b8d8d9fc6 100644
--- a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserControllerRemoveNode.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserControllerRemoveNode.test.js
@@ -42,11 +42,13 @@ async function testRemoveNode() {
     return new openbis.DeleteSampleTypesOperation([id], options)
   }
 
-  const createDeletePropertyTypeOperation = propertyTypeCode => {
-    const id = new openbis.PropertyTypePermId(propertyTypeCode)
+  const createDeletePropertyTypeOperation = propertyTypeCodes => {
+    const ids = propertyTypeCodes.map(propertyTypeCode => {
+      return new openbis.PropertyTypePermId(propertyTypeCode)
+    })
     const options = new openbis.PropertyTypeDeletionOptions()
     options.setReason('deleted via ng_ui')
-    return new openbis.DeletePropertyTypesOperation([id], options)
+    return new openbis.DeletePropertyTypesOperation(ids, options)
   }
 
   const options = new openbis.SynchronousOperationExecutionOptions()
@@ -55,7 +57,10 @@ async function testRemoveNode() {
   expect(openbis.executeOperations).toHaveBeenCalledWith(
     [
       createDeleteTypeOperation(fixture.TEST_SAMPLE_TYPE_DTO.code),
-      createDeletePropertyTypeOperation(fixture.TEST_PROPERTY_TYPE_1_DTO.code)
+      createDeletePropertyTypeOperation([
+        fixture.TEST_PROPERTY_TYPE_2_DTO.code,
+        fixture.TEST_PROPERTY_TYPE_3_DTO.code
+      ])
     ],
     options
   )
diff --git a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserControllerTest.js b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserControllerTest.js
index d7fd9e3c177dda3433fb8351692b021ae7cb2948..33992505e78f7b85fc3773a8e3cf60898e453ccf 100644
--- a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserControllerTest.js
+++ b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserControllerTest.js
@@ -32,6 +32,16 @@ export default class TypeBrowserControllerTest {
       fixture.TEST_VOCABULARY_DTO,
       fixture.ANOTHER_VOCABULARY_DTO
     ])
+
+    openbis.mockSearchPropertyTypes([
+      fixture.TEST_PROPERTY_TYPE_1_DTO,
+      fixture.TEST_PROPERTY_TYPE_2_DTO
+    ])
+
+    openbis.mockSearchPropertyAssignments([
+      ...fixture.TEST_SAMPLE_TYPE_DTO.propertyAssignments,
+      ...fixture.ANOTHER_SAMPLE_TYPE_DTO.propertyAssignments
+    ])
   }
 
   expectNewTypeAction(type) {
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerTest.js b/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerTest.js
deleted file mode 100644
index 7f7d1b5ebbe72c3181842dbeaccf0252bfd9f86f..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerTest.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import ComponentContext from '@srcTest/js/components/common/ComponentContext.js'
-import TypeFormControler from '@src/js/components/types/form/TypeFormController.js'
-import TypeFormFacade from '@src/js/components/types/form/TypeFormFacade'
-
-jest.mock('@src/js/components/types/form/TypeFormFacade')
-
-export default class TypeFormControllerTest {
-  static SUITE = 'TypeFormController'
-
-  beforeEach() {
-    jest.resetAllMocks()
-  }
-
-  init(object) {
-    this.context = new ComponentContext()
-    this.context.setProps({
-      object
-    })
-    this.facade = new TypeFormFacade()
-    this.controller = new TypeFormControler(this.facade)
-    this.controller.init(this.context)
-  }
-
-  afterEach() {
-    expect(this.facade.loadType).toHaveBeenCalledWith(
-      this.context.getProps().object
-    )
-  }
-}
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentTest.js b/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentTest.js
deleted file mode 100644
index 0f97784748b3130bd6eaad5586b3b027d0f3cb89..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentTest.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import React from 'react'
-import ComponentTest from '@srcTest/js/components/common/ComponentTest.js'
-import VocabularyForm from '@src/js/components/types/form/VocabularyForm.jsx'
-import VocabularyFormWrapper from '@srcTest/js/components/types/form/wrapper/VocabularyFormWrapper.js'
-import VocabularyFormController from '@src/js/components/types/form/VocabularyFormController.js'
-import VocabularyFormFacade from '@src/js/components/types/form/VocabularyFormFacade'
-import objectTypes from '@src/js/common/consts/objectType.js'
-
-jest.mock('@src/js/components/types/form/VocabularyFormFacade')
-
-export default class VocabularyFormComponentTest extends ComponentTest {
-  static SUITE = 'VocabularyFormComponent'
-
-  constructor() {
-    super(
-      object => <VocabularyForm object={object} controller={this.controller} />,
-      wrapper => new VocabularyFormWrapper(wrapper)
-    )
-    this.facade = null
-    this.controller = null
-  }
-
-  async beforeEach() {
-    super.beforeEach()
-
-    this.facade = new VocabularyFormFacade()
-    this.controller = new VocabularyFormController(this.facade)
-  }
-
-  async mountNew() {
-    return await this.mount({
-      type: objectTypes.NEW_VOCABULARY_TYPE
-    })
-  }
-
-  async mountExisting(vocabulary) {
-    this.facade.loadVocabulary.mockReturnValue(Promise.resolve(vocabulary))
-
-    return await this.mount({
-      id: vocabulary.getCode(),
-      type: objectTypes.VOCABULARY_TYPE
-    })
-  }
-}
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentAddProperty.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentAddProperty.test.js
similarity index 97%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentAddProperty.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentAddProperty.test.js
index a7d931fdf72d7f9595bff5206eecf7b1439fee37..ad06158fd3dfe86da71bcc1b828a82ae05054424 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentAddProperty.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentAddProperty.test.js
@@ -1,15 +1,15 @@
-import TypeFormComponentTest from '@srcTest/js/components/types/form/TypeFormComponentTest.js'
+import EntityTypeFormComponentTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js'
 import openbis from '@srcTest/js/services/openbis.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormComponentTest()
+  common = new EntityTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(TypeFormComponentTest.SUITE, () => {
+describe(EntityTypeFormComponentTest.SUITE, () => {
   test('add new property', testAddNewProperty)
   test('add existing property', testAddExistingProperty)
 })
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentAddSection.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentAddSection.test.js
similarity index 88%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentAddSection.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentAddSection.test.js
index ca3693a32bc715cfc33b8e76bcb13251f137b5cf..5bcc20d2fed4591bb90b72b78c551eba5fbb5bb2 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentAddSection.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentAddSection.test.js
@@ -1,14 +1,14 @@
-import TypeFormComponentTest from '@srcTest/js/components/types/form/TypeFormComponentTest.js'
+import EntityTypeFormComponentTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormComponentTest()
+  common = new EntityTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(TypeFormComponentTest.SUITE, () => {
+describe(EntityTypeFormComponentTest.SUITE, () => {
   test('add section', testAddSection)
 })
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentChangeProperty.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentChangeProperty.test.js
similarity index 98%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentChangeProperty.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentChangeProperty.test.js
index 466511fc1e871cb01b1d687d694fdf55501315eb..1b140c4cb946d4392e503d4ce5961ffc142dbdc5 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentChangeProperty.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentChangeProperty.test.js
@@ -1,15 +1,15 @@
-import TypeFormComponentTest from '@srcTest/js/components/types/form/TypeFormComponentTest.js'
+import EntityTypeFormComponentTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormComponentTest()
+  common = new EntityTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(TypeFormComponentTest.SUITE, () => {
+describe(EntityTypeFormComponentTest.SUITE, () => {
   test('change property', testChangeProperty)
   test('convert property', testConvertProperty)
 })
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentChangeSection.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentChangeSection.test.js
similarity index 87%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentChangeSection.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentChangeSection.test.js
index 154cfbc98a75a1e6a2a831cf6bcd3538c196555f..e0d67f1e37d330180c90ce455be5cd33843e59fc 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentChangeSection.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentChangeSection.test.js
@@ -1,14 +1,14 @@
-import TypeFormComponentTest from '@srcTest/js/components/types/form/TypeFormComponentTest.js'
+import EntityTypeFormComponentTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormComponentTest()
+  common = new EntityTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(TypeFormComponentTest.SUITE, () => {
+describe(EntityTypeFormComponentTest.SUITE, () => {
   test('change section', testChangeSection)
 })
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentChangeType.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentChangeType.test.js
similarity index 90%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentChangeType.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentChangeType.test.js
index e358a988be82af3330f24d9ab65d71ab258a2870..d2d6887f596f987ba7eb7210eae9b1c9a76ebe4a 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentChangeType.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentChangeType.test.js
@@ -1,14 +1,14 @@
-import TypeFormComponentTest from '@srcTest/js/components/types/form/TypeFormComponentTest.js'
+import EntityTypeFormComponentTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormComponentTest()
+  common = new EntityTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(TypeFormComponentTest.SUITE, () => {
+describe(EntityTypeFormComponentTest.SUITE, () => {
   test('change type', testChangeType)
 })
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentInternal.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentInternal.test.js
similarity index 94%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentInternal.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentInternal.test.js
index d3c0d42bb85fbf90dbffa150da41727f5f80479e..2ccc6773556f5371071029b4585656118fba097c 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentInternal.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentInternal.test.js
@@ -1,4 +1,4 @@
-import TypeFormComponentTest from '@srcTest/js/components/types/form/TypeFormComponentTest.js'
+import EntityTypeFormComponentTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import openbis from '@srcTest/js/services/openbis.js'
 import fixture from '@srcTest/js/common/fixture.js'
@@ -6,11 +6,11 @@ import fixture from '@srcTest/js/common/fixture.js'
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormComponentTest()
+  common = new EntityTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(TypeFormComponentTest.SUITE, () => {
+describe(EntityTypeFormComponentTest.SUITE, () => {
   test('internal', testInternal)
 })
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentLoad.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentLoad.test.js
similarity index 94%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentLoad.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentLoad.test.js
index c7e3a53f6e246058f29fae66b14d95701df5df54..4c3198b0b85ab033298e2ad86bbd0528b7317c47 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentLoad.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentLoad.test.js
@@ -1,14 +1,14 @@
-import TypeFormComponentTest from '@srcTest/js/components/types/form/TypeFormComponentTest.js'
+import EntityTypeFormComponentTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormComponentTest()
+  common = new EntityTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(TypeFormComponentTest.SUITE, () => {
+describe(EntityTypeFormComponentTest.SUITE, () => {
   test('load new', testLoadNew)
   test('load existing', testLoadExisting)
 })
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentRemoveProperty.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentRemoveProperty.test.js
similarity index 92%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentRemoveProperty.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentRemoveProperty.test.js
index 98e6779b1820ba0a943383b25df11fcdd225ca67..e783b60d22ffa86cf847277fa585eb557d7c5c6c 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentRemoveProperty.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentRemoveProperty.test.js
@@ -1,14 +1,14 @@
-import TypeFormComponentTest from '@srcTest/js/components/types/form/TypeFormComponentTest.js'
+import EntityTypeFormComponentTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormComponentTest()
+  common = new EntityTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(TypeFormComponentTest.SUITE, () => {
+describe(EntityTypeFormComponentTest.SUITE, () => {
   test('remove property', testRemoveProperty)
 })
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentRemoveSection.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentRemoveSection.test.js
similarity index 88%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentRemoveSection.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentRemoveSection.test.js
index 3ffa54969bc821e6d1ce2e034a30c9cffc10fd6f..d2653d358cc3b50a6a5e837c0a9bc7372220f060 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentRemoveSection.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentRemoveSection.test.js
@@ -1,14 +1,14 @@
-import TypeFormComponentTest from '@srcTest/js/components/types/form/TypeFormComponentTest.js'
+import EntityTypeFormComponentTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormComponentTest()
+  common = new EntityTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(TypeFormComponentTest.SUITE, () => {
+describe(EntityTypeFormComponentTest.SUITE, () => {
   test('remove section', testRemoveSection)
 })
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentSelectProperty.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentSelectProperty.test.js
similarity index 93%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentSelectProperty.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentSelectProperty.test.js
index a69633de0a23cdc6b6d91e7437e5276bcd8d3910..ccb3bd718ec5ade9c1e87df76d14e29184b3884c 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentSelectProperty.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentSelectProperty.test.js
@@ -1,15 +1,15 @@
-import TypeFormComponentTest from '@srcTest/js/components/types/form/TypeFormComponentTest.js'
+import EntityTypeFormComponentTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormComponentTest()
+  common = new EntityTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(TypeFormComponentTest.SUITE, () => {
+describe(EntityTypeFormComponentTest.SUITE, () => {
   test('select property unused', testSelectPropertyUnused)
   test('select property used', testSelectPropertyUsed)
 })
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentSelectSection.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentSelectSection.test.js
similarity index 76%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentSelectSection.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentSelectSection.test.js
index 90e7b10167009e3688af816e7c943b480a1d71ac..4d77d9ca710dd60cbcc646618283c1122fe2b6ea 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentSelectSection.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentSelectSection.test.js
@@ -1,14 +1,14 @@
-import TypeFormComponentTest from '@srcTest/js/components/types/form/TypeFormComponentTest.js'
+import EntityTypeFormComponentTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormComponentTest()
+  common = new EntityTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(TypeFormComponentTest.SUITE, () => {
+describe(EntityTypeFormComponentTest.SUITE, () => {
   test('select section', testSelectSection)
 })
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentTest.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js
similarity index 58%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentTest.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js
index 9068147d98f37b6c52eb8a95e3163305d8c30bb9..74b5b7fc006c1569a07ffb68c792ebb945fc720c 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentTest.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js
@@ -1,20 +1,20 @@
 import React from 'react'
 import ComponentTest from '@srcTest/js/components/common/ComponentTest.js'
-import TypeForm from '@src/js/components/types/form/TypeForm.jsx'
-import TypeFormWrapper from '@srcTest/js/components/types/form/wrapper/TypeFormWrapper.js'
-import TypeFormController from '@src/js/components/types/form/TypeFormController.js'
-import TypeFormFacade from '@src/js/components/types/form/TypeFormFacade'
+import EntityTypeForm from '@src/js/components/types/form/entitytype/EntityTypeForm.jsx'
+import EntityTypeFormWrapper from '@srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormWrapper.js'
+import EntityTypeFormController from '@src/js/components/types/form/entitytype/EntityTypeFormController.js'
+import EntityTypeFormFacade from '@src/js/components/types/form/entitytype/EntityTypeFormFacade'
 import objectTypes from '@src/js/common/consts/objectType.js'
 
-jest.mock('@src/js/components/types/form/TypeFormFacade')
+jest.mock('@src/js/components/types/form/entitytype/EntityTypeFormFacade')
 
-export default class TypeFormComponentTest extends ComponentTest {
-  static SUITE = 'TypeFormComponent'
+export default class EntityTypeFormComponentTest extends ComponentTest {
+  static SUITE = 'EntityTypeFormComponent'
 
   constructor() {
     super(
-      object => <TypeForm object={object} controller={this.controller} />,
-      wrapper => new TypeFormWrapper(wrapper)
+      object => <EntityTypeForm object={object} controller={this.controller} />,
+      wrapper => new EntityTypeFormWrapper(wrapper)
     )
     this.facade = null
     this.controller = null
@@ -23,8 +23,8 @@ export default class TypeFormComponentTest extends ComponentTest {
   async beforeEach() {
     super.beforeEach()
 
-    this.facade = new TypeFormFacade()
-    this.controller = new TypeFormController(this.facade)
+    this.facade = new EntityTypeFormFacade()
+    this.controller = new EntityTypeFormController(this.facade)
 
     this.facade.loadType.mockReturnValue(Promise.resolve({}))
     this.facade.loadDynamicPlugins.mockReturnValue(Promise.resolve([]))
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentValidate.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentValidate.test.js
similarity index 94%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentValidate.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentValidate.test.js
index 8ee6b237f056d36bc131ef8b0a98df9db9179ab2..49b1023ba703dcde2e1c435c0bad40c0259c41fd 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormComponentValidate.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormComponentValidate.test.js
@@ -1,13 +1,13 @@
-import TypeFormComponentTest from '@srcTest/js/components/types/form/TypeFormComponentTest.js'
+import EntityTypeFormComponentTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormComponentTest.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormComponentTest()
+  common = new EntityTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(TypeFormComponentTest.SUITE, () => {
+describe(EntityTypeFormComponentTest.SUITE, () => {
   test('validate type', testValidateType)
   test('validate property', testValidateProperty)
   test('validate type and property', testValidateTypeAndProperty)
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerAddProperty.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerAddProperty.test.js
similarity index 84%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerAddProperty.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerAddProperty.test.js
index f2e92f5fa96f96ed3706f0db0aeadaac975ce9b0..a52f02b915d4f29e90c3807cff2b457a841affdc 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerAddProperty.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerAddProperty.test.js
@@ -1,12 +1,12 @@
-import TypeFormControllerTest from '@srcTest/js/components/types/form/TypeFormControllerTest.js'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormControllerTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormControllerTest.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormControllerTest()
+  common = new EntityTypeFormControllerTest()
   common.beforeEach()
   common.init({
     id: 'TEST_OBJECT_ID',
@@ -18,7 +18,7 @@ afterEach(() => {
   common.afterEach()
 })
 
-describe(TypeFormControllerTest.SUITE, () => {
+describe(EntityTypeFormControllerTest.SUITE, () => {
   test('add property with a section selected', testAddWithSectionSelected)
   test('add property with a property selected', testAddWithPropertySelected)
 })
@@ -29,13 +29,13 @@ async function testAddWithSectionSelected() {
   )
 
   await common.controller.load()
-  common.controller.handleSelectionChange(TypeFormSelectionType.SECTION, {
+  common.controller.handleSelectionChange(EntityTypeFormSelectionType.SECTION, {
     id: 'section-1'
   })
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: {
         id: 'section-1'
       }
@@ -72,7 +72,7 @@ async function testAddWithSectionSelected() {
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: {
         id: 'property-3'
       }
@@ -116,13 +116,16 @@ async function testAddWithPropertySelected() {
   )
 
   await common.controller.load()
-  common.controller.handleSelectionChange(TypeFormSelectionType.PROPERTY, {
-    id: 'property-1'
-  })
+  common.controller.handleSelectionChange(
+    EntityTypeFormSelectionType.PROPERTY,
+    {
+      id: 'property-1'
+    }
+  )
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: {
         id: 'property-1'
       }
@@ -159,7 +162,7 @@ async function testAddWithPropertySelected() {
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: {
         id: 'property-3'
       }
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerAddSection.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerAddSection.test.js
similarity index 83%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerAddSection.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerAddSection.test.js
index 47999c155559154e7ed6166f5df6fbb6c677ddfe..bd623897dd4fd2a6224f265c3f63cc528cce8a88 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerAddSection.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerAddSection.test.js
@@ -1,12 +1,12 @@
-import TypeFormControllerTest from '@srcTest/js/components/types/form/TypeFormControllerTest.js'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormControllerTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormControllerTest.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormControllerTest()
+  common = new EntityTypeFormControllerTest()
   common.beforeEach()
   common.init({
     id: 'TEST_OBJECT_ID',
@@ -18,7 +18,7 @@ afterEach(() => {
   common.afterEach()
 })
 
-describe(TypeFormControllerTest.SUITE, () => {
+describe(EntityTypeFormControllerTest.SUITE, () => {
   test('add section with nothing selected', testAddWithNothingSelected)
   test('add section with a property selected', testAddWithPropertySelected)
   test('add section with a section selected', testAddWithSectionSelected)
@@ -51,7 +51,7 @@ async function testAddWithNothingSelected() {
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: {
         id: 'section-2'
       }
@@ -82,13 +82,16 @@ async function testAddWithPropertySelected() {
   )
 
   await common.controller.load()
-  common.controller.handleSelectionChange(TypeFormSelectionType.PROPERTY, {
-    id: 'property-0'
-  })
+  common.controller.handleSelectionChange(
+    EntityTypeFormSelectionType.PROPERTY,
+    {
+      id: 'property-0'
+    }
+  )
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: {
         id: 'property-0'
       }
@@ -111,7 +114,7 @@ async function testAddWithPropertySelected() {
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: {
         id: 'section-2'
       }
@@ -142,13 +145,13 @@ async function testAddWithSectionSelected() {
   )
 
   await common.controller.load()
-  common.controller.handleSelectionChange(TypeFormSelectionType.SECTION, {
+  common.controller.handleSelectionChange(EntityTypeFormSelectionType.SECTION, {
     id: 'section-0'
   })
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: {
         id: 'section-0'
       }
@@ -171,7 +174,7 @@ async function testAddWithSectionSelected() {
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: {
         id: 'section-2'
       }
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerChange.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerChange.test.js
similarity index 84%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerChange.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerChange.test.js
index 1547156aaf531ddace99fb84f5a0c074256ce0fb..a9ead3c4cb39e81053337388f7a9ebd16711282a 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerChange.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerChange.test.js
@@ -1,12 +1,12 @@
-import TypeFormControllerTest from '@srcTest/js/components/types/form/TypeFormControllerTest.js'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormControllerTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormControllerTest.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormControllerTest()
+  common = new EntityTypeFormControllerTest()
   common.beforeEach()
   common.init({
     id: 'TEST_OBJECT_ID',
@@ -18,7 +18,7 @@ afterEach(() => {
   common.afterEach()
 })
 
-describe(TypeFormControllerTest.SUITE, () => {
+describe(EntityTypeFormControllerTest.SUITE, () => {
   test('change type', testChangeType)
   test('change section', testChangeSection)
   test('change property', testChangeProperty)
@@ -37,7 +37,7 @@ async function testChangeType() {
     }
   })
 
-  common.controller.handleChange(TypeFormSelectionType.TYPE, {
+  common.controller.handleChange(EntityTypeFormSelectionType.TYPE, {
     field: 'description',
     value: 'NEW_DESCRIPTION'
   })
@@ -71,7 +71,7 @@ async function testChangeSection() {
     ]
   })
 
-  common.controller.handleChange(TypeFormSelectionType.SECTION, {
+  common.controller.handleChange(EntityTypeFormSelectionType.SECTION, {
     id: 'section-1',
     field: 'name',
     value: 'TEST_NAME'
@@ -118,7 +118,7 @@ async function testChangeProperty() {
     ]
   })
 
-  common.controller.handleChange(TypeFormSelectionType.PROPERTY, {
+  common.controller.handleChange(EntityTypeFormSelectionType.PROPERTY, {
     id: 'property-1',
     field: 'description',
     value: 'TEST_DESCRIPTION'
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerLoad.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerLoad.test.js
similarity index 91%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerLoad.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerLoad.test.js
index 7bc1fc7d76dcc98adb44ad5bbe0edbe9c6a79fc3..18c23455fd23aa7b563870868d552f8d2be7e450 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerLoad.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerLoad.test.js
@@ -1,16 +1,16 @@
-import TypeFormControllerTest from '@srcTest/js/components/types/form/TypeFormControllerTest.js'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormControllerTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormControllerTest.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormControllerTest()
+  common = new EntityTypeFormControllerTest()
   common.beforeEach()
 })
 
-describe(TypeFormControllerTest.SUITE, () => {
+describe(EntityTypeFormControllerTest.SUITE, () => {
   test('load successful existing', testLoadSuccessfulExisting)
   test('load successful new', testLoadSuccessfulNew)
   test('load maintains section selection', testLoadMaintainsSectionSelection)
@@ -144,17 +144,17 @@ async function testLoadMaintainsSectionSelection() {
   common.controller.handleAddProperty()
   common.controller.handleAddSection()
   common.controller.handleAddProperty()
-  common.controller.handleOrderChange(TypeFormSelectionType.SECTION, {
+  common.controller.handleOrderChange(EntityTypeFormSelectionType.SECTION, {
     fromIndex: 0,
     toIndex: 1
   })
-  common.controller.handleSelectionChange(TypeFormSelectionType.SECTION, {
+  common.controller.handleSelectionChange(EntityTypeFormSelectionType.SECTION, {
     id: 'section-0'
   })
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: { id: 'section-0' }
     },
     sections: [
@@ -175,7 +175,7 @@ async function testLoadMaintainsSectionSelection() {
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: { id: 'section-1' }
     },
     sections: [
@@ -208,17 +208,20 @@ async function testLoadMaintainsPropertySelection() {
   common.controller.handleAddProperty()
   common.controller.handleAddSection()
   common.controller.handleAddProperty()
-  common.controller.handleOrderChange(TypeFormSelectionType.SECTION, {
+  common.controller.handleOrderChange(EntityTypeFormSelectionType.SECTION, {
     fromIndex: 0,
     toIndex: 1
   })
-  common.controller.handleSelectionChange(TypeFormSelectionType.PROPERTY, {
-    id: 'property-1'
-  })
+  common.controller.handleSelectionChange(
+    EntityTypeFormSelectionType.PROPERTY,
+    {
+      id: 'property-1'
+    }
+  )
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: { id: 'property-1' }
     },
     sections: [
@@ -239,7 +242,7 @@ async function testLoadMaintainsPropertySelection() {
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: { id: 'property-2' }
     },
     sections: [
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerOrderChange.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerOrderChange.test.js
similarity index 85%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerOrderChange.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerOrderChange.test.js
index d1ea77c619d867ecd46cb80f08f9948f2cfe315e..8d68432f2070367176412da7fd8a7dd31068b2eb 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerOrderChange.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerOrderChange.test.js
@@ -1,12 +1,12 @@
-import TypeFormControllerTest from '@srcTest/js/components/types/form/TypeFormControllerTest.js'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormControllerTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormControllerTest.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormControllerTest()
+  common = new EntityTypeFormControllerTest()
   common.beforeEach()
   common.init({
     id: 'TEST_OBJECT_ID',
@@ -18,7 +18,7 @@ afterEach(() => {
   common.afterEach()
 })
 
-describe(TypeFormControllerTest.SUITE, () => {
+describe(EntityTypeFormControllerTest.SUITE, () => {
   test('move section', testMoveSection)
   test('move property within section', testMovePropertyWithinSection)
   test('move property between sections', testMovePropertyBetweenSections)
@@ -46,7 +46,7 @@ async function testMoveSection() {
     ]
   })
 
-  common.controller.handleOrderChange(TypeFormSelectionType.SECTION, {
+  common.controller.handleOrderChange(EntityTypeFormSelectionType.SECTION, {
     fromIndex: 0,
     toIndex: 1
   })
@@ -89,7 +89,7 @@ async function testMovePropertyWithinSection() {
     ]
   })
 
-  common.controller.handleOrderChange(TypeFormSelectionType.PROPERTY, {
+  common.controller.handleOrderChange(EntityTypeFormSelectionType.PROPERTY, {
     fromSectionId: 'section-1',
     toSectionId: 'section-1',
     fromIndex: 0,
@@ -134,7 +134,7 @@ async function testMovePropertyBetweenSections() {
     ]
   })
 
-  common.controller.handleOrderChange(TypeFormSelectionType.PROPERTY, {
+  common.controller.handleOrderChange(EntityTypeFormSelectionType.PROPERTY, {
     fromSectionId: 'section-1',
     toSectionId: 'section-0',
     fromIndex: 1,
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerRemove.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerRemove.test.js
similarity index 90%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerRemove.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerRemove.test.js
index abe8f9a152dea253b98dfbb4ea4279307a33941b..979c5f8ae8d83761e8a753afa99bfb76a3bb80d0 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerRemove.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerRemove.test.js
@@ -1,12 +1,12 @@
-import TypeFormControllerTest from '@srcTest/js/components/types/form/TypeFormControllerTest.js'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormControllerTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormControllerTest.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormControllerTest()
+  common = new EntityTypeFormControllerTest()
   common.beforeEach()
   common.init({
     id: 'TEST_OBJECT_ID',
@@ -18,7 +18,7 @@ afterEach(() => {
   common.afterEach()
 })
 
-describe(TypeFormControllerTest.SUITE, () => {
+describe(EntityTypeFormControllerTest.SUITE, () => {
   test('remove section confirmed', async () => {
     await testRemoveSectionConfirmed(0)
     await testRemoveSectionConfirmed(10)
@@ -48,13 +48,13 @@ async function testRemoveSectionConfirmed(usages) {
   )
 
   await common.controller.load()
-  common.controller.handleSelectionChange(TypeFormSelectionType.SECTION, {
+  common.controller.handleSelectionChange(EntityTypeFormSelectionType.SECTION, {
     id: 'section-0'
   })
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: {
         id: 'section-0'
       }
@@ -92,7 +92,7 @@ async function testRemoveSectionConfirmed(usages) {
   expect(common.context.getState()).toMatchObject({
     removeSectionDialogOpen: true,
     selection: {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: {
         id: 'section-0'
       }
@@ -162,13 +162,13 @@ async function testRemoveSectionCancelled(usages) {
   )
 
   await common.controller.load()
-  common.controller.handleSelectionChange(TypeFormSelectionType.SECTION, {
+  common.controller.handleSelectionChange(EntityTypeFormSelectionType.SECTION, {
     id: 'section-0'
   })
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: {
         id: 'section-0'
       }
@@ -206,7 +206,7 @@ async function testRemoveSectionCancelled(usages) {
   expect(common.context.getState()).toMatchObject({
     removeSectionDialogOpen: true,
     selection: {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: {
         id: 'section-0'
       }
@@ -245,7 +245,7 @@ async function testRemoveSectionCancelled(usages) {
   expect(common.context.getState()).toMatchObject({
     removeSectionDialogOpen: false,
     selection: {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: {
         id: 'section-0'
       }
@@ -291,13 +291,16 @@ async function testRemovePropertyConfirmed(usages) {
   )
 
   await common.controller.load()
-  common.controller.handleSelectionChange(TypeFormSelectionType.PROPERTY, {
-    id: 'property-1'
-  })
+  common.controller.handleSelectionChange(
+    EntityTypeFormSelectionType.PROPERTY,
+    {
+      id: 'property-1'
+    }
+  )
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: {
         id: 'property-1'
       }
@@ -335,7 +338,7 @@ async function testRemovePropertyConfirmed(usages) {
   expect(common.context.getState()).toMatchObject({
     removePropertyDialogOpen: true,
     selection: {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: {
         id: 'property-1'
       }
@@ -410,13 +413,16 @@ async function testRemovePropertyCancelled(usages) {
   )
 
   await common.controller.load()
-  common.controller.handleSelectionChange(TypeFormSelectionType.PROPERTY, {
-    id: 'property-1'
-  })
+  common.controller.handleSelectionChange(
+    EntityTypeFormSelectionType.PROPERTY,
+    {
+      id: 'property-1'
+    }
+  )
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: {
         id: 'property-1'
       }
@@ -454,7 +460,7 @@ async function testRemovePropertyCancelled(usages) {
   expect(common.context.getState()).toMatchObject({
     removePropertyDialogOpen: true,
     selection: {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: {
         id: 'property-1'
       }
@@ -493,7 +499,7 @@ async function testRemovePropertyCancelled(usages) {
   expect(common.context.getState()).toMatchObject({
     removePropertyDialogOpen: false,
     selection: {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: {
         id: 'property-1'
       }
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerSave.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerSave.test.js
similarity index 83%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerSave.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerSave.test.js
index c8bfc3c93b92b906bda9200b17d5d8a536753264..5435b6e7f60b6a6efa1ad904729d6b105e165548 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerSave.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerSave.test.js
@@ -1,12 +1,12 @@
-import TypeFormControllerTest from '@srcTest/js/components/types/form/TypeFormControllerTest.js'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormControllerTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormControllerTest.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormControllerTest()
+  common = new EntityTypeFormControllerTest()
   common.beforeEach()
   common.init({
     id: 'TEST_OBJECT_ID',
@@ -18,7 +18,7 @@ afterEach(() => {
   common.afterEach()
 })
 
-describe(TypeFormControllerTest.SUITE, () => {
+describe(EntityTypeFormControllerTest.SUITE, () => {
   test('save add property', testSaveAddProperty)
   test('save update property assignment', testSaveUpdatePropertyAssignment)
   test('save update property type', testSaveUpdatePropertyType)
@@ -43,22 +43,22 @@ async function testSaveAddProperty() {
   common.controller.handleAddSection()
   common.controller.handleAddProperty()
 
-  common.controller.handleChange(TypeFormSelectionType.PROPERTY, {
+  common.controller.handleChange(EntityTypeFormSelectionType.PROPERTY, {
     id: 'property-0',
     field: 'code',
     value: 'NEW_CODE'
   })
-  common.controller.handleChange(TypeFormSelectionType.PROPERTY, {
+  common.controller.handleChange(EntityTypeFormSelectionType.PROPERTY, {
     id: 'property-0',
     field: 'dataType',
     value: 'VARCHAR'
   })
-  common.controller.handleChange(TypeFormSelectionType.PROPERTY, {
+  common.controller.handleChange(EntityTypeFormSelectionType.PROPERTY, {
     id: 'property-0',
     field: 'label',
     value: 'NEW_LABEL'
   })
-  common.controller.handleChange(TypeFormSelectionType.PROPERTY, {
+  common.controller.handleChange(EntityTypeFormSelectionType.PROPERTY, {
     id: 'property-0',
     field: 'description',
     value: 'NEW_DESCRIPTION'
@@ -85,7 +85,7 @@ async function testSaveUpdatePropertyAssignment() {
 
   await common.controller.load()
 
-  common.controller.handleChange(TypeFormSelectionType.PROPERTY, {
+  common.controller.handleChange(EntityTypeFormSelectionType.PROPERTY, {
     id: 'property-0',
     field: 'mandatory',
     value: true
@@ -110,7 +110,7 @@ async function testSaveUpdatePropertyType() {
 
   await common.controller.load()
 
-  common.controller.handleChange(TypeFormSelectionType.PROPERTY, {
+  common.controller.handleChange(EntityTypeFormSelectionType.PROPERTY, {
     id: 'property-0',
     field: 'label',
     value: 'Updated label'
@@ -134,12 +134,16 @@ async function testSaveDeleteProperty() {
   )
   common.facade.loadPropertyUsages.mockReturnValue(Promise.resolve({}))
   common.facade.executeOperations.mockReturnValue(Promise.resolve({}))
+  common.facade.loadAssignments.mockReturnValue(Promise.resolve({}))
 
   await common.controller.load()
 
-  common.controller.handleSelectionChange(TypeFormSelectionType.PROPERTY, {
-    id: 'property-0'
-  })
+  common.controller.handleSelectionChange(
+    EntityTypeFormSelectionType.PROPERTY,
+    {
+      id: 'property-0'
+    }
+  )
   common.controller.handleRemove()
   common.controller.handleRemoveConfirm()
 
@@ -168,9 +172,12 @@ async function testSaveDeletePropertyLastAssignment() {
 
   await common.controller.load()
 
-  common.controller.handleSelectionChange(TypeFormSelectionType.PROPERTY, {
-    id: 'property-0'
-  })
+  common.controller.handleSelectionChange(
+    EntityTypeFormSelectionType.PROPERTY,
+    {
+      id: 'property-0'
+    }
+  )
   common.controller.handleRemove()
   common.controller.handleRemoveConfirm()
 
@@ -181,7 +188,8 @@ async function testSaveDeletePropertyLastAssignment() {
       SAMPLE_TYPE_WITH_TEST_PROPERTY.getCode(),
       TEST_PROPERTY_TYPE.getCode()
     ),
-    setPropertyAssignmentOperation(SAMPLE_TYPE_WITH_TEST_PROPERTY.getCode())
+    setPropertyAssignmentOperation(SAMPLE_TYPE_WITH_TEST_PROPERTY.getCode()),
+    deletePropertyTypeOperation(TEST_PROPERTY_TYPE.getCode())
   ])
 }
 
@@ -248,6 +256,15 @@ function deletePropertyAssignmentOperation(typeCode, propertyCode) {
   return new openbis.UpdateSampleTypesOperation([update])
 }
 
+function deletePropertyTypeOperation(propertyCode) {
+  const options = new openbis.PropertyTypeDeletionOptions()
+  options.setReason('deleted via ng_ui')
+  return new openbis.DeletePropertyTypesOperation(
+    [new openbis.PropertyTypePermId(propertyCode)],
+    options
+  )
+}
+
 function expectExecuteOperations(expectedOperations) {
   expect(common.facade.executeOperations).toHaveBeenCalledTimes(1)
   const actualOperations = common.facade.executeOperations.mock.calls[0][0]
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerSelectionChange.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerSelectionChange.test.js
similarity index 69%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerSelectionChange.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerSelectionChange.test.js
index 6ad77276e6d61f05c7714d1112ca69931bd2c3a0..56140c402240c41e6590642d7da94961a8d9dc82 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerSelectionChange.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerSelectionChange.test.js
@@ -1,12 +1,12 @@
-import TypeFormControllerTest from '@srcTest/js/components/types/form/TypeFormControllerTest.js'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormControllerTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormControllerTest.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormControllerTest()
+  common = new EntityTypeFormControllerTest()
   common.beforeEach()
   common.init({
     id: 'TEST_OBJECT_ID',
@@ -18,7 +18,7 @@ afterEach(() => {
   common.afterEach()
 })
 
-describe(TypeFormControllerTest.SUITE, () => {
+describe(EntityTypeFormControllerTest.SUITE, () => {
   test('select a section', testSelectSection)
   test('select a property', testSelectProperty)
 })
@@ -34,13 +34,13 @@ async function testSelectSection() {
     selection: null
   })
 
-  common.controller.handleSelectionChange(TypeFormSelectionType.SECTION, {
+  common.controller.handleSelectionChange(EntityTypeFormSelectionType.SECTION, {
     id: 'section-0'
   })
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.SECTION,
+      type: EntityTypeFormSelectionType.SECTION,
       params: {
         id: 'section-0'
       }
@@ -65,13 +65,16 @@ async function testSelectProperty() {
     selection: null
   })
 
-  common.controller.handleSelectionChange(TypeFormSelectionType.PROPERTY, {
-    id: 'property-0'
-  })
+  common.controller.handleSelectionChange(
+    EntityTypeFormSelectionType.PROPERTY,
+    {
+      id: 'property-0'
+    }
+  )
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: {
         id: 'property-0'
       }
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerTest.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerTest.js
new file mode 100644
index 0000000000000000000000000000000000000000..8ca9f8ccb83bd79888c092a8b0d1d08e5fd197d7
--- /dev/null
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerTest.js
@@ -0,0 +1,29 @@
+import ComponentContext from '@srcTest/js/components/common/ComponentContext.js'
+import EntityTypeFormControler from '@src/js/components/types/form/entitytype/EntityTypeFormController.js'
+import EntityTypeFormFacade from '@src/js/components/types/form/entitytype/EntityTypeFormFacade'
+
+jest.mock('@src/js/components/types/form/entitytype/EntityTypeFormFacade')
+
+export default class EntityTypeFormControllerTest {
+  static SUITE = 'EntityTypeFormController'
+
+  beforeEach() {
+    jest.resetAllMocks()
+  }
+
+  init(object) {
+    this.context = new ComponentContext()
+    this.context.setProps({
+      object
+    })
+    this.facade = new EntityTypeFormFacade()
+    this.controller = new EntityTypeFormControler(this.facade)
+    this.controller.init(this.context)
+  }
+
+  afterEach() {
+    expect(this.facade.loadType).toHaveBeenCalledWith(
+      this.context.getProps().object
+    )
+  }
+}
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerValidate.test.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerValidate.test.js
similarity index 79%
rename from openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerValidate.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerValidate.test.js
index 51216eee4aa2110f4df2ea1ac59ea19f254f0641..e96227f53cf313434aa64df3cad3650d1de2e7ca 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/TypeFormControllerValidate.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/EntityTypeFormControllerValidate.test.js
@@ -1,12 +1,12 @@
-import TypeFormControllerTest from '@srcTest/js/components/types/form/TypeFormControllerTest.js'
-import TypeFormSelectionType from '@src/js/components/types/form/TypeFormSelectionType.js'
+import EntityTypeFormControllerTest from '@srcTest/js/components/types/form/entitytype/EntityTypeFormControllerTest.js'
+import EntityTypeFormSelectionType from '@src/js/components/types/form/entitytype/EntityTypeFormSelectionType.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new TypeFormControllerTest()
+  common = new EntityTypeFormControllerTest()
   common.beforeEach()
   common.init({
     id: 'TEST_OBJECT_ID',
@@ -18,7 +18,7 @@ afterEach(() => {
   common.afterEach()
 })
 
-describe(TypeFormControllerTest.SUITE, () => {
+describe(EntityTypeFormControllerTest.SUITE, () => {
   test('validate', testValidate)
 })
 
@@ -33,7 +33,7 @@ async function testValidate() {
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.PROPERTY,
+      type: EntityTypeFormSelectionType.PROPERTY,
       params: {
         id: 'property-0'
       }
@@ -57,7 +57,7 @@ async function testValidate() {
 
   expect(common.context.getState()).toMatchObject({
     selection: {
-      type: TypeFormSelectionType.TYPE,
+      type: EntityTypeFormSelectionType.TYPE,
       params: {
         part: 'code'
       }
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormButtonsWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormButtonsWrapper.js
similarity index 91%
rename from openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormButtonsWrapper.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormButtonsWrapper.js
index 19141e6d39987ba660e8d88c355e15c2d6f95181..0e7e2ff83cf1ce521fc02d4035fdb1b94b209b43 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormButtonsWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormButtonsWrapper.js
@@ -2,7 +2,7 @@ import Button from '@src/js/components/common/form/Button.jsx'
 import ButtonWrapper from '@srcTest/js/components/common/form/wrapper/ButtonWrapper.js'
 import PageButtonsWrapper from '@srcTest/js/components/common/page/wrapper/PageButtonsWrapper.js'
 
-export default class TypeFormButtonsWrapper extends PageButtonsWrapper {
+export default class EntityTypeFormButtonsWrapper extends PageButtonsWrapper {
   getAddSection() {
     return new ButtonWrapper(
       this.findComponent(Button).filter({ name: 'addSection' })
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormParametersPropertyWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormParametersPropertyWrapper.js
similarity index 97%
rename from openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormParametersPropertyWrapper.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormParametersPropertyWrapper.js
index ecd899470713b51b2511b3e0dde729c92f8d5f5a..830125782c4c0aa4e1415e4927b51bc3cd550a91 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormParametersPropertyWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormParametersPropertyWrapper.js
@@ -8,7 +8,7 @@ import CheckboxFieldWrapper from '@srcTest/js/components/common/form/wrapper/Che
 import AutocompleterFieldWrapper from '@srcTest/js/components/common/form/wrapper/AutocompleterFieldWrapper.js'
 import PageParametersPanelWrapper from '@srcTest/js/components/common/page/wrapper/PageParametersPanelWrapper'
 
-export default class TypeFormParametersPropertyWrapper extends PageParametersPanelWrapper {
+export default class EntityTypeFormParametersPropertyWrapper extends PageParametersPanelWrapper {
   getCode() {
     const textFieldWrapper = this.findComponent(TextField).filter({
       name: 'code'
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormParametersSectionWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormParametersSectionWrapper.js
similarity index 83%
rename from openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormParametersSectionWrapper.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormParametersSectionWrapper.js
index 4efd1ec7b11db2844f4033dbf50093b556acb827..9614829d2e24f13aefd08cbc70edfe46f5c4eb61 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormParametersSectionWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormParametersSectionWrapper.js
@@ -2,7 +2,7 @@ import TextField from '@src/js/components/common/form/TextField.jsx'
 import TextFieldWrapper from '@srcTest/js/components/common/form/wrapper/TextFieldWrapper.js'
 import PageParametersPanelWrapper from '@srcTest/js/components/common/page/wrapper/PageParametersPanelWrapper'
 
-export default class TypeFormParametersSectionWrapper extends PageParametersPanelWrapper {
+export default class EntityTypeFormParametersSectionWrapper extends PageParametersPanelWrapper {
   getName() {
     return new TextFieldWrapper(
       this.findComponent(TextField).filter({ name: 'name' })
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormParametersTypeWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormParametersTypeWrapper.js
similarity index 94%
rename from openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormParametersTypeWrapper.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormParametersTypeWrapper.js
index ce8e5035f7ddc632ea7a96c2349765f2a84bfbd0..83e46927f49f286dff18a2ddf788b508c8d76fc5 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormParametersTypeWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormParametersTypeWrapper.js
@@ -6,7 +6,7 @@ import TextFieldWrapper from '@srcTest/js/components/common/form/wrapper/TextFie
 import SelectFieldWrapper from '@srcTest/js/components/common/form/wrapper/SelectFieldWrapper.js'
 import PageParametersPanelWrapper from '@srcTest/js/components/common/page/wrapper/PageParametersPanelWrapper'
 
-export default class TypeFormParametersTypeWrapper extends PageParametersPanelWrapper {
+export default class EntityTypeFormParametersTypeWrapper extends PageParametersPanelWrapper {
   getCode() {
     return new TextFieldWrapper(
       this.findComponent(TextField).filter({ name: 'code' })
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormParametersWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormParametersWrapper.js
new file mode 100644
index 0000000000000000000000000000000000000000..725ee2483718c59a293883dd6cb912e969a5180a
--- /dev/null
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormParametersWrapper.js
@@ -0,0 +1,35 @@
+import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
+import EntityTypeFormParametersType from '@src/js/components/types/form/entitytype/EntityTypeFormParametersType.jsx'
+import EntityTypeFormParametersProperty from '@src/js/components/types/form/entitytype/EntityTypeFormParametersProperty.jsx'
+import EntityTypeFormParametersSection from '@src/js/components/types/form/entitytype/EntityTypeFormParametersSection.jsx'
+import EntityTypeFormParametersTypeWrapper from './EntityTypeFormParametersTypeWrapper.js'
+import EntityTypeFormParametersPropertyWrapper from './EntityTypeFormParametersPropertyWrapper.js'
+import EntityTypeFormParametersSectionWrapper from './EntityTypeFormParametersSectionWrapper.js'
+
+export default class EntityTypeFormParametersWrapper extends BaseWrapper {
+  getType() {
+    return new EntityTypeFormParametersTypeWrapper(
+      this.findComponent(EntityTypeFormParametersType)
+    )
+  }
+
+  getProperty() {
+    return new EntityTypeFormParametersPropertyWrapper(
+      this.findComponent(EntityTypeFormParametersProperty)
+    )
+  }
+
+  getSection() {
+    return new EntityTypeFormParametersSectionWrapper(
+      this.findComponent(EntityTypeFormParametersSection)
+    )
+  }
+
+  toJSON() {
+    return {
+      type: this.getType().toJSON(),
+      property: this.getProperty().toJSON(),
+      section: this.getSection().toJSON()
+    }
+  }
+}
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormPreviewHeaderWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormPreviewHeaderWrapper.js
similarity index 92%
rename from openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormPreviewHeaderWrapper.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormPreviewHeaderWrapper.js
index a0a996e867e41e74d337feb64e9ce242efe667f6..50b9061209967f8ff3da3b1af3fcc3262370a3bd 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormPreviewHeaderWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormPreviewHeaderWrapper.js
@@ -3,7 +3,7 @@ import Header from '@src/js/components/common/form/Header.jsx'
 import TextField from '@src/js/components/common/form/TextField.jsx'
 import TextFieldWrapper from '@srcTest/js/components/common/form/wrapper/TextFieldWrapper.js'
 
-export default class TypeFormPreviewHeaderWrapper extends BaseWrapper {
+export default class EntityTypeFormPreviewHeaderWrapper extends BaseWrapper {
   getTitle() {
     return this.findComponent(Header)
   }
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormPreviewPropertyWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormPreviewPropertyWrapper.js
similarity index 93%
rename from openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormPreviewPropertyWrapper.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormPreviewPropertyWrapper.js
index 4528bfa771bacf21ac7db356af98fb320a6f78b8..3061ab41aa02e086e9da01e0dffd0c31f744d98e 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormPreviewPropertyWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormPreviewPropertyWrapper.js
@@ -2,7 +2,7 @@ import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
 import Message from '@src/js/components/common/form/Message.jsx'
 import MessageWrapper from '@srcTest/js/components/common/form/wrapper/MessageWrapper.js'
 
-export default class TypeFormPreviewPropertyWrapper extends BaseWrapper {
+export default class EntityTypeFormPreviewPropertyWrapper extends BaseWrapper {
   getCode() {
     const code = this.wrapper.find({ 'data-part': 'code' })
     if (code.exists()) {
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormPreviewSectionWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormPreviewSectionWrapper.js
similarity index 54%
rename from openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormPreviewSectionWrapper.js
rename to openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormPreviewSectionWrapper.js
index 5d80e468a24d5e1864453a5ef5ab03043dce3bd2..b84194219a51803e9f3b8eacdc3d0be1097333db 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormPreviewSectionWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormPreviewSectionWrapper.js
@@ -1,18 +1,22 @@
 import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
 import Typography from '@material-ui/core/Typography'
-import TypeFormPreviewProperty from '@src/js/components/types/form/TypeFormPreviewProperty.jsx'
-import TypeFormPreviewPropertyWrapper from './TypeFormPreviewPropertyWrapper.js'
+import EntityTypeFormPreviewProperty from '@src/js/components/types/form/entitytype/EntityTypeFormPreviewProperty.jsx'
+import EntityTypeFormPreviewPropertyWrapper from './EntityTypeFormPreviewPropertyWrapper.js'
 
-export default class TypeFormPreviewSectionWrapper extends BaseWrapper {
+export default class EntityTypeFormPreviewSectionWrapper extends BaseWrapper {
   getName() {
     return this.findComponent(Typography).filter({ 'data-part': 'name' })
   }
 
   getProperties() {
     const properties = []
-    this.findComponent(TypeFormPreviewProperty).forEach(propertyWrapper => {
-      properties.push(new TypeFormPreviewPropertyWrapper(propertyWrapper))
-    })
+    this.findComponent(EntityTypeFormPreviewProperty).forEach(
+      propertyWrapper => {
+        properties.push(
+          new EntityTypeFormPreviewPropertyWrapper(propertyWrapper)
+        )
+      }
+    )
     return properties
   }
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormPreviewWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormPreviewWrapper.js
new file mode 100644
index 0000000000000000000000000000000000000000..a44d5255b179a67b3b39517ec97741afebe8f5bf
--- /dev/null
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormPreviewWrapper.js
@@ -0,0 +1,28 @@
+import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
+import EntityTypeFormPreviewHeader from '@src/js/components/types/form/entitytype/EntityTypeFormPreviewHeader.jsx'
+import EntityTypeFormPreviewSection from '@src/js/components/types/form/entitytype/EntityTypeFormPreviewSection.jsx'
+import EntityTypeFormPreviewHeaderWrapper from './EntityTypeFormPreviewHeaderWrapper.js'
+import EntityTypeFormPreviewSectionWrapper from './EntityTypeFormPreviewSectionWrapper.js'
+
+export default class EntityTypeFormPreviewWrapper extends BaseWrapper {
+  getHeader() {
+    return new EntityTypeFormPreviewHeaderWrapper(
+      this.findComponent(EntityTypeFormPreviewHeader)
+    )
+  }
+
+  getSections() {
+    const sections = []
+    this.findComponent(EntityTypeFormPreviewSection).forEach(sectionWrapper => {
+      sections.push(new EntityTypeFormPreviewSectionWrapper(sectionWrapper))
+    })
+    return sections
+  }
+
+  toJSON() {
+    return {
+      header: this.getHeader().toJSON(),
+      sections: this.getSections().map(section => section.toJSON())
+    }
+  }
+}
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormWrapper.js
new file mode 100644
index 0000000000000000000000000000000000000000..f3f21af9b94217e3e60674a90b90ff8c4741935f
--- /dev/null
+++ b/openbis_ng_ui/srcTest/js/components/types/form/entitytype/wrapper/EntityTypeFormWrapper.js
@@ -0,0 +1,57 @@
+import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
+import ConfirmationDialog from '@src/js/components/common/dialog/ConfirmationDialog.jsx'
+import ConfirmationDialogWrapper from '@srcTest/js/components/common/dialog/wrapper/ConfirmationDialogWrapper.js'
+import EntityTypeFormPreview from '@src/js/components/types/form/entitytype/EntityTypeFormPreview.jsx'
+import EntityTypeFormParameters from '@src/js/components/types/form/entitytype/EntityTypeFormParameters.jsx'
+import EntityTypeFormButtons from '@src/js/components/types/form/entitytype/EntityTypeFormButtons.jsx'
+import EntityTypeFormPreviewWrapper from './EntityTypeFormPreviewWrapper.js'
+import EntityTypeFormParametersWrapper from './EntityTypeFormParametersWrapper.js'
+import EntityTypeFormButtonsWrapper from './EntityTypeFormButtonsWrapper.js'
+import EntityTypeFormDialogRemoveProperty from '@src/js/components/types/form/entitytype/EntityTypeFormDialogRemoveProperty.jsx'
+import EntityTypeFormDialogRemoveSection from '@src/js/components/types/form/entitytype/EntityTypeFormDialogRemoveSection.jsx'
+
+export default class EntityTypeFormWrapper extends BaseWrapper {
+  getPreview() {
+    return new EntityTypeFormPreviewWrapper(
+      this.findComponent(EntityTypeFormPreview)
+    )
+  }
+
+  getParameters() {
+    return new EntityTypeFormParametersWrapper(
+      this.findComponent(EntityTypeFormParameters)
+    )
+  }
+
+  getButtons() {
+    return new EntityTypeFormButtonsWrapper(
+      this.findComponent(EntityTypeFormButtons)
+    )
+  }
+
+  getRemovePropertyDialog() {
+    const propertyDialog = this.findComponent(
+      EntityTypeFormDialogRemoveProperty
+    )
+    return new ConfirmationDialogWrapper(
+      this.findComponent(ConfirmationDialog, propertyDialog)
+    )
+  }
+
+  getRemoveSectionDialog() {
+    const sectionDialog = this.findComponent(EntityTypeFormDialogRemoveSection)
+    return new ConfirmationDialogWrapper(
+      this.findComponent(ConfirmationDialog, sectionDialog)
+    )
+  }
+
+  toJSON() {
+    return {
+      preview: this.getPreview().toJSON(),
+      parameters: this.getParameters().toJSON(),
+      buttons: this.getButtons().toJSON(),
+      removePropertyDialog: this.getRemovePropertyDialog().toJSON(),
+      removeSectionDialog: this.getRemoveSectionDialog().toJSON()
+    }
+  }
+}
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentAddTerm.test.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentAddTerm.test.js
similarity index 91%
rename from openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentAddTerm.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentAddTerm.test.js
index a5bdf3e8b50ba4c89336a4c30bb33b3090ae2b94..c14b0df3e1d01f32408b314e0bfd8c0ec9e57f7b 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentAddTerm.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentAddTerm.test.js
@@ -1,14 +1,14 @@
-import VocabularyFormComponentTest from '@srcTest/js/components/types/form/VocabularyFormComponentTest.js'
+import VocabularyTypeFormComponentTest from '@srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentTest.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new VocabularyFormComponentTest()
+  common = new VocabularyTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(VocabularyFormComponentTest.SUITE, () => {
+describe(VocabularyTypeFormComponentTest.SUITE, () => {
   test('add term', testAddTerm)
 })
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentChangeTerm.test.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentChangeTerm.test.js
similarity index 89%
rename from openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentChangeTerm.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentChangeTerm.test.js
index 4333423be2e03a27704a82044b1918fe645d655a..3e731194edfae4d73b63446af66ca12117121275 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentChangeTerm.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentChangeTerm.test.js
@@ -1,14 +1,14 @@
-import VocabularyFormComponentTest from '@srcTest/js/components/types/form/VocabularyFormComponentTest.js'
+import VocabularyTypeFormComponentTest from '@srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentTest.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new VocabularyFormComponentTest()
+  common = new VocabularyTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(VocabularyFormComponentTest.SUITE, () => {
+describe(VocabularyTypeFormComponentTest.SUITE, () => {
   test('change term', testChangeTerm)
 })
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentChangeVocabulary.test.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentChangeVocabulary.test.js
similarity index 83%
rename from openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentChangeVocabulary.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentChangeVocabulary.test.js
index f6da632401c327e66d1786fd8ed494bdb9efe47b..9cef9c541d257cf24c2355d39b006f4273e5eff1 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentChangeVocabulary.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentChangeVocabulary.test.js
@@ -1,14 +1,14 @@
-import VocabularyFormComponentTest from '@srcTest/js/components/types/form/VocabularyFormComponentTest.js'
+import VocabularyTypeFormComponentTest from '@srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentTest.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new VocabularyFormComponentTest()
+  common = new VocabularyTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(VocabularyFormComponentTest.SUITE, () => {
+describe(VocabularyTypeFormComponentTest.SUITE, () => {
   test('change vocabulary', testChangeVocabulary)
 })
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentFilter.test.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentFilter.test.js
similarity index 89%
rename from openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentFilter.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentFilter.test.js
index 4932188f769e1a77139153df1d7b377eff7cb378..1449194da4e171ee808cc8009a03b74ab8d97609 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentFilter.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentFilter.test.js
@@ -1,14 +1,14 @@
-import VocabularyFormComponentTest from '@srcTest/js/components/types/form/VocabularyFormComponentTest.js'
+import VocabularyTypeFormComponentTest from '@srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentTest.js'
 import GridFilterOptions from '@src/js/components/common/grid/GridFilterOptions.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new VocabularyFormComponentTest()
+  common = new VocabularyTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(VocabularyFormComponentTest.SUITE, () => {
+describe(VocabularyTypeFormComponentTest.SUITE, () => {
   test('filter', testFilter)
 })
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentInternal.test.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentInternal.test.js
similarity index 86%
rename from openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentInternal.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentInternal.test.js
index b36c3fe1e59f5cc97a3573dc76f87e60204bc184..fd3c347d6d9c9ece123f31303e49237ed5c2271f 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentInternal.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentInternal.test.js
@@ -1,4 +1,4 @@
-import VocabularyFormComponentTest from '@srcTest/js/components/types/form/VocabularyFormComponentTest.js'
+import VocabularyTypeFormComponentTest from '@srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentTest.js'
 import objectTypes from '@src/js/common/consts/objectType.js'
 import openbis from '@srcTest/js/services/openbis.js'
 import fixture from '@srcTest/js/common/fixture.js'
@@ -6,11 +6,11 @@ import fixture from '@srcTest/js/common/fixture.js'
 let common = null
 
 beforeEach(() => {
-  common = new VocabularyFormComponentTest()
+  common = new VocabularyTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(VocabularyFormComponentTest.SUITE, () => {
+describe(VocabularyTypeFormComponentTest.SUITE, () => {
   test('internal', testInternal)
 })
 
@@ -67,8 +67,7 @@ async function doTestInternal(
           ? [
               {
                 type: 'lock',
-                text:
-                  'This is a system internal vocabulary. The vocabulary parameters cannot be changed. The vocabulary cannot be removed.'
+                text: 'This is a system internal vocabulary. The vocabulary parameters cannot be changed. The vocabulary cannot be removed.'
               }
             ]
           : [],
@@ -99,8 +98,7 @@ async function doTestInternal(
           ? [
               {
                 type: 'lock',
-                text:
-                  'This is a system internal term. The term parameters cannot be changed. The term cannot be removed.'
+                text: 'This is a system internal term. The term parameters cannot be changed. The term cannot be removed.'
               }
             ]
           : [],
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentLoad.test.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentLoad.test.js
similarity index 93%
rename from openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentLoad.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentLoad.test.js
index 1a169ee0283497f6ff6969579cc9b708e75969d2..ee0e0a8b0946d05a21b71c5c5d36ca44f7db5dba 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentLoad.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentLoad.test.js
@@ -1,14 +1,14 @@
-import VocabularyFormComponentTest from '@srcTest/js/components/types/form/VocabularyFormComponentTest.js'
+import VocabularyTypeFormComponentTest from '@srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentTest.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new VocabularyFormComponentTest()
+  common = new VocabularyTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(VocabularyFormComponentTest.SUITE, () => {
+describe(VocabularyTypeFormComponentTest.SUITE, () => {
   test('load new', testLoadNew)
   test('load existing', testLoadExisting)
 })
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentPage.test.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentPage.test.js
similarity index 90%
rename from openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentPage.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentPage.test.js
index 48255d33ee7a80815b477cfaccc5cc7bca755751..5c84516ab1ac51ebf45442b511ccf4077e1bea0c 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentPage.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentPage.test.js
@@ -1,13 +1,13 @@
-import VocabularyFormComponentTest from '@srcTest/js/components/types/form/VocabularyFormComponentTest.js'
+import VocabularyTypeFormComponentTest from '@srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentTest.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new VocabularyFormComponentTest()
+  common = new VocabularyTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(VocabularyFormComponentTest.SUITE, () => {
+describe(VocabularyTypeFormComponentTest.SUITE, () => {
   test('page', testPage)
 })
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentRemoveTerm.test.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentRemoveTerm.test.js
similarity index 91%
rename from openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentRemoveTerm.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentRemoveTerm.test.js
index 3e805934dcb5613732bed9e5d8d733e0261adfcc..c6fbe4f80acc95a69b14f8b7e3e12eb9b17b317d 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentRemoveTerm.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentRemoveTerm.test.js
@@ -1,14 +1,14 @@
-import VocabularyFormComponentTest from '@srcTest/js/components/types/form/VocabularyFormComponentTest.js'
+import VocabularyTypeFormComponentTest from '@srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentTest.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new VocabularyFormComponentTest()
+  common = new VocabularyTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(VocabularyFormComponentTest.SUITE, () => {
+describe(VocabularyTypeFormComponentTest.SUITE, () => {
   test('remove term', testRemoveTerm)
 })
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentSelectTerm.test.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentSelectTerm.test.js
similarity index 90%
rename from openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentSelectTerm.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentSelectTerm.test.js
index bb0b747b71b8394fa67b84e1d903f25dec1a5194..965af049393dd3821c1a688641ea7da670b8132d 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentSelectTerm.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentSelectTerm.test.js
@@ -1,14 +1,14 @@
-import VocabularyFormComponentTest from '@srcTest/js/components/types/form/VocabularyFormComponentTest.js'
+import VocabularyTypeFormComponentTest from '@srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentTest.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new VocabularyFormComponentTest()
+  common = new VocabularyTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(VocabularyFormComponentTest.SUITE, () => {
+describe(VocabularyTypeFormComponentTest.SUITE, () => {
   test('select term', testSelectTerm)
   test('follow selected term', testFollowSelectedTerm)
 })
@@ -127,8 +127,7 @@ async function testFollowSelectedTerm() {
         messages: [
           {
             type: 'warning',
-            text:
-              'The selected object is currently not visible in the list due to the chosen filtering and paging.'
+            text: 'The selected object is currently not visible in the list due to the chosen filtering and paging.'
           }
         ]
       }
@@ -208,8 +207,7 @@ async function testFollowSelectedTerm() {
         messages: [
           {
             type: 'warning',
-            text:
-              'The selected object is currently not visible in the list due to the chosen filtering and paging.'
+            text: 'The selected object is currently not visible in the list due to the chosen filtering and paging.'
           }
         ]
       }
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentSort.test.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentSort.test.js
similarity index 88%
rename from openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentSort.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentSort.test.js
index 8d7706511ad06cda5bd7022077d64c300a1e1818..2df4e2453ad13bc6ffc569f965355ca7046a109f 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentSort.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentSort.test.js
@@ -1,13 +1,13 @@
-import VocabularyFormComponentTest from '@srcTest/js/components/types/form/VocabularyFormComponentTest.js'
+import VocabularyTypeFormComponentTest from '@srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentTest.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new VocabularyFormComponentTest()
+  common = new VocabularyTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(VocabularyFormComponentTest.SUITE, () => {
+describe(VocabularyTypeFormComponentTest.SUITE, () => {
   test('sort', testSort)
 })
 
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentTest.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentTest.js
new file mode 100644
index 0000000000000000000000000000000000000000..c8dd70a55f8d244c7cab9631a906bed4cf0dd35f
--- /dev/null
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentTest.js
@@ -0,0 +1,48 @@
+import React from 'react'
+import ComponentTest from '@srcTest/js/components/common/ComponentTest.js'
+import VocabularyTypeForm from '@src/js/components/types/form/vocabularytype/VocabularyTypeForm.jsx'
+import VocabularyTypeFormWrapper from '@srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormWrapper.js'
+import VocabularyTypeFormController from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormController.js'
+import VocabularyTypeFormFacade from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormFacade'
+import objectTypes from '@src/js/common/consts/objectType.js'
+
+jest.mock(
+  '@src/js/components/types/form/vocabularytype/VocabularyTypeFormFacade'
+)
+
+export default class VocabularyTypeFormComponentTest extends ComponentTest {
+  static SUITE = 'VocabularyTypeFormComponent'
+
+  constructor() {
+    super(
+      object => (
+        <VocabularyTypeForm object={object} controller={this.controller} />
+      ),
+      wrapper => new VocabularyTypeFormWrapper(wrapper)
+    )
+    this.facade = null
+    this.controller = null
+  }
+
+  async beforeEach() {
+    super.beforeEach()
+
+    this.facade = new VocabularyTypeFormFacade()
+    this.controller = new VocabularyTypeFormController(this.facade)
+  }
+
+  async mountNew() {
+    return await this.mount({
+      type: objectTypes.NEW_VOCABULARY_TYPE
+    })
+  }
+
+  async mountExisting(vocabulary) {
+    this.facade.loadVocabulary.mockReturnValue(Promise.resolve(vocabulary))
+
+    return await this.mount({
+      id: vocabulary.getCode(),
+      type: objectTypes.VOCABULARY_TYPE
+    })
+  }
+}
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentValidate.test.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentValidate.test.js
similarity index 94%
rename from openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentValidate.test.js
rename to openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentValidate.test.js
index d0f9d7d02eb569a69c92d90acb965dc4b07e27d1..7077f319e56da292f3d163f0ab0ab7cceb874692 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/VocabularyFormComponentValidate.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentValidate.test.js
@@ -1,14 +1,14 @@
-import VocabularyFormComponentTest from '@srcTest/js/components/types/form/VocabularyFormComponentTest.js'
+import VocabularyTypeFormComponentTest from '@srcTest/js/components/types/form/vocabularytype/VocabularyTypeFormComponentTest.js'
 import fixture from '@srcTest/js/common/fixture.js'
 
 let common = null
 
 beforeEach(() => {
-  common = new VocabularyFormComponentTest()
+  common = new VocabularyTypeFormComponentTest()
   common.beforeEach()
 })
 
-describe(VocabularyFormComponentTest.SUITE, () => {
+describe(VocabularyTypeFormComponentTest.SUITE, () => {
   test('validate term', testValidateTerm)
   test('validate vocabulary', testValidateVocabulary)
 })
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormButtonsWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormButtonsWrapper.js
similarity index 88%
rename from openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormButtonsWrapper.js
rename to openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormButtonsWrapper.js
index 4a130c959b9eb91c7fc3254750fe57d110b5e270..77e3a249638b54965c8939e3ba1b18641d553403 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormButtonsWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormButtonsWrapper.js
@@ -2,7 +2,7 @@ import Button from '@src/js/components/common/form/Button.jsx'
 import ButtonWrapper from '@srcTest/js/components/common/form/wrapper/ButtonWrapper.js'
 import PageButtonsWrapper from '@srcTest/js/components/common/page/wrapper/PageButtonsWrapper.js'
 
-export default class VocabularyFormButtonsWrapper extends PageButtonsWrapper {
+export default class VocabularyTypeFormButtonsWrapper extends PageButtonsWrapper {
   getAddTerm() {
     return new ButtonWrapper(
       this.findComponent(Button).filter({ name: 'addTerm' })
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormParametersTermWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormParametersTermWrapper.js
similarity index 92%
rename from openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormParametersTermWrapper.js
rename to openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormParametersTermWrapper.js
index f03924715cf7d577532444148060a56a437c9a4e..a8ed21c5f473f693bbace09ac28990de1e7d4472 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormParametersTermWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormParametersTermWrapper.js
@@ -4,7 +4,7 @@ import CheckboxFieldWrapper from '@srcTest/js/components/common/form/wrapper/Che
 import TextFieldWrapper from '@srcTest/js/components/common/form/wrapper/TextFieldWrapper.js'
 import PageParametersPanelWrapper from '@srcTest/js/components/common/page/wrapper/PageParametersPanelWrapper'
 
-export default class VocabularyFormParametersTermWrapper extends PageParametersPanelWrapper {
+export default class VocabularyTypeFormParametersTermWrapper extends PageParametersPanelWrapper {
   getCode() {
     return new TextFieldWrapper(
       this.findComponent(TextField).filter({ name: 'code' })
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormParametersVocabularyWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormParametersVocabularyWrapper.js
similarity index 89%
rename from openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormParametersVocabularyWrapper.js
rename to openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormParametersVocabularyWrapper.js
index 3154eaf28b020d935e79c666e75744701065de5f..21530ed9d7290a127082ffc77c31de5c73fb7a40 100644
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormParametersVocabularyWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormParametersVocabularyWrapper.js
@@ -2,7 +2,7 @@ import TextField from '@src/js/components/common/form/TextField.jsx'
 import TextFieldWrapper from '@srcTest/js/components/common/form/wrapper/TextFieldWrapper.js'
 import PageParametersPanelWrapper from '@srcTest/js/components/common/page/wrapper/PageParametersPanelWrapper'
 
-export default class VocabularyFormParametersVocabularyWrapper extends PageParametersPanelWrapper {
+export default class VocabularyTypeFormParametersVocabularyWrapper extends PageParametersPanelWrapper {
   getCode() {
     return new TextFieldWrapper(
       this.findComponent(TextField).filter({ name: 'code' })
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormParametersWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormParametersWrapper.js
new file mode 100644
index 0000000000000000000000000000000000000000..7e1d27049c6ef61ae944f9eda9228d6423201fa3
--- /dev/null
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormParametersWrapper.js
@@ -0,0 +1,26 @@
+import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
+import VocabularyTypeFormParametersVocabulary from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormParametersVocabulary.jsx'
+import VocabularyTypeFormParametersVocabularyWrapper from '@srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormParametersVocabularyWrapper.js'
+import VocabularyTypeFormParametersTerm from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormParametersTerm.jsx'
+import VocabularyTypeFormParametersTermWrapper from '@srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormParametersTermWrapper.js'
+
+export default class VocabularyTypeFormParametersWrapper extends BaseWrapper {
+  getVocabulary() {
+    return new VocabularyTypeFormParametersVocabularyWrapper(
+      this.findComponent(VocabularyTypeFormParametersVocabulary)
+    )
+  }
+
+  getTerm() {
+    return new VocabularyTypeFormParametersTermWrapper(
+      this.findComponent(VocabularyTypeFormParametersTerm)
+    )
+  }
+
+  toJSON() {
+    return {
+      vocabulary: this.getVocabulary().toJSON(),
+      term: this.getTerm().toJSON()
+    }
+  }
+}
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormWrapper.js
new file mode 100644
index 0000000000000000000000000000000000000000..4b718d1ce92eaf3c3e2bd36b32691ff3d506c366
--- /dev/null
+++ b/openbis_ng_ui/srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormWrapper.js
@@ -0,0 +1,33 @@
+import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
+import Grid from '@src/js/components/common/grid/Grid.jsx'
+import GridWrapper from '@srcTest/js/components/common/grid/wrapper/GridWrapper.js'
+import VocabularyTypeFormParameters from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormParameters.jsx'
+import VocabularyTypeFormParametersWrapper from '@srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormParametersWrapper.js'
+import VocabularyTypeFormButtons from '@src/js/components/types/form/vocabularytype/VocabularyTypeFormButtons.jsx'
+import VocabularyTypeFormButtonsWrapper from '@srcTest/js/components/types/form/vocabularytype/wrapper/VocabularyTypeFormButtonsWrapper.js'
+
+export default class VocabularyTypeFormWrapper extends BaseWrapper {
+  getGrid() {
+    return new GridWrapper(this.findComponent(Grid))
+  }
+
+  getParameters() {
+    return new VocabularyTypeFormParametersWrapper(
+      this.findComponent(VocabularyTypeFormParameters)
+    )
+  }
+
+  getButtons() {
+    return new VocabularyTypeFormButtonsWrapper(
+      this.findComponent(VocabularyTypeFormButtons)
+    )
+  }
+
+  toJSON() {
+    return {
+      grid: this.getGrid().toJSON(),
+      parameters: this.getParameters().toJSON(),
+      buttons: this.getButtons().toJSON()
+    }
+  }
+}
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormParametersWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormParametersWrapper.js
deleted file mode 100644
index aa374a297b259065fca03e9123b2553db2ffc93f..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormParametersWrapper.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
-import TypeFormParametersType from '@src/js/components/types/form/TypeFormParametersType.jsx'
-import TypeFormParametersProperty from '@src/js/components/types/form/TypeFormParametersProperty.jsx'
-import TypeFormParametersSection from '@src/js/components/types/form/TypeFormParametersSection.jsx'
-import TypeFormParametersTypeWrapper from './TypeFormParametersTypeWrapper.js'
-import TypeFormParametersPropertyWrapper from './TypeFormParametersPropertyWrapper.js'
-import TypeFormParametersSectionWrapper from './TypeFormParametersSectionWrapper.js'
-
-export default class TypeFormParametersWrapper extends BaseWrapper {
-  getType() {
-    return new TypeFormParametersTypeWrapper(
-      this.findComponent(TypeFormParametersType)
-    )
-  }
-
-  getProperty() {
-    return new TypeFormParametersPropertyWrapper(
-      this.findComponent(TypeFormParametersProperty)
-    )
-  }
-
-  getSection() {
-    return new TypeFormParametersSectionWrapper(
-      this.findComponent(TypeFormParametersSection)
-    )
-  }
-
-  toJSON() {
-    return {
-      type: this.getType().toJSON(),
-      property: this.getProperty().toJSON(),
-      section: this.getSection().toJSON()
-    }
-  }
-}
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormPreviewWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormPreviewWrapper.js
deleted file mode 100644
index 591c24bd02ade25d349fb63a8732c2ea5a767525..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormPreviewWrapper.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
-import TypeFormPreviewHeader from '@src/js/components/types/form/TypeFormPreviewHeader.jsx'
-import TypeFormPreviewSection from '@src/js/components/types/form/TypeFormPreviewSection.jsx'
-import TypeFormPreviewHeaderWrapper from './TypeFormPreviewHeaderWrapper.js'
-import TypeFormPreviewSectionWrapper from './TypeFormPreviewSectionWrapper.js'
-
-export default class TypeFormPreviewWrapper extends BaseWrapper {
-  getHeader() {
-    return new TypeFormPreviewHeaderWrapper(
-      this.findComponent(TypeFormPreviewHeader)
-    )
-  }
-
-  getSections() {
-    const sections = []
-    this.findComponent(TypeFormPreviewSection).forEach(sectionWrapper => {
-      sections.push(new TypeFormPreviewSectionWrapper(sectionWrapper))
-    })
-    return sections
-  }
-
-  toJSON() {
-    return {
-      header: this.getHeader().toJSON(),
-      sections: this.getSections().map(section => section.toJSON())
-    }
-  }
-}
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormWrapper.js
deleted file mode 100644
index 369ffc54489ef7db8526566a2d8e07ccc51a6fcf..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/TypeFormWrapper.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
-import ConfirmationDialog from '@src/js/components/common/dialog/ConfirmationDialog.jsx'
-import ConfirmationDialogWrapper from '@srcTest/js/components/common/dialog/wrapper/ConfirmationDialogWrapper.js'
-import TypeFormPreview from '@src/js/components/types/form/TypeFormPreview.jsx'
-import TypeFormParameters from '@src/js/components/types/form/TypeFormParameters.jsx'
-import TypeFormButtons from '@src/js/components/types/form/TypeFormButtons.jsx'
-import TypeFormPreviewWrapper from './TypeFormPreviewWrapper.js'
-import TypeFormParametersWrapper from './TypeFormParametersWrapper.js'
-import TypeFormButtonsWrapper from './TypeFormButtonsWrapper.js'
-import TypeFormDialogRemoveProperty from '@src/js/components/types/form/TypeFormDialogRemoveProperty.jsx'
-import TypeFormDialogRemoveSection from '@src/js/components/types/form/TypeFormDialogRemoveSection.jsx'
-
-export default class TypeFormWrapper extends BaseWrapper {
-  getPreview() {
-    return new TypeFormPreviewWrapper(this.findComponent(TypeFormPreview))
-  }
-
-  getParameters() {
-    return new TypeFormParametersWrapper(this.findComponent(TypeFormParameters))
-  }
-
-  getButtons() {
-    return new TypeFormButtonsWrapper(this.findComponent(TypeFormButtons))
-  }
-
-  getRemovePropertyDialog() {
-    const propertyDialog = this.findComponent(TypeFormDialogRemoveProperty)
-    return new ConfirmationDialogWrapper(
-      this.findComponent(ConfirmationDialog, propertyDialog)
-    )
-  }
-
-  getRemoveSectionDialog() {
-    const sectionDialog = this.findComponent(TypeFormDialogRemoveSection)
-    return new ConfirmationDialogWrapper(
-      this.findComponent(ConfirmationDialog, sectionDialog)
-    )
-  }
-
-  toJSON() {
-    return {
-      preview: this.getPreview().toJSON(),
-      parameters: this.getParameters().toJSON(),
-      buttons: this.getButtons().toJSON(),
-      removePropertyDialog: this.getRemovePropertyDialog().toJSON(),
-      removeSectionDialog: this.getRemoveSectionDialog().toJSON()
-    }
-  }
-}
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormParametersWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormParametersWrapper.js
deleted file mode 100644
index 4929f018f9c1c8cce67d7544d79bad2180978171..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormParametersWrapper.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
-import VocabularyFormParametersVocabulary from '@src/js/components/types/form/VocabularyFormParametersVocabulary.jsx'
-import VocabularyFormParametersVocabularyWrapper from './VocabularyFormParametersVocabularyWrapper.js'
-import VocabularyFormParametersTerm from '@src/js/components/types/form/VocabularyFormParametersTerm.jsx'
-import VocabularyFormParametersTermWrapper from './VocabularyFormParametersTermWrapper.js'
-
-export default class VocabularyFormParametersWrapper extends BaseWrapper {
-  getVocabulary() {
-    return new VocabularyFormParametersVocabularyWrapper(
-      this.findComponent(VocabularyFormParametersVocabulary)
-    )
-  }
-
-  getTerm() {
-    return new VocabularyFormParametersTermWrapper(
-      this.findComponent(VocabularyFormParametersTerm)
-    )
-  }
-
-  toJSON() {
-    return {
-      vocabulary: this.getVocabulary().toJSON(),
-      term: this.getTerm().toJSON()
-    }
-  }
-}
diff --git a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormWrapper.js b/openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormWrapper.js
deleted file mode 100644
index b5ed45eed73d890d78abc7421178032cba1d9d2c..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/srcTest/js/components/types/form/wrapper/VocabularyFormWrapper.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
-import Grid from '@src/js/components/common/grid/Grid.jsx'
-import GridWrapper from '@srcTest/js/components/common/grid/wrapper/GridWrapper.js'
-import VocabularyFormParameters from '@src/js/components/types/form/VocabularyFormParameters.jsx'
-import VocabularyFormParametersWrapper from '@srcTest/js/components/types/form/wrapper/VocabularyFormParametersWrapper.js'
-import VocabularyFormButtons from '@src/js/components/types/form/VocabularyFormButtons.jsx'
-import VocabularyFormButtonsWrapper from '@srcTest/js/components/types/form/wrapper/VocabularyFormButtonsWrapper.js'
-
-export default class VocabularyFormWrapper extends BaseWrapper {
-  getGrid() {
-    return new GridWrapper(this.findComponent(Grid))
-  }
-
-  getParameters() {
-    return new VocabularyFormParametersWrapper(
-      this.findComponent(VocabularyFormParameters)
-    )
-  }
-
-  getButtons() {
-    return new VocabularyFormButtonsWrapper(
-      this.findComponent(VocabularyFormButtons)
-    )
-  }
-
-  toJSON() {
-    return {
-      grid: this.getGrid().toJSON(),
-      parameters: this.getParameters().toJSON(),
-      buttons: this.getButtons().toJSON()
-    }
-  }
-}
diff --git a/openbis_ng_ui/srcTest/js/components/types/search/TypeSearchComponentLoad.test.js b/openbis_ng_ui/srcTest/js/components/types/search/TypeSearchComponentLoad.test.js
index 487fa02a1d81a68d3b86f9dbf8257413e469f8b6..30997a456294ae2d1330474de3e6ff24f50adfcf 100644
--- a/openbis_ng_ui/srcTest/js/components/types/search/TypeSearchComponentLoad.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/search/TypeSearchComponentLoad.test.js
@@ -32,7 +32,9 @@ async function testLoadWithSearchText(resultsFound) {
     testMaterialType,
     anotherMaterialType,
     testVocabularyType,
-    anotherVocabularyType
+    anotherVocabularyType,
+    testPropertyType,
+    anotherPropertyType
   } = TypeSearchTestData
 
   openbis.mockSearchSampleTypes(
@@ -50,6 +52,10 @@ async function testLoadWithSearchText(resultsFound) {
   openbis.mockSearchVocabularies(
     resultsFound ? [testVocabularyType, anotherVocabularyType] : []
   )
+  openbis.mockSearchPropertyTypes(
+    resultsFound ? [testPropertyType, anotherPropertyType] : []
+  )
+  openbis.mockSearchPropertyAssignments([])
 
   const form = await common.mount({ searchText: 'test' })
 
@@ -210,6 +216,59 @@ async function testLoadWithSearchText(resultsFound) {
             }
           }
         ]
+      },
+      propertyTypes: {
+        columns: [
+          {
+            name: 'code',
+            label: 'Code'
+          },
+          {
+            name: 'label',
+            label: 'Label'
+          },
+          {
+            name: 'description',
+            label: 'Description'
+          },
+          {
+            name: 'dataType',
+            label: 'Data Type'
+          },
+          {
+            name: 'vocabulary',
+            label: 'Vocabulary Type'
+          },
+          {
+            name: 'materialType',
+            label: 'Material Type'
+          },
+          {
+            name: 'sampleType',
+            label: 'Object Type'
+          },
+          {
+            name: 'schema',
+            label: 'XML Schema'
+          },
+          {
+            name: 'transformation',
+            label: 'XSLT Script'
+          },
+          {
+            name: 'usages',
+            label: 'Usages'
+          }
+        ],
+        rows: [
+          {
+            values: {
+              code: testPropertyType.getCode(),
+              description: testPropertyType.getDescription(),
+              label: testPropertyType.getLabel()
+            }
+          }
+        ]
       }
     })
   } else {
@@ -224,7 +283,8 @@ async function testLoadWithSearchText(resultsFound) {
       collectionTypes: null,
       dataSetTypes: null,
       materialTypes: null,
-      vocabularyTypes: null
+      vocabularyTypes: null,
+      propertyTypes: null
     })
   }
 }
@@ -297,6 +357,7 @@ async function testLoadWithObjectType(resultsFound) {
     collectionTypes: null,
     dataSetTypes: null,
     materialTypes: null,
-    vocabularyTypes: null
+    vocabularyTypes: null,
+    propertyTypes: null
   })
 }
diff --git a/openbis_ng_ui/srcTest/js/components/types/search/TypeSearchTestData.js b/openbis_ng_ui/srcTest/js/components/types/search/TypeSearchTestData.js
index f238e530e05348b3f839a5016ba6a95adf1736c0..537a2fbc4625ac5762742cf1b3c78ce96afbf69b 100644
--- a/openbis_ng_ui/srcTest/js/components/types/search/TypeSearchTestData.js
+++ b/openbis_ng_ui/srcTest/js/components/types/search/TypeSearchTestData.js
@@ -58,6 +58,15 @@ const anotherVocabularyType = new openbis.Vocabulary()
 anotherVocabularyType.setCode('ANOTHER_VOCABULARY_TYPE')
 anotherVocabularyType.setDescription('Another Description')
 
+const testPropertyType = new openbis.PropertyType()
+testPropertyType.setCode('TEST_PROPERTY_TYPE')
+testPropertyType.setDescription('Test Description')
+testPropertyType.setLabel('Test Label')
+
+const anotherPropertyType = new openbis.PropertyType()
+anotherPropertyType.setCode('ANOTHER_PROPERTY_TYPE')
+anotherPropertyType.setDescription('Another Description')
+
 export default {
   testObjectType,
   anotherObjectType,
@@ -68,5 +77,7 @@ export default {
   testMaterialType,
   anotherMaterialType,
   testVocabularyType,
-  anotherVocabularyType
+  anotherVocabularyType,
+  testPropertyType,
+  anotherPropertyType
 }
diff --git a/openbis_ng_ui/srcTest/js/components/types/search/wrapper/TypeSearchWrapper.js b/openbis_ng_ui/srcTest/js/components/types/search/wrapper/TypeSearchWrapper.js
index 0b00bca72dacc496c785b702dbee47ae2b5887fb..dcf87ee58dd73b3fb186dd8ef4aeba564d600f49 100644
--- a/openbis_ng_ui/srcTest/js/components/types/search/wrapper/TypeSearchWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/types/search/wrapper/TypeSearchWrapper.js
@@ -54,6 +54,14 @@ export default class TypeSearchWrapper extends BaseWrapper {
     )
   }
 
+  getPropertyTypes() {
+    return new GridWrapper(
+      this.findComponent(Grid).filter({
+        id: ids.PROPERTY_TYPES_GRID_ID
+      })
+    )
+  }
+
   toJSON() {
     return {
       messages: this.getMessages().map(message => message.toJSON()),
@@ -61,7 +69,8 @@ export default class TypeSearchWrapper extends BaseWrapper {
       collectionTypes: this.getCollectionTypes().toJSON(),
       dataSetTypes: this.getDataSetTypes().toJSON(),
       materialTypes: this.getMaterialTypes().toJSON(),
-      vocabularyTypes: this.getVocabularyTypes().toJSON()
+      vocabularyTypes: this.getVocabularyTypes().toJSON(),
+      propertyTypes: this.getPropertyTypes().toJSON()
     }
   }
 }
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentAddGroup.test.js b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentAddGroup.test.js
similarity index 98%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentAddGroup.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentAddGroup.test.js
index 0acbc4aca94e5b83188d0ab7f8ff406529034409..cd3c2fccc3e930329c160b94ff61b5723911dd85 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentAddGroup.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentAddGroup.test.js
@@ -1,5 +1,5 @@
-import UserFormComponentTest from '@srcTest/js/components/users/form/UserFormComponentTest.js'
-import UserFormTestData from '@srcTest/js/components/users/form/UserFormTestData.js'
+import UserFormComponentTest from '@srcTest/js/components/users/form/user/UserFormComponentTest.js'
+import UserFormTestData from '@srcTest/js/components/users/form/user/UserFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentAddRole.test.js b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentAddRole.test.js
similarity index 99%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentAddRole.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentAddRole.test.js
index 9637be685e6e0f50b9b2969f4580e29e5f2a5826..349391971ed863d96ef0d5b38ea24971152ca0d1 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentAddRole.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentAddRole.test.js
@@ -1,5 +1,5 @@
-import UserFormComponentTest from '@srcTest/js/components/users/form/UserFormComponentTest.js'
-import UserFormTestData from '@srcTest/js/components/users/form/UserFormTestData.js'
+import UserFormComponentTest from '@srcTest/js/components/users/form/user/UserFormComponentTest.js'
+import UserFormTestData from '@srcTest/js/components/users/form/user/UserFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentChangeGroup.test.js b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentChangeGroup.test.js
similarity index 97%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentChangeGroup.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentChangeGroup.test.js
index 33883e38d8e304bc90f1c64572bbf046ac1ac203..1a746acb55ff1fe0bfccc654e035767220d7d6cb 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentChangeGroup.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentChangeGroup.test.js
@@ -1,5 +1,5 @@
-import UserFormComponentTest from '@srcTest/js/components/users/form/UserFormComponentTest.js'
-import UserFormTestData from '@srcTest/js/components/users/form/UserFormTestData.js'
+import UserFormComponentTest from '@srcTest/js/components/users/form/user/UserFormComponentTest.js'
+import UserFormTestData from '@srcTest/js/components/users/form/user/UserFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentChangeRole.test.js b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentChangeRole.test.js
similarity index 98%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentChangeRole.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentChangeRole.test.js
index 34e96dad7ef6e778f2e85f057a3e3208ddfb2cce..499590273868696cc6367a8765bf2c911d92fe81 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentChangeRole.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentChangeRole.test.js
@@ -1,5 +1,5 @@
-import UserFormComponentTest from '@srcTest/js/components/users/form/UserFormComponentTest.js'
-import UserFormTestData from '@srcTest/js/components/users/form/UserFormTestData.js'
+import UserFormComponentTest from '@srcTest/js/components/users/form/user/UserFormComponentTest.js'
+import UserFormTestData from '@srcTest/js/components/users/form/user/UserFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentLoad.test.js b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentLoad.test.js
similarity index 99%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentLoad.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentLoad.test.js
index 28113489b56b91a5674cbf007e4455373bc6db9e..f158187895f1899f303f1e456b0ab2c2aee51eaf 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentLoad.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentLoad.test.js
@@ -1,5 +1,5 @@
-import UserFormComponentTest from '@srcTest/js/components/users/form/UserFormComponentTest.js'
-import UserFormTestData from '@srcTest/js/components/users/form/UserFormTestData.js'
+import UserFormComponentTest from '@srcTest/js/components/users/form/user/UserFormComponentTest.js'
+import UserFormTestData from '@srcTest/js/components/users/form/user/UserFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentRemoveGroup.test.js b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentRemoveGroup.test.js
similarity index 98%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentRemoveGroup.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentRemoveGroup.test.js
index 6f7740750625c911f57ae965a581af9edf8e5b76..56051ede63318ce0ded1fabcd5a927ec4dc98d93 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentRemoveGroup.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentRemoveGroup.test.js
@@ -1,5 +1,5 @@
-import UserFormComponentTest from '@srcTest/js/components/users/form/UserFormComponentTest.js'
-import UserFormTestData from '@srcTest/js/components/users/form/UserFormTestData.js'
+import UserFormComponentTest from '@srcTest/js/components/users/form/user/UserFormComponentTest.js'
+import UserFormTestData from '@srcTest/js/components/users/form/user/UserFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentRemoveRole.test.js b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentRemoveRole.test.js
similarity index 98%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentRemoveRole.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentRemoveRole.test.js
index 14537fb5c1206fb20a50693a5af6a5fab037789a..d7dfe0375ec63cd125bd40495182650e52ca0f06 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentRemoveRole.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentRemoveRole.test.js
@@ -1,5 +1,5 @@
-import UserFormComponentTest from '@srcTest/js/components/users/form/UserFormComponentTest.js'
-import UserFormTestData from '@srcTest/js/components/users/form/UserFormTestData.js'
+import UserFormComponentTest from '@srcTest/js/components/users/form/user/UserFormComponentTest.js'
+import UserFormTestData from '@srcTest/js/components/users/form/user/UserFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentSave.test.js b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentSave.test.js
similarity index 99%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentSave.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentSave.test.js
index 4e78d6d7d58eac5db4efd3a09d549021f929f807..129f404dd0bd47279c64b1f4f396336eef091049 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentSave.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentSave.test.js
@@ -1,5 +1,5 @@
-import UserFormComponentTest from '@srcTest/js/components/users/form/UserFormComponentTest.js'
-import UserFormTestData from '@srcTest/js/components/users/form/UserFormTestData.js'
+import UserFormComponentTest from '@srcTest/js/components/users/form/user/UserFormComponentTest.js'
+import UserFormTestData from '@srcTest/js/components/users/form/user/UserFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentSelectGroup.test.js b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentSelectGroup.test.js
similarity index 97%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentSelectGroup.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentSelectGroup.test.js
index 09e1b2bd64257a093f415b279b3c0f834e2e41cd..203c857f6999d6a231c772a7d620fbfce17f80f3 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentSelectGroup.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentSelectGroup.test.js
@@ -1,5 +1,5 @@
-import UserFormComponentTest from '@srcTest/js/components/users/form/UserFormComponentTest.js'
-import UserFormTestData from '@srcTest/js/components/users/form/UserFormTestData.js'
+import UserFormComponentTest from '@srcTest/js/components/users/form/user/UserFormComponentTest.js'
+import UserFormTestData from '@srcTest/js/components/users/form/user/UserFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentSelectRole.test.js b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentSelectRole.test.js
similarity index 95%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentSelectRole.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentSelectRole.test.js
index a94a734c7740601670dad486bcad6aa0d60e49c9..1455719f8d5963dd1b56aab03ce7745d7eb81a49 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentSelectRole.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentSelectRole.test.js
@@ -1,5 +1,5 @@
-import UserFormComponentTest from '@srcTest/js/components/users/form/UserFormComponentTest.js'
-import UserFormTestData from '@srcTest/js/components/users/form/UserFormTestData.js'
+import UserFormComponentTest from '@srcTest/js/components/users/form/user/UserFormComponentTest.js'
+import UserFormTestData from '@srcTest/js/components/users/form/user/UserFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
@@ -26,11 +26,8 @@ describe(UserFormComponentTest.SUITE, () => {
 })
 
 async function testSelectRole() {
-  const {
-    mySpace,
-    mySpaceAdminAssignment,
-    myProjectAdminAssignment
-  } = UserFormTestData
+  const { mySpace, mySpaceAdminAssignment, myProjectAdminAssignment } =
+    UserFormTestData
 
   const user = new openbis.Person()
   user.setUserId('test-user')
@@ -182,10 +179,8 @@ async function testSelectRole() {
 }
 
 async function testSelectInstanceRole(inherited) {
-  const {
-    instanceObserverGroupAssignment,
-    instanceAdminAssignment
-  } = UserFormTestData
+  const { instanceObserverGroupAssignment, instanceAdminAssignment } =
+    UserFormTestData
 
   const userAssignment = inherited
     ? instanceObserverGroupAssignment
@@ -250,10 +245,8 @@ async function testSelectInstanceRole(inherited) {
 }
 
 async function testSelectSpaceRole(inherited) {
-  const {
-    testSpacePowerUserGroupAssignment,
-    mySpaceAdminAssignment
-  } = UserFormTestData
+  const { testSpacePowerUserGroupAssignment, mySpaceAdminAssignment } =
+    UserFormTestData
 
   const userAssignment = inherited
     ? testSpacePowerUserGroupAssignment
@@ -323,10 +316,8 @@ async function testSelectSpaceRole(inherited) {
 }
 
 async function testSelectProjectRole(inherited) {
-  const {
-    testProjectAdminGroupAssignment,
-    myProjectAdminAssignment
-  } = UserFormTestData
+  const { testProjectAdminGroupAssignment, myProjectAdminAssignment } =
+    UserFormTestData
 
   const userAssignment = inherited
     ? testProjectAdminGroupAssignment
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentSortRoles.test.js b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentSortRoles.test.js
similarity index 99%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentSortRoles.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentSortRoles.test.js
index a13ec4cd1cece4cd0e81b4748bc3bbb617faffbc..596fd36c5e43d97f51f3fe248f63dccdd05e3bb9 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentSortRoles.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentSortRoles.test.js
@@ -1,5 +1,5 @@
-import UserFormComponentTest from '@srcTest/js/components/users/form/UserFormComponentTest.js'
-import UserFormTestData from '@srcTest/js/components/users/form/UserFormTestData.js'
+import UserFormComponentTest from '@srcTest/js/components/users/form/user/UserFormComponentTest.js'
+import UserFormTestData from '@srcTest/js/components/users/form/user/UserFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentTest.js b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentTest.js
similarity index 69%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentTest.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentTest.js
index 85161e3df93fa72674e15a1416519938d7b94fa1..9c3bce08fcac9b052361815ffed8dedddda3b16d 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentTest.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentTest.js
@@ -1,12 +1,12 @@
 import React from 'react'
 import ComponentTest from '@srcTest/js/components/common/ComponentTest.js'
-import UserForm from '@src/js/components/users/form/UserForm.jsx'
-import UserFormWrapper from '@srcTest/js/components/users/form/wrapper/UserFormWrapper.js'
-import UserFormController from '@src/js/components/users/form/UserFormController.js'
-import UserFormFacade from '@src/js/components/users/form/UserFormFacade'
+import UserForm from '@src/js/components/users/form/user/UserForm.jsx'
+import UserFormWrapper from '@srcTest/js/components/users/form/user/wrapper/UserFormWrapper.js'
+import UserFormController from '@src/js/components/users/form/user/UserFormController.js'
+import UserFormFacade from '@src/js/components/users/form/user/UserFormFacade'
 import objectTypes from '@src/js/common/consts/objectType.js'
 
-jest.mock('@src/js/components/users/form/UserFormFacade')
+jest.mock('@src/js/components/users/form/user/UserFormFacade')
 
 export default class UserFormComponentTest extends ComponentTest {
   static SUITE = 'UserFormComponent'
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentValidate.test.js b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentValidate.test.js
similarity index 99%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentValidate.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentValidate.test.js
index cefbc1ebef5b996d6753d84eef2a327968ef163b..d12909e062621482fb91e6f0fa54929a367d8389 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserFormComponentValidate.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormComponentValidate.test.js
@@ -1,4 +1,4 @@
-import UserFormComponentTest from '@srcTest/js/components/users/form/UserFormComponentTest.js'
+import UserFormComponentTest from '@srcTest/js/components/users/form/user/UserFormComponentTest.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserFormTestData.js b/openbis_ng_ui/srcTest/js/components/users/form/user/UserFormTestData.js
similarity index 100%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserFormTestData.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/UserFormTestData.js
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserFormButtonsWrapper.js b/openbis_ng_ui/srcTest/js/components/users/form/user/wrapper/UserFormButtonsWrapper.js
similarity index 100%
rename from openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserFormButtonsWrapper.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/wrapper/UserFormButtonsWrapper.js
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserFormParametersGroupWrapper.js b/openbis_ng_ui/srcTest/js/components/users/form/user/wrapper/UserFormParametersGroupWrapper.js
similarity index 100%
rename from openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserFormParametersGroupWrapper.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/wrapper/UserFormParametersGroupWrapper.js
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserFormParametersUserWrapper.js b/openbis_ng_ui/srcTest/js/components/users/form/user/wrapper/UserFormParametersUserWrapper.js
similarity index 100%
rename from openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserFormParametersUserWrapper.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/wrapper/UserFormParametersUserWrapper.js
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserFormParametersWrapper.js b/openbis_ng_ui/srcTest/js/components/users/form/user/wrapper/UserFormParametersWrapper.js
similarity index 74%
rename from openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserFormParametersWrapper.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/wrapper/UserFormParametersWrapper.js
index bcaba135acf8c1cdc46778f3f20ddc373fa16cfd..7abc4e61d3cf69a24dce530f1cc9315e357a8d78 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserFormParametersWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/wrapper/UserFormParametersWrapper.js
@@ -1,8 +1,8 @@
 import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
-import UserFormParametersUser from '@src/js/components/users/form/UserFormParametersUser.jsx'
-import UserFormParametersUserWrapper from './UserFormParametersUserWrapper.js'
-import UserFormParametersGroup from '@src/js/components/users/form/UserFormParametersGroup.jsx'
-import UserFormParametersGroupWrapper from './UserFormParametersGroupWrapper.js'
+import UserFormParametersUser from '@src/js/components/users/form/user/UserFormParametersUser.jsx'
+import UserFormParametersUserWrapper from '@srcTest/js/components/users/form/user/wrapper/UserFormParametersUserWrapper.js'
+import UserFormParametersGroup from '@src/js/components/users/form/user/UserFormParametersGroup.jsx'
+import UserFormParametersGroupWrapper from '@srcTest/js/components/users/form/user/wrapper/UserFormParametersGroupWrapper.js'
 import RoleParameters from '@src/js/components/users/form/common/RoleParameters.jsx'
 import RoleParametersWrapper from '@srcTest/js/components/users/form/common/wrapper/RoleParametersWrapper.js'
 
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserFormWrapper.js b/openbis_ng_ui/srcTest/js/components/users/form/user/wrapper/UserFormWrapper.js
similarity index 74%
rename from openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserFormWrapper.js
rename to openbis_ng_ui/srcTest/js/components/users/form/user/wrapper/UserFormWrapper.js
index d1eeb4afb64f26713f5bdd0f5541aa15540d38db..5ff41371d68bdadf5aa72b7dcd1598fc61601706 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserFormWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/user/wrapper/UserFormWrapper.js
@@ -1,11 +1,11 @@
 import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
 import Grid from '@src/js/components/common/grid/Grid.jsx'
 import GridWrapper from '@srcTest/js/components/common/grid/wrapper/GridWrapper.js'
-import UserFormGridGroups from '@src/js/components/users/form/UserFormGridGroups.jsx'
-import UserFormGridRoles from '@src/js/components/users/form/UserFormGridRoles.jsx'
-import UserFormParametersWrapper from '@srcTest/js/components/users/form/wrapper/UserFormParametersWrapper.js'
-import UserFormButtons from '@src/js/components/users/form/UserFormButtons.jsx'
-import UserFormButtonsWrapper from '@srcTest/js/components/users/form/wrapper/UserFormButtonsWrapper.js'
+import UserFormGridGroups from '@src/js/components/users/form/user/UserFormGridGroups.jsx'
+import UserFormGridRoles from '@src/js/components/users/form/user/UserFormGridRoles.jsx'
+import UserFormParametersWrapper from '@srcTest/js/components/users/form/user/wrapper/UserFormParametersWrapper.js'
+import UserFormButtons from '@src/js/components/users/form/user/UserFormButtons.jsx'
+import UserFormButtonsWrapper from '@srcTest/js/components/users/form/user/wrapper/UserFormButtonsWrapper.js'
 
 export default class UserFormWrapper extends BaseWrapper {
   getGroupsGrid() {
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentAddRole.test.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentAddRole.test.js
similarity index 98%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentAddRole.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentAddRole.test.js
index deda29f2e5029a767bea7bde87d273d9eb6e7a1e..70f1f3a53c379690d5e43571052920b382d23e08 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentAddRole.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentAddRole.test.js
@@ -1,5 +1,5 @@
-import UserGroupFormComponentTest from '@srcTest/js/components/users/form/UserGroupFormComponentTest.js'
-import UserGroupFormTestData from '@srcTest/js/components/users/form/UserGroupFormTestData.js'
+import UserGroupFormComponentTest from '@srcTest/js/components/users/form/usergroup/UserGroupFormComponentTest.js'
+import UserGroupFormTestData from '@srcTest/js/components/users/form/usergroup/UserGroupFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentAddUser.test.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentAddUser.test.js
similarity index 97%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentAddUser.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentAddUser.test.js
index 23edc8bb930e3e99c19eedc76fa25cc272759a88..df7a78d91118ec8949033b9f644a61e86109f270 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentAddUser.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentAddUser.test.js
@@ -1,5 +1,5 @@
-import UserGroupFormComponentTest from '@srcTest/js/components/users/form/UserGroupFormComponentTest.js'
-import UserGroupFormTestData from '@srcTest/js/components/users/form/UserGroupFormTestData.js'
+import UserGroupFormComponentTest from '@srcTest/js/components/users/form/usergroup/UserGroupFormComponentTest.js'
+import UserGroupFormTestData from '@srcTest/js/components/users/form/usergroup/UserGroupFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentChangeRole.test.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentChangeRole.test.js
similarity index 97%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentChangeRole.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentChangeRole.test.js
index 7761d3ff38790f3519f85f4a4e6f46eaebd762f1..1194f6ed4c25e93d8048cc78e5331a32f97ef1e4 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentChangeRole.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentChangeRole.test.js
@@ -1,5 +1,5 @@
-import UserGroupFormComponentTest from '@srcTest/js/components/users/form/UserGroupFormComponentTest.js'
-import UserGroupFormTestData from '@srcTest/js/components/users/form/UserGroupFormTestData.js'
+import UserGroupFormComponentTest from '@srcTest/js/components/users/form/usergroup/UserGroupFormComponentTest.js'
+import UserGroupFormTestData from '@srcTest/js/components/users/form/usergroup/UserGroupFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentChangeUser.test.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentChangeUser.test.js
similarity index 96%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentChangeUser.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentChangeUser.test.js
index 8f284abe49051910a0b0eed063ca9fc62245b6f5..83dae28cd7cfb637e330503b6ce67731a72576ac 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentChangeUser.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentChangeUser.test.js
@@ -1,5 +1,5 @@
-import UserGroupFormComponentTest from '@srcTest/js/components/users/form/UserGroupFormComponentTest.js'
-import UserGroupFormTestData from '@srcTest/js/components/users/form/UserGroupFormTestData.js'
+import UserGroupFormComponentTest from '@srcTest/js/components/users/form/usergroup/UserGroupFormComponentTest.js'
+import UserGroupFormTestData from '@srcTest/js/components/users/form/usergroup/UserGroupFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentLoad.test.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentLoad.test.js
similarity index 98%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentLoad.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentLoad.test.js
index 8a2464a91941d8458e46e7f8ed765ba67e488ce6..f2895757f2e8c5606011b8f9161461bee393bbca 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentLoad.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentLoad.test.js
@@ -1,5 +1,5 @@
-import UserGroupFormComponentTest from '@srcTest/js/components/users/form/UserGroupFormComponentTest.js'
-import UserGroupFormTestData from '@srcTest/js/components/users/form/UserGroupFormTestData.js'
+import UserGroupFormComponentTest from '@srcTest/js/components/users/form/usergroup/UserGroupFormComponentTest.js'
+import UserGroupFormTestData from '@srcTest/js/components/users/form/usergroup/UserGroupFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentRemoveRole.test.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentRemoveRole.test.js
similarity index 96%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentRemoveRole.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentRemoveRole.test.js
index 4875a5f4ef2873d9a86d42e51350f6dc65a46e58..4256b48bed964f509109f786a2169230c8281473 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentRemoveRole.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentRemoveRole.test.js
@@ -1,5 +1,5 @@
-import UserGroupFormComponentTest from '@srcTest/js/components/users/form/UserGroupFormComponentTest.js'
-import UserGroupFormTestData from '@srcTest/js/components/users/form/UserGroupFormTestData.js'
+import UserGroupFormComponentTest from '@srcTest/js/components/users/form/usergroup/UserGroupFormComponentTest.js'
+import UserGroupFormTestData from '@srcTest/js/components/users/form/usergroup/UserGroupFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentRemoveUser.test.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentRemoveUser.test.js
similarity index 95%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentRemoveUser.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentRemoveUser.test.js
index a1c325bd21473ec8501b61dcbae0de4c19d3829a..c15a685285f026280ddd5c318d4b33c981b34377 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentRemoveUser.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentRemoveUser.test.js
@@ -1,5 +1,5 @@
-import UserGroupFormComponentTest from '@srcTest/js/components/users/form/UserGroupFormComponentTest.js'
-import UserGroupFormTestData from '@srcTest/js/components/users/form/UserGroupFormTestData.js'
+import UserGroupFormComponentTest from '@srcTest/js/components/users/form/usergroup/UserGroupFormComponentTest.js'
+import UserGroupFormTestData from '@srcTest/js/components/users/form/usergroup/UserGroupFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentSave.test.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentSave.test.js
similarity index 97%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentSave.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentSave.test.js
index aa5411c2a6086be845f4f8408f122575377a1551..46f0bfa4bd41584f93a4f8b3a6b713297ad85948 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentSave.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentSave.test.js
@@ -1,5 +1,5 @@
-import UserGroupFormComponentTest from '@srcTest/js/components/users/form/UserGroupFormComponentTest.js'
-import UserGroupFormTestData from '@srcTest/js/components/users/form/UserGroupFormTestData.js'
+import UserGroupFormComponentTest from '@srcTest/js/components/users/form/usergroup/UserGroupFormComponentTest.js'
+import UserGroupFormTestData from '@srcTest/js/components/users/form/usergroup/UserGroupFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
@@ -222,10 +222,8 @@ async function testSaveRemoveUser() {
 }
 
 async function testSaveRemoveRole() {
-  const {
-    instanceObserverAssignment,
-    testSpacePowerUserAssignment
-  } = UserGroupFormTestData
+  const { instanceObserverAssignment, testSpacePowerUserAssignment } =
+    UserGroupFormTestData
 
   const group = new openbis.AuthorizationGroup()
   group.setCode('TEST-GROUP')
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentSelectRole.test.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentSelectRole.test.js
similarity index 96%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentSelectRole.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentSelectRole.test.js
index decd0b142c6d534ea00d50cf5b815ae4de08e545..d861b3f147c5995be0e22d6e8f63d0b42e1b34a2 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentSelectRole.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentSelectRole.test.js
@@ -1,5 +1,5 @@
-import UserGroupFormComponentTest from '@srcTest/js/components/users/form/UserGroupFormComponentTest.js'
-import UserGroupFormTestData from '@srcTest/js/components/users/form/UserGroupFormTestData.js'
+import UserGroupFormComponentTest from '@srcTest/js/components/users/form/usergroup/UserGroupFormComponentTest.js'
+import UserGroupFormTestData from '@srcTest/js/components/users/form/usergroup/UserGroupFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentSelectUser.test.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentSelectUser.test.js
similarity index 95%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentSelectUser.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentSelectUser.test.js
index 65b57d83f15eaa8f626bddcc87c87fb43a0fa955..81f28d8e9e5462d0b18db1c696c4e969927c63f5 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentSelectUser.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentSelectUser.test.js
@@ -1,5 +1,5 @@
-import UserGroupFormComponentTest from '@srcTest/js/components/users/form/UserGroupFormComponentTest.js'
-import UserGroupFormTestData from '@srcTest/js/components/users/form/UserGroupFormTestData.js'
+import UserGroupFormComponentTest from '@srcTest/js/components/users/form/usergroup/UserGroupFormComponentTest.js'
+import UserGroupFormTestData from '@srcTest/js/components/users/form/usergroup/UserGroupFormTestData.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentTest.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentTest.js
similarity index 76%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentTest.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentTest.js
index d0ace86b9925089c50320e18546b8001626cac42..6c1ac928a4c01a11dae712f51e6bcc294c345226 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentTest.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentTest.js
@@ -1,12 +1,12 @@
 import React from 'react'
 import ComponentTest from '@srcTest/js/components/common/ComponentTest.js'
-import UserGroupForm from '@src/js/components/users/form/UserGroupForm.jsx'
-import UserGroupFormWrapper from '@srcTest/js/components/users/form/wrapper/UserGroupFormWrapper.js'
-import UserGroupFormController from '@src/js/components/users/form/UserGroupFormController.js'
-import UserGroupFormFacade from '@src/js/components/users/form/UserGroupFormFacade'
+import UserGroupForm from '@src/js/components/users/form/usergroup/UserGroupForm.jsx'
+import UserGroupFormWrapper from '@srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormWrapper.js'
+import UserGroupFormController from '@src/js/components/users/form/usergroup/UserGroupFormController.js'
+import UserGroupFormFacade from '@src/js/components/users/form/usergroup/UserGroupFormFacade'
 import objectTypes from '@src/js/common/consts/objectType.js'
 
-jest.mock('@src/js/components/users/form/UserGroupFormFacade')
+jest.mock('@src/js/components/users/form/usergroup/UserGroupFormFacade')
 
 export default class UserGroupFormComponentTest extends ComponentTest {
   static SUITE = 'UserGroupFormComponent'
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentValidate.test.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentValidate.test.js
similarity index 98%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentValidate.test.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentValidate.test.js
index cc94d46af15d26e9b033a471ec8779cf9e7b679b..67cf30293c67180bba8ad15ebaaf8ef2443a5d30 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormComponentValidate.test.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormComponentValidate.test.js
@@ -1,4 +1,4 @@
-import UserGroupFormComponentTest from '@srcTest/js/components/users/form/UserGroupFormComponentTest.js'
+import UserGroupFormComponentTest from '@srcTest/js/components/users/form/usergroup/UserGroupFormComponentTest.js'
 import openbis from '@srcTest/js/services/openbis.js'
 
 let common = null
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormTestData.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormTestData.js
similarity index 100%
rename from openbis_ng_ui/srcTest/js/components/users/form/UserGroupFormTestData.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/UserGroupFormTestData.js
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserGroupFormButtonsWrapper.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormButtonsWrapper.js
similarity index 100%
rename from openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserGroupFormButtonsWrapper.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormButtonsWrapper.js
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserGroupFormParametersGroupWrapper.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormParametersGroupWrapper.js
similarity index 100%
rename from openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserGroupFormParametersGroupWrapper.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormParametersGroupWrapper.js
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserGroupFormParametersUserWrapper.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormParametersUserWrapper.js
similarity index 100%
rename from openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserGroupFormParametersUserWrapper.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormParametersUserWrapper.js
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserGroupFormParametersWrapper.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormParametersWrapper.js
similarity index 71%
rename from openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserGroupFormParametersWrapper.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormParametersWrapper.js
index 88743923a669306f83f8301f6d85d3599e1c8a9d..67a400c96547fef0be02b23e9ca5b780d6c2afd8 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserGroupFormParametersWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormParametersWrapper.js
@@ -1,8 +1,8 @@
 import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
-import UserGroupFormParametersGroup from '@src/js/components/users/form/UserGroupFormParametersGroup.jsx'
-import UserGroupFormParametersGroupWrapper from './UserGroupFormParametersGroupWrapper.js'
-import UserGroupFormParametersUser from '@src/js/components/users/form/UserGroupFormParametersUser.jsx'
-import UserGroupFormParametersUserWrapper from './UserGroupFormParametersUserWrapper.js'
+import UserGroupFormParametersGroup from '@src/js/components/users/form/usergroup/UserGroupFormParametersGroup.jsx'
+import UserGroupFormParametersGroupWrapper from '@srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormParametersGroupWrapper.js'
+import UserGroupFormParametersUser from '@src/js/components/users/form/usergroup/UserGroupFormParametersUser.jsx'
+import UserGroupFormParametersUserWrapper from '@srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormParametersUserWrapper.js'
 import RoleParameters from '@src/js/components/users/form/common/RoleParameters.jsx'
 import RoleParametersWrapper from '@srcTest/js/components/users/form/common/wrapper/RoleParametersWrapper.js'
 
diff --git a/openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserGroupFormWrapper.js b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormWrapper.js
similarity index 84%
rename from openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserGroupFormWrapper.js
rename to openbis_ng_ui/srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormWrapper.js
index 9a0e369adca61aca939f54312dde4abc0ea7f8d7..f2e2beea1c51f0ecd022ec8e5c7836c5096a5b02 100644
--- a/openbis_ng_ui/srcTest/js/components/users/form/wrapper/UserGroupFormWrapper.js
+++ b/openbis_ng_ui/srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormWrapper.js
@@ -1,11 +1,11 @@
 import BaseWrapper from '@srcTest/js/components/common/wrapper/BaseWrapper.js'
 import Grid from '@src/js/components/common/grid/Grid.jsx'
 import GridWrapper from '@srcTest/js/components/common/grid/wrapper/GridWrapper.js'
-import UserGroupFormGridUsers from '@src/js/components/users/form/UserGroupFormGridUsers.jsx'
-import UserGroupFormGridRoles from '@src/js/components/users/form/UserGroupFormGridRoles.jsx'
-import UserGroupFormParametersWrapper from '@srcTest/js/components/users/form/wrapper/UserGroupFormParametersWrapper.js'
-import UserGroupFormButtons from '@src/js/components/users/form/UserGroupFormButtons.jsx'
-import UserGroupFormButtonsWrapper from '@srcTest/js/components/users/form/wrapper/UserGroupFormButtonsWrapper.js'
+import UserGroupFormGridUsers from '@src/js/components/users/form/usergroup/UserGroupFormGridUsers.jsx'
+import UserGroupFormGridRoles from '@src/js/components/users/form/usergroup/UserGroupFormGridRoles.jsx'
+import UserGroupFormParametersWrapper from '@srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormParametersWrapper.js'
+import UserGroupFormButtons from '@src/js/components/users/form/usergroup/UserGroupFormButtons.jsx'
+import UserGroupFormButtonsWrapper from '@srcTest/js/components/users/form/usergroup/wrapper/UserGroupFormButtonsWrapper.js'
 
 export default class UserGroupFormWrapper extends BaseWrapper {
   getUsersGrid() {
diff --git a/openbis_ng_ui/srcTest/js/services/openbis/api.js b/openbis_ng_ui/srcTest/js/services/openbis/api.js
index a4d4d21cf3e65e9fab82b8286bef0c6b09f66f18..832e22896ec3613e4315865a843dbbacd708c3d2 100644
--- a/openbis_ng_ui/srcTest/js/services/openbis/api.js
+++ b/openbis_ng_ui/srcTest/js/services/openbis/api.js
@@ -101,6 +101,12 @@ const mockSearchPropertyTypes = propertyTypes => {
   searchPropertyTypes.mockReturnValue(Promise.resolve(searchResult))
 }
 
+const mockSearchPropertyAssignments = propertyAssignments => {
+  const searchResult = new dto.SearchResult()
+  searchResult.setObjects(propertyAssignments)
+  searchPropertyAssignments.mockReturnValue(Promise.resolve(searchResult))
+}
+
 const mockSearchVocabularies = vocabularies => {
   const searchResult = new dto.SearchResult()
   searchResult.setObjects(vocabularies)
@@ -177,6 +183,7 @@ export default {
   mockSearchPersons,
   mockSearchSampleTypes,
   mockSearchPropertyTypes,
+  mockSearchPropertyAssignments,
   mockSearchVocabularies,
   mockSearchPlugins,
   mockSearchQueries,