diff --git a/.liquibase/Data_alias/basic/2021.1.2/changelog.xml b/.liquibase/Data_alias/basic/2021.1.2/changelog.xml
index f436574bf0c277174d26d35c7e416962f017c31d..1ecb2edcac6019f8aa5b3d1654ce267fbb908567 100644
--- a/.liquibase/Data_alias/basic/2021.1.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2021.1.2/changelog.xml
@@ -1,7 +1,6 @@
 <?xml version="1.1" encoding="UTF-8" standalone="no"?>
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
     <include relativeToChangelogFile="true" file="MailBounce/changelog.xml"/>
     <include relativeToChangelogFile="true" file="ModularCommunication/changelog.xml"/>
     <include relativeToChangelogFile="true" file="Bulkmail/changelog.xml"/>
diff --git a/.liquibase/Data_alias/basic/2021.1.3/Campaign/alter_CampaignStep.xml b/.liquibase/Data_alias/basic/2021.1.3/Campaign/alter_CampaignStep.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6a49a0df0103cab830c0e08068c8847b172e91cc
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.1.3/Campaign/alter_CampaignStep.xml
@@ -0,0 +1,7 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="m.groppe" id="5d94c446-88c7-4fb0-81c8-27f50ac89204">
+        <dropNotNullConstraint tableName="CAMPAIGNSTEP" columnName="MAXPARTICIPANTS" columnDataType="INTEGER"/>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2021.1.3/Campaign/changelog.xml b/.liquibase/Data_alias/basic/2021.1.3/Campaign/changelog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f141dea2abfcdbf68200fa6ba3f40a70b6736564
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.1.3/Campaign/changelog.xml
@@ -0,0 +1,6 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <include relativeToChangelogFile="true" file="alter_CampaignStep.xml"/>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.1.3/changelog.xml b/.liquibase/Data_alias/basic/2021.1.3/changelog.xml
index 985b989b2d949422c14a75d7752a4ab74bdeeda6..873ee73a18365693f428621f488b2483430f5dd7 100644
--- a/.liquibase/Data_alias/basic/2021.1.3/changelog.xml
+++ b/.liquibase/Data_alias/basic/2021.1.3/changelog.xml
@@ -7,4 +7,5 @@
     <include relativeToChangelogFile="true" file="Visitplan/changelog.xml"/>
     <include relativeToChangelogFile="true" file="alter_dataTypesToDateTime.xml"/>
     <include relativeToChangelogFile="true" file="Grouptask/changelog.xml"/>
+    <include relativeToChangelogFile="true" file="Campaign/changelog.xml"/>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index ddd2d828f2905c5456daed5f9346d002fe9a5517..4a8333875ded20750c9c5235a67d3f9ebf956a08 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -8910,7 +8910,7 @@
             <description></description>
             <auditSyncConfig>
               <name>auditSyncConfig</name>
-              <auditMode v="0" />
+              <auditMode v="1" />
               <syncActive v="false" />
               <syncComplete v="true" />
               <syncDirection v="1" />
@@ -8942,8 +8942,15 @@
                 <isUnique v="false" />
                 <index v="false" />
                 <documentation></documentation>
-                <title></title>
+                <title>Description</title>
                 <description></description>
+                <customProperties>
+                  <customBooleanProperty>
+                    <name>log</name>
+                    <global v="false" />
+                    <property v="true" />
+                  </customBooleanProperty>
+                </customProperties>
               </entityFieldDb>
               <entityFieldDb>
                 <name>EMPLOYEE_CONTACT_ID</name>
@@ -9033,8 +9040,15 @@
                 <isUnique v="false" />
                 <index v="false" />
                 <documentation></documentation>
-                <title></title>
+                <title>Name</title>
                 <description></description>
+                <customProperties>
+                  <customBooleanProperty>
+                    <name>log</name>
+                    <global v="false" />
+                    <property v="true" />
+                  </customBooleanProperty>
+                </customProperties>
               </entityFieldDb>
               <entityFieldDb>
                 <name>STATUS</name>
@@ -9047,8 +9061,20 @@
                 <isUnique v="false" />
                 <index v="false" />
                 <documentation></documentation>
