diff --git a/entity/Person_entity/entityfields/deletefunction/onActionProcess.js b/entity/Person_entity/entityfields/deletefunction/onActionProcess.js
index 324c438c9d7953e5177748efa8679fe55ab0e8f6..ad39217d091cf412a26e76dd62c0296d2b2f898e 100644
--- a/entity/Person_entity/entityfields/deletefunction/onActionProcess.js
+++ b/entity/Person_entity/entityfields/deletefunction/onActionProcess.js
@@ -1,3 +1,8 @@
+import("KeywordRegistry_basic");
+import("system.translate");
+import("system.question");
+import("Contact_lib");
+import("Entity_lib");
 import("system.entities");
 import("system.neon");
 import("Workflow_lib");
@@ -16,25 +21,43 @@ var contactIds = newSelect("count(CONTACT.CONTACTID)")
 if(contactIds > 1)
 {
     var contactId = vars.get("$field.CONTACTID");
-
-    var config = entities.createConfigForDeletingRows().entity("Contact_entity").uid(contactId);
+    var context = ContextUtils.getCurrentContextId();
+    
+    if (ContactUtils.isDeletable(context, contactId)) 
+    {
+        var config = entities.createConfigForDeletingRows().entity("Contact_entity").uid(contactId);
     
-    entities.deleteRow(config);
+        entities.deleteRow(config);
     
-    DuplicateScannerUtils.deleteHasDuplicateEntries("Person_entity", [contactId]);
+        DuplicateScannerUtils.deleteHasDuplicateEntries("Person_entity", [contactId]);
 
-    new AttributeRelationQuery(contactId, null, ContextUtils.getCurrentContextId())
-        .deleteAllAttributes();
+        new AttributeRelationQuery(contactId, null, context)
+            .deleteAllAttributes();
 
-    newWhere("COMMUNICATION.CONTACT_ID", contactId).deleteData();
-    newWhere("ADDRESS.CONTACT_ID", contactId).deleteData();
-    newWhere("COMMRESTRICTION.CONTACT_ID", contactId).deleteData();
-    newWhere("AB_APPOINTMENTLINK.OBJECT_TYPE", "Person")
-    .and("AB_APPOINTMENTLINK.OBJECT_ROWID", contactId).deleteData();
-    newWhere("AB_ATTRIBUTERELATION.OBJECT_TYPE", "Person")
-    .and("AB_ATTRIBUTERELATION.OBJECT_ROWID", contactId).deleteData();
+        newWhere("COMMUNICATION.CONTACT_ID", contactId)
+            .deleteData();
+        newWhere("ADDRESS.CONTACT_ID", contactId)
+            .deleteData();
+        newWhere("COMMRESTRICTION.CONTACT_ID", contactId)
+            .deleteData();
+        newWhere("AB_APPOINTMENTLINK.OBJECT_TYPE", "Person")
+            .and("AB_APPOINTMENTLINK.OBJECT_ROWID", contactId)
+            .deleteData();
+        newWhere("AB_ATTRIBUTERELATION.OBJECT_TYPE", "Person")
+            .and("AB_ATTRIBUTERELATION.OBJECT_ROWID", contactId)
+            .deleteData();
 
-    WorkflowSignalSender.deleted();
+        WorkflowSignalSender.deleted();
+    }
+    else
+    {
+        let config = entities.createConfigForUpdatingRows()
+        .uid(contactId)
+        .entity("Contact_entity")
+        .fieldValues({"STATUS": $KeywordRegistry.contactStatus$inactive()});
+        entities.updateRow(config);
+        question.showMessage(translate.text("The function could not be deleted because it has links to other objects. The status of the function was set to inactive."), question.INFORMATION, translate.text("Hint"));
+    }
     
     neon.closeImage(vars.get("$sys.currentimage"), true); //ToDo: #1070797 This should probably not be necessary 
 }
\ No newline at end of file
diff --git a/entity/Person_entity/grantDeleteProcess.js b/entity/Person_entity/grantDeleteProcess.js
index 36866c88c8b760c3a8e009714d49ebfb2c9674f3..e824b93f79c5604e2cafc1a3f45b64a3efe6a7c6 100644
--- a/entity/Person_entity/grantDeleteProcess.js
+++ b/entity/Person_entity/grantDeleteProcess.js
@@ -1,3 +1,4 @@
+import("Contact_lib");
 import("Sql_lib");
 import("Entity_lib");
 import("Employee_lib");
