diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/ExecuteStepInContext.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/ExecuteStepInContext.cs
new file mode 100644
index 0000000000..5540ba3cdf
--- /dev/null
+++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/ExecuteStepInContext.cs
@@ -0,0 +1,289 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Reflection;
+using MLAPI;
+using MLAPI.Messaging;
+using NUnit.Framework;
+using NUnit.Framework.Interfaces;
+using UnityEngine;
+using UnityEngine.TestTools;
+using Debug = UnityEngine.Debug;
+
+///
+/// Allows for context based delegate execution.
+/// Can specify where you want that lambda executed (client side? server side?) and it'll automatically wait for the end
+/// of a clientRPC server side and vice versa.
+/// todo this could be used as an in-game tool too? for protocols that require a lot of back and forth?
+///
+public class ExecuteStepInContext : CustomYieldInstruction
+{
+ public enum StepExecutionContext
+ {
+ Server,
+ Clients
+ }
+
+ [AttributeUsage(AttributeTargets.Method)]
+ public class MultiprocessContextBasedTestAttribute : NUnitAttribute, IOuterUnityTestAction
+ {
+ public IEnumerator BeforeTest(ITest test)
+ {
+ yield return new WaitUntil(() => TestCoordinator.Instance != null && HasRegistered);
+ }
+
+ public IEnumerator AfterTest(ITest test)
+ {
+ yield break;
+ }
+ }
+
+ private StepExecutionContext m_ActionContext;
+ private Action m_StepToExecute;
+ private string m_CurrentActionId;
+
+ // as a remote worker, I store all available actions so I can execute them when triggered from RPCs
+ public static Dictionary AllActions = new Dictionary();
+ private static Dictionary s_MethodIdCounter = new Dictionary();
+
+ private NetworkManager m_NetworkManager;
+ private bool m_IsRegistering;
+ private List> m_ClientIsFinishedChecks = new List>();
+ private Func m_AdditionalIsFinishedWaiter;
+
+ private bool m_WaitMultipleUpdates;
+ private bool m_IgnoreTimeoutException;
+
+ private float m_StartTime;
+ private bool isTimingOut => Time.time - m_StartTime > TestCoordinator.MaxWaitTimeoutSec;
+ private bool shouldExecuteLocally => (m_ActionContext == StepExecutionContext.Server && m_NetworkManager.IsServer) || (m_ActionContext == StepExecutionContext.Clients && !m_NetworkManager.IsServer);
+
+ public static bool IsRegistering;
+ public static bool HasRegistered;
+ private static List