diff --git a/.liquibase/Data_alias/basic/2020.0.1/WorkflowSignal/create_WorkflowSignal.xml b/.liquibase/Data_alias/basic/2020.0.1/WorkflowSignal/create_WorkflowSignal.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ca188068504f512ef0e5c4ee9b52a9a37495dfae
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.0.1/WorkflowSignal/create_WorkflowSignal.xml
@@ -0,0 +1,16 @@
+<?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="s.listl" id="18da4f91-3334-47c6-958d-6d0efce52d31">
+        <createTable tableName="WORKFLOWSIGNAL">
+            <column name="WORKFLOWSIGNALID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_WORKFLOWSIGNALID"/>
+            </column>
+            <column name="SIGNAL_NAME" type="VARCHAR(255)"/>
+            <column name="OBJECT_TYPE" type="VARCHAR(63)"/>
+            <column name="TRIGGER_EVENT" type="CHAR(36)"/>
+            <column name="PROCESSDEFINITION_KEY" type="VARCHAR(255)"/>
+            <column name="OBJECT_CONDITION" type="NVARCHAR(512)"/>
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2020.0.1/changelog.xml b/.liquibase/Data_alias/basic/2020.0.1/changelog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c3105c90b71f48e03afbe5a3771cbaaa080040da
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.0.1/changelog.xml
@@ -0,0 +1,5 @@
+<?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 file="WorkflowSignal/create_WorkflowSignal.xml" relativeToChangelogFile="true"/>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/changelog.xml b/.liquibase/Data_alias/changelog.xml
index cc63bd025f48c03b71ce2b6d2613b52871996905..cc2f1fb471786b8918923569570fca173bbf091f 100644
--- a/.liquibase/Data_alias/changelog.xml
+++ b/.liquibase/Data_alias/changelog.xml
@@ -8,6 +8,7 @@
     <include relativeToChangelogFile="true" file="basic/2019.3.2/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2019.3.3/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2020.0.0/changelog.xml"/>
+    <include relativeToChangelogFile="true" file="basic/2020.0.1/changelog.xml"/>
     
     <!--enable this only when you definetly want to overwrite the existing data with demo records:--> 
     <!--<include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>-->
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 54d9a6d96337119edf5809df28e0d6849010a8ae..864f08aaa855fa6b4baf9353f73ab22daea1d9b2 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -13297,6 +13297,110 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
+          <entityDb>
+            <name>WORKFLOWSIGNAL</name>
+            <dbName></dbName>
+            <idColumn>WORKFLOWSIGNALID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>SIGNAL_NAME</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="255" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>WORKFLOWSIGNALID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>TRIGGER_EVENT</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>OBJECT_CONDITION</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="512" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>OBJECT_TYPE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="63" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>PROCESSDEFINITION_KEY</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="255" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
         </entities>
       </entityGroup>
     </aliasDefDb>
diff --git a/entity/Context_entity/Context_entity.aod b/entity/Context_entity/Context_entity.aod
index 92b4a55b9b264a8ced721698129a93bd0baf14a3..f2201393b8ef0ca3b8308c427400cf082cd431c6 100644
--- a/entity/Context_entity/Context_entity.aod
+++ b/entity/Context_entity/Context_entity.aod
@@ -151,6 +151,12 @@
           <fieldName>Contexts</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>591679c2-8fd3-4d05-9ef3-b648373785f7</name>
+          <entityName>WorkflowSignal_entity</entityName>
+          <fieldName>Contexts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
   </entityFields>
diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
index ca40ed92276a0d09ff1e111bc3cf710adc3f521e..126ed926b5fa3f0e51831332e07401bd60d68439 100644
--- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod
+++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
@@ -559,6 +559,12 @@
           <fieldName>CampaignStatusKeyword</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>66c64130-1997-4565-854e-94802b46dc96</name>
+          <entityName>WorkflowSignal_entity</entityName>
+          <fieldName>TriggerKeyword</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
       <children>
         <entityParameter>
diff --git a/entity/Offer_entity/afterOperatingState.js b/entity/Offer_entity/afterOperatingState.js
index 95c27335097d5a484f25b37e679dbc332eb8302a..9e011dcf5d5d51fd3c9a78e55b9936e2bec21f10 100644
--- a/entity/Offer_entity/afterOperatingState.js
+++ b/entity/Offer_entity/afterOperatingState.js
@@ -1,3 +1,4 @@
+import("Context_lib");
 import("system.vars");
 import("Workflow_lib");
 