-                <title></title>
+                <title>Status</title>
                 <description></description>
+                <customProperties>
+                  <customBooleanProperty>
+                    <name>log</name>
+                    <global v="false" />
+                    <property v="true" />
+                  </customBooleanProperty>
+                  <customStringProperty>
+                    <name>keyword</name>
+                    <global v="false" />
+                    <property>CampaignManagementStates</property>
+                  </customStringProperty>
+                </customProperties>
               </entityFieldDb>
               <entityFieldDb>
                 <name>CURRENCY</name>
@@ -9161,7 +9187,7 @@
             <description></description>
             <auditSyncConfig>
               <name>auditSyncConfig</name>
-              <auditMode v="0" />
+              <auditMode v="1" />
               <syncActive v="false" />
               <syncComplete v="true" />
               <syncDirection v="1" />
@@ -9181,6 +9207,17 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
+                <customProperties>
+                  <customBooleanProperty>
+                    <name>log</name>
+                    <global v="false" />
+                  </customBooleanProperty>
+                  <customStringProperty>
+                    <name>tableRef</name>
+                    <global v="false" />
+                    <property>CAMPAIGN</property>
+                  </customStringProperty>
+                </customProperties>
                 <dependencies>
                   <entityDependency>
                     <name>490118eb-5bac-4398-b80c-19e1dd2a1935</name>
@@ -9242,8 +9279,15 @@
                 <isUnique v="false" />
                 <index v="false" />
                 <documentation></documentation>
-                <title></title>
+                <title>Name</title>
                 <description></description>
+                <customProperties>
+                  <customBooleanProperty>
+                    <name>log</name>
+                    <global v="false" />
+                    <property v="true" />
+                  </customBooleanProperty>
+                </customProperties>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DESCRIPTION</name>
@@ -9256,8 +9300,15 @@
                 <isUnique v="false" />
                 <index v="false" />
                 <documentation></documentation>
-                <title></title>
+                <title>Description</title>
                 <description></description>
+                <customProperties>
+                  <customBooleanProperty>
+                    <name>log</name>
+                    <global v="false" />
+                    <property v="true" />
+                  </customBooleanProperty>
+                </customProperties>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DATE_START</name>
@@ -9270,8 +9321,15 @@
                 <isUnique v="false" />
                 <index v="false" />
                 <documentation></documentation>
-                <title></title>
+                <title>Begin</title>
                 <description></description>
+                <customProperties>
+                  <customBooleanProperty>
+                    <name>log</name>
+                    <global v="false" />
+                    <property v="true" />
+                  </customBooleanProperty>
+                </customProperties>
               </entityFieldDb>
               <entityFieldDb>
                 <name>EMPLOYEE_CONTACT_ID</name>
@@ -9347,8 +9405,15 @@
                 <isUnique v="false" />
                 <index v="false" />
                 <documentation></documentation>
-                <title></title>
+                <title>Participants</title>
                 <description></description>
+                <customProperties>
+                  <customBooleanProperty>
+                    <name>log</name>
+                    <global v="false" />
+                    <property v="true" />
+                  </customBooleanProperty>
+                </customProperties>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DATE_END</name>
@@ -9361,8 +9426,15 @@
                 <isUnique v="false" />
                 <index v="false" />
                 <documentation></documentation>
-                <title></title>
+                <title>End</title>
                 <description></description>
+                <customProperties>
+                  <customBooleanProperty>
+                    <name>log</name>
+                    <global v="false" />
+                    <property v="true" />
+                  </customBooleanProperty>
+                </customProperties>
               </entityFieldDb>
               <entityFieldDb>
                 <name>PREDECESSORSTEP_ID</name>
diff --git a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
index e5ae1e8b20b8b85c004294d617ff9b6b374738a7..d636f153290453865383ccd8b3bbba015d8ae3c1 100644
--- a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
+++ b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
@@ -110,7 +110,7 @@
       <children>
         <entityActionField>
           <name>removeWithCommRestriction</name>
-          <title>Remove recipients with communication rejection</title>
+          <title>Remove recipients with advertising appeal</title>
           <onActionProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/recipientactions/children/removewithcommrestriction/onActionProcess.js</onActionProcess>
           <isObjectAction v="false" />
           <iconId>VAADIN:BAN</iconId>
diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaignstep_id/onValidation.js b/entity/CampaignAddParticipants_entity/entityfields/campaignstep_id/onValidation.js
index 9767998d73621627977f7032ebf94d92f3ac544e..578861f66eecbc88f37c98a43f593ff49d0ea89f 100644
--- a/entity/CampaignAddParticipants_entity/entityfields/campaignstep_id/onValidation.js
+++ b/entity/CampaignAddParticipants_entity/entityfields/campaignstep_id/onValidation.js
@@ -12,10 +12,18 @@ var isUpdate = Utils.toBoolean(vars.get("$param.isUpdate_param"));
 
 if (vars.get("$field.CAMPAIGN_ID")){
     var currentCount = parseInt(CampaignUtils.getParticipantCountForStep(vars.get("$field.CAMPAIGNSTEP_ID"),vars.get("$field.CAMPAIGN_ID")));
-    if ( (validCount+currentCount) > maxCount)
+    if ( (validCount+currentCount) > maxCount && maxCount != 0)
         result.string(translate.text("Not enough room in campaignstep"));
     
-    if (validCount == 0 && isUpdate){
+    if (validCount == 0 && isUpdate)
+    {
         result.string(translate.text("All of the chosen records are already in the campaignstep"));
     }
+    
+    var endDate = CampaignUtils.getEndDateForStep(vars.get("$field.CAMPAIGNSTEP_ID"));
+    if (endDate < vars.get("$sys.date"))
+    {
+        result.string(translate.text("Campaignstep has already ended"));
+    }
+        
 }
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
index a886027212db89216b6f4be30daaa9d6004b6ee6..3e9c54236492f7f5ed48597477c420151b7f73b5 100644
--- a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
+++ b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
@@ -82,6 +82,7 @@
         <element>PROCESS</element>
         <element>PROCESS_SETVALUE</element>
       </onValueChangeTypes>
+      <onValidation>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignstep_id/onValidation.js</onValidation>
     </entityField>
     <entityConsumer>
       <name>CampaignsConsumer</name>
@@ -192,6 +193,7 @@
     <entityField>
       <name>campaignStepCurrentParticipantCount</name>
       <title>Current participants</title>
+      <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignstepcurrentparticipantcount/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignstepcurrentparticipantcount/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
diff --git a/entity/CampaignParticipant_entity/entityfields/campaignstep_id/onValidation.js b/entity/CampaignParticipant_entity/entityfields/campaignstep_id/onValidation.js
new file mode 100644
index 0000000000000000000000000000000000000000..8b5ccc8e85add1d2f78f2a12009b33665cec89fa
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/campaignstep_id/onValidation.js
@@ -0,0 +1,27 @@
+import("Campaign_lib");
+import("system.translate");
+import("system.result");
+import("system.vars");
+import("Sql_lib");
+
+var currentCount = Number(vars.get("$field.campaignStepCurrentParticipantCount"));
+var maxCount = Number(vars.get("$field.campaignStepMaxParticipantCount"));
+var selectedCampaignStep = vars.get("local.value");
+
+var currentCampaignStep = newSelect("CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID")
+.from("CAMPAIGNPARTICIPANT")
+.where("CAMPAIGNPARTICIPANT.CONTACT_ID","$field.CONTACT_ID")
+.and("CAMPAIGNPARTICIPANT.CAMPAIGN_ID","$field.CAMPAIGN_ID")
+.cell();
+
+if (currentCampaignStep == selectedCampaignStep)
+    currentCount--;
+
+if (currentCount >= maxCount && maxCount != 0)
+    result.string(translate.text("Not enough room in campaignstep"));
+
+var endDate = CampaignUtils.getEndDateForStep(selectedCampaignStep);
+if (endDate < vars.get("$sys.date"))
+{
+    result.string(translate.text("Campaignstep has already ended"));
+}
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/campaignstepcurrentparticipantcount/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/campaignstepcurrentparticipantcount/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..ac08f7599eb528b626545f80f9e92bfaff923ff2
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/campaignstepcurrentparticipantcount/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("Campaign_lib");
+
+result.string(CampaignUtils.getParticipantCountForStep(vars.get("$field.CAMPAIGNSTEP_ID"), vars.get("$field.CAMPAIGN_ID")));
\ No newline at end of file
diff --git a/entity/CampaignPlanning_entity/CampaignPlanning_entity.aod b/entity/CampaignPlanning_entity/CampaignPlanning_entity.aod
index f57caf923755ee9f23d9dfe735b109cc4ff6366d..b283987f668e733c3f9fe6c9e3be12566b966889 100644
--- a/entity/CampaignPlanning_entity/CampaignPlanning_entity.aod
+++ b/entity/CampaignPlanning_entity/CampaignPlanning_entity.aod
@@ -8,6 +8,7 @@
     <element>Campaign_entity</element>
     <element>CampaignStep_entity</element>
   </siblings>
+  <initFilterProcess>%aditoprj%/entity/CampaignPlanning_entity/initFilterProcess.js</initFilterProcess>
   <iconId>NEON:GROUP_APPOINTMENT</iconId>
   <usePermissions v="false" />
   <recordContainer>jditoRecordContainer</recordContainer>
@@ -63,6 +64,11 @@
           <iconId>NEON:GROUP_APPOINTMENT</iconId>
           <tooltipProcess>%aditoprj%/entity/CampaignPlanning_entity/entityfields/newganttentries/children/createnewcampaignstep_action/tooltipProcess.js</tooltipProcess>
         </entityActionField>
+        <entityActionField>
+          <name>testfilter</name>
+          <title>testfilter</title>
+          <onActionProcess>%aditoprj%/entity/CampaignPlanning_entity/entityfields/newganttentries/children/testfilter/onActionProcess.js</onActionProcess>
+        </entityActionField>
       </children>
     </entityActionGroup>
     <entityField>
@@ -99,6 +105,9 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityField>
+      <name>test</name>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -143,6 +152,9 @@
           <name>CAMPAIGN_STATUS.value</name>
           <isFilterable v="true" />
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>test.value</name>
+        </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/CampaignPlanning_entity/entityfields/newganttentries/children/testfilter/onActionProcess.js b/entity/CampaignPlanning_entity/entityfields/newganttentries/children/testfilter/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..0179cd4c1c9cb1b5f50e0fbf86883aa758a85bbd
--- /dev/null
+++ b/entity/CampaignPlanning_entity/entityfields/newganttentries/children/testfilter/onActionProcess.js
@@ -0,0 +1,3 @@
+import("system.vars");
+import("system.logging");
+logging.log(JSON.stringify(vars.get("$sys.filter")));
\ No newline at end of file
diff --git a/entity/CampaignPlanning_entity/initFilterProcess.js b/entity/CampaignPlanning_entity/initFilterProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..7e2f9702cf230d3282a97c186e33a49db5923303
--- /dev/null
+++ b/entity/CampaignPlanning_entity/initFilterProcess.js
@@ -0,0 +1,22 @@
+import("system.translate");
+import("system.neon");
+import("system.vars");
+import("system.result");
+
+
+if(vars.get("$sys.presentationmode") === neon.CONTEXT_PRESENTATIONMODE_FILTER) 
+{
+    var filter = JSON.stringify({
+        type: "group",
+        operator: "AND",
+        childs: [{
+            type: "row",
+            name: "DATE_START",
+            operator: "TIMEFRAME_EQUAL",
+            contenttype: "DATE",
+            key: "REL=ADJUSTED;UNIT=YEAR",
+            value: translate.text("This year")
+        }]
+    });
+    result.string(filter);
+}
\ No newline at end of file
diff --git a/entity/CampaignPlanning_entity/recordcontainers/jditorecordcontainer/contentProcess.js b/entity/CampaignPlanning_entity/recordcontainers/jditorecordcontainer/contentProcess.js
index 53985b5cc50a47402b9df28330a3f2623c768f39..fbed65e393038e9bede001e59197d91225f6af42 100644
--- a/entity/CampaignPlanning_entity/recordcontainers/jditorecordcontainer/contentProcess.js
+++ b/entity/CampaignPlanning_entity/recordcontainers/jditorecordcontainer/contentProcess.js
@@ -6,6 +6,7 @@ import("system.result");
 import("system.vars");
 import("Sql_lib");
 import("Campaign_lib");
+import("system.neon");
 
 var stepCondition = JditoFilterUtils.getSqlCondition(vars.get("local.filter").filter, "CAMPAIGNSTEP", null, {
     "CAMPAIGN_STATUS" : "CAMPAIGN.STATUS",
@@ -51,11 +52,11 @@ if(!vars.get("$local.idvalues"))
         {
             let startDate = CampaignUtils.getCampaignStartDate(campaignId);
             let endDate = CampaignUtils.getCampaignEndDate(campaignId);
-            campaignRows[campaignId] = [campaignId, campaignName, null, null, startDate, endDate, campaignId, TARGET_CONTEXT_ROOT_ELEMENT, campaignStatus];
+            campaignRows[campaignId] = [campaignId, campaignName, null, null, startDate, endDate, campaignId, TARGET_CONTEXT_ROOT_ELEMENT, campaignStatus, neon.BRAND_COLOR];
         }
         stepIds[stepId] = true;
 
-        return [stepId, stepName, predecessorId || campaignId, desc, stepStartDate, stepEndDate, campaignId, TARGET_CONTEXT_ELEMENT, campaignStatus];
+        return [stepId, stepName, predecessorId || campaignId, desc, stepStartDate, stepEndDate, campaignId, TARGET_CONTEXT_ELEMENT, campaignStatus, neon.USER_COLOR_1];
     });
 
     //replace all predecessor ids that are not in the tree with the campaign id
diff --git a/entity/CampaignStep_entity/CampaignStep_entity.aod b/entity/CampaignStep_entity/CampaignStep_entity.aod
index 3e6431a73b8603709e2058f5edf0921f2bd4b35e..95dc636ca79da9c1b89e11d4f57a6239f3046284 100644
--- a/entity/CampaignStep_entity/CampaignStep_entity.aod
+++ b/entity/CampaignStep_entity/CampaignStep_entity.aod
@@ -149,7 +149,6 @@
       <name>MAXPARTICIPANTS</name>
       <title>Max participants</title>
       <contentType>NUMBER</contentType>
-      <mandatory v="true" />
       <onValidation>%aditoprj%/entity/CampaignStep_entity/entityfields/maxparticipants/onValidation.js</onValidation>
     </entityField>
     <entityConsumer>
diff --git a/entity/CampaignStep_entity/recordcontainers/db/onDBDelete.js b/entity/CampaignStep_entity/recordcontainers/db/onDBDelete.js
index c851ee9b66d5efaa3ee2e62cdfff1beb6e4402e2..ff4aac1c232e73a8fe360771286c3cc937e83973 100644
--- a/entity/CampaignStep_entity/recordcontainers/db/onDBDelete.js
+++ b/entity/CampaignStep_entity/recordcontainers/db/onDBDelete.js
@@ -8,6 +8,7 @@ newSelect("CAMPAIGNSTEP.CAMPAIGNSTEPID")
 .from("CAMPAIGNSTEP")
 .where("CAMPAIGNSTEP.CAMPAIGN_ID",vars.get("$field.CAMPAIGN_ID"))
 .and("CAMPAIGNSTEP.SORTING",vars.get("$field.SORTING"),SqlBuilder.GREATER_OR_EQUAL())
+.and("CAMPAIGNSTEP.CAMPAIGNSTEPID","$field.CAMPAIGNSTEPID",SqlBuilder.NOT_EQUAL())
 .orderBy("CAMPAIGNSTEP.SORTING asc")
 .arrayColumn()
 .forEach(function(pCampaignStepId)
@@ -16,6 +17,6 @@ newSelect("CAMPAIGNSTEP.CAMPAIGNSTEPID")
         });
         
 newWhere("CAMPAIGNSTEP.PREDECESSORSTEP_ID",vars.get("$field.CAMPAIGNSTEPID"))
