This is an automated email from the ASF dual-hosted git repository.

egonzalez pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git


The following commit(s) were added to refs/heads/main by this push:
     new 833a42e65f [incubator-kie-issues-1306] Exclusive gateway v7 port 
(#3551)
833a42e65f is described below

commit 833a42e65f58ba246803d971b91343ac2241e724
Author: Enrique <[email protected]>
AuthorDate: Mon Jul 29 14:13:18 2024 +0200

    [incubator-kie-issues-1306] Exclusive gateway v7 port (#3551)
---
 .../org/jbpm/bpmn2/xml/AdHocSubProcessHandler.java |   5 +-
 .../java/org/jbpm/bpmn2/xml/ProcessHandler.java    |  10 +-
 .../java/org/jbpm/bpmn2/xml/SubProcessHandler.java |  17 +-
 .../java/org/jbpm/compiler/ProcessBuilderImpl.java |   2 +-
 .../canonical/AbstractCompositeNodeVisitor.java    |   5 +-
 .../compiler/canonical/AbstractNodeVisitor.java    |  62 +++++++
 .../jbpm/compiler/canonical/ActionNodeVisitor.java |   4 +
 .../canonical/BoundaryEventNodeVisitor.java        |   4 +
 .../compiler/canonical/CatchLinkNodeVisitor.java   |   4 +
 .../canonical/CompositeContextNodeVisitor.java     |   5 +-
 .../compiler/canonical/DynamicNodeVisitor.java     |   5 +-
 .../jbpm/compiler/canonical/EndNodeVisitor.java    |   4 +
 .../jbpm/compiler/canonical/EventNodeVisitor.java  |   4 +
 .../canonical/EventSubProcessNodeVisitor.java      |   5 +-
 .../jbpm/compiler/canonical/FaultNodeVisitor.java  |   4 +
 .../compiler/canonical/ForEachNodeVisitor.java     |  11 +-
 .../jbpm/compiler/canonical/JoinNodeVisitor.java   |   4 +
 .../canonical/LambdaSubProcessNodeVisitor.java     |   4 +
 .../compiler/canonical/MilestoneNodeVisitor.java   |   4 +
 .../compiler/canonical/RuleSetNodeVisitor.java     |  11 +-
 .../jbpm/compiler/canonical/SplitNodeVisitor.java  |  55 +-----
 .../jbpm/compiler/canonical/StartNodeVisitor.java  |   5 +-
 .../jbpm/compiler/canonical/StateNodeVisitor.java  |  43 +----
 .../compiler/canonical/ThrowLinkNodeVisitor.java   |   4 +
 .../jbpm/compiler/canonical/TimerNodeVisitor.java  |   4 +
 .../compiler/canonical/WorkItemNodeVisitor.java    |   6 +-
 .../canonical/node/ActionNodeVisitorBuilder.java   |   2 +-
 .../node/BoundaryEventNodeVisitorBuilder.java      |   2 +-
 .../node/CatchLinkNodeVisitorBuilder.java          |   2 +-
 .../node/CompositeContextNodeVisitorBuilder.java   |   2 +-
 .../canonical/node/DynamicNodeVisitorBuilder.java  |   2 +-
 .../canonical/node/EndNodeVisitorBuilder.java      |   2 +-
 .../canonical/node/EventNodeVisitorBuilder.java    |   2 +-
 .../node/EventSubProcessNodeVisitorBuilder.java    |   2 +-
 .../canonical/node/FaultNodeVisitorBuilder.java    |   2 +-
 .../canonical/node/ForEachNodeVisitorBuilder.java  |   3 +-
 .../canonical/node/JoinNodeVisitorBuilder.java     |   2 +-
 .../node/MilestoneNodeVisitorBuilder.java          |   2 +-
 .../canonical/node/SplitNodeVisitorBuilder.java    |   3 +-
 .../canonical/node/StartNodeVisitorBuilder.java    |   4 +-
 .../canonical/node/StateNodeVisitorBuilder.java    |   2 +-
 .../node/SubProcessNodeVisitorBuilder.java         |   2 +-
 .../node/ThrowLinkNodeVisitorBuilder.java          |   2 +-
 .../canonical/node/TimerNodeVisitorBuilder.java    |   2 +-
 .../org/jbpm/ruleflow/core/RuleFlowProcess.java    |   2 +
 .../jbpm/ruleflow/core/factory/NodeFactory.java    |  22 ++-
 .../jbpm/ruleflow/core/factory/SplitFactory.java   |  23 ---
 .../java/org/jbpm/workflow/core/impl/NodeImpl.java |   4 +-
 .../org/jbpm/workflow/core/node/ActionNode.java    |   4 +-
 .../java/org/jbpm/workflow/core/node/EndNode.java  |   2 +-
 .../org/jbpm/workflow/core/node/EventNode.java     |   4 +-
 .../org/jbpm/workflow/core/node/MilestoneNode.java |   4 +-
 .../org/jbpm/workflow/core/node/RuleSetNode.java   |   4 +-
 .../java/org/jbpm/workflow/core/node/Split.java    |   2 +-
 .../org/jbpm/workflow/core/node/StartNode.java     |   2 +-
 .../jbpm/workflow/core/node/SubProcessNode.java    |   4 +-
 .../org/jbpm/workflow/core/node/TimerNode.java     |   4 +-
 .../org/jbpm/workflow/core/node/WorkItemNode.java  |   4 +-
 .../workflow/instance/impl/NodeInstanceImpl.java   |   2 +-
 .../instance/node/ForEachNodeInstance.java         |   2 +-
 .../jbpm/bpmn2/event}/BPMN2-ConditionalStart.bpmn2 |   8 +-
 .../BPMN2-ConditionalFlowWithoutGateway.bpmn2      |  14 +-
 ...2-ExclusiveGatewayWithNoConditionsDefined.bpmn2 |   2 +-
 .../bpmn2/flow}/BPMN2-ExclusiveSplitDefault.bpmn2  |   0
 .../BPMN2-ExclusiveSplitDefaultNoCondition.bpmn2   |   2 +-
 .../bpmn2/flow}/BPMN2-ExclusiveSplitXPath.bpmn2    |   0
 .../flow/BPMN2-ExclusiveSplitXPathAdvanced.bpmn2}  |   2 +-
 ...clusiveSplitXPathAdvancedVarsNotSignaled.bpmn2} |   2 +-
 ...PMN2-ExclusiveSplitXPathAdvancedWithVars.bpmn2} |   2 +-
 .../BPMN2-GatewaySplitSequenceConditions.bpmn2}    |   2 +-
 .../org/jbpm/bpmn2/flow/BPMN2-GatewayTest.bpmn2}   |   8 +-
 .../bpmn2/flow}/BPMN2-InclusiveSplitDefault.bpmn2  |   0
 .../test/java/org/jbpm/bpmn2/CompilationTest.java  |   2 +-
 .../src/test/java/org/jbpm/bpmn2/FlowTest.java     | 189 +++++++++++++--------
 .../org/jbpm/bpmn2/StandaloneBPMNProcessTest.java  |  22 ---
 .../test/java/org/jbpm/bpmn2/StartEventTest.java   |  29 +++-
 .../BPMN2-ConditionalFlowWithoutGateway.bpmn2      |  14 +-
 77 files changed, 397 insertions(+), 321 deletions(-)

diff --git 
a/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/xml/AdHocSubProcessHandler.java 
b/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/xml/AdHocSubProcessHandler.java
index 89a24f9513..764268219f 100755
--- 
a/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/xml/AdHocSubProcessHandler.java
+++ 
b/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/xml/AdHocSubProcessHandler.java
@@ -23,7 +23,9 @@ import java.util.List;
 
 import org.jbpm.bpmn2.core.SequenceFlow;
 import org.jbpm.compiler.xml.Parser;
+import org.jbpm.compiler.xml.ProcessBuildData;
 import org.jbpm.process.core.context.variable.VariableScope;
+import org.jbpm.ruleflow.core.RuleFlowProcess;
 import org.jbpm.workflow.core.Node;
 import org.jbpm.workflow.core.node.DynamicNode;
 import org.w3c.dom.Element;
@@ -87,8 +89,9 @@ public class AdHocSubProcessHandler extends 
CompositeContextNodeHandler {
             }
             xmlNode = xmlNode.getNextSibling();
         }
+        RuleFlowProcess process = (RuleFlowProcess) ((ProcessBuildData) 
parser.getData()).getMetaData(ProcessHandler.CURRENT_PROCESS);
         List<SequenceFlow> connections = (List<SequenceFlow>) 
dynamicNode.getMetaData(ProcessHandler.CONNECTIONS);
-        ProcessHandler.linkConnections(dynamicNode, connections);
+        ProcessHandler.linkConnections(process, dynamicNode, connections);
         ProcessHandler.linkBoundaryEvents(dynamicNode);
 
         handleScript(dynamicNode, element, "onEntry");
