diff --git a/TelegramBotBase/MessageLoops/MiddlewareBaseMessageLoop.cs b/TelegramBotBase/MessageLoops/MiddlewareBaseMessageLoop.cs
new file mode 100644
index 0000000..13c19f7
--- /dev/null
+++ b/TelegramBotBase/MessageLoops/MiddlewareBaseMessageLoop.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using TelegramBotBase.Args;
+using TelegramBotBase.Base;
+using TelegramBotBase.Interfaces;
+using TelegramBotBase.Sessions;
+
+namespace TelegramBotBase.MessageLoops;
+
+///
+/// This message loop based on middleware pattern
+///
+public sealed class MiddlewareBaseMessageLoop : IMessageLoopFactory
+{
+ private List, Task>> Middlewares = new();
+
+ public event EventHandler UnhandledCall;
+
+ public async Task MessageLoop(BotBase bot, DeviceSession session, UpdateResult ur, MessageResult mr)
+ {
+ ur.Device = session;
+ mr.Device = session;
+
+ var messageContainer = new MessageContainer(bot, session, ur, mr);
+
+ if (Middlewares.Any())
+ {
+ int middlewareIndex = 0;
+
+ await InvokeMiddleware(messageContainer, middlewareIndex);
+ }
+ }
+
+ ///
+ /// Invokes middleware with index
+ ///
+ private async Task InvokeMiddleware(MessageContainer messageContainer, int middlewareIndex)
+ {
+ await Middlewares[middlewareIndex]
+ .Invoke(messageContainer, async () =>
+ {
+ int nextMiddlewareIndex = middlewareIndex + 1;
+ if (nextMiddlewareIndex < Middlewares.Count)
+ {
+ await InvokeMiddleware(messageContainer, nextMiddlewareIndex);
+ }
+ });
+ }
+
+ ///
+ /// Adds a new middleware
+ ///
+ public void AddMiddleware(Func, Task> middleware)
+ {
+ Middlewares.Add(middleware);
+ }
+}
+
+public struct MessageContainer
+{
+ public BotBase BotBase { get; private set; }
+ public DeviceSession DeviceSession { get; private set; }
+ public UpdateResult UpdateResult { get; private set; }
+ public MessageResult MessageResult { get; private set; }
+
+ public MessageContainer(BotBase botBase, DeviceSession deviceSession, UpdateResult updateResult, MessageResult messageResult)
+ {
+ BotBase = botBase;
+ DeviceSession = deviceSession;
+ UpdateResult = updateResult;
+ MessageResult = messageResult;
+ }
+}
\ No newline at end of file