-.updateFields({"CAMPAIGNSTEP.PREDECESSORSTEP_ID":null});
+.updateFields({"PREDECESSORSTEP_ID":null});
 
 WorkflowSignalSender.deleted();
\ No newline at end of file
diff --git a/entity/Campaign_entity/Campaign_entity.aod b/entity/Campaign_entity/Campaign_entity.aod
index 9d93c7d23d90afe6e57227857ea04fe64cb86b9e..6754197563ae4550c183bf64ab114835d86b1c75 100644
--- a/entity/Campaign_entity/Campaign_entity.aod
+++ b/entity/Campaign_entity/Campaign_entity.aod
@@ -613,6 +613,20 @@
       <stateProcess>%aditoprj%/entity/Campaign_entity/entityfields/copyparticipants/stateProcess.js</stateProcess>
       <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/copyparticipants/valueProcess.js</valueProcess>
     </entityField>
+    <entityConsumer>
+      <name>LogHistories</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>tablenames_param</name>
+          <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
     <entityParameter>
       <name>OnlyActive_param</name>
       <expose v="true" />
diff --git a/entity/Campaign_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js b/entity/Campaign_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..4e4ee5a48fe63d6e39e565bed437233b15e52b91
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js
@@ -0,0 +1,10 @@
+import("system.vars");
+import("system.result");
+import("Context_lib");
+
+var res = [];
+res.push({id: vars.get("$field.CAMPAIGNID"), tableNames: ["CAMPAIGNSTEP"]});
+res.push({id: vars.get("$field.CAMPAIGNID"), tableNames: ["CAMPAIGN"]});
+
+res = JSON.stringify(res);//currently only strings  can be passed as param
+result.object(res);
\ No newline at end of file
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index c264c38136ff20bf92b32cd0e3136e572d33fbc7..cbddf7d6d2aec500ca25b82f6e9ec27c814c7f29 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -9517,6 +9517,9 @@
     <entry>
       <key>Open Turnover</key>
     </entry>
