diff --git a/.liquibase/Data_alias/basic/2019.1.4/BulkMail/create_bulkmail.xml b/.liquibase/Data_alias/basic/2019.1.4/BulkMail/create_bulkmail.xml
index ba2bdc4fb1d1e794b0e24d2da6d1ac2de7ae22fa..aeab847c94b732991397ea433804c7be13cd2d4d 100644
--- a/.liquibase/Data_alias/basic/2019.1.4/BulkMail/create_bulkmail.xml
+++ b/.liquibase/Data_alias/basic/2019.1.4/BulkMail/create_bulkmail.xml
@@ -12,6 +12,9 @@
             <column name="SENDER" type="NVARCHAR(50)"/>
             <column name="NAME" type="NVARCHAR(50)"/>
             <column name="SUBJECT" type="NVARCHAR(100)"/>
+            <column name="CREATEACTIVITIES" type="TINYINT"/>
+            <column name="TESTING_CONTACT_ID" type="CHAR(36)"/>
+            <column name="TESTING_EMAIL_ADDRESS" type="NVARCHAR(50)"/>
         </createTable>
     </changeSet>
 </databaseChangeLog>
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 9f69a2a6b646c616ec03bd7e00fdb12a9c9d96f7..1e250138137283bfec0313782447a8334a4faf15 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -9564,6 +9564,48 @@
                 <title></title>
                 <description></description>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>CREATEACTIVITIES</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="5" />
+                <size v="5" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>TESTING_CONTACT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>TESTING_EMAIL_ADDRESS</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
diff --git a/entity/AnyContact_entity/AnyContact_entity.aod b/entity/AnyContact_entity/AnyContact_entity.aod
index 723c34d97f90b021cd0a75b4df7773754bc1c1fb..6f36172e79513e874e73272cc1ccdc7eabe2aec3 100644
--- a/entity/AnyContact_entity/AnyContact_entity.aod
+++ b/entity/AnyContact_entity/AnyContact_entity.aod
@@ -56,6 +56,18 @@
           <fieldName>AnyContacts</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>aca9e52c-9138-4ef1-b039-1efeb3deb822</name>
+          <entityName>BulkMailTesting_entity</entityName>
+          <fieldName>Contacts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>bbd2bf84-7cad-4156-b736-32749949f97c</name>
+          <entityName>BulkMail_entity</entityName>
+          <fieldName>Contacts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityField>
diff --git a/entity/Attribute_entity/recordcontainers/jdito/onDelete.js b/entity/Attribute_entity/recordcontainers/jdito/onDelete.js
index 046b1dca18f622ac02623b1f82cb419c9d0d5d81..7368edfb0952b1e71b18ab71f9925a8a4e3df075 100644
--- a/entity/Attribute_entity/recordcontainers/jdito/onDelete.js
+++ b/entity/Attribute_entity/recordcontainers/jdito/onDelete.js
@@ -14,21 +14,21 @@ var attributeId = vars.get("$field.UID");
 var childIds = AttributeUtil.getAllChildren(attributeId).concat(attributeId);
 
 condition = SqlCondition.begin()
-    .and("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID in ('" + childIds.join("','") + "')")
+    .andIn("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", childIds)
     .build();
 
 //delete all entries in AB_ATTRIBUTEUSAGE belonging to the attribute to avoid unrelated entries
 db.deleteData("AB_ATTRIBUTEUSAGE", condition);
 
 condition = SqlCondition.begin()
-    .and("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID in ('" + childIds.join("','") + "')")
+    .andIn("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID", childIds)
     .build();
 
 //delete all entries in AB_ATTRIBUTERELATION for the attributes
 db.deleteData("AB_ATTRIBUTERELATION", condition);
 
 condition = SqlCondition.begin()
-    .and("AB_ATTRIBUTE.AB_ATTRIBUTEID in ('" + childIds.join("','") + "')")
+    .andIn("AB_ATTRIBUTE.AB_ATTRIBUTEID", childIds)
     .build();
 
 //delete all attribute children
diff --git a/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js b/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js
index d47a0319721d5b49a4e57fcce24ca7009dd1fc34..e1544b133d51a8aa459dc86d1135c68d29ad18f1 100644
--- a/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js
@@ -4,4 +4,4 @@ import("system.vars");
 var contactIds = JSON.parse(vars.getString("$field.recipientContactIds"));
 var bulkMailId = vars.get("$field.BULKMAIL_ID");
 
