diff --git a/entity/BulkMailAddRecipients_entity/BulkMailAddRecipients_entity.aod b/entity/BulkMailAddRecipients_entity/BulkMailAddRecipients_entity.aod
index 63b472319fa68c5290688ac1587d01af22ded26b..8a89d2b2b286d6d0bb3a5d97ee9d6a9cfe088451 100644
--- a/entity/BulkMailAddRecipients_entity/BulkMailAddRecipients_entity.aod
+++ b/entity/BulkMailAddRecipients_entity/BulkMailAddRecipients_entity.aod
@@ -31,7 +31,7 @@
       </dependency>
     </entityConsumer>
     <entityParameter>
-      <name>ContactIds_param</name>
+      <name>Ids_param</name>
       <expose v="true" />
     </entityParameter>
     <entityField>
@@ -73,13 +73,17 @@
       <useAggregates v="true" />
     </entityProvider>
     <entityParameter>
-      <name>ContactFilter_param</name>
+      <name>Filter_param</name>
       <expose v="true" />
     </entityParameter>
     <entityField>
       <name>proposedContactIds</name>
       <valueProcess>%aditoprj%/entity/BulkMailAddRecipients_entity/entityfields/proposedcontactids/valueProcess.js</valueProcess>
     </entityField>
+    <entityParameter>
+      <name>Parameters_param</name>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <datalessRecordContainer>
diff --git a/entity/BulkMailAddRecipients_entity/entityfields/proposedcontactids/valueProcess.js b/entity/BulkMailAddRecipients_entity/entityfields/proposedcontactids/valueProcess.js
index abc1e78c4e3211d5cbb9cfbb1440a276edc8f400..a865018d80dc98523a354ff97ae305e84008d850 100644
--- a/entity/BulkMailAddRecipients_entity/entityfields/proposedcontactids/valueProcess.js
+++ b/entity/BulkMailAddRecipients_entity/entityfields/proposedcontactids/valueProcess.js
@@ -1,3 +1,6 @@
+import("Context_lib");
+import("system.entities");
+import("Sql_lib");
 import("Util_lib");
 import("FilterViewAction_lib");
 import("system.result");
@@ -7,11 +10,61 @@ var bulkMailId = vars.get("$field.BULKMAIL_ID");
 var proposedRecipients = [];
 if (bulkMailId)
 {
-    var contactIds = Utils.parseJSON(vars.get("$param.ContactIds_param"));
-    var contactFilter = vars.get("$param.ContactFilter_param");
+    var ids = Utils.parseJSON(vars.get("$param.Ids_param"));
+    var filter = vars.get("$param.Filter_param");
     var context = vars.getString("$param.ObjectType_param");
+    var parameters = vars.get("$param.Parameters_param");
+    
+    
+    switch(context)
+    {
+        case "CampaignParticipant":
+            if (Utils.isNullOrEmpty(ids) && filter)
+            {
+                var filterObject = Utils.isString(filter) ? JSON.parse(filter) : filter;
+                
+                let _parameters = Utils.isString(parameters) ? JSON.parse(parameters) : parameters;
+                
+                var loadRowsConfig = entities.createConfigForLoadingRows()
+                                        .entity(ContextUtils.getEntity(context))
+                                        .fields(["CONTACT_ID"])
+                
+                if (filterObject.filter)
+                    loadRowsConfig.filter(JSON.stringify(filterObject.filter));
 
-    proposedRecipients = FilterViewActionUtils.getUidsBySelectionOrFilter(context, contactIds, contactFilter);
+                if(_parameters)
+                {
+                    Object.keys(_parameters).forEach(function(key)
+                    {
+                        loadRowsConfig.addParameter(key, _parameters[key])
+                    });
+                }
+                
+
+                proposedRecipients = entities.getRows(loadRowsConfig).map(function (row)
+                {
+                    return row["CONTACT_ID"];
+                });
+            }
+            else if(!Utils.isNullOrEmpty(ids))
+            {
+                 proposedRecipients = newSelect("CAMPAIGNPARTICIPANT.CONTACT_ID")
+                                .from("CAMPAIGNPARTICIPANT")
+                                .where("CAMPAIGNPARTICIPANT.CAMPAIGNPARTICIPANTID", ids, SqlBuilder.IN())
+                                .arrayColumn();
+            }    
+            break;
+        case "CampaignStep":
+            var proposedIds = FilterViewActionUtils.getUidsBySelectionOrFilter(context, ids, filter, parameters);
+            proposedRecipients = newSelect("CAMPAIGNPARTICIPANT.CONTACT_ID")
+                                .from("CAMPAIGNPARTICIPANT")
+                                .where("CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID", proposedIds, SqlBuilder.IN())
+                                .arrayColumn();
+            break;
+        default:
+            proposedRecipients = FilterViewActionUtils.getUidsBySelectionOrFilter(context, ids, filter, parameters);
+    }
+  
 }
 
 result.string(JSON.stringify(proposedRecipients));
