import org.openecomp.sdc.be.model.PropertyDefinition;
 import org.openecomp.sdc.be.model.dto.PropertyDefinitionDto;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.exception.OperationException;
+import org.openecomp.sdc.be.model.normatives.ElementTypeEnum;
 import org.openecomp.sdc.be.model.operations.impl.DataTypeOperation;
 import org.openecomp.sdc.common.api.Constants;
 import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode;
     @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
     public Response updateProperty(@Parameter(in = ParameterIn.PATH, required = true, description = "The data type id")
                                    @PathParam("id") final String id,
-                                   @RequestBody(description = "Property to update", required = true) final PropertyDefinitionDto propertyDefinitionDto) {
+                                   @RequestBody(description = "Property to update", required = true)
+                                   final PropertyDefinitionDto propertyDefinitionDto) {
         Optional<DataTypeDataDefinition> dataTypeOptional = dataTypeOperation.getDataTypeByUid(id);
         dataTypeOptional.orElseThrow(() -> {
             throw new OperationException(ActionStatus.DATA_TYPE_NOT_FOUND, String.format("Failed to find data type '%s'", id));
         return Response.status(Status.OK).entity(propertyDefinitionDto).build();
     }
 
+    @DELETE
+    @Path("{dataTypeId}")
+    public Response deleteDatatype(@Parameter(in = ParameterIn.PATH, required = true, description = "The data type id")
+                                   @PathParam("dataTypeId") final String dataTypeId) {
+        final Optional<DataTypeDataDefinition> dataTypeOptional = dataTypeOperation.getDataTypeByUid(dataTypeId);
+        dataTypeOptional.orElseThrow(() -> {
+            throw new OperationException(ActionStatus.DATA_TYPE_NOT_FOUND, String.format("Failed to find data type '%s'", dataTypeId));
+        });
+        final DataTypeDataDefinition dataTypeDataDefinition = dataTypeOptional.get();
+        if (dataTypeDataDefinition.isNormative()) {
+            throw new OperationException(ActionStatus.CANNOT_DELETE_SYSTEM_DEPLOYED_RESOURCES, ElementTypeEnum.DATA_TYPE.getToscaEntryName(),
+                dataTypeId);
+        }
+        if (StringUtils.isEmpty(dataTypeDataDefinition.getModel())) {
+            dataTypeDataDefinition.setModel(Constants.DEFAULT_MODEL_NAME);
+        }
+        try {
+            dataTypeOperation.deleteDataTypesByDataTypeId(dataTypeId);
+            dataTypeOperation.removeDataTypeFromAdditionalType(dataTypeDataDefinition);
+        } catch (Exception e) {
+            BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Delete Datatype");
+            log.debug("delete datatype failed with exception ", e);
+            throw e;
+        }
+        return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT), null);
+    }
+
     private String extractNameFromPropertyId(final String propertyId) {
         final String[] split = propertyId.split("\\.");
         return split[split.length - 1];
 
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
+
 package org.openecomp.sdc.be.model.operations.impl;
 
 import fj.data.Either;
         });
     }
 
+    public void deleteDataTypesByDataTypeId(final String dataTypeId) {
+        final JanusGraph janusGraph = janusGraphGenericDao.getJanusGraph();
+        final GraphTraversalSource traversal = janusGraph.traversal();
+        final List<Vertex> dataTypeList = traversal.V()
+            .has(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), dataTypeId)
+            .toList();
+        dataTypeList.forEach(dataTypeVertex -> {
+            traversal.V(dataTypeVertex).out(GraphEdgeLabels.PROPERTY.getProperty()).drop().iterate();
+            dataTypeVertex.remove();
+        });
+    }
+
     public Optional<DataTypeDataDefinition> getDataTypeByUid(final String uniqueId) {
         final Either<DataTypeData, JanusGraphOperationStatus> dataTypeEither = janusGraphGenericDao
             .getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.DataType), uniqueId, DataTypeData.class);
         getDataTypeByUid(dataTypeId).orElseThrow(DataTypeOperationExceptionSupplier.dataTypeNotFound(dataTypeId));
 
         final Either<PropertyDefinition, JanusGraphOperationStatus> resultEither =