-BulkMailUtils.addRecipients(bulkMailId, contactIds);
+BulkMailUtils.addRecipients(bulkMailId, contactIds);
\ No newline at end of file
diff --git a/entity/BulkMailStatusChart_entity/BulkMailStatusChart_entity.aod b/entity/BulkMailStatusChart_entity/BulkMailStatusChart_entity.aod
index 95ce38d165808b3a1b9ed7274caf934580778f27..fbcdd8dd9bd296ecb6d66f763651a557a5420d72 100644
--- a/entity/BulkMailStatusChart_entity/BulkMailStatusChart_entity.aod
+++ b/entity/BulkMailStatusChart_entity/BulkMailStatusChart_entity.aod
@@ -3,6 +3,9 @@
   <name>BulkMailStatusChart_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Recipient status</title>
+  <siblings>
+    <element>BulkMailRecipient_entity</element>
+  </siblings>
   <titlePlural>Recipient status</titlePlural>
   <recordContainer>jdito</recordContainer>
   <entityFields>
diff --git a/entity/BulkMailTesting_entity/BulkMailTesting_entity.aod b/entity/BulkMailTesting_entity/BulkMailTesting_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..c52f6e47d0cf91b2228879ca13486123ec953cfa
--- /dev/null
+++ b/entity/BulkMailTesting_entity/BulkMailTesting_entity.aod
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.10" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.10">
+  <name>BulkMailTesting_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <siblings>
+    <element>BulkMail_entity</element>
+  </siblings>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityField>
+      <name>TESTING_CONTACT_ID</name>
+      <title>Testing contact</title>
+      <consumer>Contacts</consumer>
+      <linkedContext>AnyContact</linkedContext>
+      <valueProcess>%aditoprj%/entity/BulkMailTesting_entity/entityfields/testing_contact_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/BulkMailTesting_entity/entityfields/testing_contact_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>TESTING_EMAIL_ADDRESS</name>
+      <title>Recipient address</title>
+      <valueProcess>%aditoprj%/entity/BulkMailTesting_entity/entityfields/testing_email_address/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>SAVESETTINGS</name>
+      <title>Save settings</title>
+      <contentType>BOOLEAN</contentType>
+      <dropDownProcess>%aditoprj%/entity/BulkMailTesting_entity/entityfields/savesettings/dropDownProcess.js</dropDownProcess>
+    </entityField>
+    <entityParameter>
+      <name>BulkMailId_param</name>
+      <expose v="true" />
+      <mandatory v="true" />
+    </entityParameter>
+    <entityConsumer>
+      <name>Contacts</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AnyContact_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
+    </entityConsumer>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <onInsert>%aditoprj%/entity/BulkMailTesting_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/BulkMailTesting_entity/entityfields/savesettings/dropDownProcess.js b/entity/BulkMailTesting_entity/entityfields/savesettings/dropDownProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..ea87f0cb35f482786bbea6794140e8926fca3935
--- /dev/null
+++ b/entity/BulkMailTesting_entity/entityfields/savesettings/dropDownProcess.js
@@ -0,0 +1,7 @@
+import("system.translate");
+import("system.result");
+
+result.object([
+    ["1", translate.text("Yes")],
+    ["0", translate.text("No")],
+]);
\ No newline at end of file
diff --git a/entity/BulkMailTesting_entity/entityfields/testing_contact_id/displayValueProcess.js b/entity/BulkMailTesting_entity/entityfields/testing_contact_id/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..3cfd8a80f6d4914aa8636462e5fa8aaa63cb702e
--- /dev/null
+++ b/entity/BulkMailTesting_entity/entityfields/testing_contact_id/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("Contact_lib");
+
+result.string(ContactUtils.getTitleByContactId(vars.get("$field.TESTING_CONTACT_ID")));
\ No newline at end of file
diff --git a/entity/BulkMailTesting_entity/entityfields/testing_contact_id/valueProcess.js b/entity/BulkMailTesting_entity/entityfields/testing_contact_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..49dff7de739727af391d894fa9afd4d63d0a5f0c
--- /dev/null
+++ b/entity/BulkMailTesting_entity/entityfields/testing_contact_id/valueProcess.js
@@ -0,0 +1,15 @@
+import("Sql_lib");
+import("system.db");
+import("Employee_lib");
+import("system.vars");
+import("system.result");
+
+var contactId = db.cell(SqlCondition.begin()
+    .andPrepareVars("BULKMAIL.BULKMAILID", "$param.BulkMailId_param")
+    .buildSql("select TESTING_CONTACT_ID from BULKMAIL")
+);
+if (!contactId)
+    contactId = EmployeeUtils.getCurrentContactId();
+    
+if (vars.get("$this.value") == null)
+    result.string(contactId);
\ No newline at end of file
diff --git a/entity/BulkMailTesting_entity/entityfields/testing_email_address/valueProcess.js b/entity/BulkMailTesting_entity/entityfields/testing_email_address/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..261b02cb666e2bdeb75a544dd1ad646dece04c1e
--- /dev/null
+++ b/entity/BulkMailTesting_entity/entityfields/testing_email_address/valueProcess.js
@@ -0,0 +1,12 @@
+import("Sql_lib");
+import("system.db");
+import("Employee_lib");
+import("system.vars");
+import("system.result");
+
+var email = db.cell(SqlCondition.begin()
+    .andPrepareVars("BULKMAIL.BULKMAILID", "$param.BulkMailId_param")
+    .buildSql("select TESTING_EMAIL_ADDRESS from BULKMAIL")
+);
+if (vars.get("$this.value") == null)
+    result.string(email);
\ No newline at end of file
diff --git a/entity/BulkMailTesting_entity/recordcontainers/jdito/onInsert.js b/entity/BulkMailTesting_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 0000000000000000000000000000000000000000..a2489e0b7b3772dbf08cb0cf881774f3bc0193c4
--- /dev/null
+++ b/entity/BulkMailTesting_entity/recordcontainers/jdito/onInsert.js
@@ -0,0 +1,16 @@
+import("Sql_lib");
+import("system.db");
+import("Bulkmail_lib");
+import("system.vars");
+
+var testingContact = vars.get("$field.TESTING_CONTACT_ID");
+var testingEmail = vars.get("$field.TESTING_EMAIL_ADDRESS");
+var bulkMailId = vars.get("$param.BulkMailId_param");
+
+BulkMailUtils.sendBulkMailOnServer(bulkMailId, [[testingContact, testingEmail]]);
+
+if (vars.get("$field.SAVESETTINGS") == "1")
+{
+    db.updateData("BULKMAIL", ["TESTING_CONTACT_ID", "TESTING_EMAIL_ADDRESS"], null, [testingContact, testingEmail], 
+        SqlCondition.equals("BULKMAIL.BULKMAILID", bulkMailId));
+}
\ No newline at end of file
diff --git a/entity/BulkMail_entity/BulkMail_entity.aod b/entity/BulkMail_entity/BulkMail_entity.aod
index 8515c20fd9547767d32b95b3ce2cb92f4430b9a3..f2ff471f468f88ef8f003010182d8ba2bb003f08 100644
--- a/entity/BulkMail_entity/BulkMail_entity.aod
+++ b/entity/BulkMail_entity/BulkMail_entity.aod
@@ -186,6 +186,28 @@
       <onActionProcess>%aditoprj%/entity/BulkMail_entity/entityfields/testmail/onActionProcess.js</onActionProcess>
       <iconId>VAADIN:CLIPBOARD_CHECK</iconId>
     </entityActionField>
