diff --git a/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod b/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod
index 6f2dff01cc0a13523ca97825fcc799a762f3b274..a280adae7f0d34b12abf8c984b684e3b4e43e81a 100644
--- a/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod
+++ b/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod
@@ -185,6 +185,20 @@
       <expose v="true" />
       <description>PARAMETER</description>
     </entityParameter>
+    <entityField>
+      <name>netPerParticipant</name>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#,##0.00</outputFormat>
+      <titleProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/netperparticipant/titleProcess.js</titleProcess>
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/netperparticipant/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>countParticipants</name>
+      <title>Participants</title>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#0</outputFormat>
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js</valueProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6952bc19fb1c4532ee3588b899bb4be228e0dc60
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js
@@ -0,0 +1,12 @@
+import("system.result");
+import("system.vars");
+import("Campaign_lib");
+
+if (vars.get("$field.CAMPAIGNSTEP_ID"))
+{
+    result.string(CampaignUtils.getParticipantCountForStep(vars.get("$field.CAMPAIGNSTEP_ID")));
+}
+else
+{
+    result.string(CampaignUtils.getParticipantCount(vars.get("$field.CAMPAIGN_ID")));
+}
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/netperparticipant/titleProcess.js b/entity/CampaignCost_entitiy/entityfields/netperparticipant/titleProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..fc36199cca341dd1e3923ebb223ab28f3efa5ccf
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/netperparticipant/titleProcess.js
@@ -0,0 +1,4 @@
+import("system.translate");
+import("system.result");
+
+result.string(translate.text("Cost") +  " " + translate.text("per") + " "  + translate.text("Participant"));
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/netperparticipant/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/netperparticipant/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..21c35016923a3ff94141e6d0d2e652764b35a41e
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/netperparticipant/valueProcess.js
@@ -0,0 +1,11 @@
+import("system.vars");
+import("system.result");
+import("system.eMath");
+
+var netto = parseFloat(vars.get("$field.NET"));
+var countParticipants = parseFloat(vars.get("$field.countParticipants"));
+
+if (countParticipants > 0)
+    result.string(eMath.roundDec(netto / countParticipants, 2, eMath.ROUND_HALF_UP));
+else
+    result.string(0);
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/titleProcess.js b/entity/CampaignStep_entity/titleProcess.js
index 33f139bb3d446b844820ecaf7443db266043bc13..429260276f9d30b111be834373ee1613df1f7084 100644
--- a/entity/CampaignStep_entity/titleProcess.js
+++ b/entity/CampaignStep_entity/titleProcess.js
@@ -1,4 +1,5 @@
+import("Context_lib");
 import("system.result");
 import("system.vars");
 
-result.string(vars.getString("$field.NAME"));
\ No newline at end of file
+result.string(ContextUtils.prefixWithCurrentContextTitle(vars.getString("$field.NAME")));
\ No newline at end of file
diff --git a/entity/Campaign_entity/Campaign_entity.aod b/entity/Campaign_entity/Campaign_entity.aod
index 9ccbae20b89f4b4cac7548dd82705126b4083d1e..1fbad7abc97641cf3ae3ef095620b7d7661c3428 100644
--- a/entity/Campaign_entity/Campaign_entity.aod
+++ b/entity/Campaign_entity/Campaign_entity.aod
@@ -191,6 +191,12 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityField>
+      <name>COST</name>
+      <title>Cost</title>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#,##0.00</outputFormat>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -247,6 +253,10 @@
           <name>CAMPAIGNID.value</name>
           <recordfield>CAMPAIGN.CAMPAIGNID</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>COST.value</name>
