diff --git a/Modules/IncomingMessagesViewer/incomingmessagesviewermodule.cpp b/Modules/IncomingMessagesViewer/incomingmessagesviewermodule.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3b546954e00681db7a5f61d096a524f6d325ef78
--- /dev/null
+++ b/Modules/IncomingMessagesViewer/incomingmessagesviewermodule.cpp
@@ -0,0 +1,106 @@
+#include <QHBoxLayout>
+
+#include "incomingmessagesviewermodule.h"
+#include "Components/SubscriptionsPanel/subscriptionspanel.h"
+
+IncomingMessagesViewerModule::IncomingMessagesViewerModule(QWidget* parent) : DefaultModule(parent) {
+    setupUi();
+    defaultContextMenuSetup();
+
+    getCore()->getModuleMessagesBroker()->subscribe({"*"}, this, [this](const ModuleMessage & msg) {
+        MessageField value;
+        for(auto it = filters.begin(); it != filters.end(); ++it) {
+            if(it->matchMessage(msg, value)) {
+                if(clearEveryMessage) {
+                    edit->setText("");
+                }
+
+                QString old = edit->toPlainText();
+                edit->setText(QTime::currentTime().toString("hh.mm.ss") + " ["
+                              + msg.getTopic().toString() + (it->isFullFilter() ? (QString(".") + it->getFieldName()) : "")
+                              + "]: " + value.getString() + "\n" + old);
+            }
+        }
+    });
+}
+
+IncomingMessagesViewerModule::~IncomingMessagesViewerModule() {
+    getCore()->getModuleMessagesBroker()->unsubscribe({"*"}, this);
+}
+
+QWidget* IncomingMessagesViewerModule::toWidget() {
+    return this;
+}
+
+XmlObject IncomingMessagesViewerModule::toXmlObject() {
+    XmlObject obj(getName(ModuleId::INCOMINGMESSAGESVIEWER));
+    obj.addAttribute("clearEveryMessage", clearEveryMessage ? "1" : "0");
+
+    for(int i = 0; i < filters.count(); i++) {
+        XmlObject subscription("Subscription");
+        subscription.addAttribute("Value", filters[i].toString());
+        obj.addChild(subscription);
+    }
+
+    return obj;
+}
+
+void IncomingMessagesViewerModule::fromXmlObject(const XmlObject& xmlObject) {
+    clearEveryMessage = xmlObject.getAttribute("clearEveryMessage") == "1";
+
+    for(int i = 0; i < xmlObject.childCount(); i++) {
+        XmlObject child = xmlObject.childAt(i);
+        if(child.getObjectName() == "Subscription") {
+            auto subscription = TopicAndFieldFilter::fromStringUnsafe(child.getAttribute("Value"));
+            addSubscription(subscription);
+        }
+    }
+}
+
+void IncomingMessagesViewerModule::addSubscription(const TopicAndFieldFilter& filter) {
+    filters.append(filter);
+}
+
+void IncomingMessagesViewerModule::removeSubscription(const TopicAndFieldFilter& filter) {
+    filters.removeAll(filter);
+}
+
+void IncomingMessagesViewerModule::addCustomActionsToMenu() {
+    QAction* clear = new QAction("Clear");
+    connect(clear, &QAction::triggered, this, [this]() {
+        edit->clear();
+    });
+
+    QAction* manage = new QAction("Manage subscriptions");
+    connect(manage, &QAction::triggered, this, [this]() {
+        auto* panel = new SubscriptionsPanel(&filters);
+        panel->setWindowTitle("IncomingMessagesViewer subscriptions");
+        connect(panel, &SubscriptionsPanel::SubscriptionAdded, this, &IncomingMessagesViewerModule::addSubscription);
+        connect(panel, &SubscriptionsPanel::SubscriptionRemoved, this, &IncomingMessagesViewerModule::removeSubscription);
+        panel->show();
+    });
+
+    QAction* check = new QAction("Clear every message");
+    check->setCheckable(true);
+    check->setChecked(clearEveryMessage);
+    connect(check, &QAction::toggled, this, &IncomingMessagesViewerModule::setClearEveryMessage);
+
+    addActionToMenu(manage);
+    addActionToMenu(check);
+}
+
+
+void IncomingMessagesViewerModule::setClearEveryMessage(bool val) {
+    clearEveryMessage = val;
+}
+
+
+void IncomingMessagesViewerModule::setupUi() {
+    edit = new QTextEdit();
+    edit->setReadOnly(true);
+    edit->setContextMenuPolicy(Qt::ContextMenuPolicy::NoContextMenu);
+
+    QHBoxLayout* layout = new QHBoxLayout();
+    layout->addWidget(edit);
+    setLayout(layout);
+}
diff --git a/Modules/IncomingMessagesViewer/incomingmessagesviewermodule.h b/Modules/IncomingMessagesViewer/incomingmessagesviewermodule.h
new file mode 100644
index 0000000000000000000000000000000000000000..a23e75f5bd8ee3d96f45c7bcd3427eb10f981ab9
--- /dev/null
+++ b/Modules/IncomingMessagesViewer/incomingmessagesviewermodule.h
@@ -0,0 +1,33 @@
+#ifndef INCOMINGMESSAGESVIEWERMODULE_H
+#define INCOMINGMESSAGESVIEWERMODULE_H
+
+#include "Modules/DefaultModule/defaultmodule.h"
+#include "Core/Message/topicandfieldfilter.h"
+
+class IncomingMessagesViewerModule : public DefaultModule {
+    Q_OBJECT
+
+  public:
+    explicit IncomingMessagesViewerModule(QWidget* parent = nullptr);
+    ~IncomingMessagesViewerModule();
+
+    QWidget* toWidget() override;
+
+    XmlObject toXmlObject() override;
+    void fromXmlObject(const XmlObject& xmlObject) override;
+    void addCustomActionsToMenu() override;
+
+  public slots:
+    void addSubscription(const TopicAndFieldFilter& filter);
+    void removeSubscription(const TopicAndFieldFilter& filter);
+    void setClearEveryMessage(bool);
+
+  private:
+    QTextEdit* edit;
+    void setupUi();
+
+    QList<TopicAndFieldFilter> filters;
+    bool clearEveryMessage = false;
+};
+
+#endif // INCOMINGMESSAGESVIEWERMODULE_H
diff --git a/Modules/moduleinfo.h b/Modules/moduleinfo.h
index 78e2c76d279a2e7675eb660a3fa9132eee1fa0da..0e28d22080405d3e0cf672b8caba0f2ee6a94d46 100644
--- a/Modules/moduleinfo.h
+++ b/Modules/moduleinfo.h
@@ -15,6 +15,7 @@ enum ModuleId {
     GRAPH,
     TABLE,
     OUTCOMINGMESSAGEVIEWER,
+    INCOMINGMESSAGESVIEWER,
     MAVLINK,
     FSMVIEWER,
     TREEVIEWER,
diff --git a/Modules/moduleslist.cpp b/Modules/moduleslist.cpp
index 89ca2b4e2d3a0ab6480e5dcf286740d60cbc6fb5..1cf04de4c0a794433ae1e4b8f136f6f0bba98061 100644
--- a/Modules/moduleslist.cpp
+++ b/Modules/moduleslist.cpp
@@ -9,6 +9,7 @@
 #include "Modules/Test/testmodule.h"
 #include "Modules/Graph/graphmodule.h"
 #include "Modules/OutcomingMessagesViewer/outcomingmessagesviewermodule.h"
+#include "Modules/IncomingMessagesViewer/incomingmessagesviewermodule.h"
 #include "Modules/Mavlink/mavlinkmodule.h"
 #include "Modules/FileStream/filestreammodule.h"
 #include "Modules/Mavlink/mavlinkrocketmsgtestingmodule.h"
@@ -77,12 +78,21 @@ void ModulesList::createModuleList() {
 #endif
 
 #ifdef OUTCOMINGMESSAGESVIEWERMODULE_H
-    ModuleInfo msgViewer(ModuleId::OUTCOMINGMESSAGEVIEWER, "OutcomingMessagesViewer", ModuleCategory::DATAVISUAL);
-    msgViewer.setFactory([]() {
+    ModuleInfo outMsgViewer(ModuleId::OUTCOMINGMESSAGEVIEWER, "OutcomingMessagesViewer", ModuleCategory::DATAVISUAL);
+    outMsgViewer.setFactory([]() {
         return new OutcomingMessagesViewerModule();
     });
-    msgViewer.addModuleSourceFiles("Modules/OutcomingMessageViewer/");
-    addModuleInfo(msgViewer);
+    outMsgViewer.addModuleSourceFiles("Modules/OutcomingMessageViewer/");
+    addModuleInfo(outMsgViewer);
+#endif
+
+#ifdef INCOMINGMESSAGESVIEWERMODULE_H
+    ModuleInfo inMsgViewer(ModuleId::INCOMINGMESSAGESVIEWER, "IncomingMessagesViewer", ModuleCategory::DATAVISUAL);
+    inMsgViewer.setFactory([]() {
+        return new IncomingMessagesViewerModule();
+    });
+    inMsgViewer.addModuleSourceFiles("Modules/IncomingMessageViewer/");
+    addModuleInfo(inMsgViewer);
 #endif
 
 #ifdef MAVLINKMODULE_H
diff --git a/SkywardHub.pro b/SkywardHub.pro
index 50abaad49764e3a06e5dc0d1cc5b51fa6cddf7f2..0fa8eece5302c5d6fa06e994cf2d13734bad0a6b 100644
--- a/SkywardHub.pro
+++ b/SkywardHub.pro
@@ -34,6 +34,7 @@ SOURCES += \
     Modules/FileStream/filestreammodule.cpp \
     Modules/Graph/graphmodule.cpp \
     Modules/Graph/qcustomplot.cpp \
+    Modules/IncomingMessagesViewer/incomingmessagesviewermodule.cpp \
     Modules/MainWindow/skywardhubmainwindow.cpp \
     Modules/MainWindow/window.cpp \
     Modules/Mavlink/mavlinkcommandadapter.cpp \
@@ -85,6 +86,7 @@ HEADERS += \
     Modules/FileStream/filestreammodule.h \
     Modules/Graph/graphmodule.h \
     Modules/Graph/qcustomplot.h \
+    Modules/IncomingMessagesViewer/incomingmessagesviewermodule.h \
     Modules/MainWindow/skywardhubmainwindow.h \
     Modules/MainWindow/window.h \
     Modules/Mavlink/mavlinkcommandadapter.h \