+    <entry>
+      <key>Campaignstep has already ended</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index d6a269f2609d2fe323f115932a5b719c6a9d5b1b..b5ef0f8efa7fcb8417f59c5a7cab5fcf3e4eb5ad 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -18,6 +18,10 @@
       <key>Ace Archive</key>
       <value>Ace Archiv</value>
     </entry>
+    <entry>
+      <key>This year</key>
+      <value>Dieses Jahr</value>
+    </entry>
     <entry>
       <key>Event End</key>
       <value>Veranstaltungs Ende</value>
@@ -54,6 +58,10 @@
       <key>decrease priority</key>
       <value>Priorität verringern</value>
     </entry>
+    <entry>
+      <key>Campaignstep has already ended</key>
+      <value>Zeitraum der Kampagnenstufe ist bereits vorbei</value>
+    </entry>
     <entry>
       <key>Click rate (in \%)</key>
       <value>Klickrate in Prozent</value>
@@ -120,7 +128,7 @@
     </entry>
     <entry>
       <key>Move down</key>
-      <value>Nach unten  verschieben</value>
+      <value>Nach unten verschieben</value>
     </entry>
     <entry>
       <key>Value is too big, the maximum is %0</key>
@@ -691,8 +699,8 @@
       <value>Weitere Versionen</value>
     </entry>
     <entry>