@@ -5,4 +6,5 @@ if (vars.exists("$context.workflowQueue") && vars.get("$context.workflowQueue"))
 {
     WorkflowStarter.inserted(vars.get("$context.workflowQueue"));
     vars.set("$context.workflowQueue", null);
-}
\ No newline at end of file
+}
+WorkflowSignalSender.doInsertedOrUpdated();
\ No newline at end of file
diff --git a/entity/Offer_entity/recordcontainers/db/onDBDelete.js b/entity/Offer_entity/recordcontainers/db/onDBDelete.js
index 1f353a6744202e829f1486293da519903a9a43b0..dbcf3083e10d4f8e2686a00a91f238d27e33c1f1 100644
--- a/entity/Offer_entity/recordcontainers/db/onDBDelete.js
+++ b/entity/Offer_entity/recordcontainers/db/onDBDelete.js
@@ -5,4 +5,5 @@ import("system.vars");
 newWhere("OFFERITEM.OFFER_ID", "$field.OFFERID")
     .deleteData();
     
-WorkflowStarter.deleted({sum : Number(vars.get("$field.TotalGross")), status : vars.get("$field.STATUS")});
\ No newline at end of file
+WorkflowStarter.deleted({sum : Number(vars.get("$field.TotalGross")), status : vars.get("$field.STATUS")});
+WorkflowSignalSender.deleted();
\ No newline at end of file
diff --git a/entity/Offer_entity/recordcontainers/db/onDBInsert.js b/entity/Offer_entity/recordcontainers/db/onDBInsert.js
index e889b0d6c55e6902744e0a7469940c9a3a73972f..f65c655ec8749a87aaa568516948de8f37076339 100644
--- a/entity/Offer_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/Offer_entity/recordcontainers/db/onDBInsert.js
@@ -1,3 +1,4 @@
+import("system.workflow");
 import("Workflow_lib");
 import("system.db");
 import("system.datetime");
@@ -22,3 +23,4 @@ if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
 
 //start the execution in afterOperatingState, because here the dataset is not yet inserted
 vars.set("$context.workflowQueue", {sum : Number(vars.get("$field.TotalGross")), status : vars.get("$field.STATUS")});
+WorkflowSignalSender.markInserted();
diff --git a/entity/Offer_entity/recordcontainers/db/onDBUpdate.js b/entity/Offer_entity/recordcontainers/db/onDBUpdate.js
index 8f911091e9794cb39984177859555ab3d1438b1d..481f3bcd1ad9144b89734a95b8f774f85a1af2d7 100644
--- a/entity/Offer_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/Offer_entity/recordcontainers/db/onDBUpdate.js
@@ -1,7 +1,10 @@
+import("system.workflow");
 import("KeywordRegistry_basic");
 import("system.vars");
 import("Workflow_lib");
 
 var status = vars.get("$local.rowdata")["OFFER.STATUS"];
 if (vars.get("$local.changed").indexOf("OFFER.STATUS") !== -1 && status == $KeywordRegistry.offerStatus$toCheck())
-    WorkflowStarter.updated({sum : Number(vars.get("$field.TotalGross")), status : status});
\ No newline at end of file
+    WorkflowStarter.updated({sum : Number(vars.get("$field.TotalGross")), status : status});
+
+WorkflowSignalSender.markUpdated();
\ No newline at end of file
diff --git a/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod b/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod
index f7bbe40886f6601c68134ddaefd9114e4861d66d..7a08e145424bf057bbb9823bbbdd4dae3f2e1eb7 100644
--- a/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod
+++ b/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod
@@ -171,6 +171,24 @@
       <onActionProcess>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/downloadxml/onActionProcess.js</onActionProcess>
       <iconId>VAADIN:DOWNLOAD</iconId>
     </entityActionField>