\ No newline at end of file
diff --git a/entity/BulkMailAddRecipients_entity/entityfields/validcontactids/valueProcess.js b/entity/BulkMailAddRecipients_entity/entityfields/validcontactids/valueProcess.js
index 2df0a164747ae867eb2c6a645c4be5625ba9d21c..9517c6034fc740302e21c219d11be1c149e959dc 100644
--- a/entity/BulkMailAddRecipients_entity/entityfields/validcontactids/valueProcess.js
+++ b/entity/BulkMailAddRecipients_entity/entityfields/validcontactids/valueProcess.js
@@ -2,13 +2,27 @@ import("Util_lib");
 import("system.result");
 import("Bulkmail_lib");
 import("system.vars");
+import("Sql_lib");
 
 var bulkMailId = vars.get("$field.BULKMAIL_ID");
+var filter = vars.get("$param.Filter_param");
+var ids = Utils.parseJSON(vars.get("$param.Ids_param"));
+var context = vars.getString("$param.ObjectType_param");
+
+if (Utils.isString(filter))
+        filter = JSON.parse(filter);
 var validRecipients = [];
+
 if (bulkMailId)
 {
-    var proposedRecipients = Utils.parseJSON(vars.get("$field.proposedContactIds"));
-    validRecipients = BulkMailUtils.filterNewRecipients(bulkMailId, proposedRecipients);
+    if (Utils.isNullOrEmpty(ids) && filter && filter.condition)
+    {
+        validRecipients = BulkMailUtils.filterNewRecipientsByCondition(bulkMailId, filter.condition, context)
+    }
+    else
+    {
+        validRecipients = BulkMailUtils.filterNewRecipients(bulkMailId, JSON.parse(vars.get("$field.proposedContactIds")));
+    } 
 }
 
 result.string(JSON.stringify(validRecipients));
\ No newline at end of file
diff --git a/entity/BulkMail_entity/BulkMail_entity.aod b/entity/BulkMail_entity/BulkMail_entity.aod
index 1a126d58acbf5fc674a943513f0f608bd918fa33..0d5114b36d50c84ab07874aa1bbc4ce7ffdd325c 100644
--- a/entity/BulkMail_entity/BulkMail_entity.aod
+++ b/entity/BulkMail_entity/BulkMail_entity.aod
@@ -550,6 +550,16 @@
       <name>USER_EDIT</name>
       <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/user_edit/valueProcess.js</valueProcess>
     </entityField>