@@ -20,17 +21,7 @@ if(personCount == 1)
     var contactId = vars.get("$field.CONTACTID");
     var currentContext = ContextUtils.getCurrentContextId();
 
-    canDelete = new HasLinkedObjectTester()
-        .andNoEntityRows("Activity_entity", "LinkedObjects", {ObjectId_param : currentContext, RowId_param : contactId}) //Activities
-        .andNoEntityRows("Task_entity", "Tasks", {ObjectId_param : currentContext, RowId_param : contactId}) //Tasks
-        .andNoEntityRows("Document_entity", "Documents", {AssignmentTable_param : "CONTACT", AssignmentRowId_param : contactId}) //Documents
-        .and(function () {return !EmployeeUtils.isUser(contactId);})
-        .andNoEntityRows("Offer_entity", "ContactOffers", {ContactId_param : contactId}) //Offers
-        .andNoEntityRows("Contract_entity", "Contracts", {ContactId_param : contactId}) //Contracts
-        .andNoEntityRows("ObjectTree_entity", "TreeProvider", {ObjectIds_param : JSON.stringify([contactId, vars.get("$field.PERSON_ID")]), ObjectTypes_param : JSON.stringify([currentContext, "PrivatePerson"])})
-        .andNoEntityRows("CampaignParticipant_entity", "CampaignParticipantsProvider", {ContactId_param : contactId})
-        .andNoEntityRows("Order_entity", "#PROVIDER", {ContactId_param : contactId})
-        .validate();
+    canDelete = ContactUtils.isDeletable(currentContext, contactId, vars.get("$field.PERSON_ID"));
 }
 else if (personCount == 0) //special case in QuickEntry where it should be possible to remove a new Person that is not saved in the db yet
     canDelete = true;
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index 8678431e07a0d774139d83a29cfe20e7be175e82..3e87a125dc44a990cf9376070e7adf27dd7d68ad 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -9037,6 +9037,57 @@
     <entry>
       <key>Turnover and Forecast</key>
     </entry>
+    <entry>
+      <key>The chosen attributes were successfully set for %0 %1</key>
+    </entry>
+    <entry>
+      <key>SerialLetter</key>
+    </entry>
+    <entry>
+      <key>Bulkmail</key>
+    </entry>
+    <entry>
+      <key>%0 recipient will be added to the serial letter.</key>
+    </entry>
+    <entry>
+      <key>The attribute \"%0\" couldn't be set for %1 %2, because %3.</key>
+    </entry>
+    <entry>
+      <key>the max amount of this attribute has been reached</key>
+    </entry>
+    <entry>
+      <key>set attribute (use filter result)</key>
+    </entry>
+    <entry>
+      <key>The chosen attribute was successfully set for %0 %1</key>
+    </entry>
+    <entry>
+      <key>The function could not be deleted because it has links to other objects. The status of the function was set to inactive.</key>
+    </entry>
+    <entry>
+      <key>Volume (Euro)</key>
+    </entry>
+    <entry>
+      <key>add Attributes</key>
+    </entry>
+    <entry>
+      <key>%0 recipient will be added to the bulk mail.</key>
+    </entry>
+    <entry>
+      <key>Attribute \"%0\" can only be inserted once with the same value.</key>
+    </entry>
+    <entry>
+      <key>Set attribute (use filter result)</key>
+    </entry>
+    <entry>
+      <key>set attribute (selected data)</key>
+    </entry>
+    <entry>
+      <key>affected rows:</key>
+    </entry>
+    <entry>
+      <key>this attribute with the same value exists already</key>
+    </entry>
     <entry>
       <key>DSGVO - relevant attributes</key>
     </entry>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index ce38a46d86d48da6db5ca4a06bdf848da1989672..4281a25dfa7293e24739374e6f464da21554caba 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -11889,6 +11889,13 @@ Bitte Datumseingabe prüfen</value>
     <entry>
       <key>Shows the organisations turnover and forecast</key>
     </entry>
+    <entry>
+      <key>The function could not be deleted because it has links to other objects. The status of the function was set to inactive.</key>
+      <value>Die Funktion konnte nicht gelöscht werden, da sie Verknüpfungen zu weiteren Objekten besitzt. Der Status der Funktion wurde auf Inaktiv gesetzt.</value>
+    </entry>
+    <entry>
+      <key>set attribute (use filter result)</key>
+    </entry>
     <entry>
       <key>DSGVO - relevant attributes</key>
       <value>DSGVO - Relevante Eigenschaften</value>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 56c629be8af78598f9621fbc5072d23b0e3d6877..5c127cfa6059dddf69bcc5ac86d5936304fd075a 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -9149,6 +9149,30 @@
     <entry>
       <key>Turnover and Forecast</key>
     </entry>
