diff --git a/SkywardHub.pro b/SkywardHub.pro
index bdbd651b3d965b1785949f1ee0d5e47afbc178e1..4ac360988926cc0f458ab24622966b477dced6e2 100644
--- a/SkywardHub.pro
+++ b/SkywardHub.pro
@@ -150,7 +150,6 @@ FORMS += \
     src/shared/Modules/MainWindow/Window.ui \
     src/shared/Components/ModulesPicker/ModulesPicker.ui \
     src/shared/Components/SaveConfigurationDialog/SaveConfigurationDialog.ui \
-    src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.ui \
 
 # Default rules for deployment.
 qnx: target.path = /tmp/$${TARGET}/bin
diff --git a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.cpp b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.cpp
index 36f2c8eed5d9d88b99f59d7b5228171b5f27a6d5..8c47e7c1b74becf6729544bfb80188aefc4a1f32 100644
--- a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.cpp
+++ b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.cpp
@@ -18,41 +18,168 @@
 
 #include "RefuelingVisualizer.h"
 
-#include <Core/ModulesManager/ModulesManager.h>
+#include <Components/FilterSelector/FilterSelector.h>
+#include <Core/MessageBroker/MessageBroker.h>
 
-#include <QAction>
-#include <QMessageBox>
-#include <QPoint>
-
-#include "Components/ContextMenuSeparator/ContextMenuSeparator.h"
-#include "ui_RefuelingVisualizer.h"
-
-RefuelingVisualizer::RefuelingVisualizer()
-    : DefaultModule(), ui(new Ui::RefuelingVisualizer)
+RefuelingVisualizer::RefuelingVisualizer(QWidget* parent)
+    : DefaultModule(parent)
 {
-    ui->setupUi(this);
+    setupUi();
     defaultContextMenuSetup();
-    connectUiSlots();
 }
 
-RefuelingVisualizer::~RefuelingVisualizer() { delete ui; }
-
-void RefuelingVisualizer::connectUiSlots()
+RefuelingVisualizer::~RefuelingVisualizer()
 {
-    connect(ui->selectPanel_button, &QPushButton::clicked, this,
-            &RefuelingVisualizer::onSelectPanelClick);
+    getCore()->getMessageBroker()->unsubscribe(filter, this);
 }
 