+    <entityParameter>
+      <name>PresetRecipientsContext_param</name>
+      <expose v="true" />
+      <documentation>%aditoprj%/entity/BulkMail_entity/entityfields/presetrecipientscontext_param/documentation.adoc</documentation>
+    </entityParameter>
+    <entityParameter>
+      <name>PresetRecipientsFilter_param</name>
+      <expose v="true" />
+      <documentation>%aditoprj%/entity/BulkMail_entity/entityfields/presetrecipientsfilter_param/documentation.adoc</documentation>
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/BulkMail_entity/entityfields/presetrecipientscontext_param/documentation.adoc b/entity/BulkMail_entity/entityfields/presetrecipientscontext_param/documentation.adoc
new file mode 100644
index 0000000000000000000000000000000000000000..a1be78edef0f33d431bd8b8a11a8c4913a6c1b3d
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/presetrecipientscontext_param/documentation.adoc
@@ -0,0 +1,3 @@
+used in combination with PresetRecipientsFilter_param when creating a new Bulkmail from a serial action.
+
+gets ignored when PresetRecipients_param is also set.
\ No newline at end of file
diff --git a/entity/BulkMail_entity/entityfields/presetrecipientsfilter_param/documentation.adoc b/entity/BulkMail_entity/entityfields/presetrecipientsfilter_param/documentation.adoc
new file mode 100644
index 0000000000000000000000000000000000000000..0fbc5c9feb6e8a9ac1e8b475b292f9bbc3f2a47e
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/presetrecipientsfilter_param/documentation.adoc
@@ -0,0 +1,5 @@
+used in combination with PresetRecipientsContext_param when creating a new Bulkmail from a serial action.
+
+gets ignored when PresetRecipients_param is also set. 
+
+Expects $sys.filter object.
\ No newline at end of file
diff --git a/entity/BulkMail_entity/recordcontainers/db/onDBInsert.js b/entity/BulkMail_entity/recordcontainers/db/onDBInsert.js
index b6cddba7941ba335df3c724c15abcd4dd7b139d1..54931b06e7104406b1df9fa48a117170497f7b17 100644
--- a/entity/BulkMail_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/BulkMail_entity/recordcontainers/db/onDBInsert.js
@@ -89,4 +89,21 @@ if (vars.get("$param.CopyBulkMailId_param") && Utils.toBoolean(vars.get("$field.
     db.inserts(inserts);
 }
 
+var contactIds = [];
+
+if (vars.get("$param.PresetRecipients_param"))
+{
+    contactIds = contactIds.concat(BulkMailUtils.filterNewRecipients(bulkMailId,JSON.parse(vars.getString("$param.PresetRecipients_param"))));
+}
+else if (vars.getString("$param.PresetRecipientsContext_param") && vars.getString("$param.PresetRecipientsFilter_param"))
+{
+    contactIds = contactIds.concat(BulkMailUtils.filterNewRecipientsByCondition(bulkMailId, JSON.parse(vars.getString("$param.PresetRecipientsFilter_param")).condition, vars.getString("$param.PresetRecipientsContext_param")));
+}
+
+
+if (contactIds && contactIds.length > 0)
+    BulkMailUtils.addRecipients(bulkMailId, contactIds);
+
+
+
 WorkflowSignalSender.inserted();
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
index 684247565835d1adbc8487986ccbda6ae2358fa0..a886027212db89216b6f4be30daaa9d6004b6ee6 100644
--- a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
+++ b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
@@ -175,6 +175,18 @@
           <tooltip>Update campaign step</tooltip>
           <tooltipProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/tooltipProcess.js</tooltipProcess>
         </entityActionField>
+        <entityActionField>
+          <name>addToBulkmail</name>
+          <title>Add to Bulkmail</title>
+          <onActionProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/addtobulkmail/onActionProcess.js</onActionProcess>
+          <iconId>VAADIN:AT</iconId>
+        </entityActionField>
+        <entityActionField>
+          <name>newBulkMail</name>
+          <title>Write bulk mail</title>
+          <onActionProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/newbulkmail/onActionProcess.js</onActionProcess>
+          <iconId>VAADIN:AT</iconId>
+        </entityActionField>
       </children>
     </entityActionGroup>
     <entityField>
@@ -339,14 +351,6 @@
           <name>CAMPAIGNPARTICIPANTID.displayValue</name>
           <recordfield>CAMPAIGNPARTICIPANT.CAMPAIGNPARTICIPANTID</recordfield>
         </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>STANDARD_PHONE_COMMUNICATION.displayValue</name>
-          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>STANDARD_EMAIL_COMMUNICATION.displayValue</name>
-          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>ADVERTISINGBAN_ICON.value</name>
           <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/advertisingban_icon.value/expression.js</expression>
@@ -402,6 +406,14 @@
           <name>ORGANISATION_CONTACT_ID.displayValue</name>
           <recordfield>ORGANISATION.NAME</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>STANDARD_EMAIL_COMMUNICATION.value</name>
+          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>STANDARD_PHONE_COMMUNICATION.value</name>
+          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <linkInformation>
         <linkInformation>
diff --git a/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/addtobulkmail/onActionProcess.js b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/addtobulkmail/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c5e06bc71d9e0872e5ba270940a124d90da8fc2f
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/addtobulkmail/onActionProcess.js
@@ -0,0 +1,5 @@
+import("Bulkmail_lib");
+import("system.vars");
+
+var parameters = {"CampaignId_param":vars.get("$param.CampaignId_param")};
+BulkMailUtils.openAddRecipientView(vars.get("$sys.currentcontextname"), vars.get("$sys.selection"), vars.get("$sys.filter"), parameters);
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/newbulkmail/onActionProcess.js b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/newbulkmail/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..7bca6ed54c3f9d4dfc5aa1c56556d2bac6832ed6
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/newbulkmail/onActionProcess.js
@@ -0,0 +1,21 @@
+import("system.vars");
+import("Sql_lib");
+import("system.db");
+import("Bulkmail_lib");
+
+
+var selection = vars.get("$sys.selection");
+var filter = vars.get("$sys.filter");
+var recipientsSql = newSelect("CONTACT_ID")
+                        .from("CAMPAIGNPARTICIPANT")
+                     
+if(selection.length > 0)
+{
+    recipientsSql.where("CAMPAIGNPARTICIPANT.CAMPAIGNPARTICIPANTID",selection,SqlBuilder.IN());
+    BulkMailUtils.newBulkMail(recipientsSql.arrayColumn());
+}
+else
+{
+    BulkMailUtils.newBulkMail(null,vars.getString("$sys.currentcontextname"),filter);
+}
+
diff --git a/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..02a585f840c78bfdcc768640e146bd2f4b41f008
--- /dev/null
+++ b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js
@@ -0,0 +1,6 @@
+import("Sql_lib");
+import("system.result");
+import("Communication_lib");
+
+var res = CommUtil.getStandardSubSqlMail(newWhere("COMMUNICATION.OBJECT_ROWID = CAMPAIGNPARTICIPANT.CONTACT_ID"));
+result.string(res);
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..b13adb6ad2bc89f776b5ad17a811005e1050f85d
--- /dev/null
+++ b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("Communication_lib");
+import("Sql_lib");
+
+var res = CommUtil.getStandardSubSqlPhone(newWhere("COMMUNICATION.OBJECT_ROWID = CAMPAIGNPARTICIPANT.CONTACT_ID"));
+result.string(res);
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/CampaignStep_entity.aod b/entity/CampaignStep_entity/CampaignStep_entity.aod
index 80eba01b15c052c1dea96ec81668ab55688d08db..3e6431a73b8603709e2058f5edf0921f2bd4b35e 100644
--- a/entity/CampaignStep_entity/CampaignStep_entity.aod
+++ b/entity/CampaignStep_entity/CampaignStep_entity.aod
@@ -337,12 +337,6 @@
       <consumer>KeywordStepMedium</consumer>
       <groupable v="true" />
     </entityField>
-    <entityActionField>
-      <name>newBulkMail</name>
-      <title>Write bulk mail</title>
-      <onActionProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/newbulkmail/onActionProcess.js</onActionProcess>
-      <iconId>VAADIN:AT</iconId>
-    </entityActionField>
     <entityParameter>
       <name>maxSort_param</name>
       <expose v="true" />
@@ -386,6 +380,8 @@
           <name>moveUp</name>
           <title>Move up</title>
           <onActionProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/group/children/moveup/onActionProcess.js</onActionProcess>
+          <isMenuAction v="true" />
+          <isObjectAction v="false" />
           <iconId>VAADIN:ARROW_UP</iconId>
           <state>DISABLED</state>
           <stateProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/group/children/moveup/stateProcess.js</stateProcess>
@@ -396,10 +392,26 @@
           <title>Move down</title>
           <description></description>
           <onActionProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/group/children/movedown/onActionProcess.js</onActionProcess>
+          <isMenuAction v="true" />
+          <isObjectAction v="false" />
           <iconId>VAADIN:ARROW_DOWN</iconId>
           <stateProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/group/children/movedown/stateProcess.js</stateProcess>
           <tooltipProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/group/children/movedown/tooltipProcess.js</tooltipProcess>
         </entityActionField>
+        <entityActionField>
+          <name>addToBulkMail</name>
+          <title>Add to Bulkmail</title>
+          <onActionProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/group/children/addtobulkmail/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
+          <iconId>VAADIN:AT</iconId>
+        </entityActionField>
+        <entityActionField>
+          <name>newBulkMail</name>
+          <title>Write bulk mail</title>
+          <onActionProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/group/children/newbulkmail/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
+          <iconId>VAADIN:AT</iconId>
+        </entityActionField>
       </children>
     </entityActionGroup>
   </entityFields>
diff --git a/entity/CampaignStep_entity/entityfields/group/children/addtobulkmail/onActionProcess.js b/entity/CampaignStep_entity/entityfields/group/children/addtobulkmail/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..3a56d448a8c9b338e7b99dcf92ab7e08d202c6d0
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/group/children/addtobulkmail/onActionProcess.js
@@ -0,0 +1,5 @@
+import("Bulkmail_lib");
+import("system.vars");
+
+var parameters = {"campaignId_param":vars.get("$param.campaignId_param")};
+BulkMailUtils.openAddRecipientView(vars.get("$sys.currentcontextname"), vars.get("$sys.selection"), vars.get("$sys.filter"), parameters);
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/group/children/newbulkmail/onActionProcess.js b/entity/CampaignStep_entity/entityfields/group/children/newbulkmail/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..548f568aebb826bfa906f7ba752f12b1a51ad638
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/group/children/newbulkmail/onActionProcess.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("Sql_lib");
+import("system.db");
+import("Bulkmail_lib");
+
+
+BulkMailUtils.newBulkMail(null,vars.get("$sys.currentcontextname"),{"condition":newWhere("CAMPAIGNSTEP.CAMPAIGNSTEPID","$field.CAMPAIGNSTEPID").toString()});
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/newbulkmail/onActionProcess.js b/entity/CampaignStep_entity/entityfields/newbulkmail/onActionProcess.js
deleted file mode 100644
index 090b957b3fb2f37a3f71424c1824faf0a1bda8d8..0000000000000000000000000000000000000000
--- a/entity/CampaignStep_entity/entityfields/newbulkmail/onActionProcess.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import("Sql_lib");
-import("system.db");
-import("Bulkmail_lib");
-
-var recipients = newSelect("CONTACT_ID")
-                        .from("CAMPAIGNPARTICIPANT")
-                        .where("CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID", "$field.CAMPAIGNSTEPID")
-                        .and("CAMPAIGNPARTICIPANT.CAMPAIGN_ID", "$field.CAMPAIGN_ID")
-                        .arrayColumn()
-
-BulkMailUtils.newBulkMail(recipients);
\ No newline at end of file
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index f69643cf430f4b92ac55f5511ead8a9872730f16..86f1d20bd155090b9534bf87b08fbef2a4296c63 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -12452,6 +12452,15 @@ Bitte Datumseingabe prüfen</value>
       <key>Zip Archive</key>
       <value>Zip Archiv</value>
     </entry>
+    <entry>
+      <key>set attribute (use filter result)</key>
+    </entry>
+    <entry>
+      <key>Copy Recipients</key>
+    </entry>
+    <entry>
+      <key>copy</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 8a2742e2cafbb9135183299ab27956f79c274ce3..14758851ea7f13a96750a23595f615bc0e969059 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -9368,6 +9368,33 @@
     <entry>
       <key>Weekly</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>Volume (Euro)</key>
+    </entry>
+    <entry>
+      <key>%0 recipient will be added to the bulk mail.</key>
+    </entry>
+    <entry>
+      <key>Copy Recipients</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>copy</key>
+    </entry>
     <entry>
       <key>Set workflow for selected e-mail filter</key>
     </entry>
diff --git a/process/Bulkmail_lib/process.js b/process/Bulkmail_lib/process.js
index b984b31ab61fc5b10e34d71d79e47380d7e63942..52221761690132a78edebe892f1722a25c52fc34 100644
--- a/process/Bulkmail_lib/process.js
+++ b/process/Bulkmail_lib/process.js
@@ -1,3 +1,4 @@
+import("JditoFilter_lib");
 import("CommunicationBlacklist_lib");
 import("EmailFilterHandling_lib");
 import("system.logging");
@@ -361,20 +362,28 @@ BulkMailUtils.sendBulkMail = function (pBulkMailId, pIsTestRun, pUser)
  * Opens a context to select a bulk mail to add recipients to.<br>
  * 
  * @param {String} pContext             the context of the contacts (Person or Organisation)
- * @param {String[]} pContactIds        Recipients that should be added.<br>
- * @param {String|Object} pFilter       the filter for the contacts that should be used if no contact is selected
+ * @param {String[]} pIds               Ids that should be added.<br>
+ * @param {String|Object} pFilter       the filter for the contacts that should be used if no Ids are selected
+ * @param {String|Object} pParameters     the relevant parameters that are needed to get the Ids from entities.loadrows in the form:{parametername:parametervalue}
  */
-BulkMailUtils.openAddRecipientView = function (pContext, pContactIds, pFilter)
+BulkMailUtils.openAddRecipientView = function (pContext, pIds, pFilter, pParameters)
 {
-    if (!Utils.isString(pContactIds))
-        pContactIds = JSON.stringify(pContactIds);
-    if (!Utils.isString(pFilter))
-        pFilter = JSON.stringify(pFilter);
+    if (!Utils.isString(pParameters))
+        pParameters = JSON.stringify(pParameters);
+    if (!Utils.isString(pIds))
+        pIds = JSON.stringify(pIds);
+    if (Utils.isString(pFilter))
+        pFilter = JSON.parse(pFilter);
     
+    if(Utils.isNullOrEmpty(pFilter.filter))
+        pFilter.filter= JSON.parse(JditoFilterUtils.getEmptyFilter()).filter;
+    
+    pFilter= JSON.stringify(pFilter);
     neon.openContext("BulkMailAddRecipients", "BulkMailAddRecipientsEdit_view", null, neon.OPERATINGSTATE_VIEW, {
         "ObjectType_param": pContext,
-        "ContactIds_param": pContactIds,
-        "ContactFilter_param": pFilter
+        "Ids_param": pIds,
+        "Filter_param": pFilter,
+        "Parameters_param": pParameters
     });
 }
 
@@ -500,11 +509,17 @@ BulkMailUtils.isRecipient = function (pBulkMailId, pContactId, pRecipientId)
  * 
  * @param {String[]} pRecipients (optional)         <p>
  *                                                  Recipients that should be added after creation.<br>
+ * @param {String}   pContext    (optional)         <p>
+ *                                                  Context the filter is coming from.<br>  
+ * @param {Object} pFilter (optional)               <p>
+ *                                                  sys.filter of selection that should be added to new bulkmail<br>                                                                                                
  */
-BulkMailUtils.newBulkMail = function (pRecipients)
+BulkMailUtils.newBulkMail = function (pRecipients, pContext, pFilter)
 {
     var params = {
-        "PresetRecipients_param" : JSON.stringify(pRecipients)
+        "PresetRecipients_param" : pRecipients?JSON.stringify(pRecipients):null,
+        "PresetRecipientsContext_param": pContext,
+        "PresetRecipientsFilter_param": pFilter?JSON.stringify(pFilter):null
     };
     neon.openContext("BulkMail", "BulkMailEdit_view", null, neon.OPERATINGSTATE_NEW, params);
 }
@@ -537,6 +552,56 @@ BulkMailUtils.filterNewRecipients = function (pBulkMailId, pContactIds)
                 .arrayColumn();
 }
 
+/**
+ * Filters the given contactIds if they can be added as new recipients.
+ * Checks if a contact is already a recipient or if there is a advertising ban.
+ * 
+ * @param {String} pBulkMailId id of the bulk mail the contacts should be added to
+ * @param {String} pCondition Condition part of sys.filter
+ * @param {String} pContext Context that belongs to the filtercondition
+ * @return {String[]} contacts that can be added as recipients
+ */
+BulkMailUtils.filterNewRecipientsByCondition = function (pBulkMailId, pCondition, pContext)
+{
+    var condition = newSelect("CONTACTID")
+                .from("CONTACT")
+                .whereIfSet(pCondition)
+                // only add contacts that aren't already recipients
+                .and(null, newSelect("BULKMAILRECIPIENTID")
+                                .from("BULKMAILRECIPIENT")
+                                .where("BULKMAILRECIPIENT.CONTACT_ID = CONTACT.CONTACTID")
+                                .and("BULKMAILRECIPIENT.BULKMAIL_ID", pBulkMailId)
+                        , SqlBuilder.NOT_EXISTS())
+                // check if there's a commrestriction
+                .and(new CommunicationSettingsCondition()
+                    .emails(CommUtil.getStandardSubSqlMail())
+                    .rejected()
+                    .existNoSettings()
+                    .buildCondition());
+    if (pContext == "Person")
+    {
+        condition.and("CONTACT.PERSON_ID is not null");
+    }
+    
+    if (pContext == "Organistaion")
+    {
+        condition.and("CONTACT.PERSON_ID is null");
+    }
+    
+    if (pContext == "CampaignParticipant")
+    {
+       condition.join("CAMPAIGNPARTICIPANT","CAMPAIGNPARTICIPANT.CONTACT_ID = CONTACT.CONTACTID");
+    }
+        
+    if (pContext == "CampaignStep")
+    {
+       condition.join("CAMPAIGNPARTICIPANT","CAMPAIGNPARTICIPANT.CONTACT_ID = CONTACT.CONTACTID")
+       .join("CAMPAIGNSTEP","CAMPAIGNSTEP.CAMPAIGNSTEPID = CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID");
+    }
+    
+    return  condition.arrayColumn();
+}
+
 /**
  * Opens the given bulk mail.
  * 
diff --git a/process/FilterViewAction_lib/process.js b/process/FilterViewAction_lib/process.js
index e285e75cef8ba69a37c4d0b4befc9f2552c53bcb..ede6618261ac763fd7f7cc05f4a7f3414c5e04fc 100644
--- a/process/FilterViewAction_lib/process.js
+++ b/process/FilterViewAction_lib/process.js
@@ -17,13 +17,17 @@ function FilterViewActionUtils() {}
  * 
  * @param {String} pContext         the context
  * @param {String|Object} pFilter   the filter to apply (content of "$sys.filter")
+ * @param {String|Object} pParameters the Parameters the entity should be loaded with as "Object" (key-value-pairs); null for no parameter variables
  * @return {String[]} all uids that could be found
  */
-FilterViewActionUtils.getUidsByEntityFilter = function (pContext, pFilter)
+FilterViewActionUtils.getUidsByEntityFilter = function (pContext, pFilter, pParameters)
 {
     if (Utils.isString(pFilter))
         pFilter = JSON.parse(pFilter);
     
+    if (Utils.isString(pParameters))
+        pParameters = JSON.parse(pParameters);
+    
     //uids from Person and Organisation are loaded with simple sql queries because that's much faster than over the entity'
     if (pContext == "Person" && "condition" in pFilter)
     {
@@ -54,7 +58,10 @@ FilterViewActionUtils.getUidsByEntityFilter = function (pContext, pFilter)
         .fields(["#UID"])
     if (pFilter.filter)
         loadRowsConfig.filter(JSON.stringify(pFilter.filter));
-        
+    
+    if(pParameters)
+        Object.keys(pParameters).forEach(function(key){loadRowsConfig.addParameter(key, pParameters[key])});
+    
     return entities.getRows(loadRowsConfig).map(function (row)
     {
         return row["#UID"];
@@ -68,12 +75,13 @@ FilterViewActionUtils.getUidsByEntityFilter = function (pContext, pFilter)
  * @param {String} pContext         the context
  * @param {String[]} pSelection     selected uids ("$sys.selection")
  * @param {String|Object} pFilter   the filter ("$sys.filter")
+ * @param {String|Object} pParameters the Parameters the entity should be loaded with as "Object" (key-value-pairs); null for no parameter variables
  * @return {String[]} the uids that should be used
  */
-FilterViewActionUtils.getUidsBySelectionOrFilter = function (pContext, pSelection, pFilter)
+FilterViewActionUtils.getUidsBySelectionOrFilter = function (pContext, pSelection, pFilter, pParameters)
 {
     if (Utils.isNullOrEmpty(pSelection) && pFilter)
-        return FilterViewActionUtils.getUidsByEntityFilter(pContext, pFilter);
+        return FilterViewActionUtils.getUidsByEntityFilter(pContext, pFilter,pParameters);
     return pSelection || [];
 }