diff --git a/entity/Activity_entity/recordcontainers/db/onDBInsert.js b/entity/Activity_entity/recordcontainers/db/onDBInsert.js
new file mode 100644
index 0000000000000000000000000000000000000000..3bd6b8b3b9c844e2632f11a231b283d2a46b461a
--- /dev/null
+++ b/entity/Activity_entity/recordcontainers/db/onDBInsert.js
@@ -0,0 +1,10 @@
+import("ActivityTask_lib");
+import("system.vars");
+import("system.db");
+
+var documents = vars.exists("$param.PresetDocuments_param") && vars.getString("$param.PresetDocuments_param");
+if (documents)
+{
+    documents = JSON.parse(documents);
+    ActivityUtils.insertDocuments(vars.get("$field.ACTIVITYID"), documents);
+}
\ No newline at end of file
diff --git a/entity/Letter_entity/recordcontainers/jdito/onInsert.js b/entity/Letter_entity/recordcontainers/jdito/onInsert.js
index 35bc3b14d02877310488934385dc9a5e7472ade0..c2f5bcbd5112cb76c57d5be90df26a6f3d947931 100644
--- a/entity/Letter_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/Letter_entity/recordcontainers/jdito/onInsert.js
@@ -5,10 +5,11 @@ import("DocumentTemplate_lib");
 
 var template = DocumentTemplate.loadTemplate(vars.get("$field.DOCUMENT_TEMPLATE"));
 var contactId = vars.get("$param.ContactId_param");
-neon.download(template.getReplacedContentByContactId(contactId), template.filename);
+var content = template.getReplacedContentByContactId(contactId);
+neon.download(content, template.filename);
 
 var links = [];
 if (contactId)
     links.push(["Person", contactId]); //TODO: dynamic
 
-ActivityUtils.createNewActivity(null, links);
+ActivityUtils.createNewActivity(null, links, null, null, [[template.filename, content, false]]);
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 06a70c61af78cc6fc4140ffba0454a475869c4e2..fd6bc504905131ecefc5a5d4b0367ba1d425a5dd 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -34,10 +34,6 @@
       <key>Anonymization</key>
       <value>Anonymisierung</value>
     </entry>
-    <entry>
-      <key>Members</key>
-      <value>Mitglieder</value>
-    </entry>
     <entry>
       <key>The following data has been anonymised: %0</key>
       <value>Die folgenden Daten wurden anonymisiert: %0</value>
@@ -149,10 +145,6 @@
       <key>Disclosure Report</key>
       <value>Auskunftsbericht</value>
     </entry>
-    <entry>
-      <key>Forecasts</key>
-      <value>Forecasts</value>
-    </entry>
     <entry>
       <key>Abscences</key>
       <value>Abszenzenen</value>
@@ -568,10 +560,6 @@
       <key>${COUNT_PREPOSITION_MULTIPLE}</key>
       <value>mal</value>
     </entry>
-    <entry>
-      <key>Data privacy entries</key>
-      <value>Datenschutzeinträge</value>
-    </entry>
     <entry>
       <key>Email must be unique!</key>
       <value>Die E-Mail-Adresse muss eindeutig sein!</value>
@@ -680,10 +668,6 @@
       <key>The person is already associated with another employee!</key>
       <value>Die Person ist bereits mit einem anderen Mitarbeiter verknüpft!</value>
     </entry>
-    <entry>
-      <key>Appointments</key>
-      <value>Termine</value>
-    </entry>
     <entry>
       <key>Time expenses</key>
       <value>Aufwand</value>
@@ -1526,10 +1510,6 @@
       <key>Remark</key>
       <value>Anmerkung</value>
     </entry>
-    <entry>
-      <key>Cost entries</key>
-      <value>Kosteneinträge</value>
-    </entry>
     <entry>
       <key>Competition</key>
       <value>Mitbewerber</value>
@@ -2050,10 +2030,6 @@
       <key>{$TASK_PRIORITY_LOW}</key>
       <value>niedrig</value>
     </entry>
-    <entry>
-      <key>Duplicatescans</key>
-      <value>Dublettenermittlungen</value>
-    </entry>
     <entry>
       <key>Nur Eigene anzeigen</key>
     </entry>
@@ -2273,10 +2249,6 @@
       <key>Product_functionality</key>
       <value>Produkt_Funktionalität</value>
     </entry>
-    <entry>
-      <key>Timetracking entries</key>
-      <value>Zeiteinträge</value>
-    </entry>
     <entry>
       <key>New appointment</key>
       <value>Neuer Termin</value>
@@ -5025,7 +4997,6 @@
     </entry>
     <entry>
       <key>Salutations</key>
-      <value>Anreden</value>
     </entry>
     <entry>
       <key>Paymentterm</key>
@@ -5133,6 +5104,9 @@
     <entry>
       <key>Bug Ticket</key>
     </entry>
+    <entry>
+      <key>Support ticket</key>
+    </entry>
     <entry>
       <key>New Bugticket</key>
       <value>Neues Bugticket</value>
@@ -5469,10 +5443,6 @@
       <key>Als Attribut ist der Name aus lib_frame z.B. 'ORG' 'PERS' 'OFFER' etc. zu verwenden.</key>
       <value>Als Attribut ist der Name aus lib_frame z.B. 'ORG' 'PERS' 'OFFER' etc. zu verwenden.</value>
     </entry>
