diff --git a/Core/modulemessage.cpp b/Core/modulemessage.cpp
index 1f938f08da869482b5bfadb0228f51d3460edf8e..f4b5654cfe984c723250926d09046c6bc1dd47d4 100644
--- a/Core/modulemessage.cpp
+++ b/Core/modulemessage.cpp
@@ -1,5 +1,7 @@
 #include "modulemessage.h"
 
+#include <QDateTime>
+
 ModuleMessage::ModuleMessage()
 {
     setTimestamp(QDateTime::currentDateTime());
@@ -142,6 +144,17 @@ bool ModuleMessage::getFloatPayload(float &value) const
     return false;
 }
 
+QString ModuleMessage::toString() const
+{
+    QString line = QDateTime::currentDateTime().toString("hh.mm.ss (zzz): ") + "(Topic) " + this->originalTopic() + " -> " + this->payload() + " (payload)";
+    auto i = this->getOptions().attributesIterator();
+    while(i.hasNext()){
+        i.next();
+        line = line + ", " + i.value() + " ("+i.key()+")";
+    }
+    return line;
+}
+
 void ModuleMessage::copy(const ModuleMessage &msg)
 {
     setPayload(msg.payload());
diff --git a/Core/modulemessage.h b/Core/modulemessage.h
index bc9a8878cf9523a2366a15431178e99f588a7e17..d5877f886dab1f2220ac917613c8b0f52d30a94b 100644
--- a/Core/modulemessage.h
+++ b/Core/modulemessage.h
@@ -49,6 +49,8 @@ public:
 
     bool getFloatPayload(float &value) const;
 
+    QString toString() const;
+
 private:
     void copy(const ModuleMessage &msg);
 
diff --git a/Modules/FileStream/filestreammodule.cpp b/Modules/FileStream/filestreammodule.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2be76fa2467a91208cfe6553fe32f4484a9315ab
--- /dev/null
+++ b/Modules/FileStream/filestreammodule.cpp
@@ -0,0 +1,205 @@
+#include "filestreammodule.h"
+#include "ui_filestreammodule.h"
+
+#include "Core/modulemessagesbroker.h"
+#include <QDebug>
+#include <QMessageBox>
+#include "Modules/skywardhubstrings.h"
+#include <QDir>
+#include <QDesktopServices>
+#include <QUrl>
+
+FileStreamModule::FileStreamModule(QWidget *parent) : DefaultModule(parent), ui(new Ui::FileStreamModule)
+{
+    ui->setupUi(this);
+    defaultContextMenuSetup();
+    connectUI();
+
+    ui->filePath_lineEdit->setText(SkywardHubStrings::defaultStreamFile);
+}
+
+FileStreamModule::~FileStreamModule()
+{
+    if(file.isOpen())
+        file.close();
+    deleteAllTopicViews();
+    delete ui;
+}
+
+QWidget *FileStreamModule::toWidget()
+{
+    return this;
+}
+
+XmlObject FileStreamModule::toXmlObject()
+{
+    XmlObject obj(getName(ModuleId::FILESTREAM));
+
+    if(getFilePath() != "")
+        obj.addAttribute("FilePath", getFilePath());
+
+    for(int i = 0; i < topicViewsList.count();i++){
+        XmlObject subscription("Subscription");
+        subscription.setTextValue(topicViewsList[i]->text().trimmed());
+        obj.addChild(subscription);
+    }
+    return obj;
+}
+
+void FileStreamModule::fromXmlObject(const XmlObject &xmlObject)
+{
+    if(xmlObject.getObjectName() == getName(ModuleId::FILESTREAM)){
+
+        if(xmlObject.hasAttribute("FilePath")){
+            ui->filePath_lineEdit->setText(xmlObject.getAttribute("FilePath"));
+        }
+
+        for(int i = 0; i < xmlObject.childCount(); i++){
+            XmlObject child = xmlObject.childAt(i);
+            if(child.getObjectName() == "Subscription" && child.getTextValue() != ""){
+                addTopic(child.getTextValue());
+            }
+        }
+    }
+}
+
+void FileStreamModule::connectUI()
+{
+    connect(ui->start_button, &QPushButton::clicked, this, &FileStreamModule::onStartClicked);
+    connect(ui->stop_button, &QPushButton::clicked, this, &FileStreamModule::onStopClicked);
+    connect(ui->addTopic_button, &QPushButton::clicked, this, &FileStreamModule::onAddTopicClicked);
+    connect(ui->showFile_button, &QPushButton::clicked, this, &FileStreamModule::onShowFileClick);
+}
+
+QString FileStreamModule::getFilePath() const
+{
+    return ui->filePath_lineEdit->text().trimmed();
+}
+
+QString FileStreamModule::getTopicName() const
+{
+    return ui->topicName_lineEdit->text().trimmed();
+}
+
+void FileStreamModule::resetTopicName()
+{
+    ui->topicName_lineEdit->clear();
+}
+
+void FileStreamModule::onMsgReceived(const ModuleMessage &msg)
+{
+    if(file.isOpen() ){
+        QTextStream out(&file);
+        out << msg.toString() << Qt::endl;
+    }
+}
+
+void FileStreamModule::onAddTopicClicked()
+{
+    QString topicName = getTopicName();
+    resetTopicName();
+    if(topicName != ""){
+        addTopic(topicName);
+    }
+}
+
+void FileStreamModule::onStartClicked()
+{
+    file.setFileName(getFilePath());
+    if(!file.open(QIODevice::ReadWrite)){
+        QString msg = "FileStream: Error occurred while opening file " + getFilePath();
+        QMessageBox msgBox;
+        msgBox.setText(msg);
+        msgBox.exec();
+        return;
+    }
+
+    file.resize(0);
+    disableOnStartElement();
+    for(int i = 0; i < topicViewsList.count() ; i++ ){
+        getCore()->getModuleMessagesBroker()->subscribe(topicViewsList[i]->text().trimmed(), this, [this](const ModuleMessage &msg){
+            onMsgReceived(msg);
+        });
+        topicViewsList[i]->setEnabled(false);
+    }
+
+}
+
+void FileStreamModule::onStopClicked()
+{
+    if(file.isOpen())
+        file.close();
+    enableElementOnStop();
+
+    for(int i = 0; i < topicViewsList.count(); i++ ){
+        getCore()->getModuleMessagesBroker()->unsubscribe(topicViewsList[i]->text().trimmed(), this);
+        topicViewsList[i]->setEnabled(true);
+    }
+}
+
+void FileStreamModule::onTopicEdit()
+{
+    for(int i = topicViewsList.count() - 1 ; i >= 0; i-- ){
+        if(topicViewsList[i]->text().trimmed() == ""){
+            topicViewsList[i]->deleteLater();
+            topicViewsList.removeAt(i);
+        }
+    }
+}
+
+void FileStreamModule::disableOnStartElement()
+{
+    ui->start_button->setEnabled(false);
+    ui->addTopic_button->setEnabled(false);
+    ui->filePath_lineEdit->setEnabled(false);
+}
+
+void FileStreamModule::enableElementOnStop()
+{
+    ui->start_button->setEnabled(true);
+    ui->addTopic_button->setEnabled(true);
+    ui->filePath_lineEdit->setEnabled(true);
+    ui->writeOnFile_radioButton->setEnabled(true);
+}
+
+void FileStreamModule::onShowFileClick()
+{
+    QDir dir(SkywardHubStrings::defaultLogsFolder);
+    if (dir.exists()){
+        QDesktopServices::openUrl( QUrl::fromLocalFile(getFilePath()) );
+    }
+    else{
+        QString msg = "The file does not exist." +  getFilePath();
+        QMessageBox msgBox;
+        msgBox.setText(msg);
+        msgBox.exec();
+    }
+}
+
+void FileStreamModule::addTopic(const QString &topic)
+{
+    QLineEdit* topicView = createTopicView(topic);
+
+    topicViewsList.append(topicView);
+    ui->topics_layout->addWidget(topicView);
+}
+
+QLineEdit *FileStreamModule::createTopicView(const QString &topic) const
+{
+    QLineEdit* topicView = new QLineEdit();
+    topicView->setText(topic);
+
+    connect(topicView, &QLineEdit::textEdited, this, &FileStreamModule::onTopicEdit);
+    return topicView;
+}
+
+void FileStreamModule::deleteAllTopicViews()
+{
+    for(int i = 0; i < topicViewsList.count(); i++ ){
+        getCore()->getModuleMessagesBroker()->unsubscribe(topicViewsList[i]->text().trimmed(), this);
+        ui->topics_layout->removeWidget(topicViewsList[i]);
+        topicViewsList[i]->deleteLater();
+    }
+    topicViewsList.clear();
+}
+
diff --git a/Modules/FileStream/filestreammodule.h b/Modules/FileStream/filestreammodule.h
new file mode 100644
index 0000000000000000000000000000000000000000..74bb8cd0d7de82dcca0232d8a4e05db9294785b6
--- /dev/null
+++ b/Modules/FileStream/filestreammodule.h
@@ -0,0 +1,57 @@
+#ifndef FILESTREAMMODULE_H
+#define FILESTREAMMODULE_H
+
+#include <QWidget>
+#include "Modules/DefaultModule/defaultmodule.h"
+#include "Core/modulemessage.h"
+
+#include <QLineEdit>
+#include <QFile>
+
+namespace Ui {
+class FileStreamModule;
+}
+
+class FileStreamModule : public DefaultModule
+{
+    Q_OBJECT
+
+public:
+    explicit FileStreamModule(QWidget *parent = nullptr);
+    ~FileStreamModule();
+
+    QWidget *toWidget() override;
+
+    XmlObject toXmlObject() override;
+    void fromXmlObject(const XmlObject &xmlObject) override;
+
+
+protected:
+    void connectUI();
+    QString getFilePath() const;
+    QString getTopicName() const;
+    void resetTopicName();
+    void onMsgReceived(const ModuleMessage &msg);
+
+    void onAddTopicClicked();
+    void onStartClicked();
+    void onStopClicked();
+    void onTopicEdit();
+    void disableOnStartElement();
+    void enableElementOnStop();
+    void onFileChanged();
+    void onShowFileClick();
+
+    void addTopic(const QString &topic);
+    QLineEdit* createTopicView(const QString &topic) const;
+
+    void deleteAllTopicViews();
+
+private:
+    Ui::FileStreamModule *ui;
+
+    QList<QLineEdit*> topicViewsList;
+    QFile file;
+};
+
+#endif // FILESTREAMMODULE_H
diff --git a/Modules/FileStream/filestreammodule.ui b/Modules/FileStream/filestreammodule.ui
new file mode 100644
index 0000000000000000000000000000000000000000..85693220457cc6d9b16ac3231d87d1d4e0186018
--- /dev/null
+++ b/Modules/FileStream/filestreammodule.ui
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>FileStreamModule</class>
+ <widget class="QWidget" name="FileStreamModule">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>508</width>
+    <height>209</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="2">
+    <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>486</width>
+        <height>187</height>
+       </rect>
+      </property>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <widget class="QRadioButton" name="writeOnFile_radioButton">
+           <property name="text">
+            <string>Write the messages received from the topic into the specified file</string>
+           </property>
+           <property name="checked">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_4">
+         <item>
+          <widget class="QLineEdit" name="filePath_lineEdit">
+           <property name="placeholderText">
+            <string>File path</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="showFile_button">
+           <property name="text">
+            <string>Show</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QVBoxLayout" name="topics_layout">
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout">
+           <item>
+            <widget class="QLabel" name="label_2">
+             <property name="text">
+              <string>Topic List  </string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QLineEdit" name="topicName_lineEdit">
+             <property name="placeholderText">
+              <string>Topic name</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QPushButton" name="addTopic_button">
+             <property name="text">
+              <string>Add</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_3">
+           <item>
+            <widget class="QLabel" name="label_4">
+             <property name="text">
+              <string>To remove a topic, clear the Line Edit control</string>
+             </property>
+             <property name="alignment">
+              <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+             </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="stop_button">
+             <property name="text">
+              <string>Stop</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QPushButton" name="start_button">
+             <property name="text">
+              <string>Start</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <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>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Modules/Mavlink/mavlinkmodule.cpp b/Modules/Mavlink/mavlinkmodule.cpp
index 16bc1aab5f9581d9cc3c7c81f7f27ff9d4c35efa..94dba2d597e43deb899c4f8c4449e3ba85c4ea85 100644
--- a/Modules/Mavlink/mavlinkmodule.cpp
+++ b/Modules/Mavlink/mavlinkmodule.cpp
@@ -156,6 +156,11 @@ void MavlinkModule::onStartClicked()
     if(startReadingOnSerialPort()){
         portOpen = true;
         mavlinkReader.setPortNumber(portNumber);
+
+        if(ui->logEnabled_checkBox->isChecked()){
+            mavlinkReader.openLogFile();
+        }
+
         mavlinkReader.startAsyncReading();
         mavlinkCommandAdapter.setPortNumber(portNumber);
         //mavlinkReader.startAsyncReadingWithSignal(&serialPort);
@@ -213,8 +218,6 @@ void MavlinkModule::updateLinkSignalIndicator(int msgArrived, float ratio)
     publish(linkQualityMsgRatio);
 }
 
-
-
 void MavlinkModule::onOpenLogFolderClick()
 {
     QDir dir(SkywardHubStrings::defaultLogsFolder);
diff --git a/Modules/Mavlink/mavlinkmodule.ui b/Modules/Mavlink/mavlinkmodule.ui
index 3b7b057c7f1da0b1104587686de59e51e4e3b635..acaf86a5abee6f296060a57dc7d0ec56651730bf 100644
--- a/Modules/Mavlink/mavlinkmodule.ui
+++ b/Modules/Mavlink/mavlinkmodule.ui
@@ -196,6 +196,16 @@
       <item row="1" column="3">
        <widget class="QComboBox" name="comboBox_baudRate"/>
       </item>
+      <item row="0" column="6">
+       <widget class="QCheckBox" name="logEnabled_checkBox">
+        <property name="text">
+         <string>Enable Log</string>
+        </property>
+        <property name="checked">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>
diff --git a/Modules/Mavlink/mavlinkreader.cpp b/Modules/Mavlink/mavlinkreader.cpp
index 0c3f6ac4effa340db81372035000594ad2ea7955..9150a1f70ec2fee8057298c081364ef2c45245db 100644
--- a/Modules/Mavlink/mavlinkreader.cpp
+++ b/Modules/Mavlink/mavlinkreader.cpp
@@ -21,7 +21,6 @@ MavlinkReader::~MavlinkReader()
 void MavlinkReader::startAsyncReading()
 {
     stop = false;
-    openLogFile();
     this->start(); // Chiama run()
 }
 
diff --git a/Modules/SerialStream/serialstreammodule.cpp b/Modules/SerialStream/serialstreammodule.cpp
deleted file mode 100644
index 063be98b42c1610bd3d8c0b4f28c7896d1f9fab1..0000000000000000000000000000000000000000
--- a/Modules/SerialStream/serialstreammodule.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-#include "serialstreammodule.h"
-#include "ui_serialstreammodule.h"
-
-#include <QSerialPort>
-#include <QSerialPortInfo>
-
-
-SerialStreamModule::SerialStreamModule(QWidget *parent) : DefaultModule(parent), ui(new Ui::SerialStreamModule)
-{
-    ui->setupUi(this);
-    defaultContextMenuSetup();
-    initializeSerialPortView();
-
-    connectUiSlots();
-    //qRegisterMetaType<ModuleMessage>();
-}
-
-SerialStreamModule::~SerialStreamModule()
-{
-    delete ui;
-}
-
-QWidget *SerialStreamModule::toWidget()
-{
-    return this;
-}
-
-XmlObject SerialStreamModule::toXmlObject()
-{
-    XmlObject obj(getName(ModuleId::SERIALSTREAM));
-    obj.addAttribute("BaudRateIndex",QString::number(ui->comboBox_baudRate->currentIndex()));
-    return obj;
-}
-
-void SerialStreamModule::fromXmlObject(const XmlObject &xmlObject)
-{
-    if(xmlObject.getObjectName() == getName(ModuleId::SERIALSTREAM)){
-        bool ok;
-        int index = xmlObject.getAttribute("BaudRateIndex").toInt(&ok);
-        if(ok){
-            ui->comboBox_baudRate->setCurrentIndex(index);
-        }
-    }
-}
-
-void SerialStreamModule::initializeSerialPortView()
-{
-    //fill the baud rate combo box
-    QString baudPrefix = "BaudRate: ";
-    ui->comboBox_baudRate->addItem(baudPrefix + "115200", QSerialPort::Baud115200);
-    ui->comboBox_baudRate->addItem(baudPrefix + "57600", QSerialPort::Baud57600);
-    ui->comboBox_baudRate->addItem(baudPrefix + "38400", QSerialPort::Baud38400);
-    ui->comboBox_baudRate->addItem(baudPrefix + "19200", QSerialPort::Baud19200);
-    ui->comboBox_baudRate->addItem(baudPrefix + "9600", QSerialPort::Baud9600);
-    ui->comboBox_baudRate->addItem(baudPrefix + "4800", QSerialPort::Baud4800);
-    ui->comboBox_baudRate->addItem(baudPrefix + "2400", QSerialPort::Baud2400);
-    ui->comboBox_baudRate->addItem(baudPrefix + "1200", QSerialPort::Baud1200);
-
-
-    //Check available port
-    const auto serialPortInfos = QSerialPortInfo::availablePorts();
-    for (const QSerialPortInfo &serialPortInfo : serialPortInfos) {
-//        QString serialNumber = serialPortInfo.serialNumber();
-//        QVariant data = (!serialNumber.isEmpty() ? serialNumber : "N/A");
-        QVariant data(serialPortInfo.portName());
-        ui->comboBox_serialPort->addItem(serialPortInfo.portName(), data);
-    }
-}
-
-void SerialStreamModule::connectUiSlots()
-{
-    connect(ui->button_start,&QPushButton::clicked,this, &SerialStreamModule::onStartClicked);
-    connect(ui->button_stop,&QPushButton::clicked,this, &SerialStreamModule::onStopClicked);
-    connect(ui->comboBox_serialPort, SIGNAL(currentIndexChanged(int)), this, SLOT(onSerialPortIndexChanged(int)));
-}
-
-void SerialStreamModule::onStartClicked()
-{
-
-}
-
-void SerialStreamModule::onStopClicked()
-{
-
-}
-
-void SerialStreamModule::onSerialPortIndexChanged(int index)
-{
-    QVariant data = ui->comboBox_serialPort->itemData(index);
-    ui->lineEdit_serialPort->setText(data.toString());
-}
diff --git a/Modules/SerialStream/serialstreammodule.h b/Modules/SerialStream/serialstreammodule.h
deleted file mode 100644
index e9f495aa0aa56ce72920ca333057a5eabcc87fc8..0000000000000000000000000000000000000000
--- a/Modules/SerialStream/serialstreammodule.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef SERIALSTREAMMODULE_H
-#define SERIALSTREAMMODULE_H
-
-#include "Modules/DefaultModule/defaultmodule.h"
-#include "Core/modulemessage.h"
-
-//Q_DECLARE_METATYPE(ModuleMessage);
-
-namespace Ui {
-class SerialStreamModule;
-}
-
-class SerialStreamModule : public DefaultModule
-{
-    Q_OBJECT
-
-public:
-    explicit SerialStreamModule(QWidget *parent = nullptr);
-    ~SerialStreamModule();
-
-    QWidget *toWidget() override;
-    XmlObject toXmlObject() override;
-    void fromXmlObject(const XmlObject &xmlObject) override;
-
-protected:
-    void initializeSerialPortView();
-    void connectUiSlots();
-    void onStartClicked();
-    void onStopClicked();
-
-protected slots:
-    void onSerialPortIndexChanged(int index);
-
-private:
-    Ui::SerialStreamModule *ui;
-};
-
-#endif // SERIALSTREAMMODULE_H
diff --git a/Modules/SerialStream/serialstreammodule.ui b/Modules/SerialStream/serialstreammodule.ui
deleted file mode 100644
index f941bf8a08b53fa9e7ac530a7d8adc69d968c02b..0000000000000000000000000000000000000000
--- a/Modules/SerialStream/serialstreammodule.ui
+++ /dev/null
@@ -1,169 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>SerialStreamModule</class>
- <widget class="QWidget" name="SerialStreamModule">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>405</width>
-    <height>350</height>
-   </rect>
-  </property>
-  <property name="minimumSize">
-   <size>
-    <width>0</width>
-    <height>350</height>
-   </size>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <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>
-    <layout class="QHBoxLayout" name="horizontalLayout_2">
-     <item>
-      <widget class="QLabel" name="label_2">
-       <property name="text">
-        <string>Write Topic</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QLineEdit" name="lineEdit_writeTopic"/>
-     </item>
-     <item>
-      <widget class="QPushButton" name="button_start">
-       <property name="text">
-        <string>Start Writing</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="button_stop">
-       <property name="text">
-        <string>Stop Writing</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout_3">
-     <item>
-      <widget class="QLabel" name="label">
-       <property name="text">
-        <string>Read Topic</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QLineEdit" name="lineEdit_readTopic"/>
-     </item>
-     <item>
-      <widget class="QPushButton" name="pushButton">
-       <property name="text">
-        <string>Start Reading</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="pushButton_2">
-       <property name="text">
-        <string>Stop Reading</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout">
-     <item>
-      <widget class="QLabel" name="label_3">
-       <property name="text">
-        <string>Port</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QComboBox" name="comboBox_serialPort"/>
-     </item>
-     <item>
-      <widget class="QLineEdit" name="lineEdit_serialPort"/>
-     </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>
-    </layout>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout_4">
-     <item>
-      <widget class="QComboBox" name="comboBox_baudRate"/>
-     </item>
-     <item>
-      <widget class="QLabel" name="label_4">
-       <property name="text">
-        <string>Timeout [s]</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QDoubleSpinBox" name="doubleSpinBox"/>
-     </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>
-    <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/Modules/moduleinfo.h b/Modules/moduleinfo.h
index 103dd9f015ba733591f9ccdb37fe3f6772e8b987..528d53e8550654b44339bea73b02d7b11db81818 100644
--- a/Modules/moduleinfo.h
+++ b/Modules/moduleinfo.h
@@ -20,7 +20,7 @@ enum ModuleId{
     FSMVIEWER,
     TREEVIEWER,
     SCROLLAREA,
-    SERIALSTREAM,
+    FILESTREAM,
     MAVLINK_RCK_TESTING
 };
 
diff --git a/Modules/moduleslist.cpp b/Modules/moduleslist.cpp
index e3e7c578a321d0bbc50061b66e9dc6d55709d51e..e7d34341b8a7c8c08651cd0517a3ea4e7417c8bc 100644
--- a/Modules/moduleslist.cpp
+++ b/Modules/moduleslist.cpp
@@ -17,7 +17,7 @@
 #include "Modules/Fsm/fsmviewermodule.h"
 #include "Modules/TreeViewer/treeviewermodule.h"
 #include "Modules/ScrollArea/scrollareamodule.h"
-#include "Modules/SerialStream/serialstreammodule.h"
+#include "Modules/FileStream/filestreammodule.h"
 #include "Modules/Mavlink/mavlinkrocketmsgtestingmodule.h"
 
 void ModulesList::createModuleList()
@@ -112,7 +112,7 @@ void ModulesList::createModuleList()
     addModuleInfo(mavlink);
     #endif
 
-    #ifdef SERIALSTREAMMODULE_H
+    #ifdef MAVLINKROCKETMSGTESTINGMODULE_H
     ModuleInfo mvkRckTesting(ModuleId::MAVLINK_RCK_TESTING, "MavlinkRocketMsgTesting", ModuleCategory::DEFAULT);
     mvkRckTesting.setFactory([](){return new MavlinkRocketMsgTestingModule();});
     addModuleInfo(mvkRckTesting);
@@ -139,11 +139,11 @@ void ModulesList::createModuleList()
     addModuleInfo(scrollArea);
     #endif
 
-    #ifdef SERIALSTREAMMODULE_H
-    ModuleInfo serialStream(ModuleId::SERIALSTREAM, "SerialStream", ModuleCategory::DATASOURCE);
-    serialStream.setFactory([](){return new SerialStreamModule();});
-    serialStream.addModuleSourceFiles("Modules/SerialStream/");
-    addModuleInfo(serialStream);
+    #ifdef FILESTREAMMODULE_H
+    ModuleInfo fileStream(ModuleId::FILESTREAM, "FileStream", ModuleCategory::DATASOURCE);
+    fileStream.setFactory([](){return new FileStreamModule();});
+    fileStream.addModuleSourceFiles("Modules/FileStream/");
+    addModuleInfo(fileStream);
     #endif
 }
 
diff --git a/Modules/skywardhubstrings.cpp b/Modules/skywardhubstrings.cpp
index 8099e019eec3e4994456a0ccf8b18ed9da5e40b8..5c131144431eee8983c10ed9917a77c47a33e348 100644
--- a/Modules/skywardhubstrings.cpp
+++ b/Modules/skywardhubstrings.cpp
@@ -6,6 +6,7 @@ const QString SkywardHubStrings::defaultConfigurationFolder = "SkywardHubConfig"
 const QString SkywardHubStrings::defaultSettingsFilePath = defaultConfigurationFolder + "/" + "settings.xml";
 const QString SkywardHubStrings::defaultPrefabsFolderName = "Prefabs";
 const QString SkywardHubStrings::defaultLogsFolder = defaultConfigurationFolder + "/" + "Logs";
+const QString SkywardHubStrings::defaultStreamFile = defaultConfigurationFolder + "/" + "StreamFile.txt";
 const QString SkywardHubStrings::defaultPrefabsFolder = defaultConfigurationFolder + "/" + defaultPrefabsFolderName +"/";
 const QString SkywardHubStrings::defaultConfigurationFileName = "default.xml";
 const QString SkywardHubStrings::defaultConfigurationIconPath = defaultConfigurationFolder + "/" + "defaultConfigIcon.svg";
diff --git a/Modules/skywardhubstrings.h b/Modules/skywardhubstrings.h
index a631c0f4d5fa503b6b286be81f79744f8969c3dd..9d4359699f31f3edca9fa3cfc4bf4d6166e3791c 100644
--- a/Modules/skywardhubstrings.h
+++ b/Modules/skywardhubstrings.h
@@ -15,6 +15,7 @@ public:
     static const QString defaultConfigurationFileName;
     static const QString defaultConfigurationIconPath;
     static const QString defaultLogsFolder;
+    static const QString defaultStreamFile;
 
     // Xml Tags Name
     static const QString settingsObjectName;
diff --git a/SkywardHub.pro b/SkywardHub.pro
index 2fb40d62c8759387e531a73a4e6ec7cf6ddca550..a375acafd0729eb0808dc2847b952ec6340cef31 100644
--- a/SkywardHub.pro
+++ b/SkywardHub.pro
@@ -20,6 +20,7 @@ SOURCES += \
     Modules/CommandPad/telemetryrequestmodule.cpp \
     Modules/DefaultModule/defaultmodule.cpp \
     Modules/Empty/emptymodule.cpp \
+    Modules/FileStream/filestreammodule.cpp \
     Modules/Fsm/Model/model.cpp \
     Modules/Fsm/Model/scxml.cpp \
     Modules/Fsm/Model/state.cpp \
@@ -50,7 +51,6 @@ SOURCES += \
     Modules/Mavlink/rs232.c \
     Modules/MessageViewer/messagesviewermodule.cpp \
     Modules/ScrollArea/scrollareamodule.cpp \
-    Modules/SerialStream/serialstreammodule.cpp \
     Modules/SkywardHub/deployer.cpp \
     Modules/SkywardHub/deployerpathpicker.cpp \
     Modules/SkywardHub/prefabdialog.cpp \
@@ -83,6 +83,7 @@ HEADERS += \
     Modules/CommandPad/telemetryrequestmodule.h \
     Modules/DefaultModule/defaultmodule.h \
     Modules/Empty/emptymodule.h \
+    Modules/FileStream/filestreammodule.h \
     Modules/Fsm/Model/model.h \
     Modules/Fsm/Model/scxml.h \
     Modules/Fsm/Model/state.h \
@@ -115,7 +116,6 @@ HEADERS += \
     Modules/Mavlink/rs232.h \
     Modules/MessageViewer/messagesviewermodule.h \
     Modules/ScrollArea/scrollareamodule.h \
-    Modules/SerialStream/serialstreammodule.h \
     Modules/SkywardHub/deployer.h \
     Modules/SkywardHub/deployerpathpicker.h \
     Modules/SkywardHub/prefabdialog.h \
@@ -139,6 +139,7 @@ FORMS += \
     Modules/CommandPad/commandpadmodule.ui \
     Modules/CommandPad/telemetryrequestmodule.ui \
     Modules/Empty/emptymodule.ui \
+    Modules/FileStream/filestreammodule.ui \
     Modules/Fsm/View/mainwindow.ui \
     Modules/Fsm/View/statedialog.ui \
     Modules/Fsm/View/transitiondialog.ui \
@@ -152,7 +153,6 @@ FORMS += \
     Modules/Mavlink/mavlinkrocketmsgtestingmodule.ui \
     Modules/MessageViewer/messagesviewermodule.ui \
     Modules/ScrollArea/scrollareamodule.ui \
-    Modules/SerialStream/serialstreammodule.ui \
     Modules/SkywardHub/deployerpathpicker.ui \
     Modules/SkywardHub/prefabdialog.ui \
     Modules/SkywardHub/prefabviewelement.ui \
diff --git a/SkywardHub.pro.user b/SkywardHub.pro.user
index 29cabb50dd0a0376e569d59300dfdeec5094e4a8..f0ffb8befa8acb04c535fd7818cc7c6c4fde392c 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-14T12:55:11. -->
+<!-- Written by QtCreator 4.14.2, 2021-07-14T18:16:08. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>