+    <entityConsumer>
+      <name>Signals</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>WorkflowSignal_entity</entityName>
+        <fieldName>ProcessDefinitionSignals</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ProcessDefinitionId_param</name>
+          <valueProcess>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>ProcessDefinitionKey_param</name>
+          <valueProcess>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionkey_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionid_param/valueProcess.js b/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..16c85500b5355a72548030867e3d300661e9d4aa
--- /dev/null
+++ b/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.UID"));
\ No newline at end of file
diff --git a/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionkey_param/valueProcess.js b/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionkey_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..3c5c973d2b247ecef9c21e39584f539bf986176d
--- /dev/null
+++ b/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionkey_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.KEY"));
\ No newline at end of file
diff --git a/entity/WorkflowSignal_entity/WorkflowSignal_entity.aod b/entity/WorkflowSignal_entity/WorkflowSignal_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..90a3b92882d6c751d6cafa209817a0ec6c874563
--- /dev/null
+++ b/entity/WorkflowSignal_entity/WorkflowSignal_entity.aod
@@ -0,0 +1,133 @@
+<?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.13" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.13">
+  <name>WorkflowSignal_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <title>Workflow signal</title>
+  <titlePlural>Signals</titlePlural>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>WORKFLOWSIGNALID</name>
+    </entityField>
+    <entityField>
+      <name>SIGNAL_NAME</name>
+      <title>Signal</title>
+      <dropDownProcess>%aditoprj%/entity/WorkflowSignal_entity/entityfields/signal_name/dropDownProcess.js</dropDownProcess>
+    </entityField>
+    <entityField>
+      <name>SCOPE</name>
+      <title>Scope</title>
+    </entityField>
+    <entityParameter>
+      <name>ProcessDefinitionId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>OBJECT_TYPE</name>
+      <title>Context</title>
+      <consumer>Contexts</consumer>
+    </entityField>
+    <entityField>
+      <name>TRIGGER_EVENT</name>
+      <title>Trigger</title>
+      <consumer>TriggerKeyword</consumer>
+    </entityField>
+    <entityField>
+      <name>OBJECT_CONDITION</name>
+      <title>Condition</title>
+      <contentType>FILTER_TREE</contentType>
+      <valueProcess>%aditoprj%/entity/WorkflowSignal_entity/entityfields/object_condition/valueProcess.js</valueProcess>
+    </entityField>
+    <entityConsumer>
+      <name>Contexts</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Context_entity</entityName>
+        <fieldName>Exclusive</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>TriggerKeyword</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/WorkflowSignal_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityProvider>
+      <name>ProcessDefinitionSignals</name>
+      <dependencies>
+        <entityDependency>
+          <name>f08ff63c-296a-4b1f-8264-b6b1e6c1d748</name>
+          <entityName>WorkflowDefinition_entity</entityName>
+          <fieldName>Signals</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
+    <entityField>
+      <name>PROCESSDEFINITION_KEY</name>
+      <valueProcess>%aditoprj%/entity/WorkflowSignal_entity/entityfields/processdefinition_key/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>ProcessDefinitionKey_param</name>
+      <expose v="true" />
+    </entityParameter>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>Data_alias</alias>
+      <conditionProcess>%aditoprj%/entity/WorkflowSignal_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <linkInformation>
+        <linkInformation>
+          <name>f6162cb6-c209-4607-8d67-0d630b28feab</name>
+          <tableName>WORKFLOWSIGNAL</tableName>
+          <primaryKey>WORKFLOWSIGNALID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>WORKFLOWSIGNALID.value</name>
+          <recordfield>WORKFLOWSIGNAL.WORKFLOWSIGNALID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>OBJECT_CONDITION.value</name>
+          <recordfield>WORKFLOWSIGNAL.OBJECT_CONDITION</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>OBJECT_TYPE.value</name>
+          <recordfield>WORKFLOWSIGNAL.OBJECT_TYPE</recordfield>
+          <isFilterable v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>SIGNAL_NAME.value</name>
+          <recordfield>WORKFLOWSIGNAL.SIGNAL_NAME</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>TRIGGER_EVENT.value</name>
+          <recordfield>WORKFLOWSIGNAL.TRIGGER_EVENT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>TRIGGER_EVENT.displayValue</name>
+          <expression>%aditoprj%/entity/WorkflowSignal_entity/recordcontainers/db/recordfieldmappings/trigger_event.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PROCESSDEFINITION_KEY.value</name>
+          <recordfield>WORKFLOWSIGNAL.PROCESSDEFINITION_KEY</recordfield>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/WorkflowSignal_entity/entityfields/object_condition/valueProcess.js b/entity/WorkflowSignal_entity/entityfields/object_condition/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..8a7128421f3b6e6e5d154b230ca259e4f843dbbd
--- /dev/null
+++ b/entity/WorkflowSignal_entity/entityfields/object_condition/valueProcess.js
@@ -0,0 +1,23 @@
+import("Context_lib");
+import("system.neon");
+import("system.vars");
+import("system.result");
+import("Attribute_lib");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+{
+    var context = vars.getString("$field.OBJECT_TYPE");
+    var entity = ContextUtils.getEntity(context);
+    var emptyFilter = {entity: entity, filter: {type: "group", operator: "AND", childs: []}};
+
+    var currentFilter = vars.get("$this.value");
+    if (currentFilter)
+        currentFilter = JSON.parse(currentFilter);
+
+    //if the filter field is empty or if the entity was changed, reset the filter
+    if (!currentFilter || currentFilter.entity != emptyFilter.entity)
+    {
+        var condJson = JSON.stringify(emptyFilter);
+        result.string(condJson);
+    }
+}
\ No newline at end of file
diff --git a/entity/WorkflowSignal_entity/entityfields/processdefinition_key/valueProcess.js b/entity/WorkflowSignal_entity/entityfields/processdefinition_key/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..65a94b89933c5105c3abfb125ea08cd1a77c4b29
--- /dev/null
+++ b/entity/WorkflowSignal_entity/entityfields/processdefinition_key/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(vars.get("$param.ProcessDefinitionKey_param"));
\ No newline at end of file
diff --git a/entity/WorkflowSignal_entity/entityfields/signal_name/dropDownProcess.js b/entity/WorkflowSignal_entity/entityfields/signal_name/dropDownProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..50e53ca72a8aa2cd220405357914682f63e92a56
--- /dev/null
+++ b/entity/WorkflowSignal_entity/entityfields/signal_name/dropDownProcess.js
@@ -0,0 +1,13 @@
+import("system.result");
+import("system.workflow");
+import("system.vars");
+
+var processDefinitionId = vars.get("$param.ProcessDefinitionId_param");
+var signals = processDefinitionId
+    ? JSON.parse(workflow.getSignalDefinitions(processDefinitionId))
+    : [];
+
+result.object(signals.map(function (signal)
+{
+    return [signal.name, signal.name];
+}));
\ No newline at end of file
diff --git a/entity/WorkflowSignal_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js b/entity/WorkflowSignal_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..dee07a7bcce5662c3c52ee83659e3c64fcf52d10
--- /dev/null
+++ b/entity/WorkflowSignal_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("KeywordRegistry_basic");
+import("system.result");
+
+result.string($KeywordRegistry.workflowTrigger());
\ No newline at end of file
diff --git a/entity/WorkflowSignal_entity/recordcontainers/db/conditionProcess.js b/entity/WorkflowSignal_entity/recordcontainers/db/conditionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..cb352a5e45ce024c0ae6b3113c1c89a465508b13
--- /dev/null
+++ b/entity/WorkflowSignal_entity/recordcontainers/db/conditionProcess.js
@@ -0,0 +1,6 @@
+import("Sql_lib");
+import("system.result");
+
+var cond = newWhereIfSet("WORKFLOWSIGNAL.PROCESSDEFINITION_ID", "$param.ProcessDefinitionId_param");
+
+result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/WorkflowSignal_entity/recordcontainers/db/recordfieldmappings/trigger_event.displayvalue/expression.js b/entity/WorkflowSignal_entity/recordcontainers/db/recordfieldmappings/trigger_event.displayvalue/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..f484f92b06795d86a986de789b39f35047dffbef
--- /dev/null
+++ b/entity/WorkflowSignal_entity/recordcontainers/db/recordfieldmappings/trigger_event.displayvalue/expression.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.workflowTrigger(), "WORKFLOWSIGNAL.TRIGGER_EVENT");
+result.string(sql);
\ No newline at end of file
diff --git a/entity/WorkflowTask_entity/WorkflowTask_entity.aod b/entity/WorkflowTask_entity/WorkflowTask_entity.aod
index f5ded376a8a6456237c30ff4ebfa04221760142a..378580b2459a6093f7ff363314a3a285d0de3b07 100644
--- a/entity/WorkflowTask_entity/WorkflowTask_entity.aod
+++ b/entity/WorkflowTask_entity/WorkflowTask_entity.aod
@@ -109,13 +109,33 @@
       <name>TaskTitle_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityActionField>
