diff --git a/Modules/CommandPad/commandpadmodule.ui b/Modules/CommandPad/commandpadmodule.ui
index 9730447c1935d7689dd968910072cc2f66ade627..ec9d282f47947eca67355fcb0d285d4fec0ce53d 100644
--- a/Modules/CommandPad/commandpadmodule.ui
+++ b/Modules/CommandPad/commandpadmodule.ui
@@ -302,6 +302,12 @@
             </item>
             <item>
              <widget class="QDoubleSpinBox" name="deploymentAltitude_spinBox">
+              <property name="alignment">
+               <set>Qt::AlignCenter</set>
+              </property>
+              <property name="buttonSymbols">
+               <enum>QAbstractSpinBox::NoButtons</enum>
+              </property>
               <property name="maximum">
                <double>99999.990000000005239</double>
               </property>
@@ -340,6 +346,12 @@
             </item>
             <item>
              <widget class="QDoubleSpinBox" name="refTemperature_spinBox">
+              <property name="alignment">
+               <set>Qt::AlignCenter</set>
+              </property>
+              <property name="buttonSymbols">
+               <enum>QAbstractSpinBox::NoButtons</enum>
+              </property>
               <property name="maximum">
                <double>99999.990000000005239</double>
               </property>
@@ -378,6 +390,12 @@
             </item>
             <item>
              <widget class="QDoubleSpinBox" name="referenceAltitude_spinBox">
+              <property name="alignment">
+               <set>Qt::AlignCenter</set>
+              </property>
+              <property name="buttonSymbols">
+               <enum>QAbstractSpinBox::NoButtons</enum>
+              </property>
               <property name="maximum">
                <double>99999.990000000005239</double>
               </property>
@@ -416,6 +434,12 @@
             </item>
             <item>
              <widget class="QDoubleSpinBox" name="aerobrakeAngle_spinBox">
+              <property name="alignment">
+               <set>Qt::AlignCenter</set>
+              </property>
+              <property name="buttonSymbols">
+               <enum>QAbstractSpinBox::NoButtons</enum>
+              </property>
               <property name="maximum">
                <double>99999.990000000005239</double>
               </property>
@@ -471,6 +495,12 @@
               </item>
               <item>
                <widget class="QDoubleSpinBox" name="initialOrientationYaw_spinBox">
+                <property name="alignment">
+                 <set>Qt::AlignCenter</set>
+                </property>
+                <property name="buttonSymbols">
+                 <enum>QAbstractSpinBox::NoButtons</enum>
+                </property>
                 <property name="maximum">
                  <double>99999.990000000005239</double>
                 </property>
@@ -488,6 +518,12 @@
               </item>
               <item>
                <widget class="QDoubleSpinBox" name="initialOrientationPitch_spinBox">
+                <property name="alignment">
+                 <set>Qt::AlignCenter</set>
+                </property>
+                <property name="buttonSymbols">
+                 <enum>QAbstractSpinBox::NoButtons</enum>
+                </property>
                 <property name="maximum">
                  <double>99999.990000000005239</double>
                 </property>
@@ -505,6 +541,12 @@
               </item>
               <item>
                <widget class="QDoubleSpinBox" name="initialOrientationRoll_spinBox">
+                <property name="alignment">
+                 <set>Qt::AlignCenter</set>
+                </property>
+                <property name="buttonSymbols">
+                 <enum>QAbstractSpinBox::NoButtons</enum>
+                </property>
                 <property name="maximum">
                  <double>99999.990000000005239</double>
                 </property>
@@ -568,6 +610,12 @@
           </item>
           <item>
            <widget class="QSpinBox" name="rawEventId_spinBox">
+            <property name="alignment">
+             <set>Qt::AlignCenter</set>
+            </property>
+            <property name="buttonSymbols">
+             <enum>QAbstractSpinBox::NoButtons</enum>
+            </property>
             <property name="maximum">
              <number>99999</number>
             </property>
@@ -582,6 +630,12 @@
           </item>
           <item>
            <widget class="QSpinBox" name="rawEventTopic_spinBox">
+            <property name="alignment">
+             <set>Qt::AlignCenter</set>
+            </property>
+            <property name="buttonSymbols">
+             <enum>QAbstractSpinBox::NoButtons</enum>
+            </property>
             <property name="maximum">
              <number>99999</number>
             </property>