+    <entityField>
+      <name>TESTING_CONTACT_ID</name>
+      <title>Testing contact</title>
+      <consumer>Contacts</consumer>
+      <linkedContext>AnyContact</linkedContext>
+    </entityField>
+    <entityField>
+      <name>TESTING_EMAIL_ADDRESS</name>
+      <title>Recipient address</title>
+    </entityField>
+    <entityParameter>
+      <name>SendTestMail_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityConsumer>
+      <name>Contacts</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AnyContact_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -253,6 +275,22 @@
           <name>STATUS.displayValue</name>
           <expression>%aditoprj%/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js</expression>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CREATEACTIVITIES.value</name>
+          <recordfield>BULKMAIL.CREATEACTIVITIES</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>TESTING_CONTACT_ID.value</name>
+          <recordfield>BULKMAIL.TESTING_CONTACT_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>TESTING_EMAIL_ADDRESS.value</name>
+          <recordfield>BULKMAIL.TESTING_EMAIL_ADDRESS</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>TESTING_CONTACT_ID.displayValue</name>
+          <expression>%aditoprj%/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/testing_contact_id.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/BulkMail_entity/entityfields/testmail/onActionProcess.js b/entity/BulkMail_entity/entityfields/testmail/onActionProcess.js
index 9dcf990316b9b824b8377fc6f18a362be936f684..e388a53ee6f1dd001a55727837a83cd302bfd1d7 100644
--- a/entity/BulkMail_entity/entityfields/testmail/onActionProcess.js
+++ b/entity/BulkMail_entity/entityfields/testmail/onActionProcess.js
@@ -1,4 +1,17 @@
+import("system.neon");
+import("system.db");
+import("Employee_lib");
 import("system.vars");
 import("Bulkmail_lib");
 
