diff --git a/src/dashboard/Synapse.Dashboard/Services/WorkflowGraphBuilder.cs b/src/dashboard/Synapse.Dashboard/Services/WorkflowGraphBuilder.cs
index 8f332508..db358e98 100644
--- a/src/dashboard/Synapse.Dashboard/Services/WorkflowGraphBuilder.cs
+++ b/src/dashboard/Synapse.Dashboard/Services/WorkflowGraphBuilder.cs
@@ -143,7 +143,7 @@ protected virtual void BuildTransitions(INodeViewModel node, TaskNodeRenderingCo
         while (!string.IsNullOrWhiteSpace(nextTask?.Definition?.If))
         {
             this.Logger.LogTrace("[WorkflowGraphBuilder.BuildTransitions][{nodeId}] if clause found, looking up next task.", node.Id);
-            nextTask = this.GetNextTask(context.TasksList, nextTask.Name);
+            nextTask = this.GetNextTask(context.TasksList, nextTask.Name, FlowDirective.Continue);
             transitions.Add(nextTask);
             this.Logger.LogTrace("[WorkflowGraphBuilder.BuildTransitions][{nodeId}] found transition to '{nextTaskName}'", node.Id, nextTask?.Name);
         }
@@ -214,7 +214,7 @@ protected INodeViewModel BuildTaskNode(TaskNodeRenderingContext context)
             SwitchTaskDefinition => this.BuildSwitchTaskNode(context.OfType<SwitchTaskDefinition>()),
             TryTaskDefinition => this.BuildTryTaskNode(context.OfType<TryTaskDefinition>()),
             WaitTaskDefinition => this.BuildWaitTaskNode(context.OfType<WaitTaskDefinition>()),
-            _ => throw new NotSupportedException($"The specified task type '{context.TaskDefinition?.GetType()}' is not supported")
+            _ => throw new NotSupportedException($"The specified task type '{context.TaskDefinition?.GetType()}' is not supported. (reference: '{context.TaskReference}')")
         } ?? throw new Exception($"Unable to define a last node for task '{context.TaskName}'");
     }
 
@@ -259,7 +259,8 @@ protected virtual NodeViewModel BuildCallTaskNode(TaskNodeRenderingContext<CallT
                     break;
                 }
             default:
-                callType = context.TaskDefinition.Call.ToLower();
+                callType = "custom-function";
+                content = context.TaskDefinition.Call.ToLower();
                 break;
         }
         var node = new CallTaskNodeViewModel(context.TaskReference, context.TaskName!, content, callType);