+      <name>claimTask</name>
+      <title>Claim task</title>
+      <onActionProcess>%aditoprj%/entity/WorkflowTask_entity/entityfields/claimtask/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CLIPBOARD_USER</iconId>
+    </entityActionField>
+    <entityField>
+      <name>ISACTIVE</name>
+      <title>Active</title>
+      <contentType>BOOLEAN</contentType>
+    </entityField>
+    <entityField>
+      <name>CLAIM_TIME</name>
+      <title>Claim date</title>
+      <contentType>DATE</contentType>
+    </entityField>
+    <entityField>
+      <name>PRIORITY</name>
+      <title>Priority</title>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
       <isFilterable v="true" />
-      <isSortable v="true" />
+      <isSortable v="false" />
       <contentProcess>%aditoprj%/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <onUpdate>%aditoprj%/entity/WorkflowTask_entity/recordcontainers/jdito/onUpdate.js</onUpdate>
       <recordFieldMappings>
@@ -175,6 +195,15 @@
         <jDitoRecordFieldMapping>
           <name>TARGET_ID.displayValue</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>CLAIM_TIME.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ISACTIVE.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>PRIORITY.value</name>
+        </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/WorkflowTask_entity/entityfields/claimtask/onActionProcess.js b/entity/WorkflowTask_entity/entityfields/claimtask/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c7efdb62d29832c9280837e42b5d03e72c47f33a
--- /dev/null
+++ b/entity/WorkflowTask_entity/entityfields/claimtask/onActionProcess.js
@@ -0,0 +1,5 @@
+import("Employee_lib");
+import("system.vars");
+import("system.workflow");
+
+workflow.claimTask(vars.get("$field.UID"), EmployeeUtils.getCurrentUserId());
\ No newline at end of file
diff --git a/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js b/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js
index 9005006abf7ec25a907adc49073eac84509848be..60769b4b453cfa5ca56d8affa0db09a9337ec809 100644
--- a/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js
@@ -36,7 +36,7 @@ result.object((function ()
         {
             //This can happen if the task is done, then it can't be loaded. If that's the case, return a dummy row
             var taskTitle = vars.exists("$param.TaskTitle_param") && vars.get("$param.TaskTitle_param") || "";
-            return [[taskId, translate.text("Task done"), taskTitle, "", vars.get("$sys.date"), "", "", "", "", "", "", "", "", "", "", "", ""]];
+            return [[taskId, translate.text("Task done"), taskTitle, "", vars.get("$sys.date"), "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]];
         }
     }
     else 
@@ -72,7 +72,10 @@ result.object((function ()
             task.owner || "",
             variables.targetContext || "",
             variables.targetId || "",
-            targetTitle
+            targetTitle,
+            task.claimTime,
+            task.active,
+            task.priority
         ];
     });
 
diff --git a/neonContext/WorkflowSignal/WorkflowSignal.aod b/neonContext/WorkflowSignal/WorkflowSignal.aod
new file mode 100644
index 0000000000000000000000000000000000000000..af6b238d6feb60c6467deb3b70de3624cb81ce94
--- /dev/null
+++ b/neonContext/WorkflowSignal/WorkflowSignal.aod
@@ -0,0 +1,23 @@
+<?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.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1">
+  <name>WorkflowSignal</name>
+  <title>Workflow signal</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterView>WorkflowSignalFilter_view</filterView>
+  <editView>WorkflowSignalEdit_view</editView>
+  <entity>WorkflowSignal_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>5dd8a1ec-6279-4f85-ae49-d3d82a62d1dc</name>
+      <view>WorkflowSignalFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>0709bd97-560a-4a01-8e26-2993388956f3</name>
+      <view>WorkflowSignalEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>9395ba99-8725-43f4-998b-9865916f9a0f</name>
+      <view>WorkflowSignalPreview_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod b/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod
index 8db78b1723af1159e1c454f188856b8e97f44adc..20311ee8d908f6844f16cf562f4fbe80e56f9dea 100644
--- a/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod
+++ b/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod
@@ -34,5 +34,10 @@
       <entityField>StartConfigs</entityField>
       <view>WorkflowStartConfigFilter_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>1a6329e9-8992-482b-82b6-fd01e09c6be1</name>
+      <entityField>Signals</entityField>
+      <view>WorkflowSignalFilter_view</view>
+    </neonViewReference>
   </children>
 </neonView>
diff --git a/neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod b/neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..485a890ce1c763062bc1443dd81d95d7c391a63a
--- /dev/null
+++ b/neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod
@@ -0,0 +1,36 @@
+<?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.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.4">
+  <name>WorkflowSignalEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <isSmall v="true" />
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Generic</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>937b8a52-58ab-49d3-80c7-ea98310632dd</name>
+          <entityField>SIGNAL_NAME</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>eb71448c-b176-4b12-a4d7-a46e2f242020</name>
+          <entityField>OBJECT_TYPE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>bc88a7a6-6843-40c0-86ad-265424e98fb1</name>
+          <entityField>TRIGGER_EVENT</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>648536a5-2327-433e-8867-a3d60a0f8787</name>
+          <entityField>OBJECT_CONDITION</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod b/neonView/WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..9e428d07362f6fa787f295ad8e35c82cdd2e1d45
--- /dev/null
+++ b/neonView/WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod
@@ -0,0 +1,31 @@
+<?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.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.4">
+  <name>WorkflowSignalFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>Table</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>80fa7f03-9064-42f2-95bd-bebc23ca3e62</name>
+          <entityField>SIGNAL_NAME</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>44a02634-1b88-49e8-8125-5bc22e31683d</name>
+          <entityField>OBJECT_TYPE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>c23ed9c6-7baa-4742-ba1e-d771f98167d5</name>
+          <entityField>TRIGGER_EVENT</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod b/neonView/WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..2b648167cc55f5892350e33645fec4ca4c398bf5
--- /dev/null
+++ b/neonView/WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod
@@ -0,0 +1,10 @@
+<?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.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.4">
+  <name>WorkflowSignalPreview_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <headerFooterLayout>
+      <name>layout</name>
+    </headerFooterLayout>
+  </layout>
+</neonView>
diff --git a/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod b/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod
index e8c0235a6fb352faced599759b553d81eb055eec..661e81ca14968a258618510742be351d5ba1bb80 100644
--- a/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod
+++ b/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod
@@ -47,6 +47,18 @@
           <name>63697864-5b0b-471f-89fc-60621fecbaec</name>
           <entityField>TARGET_ID</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>232670b6-4923-4e8d-bfa0-8720e57e932a</name>
+          <entityField>ISACTIVE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>d193bea1-a470-4403-bce7-446e3b398540</name>
+          <entityField>PRIORITY</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>f93aeea0-7881-4284-957a-f4a300cdeeef</name>
+          <entityField>OWNER</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
   </children>
diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js
index f70649273f22841c2b5f0fa804970b9393658a53..26d5997206feb96007911d3068aa687a14bf9628 100644
--- a/process/Context_lib/process.js
+++ b/process/Context_lib/process.js
@@ -80,6 +80,8 @@ ContextUtils.getIcon = function(pContextId)
  */
 ContextUtils.getEntity = function (pContextId)
 {
+    if (!pContextId)
+        return null;
     return project.getContextStructure(pContextId).entity;
 }
 
diff --git a/process/Workflow_lib/process.js b/process/Workflow_lib/process.js
index ba2ff373f770cb2e8159d344f35454d95b6afa61..eb23aed65f9b39702e76122a183879550acc92d2 100644
--- a/process/Workflow_lib/process.js
+++ b/process/Workflow_lib/process.js
@@ -87,9 +87,12 @@ WorkflowUtils.appendMandatoryVariables = function (pVariables, pTargetId, pTarge
  */
 WorkflowUtils.engineIsEnabled = function ()
 {
-    return project.getInstanceConfigValue("workflowEngineEnabled", "false") == "true";
+    return String(project.getInstanceConfigValue("workflowEngineEnabled", "false")) == "true";
 }
 
+/**
+ * obsolete
+ */
 function WorkflowStarter () {}
 
 WorkflowStarter.TRIGGER_INSERT = function ()
@@ -133,3 +136,115 @@ WorkflowStarter._startProcessByAction = function (pAction, pVariables, pTargetId
         } catch (err) {}
     });
 }