-BulkMailUtils.sendBulkMailOnServer(vars.get("$field.BULKMAILID"));
\ No newline at end of file
+var testingContact = vars.get("$field.TESTING_CONTACT_ID");
+var testingEmail = vars.get("$field.TESTING_EMAIL_ADDRESS");
+
+if (testingContact && testingEmail)
+    BulkMailUtils.sendBulkMailOnServer(vars.get("$field.BULKMAILID"), [[testingContact, testingEmail]]);
+else
+    neon.openContext("BulkMailTesting", "BulkMailTesting_view", null, neon.OPERATINGSTATE_NEW, {
+        "BulkMailId_param" : vars.get("$field.BULKMAILID")
+    });
+
+
diff --git a/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/testing_contact_id.displayvalue/expression.js b/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/testing_contact_id.displayvalue/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..11979e350e55cd52f6940d5ded3a206a89448002
--- /dev/null
+++ b/entity/BulkMail_entity/recordcontainers/db/recordfieldmappings/testing_contact_id.displayvalue/expression.js
@@ -0,0 +1,4 @@
+import("Contact_lib");
+import("system.result");
+
+result.string(ContactUtils.getResolvingDisplaySubSql("BULKMAIL.TESTING_CONTACT_ID"));
\ No newline at end of file
diff --git a/neonContext/BulkMailTesting/BulkMailTesting.aod b/neonContext/BulkMailTesting/BulkMailTesting.aod
new file mode 100644
index 0000000000000000000000000000000000000000..bd41c66175b414b5760d29f1ac787d6658501b30
--- /dev/null
+++ b/neonContext/BulkMailTesting/BulkMailTesting.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
+  <name>BulkMailTesting</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <entity>BulkMailTesting_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>5ed51616-707d-4418-b63a-2e884f903cb3</name>
+      <view>BulkMailTesting_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonView/BulkMailPreview_view/BulkMailPreview_view.aod b/neonView/BulkMailPreview_view/BulkMailPreview_view.aod
index bd3f635140211001485e5f0458d86cf2620525b6..a253dad73d0189accb53314fdaf9a03ff7d204bb 100644
--- a/neonView/BulkMailPreview_view/BulkMailPreview_view.aod
+++ b/neonView/BulkMailPreview_view/BulkMailPreview_view.aod
@@ -49,6 +49,22 @@
         </entityFieldLink>
       </fields>
     </genericViewTemplate>
+    <genericViewTemplate>
+      <name>Testing</name>
+      <showDrawer v="true" />
+      <drawerCaption>Testing</drawerCaption>
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>ea406803-6189-4de0-aa41-f09f7e1b2336</name>
+          <entityField>TESTING_CONTACT_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>f8963199-c89b-48e5-a92c-8f655c05acab</name>
+          <entityField>TESTING_EMAIL_ADDRESS</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
     <neonViewReference>
       <name>6def3a7a-c9a0-4f2d-a36f-e53a631d8261</name>
       <entityField>RecipientStatusChart</entityField>