-            propertyOperation.updatePropertyAssociatedToNode(NodeTypeEnum.DataType, dataTypeId, PropertyDefinitionDtoMapper.mapTo(propertyDefinitionDto));
+            propertyOperation.updatePropertyAssociatedToNode(NodeTypeEnum.DataType, dataTypeId,
+                PropertyDefinitionDtoMapper.mapTo(propertyDefinitionDto));
         if (resultEither.isRight()) {
             final JanusGraphOperationStatus status = resultEither.right().value();
             LOGGER.debug("Could not update property '{}' on data type '{}'. JanusGraph status is '{}'", propertyName, dataTypeId, status);
             dataTypeDataDefinition.getName(), isAdd);
     }
 
+    public void removeDataTypeFromAdditionalType(final DataTypeDataDefinition dataTypeDataDefinition) {
+        modelOperation.removeDataTypeFromAdditionalType(ElementTypeEnum.DATA_TYPE, dataTypeDataDefinition.getModel(),
+            dataTypeDataDefinition.getName());
+    }
+
     public PropertyDefinitionDto deleteProperty(final DataTypeDataDefinition dataTypeDataDefinition, final String propertyId) {
         final List<PropertyDefinition> propertiesData = findAllProperties(dataTypeDataDefinition.getUniqueId());
         final String dataTypeDataDefinitionName = dataTypeDataDefinition.getName();
         propertiesData.remove(propertyDefinition);
         return PropertyDefinitionDtoMapper.mapFrom(propertyDataDefinition);
     }