diff --git 
a/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/xml/ProcessHandler.java 
b/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/xml/ProcessHandler.java
index 210a59d223..644f9fe25a 100755
--- a/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/xml/ProcessHandler.java
+++ b/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/xml/ProcessHandler.java
@@ -208,7 +208,7 @@ public class ProcessHandler extends BaseAbstractHandler 
implements Handler {
         linkIntermediateLinks(process, throwLinks);
 
         List<SequenceFlow> connections = (List<SequenceFlow>) 
process.getMetaData(CONNECTIONS);
-        linkConnections(process, connections);
+        linkConnections(process, process, connections);
         linkBoundaryEvents(process);
 
         // This must be done *after* linkConnections(process, connections)
@@ -384,7 +384,7 @@ public class ProcessHandler extends BaseAbstractHandler 
implements Handler {
         return RuleFlowProcess.class;
     }
 
-    public static void linkConnections(NodeContainer nodeContainer, 
List<SequenceFlow> connections) {
+    public static void linkConnections(RuleFlowProcess process, NodeContainer 
nodeContainer, List<SequenceFlow> connections) {
         if (connections != null) {
             for (SequenceFlow connection : connections) {
                 String sourceRef = connection.getSourceRef();
@@ -412,16 +412,14 @@ public class ProcessHandler extends BaseAbstractHandler 
implements Handler {
                 result.setMetaData("bendpoints", connection.getBendpoints());
                 result.setMetaData(Metadata.UNIQUE_ID, connection.getId());
 
-                if 
("true".equals(System.getProperty("jbpm.enable.multi.con"))) {
-                    NodeImpl nodeImpl = (NodeImpl) source;
+                if (source instanceof NodeImpl nodeImpl && 
Boolean.parseBoolean((String) 
process.getMetaData().get("jbpm.enable.multi.con"))) {
                     Constraint constraint = buildConstraint(connection, 
nodeImpl);
                     if (constraint != null) {
                         nodeImpl.addConstraint(new 
ConnectionRef(connection.getId(), target.getId(), 
org.jbpm.workflow.core.Node.CONNECTION_DEFAULT_TYPE),
                                 constraint);
                     }
 
-                } else if (source instanceof Split) {
-                    Split split = (Split) source;
+                } else if (source instanceof Split split) {
                     Constraint constraint = buildConstraint(connection, split);
                     split.addConstraint(
                             new ConnectionRef(connection.getId(), 
target.getId(), org.jbpm.workflow.core.Node.CONNECTION_DEFAULT_TYPE),
diff --git 
a/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/xml/SubProcessHandler.java 
b/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/xml/SubProcessHandler.java
index 41b60eba2a..4dd14dcb48 100755
--- a/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/xml/SubProcessHandler.java
+++ b/jbpm/jbpm-bpmn2/src/main/java/org/jbpm/bpmn2/xml/SubProcessHandler.java
@@ -25,7 +25,9 @@ import org.jbpm.bpmn2.core.Definitions;
 import org.jbpm.bpmn2.core.IntermediateLink;
 import org.jbpm.bpmn2.core.SequenceFlow;
 import org.jbpm.compiler.xml.Parser;
+import org.jbpm.compiler.xml.ProcessBuildData;
 import org.jbpm.process.core.context.variable.VariableScope;
+import org.jbpm.ruleflow.core.RuleFlowProcess;
 import org.jbpm.workflow.core.Node;
 import org.jbpm.workflow.core.NodeContainer;
 import org.jbpm.workflow.core.node.CompositeContextNode;
@@ -74,6 +76,7 @@ public class SubProcessHandler extends AbstractNodeHandler {
         compositeNode.setIoSpecification(readIOEspecification(parser, 
element));
         
compositeNode.setMultiInstanceSpecification(readMultiInstanceSpecification(parser,
 element, compositeNode.getIoSpecification()));
 
+        NodeContainer nodeContainer = (NodeContainer) parser.getParent();
         Node outcome = compositeNode;
         if 
(compositeNode.getMultiInstanceSpecification().hasMultiInstanceInput()) {
             ForEachNode forEachNode = (ForEachNode) 
decorateMultiInstanceSpecificationSubProcess(compositeNode, 
compositeNode.getMultiInstanceSpecification());
@@ -81,8 +84,9 @@ public class SubProcessHandler extends AbstractNodeHandler {
             handleScript(forEachNode, element, "onEntry");
             handleScript(forEachNode, element, "onExit");
 
+            RuleFlowProcess process = (RuleFlowProcess) ((ProcessBuildData) 
parser.getData()).getMetaData(ProcessHandler.CURRENT_PROCESS);
             List<SequenceFlow> connections = (List<SequenceFlow>) 
forEachNode.getMetaData(ProcessHandler.CONNECTIONS);
-            ProcessHandler.linkConnections(forEachNode, connections);
+            ProcessHandler.linkConnections(process, forEachNode, connections);
             ProcessHandler.linkBoundaryEvents(forEachNode);
 
             // This must be done *after* linkConnections(process, connections)
@@ -91,22 +95,23 @@ public class SubProcessHandler extends AbstractNodeHandler {
             ProcessHandler.linkAssociations((Definitions) 
forEachNode.getMetaData("Definitions"), forEachNode, associations);
             applyAsync(node, Boolean.parseBoolean((String) 
compositeNode.getMetaData().get("customAsync")));
             outcome = forEachNode;
+            nodeContainer.addNode(outcome);
         } else {
-            handleCompositeContextNode(compositeNode);
+            nodeContainer.addNode(outcome);
+            RuleFlowProcess process = (RuleFlowProcess) ((ProcessBuildData) 
parser.getData()).getMetaData(ProcessHandler.CURRENT_PROCESS);
+            handleCompositeContextNode(process, compositeNode);
         }
-        NodeContainer nodeContainer = (NodeContainer) parser.getParent();
-        nodeContainer.addNode(outcome);
 
         return outcome;
     }
 
-    protected void handleCompositeContextNode(CompositeContextNode 
compositeNode) throws SAXException {
+    protected void handleCompositeContextNode(RuleFlowProcess process, 
CompositeContextNode compositeNode) throws SAXException {
         List<SequenceFlow> connections = (List<SequenceFlow>) 
compositeNode.getMetaData(ProcessHandler.CONNECTIONS);
 
         List<IntermediateLink> throwLinks = (List<IntermediateLink>) 
compositeNode.getMetaData(ProcessHandler.LINKS);
         ProcessHandler.linkIntermediateLinks(compositeNode, throwLinks);
 
-        ProcessHandler.linkConnections(compositeNode, connections);
+        ProcessHandler.linkConnections(process, compositeNode, connections);
         ProcessHandler.linkBoundaryEvents(compositeNode);
 
         // This must be done *after* linkConnections(process, connections)
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/ProcessBuilderImpl.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/ProcessBuilderImpl.java
index 77e6a2c39f..f711e30163 100755
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/ProcessBuilderImpl.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/ProcessBuilderImpl.java
@@ -252,7 +252,7 @@ public class ProcessBuilderImpl implements 
org.drools.compiler.compiler.ProcessB
                         context);
             }
 
-            if ("true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+            if (Boolean.parseBoolean((String) ((NodeImpl) 
node).getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
                 builder = 
ProcessNodeBuilderRegistry.INSTANCE.getNodeBuilder(NodeImpl.class);
                 if (builder != null) {
                     builder.build(process, processDescr, context, node);
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/AbstractCompositeNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/AbstractCompositeNodeVisitor.java
index b9143a9d76..fd7b95c445 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/AbstractCompositeNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/AbstractCompositeNodeVisitor.java
@@ -29,8 +29,9 @@ public abstract class AbstractCompositeNodeVisitor<T extends 
CompositeContextNod
 
     protected NodeVisitorBuilderService nodevisitorService;
 
-    public AbstractCompositeNodeVisitor(NodeVisitorBuilderService 
nodevisitorService) {
-        this.nodevisitorService = nodevisitorService;
+    public AbstractCompositeNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
+        this.nodevisitorService = new NodeVisitorBuilderService(classLoader);
     }
 
     protected <U extends Node> void visitNodes(String factoryField, U[] nodes, 
BlockStmt body, VariableScope variableScope, ProcessMetaData metadata) {
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/AbstractNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/AbstractNodeVisitor.java
index 1b21e056e7..a8ce5a76b8 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/AbstractNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/AbstractNodeVisitor.java
@@ -19,7 +19,9 @@
 package org.jbpm.compiler.canonical;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
@@ -33,13 +35,17 @@ import org.jbpm.process.core.context.variable.Mappable;
 import org.jbpm.process.core.context.variable.Variable;
 import org.jbpm.process.core.context.variable.VariableScope;
 import org.jbpm.process.core.datatype.DataTypeResolver;
+import org.jbpm.process.instance.impl.ReturnValueConstraintEvaluator;
+import org.jbpm.process.instance.impl.ReturnValueEvaluator;
 import org.jbpm.process.instance.impl.actions.HandleEscalationAction;
 import org.jbpm.process.instance.impl.actions.ProduceEventAction;
 import org.jbpm.process.instance.impl.actions.SignalProcessInstanceAction;
 import org.jbpm.ruleflow.core.Metadata;
 import org.jbpm.ruleflow.core.factory.MappableNodeFactory;
 import org.jbpm.util.JbpmClassLoaderUtil;
+import org.jbpm.workflow.core.Constraint;
 import org.jbpm.workflow.core.impl.ConnectionImpl;
+import org.jbpm.workflow.core.impl.ConnectionRef;
 import org.jbpm.workflow.core.impl.DataAssociation;
 import org.jbpm.workflow.core.impl.DataAssociation.DataAssociationType;
 import org.jbpm.workflow.core.impl.DataDefinition;
@@ -57,10 +63,12 @@ import com.github.javaparser.StaticJavaParser;
 import com.github.javaparser.ast.NodeList;
 import com.github.javaparser.ast.body.Parameter;
 import com.github.javaparser.ast.expr.AssignExpr;
+import com.github.javaparser.ast.expr.BooleanLiteralExpr;
 import com.github.javaparser.ast.expr.CastExpr;
 import com.github.javaparser.ast.expr.ClassExpr;
 import com.github.javaparser.ast.expr.EnclosedExpr;
 import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.IntegerLiteralExpr;
 import com.github.javaparser.ast.expr.LambdaExpr;
 import com.github.javaparser.ast.expr.MethodCallExpr;
 import com.github.javaparser.ast.expr.NameExpr;
@@ -82,6 +90,7 @@ import static java.util.Collections.singletonList;
 import static org.drools.util.StringUtils.ucFirst;
 import static org.jbpm.ruleflow.core.Metadata.CUSTOM_AUTO_START;
 import static org.jbpm.ruleflow.core.Metadata.HIDDEN;
+import static org.jbpm.ruleflow.core.factory.NodeFactory.METHOD_CONSTRAINT;
 import static org.jbpm.ruleflow.core.factory.NodeFactory.METHOD_DONE;
 import static org.jbpm.ruleflow.core.factory.NodeFactory.METHOD_NAME;
 import static org.kie.kogito.internal.utils.ConversionUtils.sanitizeString;
@@ -90,6 +99,22 @@ public abstract class AbstractNodeVisitor<T extends Node> 
extends AbstractVisito
 
     protected abstract String getNodeKey();
 
+    private ReturnValueEvaluatorBuilderService 
returnValueEvaluatorBuilderService;
+    private ClassLoader classLoader;
+
+    public AbstractNodeVisitor(ClassLoader classLoader) {
+        this.classLoader = classLoader;
+        this.returnValueEvaluatorBuilderService = 
ReturnValueEvaluatorBuilderService.instance(classLoader);
+    }
+
+    public ClassLoader getClassLoader() {
+        return classLoader;
+    }
+
+    public ReturnValueEvaluatorBuilderService 
getReturnValueEvaluatorBuilderService() {
+        return returnValueEvaluatorBuilderService;
+    }
+
     public void visitNode(T node, BlockStmt body, VariableScope variableScope, 
ProcessMetaData metadata) {
         visitNode(FACTORY_FIELD_NAME, node, body, variableScope, metadata);
         if (isAdHocNode(node) && !(node instanceof HumanTaskNode)) {
@@ -100,6 +125,8 @@ public abstract class AbstractNodeVisitor<T extends Node> 
extends AbstractVisito
             addScript(extendedNodeImpl, body, ON_ACTION_SCRIPT_METHOD, 
ExtendedNodeImpl.EVENT_NODE_ENTER);
             addScript(extendedNodeImpl, body, ON_ACTION_SCRIPT_METHOD, 
ExtendedNodeImpl.EVENT_NODE_EXIT);
         }
+
+        addConstraints(node, returnValueEvaluatorBuilderService, body);
     }
 
     private void addScript(ExtendedNodeImpl extendedNodeImpl, BlockStmt body, 
String factoryMethod, String actionType) {
@@ -123,6 +150,41 @@ public abstract class AbstractNodeVisitor<T extends Node> 
extends AbstractVisito
         }
     }
 
+    public void addConstraints(T currentNode, 
ReturnValueEvaluatorBuilderService returnValueEvaluatorBuilderService, 
BlockStmt body) {
+        NodeImpl node = (NodeImpl) currentNode;
+        for (Map.Entry<ConnectionRef, Collection<Constraint>> entry : 
node.getConstraints().entrySet()) {
+            if (entry.getValue() == null || entry.getValue().isEmpty()) {
+                continue;
+            }
+
+            for (Constraint constraint : 
entry.getValue().stream().filter(Predicate.not(Objects::isNull)).toList()) {
+                Expression returnValueEvaluator;
+                if (constraint instanceof ReturnValueConstraintEvaluator 
returnValueConstraintEvaluator) {
+                    ReturnValueEvaluator evaluator = 
returnValueConstraintEvaluator.getReturnValueEvaluator();
+                    returnValueEvaluator = 
returnValueEvaluatorBuilderService.build(node,
+                            evaluator.dialect(),
+                            evaluator.expression(),
+                            evaluator.type(),
+                            evaluator.root());
+
+                } else {
+                    returnValueEvaluator = 
returnValueEvaluatorBuilderService.build(node,
+                            constraint.getDialect(),
+                            constraint.getConstraint());
+                }
+                body.addStatement(getFactoryMethod(getNodeId(currentNode), 
METHOD_CONSTRAINT,
+                        
getWorkflowElementConstructor(entry.getKey().getNodeId()),
+                        new 
StringLiteralExpr(getOrDefault(entry.getKey().getConnectionId(), "")),
+                        new StringLiteralExpr(entry.getKey().getToType()),
+                        new StringLiteralExpr(constraint.getDialect()),
+                        returnValueEvaluator,
+                        new IntegerLiteralExpr(constraint.getPriority()),
+                        new BooleanLiteralExpr(constraint.isDefault())));
+
+            }
+        }
+    }
+
     private Expression buildDroolsConsequenceAction(ExtendedNodeImpl 
extendedNodeImpl, String dialect, String script) {
         if (script == null) {
             return new NullLiteralExpr();
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ActionNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ActionNodeVisitor.java
index 415f67b873..0028588d28 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ActionNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ActionNodeVisitor.java
@@ -55,6 +55,10 @@ public class ActionNodeVisitor extends 
AbstractNodeVisitor<ActionNode> {
 
     private static final String INTERMEDIATE_COMPENSATION_TYPE = 
"IntermediateThrowEvent-None";
 
+    public ActionNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
+    }
+
     @Override
     protected String getNodeKey() {
         return "actionNode";
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/BoundaryEventNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/BoundaryEventNodeVisitor.java
index ab0051d501..e15c223ce0 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/BoundaryEventNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/BoundaryEventNodeVisitor.java
@@ -39,6 +39,10 @@ import static 
org.jbpm.ruleflow.core.factory.EventNodeFactory.METHOD_VARIABLE_NA
 
 public class BoundaryEventNodeVisitor extends 
AbstractNodeVisitor<BoundaryEventNode> {
 
+    public BoundaryEventNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
+    }
+
     @Override
     protected String getNodeKey() {
         return "boundaryEventNode";
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/CatchLinkNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/CatchLinkNodeVisitor.java
index 04b521c972..aa0d406e35 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/CatchLinkNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/CatchLinkNodeVisitor.java
@@ -26,6 +26,10 @@ import com.github.javaparser.ast.stmt.BlockStmt;
 
 public class CatchLinkNodeVisitor extends AbstractNodeVisitor<CatchLinkNode> {
 
+    public CatchLinkNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
+    }
+
     @Override
     protected String getNodeKey() {
         return "catchLinkNode";
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/CompositeContextNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/CompositeContextNodeVisitor.java
index 7bb9c149d8..9449db2e86 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/CompositeContextNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/CompositeContextNodeVisitor.java
@@ -21,7 +21,6 @@ package org.jbpm.compiler.canonical;
 import java.util.HashSet;
 import java.util.stream.Stream;
 
-import org.jbpm.compiler.canonical.node.NodeVisitorBuilderService;
 import org.jbpm.process.core.context.variable.VariableScope;
 import org.jbpm.ruleflow.core.factory.CompositeContextNodeFactory;
 import org.jbpm.workflow.core.node.CompositeContextNode;
@@ -33,8 +32,8 @@ import com.github.javaparser.ast.stmt.BlockStmt;
 
 public class CompositeContextNodeVisitor<T extends CompositeContextNode> 
extends AbstractCompositeNodeVisitor<T> {
 
-    public CompositeContextNodeVisitor(NodeVisitorBuilderService 
nodeVisitorService) {
-        super(nodeVisitorService);
+    public CompositeContextNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
     }
 
     @Override
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/DynamicNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/DynamicNodeVisitor.java
index f2bd31f7b1..3c14fe1ec9 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/DynamicNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/DynamicNodeVisitor.java
@@ -23,7 +23,6 @@ import java.util.Collection;
 import java.util.stream.Stream;
 
 import org.jbpm.compiler.canonical.builtin.ReturnValueEvaluatorBuilderService;
-import org.jbpm.compiler.canonical.node.NodeVisitorBuilderService;
 import org.jbpm.process.core.context.variable.VariableScope;
 import org.jbpm.ruleflow.core.factory.DynamicNodeFactory;
 import org.jbpm.workflow.core.node.DynamicNode;
@@ -38,8 +37,8 @@ public class DynamicNodeVisitor extends 
CompositeContextNodeVisitor<DynamicNode>
 
     private ReturnValueEvaluatorBuilderService builder;
 
-    public DynamicNodeVisitor(NodeVisitorBuilderService nodeVisitorService, 
ClassLoader classLoader) {
-        super(nodeVisitorService);
+    public DynamicNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
         this.builder = 
ReturnValueEvaluatorBuilderService.instance(classLoader);
     }
 
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/EndNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/EndNodeVisitor.java
index 23f4edffed..ba90ac3aca 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/EndNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/EndNodeVisitor.java
@@ -49,6 +49,10 @@ import static 
org.jbpm.ruleflow.core.factory.EndNodeFactory.METHOD_TERMINATE;
 
 public class EndNodeVisitor extends AbstractNodeVisitor<EndNode> {
 
+    public EndNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
+    }
+
     @Override
     protected String getNodeKey() {
         return "endNode";
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/EventNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/EventNodeVisitor.java
index 66051eb049..fb79085ef5 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/EventNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/EventNodeVisitor.java
@@ -37,6 +37,10 @@ import static 
org.jbpm.ruleflow.core.factory.EventNodeFactory.METHOD_VARIABLE_NA
 
 public class EventNodeVisitor extends AbstractNodeVisitor<EventNode> {
 
+    public EventNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
+    }
+
     @Override
     protected String getNodeKey() {
         return "eventNode";
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/EventSubProcessNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/EventSubProcessNodeVisitor.java
index ef9c441e44..5c468afc3c 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/EventSubProcessNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/EventSubProcessNodeVisitor.java
@@ -22,7 +22,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.stream.Stream;
 
-import org.jbpm.compiler.canonical.node.NodeVisitorBuilderService;
 import org.jbpm.process.core.context.variable.VariableScope;
 import org.jbpm.ruleflow.core.factory.EventSubProcessNodeFactory;
 import org.jbpm.workflow.core.node.EventSubProcessNode;
@@ -36,8 +35,8 @@ import static 
org.jbpm.ruleflow.core.factory.EventSubProcessNodeFactory.METHOD_K
 
 public class EventSubProcessNodeVisitor extends 
CompositeContextNodeVisitor<EventSubProcessNode> {
 
-    public EventSubProcessNodeVisitor(NodeVisitorBuilderService 
nodeVisitorService) {
-        super(nodeVisitorService);
+    public EventSubProcessNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
     }
 
     @Override
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/FaultNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/FaultNodeVisitor.java
index e7de77ff57..d78deb1a72 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/FaultNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/FaultNodeVisitor.java
@@ -32,6 +32,10 @@ import static 
org.jbpm.ruleflow.core.factory.FaultNodeFactory.METHOD_TERMINATE_P
 
 public class FaultNodeVisitor extends AbstractNodeVisitor<FaultNode> {
 
+    public FaultNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
+    }
+
     @Override
     protected String getNodeKey() {
         return "faultNode";
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ForEachNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ForEachNodeVisitor.java
index 0a964980d8..35b87f4159 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ForEachNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ForEachNodeVisitor.java
@@ -22,8 +22,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-import org.jbpm.compiler.canonical.builtin.ReturnValueEvaluatorBuilderService;
-import org.jbpm.compiler.canonical.node.NodeVisitorBuilderService;
 import org.jbpm.process.core.context.variable.VariableScope;
 import org.jbpm.ruleflow.core.factory.ForEachNodeFactory;
 import org.jbpm.workflow.core.Node;
@@ -46,11 +44,8 @@ import static 
org.jbpm.ruleflow.core.factory.ForEachNodeFactory.METHOD_SEQUENTIA
 
 public class ForEachNodeVisitor extends 
AbstractCompositeNodeVisitor<ForEachNode> {
 
-    private ReturnValueEvaluatorBuilderService 
returnValueEvaluatorBuilderService;
-
-    public ForEachNodeVisitor(NodeVisitorBuilderService nodeVisitorService, 
ReturnValueEvaluatorBuilderService returnValueEvaluatorBuilderService) {
-        super(nodeVisitorService);
-        this.returnValueEvaluatorBuilderService = 
returnValueEvaluatorBuilderService;
+    public ForEachNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
     }
 
     @Override
@@ -123,7 +118,7 @@ public class ForEachNodeVisitor extends 
AbstractCompositeNodeVisitor<ForEachNode
             String completionConditionDialect = 
node.getCompletionConditionExpression().dialect();
             String completionConditionExpression = 
node.getCompletionConditionExpression().expression();
             body.addStatement(getFactoryMethod(getNodeId(node), 
ForEachNodeFactory.METHOD_COMPLETE_CONDITION,
-                    returnValueEvaluatorBuilderService.build(node, 
completionConditionDialect, completionConditionExpression)));
+                    getReturnValueEvaluatorBuilderService().build(node, 
completionConditionDialect, completionConditionExpression)));
         }
         visitConnections(getNodeId(node), filterNodes.toArray(new 
Node[filterNodes.size()]), body);
 
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/JoinNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/JoinNodeVisitor.java
index c4a6001162..7a9e27df62 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/JoinNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/JoinNodeVisitor.java
@@ -29,6 +29,10 @@ import static 
org.jbpm.ruleflow.core.factory.JoinFactory.METHOD_TYPE;
 
 public class JoinNodeVisitor extends AbstractNodeVisitor<Join> {
 
+    public JoinNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
+    }
+
     @Override
     protected String getNodeKey() {
         return "joinNode";
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/LambdaSubProcessNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/LambdaSubProcessNodeVisitor.java
index 01722cf0e6..f05c4f0591 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/LambdaSubProcessNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/LambdaSubProcessNodeVisitor.java
@@ -61,6 +61,10 @@ import static 
org.jbpm.ruleflow.core.factory.SubProcessNodeFactory.METHOD_WAIT_F
 
 public class LambdaSubProcessNodeVisitor extends 
AbstractNodeVisitor<SubProcessNode> {
 
+    public LambdaSubProcessNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
+    }
+
     @Override
     protected String getNodeKey() {
         return "subProcessNode";
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/MilestoneNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/MilestoneNodeVisitor.java
index edab9d4d1e..d38bd04b2d 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/MilestoneNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/MilestoneNodeVisitor.java
@@ -29,6 +29,10 @@ import static 
org.jbpm.ruleflow.core.factory.MilestoneNodeFactory.METHOD_CONDITI
 
 public class MilestoneNodeVisitor extends AbstractNodeVisitor<MilestoneNode> {
 
+    public MilestoneNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
+    }
+
     @Override
     protected String getNodeKey() {
         return "milestoneNode";
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/RuleSetNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/RuleSetNodeVisitor.java
index 5028ee6b96..dca1632deb 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/RuleSetNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/RuleSetNodeVisitor.java
@@ -64,11 +64,10 @@ public class RuleSetNodeVisitor extends 
AbstractNodeVisitor<RuleSetNode> {
 
     public static final Logger logger = 
LoggerFactory.getLogger(ProcessToExecModelGenerator.class);
 
-    private final ClassLoader contextClassLoader;
     private final AssignableChecker assignableChecker;
 
     public RuleSetNodeVisitor(ClassLoader contextClassLoader) {
-        this.contextClassLoader = contextClassLoader;
+        super(contextClassLoader);
         this.assignableChecker = AssignableChecker.create(contextClassLoader);
     }
 
@@ -144,7 +143,7 @@ public class RuleSetNodeVisitor extends 
AbstractNodeVisitor<RuleSetNode> {
 
     private MethodCallExpr handleRuleUnit(VariableScope variableScope, 
ProcessMetaData metadata, RuleSetNode ruleSetNode, String nodeName, RuleType 
ruleType) {
         String unitName = ruleType.getName();
-        ProcessContextMetaModel processContext = new 
ProcessContextMetaModel(variableScope, contextClassLoader);
+        ProcessContextMetaModel processContext = new 
ProcessContextMetaModel(variableScope, getClassLoader());
         RuleUnitDescription description;
 
         try {
@@ -170,7 +169,7 @@ public class RuleSetNodeVisitor extends 
AbstractNodeVisitor<RuleSetNode> {
     }
 
     private GeneratedRuleUnitDescription generateRuleUnitDescription(String 
unitName, ProcessContextMetaModel processContext) {
-        GeneratedRuleUnitDescription d = new 
GeneratedRuleUnitDescription(unitName, contextClassLoader);
+        GeneratedRuleUnitDescription d = new 
GeneratedRuleUnitDescription(unitName, getClassLoader());
         for (Variable variable : processContext.getVariables()) {
             d.putDatasourceVar(
                     variable.getName(),
@@ -214,7 +213,7 @@ public class RuleSetNodeVisitor extends 
AbstractNodeVisitor<RuleSetNode> {
     private Class<?> loadUnitClass(String unitName, String packageName) throws 
ClassNotFoundException {
         ClassNotFoundException ex;
         try {
-            return contextClassLoader.loadClass(unitName);
+            return getClassLoader().loadClass(unitName);
         } catch (ClassNotFoundException e) {
             ex = e;
         }
@@ -223,7 +222,7 @@ public class RuleSetNodeVisitor extends 
AbstractNodeVisitor<RuleSetNode> {
         }
         // maybe the name is not qualified. Let's try with tacking the 
packageName at the front
         try {
-            return contextClassLoader.loadClass(packageName + "." + unitName);
+            return getClassLoader().loadClass(packageName + "." + unitName);
         } catch (ClassNotFoundException e) {
             // throw the original error
             throw ex;
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/SplitNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/SplitNodeVisitor.java
index de434a17a7..49f3c9b541 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/SplitNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/SplitNodeVisitor.java
@@ -18,35 +18,19 @@
  */
 package org.jbpm.compiler.canonical;
 
-import java.util.Collection;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.function.Predicate;
-
-import org.jbpm.compiler.canonical.builtin.ReturnValueEvaluatorBuilderService;
 import org.jbpm.process.core.context.variable.VariableScope;
-import org.jbpm.process.instance.impl.ReturnValueConstraintEvaluator;
-import org.jbpm.process.instance.impl.ReturnValueEvaluator;
 import org.jbpm.ruleflow.core.factory.SplitFactory;
-import org.jbpm.workflow.core.Constraint;
-import org.jbpm.workflow.core.impl.ConnectionRef;
 import org.jbpm.workflow.core.node.Split;
 
-import com.github.javaparser.ast.expr.BooleanLiteralExpr;
-import com.github.javaparser.ast.expr.Expression;
 import com.github.javaparser.ast.expr.IntegerLiteralExpr;
-import com.github.javaparser.ast.expr.StringLiteralExpr;
 import com.github.javaparser.ast.stmt.BlockStmt;
 
-import static org.jbpm.ruleflow.core.factory.SplitFactory.METHOD_CONSTRAINT;
 import static org.jbpm.ruleflow.core.factory.SplitFactory.METHOD_TYPE;
 
 public class SplitNodeVisitor extends AbstractNodeVisitor<Split> {
 
-    ReturnValueEvaluatorBuilderService returnValueEvaluatorBuilderService;
-
-    public SplitNodeVisitor(ReturnValueEvaluatorBuilderService 
returnValueEvaluatorBuilderService) {
-        this.returnValueEvaluatorBuilderService = 
returnValueEvaluatorBuilderService;
+    public SplitNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
     }
 
     @Override
@@ -61,40 +45,7 @@ public class SplitNodeVisitor extends 
AbstractNodeVisitor<Split> {
                 .addStatement(getFactoryMethod(getNodeId(node), METHOD_TYPE, 
new IntegerLiteralExpr(node.getType())));
 
         visitMetaData(node.getMetaData(), body, getNodeId(node));
-
-        if (node.getType() == Split.TYPE_OR || node.getType() == 
Split.TYPE_XOR) {
-            for (Entry<ConnectionRef, Collection<Constraint>> entry : 
node.getConstraints().entrySet()) {
-                if (entry.getValue() == null || entry.getValue().isEmpty()) {
-                    continue;
-                }
-
-                for (Constraint constraint : 
entry.getValue().stream().filter(Predicate.not(Objects::isNull)).toList()) {
-                    Expression returnValueEvaluator;
-                    if (constraint instanceof ReturnValueConstraintEvaluator) {
-                        ReturnValueEvaluator evaluator = 
((ReturnValueConstraintEvaluator) constraint).getReturnValueEvaluator();
-                        returnValueEvaluator = 
returnValueEvaluatorBuilderService.build(node,
-                                evaluator.dialect(),
-                                evaluator.expression(),
-                                evaluator.type(),
-                                evaluator.root());
-
-                    } else {
-                        returnValueEvaluator = 
returnValueEvaluatorBuilderService.build(node,
-                                constraint.getDialect(),
-                                constraint.getConstraint());
-                    }
-                    body.addStatement(getFactoryMethod(getNodeId(node), 
METHOD_CONSTRAINT,
-                            
getWorkflowElementConstructor(entry.getKey().getNodeId()),
-                            new 
StringLiteralExpr(getOrDefault(entry.getKey().getConnectionId(), "")),
-                            new StringLiteralExpr(entry.getKey().getToType()),
-                            new StringLiteralExpr(constraint.getDialect()),
-                            returnValueEvaluator,
-                            new IntegerLiteralExpr(constraint.getPriority()),
-                            new BooleanLiteralExpr(constraint.isDefault())));
-
-                }
-            }
-        }
+        addConstraints(node, getReturnValueEvaluatorBuilderService(), body);
         body.addStatement(getDoneMethod(getNodeId(node)));
     }
 
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/StartNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/StartNodeVisitor.java
index 20aac43511..42c0ceb3c8 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/StartNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/StartNodeVisitor.java
@@ -48,8 +48,9 @@ public class StartNodeVisitor extends 
AbstractNodeVisitor<StartNode> {
 
     private ReturnValueEvaluatorBuilderService 
returnValueEvaluatorBuilderService;
 
-    public StartNodeVisitor(ReturnValueEvaluatorBuilderService 
returnValueEvaluatorBuilderService) {
-        this.returnValueEvaluatorBuilderService = 
returnValueEvaluatorBuilderService;
+    public StartNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
+        this.returnValueEvaluatorBuilderService = 
ReturnValueEvaluatorBuilderService.instance(classLoader);
     }
 
     @Override
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/StateNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/StateNodeVisitor.java
index c800c3d65f..f3f40325b9 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/StateNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/StateNodeVisitor.java
@@ -18,29 +18,13 @@
  */
 package org.jbpm.compiler.canonical;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Map;
-import java.util.stream.Stream;
-
-import org.jbpm.compiler.canonical.node.NodeVisitorBuilderService;
-import org.jbpm.process.core.context.variable.VariableScope;
 import org.jbpm.ruleflow.core.factory.StateNodeFactory;
-import org.jbpm.workflow.core.Constraint;
-import org.jbpm.workflow.core.impl.ConnectionRef;
 import org.jbpm.workflow.core.node.StateNode;
 
-import com.github.javaparser.ast.expr.IntegerLiteralExpr;
-import com.github.javaparser.ast.expr.MethodCallExpr;
-import com.github.javaparser.ast.expr.StringLiteralExpr;
-import com.github.javaparser.utils.StringEscapeUtils;
-
-import static 
org.jbpm.ruleflow.core.factory.StateNodeFactory.METHOD_CONSTRAINT;
-
 public class StateNodeVisitor extends CompositeContextNodeVisitor<StateNode> {
 
-    public StateNodeVisitor(NodeVisitorBuilderService nodeVisitorService) {
-        super(nodeVisitorService);
+    public StateNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
     }
 
     @Override
@@ -58,27 +42,4 @@ public class StateNodeVisitor extends 
CompositeContextNodeVisitor<StateNode> {
         return "State";
     }
 
-    @Override
-    public Stream<MethodCallExpr> visitCustomFields(StateNode node, 
VariableScope variableScope) {
-        if (node.getConstraints() == null) {
-            return Stream.empty();
-        }
-
-        Collection<MethodCallExpr> result = new ArrayList<>();
-        for (Map.Entry<ConnectionRef, Collection<Constraint>> entry : 
node.getConstraints().entrySet()) {
-            ConnectionRef ref = entry.getKey();
-            for (Constraint constraint : entry.getValue()) {
-                if (constraint != null) {
-                    result.add(getFactoryMethod(getNodeId(node), 
METHOD_CONSTRAINT,
-                            getOrNullExpr(ref.getConnectionId()),
-                            getWorkflowElementConstructor(ref.getNodeId()),
-                            new StringLiteralExpr(ref.getToType()),
-                            new StringLiteralExpr(constraint.getDialect()),
-                            new 
StringLiteralExpr(StringEscapeUtils.escapeJava(constraint.getConstraint())),
-                            new IntegerLiteralExpr(constraint.getPriority())));
-                }
-            }
-        }
-        return result.stream();
-    }
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ThrowLinkNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ThrowLinkNodeVisitor.java
index 916cb0fe30..3505d46d70 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ThrowLinkNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/ThrowLinkNodeVisitor.java
@@ -26,6 +26,10 @@ import com.github.javaparser.ast.stmt.BlockStmt;
 
 public class ThrowLinkNodeVisitor extends AbstractNodeVisitor<ThrowLinkNode> {
 
+    public ThrowLinkNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
+    }
+
     @Override
     protected String getNodeKey() {
         return "throwLinkNode";
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/TimerNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/TimerNodeVisitor.java
index b80a7650a8..effc80bdac 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/TimerNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/TimerNodeVisitor.java
@@ -34,6 +34,10 @@ import static 
org.jbpm.ruleflow.core.factory.TimerNodeFactory.METHOD_TYPE;
 
 public class TimerNodeVisitor extends AbstractNodeVisitor<TimerNode> {
 
+    public TimerNodeVisitor(ClassLoader classLoader) {
+        super(classLoader);
+    }
+
     @Override
     protected String getNodeKey() {
         return "timerNode";
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/WorkItemNodeVisitor.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/WorkItemNodeVisitor.java
index 479e80775e..4441f9d616 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/WorkItemNodeVisitor.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/WorkItemNodeVisitor.java
@@ -71,10 +71,8 @@ public class WorkItemNodeVisitor<T extends WorkItemNode> 
extends AbstractNodeVis
         }
     }
 
-    private final ClassLoader contextClassLoader;
-
     public WorkItemNodeVisitor(ClassLoader contextClassLoader) {
-        this.contextClassLoader = contextClassLoader;
+        super(contextClassLoader);
     }
 
     @Override
@@ -92,7 +90,7 @@ public class WorkItemNodeVisitor<T extends WorkItemNode> 
extends AbstractNodeVis
             final TaskDescriptor taskDescriptor = new 
TaskDescriptorBuilder(workName)
                     .withProcessMetadata(metadata)
                     .withWorkItemNode(node)
-                    .withClassloader(contextClassLoader)
+                    .withClassloader(getClassLoader())
                     .build();
             workName = taskDescriptor.getName();
             metadata.getGeneratedHandlers().put(workName, 
taskDescriptor.generateHandlerClassForService());
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/ActionNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/ActionNodeVisitorBuilder.java
index 9349e5bc61..3aa93462c3 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/ActionNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/ActionNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class ActionNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new ActionNodeVisitor();
+        return new ActionNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/BoundaryEventNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/BoundaryEventNodeVisitorBuilder.java
index 7380e2194b..c71d8f7a21 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/BoundaryEventNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/BoundaryEventNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class BoundaryEventNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new BoundaryEventNodeVisitor();
+        return new BoundaryEventNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/CatchLinkNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/CatchLinkNodeVisitorBuilder.java
index aa5484ceab..3ede076f7f 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/CatchLinkNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/CatchLinkNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class CatchLinkNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new CatchLinkNodeVisitor();
+        return new CatchLinkNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/CompositeContextNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/CompositeContextNodeVisitorBuilder.java
index c30cbc9898..800183910c 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/CompositeContextNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/CompositeContextNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class CompositeContextNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new CompositeContextNodeVisitor(nodeVisitorService);
+        return new CompositeContextNodeVisitor<>(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/DynamicNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/DynamicNodeVisitorBuilder.java
index fdf5f54821..84562c0968 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/DynamicNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/DynamicNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class DynamicNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new DynamicNodeVisitor(nodeVisitorService, classLoader);
+        return new DynamicNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/EndNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/EndNodeVisitorBuilder.java
index 75c54c4214..7c41e3e60a 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/EndNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/EndNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class EndNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new EndNodeVisitor();
+        return new EndNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/EventNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/EventNodeVisitorBuilder.java
index 030ef55675..1344c47634 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/EventNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/EventNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class EventNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new EventNodeVisitor();
+        return new EventNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/EventSubProcessNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/EventSubProcessNodeVisitorBuilder.java
index afae970aa5..6cff377322 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/EventSubProcessNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/EventSubProcessNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class EventSubProcessNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new EventSubProcessNodeVisitor(nodeVisitorService);
+        return new EventSubProcessNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/FaultNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/FaultNodeVisitorBuilder.java
index 9c6dfe5f2d..062cb48a4a 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/FaultNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/FaultNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class FaultNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new FaultNodeVisitor();
+        return new FaultNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/ForEachNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/ForEachNodeVisitorBuilder.java
index 1f450a5092..334fb63d4b 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/ForEachNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/ForEachNodeVisitorBuilder.java
@@ -20,7 +20,6 @@ package org.jbpm.compiler.canonical.node;
 
 import org.jbpm.compiler.canonical.AbstractNodeVisitor;
 import org.jbpm.compiler.canonical.ForEachNodeVisitor;
-import org.jbpm.compiler.canonical.builtin.ReturnValueEvaluatorBuilderService;
 import org.jbpm.workflow.core.node.ForEachNode;
 import org.kie.api.definition.process.Node;
 
@@ -33,7 +32,7 @@ public class ForEachNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new ForEachNodeVisitor(nodeVisitorService, 
ReturnValueEvaluatorBuilderService.instance(classLoader));
+        return new ForEachNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/JoinNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/JoinNodeVisitorBuilder.java
index 6a14cbdb40..9a0d7e5d6b 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/JoinNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/JoinNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class JoinNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new JoinNodeVisitor();
+        return new JoinNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/MilestoneNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/MilestoneNodeVisitorBuilder.java
index 7d50d9d859..43ed2ec813 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/MilestoneNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/MilestoneNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class MilestoneNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new MilestoneNodeVisitor();
+        return new MilestoneNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/SplitNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/SplitNodeVisitorBuilder.java
index ca874e76af..48fe7eafca 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/SplitNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/SplitNodeVisitorBuilder.java
@@ -20,7 +20,6 @@ package org.jbpm.compiler.canonical.node;
 
 import org.jbpm.compiler.canonical.AbstractNodeVisitor;
 import org.jbpm.compiler.canonical.SplitNodeVisitor;
-import org.jbpm.compiler.canonical.builtin.ReturnValueEvaluatorBuilderService;
 import org.jbpm.workflow.core.node.Split;
 import org.kie.api.definition.process.Node;
 
@@ -33,7 +32,7 @@ public class SplitNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new 
SplitNodeVisitor(ReturnValueEvaluatorBuilderService.instance(classLoader));
+        return new SplitNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/StartNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/StartNodeVisitorBuilder.java
index ad3a55a243..04183a2b42 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/StartNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/StartNodeVisitorBuilder.java
@@ -20,7 +20,6 @@ package org.jbpm.compiler.canonical.node;
 
 import org.jbpm.compiler.canonical.AbstractNodeVisitor;
 import org.jbpm.compiler.canonical.StartNodeVisitor;
-import org.jbpm.compiler.canonical.builtin.ReturnValueEvaluatorBuilderService;
 import org.jbpm.workflow.core.node.StartNode;
 import org.kie.api.definition.process.Node;
 
@@ -33,7 +32,8 @@ public class StartNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new 
StartNodeVisitor(ReturnValueEvaluatorBuilderService.instance(classLoader));
+        return new StartNodeVisitor(classLoader);
+
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/StateNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/StateNodeVisitorBuilder.java
index 50a50b9b06..b61bc2c148 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/StateNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/StateNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class StateNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new StateNodeVisitor(nodeVisitorService);
+        return new StateNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/SubProcessNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/SubProcessNodeVisitorBuilder.java
index 671aff96b4..3abf43452d 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/SubProcessNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/SubProcessNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class SubProcessNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new LambdaSubProcessNodeVisitor();
+        return new LambdaSubProcessNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/ThrowLinkNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/ThrowLinkNodeVisitorBuilder.java
index df851519b7..72680887bb 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/ThrowLinkNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/ThrowLinkNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class ThrowLinkNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new ThrowLinkNodeVisitor();
+        return new ThrowLinkNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/TimerNodeVisitorBuilder.java
 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/TimerNodeVisitorBuilder.java
index 658e31c68f..063df525bd 100644
--- 
a/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/TimerNodeVisitorBuilder.java
+++ 
b/jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/canonical/node/TimerNodeVisitorBuilder.java
@@ -32,7 +32,7 @@ public class TimerNodeVisitorBuilder implements 
NodeVisitorBuilder {
 
     @Override
     public AbstractNodeVisitor<? extends Node> 
visitor(NodeVisitorBuilderService nodeVisitorService, ClassLoader classLoader) {
-        return new TimerNodeVisitor();
+        return new TimerNodeVisitor(classLoader);
     }
 
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowProcess.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowProcess.java
index 8bb2aad0f1..226ee36633 100755
--- a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowProcess.java
+++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/RuleFlowProcess.java
@@ -60,6 +60,8 @@ public class RuleFlowProcess extends WorkflowProcessImpl {
         ExceptionScope exceptionScope = new ExceptionScope();
         addContext(exceptionScope);
         setDefaultContext(exceptionScope);
+        // backward compatibility.
+        setMetaData("jbpm.enable.multi.con", 
System.getProperty("jbpm.enable.multi.con"));
     }
 
     public VariableScope getVariableScope() {
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/NodeFactory.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/NodeFactory.java
index bcbfb1f475..e29f367f70 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/NodeFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/NodeFactory.java
@@ -19,13 +19,17 @@
 package org.jbpm.ruleflow.core.factory;
 
 import org.jbpm.process.core.context.variable.Mappable;
+import org.jbpm.process.instance.impl.ReturnValueConstraintEvaluator;
+import org.jbpm.process.instance.impl.ReturnValueEvaluator;
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
 import org.jbpm.workflow.core.Node;
 import org.jbpm.workflow.core.NodeContainer;
+import org.jbpm.workflow.core.impl.ConnectionRef;
+import org.jbpm.workflow.core.impl.NodeImpl;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
 public abstract class NodeFactory<T extends NodeFactory<T, P>, P extends 
RuleFlowNodeContainerFactory<P, ?>> implements MappableNodeFactory<T> {
-
+    public static final String METHOD_CONSTRAINT = "constraint";
     public static final String METHOD_NAME = "name";
     public static final String METHOD_METADATA = "metaData";
     public static final String METHOD_DONE = "done";
@@ -71,4 +75,20 @@ public abstract class NodeFactory<T extends NodeFactory<T, 
P>, P extends RuleFlo
         return (Mappable) node;
     }
 
+    public T constraint(WorkflowElementIdentifier toNodeId, String name, 
String type, String dialect, ReturnValueEvaluator evaluator, int priority) {
+        return constraint(toNodeId, name, type, dialect, evaluator, priority, 
false);
+    }
+
+    public T constraint(WorkflowElementIdentifier toNodeId, String name, 
String type, String dialect, ReturnValueEvaluator evaluator, int priority, 
boolean isDefault) {
+        ReturnValueConstraintEvaluator constraintImpl = new 
ReturnValueConstraintEvaluator();
+        constraintImpl.setName(name);
+        constraintImpl.setType(type);
+        constraintImpl.setDialect(dialect);
+        constraintImpl.setPriority(priority);
+        constraintImpl.setEvaluator(evaluator);
+        constraintImpl.setConstraint("expression already given as evaluator");
+        constraintImpl.setDefault(isDefault);
+        ((NodeImpl) node).addConstraint(new ConnectionRef(name, toNodeId, 
Node.CONNECTION_DEFAULT_TYPE), constraintImpl);
+        return (T) this;
+    }
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/SplitFactory.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/SplitFactory.java
index 63228ad23e..75f4507f00 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/SplitFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/ruleflow/core/factory/SplitFactory.java
@@ -18,19 +18,14 @@
  */
 package org.jbpm.ruleflow.core.factory;
 
-import org.jbpm.process.instance.impl.ReturnValueConstraintEvaluator;
-import org.jbpm.process.instance.impl.ReturnValueEvaluator;
 import org.jbpm.ruleflow.core.RuleFlowNodeContainerFactory;
-import org.jbpm.workflow.core.Node;
 import org.jbpm.workflow.core.NodeContainer;
-import org.jbpm.workflow.core.impl.ConnectionRef;
 import org.jbpm.workflow.core.node.Split;
 import org.kie.api.definition.process.WorkflowElementIdentifier;
 
 public class SplitFactory<T extends RuleFlowNodeContainerFactory<T, ?>> 
extends NodeFactory<SplitFactory<T>, T> {
 
     public static final String METHOD_TYPE = "type";
-    public static final String METHOD_CONSTRAINT = "constraint";
 
     public SplitFactory(T nodeContainerFactory, NodeContainer nodeContainer, 
WorkflowElementIdentifier id) {
         super(nodeContainerFactory, nodeContainer, new Split(), id);
@@ -60,22 +55,4 @@ public class SplitFactory<T extends 
RuleFlowNodeContainerFactory<T, ?>> extends
     public ConstraintFactory<SplitFactory<T>> 
constraintBuilder(WorkflowElementIdentifier toNodeId, String name, String type, 
String dialect, String constraint) {
         return new ConstraintFactory<>(this, toNodeId, name, type, dialect, 
constraint);
     }
-
-    public SplitFactory<T> constraint(WorkflowElementIdentifier toNodeId, 
String name, String type, String dialect, ReturnValueEvaluator evaluator, int 
priority) {
-        return constraint(toNodeId, name, type, dialect, evaluator, priority, 
false);
-    }
-
-    public SplitFactory<T> constraint(WorkflowElementIdentifier toNodeId, 
String name, String type, String dialect, ReturnValueEvaluator evaluator, int 
priority, boolean isDefault) {
-        ReturnValueConstraintEvaluator constraintImpl = new 
ReturnValueConstraintEvaluator();
-        constraintImpl.setName(name);
-        constraintImpl.setType(type);
-        constraintImpl.setDialect(dialect);
-        constraintImpl.setPriority(priority);
-        constraintImpl.setEvaluator(evaluator);
-        constraintImpl.setConstraint("expression already given as evaluator");
-        constraintImpl.setDefault(isDefault);
-        getSplit().addConstraint(
-                new ConnectionRef(name, toNodeId, 
Node.CONNECTION_DEFAULT_TYPE), constraintImpl);
-        return this;
-    }
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/impl/NodeImpl.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/impl/NodeImpl.java
index 4410c19d6d..0ea5dee550 100755
--- a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/impl/NodeImpl.java
+++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/impl/NodeImpl.java
@@ -297,7 +297,7 @@ public abstract class NodeImpl implements Node, 
ContextResolver, Mappable {
         if (list.size() == 1) {
             return list.get(0);
         }
-        if ("true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             return list.get(0);
         } else {
             throw new IllegalArgumentException(
@@ -317,7 +317,7 @@ public abstract class NodeImpl implements Node, 
ContextResolver, Mappable {
         if (list.size() == 1) {
             return list.get(0);
         }
-        if ("true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             return list.get(0);
         } else {
             throw new IllegalArgumentException(
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/ActionNode.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/ActionNode.java
index aff798ca7f..9144d42833 100755
--- a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/ActionNode.java
+++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/ActionNode.java
@@ -53,7 +53,7 @@ public class ActionNode extends ExtendedNodeImpl {
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] only accepts default incoming connection 
type!");
         }
-        if (getFrom() != null && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getFrom() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] cannot have more than one incoming 
connection!");
@@ -68,7 +68,7 @@ public class ActionNode extends ExtendedNodeImpl {
                     "This type of node [" + connection.getFrom().getUniqueId() 
+ ", " + connection.getFrom().getName()
                             + "] only accepts default outgoing connection 
type!");
         }
-        if (getTo() != null && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getTo() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "This type of node [" + connection.getFrom().getUniqueId() 
+ ", " + connection.getFrom().getName()
                             + "] cannot have more than one outgoing 
connection!");
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/EndNode.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/EndNode.java
index eb45e40590..ae88f43956 100755
--- a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/EndNode.java
+++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/EndNode.java
@@ -58,7 +58,7 @@ public class EndNode extends ExtendedNodeImpl {
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] only accepts default incoming connection 
type!");
         }
-        if (getFrom() != null && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getFrom() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] cannot have more than one incoming 
connection!");
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/EventNode.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/EventNode.java
index 968ecb96df..42d216f483 100755
--- a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/EventNode.java
+++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/EventNode.java
@@ -104,7 +104,7 @@ public class EventNode extends ExtendedNodeImpl implements 
EventNodeInterface {
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] only accepts default incoming connection 
type!");
         }
-        if (getFrom() != null && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getFrom() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] cannot have more than one incoming 
connection!");
@@ -119,7 +119,7 @@ public class EventNode extends ExtendedNodeImpl implements 
EventNodeInterface {
                     "This type of node [" + connection.getFrom().getUniqueId() 
+ ", " + connection.getFrom().getName()
                             + "] only accepts default outgoing connection 
type!");
         }
-        if (getTo() != null && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getTo() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "This type of node [" + connection.getFrom().getUniqueId() 
+ ", " + connection.getFrom().getName()
                             + "] cannot have more than one outgoing 
connection!");
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/MilestoneNode.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/MilestoneNode.java
index ddac709244..7ffabedcda 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/MilestoneNode.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/MilestoneNode.java
@@ -59,7 +59,7 @@ public class MilestoneNode extends StateBasedNode implements 
Constrainable {
         if (!Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
             throwValidationException(connection, "only accepts default 
incoming connection type!");
         }
-        if (getFrom() != null && 
!Boolean.parseBoolean(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getFrom() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throwValidationException(connection, "cannot have more than one 
incoming connection!");
         }
     }
@@ -70,7 +70,7 @@ public class MilestoneNode extends StateBasedNode implements 
Constrainable {
         if (!Node.CONNECTION_DEFAULT_TYPE.equals(type)) {
             throwValidationException(connection, "only accepts default 
outgoing connection type!");
         }
-        if (getTo() != null && 
!Boolean.parseBoolean(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getTo() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throwValidationException(connection, "cannot have more than one 
outgoing connection!");
         }
     }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/RuleSetNode.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/RuleSetNode.java
index 5f3a242dd8..3d129f3b22 100755
--- a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/RuleSetNode.java
+++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/RuleSetNode.java
@@ -105,7 +105,7 @@ public class RuleSetNode extends StateBasedNode implements 
ContextContainer {
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] only accepts default incoming connection 
type!");
         }
-        if (getFrom() != null && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getFrom() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] cannot have more than one incoming 
connection!");
@@ -120,7 +120,7 @@ public class RuleSetNode extends StateBasedNode implements 
ContextContainer {
                     "This type of node [" + connection.getFrom().getUniqueId() 
+ ", " + connection.getFrom().getName()
                             + "] only accepts default outgoing connection 
type!");
         }
-        if (getTo() != null && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getTo() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "This type of node [" + connection.getFrom().getUniqueId() 
+ ", " + connection.getFrom().getName()
                             + "] cannot have more than one outgoing 
connection!");
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/Split.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/Split.java
index 20f90546da..fe2114905c 100755
--- a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/Split.java
+++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/Split.java
@@ -143,7 +143,7 @@ public class Split extends NodeImpl implements 
Constrainable {
                             + "] only accepts default incoming connection 
type!");
         }
 
-        if (!getIncomingConnections(Node.CONNECTION_DEFAULT_TYPE).isEmpty() && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (!getIncomingConnections(Node.CONNECTION_DEFAULT_TYPE).isEmpty() && 
!Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] cannot have more than one incoming 
connection!");
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/StartNode.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/StartNode.java
index cfc91ddeec..3743bbd157 100755
--- a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/StartNode.java
+++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/StartNode.java
@@ -92,7 +92,7 @@ public class StartNode extends ExtendedNodeImpl {
             throw new IllegalArgumentException(
                     "A start node [" + this.getUniqueId() + ", " + 
this.getName() + "] only accepts default outgoing connection type!");
         }
-        if (getTo() != null && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getTo() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "A start node [" + this.getUniqueId() + ", " + 
this.getName() + "] cannot have more than one outgoing connection!");
         }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/SubProcessNode.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/SubProcessNode.java
index 80b6f75f87..77f873ddc7 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/SubProcessNode.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/SubProcessNode.java
@@ -77,7 +77,7 @@ public class SubProcessNode extends StateBasedNode implements 
ContextContainer {
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] only accepts default incoming connection 
type!");
         }
-        if (getFrom() != null && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getFrom() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] cannot have more than one incoming 
connection!");
@@ -92,7 +92,7 @@ public class SubProcessNode extends StateBasedNode implements 
ContextContainer {
                     "This type of node [" + connection.getFrom().getUniqueId() 
+ ", " + connection.getFrom().getName()
                             + "] only accepts default outgoing connection 
type!");
         }
-        if (getTo() != null && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getTo() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "This type of node [" + connection.getFrom().getUniqueId() 
+ ", " + connection.getFrom().getName()
                             + "] cannot have more than one outgoing 
connection!");
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/TimerNode.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/TimerNode.java
index a3a4e29d95..e8ce9a5495 100755
--- a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/TimerNode.java
+++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/TimerNode.java
@@ -45,7 +45,7 @@ public class TimerNode extends ExtendedNodeImpl {
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] only accepts default incoming connection 
type!");
         }
-        if (getFrom() != null && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getFrom() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] cannot have more than one incoming 
connection!");
@@ -60,7 +60,7 @@ public class TimerNode extends ExtendedNodeImpl {
                     "This type of node [" + connection.getFrom().getUniqueId() 
+ ", " + connection.getFrom().getName()
                             + "] only accepts default outgoing connection 
type!");
         }
-        if (getTo() != null && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getTo() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "This type of node [" + connection.getFrom().getUniqueId() 
+ ", " + connection.getFrom().getName()
                             + "] cannot have more than one outgoing 
connection!");
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/WorkItemNode.java 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/WorkItemNode.java
index dd1357b5ff..d7cd3c06c1 100755
--- a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/WorkItemNode.java
+++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/core/node/WorkItemNode.java
@@ -66,7 +66,7 @@ public class WorkItemNode extends StateBasedNode implements 
ContextContainer {
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] only accepts default incoming connection 
type!");
         }
-        if (getFrom() != null && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getFrom() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "This type of node [" + connection.getTo().getUniqueId() + 
", " + connection.getTo().getName()
                             + "] cannot have more than one incoming 
connection!");
@@ -81,7 +81,7 @@ public class WorkItemNode extends StateBasedNode implements 
ContextContainer {
                     "This type of node [" + connection.getFrom().getUniqueId() 
+ ", " + connection.getFrom().getName()
                             + "] only accepts default outgoing connection 
type!");
         }
-        if (getTo() != null && 
!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+        if (getTo() != null && !Boolean.parseBoolean((String) 
getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
             throw new IllegalArgumentException(
                     "This type of node [" + connection.getFrom().getUniqueId() 
+ ", " + connection.getFrom().getName()
                             + "] cannot have more than one outgoing 
connection!");
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceImpl.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceImpl.java
index f71a5ef44f..a5e452a24a 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceImpl.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceImpl.java
@@ -314,7 +314,7 @@ public abstract class NodeInstanceImpl implements 
org.jbpm.workflow.instance.Nod
 
         List<Connection> connections = null;
         if (node != null) {
-            if ("true".equals(System.getProperty("jbpm.enable.multi.con")) && 
!((NodeImpl) node).getConstraints().isEmpty()) {
+            if (Boolean.parseBoolean((String) 
getProcessInstance().getProcess().getMetaData().get("jbpm.enable.multi.con")) 
&& !((NodeImpl) node).getConstraints().isEmpty()) {
                 int priority;
                 connections = ((NodeImpl) 
node).getDefaultOutgoingConnections();
                 boolean found = false;
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/node/ForEachNodeInstance.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/node/ForEachNodeInstance.java
index 453c700fbb..339f48d3f2 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/node/ForEachNodeInstance.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/node/ForEachNodeInstance.java
@@ -293,7 +293,7 @@ public class ForEachNodeInstance extends 
CompositeContextNodeInstance {
                 ((NodeInstanceContainer) 
getNodeInstanceContainer()).removeNodeInstance(this);
 
                 if (getForEachNode().isWaitForCompletion()) {
-                    if 
(!"true".equals(System.getProperty("jbpm.enable.multi.con"))) {
+                    if (!Boolean.parseBoolean((String) 
getForEachNode().getProcess().getMetaData().get("jbpm.enable.multi.con"))) {
                         triggerConnection(getForEachJoinNode().getTo());
                     } else {
                         List<Connection> connections = 
getForEachJoinNode().getOutgoingConnections(Node.CONNECTION_DEFAULT_TYPE);
diff --git a/jbpm/jbpm-tests/src/test/resources/BPMN2-ConditionalStart.bpmn2 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/event/BPMN2-ConditionalStart.bpmn2
similarity index 89%
rename from jbpm/jbpm-tests/src/test/resources/BPMN2-ConditionalStart.bpmn2
rename to 
jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/event/BPMN2-ConditionalStart.bpmn2
index 441c7c6741..d0f0fc7a73 100755
--- a/jbpm/jbpm-tests/src/test/resources/BPMN2-ConditionalStart.bpmn2
+++ 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/event/BPMN2-ConditionalStart.bpmn2
@@ -29,17 +29,19 @@
              xmlns:dc="http://www.omg.org/spec/DD/20100524/DC";
              xmlns:di="http://www.omg.org/spec/DD/20100524/DI";
              xmlns:tns="http://www.jboss.org/drools";>
-
-  <process processType="Private" isExecutable="true" id="Minimal" 
name="Minimal Process" tns:packageName="com.sample" >
+  <itemDefinition id="_xItem" structureRef="org.jbpm.bpmn2.objects.Person" />
+  <process processType="Private" isExecutable="true" id="ConditionalStart" 
name="Minimal Process" tns:packageName="org.jbpm.bpmn2.event" >
 
     <extensionElements>
       <tns:import name="org.jbpm.bpmn2.objects.Person" />
     </extensionElements>
 
+    <property id="person" itemSubjectRef="_xItem"/>
+
     <!-- nodes -->
     <startEvent id="_1" name="StartProcess" >
       <conditionalEventDefinition>
-        <condition xsi:type="tFormalExpression" 
language="http://www.jboss.org/drools/rule";>Person(name == "john")</condition>
+        <condition xsi:type="tFormalExpression" 
language="http://www.java.com/java";>"john".equals(person.getName())</condition>
       </conditionalEventDefinition>
     </startEvent>
     <scriptTask id="_2" name="Hello" >
diff --git 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ConditionalFlowWithoutGateway.bpmn2 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ConditionalFlowWithoutGateway.bpmn2
similarity index 88%
copy from 
jbpm/jbpm-tests/src/test/resources/BPMN2-ConditionalFlowWithoutGateway.bpmn2
copy to 
jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ConditionalFlowWithoutGateway.bpmn2
index f6816308fa..63a64e43fa 100755
--- 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ConditionalFlowWithoutGateway.bpmn2
+++ 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ConditionalFlowWithoutGateway.bpmn2
@@ -18,9 +18,19 @@
   ~ under the License.
   -->
 
-<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns="http://www.omg.org/bpmn20"; 
xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL"; 
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"; 
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"; 
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"; 
xmlns:drools="http://www.jboss.org/drools"; id="_OSAkwHM-EeGROt7AmBKBUg" 
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" 
targetNamespace="http:/ [...]
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
+xmlns="http://www.omg.org/bpmn20";
+ xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL"; 
+ xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"; 
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"; 
+ xmlns:di="http://www.omg.org/spec/DD/20100524/DI"; 
xmlns:drools="http://www.jboss.org/drools"; id="_OSAkwHM-EeGROt7AmBKBUg" 
+ xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" 
targetNamespace="http://www.omg.org/bpmn20";>
   <bpmn2:itemDefinition id="_xItem" structureRef="Integer"/>
-  <bpmn2:process id="designer.conditional-flow" 
drools:packageName="org.jboss.qa.brms.jbpm.functional.bpmn2.designer" 
name="conditional-flow" isExecutable="true">
+  <bpmn2:process id="ConditionalFlowWithoutGateway" 
drools:packageName="org.jbpm.bpmn2.flow" name="conditional-flow" 
isExecutable="true">
+    <bpmn2:extensionElements>
+        <drools:metaData name="jbpm.enable.multi.con">
+            <drools:metaValue><![CDATA[true]]></drools:metaValue>
+        </drools:metaData>
+    </bpmn2:extensionElements>
     <bpmn2:property id="x" itemSubjectRef="_xItem"/>
     <bpmn2:startEvent id="_CF9831F9-AFE1-4F57-86C4-662C73090C42" 
drools:bgcolor="#ffffff" name="start">
       <bpmn2:outgoing>_1897CC4D-9026-42F4-A3E9-663EBD1B00F3</bpmn2:outgoing>
diff --git 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveGatewayWithNoConditionsDefined.bpmn2
 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveGatewayWithNoConditionsDefined.bpmn2
similarity index 96%
rename from 
jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveGatewayWithNoConditionsDefined.bpmn2
rename to 
jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveGatewayWithNoConditionsDefined.bpmn2
index 1e249fe614..6ec613905b 100755
--- 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveGatewayWithNoConditionsDefined.bpmn2
+++ 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveGatewayWithNoConditionsDefined.bpmn2
@@ -19,7 +19,7 @@
   -->
 
 <bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL"; 
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"; 
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"; 
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"; 
xmlns:drools="http://www.jboss.org/drools"; 
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" 
id="Definitions_1" targetNamespace="http://www.jboss.org/drools";>
-  <bpmn2:process id="BPMN2-ExclusiveGatewayWithNoConditionsDefined" 
drools:version="1" drools:packageName="defaultPackage" drools:adHoc="false" 
name="Default Process" isExecutable="true">
+  <bpmn2:process id="ExclusiveGatewayWithNoConditionsDefined" 
drools:version="1" drools:packageName="org.jbpm.bpmn2.flow" 
drools:adHoc="false" name="Default Process" isExecutable="true">
     <bpmn2:startEvent id="StartEvent_1" name="">
       <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>
     </bpmn2:startEvent>
diff --git 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitDefault.bpmn2 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitDefault.bpmn2
similarity index 100%
rename from jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitDefault.bpmn2
rename to 
jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitDefault.bpmn2
diff --git 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitDefaultNoCondition.bpmn2
 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitDefaultNoCondition.bpmn2
similarity index 95%
rename from 
jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitDefaultNoCondition.bpmn2
rename to 
jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitDefaultNoCondition.bpmn2
index 4592a473cb..2edb832432 100755
--- 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitDefaultNoCondition.bpmn2
+++ 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitDefaultNoCondition.bpmn2
@@ -31,7 +31,7 @@
 
   <itemDefinition id="_falseBoolItem" structureRef="java.lang.Boolean" />
 
-  <process processType="Private" isExecutable="true" id="com.sample.test" 
name="Test" >
+  <process processType="Private" isExecutable="true" 
id="ExclusiveSplitDefaultNoCondition" name="Test" 
tns:packageName="org.jbpm.bpmn2.flow" >
 
     <!-- process variables -->
     <property id="x" itemSubjectRef="_falseBoolItem"/>
diff --git a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitXPath.bpmn2 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitXPath.bpmn2
similarity index 100%
rename from jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitXPath.bpmn2
rename to 
jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitXPath.bpmn2
diff --git 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitXPath-advanced.bpmn2 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitXPathAdvanced.bpmn2
similarity index 97%
rename from 
jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitXPath-advanced.bpmn2
rename to 
jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitXPathAdvanced.bpmn2
index 3d874d8714..af73961bda 100755
--- 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitXPath-advanced.bpmn2
+++ 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitXPathAdvanced.bpmn2
@@ -32,7 +32,7 @@
   <itemDefinition id="_xItem" structureRef="Object" />
   <itemDefinition id="_yItem" structureRef="String" />
 
-  <process processType="Private" isExecutable="true" id="com.sample.test" 
name="Test" >
+  <process processType="Private" isExecutable="true" 
id="ExclusiveSplitXPathAdvanced" name="Test" 
tns:packageName="org.jbpm.bpmn2.flow" >
 
     <!-- process variables -->
     <property id="x" itemSubjectRef="_xItem"/>
diff --git 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitXPath-advanced-vars-not-signaled.bpmn2
 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitXPathAdvancedVarsNotSignaled.bpmn2
similarity index 97%
rename from 
jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitXPath-advanced-vars-not-signaled.bpmn2
rename to 
jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitXPathAdvancedVarsNotSignaled.bpmn2
index b00347d6a7..ed6781736a 100755
--- 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitXPath-advanced-vars-not-signaled.bpmn2
+++ 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitXPathAdvancedVarsNotSignaled.bpmn2
@@ -32,7 +32,7 @@
   <itemDefinition id="_xItem" structureRef="Object" />
   <itemDefinition id="_yItem" structureRef="String" />
 
-  <process processType="Private" isExecutable="true" id="com.sample.test" 
name="Test" >
+  <process processType="Private" isExecutable="true" 
id="ExclusiveSplitXPathAdvancedVarsNotSignaled" name="Test" 
tns:packageName="org.jbpm.bpmn2.flow" >
 
     <!-- process variables -->
     <property id="x" itemSubjectRef="_xItem"/>
diff --git 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitXPath-advanced-with-vars.bpmn2
 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitXPathAdvancedWithVars.bpmn2
similarity index 97%
rename from 
jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitXPath-advanced-with-vars.bpmn2
rename to 
jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitXPathAdvancedWithVars.bpmn2
index 53ac83b976..473d81c998 100755
--- 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ExclusiveSplitXPath-advanced-with-vars.bpmn2
+++ 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-ExclusiveSplitXPathAdvancedWithVars.bpmn2
@@ -32,7 +32,7 @@
   <itemDefinition id="_xItem" structureRef="Object" />
   <itemDefinition id="_yItem" structureRef="String" />
 
-  <process processType="Private" isExecutable="true" id="com.sample.test" 
name="Test" >
+  <process processType="Private" isExecutable="true" 
id="ExclusiveSplitXPathAdvancedWithVars" name="Test" 
tns:packageName="org.jbpm.bpmn2.flow">
 
     <!-- process variables -->
     <property id="x" itemSubjectRef="_xItem"/>
diff --git 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-GatewaySplit-SequenceConditions.bpmn2
 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-GatewaySplitSequenceConditions.bpmn2
similarity index 98%
rename from 
jbpm/jbpm-tests/src/test/resources/BPMN2-GatewaySplit-SequenceConditions.bpmn2
rename to 
jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-GatewaySplitSequenceConditions.bpmn2
index b5b98479de..1e3f71617e 100755
--- 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-GatewaySplit-SequenceConditions.bpmn2
+++ 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-GatewaySplitSequenceConditions.bpmn2
@@ -31,7 +31,7 @@
              xmlns:di="http://www.omg.org/spec/DD/20100524/DI";
              xmlns:tns="http://www.jboss.org/drools";>
 
-  <process processType="Private" isExecutable="true" id="GatewayTest" 
name="GatewayTest" >
+  <process processType="Private" isExecutable="true" 
id="GatewaySplitSequenceConditions" name="GatewayTest" 
tns:packageName="org.jbpm.bpmn2.flow" >
 
     <!-- nodes -->
     <startEvent id="_1" name="StartProcess" />
diff --git a/jbpm/jbpm-tests/src/test/resources/BPMN2-gatewayTest.bpmn2 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-GatewayTest.bpmn2
similarity index 91%
rename from jbpm/jbpm-tests/src/test/resources/BPMN2-gatewayTest.bpmn2
rename to 
jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-GatewayTest.bpmn2
index 78a3574a6a..8daceb7388 100755
--- a/jbpm/jbpm-tests/src/test/resources/BPMN2-gatewayTest.bpmn2
+++ b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-GatewayTest.bpmn2
@@ -17,11 +17,15 @@
   ~ under the License.
   -->
 
-<bpmn2:definitions xmlns:bpmn2='http://www.omg.org/spec/BPMN/20100524/MODEL' 
xmlns:xrm='http://www.intalio.com/cloud/xrm' 
typeLanguage='http://www.java.com/javaTypes' 
expressionLanguage='http://www.mvel.org/2.0' id='600355600991789200' 
targetNamespace=''>
+<bpmn2:definitions xmlns:bpmn2='http://www.omg.org/spec/BPMN/20100524/MODEL' 
+xmlns:xrm='http://www.intalio.com/cloud/xrm' 
typeLanguage='http://www.java.com/javaTypes' 
expressionLanguage='http://www.mvel.org/2.0' id='600355600991789200' 
+targetNamespace=''
+xmlns:drools="http://www.jboss.org/drools"; 
+>
   <bpmn2:import importType='xrm' namespace='http://www.intalio.com/cloud/xrm'/>
   <bpmn2:itemDefinition id='objectType' structureRef='org.w3c.dom.Document'/>
   <bpmn2:itemDefinition id='startype' structureRef='org.w3c.dom.Node'/>
-  <bpmn2:process id='process'>
+  <bpmn2:process id='GatewayTest' drools:packageName="org.jbpm.bpmn2.flow">
     <bpmn2:property id='instanceMetadata' itemSubjectRef='objectType'/>
     <bpmn2:property id='processMetadata' itemSubjectRef='objectType'/>
     <bpmn2:property id='startMessage' itemSubjectRef='startype'/>
diff --git 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-InclusiveSplitDefault.bpmn2 
b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-InclusiveSplitDefault.bpmn2
similarity index 100%
rename from jbpm/jbpm-tests/src/test/resources/BPMN2-InclusiveSplitDefault.bpmn2
rename to 
jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/flow/BPMN2-InclusiveSplitDefault.bpmn2
diff --git a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/CompilationTest.java 
b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/CompilationTest.java
index 0235d3158c..32d6805030 100755
--- a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/CompilationTest.java
+++ b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/CompilationTest.java
@@ -46,7 +46,7 @@ public class CompilationTest extends JbpmBpmn2TestCase {
         TestJavaProcessDialect javaProcessDialect = new 
TestJavaProcessDialect();
         ProcessDialectRegistry.setDialect("java", javaProcessDialect);
 
-        String filename = "BPMN2-GatewaySplit-SequenceConditions.bpmn2";
+        String filename = 
"org/jbpm/bpmn2/flow/BPMN2-GatewaySplitSequenceConditions.bpmn2";
         kruntime = createKogitoProcessRuntime(filename);
 
         assertThat(javaProcessDialect.getActionDescrs()).as("No " + 
ActionDescr.class.getSimpleName() + " instances caught for 
testing!").isNotEmpty();
diff --git a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/FlowTest.java 
b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/FlowTest.java
index aaa0fe5a16..a9a088329f 100755
--- a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/FlowTest.java
+++ b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/FlowTest.java
@@ -29,6 +29,22 @@ import java.util.Map;
 
 import javax.xml.parsers.DocumentBuilderFactory;
 
+import org.jbpm.bpmn2.flow.ConditionalFlowWithoutGatewayModel;
+import org.jbpm.bpmn2.flow.ConditionalFlowWithoutGatewayProcess;
+import org.jbpm.bpmn2.flow.ExclusiveSplitDefaultModel;
+import org.jbpm.bpmn2.flow.ExclusiveSplitDefaultNoConditionModel;
+import org.jbpm.bpmn2.flow.ExclusiveSplitDefaultNoConditionProcess;
+import org.jbpm.bpmn2.flow.ExclusiveSplitDefaultProcess;
+import org.jbpm.bpmn2.flow.ExclusiveSplitXPathAdvancedModel;
+import org.jbpm.bpmn2.flow.ExclusiveSplitXPathAdvancedProcess;
+import org.jbpm.bpmn2.flow.ExclusiveSplitXPathAdvancedVarsNotSignaledModel;
+import org.jbpm.bpmn2.flow.ExclusiveSplitXPathAdvancedVarsNotSignaledProcess;
+import org.jbpm.bpmn2.flow.ExclusiveSplitXPathAdvancedWithVarsModel;
+import org.jbpm.bpmn2.flow.ExclusiveSplitXPathAdvancedWithVarsProcess;
+import org.jbpm.bpmn2.flow.GatewayTestModel;
+import org.jbpm.bpmn2.flow.GatewayTestProcess;
+import org.jbpm.bpmn2.flow.InclusiveSplitDefaultModel;
+import org.jbpm.bpmn2.flow.InclusiveSplitDefaultProcess;
 import org.jbpm.bpmn2.loop.MultiInstanceLoopCharacteristicsTaskModel;
 import org.jbpm.bpmn2.loop.MultiInstanceLoopCharacteristicsTaskProcess;
 import org.jbpm.bpmn2.objects.TestWorkItemHandler;
@@ -38,6 +54,7 @@ import 
org.jbpm.process.instance.context.variable.VariableScopeInstance;
 import org.jbpm.process.instance.impl.demo.SystemOutWorkItemHandler;
 import org.jbpm.process.instance.impl.humantask.InternalHumanTaskWorkItem;
 import org.jbpm.test.util.NodeLeftCountDownProcessEventListener;
+import org.jbpm.test.utils.EventTrackerProcessListener;
 import org.jbpm.test.utils.ProcessTestHelper;
 import org.jbpm.workflow.instance.impl.NodeInstanceImpl;
 import org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl;
@@ -63,6 +80,8 @@ import 
org.kie.kogito.internal.process.runtime.KogitoProcessInstance;
 import org.kie.kogito.internal.process.runtime.KogitoProcessRuntime;
 import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
 import org.kie.kogito.internal.process.runtime.KogitoWorkItemManager;
+import org.kie.kogito.process.Process;
+import org.kie.kogito.process.ProcessInstance;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -85,7 +104,7 @@ public class FlowTest extends JbpmBpmn2TestCase {
     @Test
     public void testExclusiveSplitWithNoConditions() throws Exception {
         try {
-            
createKogitoProcessRuntime("BPMN2-ExclusiveGatewayWithNoConditionsDefined.bpmn2");
+            
createKogitoProcessRuntime("org/jbpm/bpmn2/flow/BPMN2-ExclusiveGatewayWithNoConditionsDefined.bpmn2");
             fail("Should fail as XOR gateway does not have conditions 
defined");
         } catch (RuntimeException e) {
             assertThat(e.getMessage()).contains("does not have a constraint 
for Connection");
@@ -109,10 +128,12 @@ public class FlowTest extends JbpmBpmn2TestCase {
 
     @Test
     public void testExclusiveSplitXPathAdvanced() throws Exception {
-        kruntime = 
createKogitoProcessRuntime("BPMN2-ExclusiveSplitXPath-advanced.bpmn2");
-        kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Email",
-                new SystemOutWorkItemHandler());
-        Map<String, Object> params = new HashMap<>();
+        Application app = ProcessTestHelper.newApplication();
+        ProcessTestHelper.registerHandler(app, "Email", new 
SystemOutWorkItemHandler());
+
+        Process<ExclusiveSplitXPathAdvancedModel> definition = 
ExclusiveSplitXPathAdvancedProcess.newProcess(app);
+        ExclusiveSplitXPathAdvancedModel model = definition.createModel();
+
         Document doc = DocumentBuilderFactory.newInstance()
                 .newDocumentBuilder().newDocument();
         Element hi = doc.createElement("hi");
@@ -121,20 +142,26 @@ public class FlowTest extends JbpmBpmn2TestCase {
         Attr attr = doc.createAttribute("value");
         ho.setAttributeNode(attr);
         attr.setValue("a");
-        params.put("x", hi);
-        params.put("y", "Second");
-        KogitoProcessInstance processInstance = kruntime.startProcess(
-                "com.sample.test", params);
-        assertProcessInstanceCompleted(processInstance);
+
+        model.setX(hi);
+        model.setY("Second");
+
+        ProcessInstance<ExclusiveSplitXPathAdvancedModel> instance = 
definition.createInstance(model);
+        instance.start();
+
+        
assertThat(instance.status()).isEqualTo(ProcessInstance.STATE_COMPLETED);
 
     }
 
     @Test
     public void testExclusiveSplitXPathAdvanced2() throws Exception {
-        kruntime = 
createKogitoProcessRuntime("BPMN2-ExclusiveSplitXPath-advanced-vars-not-signaled.bpmn2");
-        kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Email",
-                new SystemOutWorkItemHandler());
-        Map<String, Object> params = new HashMap<>();
+
+        Application app = ProcessTestHelper.newApplication();
+        ProcessTestHelper.registerHandler(app, "Email", new 
SystemOutWorkItemHandler());
+
+        Process<ExclusiveSplitXPathAdvancedVarsNotSignaledModel> definition = 
ExclusiveSplitXPathAdvancedVarsNotSignaledProcess.newProcess(app);
+        ExclusiveSplitXPathAdvancedVarsNotSignaledModel model = 
definition.createModel();
+
         Document doc = DocumentBuilderFactory.newInstance()
                 .newDocumentBuilder().newDocument();
         Element hi = doc.createElement("hi");
@@ -143,20 +170,25 @@ public class FlowTest extends JbpmBpmn2TestCase {
         Attr attr = doc.createAttribute("value");
         ho.setAttributeNode(attr);
         attr.setValue("a");
-        params.put("x", hi);
-        params.put("y", "Second");
-        KogitoProcessInstance processInstance = kruntime.startProcess(
-                "com.sample.test", params);
-        assertProcessInstanceCompleted(processInstance);
+
+        model.setX(hi);
+        model.setY("Second");
+
+        ProcessInstance<ExclusiveSplitXPathAdvancedVarsNotSignaledModel> 
instance = definition.createInstance(model);
+        instance.start();
+
+        
assertThat(instance.status()).isEqualTo(ProcessInstance.STATE_COMPLETED);
 
     }
 
     @Test
     public void testExclusiveSplitXPathAdvancedWithVars() throws Exception {
-        kruntime = 
createKogitoProcessRuntime("BPMN2-ExclusiveSplitXPath-advanced-with-vars.bpmn2");
-        kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Email",
-                new SystemOutWorkItemHandler());
-        Map<String, Object> params = new HashMap<>();
+        Application app = ProcessTestHelper.newApplication();
+        ProcessTestHelper.registerHandler(app, "Email", new 
SystemOutWorkItemHandler());
+
+        Process<ExclusiveSplitXPathAdvancedWithVarsModel> definition = 
ExclusiveSplitXPathAdvancedWithVarsProcess.newProcess(app);
+        ExclusiveSplitXPathAdvancedWithVarsModel model = 
definition.createModel();
+
         Document doc = DocumentBuilderFactory.newInstance()
                 .newDocumentBuilder().newDocument();
         Element hi = doc.createElement("hi");
@@ -165,11 +197,14 @@ public class FlowTest extends JbpmBpmn2TestCase {
         Attr attr = doc.createAttribute("value");
         ho.setAttributeNode(attr);
         attr.setValue("a");
-        params.put("x", hi);
-        params.put("y", "Second");
-        KogitoProcessInstance processInstance = kruntime.startProcess(
-                "com.sample.test", params);
-        assertProcessInstanceCompleted(processInstance);
+
+        model.setX(hi);
+        model.setY("Second");
+
+        ProcessInstance<ExclusiveSplitXPathAdvancedWithVarsModel> instance = 
definition.createInstance(model);
+        instance.start();
+
+        
assertThat(instance.status()).isEqualTo(ProcessInstance.STATE_COMPLETED);
 
     }
 
@@ -189,40 +224,45 @@ public class FlowTest extends JbpmBpmn2TestCase {
 
     @Test
     public void testExclusiveSplitDefault() throws Exception {
-        kruntime = 
createKogitoProcessRuntime("BPMN2-ExclusiveSplitDefault.bpmn2");
-        kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Email",
-                new SystemOutWorkItemHandler());
-        Map<String, Object> params = new HashMap<>();
-        params.put("x", "NotFirst");
-        params.put("y", "Second");
-        KogitoProcessInstance processInstance = kruntime.startProcess(
-                "ExclusiveSplitDefault", params);
-        assertProcessInstanceCompleted(processInstance);
+
+        Application app = ProcessTestHelper.newApplication();
+
+        ProcessTestHelper.registerHandler(app, "Email", new 
SystemOutWorkItemHandler());
+        org.kie.kogito.process.Process<ExclusiveSplitDefaultModel> definition 
= ExclusiveSplitDefaultProcess.newProcess(app);
+        ExclusiveSplitDefaultModel model = definition.createModel();
+        model.setX("NotFirst");
+        model.setY("Second");
+        org.kie.kogito.process.ProcessInstance<ExclusiveSplitDefaultModel> 
instance = definition.createInstance(model);
+        instance.start();
+
+        
assertThat(instance.status()).isEqualTo(org.kie.kogito.process.ProcessInstance.STATE_COMPLETED);
 
     }
 
     @Test
     public void testExclusiveXORGateway() throws Exception {
-        kruntime = createKogitoProcessRuntime("BPMN2-gatewayTest.bpmn2");
         Document document = DocumentBuilderFactory
                 .newInstance()
                 .newDocumentBuilder()
                 .parse(new ByteArrayInputStream(
                         "<instanceMetadata><user approved=\"false\" 
/></instanceMetadata>"
                                 .getBytes()));
-        Map<String, Object> params = new HashMap<>();
-        params.put("instanceMetadata", document);
-        params.put(
-                "startMessage",
-                DocumentBuilderFactory
-                        .newInstance()
-                        .newDocumentBuilder()
-                        .parse(new ByteArrayInputStream(
-                                "<task subject='foobar2'/>".getBytes()))
-                        .getFirstChild());
-        KogitoProcessInstance processInstance = 
kruntime.startProcess("process",
-                params);
-        assertProcessInstanceCompleted(processInstance);
+
+        Application app = ProcessTestHelper.newApplication();
+
+        org.kie.kogito.process.Process<GatewayTestModel> definition = 
GatewayTestProcess.newProcess(app);
+        GatewayTestModel model = definition.createModel();
+        model.setInstanceMetadata(document);
+        model.setStartMessage(DocumentBuilderFactory
+                .newInstance()
+                .newDocumentBuilder()
+                .parse(new ByteArrayInputStream(
+                        "<task subject='foobar2'/>".getBytes()))
+                .getFirstChild());
+        org.kie.kogito.process.ProcessInstance<GatewayTestModel> instance = 
definition.createInstance(model);
+        instance.start();
+
+        
assertThat(instance.status()).isEqualTo(org.kie.kogito.process.ProcessInstance.STATE_COMPLETED);
 
     }
 
@@ -490,12 +530,14 @@ public class FlowTest extends JbpmBpmn2TestCase {
 
     @Test
     public void testInclusiveSplitDefault() throws Exception {
-        kruntime = 
createKogitoProcessRuntime("BPMN2-InclusiveSplitDefault.bpmn2");
-        Map<String, Object> params = new HashMap<>();
-        params.put("x", -5);
-        KogitoProcessInstance processInstance = kruntime.startProcess(
-                "InclusiveSplitDefault", params);
-        assertProcessInstanceCompleted(processInstance);
+        Application app = ProcessTestHelper.newApplication();
+
+        org.kie.kogito.process.Process<InclusiveSplitDefaultModel> definition 
= InclusiveSplitDefaultProcess.newProcess(app);
+        InclusiveSplitDefaultModel model = definition.createModel();
+        model.setX(-5);
+        org.kie.kogito.process.ProcessInstance<InclusiveSplitDefaultModel> 
instance = definition.createInstance(model);
+        instance.start();
+        
assertThat(instance.status()).isEqualTo(org.kie.kogito.process.ProcessInstance.STATE_COMPLETED);
 
     }
 
@@ -1338,17 +1380,20 @@ public class FlowTest extends JbpmBpmn2TestCase {
 
     @Test
     public void testConditionalFlow() throws Exception {
-        System.setProperty("jbpm.enable.multi.con", "true");
-        String processId = "designer.conditional-flow";
-
-        kruntime = 
createKogitoProcessRuntime("BPMN2-ConditionalFlowWithoutGateway.bpmn2");
-
-        KogitoProcessInstance wpi = kruntime.startProcess(processId);
-
-        assertProcessInstanceFinished(wpi, kruntime);
-        assertNodeTriggered(wpi.getStringId(), "start", "script", "end1");
-        System.clearProperty("jbpm.enable.multi.con");
+        Application app = ProcessTestHelper.newApplication();
+        EventTrackerProcessListener listener = new 
EventTrackerProcessListener();
+        ProcessTestHelper.registerProcessEventListener(app, listener);
+        org.kie.kogito.process.Process<ConditionalFlowWithoutGatewayModel> 
definition = ConditionalFlowWithoutGatewayProcess.newProcess(app);
+        
org.kie.kogito.process.ProcessInstance<ConditionalFlowWithoutGatewayModel> 
instance = definition.createInstance(definition.createModel());
+        instance.start();
 
+        
assertThat(instance.status()).isEqualTo(org.kie.kogito.process.ProcessInstance.STATE_COMPLETED);
+        assertThat(listener.tracked())
+                .anyMatch(ProcessTestHelper.triggered("start"))
+                .anyMatch(ProcessTestHelper.triggered("script"))
+                .anyMatch(ProcessTestHelper.triggered("end1"));
+        assertThat(listener.tracked())
+                .noneMatch(ProcessTestHelper.triggered("end2"));
     }
 
     @Test
@@ -1380,9 +1425,13 @@ public class FlowTest extends JbpmBpmn2TestCase {
 
     @Test
     public void testExclusiveSplitDefaultNoCondition() throws Exception {
-        kruntime = 
createKogitoProcessRuntime("BPMN2-ExclusiveSplitDefaultNoCondition.bpmn2");
-        KogitoProcessInstance processInstance = 
kruntime.startProcess("com.sample.test");
-        assertProcessInstanceFinished(processInstance, kruntime);
+        Application app = ProcessTestHelper.newApplication();
+        org.kie.kogito.process.Process<ExclusiveSplitDefaultNoConditionModel> 
definition = ExclusiveSplitDefaultNoConditionProcess.newProcess(app);
+        
org.kie.kogito.process.ProcessInstance<ExclusiveSplitDefaultNoConditionModel> 
instance = definition.createInstance(definition.createModel());
+
+        instance.start();
+
+        
assertThat(instance.status()).isEqualTo(org.kie.kogito.process.ProcessInstance.STATE_COMPLETED);
     }
 
     @Test
diff --git 
a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StandaloneBPMNProcessTest.java 
b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StandaloneBPMNProcessTest.java
index c121852e5d..2e0093de5e 100755
--- 
a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StandaloneBPMNProcessTest.java
+++ 
b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StandaloneBPMNProcessTest.java
@@ -204,18 +204,6 @@ public class StandaloneBPMNProcessTest extends 
JbpmBpmn2TestCase {
         
assertThat(processInstance.getState()).isEqualTo(KogitoProcessInstance.STATE_COMPLETED);
     }
 
-    @Test
-    public void testExclusiveSplitDefault() throws Exception {
-        kruntime = 
createKogitoProcessRuntime("BPMN2-ExclusiveSplitDefault.bpmn2");
-
-        kruntime.getKogitoWorkItemManager().registerWorkItemHandler("Email", 
new SystemOutWorkItemHandler());
-        Map<String, Object> params = new HashMap<>();
-        params.put("x", "NotFirst");
-        params.put("y", "Second");
-        KogitoProcessInstance processInstance = 
kruntime.startProcess("ExclusiveSplitDefault", params);
-        
assertThat(processInstance.getState()).isEqualTo(KogitoProcessInstance.STATE_COMPLETED);
-    }
-
     @Test
     public void testInclusiveSplit() throws Exception {
         kruntime = 
createKogitoProcessRuntime("org/jbpm/bpmn2/flow/BPMN2-InclusiveSplit.bpmn2");
@@ -226,16 +214,6 @@ public class StandaloneBPMNProcessTest extends 
JbpmBpmn2TestCase {
         
assertThat(processInstance.getState()).isEqualTo(KogitoProcessInstance.STATE_COMPLETED);
     }
 
-    @Test
-    public void testInclusiveSplitDefault() throws Exception {
-        kruntime = 
createKogitoProcessRuntime("BPMN2-InclusiveSplitDefault.bpmn2");
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("x", -5);
-        KogitoProcessInstance processInstance = 
kruntime.startProcess("InclusiveSplitDefault", params);
-        
assertThat(processInstance.getState()).isEqualTo(KogitoProcessInstance.STATE_COMPLETED);
-    }
-
     @Test
     @Disabled
     public void testExclusiveSplitXPath() throws Exception {
diff --git a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StartEventTest.java 
b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StartEventTest.java
index b85d0b41ef..a5bd46317d 100755
--- a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StartEventTest.java
+++ b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StartEventTest.java
@@ -29,13 +29,18 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.jbpm.bpmn2.event.ConditionalStartModel;
+import org.jbpm.bpmn2.event.ConditionalStartProcess;
 import org.jbpm.bpmn2.objects.NotAvailableGoodsReport;
 import org.jbpm.bpmn2.objects.Person;
 import org.jbpm.bpmn2.objects.TestWorkItemHandler;
 import org.jbpm.bpmn2.start.SignalStartWithTransformationModel;
 import org.jbpm.bpmn2.start.SignalStartWithTransformationProcess;
+import org.jbpm.process.instance.impl.demo.SystemOutWorkItemHandler;
 import org.jbpm.test.util.NodeLeftCountDownProcessEventListener;
+import org.jbpm.test.utils.EventTrackerProcessListener;
 import org.jbpm.test.utils.ProcessTestHelper;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.kie.api.KieServices;
 import org.kie.api.builder.KieRepository;
@@ -57,10 +62,13 @@ import static 
org.assertj.core.api.Assertions.assertThatExceptionOfType;
 public class StartEventTest extends JbpmBpmn2TestCase {
 
     @Test
+    @Disabled
     public void testConditionalStart() throws Exception {
-        kruntime = createKogitoProcessRuntime("BPMN2-ConditionalStart.bpmn2");
-        final List<String> startedInstances = new ArrayList<>();
-        kruntime.getProcessEventManager().addEventListener(new 
DefaultKogitoProcessEventListener() {
+        Application app = ProcessTestHelper.newApplication();
+        List<String> startedInstances = new ArrayList<>();
+        EventTrackerProcessListener listener = new 
EventTrackerProcessListener();
+        ProcessTestHelper.registerProcessEventListener(app, listener);
+        ProcessTestHelper.registerProcessEventListener(app, new 
DefaultKogitoProcessEventListener() {
 
             @Override
             public void afterProcessStarted(ProcessStartedEvent event) {
@@ -68,17 +76,20 @@ public class StartEventTest extends JbpmBpmn2TestCase {
             }
 
         });
+        ProcessTestHelper.registerHandler(app, "Email", new 
SystemOutWorkItemHandler());
+        org.kie.kogito.process.Process<ConditionalStartModel> definition = 
ConditionalStartProcess.newProcess(app);
+
         Person person = new Person();
         person.setName("jack");
-        kruntime.getKieSession().insert(person);
-        assertThat(startedInstances).isEmpty();
 
-        person = new Person();
-        person.setName("john");
-        kruntime.getKieSession().insert(person);
+        definition.send(Sig.of("Conditional", person));
+
         assertThat(startedInstances).hasSize(1);
 
-        assertNodeTriggered(startedInstances.get(0), "StartProcess", "Hello", 
"EndProcess");
+        assertThat(listener.tracked())
+                .anyMatch(ProcessTestHelper.triggered("StartProcess"))
+                .anyMatch(ProcessTestHelper.triggered("Hello"))
+                .anyMatch(ProcessTestHelper.triggered("EndProcess"));
     }
 
     @Test
diff --git 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ConditionalFlowWithoutGateway.bpmn2 
b/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/test/resources/unit/project/src/main/bpmn/BPMN2-ConditionalFlowWithoutGateway.bpmn2
similarity index 88%
rename from 
jbpm/jbpm-tests/src/test/resources/BPMN2-ConditionalFlowWithoutGateway.bpmn2
rename to 
jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/test/resources/unit/project/src/main/bpmn/BPMN2-ConditionalFlowWithoutGateway.bpmn2
index f6816308fa..63a64e43fa 100755
--- 
a/jbpm/jbpm-tests/src/test/resources/BPMN2-ConditionalFlowWithoutGateway.bpmn2
+++ 
b/jbpm/jbpm-tools/jbpm-tools-maven-plugin/src/test/resources/unit/project/src/main/bpmn/BPMN2-ConditionalFlowWithoutGateway.bpmn2
@@ -18,9 +18,19 @@
   ~ under the License.
   -->
 
-<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns="http://www.omg.org/bpmn20"; 
xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL"; 
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"; 
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"; 
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"; 
xmlns:drools="http://www.jboss.org/drools"; id="_OSAkwHM-EeGROt7AmBKBUg" 
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" 
targetNamespace="http:/ [...]
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
+xmlns="http://www.omg.org/bpmn20";
+ xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL"; 
+ xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"; 
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"; 
+ xmlns:di="http://www.omg.org/spec/DD/20100524/DI"; 
xmlns:drools="http://www.jboss.org/drools"; id="_OSAkwHM-EeGROt7AmBKBUg" 
+ xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" 
targetNamespace="http://www.omg.org/bpmn20";>
   <bpmn2:itemDefinition id="_xItem" structureRef="Integer"/>
-  <bpmn2:process id="designer.conditional-flow" 
drools:packageName="org.jboss.qa.brms.jbpm.functional.bpmn2.designer" 
name="conditional-flow" isExecutable="true">
+  <bpmn2:process id="ConditionalFlowWithoutGateway" 
drools:packageName="org.jbpm.bpmn2.flow" name="conditional-flow" 
isExecutable="true">
+    <bpmn2:extensionElements>
+        <drools:metaData name="jbpm.enable.multi.con">
+            <drools:metaValue><![CDATA[true]]></drools:metaValue>
+        </drools:metaData>
+    </bpmn2:extensionElements>
     <bpmn2:property id="x" itemSubjectRef="_xItem"/>
     <bpmn2:startEvent id="_CF9831F9-AFE1-4F57-86C4-662C73090C42" 
drools:bgcolor="#ffffff" name="start">
       <bpmn2:outgoing>_1897CC4D-9026-42F4-A3E9-663EBD1B00F3</bpmn2:outgoing>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to