-      <key>Remove recipients with communication rejection</key>
-      <value>Empfänger mit Werbeablehnung entfernen</value>
+      <key>Remove recipients with advertising appeal</key>
+      <value>Empfänger mit Werbewiderspruch entfernen</value>
     </entry>
     <entry>
       <key>Company group</key>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 1f456fce27cf983b0e2726505ff368a703ee0c70..a757ce01763c1a53a7a17f56f827d03c9fc4f900 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -9632,6 +9632,9 @@
     <entry>
       <key>Open Turnover</key>
     </entry>
+    <entry>
+      <key>Campaignstep has already ended</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonView/CampaignMain_view/CampaignMain_view.aod b/neonView/CampaignMain_view/CampaignMain_view.aod
index 812508aa6ea4d0e13af4d1ee20398863fa870c88..92569fb8314d5657f076055c0627d1f9b1b340a3 100644
--- a/neonView/CampaignMain_view/CampaignMain_view.aod
+++ b/neonView/CampaignMain_view/CampaignMain_view.aod
@@ -46,6 +46,11 @@
       <entityField>Activities</entityField>
       <view>ActivityFilter_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>73099aeb-2159-48e4-95e0-d046bf303c35</name>
+      <entityField>Tasks</entityField>
+      <view>TaskFilter_view</view>
+    </neonViewReference>
     <neonViewReference>
       <name>3b87a113-aa39-4d20-8902-ad2a9f6aba5f</name>
       <entityField>Documents</entityField>
