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 23c271012bfdafb75bbb7a97886fb11060e0e7b2..f514883e52a2559b05d06870af7c4d3dfb59108a 100644
--- a/openbis_ng_ui/src/js/components/types/browser/TypeBrowserController.js
+++ b/openbis_ng_ui/src/js/components/types/browser/TypeBrowserController.js
@@ -103,39 +103,69 @@ export default class TypeBrowserController extends BrowserController {
 
     const { type, id } = node.object
     const reason = 'deleted via ng_ui'
-    let promise = null
+    const operations = []
 
     if (type === objectType.OBJECT_TYPE) {
       const options = new openbis.SampleTypeDeletionOptions()
       options.setReason(reason)
-      promise = openbis.deleteSampleTypes(
-        [new openbis.EntityTypePermId(id)],
-        options
+      operations.push(
+        new openbis.DeleteSampleTypesOperation(
+          [new openbis.EntityTypePermId(id)],
+          options
+        )
       )
     } else if (type === objectType.COLLECTION_TYPE) {
       const options = new openbis.ExperimentTypeDeletionOptions()
       options.setReason(reason)
-      promise = openbis.deleteExperimentTypes(
-        [new openbis.EntityTypePermId(id)],
-        options
+      operations.push(
+        new openbis.DeleteExperimentTypesOperation(
+          [new openbis.EntityTypePermId(id)],
+          options
+        )
       )
     } else if (type === objectType.DATA_SET_TYPE) {
       const options = new openbis.DataSetTypeDeletionOptions()
       options.setReason(reason)
-      promise = openbis.deleteDataSetTypes(
-        [new openbis.EntityTypePermId(id)],
-        options
+      operations.push(
+        new openbis.DeleteDataSetTypesOperation(
+          [new openbis.EntityTypePermId(id)],
+          options
+        )
       )
     } else if (type === objectType.MATERIAL_TYPE) {
       const options = new openbis.MaterialTypeDeletionOptions()
       options.setReason(reason)
-      promise = openbis.deleteMaterialTypes(
-        [new openbis.EntityTypePermId(id)],
-        options
+      operations.push(
+        new openbis.DeleteMaterialTypesOperation(
+          [new openbis.EntityTypePermId(id)],
+          options
+        )
       )
     }
 
-    return promise
+    const criteria = new openbis.PropertyTypeSearchCriteria()
+    criteria.withCode().thatStartsWith(id + '.')
+    const fo = new openbis.PropertyTypeFetchOptions()
+
+    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)
+          )
+        }
+      })
+      .then(() => {
+        const options = new openbis.SynchronousOperationExecutionOptions()
+        options.setExecuteInOrder(true)
+        return openbis.executeOperations(operations, options)
+      })
       .then(() => {
         this.context.dispatch(actions.objectDelete(this.getPage(), type, id))
       })