-void RefuelingVisualizer::onSelectPanelClick() { onReplaceClicked(); }
-
 QWidget* RefuelingVisualizer::toWidget() { return this; }
 
 XmlObject RefuelingVisualizer::toXmlObject()
 {
-    return XmlObject(getName(ModuleId::EMPTY));
+    XmlObject obj(getName(ModuleId::REFUELING_VISUALIZER));
+
+    obj.addAttribute("filter", filter.toString());
+
+    return obj;
 }
 
 void RefuelingVisualizer::fromXmlObject(const XmlObject& xmlObject)
 {
-    Q_UNUSED(xmlObject);
+    if (xmlObject.getObjectName() == getName(ModuleId::REFUELING_VISUALIZER))
+    {
+        auto filter = Filter::fromString(xmlObject.getAttribute("filter"));
+        setFilter(filter);
+    }
+}
+
+void RefuelingVisualizer::setupUi()
+{
+    outerLayout = new QHBoxLayout;
+    outerLayout->setContentsMargins(0, 0, 0, 0);
+    outerLayout->setSpacing(0);
+
+    for (auto labelText : RefuelingVisualizerCommandList::commandLabels)
+    {
+        QLabel* label = new QLabel;
+        label->setText(labelText);
+        label->setAlignment(Qt::AlignCenter);
+        label->setContentsMargins(4, 4, 4, 4);
+        outerLayout->addWidget(label);
+    }
+
+    setLayout(outerLayout);
+}
+
+void RefuelingVisualizer::addCustomActionsToMenu()
+{
+    QAction* action = new QAction("Choose topic and field");
+    connect(action, &QAction::triggered, this,
+            &RefuelingVisualizer::onConfigureClicked);
+
+    addActionToMenu(action);
+}
+
+void RefuelingVisualizer::onConfigureClicked()
+{
+    FilterSelector::selectFilter(
+        filter, [this](const Filter& newFilter) { setFilter(newFilter); });
+}
+
+void RefuelingVisualizer::setFilter(const Filter& newFilter)
+{
+    getCore()->getMessageBroker()->unsubscribe(filter, this);
+    getCore()->getMessageBroker()->subscribe(
+        newFilter, this,
+        [this](const Message& message, const Filter& filter)
+        { onMsgReceived(message); });
+    filter = newFilter;
+}
+
+void RefuelingVisualizer::onMsgReceived(const Message& msg)
+{
+    uint64_t release = msg.getField("release_vlave_state").getUnsignedInteger();
+    uint64_t filling = msg.getField("filling_valve_state").getUnsignedInteger();
+    uint64_t venting = msg.getField("venting_valve_state").getUnsignedInteger();
+
+    QString baseStyle =
+        "border-bottom-width:1px;border-left-width:1px;border-top-width:"
+        "1px;border-radius:0;";
+    QString completedStyle = "background-color:green;" + baseStyle;
+    QString errorStyle     = "background-color:red;" + baseStyle;
+
+    if (release == 1)
+    {
+        auto label = outerLayout->itemAt(1)->widget();
+        label->setStyleSheet(completedStyle);
+    }
+    else
+    {
+        auto label = outerLayout->itemAt(1)->widget();
+        label->setStyleSheet(errorStyle);
+    }
+
+    if (filling == 1)
+    {
+        auto label = outerLayout->itemAt(0)->widget();
+        label->setStyleSheet(completedStyle);
+    }
+    else
+    {
+        auto label = outerLayout->itemAt(0)->widget();
+        label->setStyleSheet(errorStyle);
+    }
+
+    if (venting == 1)
+    {
+        auto label = outerLayout->itemAt(2)->widget();
+        label->setStyleSheet(completedStyle);
+    }
+    else
+    {
+        auto label = outerLayout->itemAt(2)->widget();
+        label->setStyleSheet(errorStyle);
+    }
+
+    // StatesList::State state =
+    //     static_cast<StatesList::State>(field.getUnsignedInteger());
+
+    // if (state == StatesList::State::INVALID)
+    //     return;
+
+    // if (state != currentState)
+    // {
+    //     currentState = static_cast<StatesList::State>(state);
+
+    //     QString baseStyle =
+    //         "border-bottom-width:1px;border-left-width:1px;border-top-width:"
+    //         "1px;border-radius:0;";
+    //     QString currentStateStyle =
+    //         "background-color:yellow; color:black;" + baseStyle;
+    //     QString completedStyle = "background-color:green;" + baseStyle;
+    //     QString errorStyle     = "background-color:red;" + baseStyle;
+
+    //     int index  = StatesList::statesIndexes[currentState];
+    //     auto label = outerLayout->itemAt(index)->widget();
+
+    //     if (currentState == StatesList::State::INIT_ERROR)
+    //         label->setStyleSheet(errorStyle);
+    //     else
+    //         label->setStyleSheet(currentStateStyle);
+
+    //     // Set as completed every state before the current
+    //     for (int i = index - 1; i >= 0; i--)
+    //         outerLayout->itemAt(i)->widget()->setStyleSheet(completedStyle);
+
+    //     // Reset every state after the current
+    //     for (int i = index + 1; i < StatesList::statesLabels.count(); i++)
+    //         outerLayout->itemAt(i)->widget()->setStyleSheet(baseStyle);
+
+    //     auto tmp = outerLayout->itemAt(StatesList::statesLabels.count() - 1)
+    //                    ->widget()
+    //                    ->styleSheet();
+    //     outerLayout->itemAt(StatesList::statesLabels.count() - 1)
+    //         ->widget()
+    //         ->setStyleSheet(tmp + "border-right-width:1px;");
+    // }
 }