-
 }
 
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
+
 package org.openecomp.sdc.be.model.operations.impl;
 
 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.DATA_TYPES;
 @Component("model-operation")
 public class ModelOperation {
 
-    private static final Logger log = Logger.getLogger(ModelOperation.class);
     static final Path ADDITIONAL_TYPE_DEFINITIONS_PATH = Path.of(ADDITIONAL_TYPE_DEFINITIONS);
-
+    private static final Logger log = Logger.getLogger(ModelOperation.class);
     private final JanusGraphGenericDao janusGraphGenericDao;
     private final JanusGraphDao janusGraphDao;
     private final ToscaModelImportCassandraDao toscaModelImportCassandraDao;
                 final Map<String, Object> existingProperties =
                     (Map<String, Object>) ((Map<String, Object>) existingTypeContent.get(newTypeToUpdate.getKey())).get(PROPERTIES.getElementName());
 
-                final List<Entry<String, Object>> propertiesMissingFromNewDef = MapUtils.isEmpty(existingProperties) ? Collections.emptyList()
-                    : existingProperties.entrySet().stream()
-                        .filter(existingPropEntry -> !propertiesInNewDef.keySet().contains(existingPropEntry.getKey()))
-                        .collect(Collectors.toList());
+                final List<Entry<String, Object>> propertiesMissingFromNewDef = MapUtils.isEmpty(existingProperties) ? Collections.emptyList() :
+                    existingProperties.entrySet().stream()
+                        .filter(existingPropEntry -> !propertiesInNewDef.keySet().contains(existingPropEntry.getKey())).collect(Collectors.toList());
 
                 if (CollectionUtils.isNotEmpty(propertiesMissingFromNewDef)) {
                     typesToUpate.put(newTypeToUpdate.getKey(), newTypeToUpdate.getValue());
         toscaModelImportCassandraDao.saveAll(modelName, rebuiltModelImportList);
     }
 
+    public void removeDataTypeFromAdditionalType(final ElementTypeEnum elementTypeEnum, final String modelName, final String name) {
+        final List<ToscaImportByModel> modelImportList = toscaModelImportCassandraDao.findAllByModel(modelName);
+        final Optional<ToscaImportByModel> additionalTypeDefinitionsImportOptional = modelImportList.stream()
+            .filter(t -> ADDITIONAL_TYPE_DEFINITIONS_PATH.equals(Path.of(t.getFullPath()))).findAny();
+        if (additionalTypeDefinitionsImportOptional.isEmpty()) {
+            return;
+        }
+        final ToscaImportByModel additionalTypeDefinitionsImport = additionalTypeDefinitionsImportOptional.get();
+        removeExistingTypesFromDefaultImports(elementTypeEnum, Collections.singletonMap(name, null),
+            Collections.singletonList(additionalTypeDefinitionsImport));
+        final List<ToscaImportByModel> rebuiltModelImportList = modelImportList.stream()
+            .filter(toscaImportByModel -> !ADDITIONAL_TYPE_DEFINITIONS_PATH.equals(Path.of(toscaImportByModel.getFullPath())))
+            .collect(Collectors.toList());
+        rebuiltModelImportList.add(additionalTypeDefinitionsImport);
+        toscaModelImportCassandraDao.saveAll(modelName, rebuiltModelImportList);
+    }
+
     private String buildPropertyAdditionalTypeDefinitionContent(final ElementTypeEnum elementTypeEnum, final String name,
                                                                 final PropertyDefinitionDto property, final Map<String, Object> originalContent,
                                                                 boolean isAdd) {
 
         assertEquals(expectedAdditionalTypesImport.getContent(), actualAdditionalTypesImport.getContent());
     }
 
+    @Test
+    void removeDataTypeFromAdditionalType() throws IOException {
+        var modelName = "model";
+        final Path testResourcePath = Path.of("src/test/resources/modelOperation");
+
+        var originalAdditionalTypesImport = new ToscaImportByModel();
+        originalAdditionalTypesImport.setModelId(modelName);
+        originalAdditionalTypesImport.setFullPath(ADDITIONAL_TYPE_DEFINITIONS_PATH.toString());
+        final Path originalAdditionalTypesImportPath = testResourcePath.resolve(Path.of("original-additional_types-1.yaml"));
+        originalAdditionalTypesImport.setContent(Files.readString(originalAdditionalTypesImportPath));
+
+        final List<ToscaImportByModel> modelImports = new ArrayList<>();
+        modelImports.add(originalAdditionalTypesImport);
+        when(toscaModelImportCassandraDao.findAllByModel(modelName)).thenReturn(modelImports);
+
+        String dataTypeName = "tosca.datatypes.nfv.PreviouslyExistingType1";
+        modelOperation.removeDataTypeFromAdditionalType(ElementTypeEnum.DATA_TYPE, modelName, dataTypeName);
+        ArgumentCaptor<List<ToscaImportByModel>> importListArgumentCaptor = ArgumentCaptor.forClass(List.class);
+        verify(toscaModelImportCassandraDao).saveAll(eq(modelName), importListArgumentCaptor.capture());
+
+        final List<ToscaImportByModel> actualImportList = importListArgumentCaptor.getValue();
+        assertEquals(1, actualImportList.size());
+
+        var expectedAdditionalTypesImport = new ToscaImportByModel();
+        expectedAdditionalTypesImport.setModelId(modelName);
+        expectedAdditionalTypesImport.setFullPath(ADDITIONAL_TYPE_DEFINITIONS_PATH.toString());
+        expectedAdditionalTypesImport.setContent(Files.readString(testResourcePath.resolve(Path.of("expected-additional_types-5.yaml"))));
+        final ToscaImportByModel actualAdditionalTypesImport =
+                actualImportList.stream().filter(expectedAdditionalTypesImport::equals).findFirst().orElse(null);
+        assertNotNull(actualAdditionalTypesImport);
+        assertEquals(expectedAdditionalTypesImport.getContent(), actualAdditionalTypesImport.getContent());
+    }
+
+    @Test
+    void removeOnlyDataTypeFromAdditionalType() throws IOException {
+        var modelName = "model";
+        final Path testResourcePath = Path.of("src/test/resources/modelOperation");
+
+        var originalAdditionalTypesImport = new ToscaImportByModel();
+        originalAdditionalTypesImport.setModelId(modelName);
+        originalAdditionalTypesImport.setFullPath(ADDITIONAL_TYPE_DEFINITIONS_PATH.toString());
+        final Path originalAdditionalTypesImportPath = testResourcePath.resolve(Path.of("original-additional_types-3.yaml"));
+        originalAdditionalTypesImport.setContent(Files.readString(originalAdditionalTypesImportPath));
+
+        final List<ToscaImportByModel> modelImports = new ArrayList<>();
+        modelImports.add(originalAdditionalTypesImport);
+        when(toscaModelImportCassandraDao.findAllByModel(modelName)).thenReturn(modelImports);
+
+        String dataTypeName = "tosca.datatypes.nfv.PreviouslyExistingType1";
+        modelOperation.removeDataTypeFromAdditionalType(ElementTypeEnum.DATA_TYPE, modelName, dataTypeName);
+        ArgumentCaptor<List<ToscaImportByModel>> importListArgumentCaptor = ArgumentCaptor.forClass(List.class);
+        verify(toscaModelImportCassandraDao).saveAll(eq(modelName), importListArgumentCaptor.capture());
+
+        final List<ToscaImportByModel> actualImportList = importListArgumentCaptor.getValue();
+        assertEquals(1, actualImportList.size());
+
+        var expectedAdditionalTypesImport = new ToscaImportByModel();
+        expectedAdditionalTypesImport.setModelId(modelName);
+        expectedAdditionalTypesImport.setFullPath(ADDITIONAL_TYPE_DEFINITIONS_PATH.toString());
+        expectedAdditionalTypesImport.setContent(Files.readString(testResourcePath.resolve(Path.of("expected-additional_types-6.yaml"))));
+        final ToscaImportByModel actualAdditionalTypesImport =
+                actualImportList.stream().filter(expectedAdditionalTypesImport::equals).findFirst().orElse(null);
+        assertNotNull(actualAdditionalTypesImport);
+        assertEquals(expectedAdditionalTypesImport.getContent(), actualAdditionalTypesImport.getContent());
+    }
+
     private ToscaImportByModel createModelImport(final String parentModelName, final String importPath) {
         var toscaImportByModel = new ToscaImportByModel();
         toscaImportByModel.setModelId(parentModelName);
 
--- /dev/null
+tosca_definitions_version: tosca_simple_yaml_1_3
+description: Auto-generated file that contains package custom types or types added
+  after system installation.
+data_types:
+  tosca.datatypes.nfv.PreviouslyExistingType2:
+    derived_from: tosca.datatypes.Root
+    description: additional type
 
--- /dev/null
+tosca_definitions_version: tosca_simple_yaml_1_3
+description: Auto-generated file that contains package custom types or types added
+  after system installation.
+data_types: {
+  }
 
--- /dev/null
+tosca_definitions_version: tosca_simple_yaml_1_3
+description: Auto-generated file that contains package custom types or types added
+  after system installation.
+data_types:
+  tosca.datatypes.nfv.PreviouslyExistingType1:
+    derived_from: tosca.datatypes.Root
+    description: additional type
 
   -->
 
 <div class="sdc-workspace-container">
-  <loader [display]="isLoading"></loader>
+
+  <loader class="loader" [display]="isLoading"></loader>
   <div class="w-sdc-main-container">
     <app-workspace-menu [menuHeader]="dataType.name"
                         (onMenuUpdate)="onMenuUpdate($event)"
         </div>
         <div class="sdc-workspace-top-bar-buttons">
           <button *ngIf="!isViewOnly" data-ng-disabled="!isValidForm || isDisableMode() || isLoading || unsavedChanges" (click)="createImportType()" class="tlv-btn outline green" data-tests-id="create/save">Create</button>
-          <span *ngIf="!isViewOnly" class="delimiter"></span>
+
+          <span *ngIf="!dataType.normative && isViewOnly"
+            class="sprite-new delete-btn"
+            data-tests-id="delete"
+            sdc-smart-tooltip="Delete Type"
+            (click)="deleteDataType()"
+            [title]="'DELETE_LABEL' | translate"></span>
+
+          <span class="delimiter"></span>
           <span class="sprite-new x-btn" (click)="goToBreadcrumbHome()" sdc-smart-tooltip="Close" [title]="'CLOSE_LABEL' | translate"></span>
         </div>
       </div>
 
 .sdc-workspace-container {
     .bg_p;
 
+    .loader {
+        z-index: 2;
+        display: flex;
+        position: relative;
+    }
+
     .w-sdc-main-right-container {
 
         padding: 0;
 
  */
 
 import {Component, Inject, Injector, OnInit} from '@angular/core';
+import {SdcMenuToken, IAppMenu} from "../../config/sdc-menu.config";
 import {MenuItem, MenuItemGroup} from "../../../utils/menu-handler";
 import {CacheService} from "../../services/cache.service";
 import {DataTypeModel} from "../../../models/data-types";
 import {HttpErrorResponse} from "@angular/common/http";
 import {ServerErrorResponse} from "../../../models/server-error-response";
 import {Observable} from "rxjs/Observable";
-import {SdcUiServices} from "onap-ui-angular/dist";
+import {SdcUiCommon, SdcUiComponents, SdcUiServices} from "onap-ui-angular/dist";
 
 @Component({
   selector: 'app-type-workspace',
               private translateService: TranslateService,
               @Inject('$state') private $state: ng.ui.IStateService,
               @Inject('$stateParams') private stateParams,
-              private injector: Injector) { }
+              private injector: Injector,
+              private modalServiceSdcUI: SdcUiServices.ModalService,
+              @Inject(SdcMenuToken) public sdcMenu: IAppMenu) { }
 
   ngOnInit(): void {
     this.sdcVersion = this.cacheService.get('version');
       }
   }
 
+  private deleteDataType() {
+      const modalTitle: string = this.translateService.translate('DELETE_DATA_TYPE_TITLE_CONFIRMATION_TEXT');
+      const modalMessage: string = this.translateService.translate('DELETE_DATA_TYPE_MESSAGE_CONFIRMATION_TEXT');;
+      const modalButton = {
+          testId: 'ok-button',
+          text: this.sdcMenu.alertMessages.okButton,
+          type: SdcUiCommon.ButtonType.warning,
+          callback: this.handleDeleteDataType(),
+          closeModal: true
+      } as SdcUiComponents.ModalButtonComponent;
+      this.modalServiceSdcUI.openWarningModal(modalTitle, modalMessage, 'alert-modal', [modalButton]);
+  }
+
+  private handleDeleteDataType():Function {
+    return () => {
+      this.isLoading = true;
+      this.dataTypeService.deleteDataType(this.dataType.uniqueId).subscribe(()=> {
+        this.Notification.success({
+            message: this.dataType.model + ' ' + this.dataType.name + ' ' + this.translateService.translate('DELETE_SUCCESS_MESSAGE_TEXT'),
+            title: this.translateService.translate("DELETE_SUCCESS_MESSAGE_TITLE")
+        });
+        if (this.$state.params.previousState) {
+            switch (this.$state.params.previousState) {
+                case 'catalog':
+                case 'dashboard':
+                    this.$state.go(this.$state.params.previousState);
+                    break;
+                default:
+                    this.$state.go('dashboard');
+                    break;
+            }
+        }
+    }, (error) => {
+        this.isLoading = false;
+        this.Notification.error({
+            message: this.dataType.model + ' ' + this.dataType.name + ' ' + this.translateService.translate('DELETE_FAILURE_MESSAGE_TEXT'),
+            title: this.translateService.translate('DELETE_FAILURE_MESSAGE_TITLE')
+        });
+        if (error instanceof HttpErrorResponse) {
+            const errorResponse: ServerErrorResponse = new ServerErrorResponse(error);
+            const modalService = this.injector.get(SdcUiServices.ModalService);
+            const errorDetails = {
+                'Error Code': errorResponse.messageId,
+                'Status Code': errorResponse.status
+            };
+            modalService.openErrorDetailModal('Error', errorResponse.message, 'error-modal', errorDetails);
+        }
+    });
+    }
+  }
+
   private updateTypeBreadcrumb(): void {
     this.typeMenuItemGroup.updateSelectedMenuItemText(`Data Type: ${this.dataType.name}`);
   }
 
         NgxDatatableModule,
         SvgIconModule,
         AutoCompleteModule,
-       ConstraintsModule
+        ConstraintsModule
     ],
     declarations: [
         TypeWorkspaceComponent,
 
         });
     }
 