+          <expression>%aditoprj%/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/Campaign_entity/entityfields/date_end/displayValueProcess.js b/entity/Campaign_entity/entityfields/date_end/displayValueProcess.js
index eeaf6b9c011a4bd31dc94c66eac81bfb1be3adb1..af009bc99321959dee737e4dd3c6bea039862e1c 100644
--- a/entity/Campaign_entity/entityfields/date_end/displayValueProcess.js
+++ b/entity/Campaign_entity/entityfields/date_end/displayValueProcess.js
@@ -6,7 +6,7 @@ if(vars.exists("$field.CAMPAIGNID") &&
         vars.get("$field.CAMPAIGNID") != "" && vars.get("$field.CAMPAIGNID") != null)
 {
     var capmaignId = vars.get("$field.CAMPAIGNID");
-    var campaignStepEndDate = getCampaignEndDate(capmaignId);
+    var campaignStepEndDate = CampaignUtils.getCampaignEndDate(capmaignId);
 
     result.string(campaignStepEndDate);
 }
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/date_start/displayValueProcess.js b/entity/Campaign_entity/entityfields/date_start/displayValueProcess.js
index 2fa5058ade0a35fca709a2216383b090fa459a98..fd8b8586af122186de41ee63ab69db1c255434eb 100644
--- a/entity/Campaign_entity/entityfields/date_start/displayValueProcess.js
+++ b/entity/Campaign_entity/entityfields/date_start/displayValueProcess.js
@@ -6,7 +6,7 @@ if(vars.exists("$field.CAMPAIGNID") &&
         vars.get("$field.CAMPAIGNID") != "" && vars.get("$field.CAMPAIGNID") != null)
 {
     var capmaignId = vars.get("$field.CAMPAIGNID");
-    var campaignStepStartDate = getCampaignStartDate(capmaignId);
+    var campaignStepStartDate = CampaignUtils.getCampaignStartDate(capmaignId);
     
     result.string(campaignStepStartDate);
 }
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..cecf6e4f7c03f399083118f9c9b3413277c9204b
--- /dev/null
+++ b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("(select sum(NET) from CAMPAIGNCOST where CAMPAIGNCOST.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID)")
\ No newline at end of file
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index 3df60c9058782f945cbb40a63fed8c119b8b1068..7d36afb0e90d471b736369839c52c5c941ce25c6 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -3084,6 +3084,9 @@
     <entry>
       <key>Fix cost</key>
     </entry>
+    <entry>
+      <key>per</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 c53a7ea555bd35a6704f35cf3477e899ca332b9b..7ea7f1384150ef17c94609a66acc6f642c821c46 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -3893,6 +3893,7 @@
     </entry>
     <entry>
       <key>Participant</key>
+      <value>Teilnehmer/in</value>
     </entry>
     <entry>
       <key>Printing costs</key>
@@ -3928,9 +3929,15 @@
     </entry>
     <entry>
       <key>Step</key>
+      <value>Stufe</value>
     </entry>
     <entry>
       <key>Fix cost</key>
+      <value>Fixkosten</value>
+    </entry>
+    <entry>
+      <key>per</key>
+      <value>pro</value>
     </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 7238483c5aec74d944d3e5f0f9c41a8388a18d82..dc64f28a583dd8f7d2fd02de288030e3467f387a 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -3119,19 +3119,7 @@
       <value>Webservice not available. URL: %0 %1</value>
     </entry>
     <entry>
-      <key>file '%0' cannot be read</key>
-    </entry>
-    <entry>
-      <key>Importer</key>
-    </entry>
-    <entry>
-      <key>yyyy-MM-dd HH:mm:ss</key>
-    </entry>
-    <entry>
-      <key>file '%0' does not exist or you have got no permission on this file</key>
-    </entry>
-    <entry>
-      <key>Zip</key>
+      <key>per</key>
     </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
diff --git a/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod b/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
index b2e97e0bfd05c713d691f56c3b70da413bf79068..d3aa701691615ece48b9dc19340ab4754bf26c49 100644
--- a/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
+++ b/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
@@ -21,6 +21,14 @@
           <name>457caff8-0403-425f-839c-62e5d05fe3a1</name>
           <entityField>CATEGORY</entityField>
         </neonTableColumn>
+        <neonTableColumn>
+          <name>f8c6439c-9536-477b-af19-26719902e12e</name>
+          <entityField>netPerParticipant</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>8239e81b-d69c-4ea9-b55d-83e79d1693cf</name>
+          <entityField>countParticipants</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>2adbd887-f1df-43ff-bde9-12c8273af7a9</name>
           <entityField>NET</entityField>
diff --git a/neonView/CampaignPreview_view/CampaignPreview_view.aod b/neonView/CampaignPreview_view/CampaignPreview_view.aod
index 8eee0f92715eae0704930c954bd54b7ac0fd6a6a..4ca3d91f4f741cdf90bb84670abdcf11649ed710 100644
--- a/neonView/CampaignPreview_view/CampaignPreview_view.aod
+++ b/neonView/CampaignPreview_view/CampaignPreview_view.aod
@@ -31,6 +31,10 @@
           <name>a52607c9-da9c-4894-acc6-f31024510d6d</name>
           <entityField>DATE_END</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>87b03a62-3508-4267-afd6-95428f0d1f8d</name>
+          <entityField>COST</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
   </children>