diff --git a/Modules/Mavlink/mavlink_skyward_lib b/Modules/Mavlink/mavlink_skyward_lib
index 93850b6237b2922fa7960e8fd6c105e1ed427b1b..02a8988485d1365f8dc4c897c5d2f9635b0cb9dd 160000
--- a/Modules/Mavlink/mavlink_skyward_lib
+++ b/Modules/Mavlink/mavlink_skyward_lib
@@ -1 +1 @@
-Subproject commit 93850b6237b2922fa7960e8fd6c105e1ed427b1b
+Subproject commit 02a8988485d1365f8dc4c897c5d2f9635b0cb9dd
diff --git a/Modules/ValuesViewer/valueelement.cpp b/Modules/ValuesViewer/valueelement.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..630ef206841be2c703dd1d114bf4334cfaab4b5e
--- /dev/null
+++ b/Modules/ValuesViewer/valueelement.cpp
@@ -0,0 +1,143 @@
+#include "valueelement.h"
+
+#include <QRadioButton>
+
+#include <QDebug>
+
+ValueElement::ValueElement()
+{
+
+}
+
+ValueElement::~ValueElement()
+{
+
+}
+
+ValueElement::ValueElement(const ValueElement &other)
+{
+    copy(other);
+}
+
+ValueElement::ValueElement(const QString &name, const QString &topic, const QString &receivedValue, const QString &displayedValue, const QString &color)
+{
+    setName(name);
+    setTopic(topic);
+    setReceivedValue(receivedValue);
+    setDisplayedValue(displayedValue);
+    setColor(color);
+}
+
+ValueElement ValueElement::operator=(const ValueElement &other)
+{
+    copy(other);
+    return *this;
+}
+
+QString ValueElement::getName() const
+{
+    return name;
+}
+
+void ValueElement::setName(const QString &value)
+{
+    name = value;
+}
+
+QString ValueElement::getTopic() const
+{
+    return topic;
+}
+
+void ValueElement::setTopic(const QString &value)
+{
+    topic = value;
+}
+
+QString ValueElement::getReceivedValue() const
+{
+    return receivedValue;
+}
+
+void ValueElement::setReceivedValue(const QString &value)
+{
+    receivedValue = value;
+}
+
+QString ValueElement::getDisplayedValue() const
+{
+    return displayedValue;
+}
+
+void ValueElement::setDisplayedValue(const QString &value)
+{
+    displayedValue = value;
+}
+
+QString ValueElement::getColor() const
+{
+    return color;
+}
+
+void ValueElement::setColor(const QString &value)
+{
+    color = value;
+}
+
+QString ValueElement::toString() const
+{
+    return getName() + ": " + getTopic() + " [" + getReceivedValue() + " = " + getDisplayedValue() + "] color=" + getColor();
+}
+
+XmlObject ValueElement::toXmlObject() const
+{
+    XmlObject obj("Rule");
+    obj.addAttribute("name", getName());
+    obj.addAttribute("topic", getTopic());
+    obj.addAttribute("received", getReceivedValue());
+    obj.addAttribute("displayed", getDisplayedValue());
+    obj.addAttribute("color", getColor());
+    return obj;
+}
+
+bool ValueElement::fromXmlObject(const XmlObject &xmlObject)
+{
+    bool result = false;
+    if(xmlObject.getObjectName() == "Rule" && xmlObject.hasAttribute("name")){
+        QString name = xmlObject.getAttribute("name");
+        if(name != ""){
+            setName(name);
+            result = true;
+        }
+
+        setTopic(xmlObject.getAttribute("topic"));
+        setReceivedValue(xmlObject.getAttribute("received"));
+        setDisplayedValue(xmlObject.getAttribute("displayed"));
+        setColor(xmlObject.getAttribute("color"));
+    }
+    return result;
+}
+
+void ValueElement::copy(const ValueElement &other)
+{
+    setName(other.getName());
+    setTopic(other.getTopic());
+    setReceivedValue(other.getReceivedValue());
+    setDisplayedValue(other.getDisplayedValue());
+    setColor(other.getColor());
+}
+
+QString ValueElement::getCurrentValue() const
+{
+    return currentValue;
+}
+
+bool ValueElement::updateCurrentValue(const QString &value)
+{
+    if(value == getReceivedValue()){
+        currentValue = getDisplayedValue();
+        return true;
+    }
+    return false;
+}
+
diff --git a/Modules/ValuesViewer/valueelement.h b/Modules/ValuesViewer/valueelement.h
new file mode 100644
index 0000000000000000000000000000000000000000..80ecaeed63c6996852e6c2ba724c86e308b44612
--- /dev/null
+++ b/Modules/ValuesViewer/valueelement.h
@@ -0,0 +1,53 @@
+#ifndef VALUEELEMENT_H
+#define VALUEELEMENT_H
+
+#include <QString>
+#include "Core/xmlobject.h"
+
+class ValueElement
+{
+
+public:
+    ValueElement();
+    ~ValueElement();
+    ValueElement(const ValueElement &other);
+    ValueElement(const QString &name, const QString &topic, const QString &receivedValue, const QString &displayedValue, const QString &color);
+
+    ValueElement operator=(const ValueElement &other);
+    QString getName() const;
+    void setName(const QString &value);
+
+    QString getTopic() const;
+    void setTopic(const QString &value);
+
+    QString getReceivedValue() const;
+    void setReceivedValue(const QString &value);
+
+    QString getDisplayedValue() const;
+    void setDisplayedValue(const QString &value);
+
+    QString getColor() const;
+    void setColor(const QString &value);
+
+    QString toString() const;
+
+    XmlObject toXmlObject() const;
+    bool fromXmlObject(const XmlObject &xmlObject);
+
+    QString getCurrentValue() const;
+    bool updateCurrentValue(const QString &value);
+
+protected:
+    void copy(const ValueElement &other);
+
+private:
+    QString name = "";
+    QString topic = "";
+    QString receivedValue = "";
+    QString displayedValue = "";
+    QString color = "#ffffff";
+
+    QString currentValue = "";
+};
+
+#endif // VALUEELEMENT_H
diff --git a/Modules/ValuesViewer/valuesviewerconfigpanel.cpp b/Modules/ValuesViewer/valuesviewerconfigpanel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..edf229c38ffbaa970aaac3ddb6c88d9d18f95af5
--- /dev/null
+++ b/Modules/ValuesViewer/valuesviewerconfigpanel.cpp
@@ -0,0 +1,168 @@
+#include "valuesviewerconfigpanel.h"
+#include "ui_valuesviewerconfigpanel.h"
+
+#include <QDebug>
+#include <QColorDialog>
+
+ValuesViewerConfigPanel::ValuesViewerConfigPanel(QWidget *parent) : QWidget(parent), ui(new Ui::ValuesViewerConfigPanel)
+{
+    ui->setupUi(this);
+    connect(ui->add_pushButton, &QPushButton::clicked, this, &ValuesViewerConfigPanel::onAddFieldClicked);
+    connect(ui->edit_pushButton, &QPushButton::clicked, this, &ValuesViewerConfigPanel::onEditClicked);
+    connect(ui->remove_pushButton, &QPushButton::clicked, this, &ValuesViewerConfigPanel::onRemoveClicked);
+    connect(ui->pickColor_pushButton, &QPushButton::clicked, this, &ValuesViewerConfigPanel::onPickColordClicked);
+    connect(ui->save_pushButton, &QPushButton::clicked, this, &ValuesViewerConfigPanel::onSaveClicked);
+    this->setAttribute(Qt::WA_DeleteOnClose, true);
+}
+
+ValuesViewerConfigPanel::~ValuesViewerConfigPanel()
+{
+    // The QRadioButtons are destroyed automatically.
+    delete ui;
+}
+
+void ValuesViewerConfigPanel::onAddFieldClicked()
+{
+    ValueElement e = createRuleFromControls();
+    if(e.getName() != ""){
+        int index = computeViewIndex(e.getName());
+        addRule(index, e);
+        //connect(view, &QRadioButton::destroyed, this, [](){qDebug() << "ValuesViewConfigPanel: Button deleted";});
+    }
+}
+
+ValueElement ValuesViewerConfigPanel::createRuleFromControls()
+{
+    QString name = ui->name_lineEdit->text().trimmed();
+    QString topic = ui->topic_lineEdit->text().trimmed();
+    QString receivedValue = ui->receivedValue_lineEdit->text().trimmed();
+    QString displayedValue = ui->displayedValue_lineEdit->text().trimmed();
+    QString color = ui->color_lineEdit->text().trimmed();
+    ValueElement e(name, topic, receivedValue, displayedValue, color);
+    return e;
+}
+
+
+void ValuesViewerConfigPanel::onEditClicked()
+{
+    ValueElement e = createRuleFromControls();
+    if(e.getName() != ""){
+        int index = findSelectedView();
+        if(index>=0 && index < rules.count()){
+            rules[index] = e;
+            views[index]->setText(e.toString());
+        }
+    }
+}
+
+void ValuesViewerConfigPanel::onRemoveClicked()
+{
+    int selectedView = findSelectedView();
+    if(selectedView >= 0 && selectedView < rules.count()){
+        rules.removeAt(selectedView);
+    }
+    if(selectedView >= 0 && selectedView < views.count()){
+        delete views[selectedView];
+        views.removeAt(selectedView);
+    }
+}
+
+void ValuesViewerConfigPanel::onPickColordClicked()
+{
+    QColor initial(ui->color_lineEdit->text().trimmed());
+    QColor color = QColorDialog::getColor(initial, this);
+    ui->color_lineEdit->setText(color.name());
+}
+
+void ValuesViewerConfigPanel::onValueElementClicked()
+{
+    int selectedView = findSelectedView();
+    if(selectedView >= 0 && selectedView < rules.count()){
+        setTextBoxValues(rules[selectedView]);
+    }
+}
+
+void ValuesViewerConfigPanel::onSaveClicked()
+{
+    emit configurationSaved(this);
+    this->close();
+}
+
+int ValuesViewerConfigPanel::computeViewIndex(const QString &viewName)
+{
+    int i = 0;
+    for (; i < rules.count(); i++ ) {
+
+        if(rules.at(i).getName().compare(viewName) >= 0){
+            return i;
+        }
+    }
+    return i;
+}
+
+QRadioButton *ValuesViewerConfigPanel::createView(const ValueElement &el)
+{
+    //qDebug() << "ValuesViewConfigPanel: Button created";
+    return new QRadioButton(el.toString());
+}
+
+void ValuesViewerConfigPanel::setTextBoxValues(const ValueElement &el)
+{
+    ui->name_lineEdit->setText(el.getName());
+    ui->topic_lineEdit->setText(el.getTopic());
+    ui->receivedValue_lineEdit->setText(el.getReceivedValue());
+    ui->displayedValue_lineEdit->setText(el.getDisplayedValue());
+    ui->color_lineEdit->setText(el.getColor());
+}
+
+int ValuesViewerConfigPanel::findSelectedView() const
+{
+    for (int i = 0; i < views.count(); i++) {
+        if(views[i]->isChecked()){
+            return i;
+        }
+    }
+    return -1;
+}
+
+void ValuesViewerConfigPanel::addRule(int index, const ValueElement &el)
+{
+    rules.insert(index, el);
+    QRadioButton *view = createView(el);
+    views.insert(index, view);
+    ui->fieldsLayout->insertWidget(index, view);
+    connect(view, &QRadioButton::clicked, this, &ValuesViewerConfigPanel::onValueElementClicked);
+}
+
+
+void ValuesViewerConfigPanel::setRules(const QList<ValueElement> &newValues)
+{
+    for (int i = 0; i < newValues.count(); i++ ) {
+        addRule(i, newValues[i]);
+    }
+}
+
+QList<ValueElement> ValuesViewerConfigPanel::getRules() const
+{
+    return rules;
+}
+
+int ValuesViewerConfigPanel::getColumnsCount() const
+{
+    return ui->columns_spinBox->value();
+}
+
+void ValuesViewerConfigPanel::setColumnsCount(int value)
+{
+    return ui->columns_spinBox->setValue(value);
+}
+
+
+
+
+
+
+
+
+
+
diff --git a/Modules/ValuesViewer/valuesviewerconfigpanel.h b/Modules/ValuesViewer/valuesviewerconfigpanel.h
new file mode 100644
index 0000000000000000000000000000000000000000..913524371b3d525ff53c777476749c73f50808a5
--- /dev/null
+++ b/Modules/ValuesViewer/valuesviewerconfigpanel.h
@@ -0,0 +1,52 @@
+#ifndef VALUESVIEWERCONFIGPANEL_H
+#define VALUESVIEWERCONFIGPANEL_H
+
+#include <QWidget>
+#include <QRadioButton>
+#include "valueelement.h"
+
+namespace Ui {
+class ValuesViewerConfigPanel;
+}
+
+class ValuesViewerConfigPanel : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit ValuesViewerConfigPanel(QWidget *parent = nullptr);
+    ~ValuesViewerConfigPanel();
+
+
+    int getColumnsCount() const;
+    void setColumnsCount(int value);
+
+    void setRules(const QList<ValueElement> &newValues);
+    QList<ValueElement> getRules() const;
+
+signals:
+    void configurationSaved(ValuesViewerConfigPanel *sPanel);
+
+protected:
+    void onAddFieldClicked();
+    void onRemoveClicked();
+    void onPickColordClicked();
+    void onValueElementClicked();
+    void onSaveClicked();
+    void onEditClicked();
+    int computeViewIndex(const QString &viewName);
+    QRadioButton* createView(const ValueElement &el);
+    void setTextBoxValues(const ValueElement &el);
+    int findSelectedView() const;
+    void addRule(int index, const ValueElement &el);
+
+    ValueElement createRuleFromControls();
+
+private:
+    Ui::ValuesViewerConfigPanel *ui;
+
+    QList<ValueElement> rules;
+    QList<QRadioButton*> views;
+};
+
+#endif // VALUESVIEWERCONFIGPANEL_H
diff --git a/Modules/ValuesViewer/valuesviewerconfigpanel.ui b/Modules/ValuesViewer/valuesviewerconfigpanel.ui
new file mode 100644
index 0000000000000000000000000000000000000000..803402bea7401601d0ef020bb6304c3b27cb247c
--- /dev/null
+++ b/Modules/ValuesViewer/valuesviewerconfigpanel.ui
@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ValuesViewerConfigPanel</class>
+ <widget class="QWidget" name="ValuesViewerConfigPanel">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>783</width>
+    <height>619</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,2,0">
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>Column number</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QSpinBox" name="columns_spinBox">
+       <property name="maximumSize">
+        <size>
+         <width>150</width>
+         <height>16777215</height>
+        </size>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+       <property name="buttonSymbols">
+        <enum>QAbstractSpinBox::NoButtons</enum>
+       </property>
+       <property name="minimum">
+        <number>1</number>
+       </property>
+      </widget>
+     </item>
+     <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="save_pushButton">
+       <property name="text">
+        <string>  Save  </string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QLabel" name="label_7">
+     <property name="text">
+      <string>Use the controls on the bottom to create a new rule. Click on a rule and use the Remove button to delete it or use the add button to edit it.
+The rules with the same name refer to the same object.</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QScrollArea" name="scrollArea">
+     <property name="widgetResizable">
+      <bool>true</bool>
+     </property>
+     <widget class="QWidget" name="scrollAreaWidgetContents">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>761</width>
+        <height>424</height>
+       </rect>
+      </property>
+      <layout class="QVBoxLayout" name="fieldsLayout">
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>458</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLabel" name="label_8">
+     <property name="text">
+      <string>Create or Edit a rule</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QGridLayout" name="gridLayout">
+     <item row="1" column="2">
+      <widget class="QLineEdit" name="receivedValue_lineEdit"/>
+     </item>
+     <item row="0" column="3">
+      <widget class="QLabel" name="label_3">
+       <property name="text">
+        <string>Displayed Value</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="4">
+      <widget class="QLabel" name="label_4">
+       <property name="text">
+        <string>Color</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="4">
+      <layout class="QHBoxLayout" name="horizontalLayout_4">
+       <item>
+        <widget class="QLineEdit" name="color_lineEdit">
+         <property name="text">
+          <string>#ffffff</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="pickColor_pushButton">
+         <property name="text">
+          <string>Pick</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item row="0" column="2">
+      <widget class="QLabel" name="label_2">
+       <property name="text">
+        <string>Received Value</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="3">
+      <widget class="QLineEdit" name="displayedValue_lineEdit"/>
+     </item>
+     <item row="0" column="0">
+      <widget class="QLabel" name="label_5">
+       <property name="text">
+        <string>Name</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1">
+      <widget class="QLabel" name="label_6">
+       <property name="text">
+        <string>Topic</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="0">
+      <widget class="QLineEdit" name="name_lineEdit"/>
+     </item>
+     <item row="1" column="1">
+      <widget class="QLineEdit" name="topic_lineEdit"/>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <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>
+     <item>
+      <widget class="QPushButton" name="add_pushButton">
+       <property name="text">
+        <string>Add</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="edit_pushButton">
+       <property name="text">
+        <string>Edit</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="remove_pushButton">
+       <property name="text">
+        <string>Remove</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer_5">
+       <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>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Modules/ValuesViewer/valuesviewermodule.cpp b/Modules/ValuesViewer/valuesviewermodule.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e92507ff3ffa337025fc51da4e4d89222984dd0f
--- /dev/null
+++ b/Modules/ValuesViewer/valuesviewermodule.cpp
@@ -0,0 +1,176 @@
+#include "valuesviewermodule.h"
+#include "ui_valuesviewermodule.h"
+
+#include "valuesviewerconfigpanel.h"
+#include "Core/modulemessagesbroker.h"
+
+ValuesViewerModule::ValuesViewerModule(QWidget *parent) : DefaultModule(parent), ui(new Ui::ValuesViewerModule)
+{
+    ui->setupUi(this);
+    defaultContextMenuSetup();
+}
+
+ValuesViewerModule::~ValuesViewerModule()
+{
+    clearLabels();
+    delete ui;
+}
+
+
+QWidget *ValuesViewerModule::toWidget()
+{
+    return this;
+}
+
+XmlObject ValuesViewerModule::toXmlObject()
+{    
+    XmlObject obj(getName(ModuleId::VALUESVIEWER));
+
+    obj.addAttribute("Columns", QString::number(columns));
+
+    for(int i = 0; i < rules.count();i++){
+        obj.addChild(rules[i].toXmlObject());
+    }
+    return obj;
+}
+
+void ValuesViewerModule::fromXmlObject(const XmlObject &xmlObject)
+{
+    if(xmlObject.getObjectName() == getName(ModuleId::VALUESVIEWER)){
+
+        int col;
+        if(xmlObject.getIntAttribute("Columns", col)){
+            columns = col;
+        }
+
+        for(int i = 0; i < xmlObject.childCount(); i++){
+            XmlObject child = xmlObject.childAt(i);
+            ValueElement el;
+            if(el.fromXmlObject(child)){
+                addRule(el);
+            }
+        }
+        createLabels();
+    }
+}
+
+void ValuesViewerModule::onConfigureClicked()
+{
+    ValuesViewerConfigPanel *sPanel = new ValuesViewerConfigPanel();
+    sPanel->setRules(rules);
+    sPanel->setColumnsCount(columns);
+    connect(sPanel, &ValuesViewerConfigPanel::configurationSaved, this, &ValuesViewerModule::onConfigurationSaved);
+    sPanel->show();
+}
+
+void ValuesViewerModule::onConfigurationSaved(ValuesViewerConfigPanel *sPanel)
+{
+    setRules(sPanel->getRules());
+    columns = sPanel->getColumnsCount();
+
+    createLabels();
+}
+
+void ValuesViewerModule::addCustomActionsToMenu()
+{
+    QAction* configure = new QAction("Configure");
+    connect(configure, &QAction::triggered,this, &ValuesViewerModule::onConfigureClicked);
+    addActionToMenu(configure);
+}
+
+QLabel *ValuesViewerModule::createView(const ValueElement &el) const
+{
+    QLabel *label = new QLabel();
+    label->setText(el.getName());
+    label->setAlignment(Qt::AlignCenter);
+    return label;
+}
+
+void ValuesViewerModule::clearLabels()
+{
+    while(labels.count() > 0){
+        QLabel *l = labels[0];
+        labels.removeAll(l);
+        delete l;
+    }
+}
+
+void ValuesViewerModule::createLabels()
+{
+    clearLabels();
+    if(columns <= 0){
+        columns = minColNumber;
+    }
+
+    int col = 0;
+    for (int i = 0; i < rules.count(); i++ ) {
+        QLabel *label;
+
+        int labelIndex = findLabelIndexByName(rules[i].getName());
+        if(labelIndex >= 0 && labelIndex < labels.count()){
+            label = labels[labelIndex];
+        }
+        else{
+            label = createView(rules[i]);
+            int row = i/columns;
+            if(col == columns){
+                col = 0;
+            }
+            ui->mainLayout_grid->addWidget(label, row, col);
+            col++;
+        }
+        labels.append(label);
+    }
+}
+
+void ValuesViewerModule::addRule(const ValueElement &el)
+{
+    rules.append(el);
+    if(el.getTopic() != ""){
+        getCore()->getModuleMessagesBroker()->subscribe(el.getTopic(), this, [this](const ModuleMessage &msg){
+            onMsgReceived(msg);
+        });
+    }
+}
+
+void ValuesViewerModule::setRules(const QList<ValueElement> &rList)
+{
+    clearRules();
+    for (int i = 0; i < rList.count(); i++ ) {
+        addRule(rList[i]);
+    }
+}
+
+void ValuesViewerModule::onMsgReceived(const ModuleMessage &msg)
+{
+    for (int i = 0; i < rules.count(); i++ ) {
+        if(rules[i].getTopic() == msg.topic()){
+            if(rules[i].updateCurrentValue(msg.payload())){
+                labels[i]->setText(rules[i].getName()+"\n"+rules[i].getCurrentValue());
+                if(rules[i].getColor() != ""){
+                    labels[i]->setStyleSheet("color:"+rules[i].getColor()+";");
+                }
+            }
+        }
+    }
+}
+
+void ValuesViewerModule::clearRules()
+{
+    for (int i = 0; i < rules.count(); i++ ) {
+        if(rules[i].getTopic() != ""){
+            getCore()->getModuleMessagesBroker()->unsubscribe(rules[i].getTopic(), this);
+        }
+    }
+    rules.clear();
+}
+
+int ValuesViewerModule::findLabelIndexByName(const QString &name)
+{
+    for (int i = 0; i < labels.count(); i++ ) {
+        if(labels[i]->text() == name){
+            return i;
+        }
+    }
+    return -1;
+}
diff --git a/Modules/ValuesViewer/valuesviewermodule.h b/Modules/ValuesViewer/valuesviewermodule.h
new file mode 100644
index 0000000000000000000000000000000000000000..818a5c909f71dbccebef7d6b27a86237c927cd7c
--- /dev/null
+++ b/Modules/ValuesViewer/valuesviewermodule.h
@@ -0,0 +1,50 @@
+#ifndef VALUESVIEWERMODULE_H
+#define VALUESVIEWERMODULE_H
+
+#include <QWidget>
+#include <QLabel>
+#include "valueelement.h"
+#include "Modules/DefaultModule/defaultmodule.h"
+#include "Core/modulemessage.h"
+
+class ValuesViewerConfigPanel;
+
+namespace Ui {
+class ValuesViewerModule;
+}
+
+class ValuesViewerModule : public DefaultModule
+{
+    Q_OBJECT
+
+public:
+    explicit ValuesViewerModule(QWidget *parent = nullptr);
+    ~ValuesViewerModule();
+
+    QWidget *toWidget() override;
+
+    XmlObject toXmlObject() override;
+    void fromXmlObject(const XmlObject &xmlObject) override;
+
+protected:
+    void onConfigureClicked();
+    void onConfigurationSaved(ValuesViewerConfigPanel *sPanel);
+    void addCustomActionsToMenu() override;
+    QLabel* createView(const ValueElement &el) const;
+    void clearLabels();
+    void createLabels();
+    void addRule(const ValueElement &el);
+    void setRules(const QList<ValueElement> &rList);
+    void onMsgReceived(const ModuleMessage &msg);
+    void clearRules();
+    int findLabelIndexByName(const QString &name);
+
+private:
+    Ui::ValuesViewerModule *ui;
+    int minColNumber = 1;
+    int columns = minColNumber;
+    QList<QLabel*> labels;
+    QList<ValueElement> rules;
+};
+
+#endif // VALUESVIEWERMODULE_H
diff --git a/Modules/ValuesViewer/valuesviewermodule.ui b/Modules/ValuesViewer/valuesviewermodule.ui
new file mode 100644
index 0000000000000000000000000000000000000000..729f5822e6079244a1df003d2b4349f597cbe616
--- /dev/null
+++ b/Modules/ValuesViewer/valuesviewermodule.ui
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ValuesViewerModule</class>
+ <widget class="QWidget" name="ValuesViewerModule">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>300</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QScrollArea" name="scrollArea">
+     <property name="widgetResizable">
+      <bool>true</bool>
+     </property>
+     <widget class="QWidget" name="scrollAreaWidgetContents">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>378</width>
+        <height>278</height>
+       </rect>
+      </property>
+      <property name="styleSheet">
+       <string notr="true">border: 1px solid grey;
+color: white;</string>
+      </property>
+      <layout class="QGridLayout" name="mainLayout_grid"/>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Modules/moduleinfo.h b/Modules/moduleinfo.h
index be9d69ec45b5b478945911dbb55328dea9681bd5..9fc4a19296bc0df6681c91c353d053022ca8a1b1 100644
--- a/Modules/moduleinfo.h
+++ b/Modules/moduleinfo.h
@@ -22,6 +22,7 @@ enum ModuleId{
     SCROLLAREA,
     FILESTREAM,
     STATEVIEWER,
+    VALUESVIEWER,
     MAVLINK_RCK_TESTING
 };
 