+    <entry>
+      <key>SerialLetter</key>
+    </entry>
+    <entry>
+      <key>Bulkmail</key>
+    </entry>
+    <entry>
+      <key>%0 recipient will be added to the serial letter.</key>
+    </entry>
+    <entry>
+      <key>The function could not be deleted because it has links to other objects. The status of the function was set to inactive.</key>
+    </entry>
+    <entry>
+      <key>Volume (Euro)</key>
+    </entry>
+    <entry>
+      <key>%0 recipient will be added to the bulk mail.</key>
+    </entry>
+    <entry>
+      <key>Attribute \"%0\" can only be inserted once with the same value.</key>
+    </entry>
+    <entry>
+      <key>Set attribute (use filter result)</key>
+    </entry>
     <entry>
       <key>DSGVO - relevant attributes</key>
     </entry>
diff --git a/neonView/ContactList_view/ContactList_view.aod b/neonView/ContactList_view/ContactList_view.aod
index 8e2c5d8685c04966fef313dc86b1a685702f0f95..f5f7695c21862e7833187b2a07d610df45f6ba25 100644
--- a/neonView/ContactList_view/ContactList_view.aod
+++ b/neonView/ContactList_view/ContactList_view.aod
@@ -12,6 +12,7 @@
       <name>Contacts</name>
       <hideContentSearch v="true" />
       <entityField>#ENTITY</entityField>
+      <isDeletable v="false" />
       <isEditable v="false" />
       <columns>
         <neonTableColumn>
diff --git a/process/Contact_lib/process.js b/process/Contact_lib/process.js
index 359de1018a3b460cfe976a32a68de048beca130d..680fa7a6fa9650d04592b12329701c426f1f14b7 100644
--- a/process/Contact_lib/process.js
+++ b/process/Contact_lib/process.js
@@ -1,4 +1,5 @@
 import("Organisation_lib");
+import("Employee_lib");
 import("KeywordRegistry_basic");
 import("MarketingCondition_lib");
 import("Keyword_lib");
@@ -741,6 +742,30 @@ ContactUtils.getCommFilter = function(pOperator, pRawvalue, pFilterOperatorName,
     return resultSqlCond;
 }
 
+/**
+ * Checks all links to other entities, if none exist, the function returns true, otherwise false.
+ * 
+ * @param {String} pCurrentContext the context of the caller
+ * @param {String} pContactId 
+ * @param {String} [pPersonId=undefined]
+ * 
+ * @return {Boolean} Can the contact be deleted?
+ */
+ContactUtils.isDeletable = function (pCurrentContext, pContactId, pPersonId) 
+{
+    return new HasLinkedObjectTester()
+        .andNoEntityRows("Activity_entity", "LinkedObjects", {ObjectId_param : pCurrentContext, RowId_param : pContactId}) //Activities
+        .andNoEntityRows("Task_entity", "Tasks", {ObjectId_param : pCurrentContext, RowId_param : pContactId}) //Tasks
+        .andNoEntityRows("Document_entity", "Documents", {AssignmentTable_param : "CONTACT", AssignmentRowId_param : pContactId}) //Documents
+        .and(function () {return !EmployeeUtils.isUser(pContactId);})
+        .andNoEntityRows("Offer_entity", "ContactOffers", {ContactId_param : pContactId}) //Offers
+        .andNoEntityRows("Contract_entity", "Contracts", {ContactId_param : pContactId}) //Contracts
+        .andNoEntityRows("ObjectTree_entity", "TreeProvider", {ObjectIds_param : pPersonId ? JSON.stringify([pContactId, pPersonId]) : pContactId, ObjectTypes_param : pPersonId ? JSON.stringify([pCurrentContext, "PrivatePerson"]) : pCurrentContext})
+        .andNoEntityRows("CampaignParticipant_entity", "CampaignParticipantsProvider", {ContactId_param : pContactId})
+        .andNoEntityRows("Order_entity", "#PROVIDER", {ContactId_param : pContactId})
+        .validate();
+}
+
 /**
  * object for handling of a single contact
  * provides static- and instance-functions