diff --git a/process/Campaign_lib/process.js b/process/Campaign_lib/process.js
index ced1497caf426421c04ad6bb9c41923cf649b086..eb04a8ad3e000bb3f0933788586ea710f9db4828 100644
--- a/process/Campaign_lib/process.js
+++ b/process/Campaign_lib/process.js
@@ -70,6 +70,18 @@ CampaignUtils.getParticipantCountForStep = function(pCampaignStepId)
     return _CampaignUtils._loadSingleValueFromDb(selectQuery, conditionField, pCampaignStepId, defaultValue);
 }
 
+/**
+ * todo
+ */
+CampaignUtils.getParticipantCount = function(pCampaignId)
+{
+    let selectQuery = "select count(*) from CAMPAIGNPARTICIPANT";
+    let conditionField = "CAMPAIGNPARTICIPANT.CAMPAIGN_ID";
+    let defaultValue = 0;
+    
+    return _CampaignUtils._loadSingleValueFromDb(selectQuery, conditionField, pCampaignId, defaultValue);
+}
+
 /**
  * todo
  */
@@ -114,7 +126,7 @@ CampaignUtils.createLogEntry = function(pCampaignId, pCampaignStepId, pContactId
  */
 CampaignUtils.getParticipantLogInsertColumnNames = function()
 {
-    return new Array("CAMPAIGNPARTICIPANT_ID", "CAMPAIGN_ID", "CAMPAIGNSTEP_ID", "CAMPAIGNPARTICIPANTLOGID", "USER_NEW", "DATE_NEW");
+    return ["CAMPAIGNPARTICIPANT_ID", "CAMPAIGN_ID", "CAMPAIGNSTEP_ID", "CAMPAIGNPARTICIPANTLOGID", "USER_NEW", "DATE_NEW"];
 }
 
 /**
@@ -148,6 +160,29 @@ CampaignUtils.getDefaultCampaignStep = function(pCampaignId)
     return db.cell(selectQuery)   
 }
 
+/**
+ * todo
+ */
+CampaignUtils.getCampaignStartDate = function(pCapmaignId)
+{
+    var campaignIdCondition = SqlCondition.begin()
+                                         .andPrepare("CAMPAIGNSTEP.CAMPAIGN_ID", pCapmaignId);
+    // TODO: Fetch first 1 rows only will not work with all dbms! Maybe just remove it, because db.cell always uses only the first row
+    return db.cell(campaignIdCondition.buildSql("SELECT DATE_START, SORTING FROM ADITO.CAMPAIGNSTEP", "1=2", "order by SORTING ASC FETCH FIRST 1 ROWS ONLY"));
+}
+
+/**
+ * todo
+ */
+CampaignUtils.getCampaignEndDate = function(pCapmaignId)
+{
+    var campaignIdCondition = SqlCondition.begin()
+                                         .andPrepare("CAMPAIGNSTEP.CAMPAIGN_ID", pCapmaignId);
+
+    // TODO: Fetch first 1 rows only will not work with all dbms! Maybe just remove it, because db.cell always uses only the first row
+    return db.cell(campaignIdCondition.buildSql("SELECT DATE_END, SORTING FROM CAMPAIGNSTEP", "1=2", "order by SORTING ASC FETCH FIRST 1 ROWS ONLY"));
+}
+
 /**
  * Methods for campaignmanagement.
  * Do not create an instance of this!
@@ -186,29 +221,11 @@ _CampaignUtils._openAddParticipantContext = function(pContext, pRowIds, pEntityP
 _CampaignUtils._loadSingleValueFromDb = function(pSelectQuery, pConditionField, pConditionValue, pDefaultValue)
 {
     let res = pDefaultValue;
-    if (pConditionValue != null && pConditionValue != "null" && pConditionValue != "")
+    if (pConditionValue)
     {
         res = db.cell(SqlCondition.begin()
                                   .andPrepare(pConditionField, pConditionValue)
                                   .buildSql(pSelectQuery));
     }
     return res;
-}
-
-/**
- * todo
- */
-function getCampaignStartDate(pCapmaignId)
-{
-    var dateStartQuery = "SELECT DATE_START, SORTING FROM ADITO.CAMPAIGNSTEP where CAMPAIGN_ID = '"+ pCapmaignId +"' order by SORTING ASC FETCH FIRST 1 ROWS ONLY";
-    return db.cell(dateStartQuery);
-}
-
-/**
- * todo
- */
-function getCampaignEndDate(pCapmaignId)
-{
-    var dateEndQuery = "SELECT DATE_END, SORTING FROM ADITO.CAMPAIGNSTEP where CAMPAIGN_ID = '"+ pCapmaignId +"' order by SORTING DESC FETCH FIRST 1 ROWS ONLY";
-    return db.cell(dateEndQuery);
 }
\ No newline at end of file