-    <entry>
-      <key>Support Tickets</key>
-      <value>Supporttickets</value>
-    </entry>
     <entry>
       <key>Handcraft</key>
       <value>Handwerk</value>
@@ -5521,10 +5491,6 @@
       <key>Quality problem customer</key>
       <value>Qualitätsproblem Kunde</value>
     </entry>
-    <entry>
-      <key>Relation types</key>
-      <value>Beziehungstypen</value>
-    </entry>
     <entry>
       <key>Wine</key>
       <value>Wein</value>
@@ -6005,7 +5971,7 @@
     </entry>
     <entry>
       <key>Support Ticket</key>
-      <value>Supportticket</value>
+      <value>Support Ticket</value>
     </entry>
     <entry>
       <key>Rented car</key>
@@ -6348,7 +6314,31 @@
       <key>Occurrence</key>
     </entry>
     <entry>
-      <key>Support ticket</key>
+      <key>Forecasts</key>
+    </entry>
+    <entry>
+      <key>Relation types</key>
+    </entry>
+    <entry>
+      <key>Data privacy entries</key>
+    </entry>
+    <entry>
+      <key>Timetracking entries</key>
+    </entry>
+    <entry>
+      <key>Duplicatescans</key>
+    </entry>
+    <entry>
+      <key>Appointments</key>
+    </entry>
+    <entry>
+      <key>Support Tickets</key>
+    </entry>
+    <entry>
+      <key>Members</key>
+    </entry>
+    <entry>
+      <key>Cost entries</key>
     </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
diff --git a/process/Bulkmail_lib/process.js b/process/Bulkmail_lib/process.js
index 5bed96cdc9c355cb7b732e8ddc4ce2ff80a808ae..9f49e54e7b7539bfc8eef5c87b6a0725937caa06 100644
--- a/process/Bulkmail_lib/process.js
+++ b/process/Bulkmail_lib/process.js
@@ -8,6 +8,7 @@ import("KeywordRegistry_basic");
 import("Sql_lib");
 import("system.db");
 import("DocumentTemplate_lib");
+import("Communication_lib");
 import("Email_lib");
 import("system.process");
 import("system.notification");
@@ -46,21 +47,23 @@ BulkMailUtils.sendBulkMailOnServer = function (pBulkMailId, pUser)
  */
 BulkMailUtils.sendBulkMail = function (pBulkMailId)
 {
-    //TODO: Mailbridge, Werbesperre beachten
-    
     var [templateId, subject, emailSender] = db.array(db.ROW, SqlCondition.begin()
         .andPrepare("BULKMAIL.BULKMAILID", pBulkMailId)
         .buildSql("select DOCUMENTTEMPLATE_ID, SUBJECT, SENDER from BULKMAIL", "1=2")
     );
     var template = BulkMailUtils.getBulkMailTemplate(pBulkMailId, templateId);
     
-    var recipientData = db.table(SqlCondition.begin()
-        .andPrepare("BULKMAILRECIPIENT.BULKMAIL_ID", pBulkMailId)
-        .andPrepare("BULKMAILRECIPIENT.STATUS", $KeywordRegistry.bulkMailRecipientStatus$sent(), "# != ?")
-        .andSqlCondition(ContactUtils.getCommRestrictionCondition($KeywordRegistry.communicationMediumCampaign$mail(), true))
-        .buildSql("select BULKMAILRECIPIENTID, BULKMAILRECIPIENT.CONTACT_ID, '' from BULKMAILRECIPIENT \n\
-            join CONTACT on BULKMAILRECIPIENT.CONTACT_ID = CONTACT.CONTACTID", "1=2")
-    );
+    var sql = SqlBuilder.begin()
+        .select("BULKMAILRECIPIENTID, BULKMAILRECIPIENT.CONTACT_ID, (" + CommUtil.getStandardSubSqlMail() + ")")
+        .from("BULKMAILRECIPIENT")
+        .join("CONTACT", "BULKMAILRECIPIENT.CONTACT_ID = CONTACT.CONTACTID")
+        .where(SqlCondition.begin()
+            .andPrepare("BULKMAILRECIPIENT.BULKMAIL_ID", pBulkMailId)
+            .andPrepare("BULKMAILRECIPIENT.STATUS", $KeywordRegistry.bulkMailRecipientStatus$sent(), "# != ?")
+            .andSqlCondition(ContactUtils.getCommRestrictionCondition($KeywordRegistry.communicationMediumCampaign$mail(), true)))
+        .build();
+        
+    var recipientData = db.table(sql);
     var contactIds = recipientData.map(function (e) {return e[1];});
     var successIds = [];
     var failedIds = [];
@@ -77,7 +80,7 @@ BulkMailUtils.sendBulkMail = function (pBulkMailId)
         let email = mails[contactId];
         if (email !== undefined && recipientData[i][2])
         {
-            email.toRecipients = [recipientData[i][2]]; //TODO: email address missing
+            email.toRecipients = [recipientData[i][2]];
             email.sender = emailSender;
             email.subject = subjects[contactId];
 
diff --git a/process/Email_lib/process.js b/process/Email_lib/process.js
index 85ee436af9830e224fc709b0e1fb974725ede06f..eeb0b8a3124b77105f62e7808fd46f93653d716a 100644
--- a/process/Email_lib/process.js
+++ b/process/Email_lib/process.js
@@ -250,6 +250,7 @@ Email.prototype.send = function ()
     }
     catch (ex)
     {
+        logging.log(ex);
         return false;
     }
 }
\ No newline at end of file