@@ -56,5 +61,10 @@
       <entityField>AttributeTree</entityField>
       <view>AttributeRelationTree_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>2221b2e7-a689-48ab-a933-782749d05255</name>
+      <entityField>LogHistories</entityField>
+      <view>LogHistoryFilter_view</view>
+    </neonViewReference>
   </children>
 </neonView>
diff --git a/neonView/CampaignPlanning_view/CampaignPlanning_view.aod b/neonView/CampaignPlanning_view/CampaignPlanning_view.aod
index 48b886b92c0f8ab819e76bb8757cbc3012d98bb4..c67676c9e8cd79f474646bb37fba81212ac9e72e 100644
--- a/neonView/CampaignPlanning_view/CampaignPlanning_view.aod
+++ b/neonView/CampaignPlanning_view/CampaignPlanning_view.aod
@@ -12,17 +12,19 @@
   <children>
     <ganttViewTemplate>
       <name>AllCampaignsOverviewGantt</name>
-      <groupByRootElements v="true" />
+      <groupByRootElements v="false" />
+      <hideArrows v="true" />
       <uidField>UID</uidField>
       <titleField>NAME</titleField>
       <descriptionField>STEP_DESCRIPTION</descriptionField>
       <beginDateField>DATE_START</beginDateField>
       <endDateField>DATE_END</endDateField>
       <predecessorIdField>PREDECESSOR_STEP_ID</predecessorIdField>
+      <stepColorField>test</stepColorField>
       <entityField>#ENTITY</entityField>
       <favoriteActionGroup2>NewGanttEntries</favoriteActionGroup2>
       <isDeletable v="true" />
-      <isEditable v="true" />
+      <isEditable v="false" />
       <columns>
         <neonTableColumn>
           <name>788b50db-d87e-4c6e-ab3c-d28b32a2f729</name>
diff --git a/process/Campaign_lib/process.js b/process/Campaign_lib/process.js
index aa9f551d99de8e64b391f5cc685801ffc932b480..73c7e894f26bfb822e0a692228ee61865e91d167 100644
--- a/process/Campaign_lib/process.js
+++ b/process/Campaign_lib/process.js
@@ -107,6 +107,20 @@ CampaignUtils.getParticipantCount = function(pCampaignId)
         .cell(true, 0);
 }
 
+/**
+ * The end date value for the given campaignstep.<br>
+ * 
+ * @return          <p>
+ *                  The end date for the campaignstep
+ */
+CampaignUtils.getEndDateForStep = function(pCampaignStepId)
+{
+    return newSelect("DATE_END")
+        .from("CAMPAIGNSTEP")
+        .whereIfSet("CAMPAIGNSTEP.CAMPAIGNSTEPID", pCampaignStepId)
+        .cell(true);
+}
+
 /**
  * The max participants value for the given campaignstep.<br>
  * 
@@ -293,10 +307,9 @@ CampaignUtils.getDefaultCampaignStep = function(pCampaignId)
  */
 CampaignUtils.getCampaignStartDate = function(pCampaignId)
 {
-    return newSelect("DATE_START")
+    return newSelect("min(DATE_START)")
         .from("CAMPAIGNSTEP")
         .whereIfSet("CAMPAIGNSTEP.CAMPAIGN_ID", pCampaignId)
-        .orderBy("SORTING ASC")
         .cell(true);
 }
 
@@ -311,10 +324,9 @@ CampaignUtils.getCampaignStartDate = function(pCampaignId)
  */
 CampaignUtils.getCampaignEndDate = function(pCampaignId)
 {
-    return newSelect("DATE_END")
+    return newSelect("max(DATE_END)")
         .from("CAMPAIGNSTEP")
         .whereIfSet("CAMPAIGNSTEP.CAMPAIGN_ID", pCampaignId)
-        .orderBy("SORTING DESC")
         .cell(true);
 }