diff --git a/Modules/moduleslist.cpp b/Modules/moduleslist.cpp
index 384691da5444be1d7ee348e90d2a7c397d83765e..27dc6334f874d888fcb606e3f83575338da6ae40 100644
--- a/Modules/moduleslist.cpp
+++ b/Modules/moduleslist.cpp
@@ -20,6 +20,7 @@
 #include "Modules/FileStream/filestreammodule.h"
 #include "Modules/Mavlink/mavlinkrocketmsgtestingmodule.h"
 #include "Modules/StateViewer/stateviewermodule.h"
+#include "Modules/ValuesViewer/valuesviewermodule.h"
 
 void ModulesList::createModuleList()
 {
@@ -153,6 +154,14 @@ void ModulesList::createModuleList()
     stateViewer.addModuleSourceFiles("Modules/StateViewer/");
     addModuleInfo(stateViewer);
     #endif
+
+    #ifdef VALUESVIEWERMODULE_H
+    ModuleInfo valuesviewer(ModuleId::VALUESVIEWER, "ValuesViewer", ModuleCategory::DATAVISUAL);
+    valuesviewer.setFactory([](){return new ValuesViewerModule();});
+    valuesviewer.addModuleSourceFiles("Modules/ValuesViewer/");
+    addModuleInfo(valuesviewer);
+    #endif
+
 }
 
 