diff --git a/neonView/BulkMailTesting_view/BulkMailTesting_view.aod b/neonView/BulkMailTesting_view/BulkMailTesting_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..6fee3e30ccdab6233676b7af3d8242fad0e5f2fa
--- /dev/null
+++ b/neonView/BulkMailTesting_view/BulkMailTesting_view.aod
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.2">
+  <name>BulkMailTesting_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <isSmall v="true" />
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Generic</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>d99dbdae-54cf-432c-8aba-ccb220d330b9</name>
+          <entityField>TESTING_CONTACT_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>43ce58eb-76c8-4b6d-9aa7-1b63d5415895</name>
+          <entityField>TESTING_EMAIL_ADDRESS</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>7d83d5ca-52a9-4770-894d-d91d81e3ca14</name>
+          <entityField>SAVESETTINGS</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/process/Bulkmail_lib/process.js b/process/Bulkmail_lib/process.js
index d143652488115d6ebd2f2bc51e718b0ff6b75721..c0a668abd2340c4e49c001d287ed175996531116 100644
--- a/process/Bulkmail_lib/process.js
+++ b/process/Bulkmail_lib/process.js
@@ -22,18 +22,18 @@ function BulkMailUtils () {}
  * Executes a process to send bulk mails on the server and creates a notification when finished.
  * 
  * @param {String} pBulkMailId id of the bulk mail
- * @param {Array} [pRecipients=bulkMailRecipients] overwrite the recipients (e.g. for testing)
+ * @param {Array} [pTestRecipients] overwrite the recipients (e.g. for testing)
  * @param {String} [pUser=currentUser] User that will get the notification, if null (not undefined!), no notification
  *                                      will be created.
  */
