diff --git a/Workshops/EventDrivenArchitecture/05-Consistency/05-Consistency.csproj b/Workshops/EventDrivenArchitecture/05-Consistency/05-Consistency.csproj
new file mode 100644
index 00000000..d966d3e3
--- /dev/null
+++ b/Workshops/EventDrivenArchitecture/05-Consistency/05-Consistency.csproj
@@ -0,0 +1,26 @@
+
+
+
+ net8.0
+ Consistency
+ enable
+ enable
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers
+
+
+
+
diff --git a/Workshops/EventDrivenArchitecture/05-Consistency/Core/CommandBus.cs b/Workshops/EventDrivenArchitecture/05-Consistency/Core/CommandBus.cs
new file mode 100644
index 00000000..94e2aed7
--- /dev/null
+++ b/Workshops/EventDrivenArchitecture/05-Consistency/Core/CommandBus.cs
@@ -0,0 +1,33 @@
+using System.Collections.Concurrent;
+
+namespace Consistency.Core;
+
+public class CommandBus
+{
+ public async ValueTask Send(object[] commands, CancellationToken ct)
+ {
+ foreach (var command in commands)
+ {
+ if (!commandHandlers.TryGetValue(command.GetType(), out var handler))
+ continue;
+
+ foreach (var middleware in middlewares)
+ middleware(command);
+
+ await handler(command, ct);
+ }
+ }
+
+ public CommandBus Handle(Func eventHandler)
+ {
+ commandHandlers[typeof(T)] = (command, ct) => eventHandler((T)command, ct);
+
+ return this;
+ }
+
+ public void Use(Action