diff --git a/SkywardHub.pro b/SkywardHub.pro
index 596b59627bc6bb51264d827549f4f0335948d2f9..07b55cc087de519ec29a5f0fb645b9651f2856bb 100644
--- a/SkywardHub.pro
+++ b/SkywardHub.pro
@@ -67,6 +67,9 @@ SOURCES += \
     Modules/Utility/saveconfigurationdialog.cpp \
     Modules/Utility/subscriptionspanel.cpp \
     Modules/Utility/togglebutton.cpp \
+    Modules/ValuesViewer/valueelement.cpp \
+    Modules/ValuesViewer/valuesviewerconfigpanel.cpp \
+    Modules/ValuesViewer/valuesviewermodule.cpp \
     Modules/moduleinfo.cpp \
     Modules/moduleslist.cpp \
     Modules/skywardhubstrings.cpp \
@@ -133,6 +136,9 @@ HEADERS += \
     Modules/Utility/saveconfigurationdialog.h \
     Modules/Utility/subscriptionspanel.h \
     Modules/Utility/togglebutton.h \
+    Modules/ValuesViewer/valueelement.h \
+    Modules/ValuesViewer/valuesviewerconfigpanel.h \
+    Modules/ValuesViewer/valuesviewermodule.h \
     Modules/moduleinfo.h \
     Modules/moduleslist.h \
     Modules/skywardhubstrings.h
@@ -166,7 +172,9 @@ FORMS += \
     Modules/TreeViewer/treeviewermodule.ui \
     Modules/Utility/modulespicker.ui \
     Modules/Utility/saveconfigurationdialog.ui \
-    Modules/Utility/subscriptionspanel.ui
+    Modules/Utility/subscriptionspanel.ui \
+    Modules/ValuesViewer/valuesviewerconfigpanel.ui \
+    Modules/ValuesViewer/valuesviewermodule.ui
 
 # Default rules for deployment.
 qnx: target.path = /tmp/$${TARGET}/bin
diff --git a/SkywardHub.pro.user b/SkywardHub.pro.user
index a50f0bef2f5a6790c4952e2c5a8e7ef3c18318c8..6bb8e65bf998480e3a061039a6f8e0b891565177 100644
--- a/SkywardHub.pro.user
+++ b/SkywardHub.pro.user
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.14.2, 2021-07-30T12:33:17. -->
+<!-- Written by QtCreator 4.14.2, 2021-08-11T21:04:23. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>