-BulkMailUtils.sendBulkMailOnServer = function (pBulkMailId, pRecipients, pUser)
+BulkMailUtils.sendBulkMailOnServer = function (pBulkMailId, pTestRecipients, pUser)
 {
     if (pUser === undefined)
         pUser = EmployeeUtils.getCurrentUserId();
     process.execute("sendBulkMail_serverProcess", 
         {
             bulkMailId : pBulkMailId,
-            recipients : JSON.stringify(pRecipients),
+            testRecipients : JSON.stringify(pTestRecipients),
             user : pUser || ""
         }
     );
@@ -44,11 +44,11 @@ BulkMailUtils.sendBulkMailOnServer = function (pBulkMailId, pRecipients, pUser)
  * can take some time to execute, use BulkMailUtils.sendBulkMailOnServer instead.
  * 
  * @param {String} pBulkMailId id of the bulk mail 
- * @param {Array} [pRecipients=bulkMailRecipients] overwrite the recipients (e.g. for testing)
+ * @param {Array} [pTestRecipients] overwrite the recipients (e.g. for testing)
  * 
  * @return {Object} count of sucessful and failed mails 
  */
-BulkMailUtils.sendBulkMail = function (pBulkMailId, pRecipients)
+BulkMailUtils.sendBulkMail = function (pBulkMailId, pTestRecipients)
 {
     var [templateId, subject, emailSender] = db.array(db.ROW, SqlCondition.begin()
         .andPrepare("BULKMAIL.BULKMAILID", pBulkMailId)
@@ -56,17 +56,28 @@ BulkMailUtils.sendBulkMail = function (pBulkMailId, pRecipients)
     );
     var template = BulkMailUtils.getBulkMailTemplate(pBulkMailId, templateId);
     
-    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 sql = SqlBuilder.begin();
+    var recipientData;
+    if (pTestRecipients)
+    {
+        recipientData = pTestRecipients.map(function (row)
+        {
+            return ["", row[0], row[1]];
+        });
+    }
+    else
+    {
+        recipientData = db.table(SqlBuilder.begin()
+            .select("BULKMAILRECIPIENTID, BULKMAILRECIPIENT.CONTACT_ID, (" + CommUtil.getStandardSubSqlMail() + ")")
+            .from("CONTACT")
+            .join("BULKMAILRECIPIENT", "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 contactIds = recipientData.map(function (e) {return e[1];});
     var successIds = [];
     var failedIds = [];
@@ -89,24 +100,25 @@ BulkMailUtils.sendBulkMail = function (pBulkMailId, pRecipients)
 
             isSuccess = email.send();
         }
-        if (isSuccess)
-            successIds.push(recipientData[i][0]); //set the recipient status to 'sent'
-        else
-            failedIds.push(recipientData[i][0]); //set the recipient status to 'failed'
+        if (recipientData[i][0])    //set the recipient status to 'sent' or 'failed'
+            Array.prototype.push.call(isSuccess ? successIds : failedIds, recipientData[i][0]);
     }
-    db.updateData("BULKMAILRECIPIENT", ["STATUS", "SENTDATE"], null, [$KeywordRegistry.bulkMailRecipientStatus$sent(), sentDate], 
-        SqlCondition.begin()
-            .andIn("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", successIds)
-            .build("1=2")
-    );
-    db.updateData("BULKMAILRECIPIENT", ["STATUS", "SENTDATE"], null, [$KeywordRegistry.bulkMailRecipientStatus$failed(), sentDate], 
-        SqlCondition.begin()
-            .andIn("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", failedIds)
-            .build("1=2")
-    );
-        
-    db.updateData("BULKMAIL", ["STATUS"], null, [$KeywordRegistry.bulkMailStatus$sent()], 
-        SqlCondition.equals("BULKMAIL.BULKMAILID", pBulkMailId, "1=2"));
+    if (successIds.length > 0)
+        db.updateData("BULKMAILRECIPIENT", ["STATUS", "SENTDATE"], null, [$KeywordRegistry.bulkMailRecipientStatus$sent(), sentDate], 
+            SqlCondition.begin()
+                .andIn("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", successIds)
+                .build("1=2")
+        );
+    if (failedIds.length > 0)
+        db.updateData("BULKMAILRECIPIENT", ["STATUS", "SENTDATE"], null, [$KeywordRegistry.bulkMailRecipientStatus$failed(), sentDate], 
+            SqlCondition.begin()
+                .andIn("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", failedIds)
+                .build("1=2")
+        );
+    
+    if (!pTestRecipients) //if its just a test run, don't set the status to sent
+        db.updateData("BULKMAIL", ["STATUS"], null, [$KeywordRegistry.bulkMailStatus$sent()], 
+            SqlCondition.equals("BULKMAIL.BULKMAILID", pBulkMailId, "1=2"));
         
     return {
         sucessful : successIds.length,
@@ -216,6 +228,11 @@ BulkMailUtils.filterNewRecipients = function (pBulkMailId, pContactIds)
     return db.array(db.COLUMN, query); 
 }
 
+BulkMailUtils.openBulkMail = function (pBulkMailId)
+{
+    neon.openContext("BulkMail", "BulkMailMain_view", [pBulkMailId], neon.OPERATINGSTATE_NEW, null);
+}
+
 function SerialLetterUtils () {}
 
 /**
diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index d2f616b53c0e5f39acbf4bf17523802821450438..12b84dc591b54f10fd9f8f3326697eb7353b17fa 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -889,8 +889,7 @@ SqlBuilder.prototype.build = function ()
         this._where,
         this._groupBy,
         this._having,
-        this._orderBy,
-        this._unions
+        this._orderBy
         ]).concat(this._unions);
         
     for (let i = 0, l = allParts.length; i < l; i++)
diff --git a/process/sendBulkMail_serverProcess/process.js b/process/sendBulkMail_serverProcess/process.js
index 89c76bc2898eecb6a7e6772566e775a8e3eed78c..6a68f3deaaa3dc0b3ef04025b4d395920228145f 100644
--- a/process/sendBulkMail_serverProcess/process.js
+++ b/process/sendBulkMail_serverProcess/process.js
@@ -10,10 +10,10 @@ import("system.notification");
 var startTime = datetime.date();
 var bulkMailId = vars.get("$local.bulkMailId");
 var user = vars.get("$local.user");
-var recipients = JSON.parse(vars.get("$local.recipients"));
-var res = BulkMailUtils.sendBulkMail(bulkMailId, recipients);
+var testRecipients = JSON.parse(vars.get("$local.testRecipients"));
+var res = BulkMailUtils.sendBulkMail(bulkMailId, testRecipients);
 
-if (user)
+if (user && !testRecipients)
 {
     var mailName = db.cell(SqlCondition.begin()
         .andPrepare("BULKMAIL.BULKMAILID", bulkMailId)