+
+function WorkflowSignalSender () {}
+
+WorkflowSignalSender.EVENT_INSERT = function ()
+{
+    return $KeywordRegistry.workflowTrigger$create();
+}
+
+WorkflowSignalSender.EVENT_UPDATE = function ()
+{
+    return $KeywordRegistry.workflowTrigger$update();
+}
+
+WorkflowSignalSender.EVENT_DELETE = function ()
+{
+    return $KeywordRegistry.workflowTrigger$delete();
+}
+
+WorkflowSignalSender.markInserted = function (pTargetId, pTargetContext)
+{
+    WorkflowSignalSender._addToQueue(WorkflowSignalSender.EVENT_INSERT(), pTargetId, pTargetContext);
+}
+
+WorkflowSignalSender.markUpdated = function (pTargetId, pTargetContext)
+{
+    WorkflowSignalSender._addToQueue(WorkflowSignalSender.EVENT_UPDATE(), pTargetId, pTargetContext);
+}
+
+WorkflowSignalSender._QUEUE_VARNAME = function ()
+{
+    return "$context.workflowSignalQueue";
+}
+
+WorkflowSignalSender._addToQueue = function (pAction, pTargetId, pTargetContext)
+{
+    var contextVar = WorkflowSignalSender._QUEUE_VARNAME();
+    var queue = [];
+    if (vars.exists(contextVar) && vars.get(contextVar))
+        queue = vars.get(contextVar);
+    
+    queue.push([pAction, pTargetId, pTargetContext]);
+    vars.set(contextVar, queue);
+}
+
+WorkflowSignalSender.doInsertedOrUpdated = function ()
+{
+    var contextVar = WorkflowSignalSender._QUEUE_VARNAME();
+    if (vars.exists(contextVar) && vars.get(contextVar))
+    {
+        vars.get(contextVar).forEach(function (action)
+        {
+            WorkflowSignalSender.actionPerformed.apply(null, action);
+        });
+        vars.set(contextVar, null);
+    }
+}
+
+WorkflowSignalSender.deleted = function (pTargetId, pTargetContext)
+{
+    WorkflowSignalSender.actionPerformed(WorkflowSignalSender.EVENT_DELETE(), pTargetId, pTargetContext);
+}
+
+WorkflowSignalSender.actionPerformed = function (pAction, pTargetId, pTargetContext)
+{
+    if (!pTargetId)
+        pTargetId = vars.get("$sys.uid");
+    if (!pTargetContext)
+        pTargetContext = ContextUtils.getCurrentContextId();
+    
+    var signals = WorkflowSignalSender.getSignalConfig(pTargetContext, pAction);
+    signals.forEach(function (signal)
+    {
+        if (_checkCondition(signal.entity, pTargetId, signal.condition))
+            workflow.signalEventReceived(signal.name);
+    });
+    
+    function _checkCondition (pEntity, pUid, pCondition)
+    {
+        if (!pCondition)
+            return true;
+        
+        var loadConfig = entities.createConfigForLoadingRows()
+            .entity(pEntity)
+            .uid(pUid)
+            .filter(JSON.stringify(pCondition));
+        
+        return entities.getRowCount(loadConfig) > 0;
+    }
+}
+
+WorkflowSignalSender.getSignalConfig = function (pContext, pAction)
+{
+    var entity = ContextUtils.getEntity(pContext);
+    var signals = newSelect("SIGNAL_NAME, OBJECT_CONDITION")
+        .from("WORKFLOWSIGNAL")
+        .where("WORKFLOWSIGNAL.OBJECT_TYPE", pContext)
+        .and("WORKFLOWSIGNAL.TRIGGER_EVENT", pAction)
+        .table();
+    
+    return signals.map(function (signal)
+    {
+        var condition = signal[1]
+            ? JSON.parse(signal[1]).filter
+            : null;
+            
+        return {
+            name : signal[0],
+            entity : entity,
+            condition : condition
+        };
+    });
+}
\ No newline at end of file