@@ -482,8 +483,19 @@ protected virtual NodeViewModel BuildSwitchTaskNode(TaskNodeRenderingContext<Swi
         foreach (var switchCase in context.TaskDefinition.Switch)
         {
             var switchCaseTask = this.GetNextTask(context.TasksList, context.TaskName, switchCase.Value.Then)!;
-            var switchCaseNode = this.BuildTaskNode(new(context.Workflow, context.Graph, context.TasksList, switchCaseTask.Index, switchCaseTask.Name, switchCaseTask.Definition, context.TaskGroup, context.ParentReference, context.ParentContext, context.EntryNode, context.ExitNode));
-            this.BuildEdge(context.Graph, this.GetNodeAnchor(node, NodePortType.Exit), GetNodeAnchor(switchCaseNode, NodePortType.Entry));
+            if (switchCaseTask.Index != -1)
+            {
+                var switchCaseNode = this.BuildTaskNode(new(context.Workflow, context.Graph, context.TasksList, switchCaseTask.Index, switchCaseTask.Name, switchCaseTask.Definition, context.TaskGroup, context.ParentReference, context.ParentContext, context.EntryNode, context.ExitNode));
+                this.BuildEdge(context.Graph, this.GetNodeAnchor(node, NodePortType.Exit), GetNodeAnchor(switchCaseNode, NodePortType.Entry));
+            }
+            else if (switchCaseTask.Name == FlowDirective.Exit)
+            {
+                this.BuildEdge(context.Graph, this.GetNodeAnchor(node, NodePortType.Exit), context.ExitNode);
+            }
+            else if (switchCaseTask.Name == FlowDirective.End)
+            {
+                this.BuildEdge(context.Graph, this.GetNodeAnchor(node, NodePortType.Exit), context.Graph.AllNodes.Skip(1).First().Value);
+            }
         }
         if (!context.TaskDefinition.Switch.Any(switchCase => string.IsNullOrEmpty(switchCase.Value.When)))
         {
diff --git a/src/dashboard/Synapse.Dashboard/wwwroot/index.html b/src/dashboard/Synapse.Dashboard/wwwroot/index.html
index 8c8d94c6..7bf82812 100644
--- a/src/dashboard/Synapse.Dashboard/wwwroot/index.html
+++ b/src/dashboard/Synapse.Dashboard/wwwroot/index.html
@@ -148,6 +148,14 @@
                 </g>
                 <path d="m28 1.6c-1.4-1.4-3.6-1.4-5 0-1 1.1-1.3 2.7-0.6 4l-7.7 7.7c-1.3-0.7-2.9-0.5-4 0.6-1.4 1.4-1.4 3.6 0 5 1.4 1.3 3.6 1.3 5 0 1-1.1 1.3-2.7 0.6-4.1l7.7-7.6c1.3 0.7 2.9 0.4 4-0.7 1.4-1.3 1.4-3.5 0-4.9z" />
             </svg>
+
+            <!--- from https://www.svgrepo.com/svg/479272/function-1 -->
+            <svg id="custom-function-symbol" viewBox="0 0 30 30">
+                <g>
+                    <path d="m15.1 13.9h-2.9c0.1-1 0.3-2 0.4-2.8 0.5-2.6 1.1-5.2 1.7-6.1 0.7-1 2.1-0.6 2.6 0.8 0.3 0.8 1.1 1.3 2 1.2 1.2-0.1 2.1-1.1 2-2.2 0-0.6-0.5-1.4-1.2-1.8-1-0.5-2.2-0.8-3.4-0.8-3.1 0.2-5.5 2.8-6.4 5.8-0.3 1.1-0.8 3.5-1.3 5.9h-3.4l-0.5 2.1h3.5c-0.3 1.5-0.5 2.8-0.6 3.5-0.5 2-1 5.7-2.9 5.9-0.8-0.3-1.1-0.6-1.4-0.9-0.3-0.4-0.9-0.6-1.5-0.6-1.1 0.1-1.9 1-1.8 2 0.1 1.1 1 1.7 2 1.8 5.9 0.5 8.1-3.7 9-7.2 0.1-0.8 0.5-2.6 0.8-4.5h2.8z" />
+                    <path d="m29.6 21.3c-0.4 0-0.8 0.2-0.7 0.6 0.2 1.4-1.4 2.1-2.8 2-2-0.2-2.6-2.3-3.3-4.4q0-0.2-0.1-0.3c0.4-0.7 0.8-1.4 1.1-1.9 0.7-1.2 1.5-2.4 1.9-2.7 0 0 1.1-0.6 1.1 0.9 0 0.4 0.3 0.8 0.7 0.9 0.6 0.2 1.2-0.1 1.4-0.7 0.1-0.3 0-0.8-0.3-1.1-0.4-0.4-1.1-0.8-1.7-1-1.5-0.5-3.1 0.3-4 1.6-0.3 0.3-0.6 0.8-1 1.4-0.5-1.5-1.1-2.7-2.2-3.1-2.5-0.9-3.9 1.1-3.9 1.7 0 0.7 2.1-0.3 3.1 2.3 0.4 0.9 0.7 1.7 1 2.5-0.5 0.8-1.1 1.8-1.4 2.4-0.7 1.2-1.5 2.4-1.9 2.7-0.5 0.4-1.1-0.1-1.1-0.9 0-0.4-0.3-0.7-0.7-0.9-0.6-0.1-1.2 0.2-1.4 0.8-0.1 0.2 0 0.7 0.3 1 0.4 0.4 1.1 0.9 1.7 1.1 1.5 0.4 3.1-0.4 4-1.7 0.3-0.4 0.8-1.2 1.4-2.1q0.1 0.3 0.2 0.6c0.9 2.4 2.8 3.6 5 3.3 3-0.4 3.9-3.4 4-4.6 0 0-0.1-0.4-0.4-0.4z" />
+                </g>
+            </svg>
             <!-- from https://www.svgrepo.com/svg/435631/exception -->
             <svg id="raise-symbol" viewBox="0 0 30 30">
                 <path fill-rule="evenodd" d="m27.3 10c0.6 1.6 1 3.3 1 5 0 1.8-0.4 3.5-1 5.1-0.7 1.6-1.7 3.1-2.9 4.3-3.8 3.7-9.4 4.8-14.3 2.8-4.9-2.1-8.1-6.9-8.1-12.2 0-5.2 3.2-10 8.1-12.1 4.9-2 10.5-0.9 14.3 2.8 1.2 1.2 2.2 2.7 2.9 4.3zm-10.7 10.8h-3.2v3.2h3.2zm0.3-14.8h-3.8l0.3 11.3h3.2z" />