+    public deleteDataType(dataTypeId: string): Observable<Object> {
+        const url = `${this.dataTypeUrl}/${dataTypeId}`;
+        let headers = new HttpHeaders({'USER_ID': this.authService.getLoggedinUser().userId});
+        let options = {headers: headers};
+        return this.httpClient.delete(url, options).map((res: Response) => {
+            return dataTypeId;
+        });
+    }
+
     public createImportedType(model: string, importingFile: File): Observable<any> {
         const url = `${this.dataTypeUploadUrl}/datatypesyaml`;
         const formData = new FormData();
 
   "CREATED_LABEL": "Created",
   "CREATE_LABEL": "Create",
   "CLOSE_LABEL": "Close",
+  "DELETE_LABEL": "Delete",
   "MODIFIED_LABEL": "Modified",
   "UNIQUE_ID_LABEL": "Unique Id",
   "=========== SERVICE IMPORT ===========": "",
   "IMPORT_DATA_TYPE_FAILURE_PROCESSING_MESSAGE_TEXT": "Import Failure - error importing data type",
   "IMPORT_DATA_TYPE_SUCCESS_MESSAGE_TEXT": "Successfully imported",
   "IMPORT_DATA_TYPE_TITLE_TEXT": "Import Data Type",
+  "=========== DATA TYPE DELETE ===========": "",
+  "DELETE_DATA_TYPE_TITLE_CONFIRMATION_TEXT": "Delete Data Type Confirmation",
+  "DELETE_DATA_TYPE_MESSAGE_CONFIRMATION_TEXT": "This data type should only be deleted if it is not in use in any resources or services. Are you sure you want to proceed?",
   "=========== PROPERTIES ===========": "",
   "PROPERTY_LIST_EMPTY_MESSAGE": "There are no properties to display",
   "PROPERTY_SHOWING_LABEL": "Showing Properties",