diff --git a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.h b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.h
index bfcade2df5a4b134ccb558596f169499b84d4116..d27b9c175595eb5127e8288b88fa595b331ccc75 100644
--- a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.h
+++ b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.h
@@ -18,37 +18,37 @@
 
 #pragma once
 
-#include <Core/Module/Module.h>
+#include <Core/Message/Filter.h>
+#include <Core/Message/Message.h>
 #include <Modules/DefaultModule/DefaultModule.h>
 
-#include <QMenu>
-#include <QSharedPointer>
+#include <QLabel>
 #include <QWidget>
 
-namespace Ui
-{
-class RefuelingVisualizer;
-}
+#include "RefuelingVisualizerCommandList.h"
 
 class RefuelingVisualizer : public DefaultModule
 {
     Q_OBJECT
 
 public:
-    explicit RefuelingVisualizer();
-    ~RefuelingVisualizer() override;
+    explicit RefuelingVisualizer(QWidget* parent = nullptr);
+    ~RefuelingVisualizer();
 
     QWidget* toWidget() override;
 
     XmlObject toXmlObject() override;
     void fromXmlObject(const XmlObject& xmlObject) override;
 
-protected:
-    void connectUiSlots();
+private:
+    void setupUi();
+    void addCustomActionsToMenu() override;
+    void onConfigureClicked();
+    void setFilter(const Filter& filter);
+    void onMsgReceived(const Message& msg);
 
-protected slots:
-    void onSelectPanelClick();
+    QHBoxLayout* outerLayout;
 
-private:
-    Ui::RefuelingVisualizer* ui;
+    Filter filter;
+    RefuelingVisualizerCommandList::Valve currentState;
 };
diff --git a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.ui b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.ui
deleted file mode 100644
index 03de792d38230110f162c68e665c517c4df7a5ef..0000000000000000000000000000000000000000
--- a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.ui
+++ /dev/null
@@ -1,95 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>RefuelingVisualizer</class>
- <widget class="QWidget" name="RefuelingVisualizer">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>448</width>
-    <height>233</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="1" column="0">
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>This is an Empty panel.
-In order to select a panel click the following button</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="0">
-    <layout class="QHBoxLayout" name="horizontalLayout">
-     <item>
-      <spacer name="horizontalSpacer">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QPushButton" name="selectPanel_button">
-       <property name="text">
-        <string>Select Panel</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <spacer name="horizontalSpacer_2">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-    </layout>
-   </item>
-   <item row="0" column="0">
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>40</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="4" column="0">
-    <spacer name="verticalSpacer_2">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>40</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizerCommandList.h b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizerCommandList.h
new file mode 100644
index 0000000000000000000000000000000000000000..1aa4977714165bd325d250292c32845249cda1e8
--- /dev/null
+++ b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizerCommandList.h
@@ -0,0 +1,50 @@
+/*
+ * This file is part of Skyward Hub.
+ *
+ * Skyward Hub is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * Skyward Hub is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * Skyward Hub. If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+#pragma once
+
+#include <QList>
+#include <QMap>
+#include <QString>
+
+namespace RefuelingVisualizerCommandList
+{
+
+// Valves
+enum class Valve : int
+{
+    FILLING = 0,
+    RELEASE,
+    VENTING,
+};
+
+// Groundstation labels
+static const QList<QString> commandLabels{
+    "FILLING",
+    "RELEASE",
+    "VENTING",
+};
+
+// Map from rocket states to groundstation labels
+static const QMap<Valve, int> valvesIndexes{
+    {Valve::FILLING, 0},
+    {Valve::RELEASE, 1},
+    {Valve::VENTING, 2},
+};
+
+}  // namespace RefuelingVisualizerCommandList
\ No newline at end of file