diff --git a/openbis_ng_ui/src/js/services/openbis/dto.js b/openbis_ng_ui/src/js/services/openbis/dto.js
index 8df06c95c32a5c91714654907f39a4b8bcb5ee83..322b26f357d5a79caee07cb5a6f8a6fe037d44f1 100644
--- a/openbis_ng_ui/src/js/services/openbis/dto.js
+++ b/openbis_ng_ui/src/js/services/openbis/dto.js
@@ -4,6 +4,7 @@ const CLASS_FULL_NAMES = [
   'as/dto/dataset/create/CreateDataSetTypesOperation',
   'as/dto/dataset/create/DataSetTypeCreation',
   'as/dto/dataset/delete/DataSetTypeDeletionOptions',
+  'as/dto/dataset/delete/DeleteDataSetTypesOperation',
   'as/dto/dataset/fetchoptions/DataSetFetchOptions',
   'as/dto/dataset/fetchoptions/DataSetTypeFetchOptions',
   'as/dto/dataset/search/DataSetSearchCriteria',
@@ -16,6 +17,7 @@ const CLASS_FULL_NAMES = [
   'as/dto/experiment/create/CreateExperimentTypesOperation',
   'as/dto/experiment/create/ExperimentTypeCreation',
   'as/dto/experiment/delete/ExperimentTypeDeletionOptions',
+  'as/dto/experiment/delete/DeleteExperimentTypesOperation',
   'as/dto/experiment/fetchoptions/ExperimentFetchOptions',
   'as/dto/experiment/fetchoptions/ExperimentTypeFetchOptions',
   'as/dto/experiment/search/ExperimentSearchCriteria',
@@ -26,6 +28,7 @@ const CLASS_FULL_NAMES = [
   'as/dto/material/create/CreateMaterialTypesOperation',
   'as/dto/material/create/MaterialTypeCreation',
   'as/dto/material/delete/MaterialTypeDeletionOptions',
+  'as/dto/material/delete/DeleteMaterialTypesOperation',
   'as/dto/material/fetchoptions/MaterialFetchOptions',
   'as/dto/material/fetchoptions/MaterialTypeFetchOptions',
   'as/dto/material/search/MaterialSearchCriteria',
@@ -60,6 +63,7 @@ const CLASS_FULL_NAMES = [
   'as/dto/sample/create/CreateSampleTypesOperation',
   'as/dto/sample/create/SampleTypeCreation',
   'as/dto/sample/delete/SampleTypeDeletionOptions',
+  'as/dto/sample/delete/DeleteSampleTypesOperation',
   'as/dto/sample/fetchoptions/SampleFetchOptions',
   'as/dto/sample/fetchoptions/SampleTypeFetchOptions',
   'as/dto/sample/fetchoptions/SampleTypeFetchOptions',
diff --git a/openbis_ng_ui/srcTest/js/common/fixture.js b/openbis_ng_ui/srcTest/js/common/fixture.js
index b3a2cb50c993231309f076589ff4eb51cbcd8614..0322e50ef4a7e0875a9955e9295cd0f6663bec83 100644
--- a/openbis_ng_ui/srcTest/js/common/fixture.js
+++ b/openbis_ng_ui/srcTest/js/common/fixture.js
@@ -31,14 +31,23 @@ TEST_PLUGIN_DTO.setName('TEST_PLUGIN')
 
 const TEST_PROPERTY_TYPE_1_DTO = new openbis.PropertyType()
 TEST_PROPERTY_TYPE_1_DTO.setCode('TEST_PROPERTY_TYPE_1')
+TEST_PROPERTY_TYPE_1_DTO.setPermId(
+  new openbis.PropertyTypePermId(TEST_PROPERTY_TYPE_1_DTO.getCode())
+)
 TEST_PROPERTY_TYPE_1_DTO.setDataType(openbis.DataType.VARCHAR)
 
 const TEST_PROPERTY_TYPE_2_DTO = new openbis.PropertyType()
 TEST_PROPERTY_TYPE_2_DTO.setCode('TEST_PROPERTY_TYPE_2')
+TEST_PROPERTY_TYPE_2_DTO.setPermId(
+  new openbis.PropertyTypePermId(TEST_PROPERTY_TYPE_2_DTO.getCode())
+)
 TEST_PROPERTY_TYPE_2_DTO.setDataType(openbis.DataType.VARCHAR)
 
 const TEST_PROPERTY_TYPE_3_DTO = new openbis.PropertyType()
 TEST_PROPERTY_TYPE_3_DTO.setCode('TEST_PROPERTY_TYPE_3')
+TEST_PROPERTY_TYPE_3_DTO.setPermId(
+  new openbis.PropertyTypePermId(TEST_PROPERTY_TYPE_3_DTO.getCode())
+)
 TEST_PROPERTY_TYPE_3_DTO.setDataType(openbis.DataType.VARCHAR)
 
 const TEST_PROPERTY_ASSIGNMENT_1 = new openbis.PropertyAssignment()
diff --git a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserController.test.js b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserController.test.js
index cfae9cf972365b8c15c9713e7ce8c97f87464a29..5205faadeae01b9cc3a6d833d278a7cade411222 100644
--- a/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserController.test.js
+++ b/openbis_ng_ui/srcTest/js/components/types/browser/TypeBrowserController.test.js
@@ -105,6 +105,7 @@ describe('browser', () => {
   })
 
   test('remove node', async () => {
+    openbis.mockSearchPropertyTypes([fixture.TEST_PROPERTY_TYPE_1_DTO])
     openbis.deleteSampleTypes.mockReturnValue(Promise.resolve())
 
     await controller.load()
@@ -121,10 +122,32 @@ describe('browser', () => {
     await controller.nodeRemoveConfirm()
 
     expect(controller.isRemoveNodeDialogOpen()).toBe(false)
-    const id = new openbis.EntityTypePermId(fixture.TEST_SAMPLE_TYPE_DTO.code)
-    const options = new openbis.SampleTypeDeletionOptions()
-    options.setReason('deleted via ng_ui')
-    expect(openbis.deleteSampleTypes).toHaveBeenCalledWith([id], options)
+
+    const createDeleteTypeOperation = typeCode => {
+      const id = new openbis.EntityTypePermId(typeCode)
+      const options = new openbis.SampleTypeDeletionOptions()
+      options.setReason('deleted via ng_ui')
+      return new openbis.DeleteSampleTypesOperation([id], options)
+    }
+
+    const createDeletePropertyTypeOperation = propertyTypeCode => {
+      const id = new openbis.PropertyTypePermId(propertyTypeCode)
+      const options = new openbis.PropertyTypeDeletionOptions()
+      options.setReason('deleted via ng_ui')
+      return new openbis.DeletePropertyTypesOperation([id], options)
+    }
+
+    const options = new openbis.SynchronousOperationExecutionOptions()
+    options.setExecuteInOrder(true)
+
+    expect(openbis.executeOperations).toHaveBeenCalledWith(
+      [
+        createDeleteTypeOperation(fixture.TEST_SAMPLE_TYPE_DTO.code),
+        createDeletePropertyTypeOperation(fixture.TEST_PROPERTY_TYPE_1_DTO.code)
+      ],
+      options
+    )
+
     expectDeleteTypeAction(
       objectType.OBJECT_TYPE,
       fixture.TEST_SAMPLE_TYPE_DTO.code
diff --git a/openbis_ng_ui/srcTest/js/services/openbis/api.js b/openbis_ng_ui/srcTest/js/services/openbis/api.js
index f0e78c76601ac94f266129789631b82e4860ec8d..e906fdf62649c2893ac211e912c42bfbe8e71776 100644
--- a/openbis_ng_ui/srcTest/js/services/openbis/api.js
+++ b/openbis_ng_ui/srcTest/js/services/openbis/api.js
@@ -69,6 +69,12 @@ const mockSearchMaterialTypes = materialTypes => {
   searchMaterialTypes.mockReturnValue(Promise.resolve(searchResult))
 }
 
+const mockSearchPropertyTypes = propertyTypes => {
+  const searchResult = new dto.SearchResult()
+  searchResult.setObjects(propertyTypes)
+  searchPropertyTypes.mockReturnValue(Promise.resolve(searchResult))
+}
+
 export default {
   login,
   logout,
@@ -105,5 +111,6 @@ export default {
   mockSearchGroups,
   mockSearchMaterialTypes,
   mockSearchPersons,
-  mockSearchSampleTypes
+  mockSearchSampleTypes,
+  mockSearchPropertyTypes
 }
diff --git a/openbis_ng_ui/srcTest/js/services/openbis/dto.js b/openbis_ng_ui/srcTest/js/services/openbis/dto.js
index c4354f877425de4c1c5b6f507e88271957a23e34..262e59c26a7097a8c76160f8daf0b96c73891b6c 100644
--- a/openbis_ng_ui/srcTest/js/services/openbis/dto.js
+++ b/openbis_ng_ui/srcTest/js/services/openbis/dto.js
@@ -17,7 +17,11 @@ import DataSetTypeFetchOptions from 'as/dto/dataset/fetchoptions/DataSetTypeFetc
 import DataSetTypeSearchCriteria from 'as/dto/dataset/search/DataSetTypeSearchCriteria'
 import DataSetTypeUpdate from 'as/dto/dataset/update/DataSetTypeUpdate'
 import DataType from 'as/dto/property/DataType'
+import DeleteDataSetTypesOperation from 'as/dto/dataset/delete/DeleteDataSetTypesOperation'
+import DeleteExperimentTypesOperation from 'as/dto/experiment/delete/DeleteExperimentTypesOperation'
+import DeleteMaterialTypesOperation from 'as/dto/material/delete/DeleteMaterialTypesOperation'
 import DeletePropertyTypesOperation from 'as/dto/property/delete/DeletePropertyTypesOperation'
+import DeleteSampleTypesOperation from 'as/dto/sample/delete/DeleteSampleTypesOperation'
 import EntityKind from 'as/dto/entitytype/EntityKind'
 import EntityTypePermId from 'as/dto/entitytype/id/EntityTypePermId'
 import ExperimentFetchOptions from 'as/dto/experiment/fetchoptions/ExperimentFetchOptions'
@@ -105,7 +109,11 @@ const dto = {
   DataSetTypeSearchCriteria,
   DataSetTypeUpdate,
   DataType,
+  DeleteDataSetTypesOperation,
+  DeleteExperimentTypesOperation,
+  DeleteMaterialTypesOperation,
   DeletePropertyTypesOperation,
+  DeleteSampleTypesOperation,
   EntityKind,
   EntityTypePermId,
   ExperimentFetchOptions,