diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..40c0bc402bb869fbb5772076a04c4e20a87ed499
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,27 @@
+# This file is a template, and might need editing before it works on your project.
+# use the official gcc image, based on debian
+# can use verions as well, like gcc:5.2
+# see https://hub.docker.com/_/gcc/
+image: dock0/arch
+build:
+  stage: build
+  # instead of calling g++ directly you can also use some build toolkit like make
+  # install the necessary build tools when needed
+  variables:
+    GIT_SUBMODULE_STRATEGY: recursive
+
+  before_script:
+    - pacman -Syu --noconfirm
+    - pacman -S base-devel --noconfirm
+    - pacman -S qt5-base --noconfirm
+    - pacman -S qt5-serialport --noconfirm
+    - whereis qmake
+
+  script:
+    - echo $PATH
+    - whereis qmake
+    - make
+
+  artifacts:
+    paths:
+      - release/CANtoWIFI
diff --git a/CANtoWIFI b/CANtoWIFI
deleted file mode 100755
index 2962a1c6c07bd582d0cbc7670bd4705d6079b082..0000000000000000000000000000000000000000
Binary files a/CANtoWIFI and /dev/null differ
diff --git a/CANtoWIFI.pro b/CANtoWIFI.pro
index 58db2e7eb29a31e46bd2f6fb347436f109a8eec7..a7b5b4bf141ea6106a6deeb2a8f3639196290392 100644
--- a/CANtoWIFI.pro
+++ b/CANtoWIFI.pro
@@ -2,12 +2,13 @@ QT -= gui
 QT += network
 QT += serialport
 
-CONFIG += c++11 console
+CONFIG += c++17 console
 CONFIG += silent
+CONFIG += sdk_no_version_check
 
 QMAKE_CC = g++
 
-QMAKE_CXXFLAGS += -std=c++11
+QMAKE_CXXFLAGS += -std=c++17
 
 # The following define makes your compiler emit warnings if you use
 # any feature of Qt which as been marked deprecated (the exact warnings
@@ -18,11 +19,6 @@ QMAKE_CXXFLAGS += -std=c++11
 
 SOURCES += \
     main.cpp \
-    COM/Comsguy.cpp \
-    COM/LogPlay.cpp \
-    COM/LogRec.cpp \
-    COM/SerialPort.cpp \
-    COM/UdpSocket.cpp \
     can-ids/Devices/LOGGER_CAN.C \
     can-ids/Devices/AHRS_CAN.c \
     can-ids/Devices/ARM_CAN.c \
@@ -41,16 +37,15 @@ SOURCES += \
     can-ids/Devices/TE_CAN.c \
     can-ids/CAN_IDs.c \
     can-ids/table.c \
-    COM/COM.cpp
+    COM/COM.cpp \
+    COM/ComsGirl.cpp \
+    COM/UdpSendSock.cpp \
+    COM/UdpReceiveSock.cpp \
+    COM/LogPlay.cpp \
+    COM/LogRec.cpp \
+    COM/SerialPort.cpp
 
 HEADERS += \
-    COM/COM.h \
-    COM/Comsguy.h \
-    COM/LogPlay.h \
-    COM/LogRec.h \
-    COM/SerialPort.hpp \
-    COM/UdpSocket.h \
-    moc_predefs.h \
     can-ids/Devices/AHRS_CAN.h \
     can-ids/Devices/ARM_CAN.h \
     can-ids/Devices/BMS_MASTER_CAN.h \
@@ -71,7 +66,13 @@ HEADERS += \
     can-ids/DOC/tablec.jinja \
     can-ids/CAN_IDs.h \
     can-ids/table.h \
-    moc_predefs.h
+    COM/COM.hpp \
+    COM/LogPlay.hpp \
+    COM/LogRec.hpp \
+    COM/SerialPort.hpp \
+    COM/ComsGirl.hpp \
+    COM/UdpSendSock.hpp \
+    COM/UdpReceiveSock.hpp
 
 DISTFILES += \
     can-ids/README.md \
diff --git a/COM/COM.cpp b/COM/COM.cpp
index cdb0988b2bbe4823ed42ca9027eab82cca11d6c0..3ebac2db415a58716ac84ac6ff459964421a22f4 100644
--- a/COM/COM.cpp
+++ b/COM/COM.cpp
@@ -1,4 +1,4 @@
-#include "COM.h"
+#include "COM.hpp"
 
 COM::COM()
 {
@@ -15,15 +15,15 @@ int COM::close(void)
     delete this;
 }
 
-int COM::send(CANdata)
+int COM::send(CANmessage)
 {
     return 0;
 
 }
 
-std::pair<int, CANdata> COM::pop(void)
+std::pair<int, CANmessage> COM::pop(void)
 {
-    std::pair<int, CANdata> package;
+    std::pair<int, CANmessage> package;
     return package;
 
 }
diff --git a/COM/COM.h b/COM/COM.hpp
similarity index 82%
rename from COM/COM.h
rename to COM/COM.hpp
index 1156f7f50a1bc6dec2d23dbd55fe9b8d49e5d23f..fa3f92578fb0bd9edff071dc387b9b024af89ebb 100644
--- a/COM/COM.h
+++ b/COM/COM.hpp
@@ -30,14 +30,17 @@ public:
     COM();
     virtual bool open(QString);
     virtual int close(void);
-    virtual int send(CANdata msg);
-    virtual std::pair<int, CANdata> pop(void);
+    virtual int send(CANmessage msg);
+    virtual std::pair<int, CANmessage> pop(void);
 
 public slots:
     virtual void read(void);
 
 private:
 
+signals:
+    void closing(void);
+
 };
 
 #endif // COM_H
diff --git a/COM/ComsGirl.cpp b/COM/ComsGirl.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..58c862a05d4f206a9b2d652ba96a26f2b15c33ba
--- /dev/null
+++ b/COM/ComsGirl.cpp
@@ -0,0 +1,152 @@
+#include "ComsGirl.hpp"
+
+ComsGirl::ComsGirl(Source source,
+                   Input Input,
+                   Output Output,
+                   LoggerStatus Logger,
+                   NameOption NameOption)
+{
+
+    MsgCounter = 0;
+    switch (source) {
+        case Serial:
+            printf("Source COM is Serial\n");
+            SourceCOM = new SerialPort;
+            if (NameOption == CustomNames) {
+                printf("Available Ports:\n");
+                for (int i=0; i < QSerialPortInfo::availablePorts().size(); i++)
+                    printf("%d -> %s\n",i,qPrintable(QSerialPortInfo::availablePorts().at(i).portName()));
+                printf("Type SerialPort index: ");
+                int Input;
+                std::cin >> Input;
+                DeviceName = QSerialPortInfo::availablePorts().at(Input).portName();
+            };
+            if (DeviceName.isEmpty())
+                DeviceName = DEFAULT_SOURCE_NAME_LINUX;
+           SourceCOM->open(DeviceName);
+            connect(SourceCOM,SIGNAL(new_messages(int)),this,SLOT(broadcast_messages(int)));
+        break;
+        case SPI:
+        break;
+        case Kvaser:
+        break;
+    };
+
+    printf("########################################################\n");
+
+    switch (Logger) {
+        case Off:
+            printf("Log recorder offline!\n");
+        break;
+        case On:
+            LoggerCOM = new LogRec;
+            if (NameOption == CustomNames) {
+                printf("Type Logger File Name: ");
+                char Input;
+                std::cin >> Input;
+                LoggerName = Input;
+            };
+            if (LoggerName.isEmpty())
+                LoggerName = DEFAULT_LOG_FILE_NAME;
+            if (LoggerName.isEmpty())
+                LoggerName = QString(QDateTime::currentDateTime().toString().prepend("/home/pi/Desktop/"));
+            LoggerCOM->open(LoggerName);
+            //connect(SourceCOM,SIGNAL(send_to_log(CANmessage)),LoggerCOM,SLOT(send(CANmessage)));
+        break;
+    };
+
+    printf("########################################################\n");
+
+    switch (Input) {
+        case Void:
+        break;
+        case UdpReceiver:
+            qDebug("Receiving through UDP");
+            InputCOM = new UdpReceiveSock;
+            if (NameOption == CustomNames) {
+                printf("Available IPs:\n");
+                for (int i=0; i < QNetworkInterface::allAddresses().size(); i++)
+                    printf("%d -> %s\n",i,qPrintable(QNetworkInterface::allAddresses().at(i).toString()));
+                printf("Type IP: ");
+                char Input;
+                std::cin >> Input;
+                InputIP4 = Input;
+                printf("Type Port: ");
+                std::cin >> Input;
+                InputIP4.append(":");
+                InputIP4.append(Input);
+            };
+            if (InputIP4.isEmpty()) {
+                InputIP4 = DEFAULT_OUTPUT_ADRESS;
+                InputIP4.append(":");
+                InputIP4.append(DEFAULT_INPUT_PORT);
+            }
+            InputCOM->open(InputIP4);
+        break;
+        case TcpReceiver:
+            //InputCOM = new TcpReceivSock;
+        break;
+    };
+
+    connect(InputCOM,SIGNAL(new_messages(int)),this,SLOT(rebroadcast_messages(int)));
+    connect(this,SIGNAL(rebroadcast_package(CANmessage)),SourceCOM,SLOT(send(CANmessage)));
+
+    switch (Output) {
+        case None:
+            printf("No Output");
+        break;
+        case UdpSender:
+            qDebug("Sending through UDP");
+            OutputCOM = new UdpSendSock;
+            if (NameOption == CustomNames) {
+                printf("Available IPs:\n");
+                for (int i=0; i < QNetworkInterface::allAddresses().size(); i++)
+                    printf("%d -> %s\n",i,qPrintable(QNetworkInterface::allAddresses().at(i).toString()));
+                printf("Type IP: ");
+                char Input;
+                std::cin >> Input;
+                OutputIP4 = Input;
+                printf("Type Port: ");
+                std::cin >> Input;
+                OutputIP4.append(":");
+                OutputIP4.append(Input);
+            };
+            if (OutputIP4.isEmpty()) {
+                OutputIP4 = DEFAULT_OUTPUT_ADRESS;
+                OutputIP4.append(":");
+                OutputIP4.append(DEFAULT_OUTPUT_PORT);
+            }
+            OutputCOM->open(OutputIP4);
+        break;
+        case TcpSender:
+           // OutputCOM = new TcpSendSock;
+        break;
+    };
+
+    connect(this,SIGNAL(broadcast_package(CANmessage)),OutputCOM,SLOT(send(CANmessage)));
+
+    printf("########################################################\n");
+}
+
+void ComsGirl::broadcast_messages(int){
+    MsgCounter++;
+    std::pair<int,CANmessage> package;
+    package = SourceCOM->pop();
+    CANdata message = package.second.candata;
+    if (package.second.candata.sid==1) {
+        package.second.candata.data[1] = static_cast<uint16_t>(MsgCounter-1);
+        MsgCounter = 0;
+    }
+    emit broadcast_package(package.second);
+}
+
+void ComsGirl::rebroadcast_messages(int){
+    //MsgCounter++;
+    std::pair<int,CANmessage> package;
+    package = InputCOM->pop();
+//    if (package.second.candata.sid==1) {
+//        package.second.candata.data[1] = static_cast<uint16_t>(MsgCounter-1);
+//        MsgCounter = 0;
+//    }
+    emit rebroadcast_package(package.second);
+}
diff --git a/COM/ComsGirl.hpp b/COM/ComsGirl.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..a95eeba13429f126876344fc11d9b6384cbf5465
--- /dev/null
+++ b/COM/ComsGirl.hpp
@@ -0,0 +1,83 @@
+#ifndef COMSGIRL_HPP
+#define COMSGIRL_HPP
+
+// QT Classes to include
+#include <QObject>
+#include <QThread>
+// C++ Classes to include
+#include <iostream>
+
+// Local Classes to include
+#include "COM.hpp"
+#include "SerialPort.hpp"
+#include "LogRec.hpp"
+#include "UdpSendSock.hpp"
+#include "UdpReceiveSock.hpp"
+
+// Default values for program automation
+#define DEFAULT_SOURCE_NAME_LINUX "tty.usbmodem14101"
+#define DEFAULT_LOG_FILE_NAME ""
+#define DEFAULT_INPUT_ADDRESS "127.0.0.1"
+#define DEFAULT_INPUT_PORT "4001"
+#define DEFAULT_OUTPUT_ADRESS "255.255.255.255"
+#define DEFAULT_OUTPUT_PORT "4000"
+
+class ComsGirl : public QObject
+{
+    Q_OBJECT
+
+public:
+    typedef enum _Source {
+        Serial = 0,
+        SPI    = 1,
+        Kvaser = 2,
+    } Source;
+    typedef enum  _LoggerStatus {
+        Off = 0,
+        On = 1
+    } LoggerStatus ;
+    typedef enum _Input {
+        Void        = 0,
+        UdpReceiver = 1,
+        TcpReceiver = 2,
+    } Input ;
+    typedef enum _Output {
+        None        = 0,
+        UdpSender   = 1,
+        TcpSender   = 2,
+    } Output ;
+    typedef enum _NameOption {
+        DefaultNames = 0,
+        CustomNames  = 1
+    } NameOption ;
+
+    explicit ComsGirl(Source,
+                      Input,
+                      Output,
+                      LoggerStatus,
+                      NameOption);
+
+public slots:
+    void broadcast_messages(int);
+    void rebroadcast_messages(int);
+
+private:
+    int MsgCounter;
+    COM *SourceCOM;
+        QString DeviceName;
+    COM *InputCOM;
+        QString InputIP4;
+        QString InputPort;
+    COM *OutputCOM;
+        QString OutputIP4;
+        QString OutputPort;
+    COM *LoggerCOM;
+        QString LoggerName;
+
+signals:
+    void broadcast_package(CANmessage);
+    void rebroadcast_package(CANmessage);
+
+};
+
+#endif // COMSGIRL_H
diff --git a/COM/Comsguy.cpp b/COM/Comsguy.cpp
deleted file mode 100644
index fc76fc807b6ca88bc73e7c0a3367fd0f800fe819..0000000000000000000000000000000000000000
--- a/COM/Comsguy.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-#include "COM/Comsguy.h"
-
-
-Comsguy::Comsguy(QObject *parent) : QObject(parent)
-{
-    AllPorts = new LogRec;
-}
-
-Comsguy::~Comsguy() {
-    return;
-}
-
-void Comsguy::updateCOM(PortType type, QString target, QString secondtarget)
-{
-    switch (type) {
-    case Start:
-        CurrentCOM[target] = new SerialPort;
-        open(target);
-        break;
-    case Close:
-        if (secondtarget.compare("All")==0) {
-            AllPorts->close();
-        } else if (!CurrentCOM.empty()) {
-            close(target);
-        }
-        break;
-    case Wifi:
-        CurrentCOM[target] = new UdpSocket;
-        connect(this,SIGNAL(broadcast_arrival_of_CAN_message(CANdata)),
-                CurrentCOM.values(target).at(CurrentCOM.values(target).size()-1),SLOT(send(CANdata)));
-        break;
-//    case LogReader:
-//        CurrentCOM[target] = new LogPlay;
-//        open(target);
-//        break;
-    case LogRecorder:
-        if (secondtarget.compare("All")==0) {
-            AllPorts->open(target);
-            connect(this,SIGNAL(broadcast_arrival_of_CAN_message(CANdata)),AllPorts,SLOT(send(CANdata)));
-        } else {
-            CurrentCOM.insertMulti(secondtarget, new LogRec);
-            CurrentCOM.values(secondtarget).at(0)->open(target);
-            connect(CurrentCOM.values(secondtarget).at(1),SIGNAL(send_to_log(CANdata)),CurrentCOM.values(secondtarget).at(0),SLOT(send(CANdata)));
-            emit Com_Status(CurrentCOM.keys());
-        }
-        break;
-    case KvaserLog:
-        CurrentCOM[target] = new SerialPort;
-        open(target);
-        break;
-    case KvaserSerial:
-        CurrentCOM[target] = new SerialPort;
-        open(target);
-        break;
-    }
-}
-
-void Comsguy::send(CANdata msg)
-{
-    foreach (QString Key, CurrentCOM.uniqueKeys())
-        CurrentCOM.values(Key).at(CurrentCOM.values(Key).size()-1)->send(msg);
-}
-
-void Comsguy::open(QString target){
-    if (!CurrentCOM.contains(target)) {
-        return;
-    }
-    if (CurrentCOM.value(target)->open(target)) {
-        connect(CurrentCOM.values(target).at(CurrentCOM.values(target).size()-1), SIGNAL(new_messages(int)), this, SLOT(broadcast_messages(void)));
-        this->close("(none)");
-        emit Com_Status(CurrentCOM.keys());
-    } else {
-        printf("%s","Error! - Unable to open device port.");
-    }
-}
-
-void Comsguy::close(QString target){
-    if (target.startsWith("[LOGREC] ")) {
-        target.replace(QString("[LOGREC] "), QString(""));
-        CurrentCOM.values(target).at(0)->close();
-        CurrentCOM.take(target);
-    } else {
-        foreach (COM *device, CurrentCOM.values(target))
-            device->close();
-            CurrentCOM.remove(target);
-    }
-    emit Com_Status(CurrentCOM.keys());
-}
-
-void Comsguy::broadcast_messages()
-{
-    foreach (QString Key, CurrentCOM.uniqueKeys()) {
-        std::pair<int, CANdata> package;
-        package = CurrentCOM.values(Key).at(CurrentCOM.values(Key).size()-1)->pop();
-        emit broadcast_arrival_of_CAN_message(package.second);
-    }
-}
diff --git a/COM/Comsguy.h b/COM/Comsguy.h
deleted file mode 100644
index 79bce2d833095d36c421e41492709b031ca610fb..0000000000000000000000000000000000000000
--- a/COM/Comsguy.h
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef COMSGUY_H
-#define COMSGUY_H
-
-#include <QObject>
-#include <QTextStream>
-#include <QFile>
-#include <QString>
-#include <QMap>
-
-#include "COM/COM.h"
-#include "COM/SerialPort.hpp"
-#include "COM/LogRec.h"
-#include "COM/UdpSocket.h"
-#include "can-ids/CAN_IDs.h"
-#include "can-ids/Devices/INTERFACE_CAN.h"
-
-namespace Ui {
-    class Comsguy;
-}
-
-typedef enum _PortType {
-    Start = -1,
-    Close = 0,
-    Serial = 1,
-    Wifi = 2,
-    LogRecorder = 3,
-    LogRecorderStatus = 4,
-    LogReader = 5,
-    KvaserLog = 6,
-    KvaserSerial = 7,
-
-} PortType;
-
-class Comsguy : public QObject
-{
-    Q_OBJECT
-
-public:
-    explicit Comsguy(QObject *parent = nullptr);
-    ~Comsguy(void);
-    bool _linked;
-
-public slots:
-    void close(QString);
-    void updateCOM(PortType,QString,QString);
-
-private slots:
-    void open(QString);
-    void send(CANdata);
-    //void write(QString string);
-    void broadcast_messages();
-    //void broadcast_raw_messages(void);
-
-private:
-    COM *Temp;
-    LogRec *AllPorts;
-    QMap<QString, COM*> CurrentCOM;
-    bool LogRecStatus;
-
-signals:
-    void broadcast_arrival_of_CAN_message(CANdata);
-    void Com_Status(QList<QString>);
-    //void broadcast_arrival_of_raw_CAN_message(QByteArray);
-};
-
-#endif // COMSGUY_H
diff --git a/COM/LogPlay.cpp b/COM/LogPlay.cpp
index e42b17aca9ac3f7cecff90d1be69638993820397..2cbb39c2817b69443cd5368c2449848d3f02d6a0 100644
--- a/COM/LogPlay.cpp
+++ b/COM/LogPlay.cpp
@@ -1,4 +1,4 @@
-#include "LogPlay.h"
+#include "LogPlay.hpp"
 
 LogPlay::LogPlay()
 {
diff --git a/COM/LogPlay.h b/COM/LogPlay.hpp
similarity index 90%
rename from COM/LogPlay.h
rename to COM/LogPlay.hpp
index 07dbe0e82008e504105183c6bd5829326570f0de..f41cb60455abb0fe83d9f51736ce9df0cb4f84ad 100644
--- a/COM/LogPlay.h
+++ b/COM/LogPlay.hpp
@@ -1,7 +1,7 @@
 #ifndef LOGPLAY_H
 #define LOGPLAY_H
 
-#include "COM/COM.h"
+#include "COM.hpp"
 
 #include <QObject>
 
diff --git a/COM/LogRec.cpp b/COM/LogRec.cpp
index 364e5c520c8eea1f06679df90a487ac1b3412cca..554735874a3fa20f0c2b069ceb2e526fd57d2604 100644
--- a/COM/LogRec.cpp
+++ b/COM/LogRec.cpp
@@ -1,4 +1,4 @@
-#include "LogRec.h"
+#include "LogRec.hpp"
 
 LogRec::LogRec()
 {
@@ -8,11 +8,8 @@ LogRec::LogRec()
 bool LogRec::open(const QString filename)
 {
     time = time.currentDateTime();
-    if (filename.isEmpty()) {
-        _logfile.setFileName(QDateTime::currentDateTime().toString());
-    } else {
-        _logfile.setFileName(filename);
-    }
+    qDebug() << filename;
+    _logfile.setFileName(filename);
 
     if(_logfile.open(QIODevice::Append | QIODevice::Text)){
 
@@ -40,12 +37,12 @@ int LogRec::close(void)
     return 0;
 }
 
-int LogRec::send(CANdata msg)
+int LogRec::send(CANmessage msg)
 {
     char log_string[512];
-
-    sprintf(log_string, "%u,%u,%u,%u,%u,%u", msg.sid, msg.dlc, msg.data[0],
-            msg.data[1], msg.data[2], msg.data[3]); // msg.timestamp
+    sprintf(log_string, "%u,%u,%u,%u,%u,%u\n", msg.candata.sid, msg.candata.dlc, msg.candata.data[0],
+            msg.candata.data[1], msg.candata.data[2], msg.candata.data[3]); // msg.timestamp
+    qDebug() << log_string;
     _logstream << log_string << "\n"; // Do not flush here!!! Computer would be bogged down flushing every message
 
     return 0;
diff --git a/COM/LogRec.h b/COM/LogRec.hpp
similarity index 90%
rename from COM/LogRec.h
rename to COM/LogRec.hpp
index 2095349790fd7f20964e6b564840ab64a76de730..8f04f4f151a69791e32c113a0ce964ea47eaebc2 100644
--- a/COM/LogRec.h
+++ b/COM/LogRec.hpp
@@ -1,7 +1,7 @@
 #ifndef LOGREC_H
 #define LOGREC_H
 
-#include "COM/COM.h"
+#include "COM.hpp"
 
 #include <QObject>
 #include <QTimer>
@@ -26,7 +26,7 @@ public:
     virtual int  close(void) override;
 
 public slots:
-    virtual int send(CANdata msg) override;
+    virtual int send(CANmessage msg) override;
     virtual void read(void) override;
 
 private:
diff --git a/COM/SerialPort.cpp b/COM/SerialPort.cpp
index 73c6a179b1d28d09ec85f267e00c9c069d4683c3..7955224a616c58410e727190a52a54924d48a78c 100644
--- a/COM/SerialPort.cpp
+++ b/COM/SerialPort.cpp
@@ -104,37 +104,47 @@ void SerialPort::handleError(QSerialPort::SerialPortError error)
 {
 	switch (error){
 			case QSerialPort::NoError:
+                //restore->stop();
 				break;
 			case QSerialPort::DeviceNotFoundError:
 				fprintf(stderr, "Unexpected Error, Device Not Found\n");
+                //restore->start(3000);
 				break;
 			case QSerialPort::PermissionError:
 				fprintf(stderr, "Really Sorry, But you lack the permissions\n");
+                //restore->start(3000);
 				break;
 			case QSerialPort::OpenError:
 				fprintf(stderr, "Unexpected Error while opening the port\n");
+                //restore->start(3000);
 				break;
 			case QSerialPort::NotOpenError:
 				fprintf(stderr, "Unexpected Error is the device open?\n");
+                //restore->start(3000);
 				break;
 			case QSerialPort::WriteError:
 				fprintf(stderr, "Error while writing, closing port...\n");
+                //restore->start(3000);
                 close();
 				break;
 			case QSerialPort::ReadError:
 				fprintf(stderr, "Error while reading, closing port...\n");
+                //restore->start(3000);
                 close();
 				break;
 			case QSerialPort::ResourceError:
 				fprintf(stderr, "Resource Error. Did you remove the device? closing port...\n");
+                //restore->start(3000);
                 close();
 				break;
 			case QSerialPort::UnsupportedOperationError:
 				fprintf(stderr, "Dont you ping of death me!!...\n");
+                //restore->start(3000);
                 close();
-				break;
+                break;
 			default:
 				fprintf(stderr, "I cant handle this, closing port...\n");
+                //restore->start(3000);
                 close();
 				break;
 		}
@@ -147,7 +157,7 @@ void SerialPort::handleError(QSerialPort::SerialPortError error)
  * Desc:    Opens and configures the serial port.
  *          Starts worker thread to read from the port.
  **********************************************************************/
-bool SerialPort::open(const QString portname)
+bool SerialPort::open(const QString port)
 {
     // reopens port rather than creating another file descriptor every time open is issued
 	if (_status != 0){
@@ -178,6 +188,7 @@ bool SerialPort::open(const QString portname)
  **********************************************************************/
 int SerialPort::close(void){
 
+    delete restore;
 	int err = 0;
 
 
@@ -221,7 +232,7 @@ void remove_white_space(QStringList *CanMessageList_temp){
 
 void SerialPort::read(void)
 {
-    unsigned int valid_messages = 0;
+    int valid_messages = 0;
     memset(aux_buffer, 0, aux_buffer_size);
 
     // read can't be blocking or thread may never quit before another one is issued!
@@ -240,8 +251,7 @@ void SerialPort::read(void)
             emit new_raw();
             continue;
         }
-        printf("%d\n",CanMessageList.size());
-        if (CanMessageList.size() == 6) {
+        if (CanMessageList.size() == 6 || CanMessageList.size() == 7) {
                 valid_messages++;
         }
         else
@@ -259,8 +269,18 @@ void SerialPort::read(void)
         for (int i=0; i<4; i++) {
             msg.data[i] = CanMessageList.at(i+2).toInt();
         }
+
+        CANmessage Msg;
+
+        Msg.candata = msg;
+	if (CanMessageList.size() == 7) {
+        	Msg.timestamp = CanMessageList.at(6).toInt();
+	} else {
+		Msg.timestamp = 0;
+	}
+
         //_queueLkc.lock();
-        _queue.push(msg);
+        _queue.push(Msg);
         //_queueLkc.unlock();
 
         if (valid_messages) {
@@ -275,7 +295,7 @@ void SerialPort::read(void)
 // Yet, another good itoa implementation
 //
 // returns: the length of the number string
-int base10_to_string(uint8_t *sp, int value)
+uint16_t base10_to_string(uint8_t *sp, int value)
 {
     uint8_t tmp[16];// be careful with the length of the buffer
     uint8_t *tp = tmp;
@@ -299,7 +319,7 @@ int base10_to_string(uint8_t *sp, int value)
             *tp++ = i + 'a' - 10;
     }
 
-    int len = tp - tmp;
+    uint16_t len = tp - tmp;
 
     if (sign)
     {
@@ -319,39 +339,39 @@ int base10_to_string(uint8_t *sp, int value)
  * Return:  exit status
  * Desc:    Send CAN message to UART.
  **********************************************************************/
-int SerialPort::send(CANdata msg)
+int SerialPort::send(CANmessage msg)
 {
-    uint8_t message[256];
-    uint8_t aux[256];
-    uint16_t i=0, len=0;
-
-    len = base10_to_string(aux, msg.sid);
-    strcpy((char *) (message+i), (char *) aux);
-    i += len;
-    message[i++] = ',';
-    len = base10_to_string(aux, msg.dlc);
-    strcpy((char *)(message+i), (char *)aux);
-    i+=len;
-    message[i++] = ',';
-    len = base10_to_string(aux, msg.data[0]);
-    strcpy((char *) (message+i), (char *) aux);
-    i+=len;
-    message[i++] = ',';
-    len = base10_to_string(aux, msg.data[1]);
-    strcpy((char *) (message+i), (char *) aux);
-    i+=len;
-    message[i++] = ',';
-    len = base10_to_string(aux, msg.data[2]);
-    strcpy((char *) (message+i), (char *) aux);
-    i+=len;
-    message[i++] = ',';
-    len = base10_to_string(aux, msg.data[3]);
-    strcpy((char *) (message+i), (char *) aux);
-    i+=len;
-    message[i] = '\n';
-    message[i+1] = '\0';
-
-    return _writePort((const unsigned char *)message, i+1);
+uint8_t message[256];
+uint8_t aux[256];
+uint16_t i=0, len=0;
+
+len = base10_to_string(aux, msg.candata.sid);
+strcpy(reinterpret_cast<char *>(message+i),reinterpret_cast<char *>(aux));
+i += len;
+message[i++] = ',';
+len = base10_to_string(aux, msg.candata.dlc);
+strcpy(reinterpret_cast<char *>(message+i),reinterpret_cast<char *>(aux));
+i+=len;
+message[i++] = ',';
+len = base10_to_string(aux, msg.candata.data[0]);
+strcpy(reinterpret_cast<char *>(message+i),reinterpret_cast<char *>(aux));
+i+=len;
+message[i++] = ',';
+len = base10_to_string(aux, msg.candata.data[1]);
+strcpy(reinterpret_cast<char *>(message+i),reinterpret_cast<char *>(aux));
+i+=len;
+message[i++] = ',';
+len = base10_to_string(aux, msg.candata.data[2]);
+strcpy(reinterpret_cast<char *>(message+i),reinterpret_cast<char *>(aux));
+i+=len;
+message[i++] = ',';
+len = base10_to_string(aux, msg.candata.data[3]);
+strcpy(reinterpret_cast<char *>(message+i),reinterpret_cast<char *>(aux));
+i+=len;
+message[i] = '\n';
+message[i+1] = '\0';
+
+return _writePort(reinterpret_cast<const unsigned char *>(message), i+1);
 }
 
 
@@ -361,13 +381,13 @@ int SerialPort::send(CANdata msg)
  * Return:  exit status
  * Desc:    Send byte sequence to UART.
  **********************************************************************/
-int SerialPort::_writePort(const unsigned char *data, unsigned int n){
-
+int SerialPort::_writePort(const unsigned char *data, unsigned int n)
+{
     if(!_status){
         return -1;
     }
 
-    if(serial.write((char *)data, (qint64)n)!=n){
+    if(serial.write(const_cast<char *>(reinterpret_cast<const char *>(data)), static_cast<qint64>(n))!=n){
         return -1;
     }
 
@@ -404,9 +424,9 @@ void SerialPort::standard_ID_mode(void){
  * Return:  -
  * Desc:    Returns and pops from internal queue one CAN message
  **********************************************************************/
-std::pair<int, CANdata> SerialPort::pop(void){
+std::pair<int, CANmessage> SerialPort::pop(void){
 
-    std::pair<int, CANdata> package;
+    std::pair<int, CANmessage> package;
 
     package.first = 0;
 
@@ -417,7 +437,6 @@ std::pair<int, CANdata> SerialPort::pop(void){
     else{
         package.first = -1;
     }
-
     emit send_to_log(package.second);
     return package;
 }
@@ -477,7 +496,7 @@ int SerialPort::_CRC_verify(const unsigned char *data, const unsigned int index,
     return -1;
 }
 
-void SerialPort::set_message_to_queue(CANdata msg)
+void SerialPort::set_message_to_queue(CANmessage msg)
 {
     _queue.push(msg);
     emit new_messages(1);
diff --git a/COM/SerialPort.hpp b/COM/SerialPort.hpp
index 31dbb109779e1fee866dcb96d96e8b0d60565f9b..ad1534fe62468fcf466738e9b25bbfeeb762eb8b 100644
--- a/COM/SerialPort.hpp
+++ b/COM/SerialPort.hpp
@@ -23,7 +23,7 @@
 #ifndef SERIALPORT_H
 #define SERIALPORT_H
 
-#include "COM/COM.h"
+#include "COM.hpp"
 
 namespace Ui {
     class SerialPort;
@@ -43,7 +43,7 @@ private:
 	volatile int _status;
 	std::thread _worker;
 
-	std::queue<CANdata> _queue;
+    std::queue<CANmessage> _queue;
 	QMutex _queueLkc;
 
 	unsigned char _CRC_calculate(const unsigned char *data, const unsigned int index, const unsigned int buffersize, unsigned int n);
@@ -60,7 +60,8 @@ private:
 	unsigned int W_caret;
 	unsigned int R_caret;
 
-
+    QString portname;
+    QTimer *restore;
 
 public:
 	SerialPort(void);
@@ -71,7 +72,6 @@ public:
 
     virtual bool open(const QString portname) override;
     virtual int  close(void) override;
-    virtual int  send(CANdata msg) override;
 
 	int _writePort(const unsigned char *data, unsigned int n);
 
@@ -79,20 +79,20 @@ public:
 	void standard_ID_mode(void);
 
     QByteArray pop_raw_data(void);
-	void set_message_to_queue(CANdata msg);
-    virtual std::pair<int, CANdata> pop(void) override;
+    void set_message_to_queue(CANmessage msg);
+    virtual std::pair<int, CANmessage> pop(void) override;
     int debug_status;
 
 signals:
 	void new_messages(int n);
-    void send_to_log(CANdata);
+    void send_to_log(CANmessage);
 	void aborting(void);
     void new_raw(void);
 
 public slots:
-	void handleError(QSerialPort::SerialPortError error);
-
+    void handleError(QSerialPort::SerialPortError error);
     virtual void read(void) override;
+    virtual int  send(CANmessage) override;
 };
 
 
diff --git a/COM/TcpServer.h b/COM/TcpServer.hpp
similarity index 100%
rename from COM/TcpServer.h
rename to COM/TcpServer.hpp
diff --git a/COM/UdpReceiveSock.cpp b/COM/UdpReceiveSock.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9f0b5eb92680716cda45d2a6ef2ab1f617e39f2c
--- /dev/null
+++ b/COM/UdpReceiveSock.cpp
@@ -0,0 +1,77 @@
+#include "UdpReceiveSock.hpp"
+
+UdpReceiveSock::UdpReceiveSock()
+{
+}
+
+bool UdpReceiveSock::open(QString Add)
+{
+    printf("udp open\n");
+    udpsocket = new QUdpSocket(this);
+    udpsocket->bind(Add.section(":",1,1).toUShort(),QUdpSocket::ShareAddress);
+    connect(udpsocket,SIGNAL(readyRead(void)),this,SLOT(read(void)));
+    return true;
+
+}
+
+void UdpReceiveSock::read(void)
+{
+    while (udpsocket->hasPendingDatagrams()) {
+        QByteArray datagramreceive;
+        // while (udpsocket-> hasPendingDatagrams()) {
+        datagramreceive.resize(int(udpsocket->pendingDatagramSize()));
+        udpsocket->readDatagram(datagramreceive.data(),datagramreceive.size());
+        auto received = QVariant(datagramreceive.data()).toString().split('\n');
+        foreach (QString Msg, received) {
+            qDebug() << Msg;
+            MsgList.enqueue(Msg);
+            emit new_messages(1);
+        }
+    }
+}
+
+int UdpReceiveSock::send(CANmessage msg)
+{
+    datagramsend.resize(6);
+    datagramsend[0] = static_cast<char>(msg.candata.sid);
+    datagramsend[1] = msg.candata.dlc;
+    datagramsend[2] = static_cast<char>(msg.candata.data[0]);
+    datagramsend[3] = static_cast<char>(msg.candata.data[1]);
+    datagramsend[4] = static_cast<char>(msg.candata.data[2]);
+    datagramsend[5] = static_cast<char>(msg.candata.data[3]);
+
+    udpsocket->write(datagramsend);
+    return 0;
+}
+
+std::pair<int, CANmessage> UdpReceiveSock::pop()
+{
+    std::pair<int, CANmessage> package;
+    CANmessage msg;
+
+        datagram = MsgList.dequeue();
+
+        msg.candata.sid = datagram.section("/",0,0).toUShort();
+        msg.candata.dlc = datagram.section("/",1,1).toUShort();
+        msg.candata.data[0] = datagram.section("/",2,2).toUShort();
+        msg.candata.data[1] = datagram.section("/",3,3).toUShort();
+        msg.candata.data[2] = datagram.section("/",4,4).toUShort();
+        msg.candata.data[3] = datagram.section("/",5,5).toUShort();
+
+        if (datagram.section("/",0,0).compare("1")==0 ) {
+            // Send back my count
+        }
+
+        package.first = 1;
+        package.second = msg;
+        return package;
+
+        //}
+}
+
+int UdpReceiveSock::close()
+{
+    udpsocket->~QUdpSocket();
+    delete this;
+    return 0;
+}
diff --git a/COM/UdpReceiveSock.hpp b/COM/UdpReceiveSock.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..a88ead7f1194738dcdc08984c28d9e55092f5763
--- /dev/null
+++ b/COM/UdpReceiveSock.hpp
@@ -0,0 +1,35 @@
+#ifndef UDPRECEIVESOCK_HPP
+#define UDPRECEIVESOCK_HPP
+
+#include "COM.hpp"
+
+namespace Ui {
+    class UdpReceiveSock;
+}
+
+class UdpReceiveSock : public COM
+{
+    Q_OBJECT
+
+public:
+    UdpReceiveSock();
+    virtual bool open(QString) override;
+    virtual int close(void) override;
+    virtual std::pair<int, CANmessage> pop(void) override;
+
+public slots:
+    virtual int send(CANmessage) override;
+    virtual void read(void) override;
+
+private:
+    QQueue<QString> MsgList;
+    QUdpSocket *udpsocket;
+    QByteArray datagramsend;
+    QByteArray datagramreceive;
+    QString datagram;
+
+signals:
+    void new_messages(int);
+};
+
+#endif // UDPRRECEIVEOCK_HPP
diff --git a/COM/UdpSendSock.cpp b/COM/UdpSendSock.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..df4f05424bea5b1fa05dbfaface3820ea0c7f8f5
--- /dev/null
+++ b/COM/UdpSendSock.cpp
@@ -0,0 +1,38 @@
+#include "UdpSendSock.hpp"
+
+UdpSendSock::UdpSendSock()
+{
+    datagram = new char[256];
+    count = 0;
+    return;
+}
+
+bool UdpSendSock::open(QString Add)
+{
+    udpsocket = new QUdpSocket;
+    IP4Address = Add.section(":",0,0);
+    Port = Add.section(":",1,1).toUShort();
+    return true;
+}
+
+int UdpSendSock::send(CANmessage msg)
+{
+    datagram.sprintf("%d/%d/%d/%d/%d/%d\n", msg.candata.sid, msg.candata.dlc, msg.candata.data[0], msg.candata.data[1], msg.candata.data[2], msg.candata.data[3]);
+    datagram_list.append(datagram);
+    count++;
+    
+   if (count==75) {
+        udpsocket->writeDatagram(QVariant(datagram_list).toByteArray(), QHostAddress::Broadcast, Port);
+        datagram_list.clear();
+        count = 0;
+    }
+    return 1;
+}
+
+int UdpSendSock::close()
+{
+    udpsocket->~QUdpSocket();
+    delete this;
+    emit closing();
+    return 1;
+}
diff --git a/COM/UdpSendSock.hpp b/COM/UdpSendSock.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..90ca131b3f22d5230e7d8a9a6e95202a9f9611cd
--- /dev/null
+++ b/COM/UdpSendSock.hpp
@@ -0,0 +1,35 @@
+#ifndef UDPSENDSOCK_H
+#define UDPSENDSOCK_H
+
+#include "COM.hpp"
+
+namespace Ui {
+    class UdpReceiveSock;
+}
+
+class UdpSendSock : public COM
+{
+    Q_OBJECT
+
+public:
+    UdpSendSock();
+    virtual bool open(QString) override;
+    virtual int close(void) override;
+
+public slots:
+    virtual int send(CANmessage) override;
+
+private:
+    QStringList datagram_list;
+    QUdpSocket *udpsocket;
+    QString IP4Address;
+    quint16 Port;
+    QString datagram;
+    int count;
+
+signals:
+    void new_messages(int);
+    void closing(void);
+};
+
+#endif // UDPSENDSOCK_H
diff --git a/COM/UdpSocket.cpp b/COM/UdpSocket.cpp
deleted file mode 100644
index 176837df40e285100e2d6c0c58aeabff11711e52..0000000000000000000000000000000000000000
--- a/COM/UdpSocket.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-#include "UdpSocket.h"
-
-UdpSocket::UdpSocket()
-{
-    return;
-}
-
-bool UdpSocket::open(QString)
-{
-    udpsocket = new QUdpSocket(this);
-
-    datagramsend.resize(10);
-
-    connect(udpsocket,SIGNAL(disconnected()),this,SLOT(establishConection()));
-    connect(udpsocket,SIGNAL(readyRead(void)),this,SLOT(read(void)));
-}
-
-void UdpSocket::read(void)
-{
-    printf("read\n");
-    while (udpsocket->hasPendingDatagrams()) {
-        emit new_messages(1);
-    }
-    emit new_messages(0);
-}
-
-int UdpSocket::send(CANdata msg)
-{
-    printf("send\n");
-
-    printf("%d %d %d %d %d %d\n", msg.sid, msg.dlc, msg.data[0], msg.data[1], msg.data[2], msg.data[3]);
-    char *datagram = (char *) malloc(256);
-    printf("malloc\n");
-    sprintf(datagram, "%d%d%d%d%d\n", msg.sid, msg.dlc, msg.data[0], msg.data[1], msg.data[2]);
-    printf("datagram\n");
-    QByteArray *some_datagram = new QByteArray(datagram);
-    printf("qbytearray\n");
-
-    printf("init datagram");
-    if (udpsocket->state() == QAbstractSocket::BoundState)
-        udpsocket->writeDatagram(*some_datagram, QHostAddress::Broadcast, 45454);
-    printf("send datagram\n");
-    return 1;
-}
-
-std::pair<int, CANdata> UdpSocket::pop()
-{
-    CANdata msg;
-    QByteArray datagramreceive;
-    // while (udpsocket->hasPendingDatagrams()) {
-    datagramreceive.resize(int(udpsocket->pendingDatagramSize()));
-    udpsocket->readDatagram(datagramreceive.data(),datagramreceive.size());
-
-    qDebug()<<datagramreceive.data();
-    //}
-}
-
-int UdpSocket::close()
-{
-    udpsocket->~QUdpSocket();
-    delete this;
-    return 0;
-}
diff --git a/COM/UdpSocket.h b/COM/UdpSocket.h
deleted file mode 100644
index 4790b8447512522e40761e9327e141bc255fabe0..0000000000000000000000000000000000000000
--- a/COM/UdpSocket.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef UDPSOCKET_H
-#define UDPSOCKET_H
-
-#include "COM.h"
-
-namespace Ui {
-    class UdpSocket;
-}
-
-class UdpSocket : public COM
-{
-    Q_OBJECT
-
-public:
-    UdpSocket();
-    virtual bool open(QString) override;
-    virtual int close(void) override;
-    virtual std::pair<int, CANdata> pop(void) override;
-
-public slots:
-    virtual int send(CANdata) override;
-    virtual void read(void) override;
-
-private:
-    QUdpSocket *udpsocket;
-    QByteArray datagramsend;
-    QByteArray datagramreceive;
-
-signals:
-    void new_messages(int);
-};
-
-#endif // UDPSOCKET_H
diff --git a/Makefile.txt b/Makefile.txt
new file mode 100644
index 0000000000000000000000000000000000000000..30b9cc760c6d7e21255f52e14de75bd34d242dd4
--- /dev/null
+++ b/Makefile.txt
@@ -0,0 +1,43 @@
+# Makefile to support qtcreator and manual compilation.
+# REMEMBER TO DISABLE SHADOW BUILD IN QTCREATOR PROJECTS
+TARGET := CANtoWIFI
+
+.PHONY: release debug ccache clean
+
+# Get number of logical cores on Linux and on macOS.
+OS := $(shell uname -s)
+ifeq ($(OS),Darwin)
+	NPROC := $(shell sysctl -n hw.ncpu)
+else
+	NPROC := $(shell nproc)
+endif
+
+qmake_all: release
+
+release:
+	@ mkdir -p release
+	cd release && qmake $(QMAKE_OPTS) ..
+	cd release && $(MAKE) -f Makefile -j$(NPROC)
+	# Copy the resulting executable or .app so that qtcreator uses it
+	cp -f -r release/CANtoWIFI* . &>/dev/null || true
+
+debug:
+	@ mkdir -p debug
+	cd debug && qmake $(QMAKE_OPTS) .. CONFIG+=debug CONFIG+=declarative_debug CONFIG+=qml_debug
+	cd debug && $(MAKE) -f Makefile -j$(NPROC)
+	# Copy the resulting executable or .app so that qtcreator uses it
+	cp -f -r debug/CANtoWIFI* . &>/dev/null || true
+
+ccache:
+	@ mkdir -p release
+	cd release && qmake $(QMAKE_OPTS) .. QMAKE_CXX="ccache g++"
+	cd release && $(MAKE) -f Makefile -j$(NPROC)
+
+run: release
+	./release/$(TARGET)
+
+valgrind: release
+	valgrind ./release/$(TARGET)
+
+clean:
+	rm -rf release debug
diff --git a/compile/moc_predefs.h b/compile/moc_predefs.h
new file mode 100644
index 0000000000000000000000000000000000000000..1b5f129bb7a60ea41bbfaef53d3585ad99d00a23
--- /dev/null
+++ b/compile/moc_predefs.h
@@ -0,0 +1,390 @@
+#define OBJC_NEW_PROPERTIES 1
+#define _LP64 1
+#define __APPLE_CC__ 6000
+#define __APPLE__ 1
+#define __ATOMIC_ACQUIRE 2
+#define __ATOMIC_ACQ_REL 4
+#define __ATOMIC_CONSUME 1
+#define __ATOMIC_RELAXED 0
+#define __ATOMIC_RELEASE 3
+#define __ATOMIC_SEQ_CST 5
+#define __BIGGEST_ALIGNMENT__ 16
+#define __BLOCKS__ 1
+#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
+#define __CHAR16_TYPE__ unsigned short
+#define __CHAR32_TYPE__ unsigned int
+#define __CHAR_BIT__ 8
+#define __CLANG_ATOMIC_BOOL_LOCK_FREE 2
+#define __CLANG_ATOMIC_CHAR16_T_LOCK_FREE 2
+#define __CLANG_ATOMIC_CHAR32_T_LOCK_FREE 2
+#define __CLANG_ATOMIC_CHAR_LOCK_FREE 2
+#define __CLANG_ATOMIC_INT_LOCK_FREE 2
+#define __CLANG_ATOMIC_LLONG_LOCK_FREE 2
+#define __CLANG_ATOMIC_LONG_LOCK_FREE 2
+#define __CLANG_ATOMIC_POINTER_LOCK_FREE 2
+#define __CLANG_ATOMIC_SHORT_LOCK_FREE 2
+#define __CLANG_ATOMIC_WCHAR_T_LOCK_FREE 2
+#define __CONSTANT_CFSTRINGS__ 1
+#define __DBL_DECIMAL_DIG__ 17
+#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
+#define __DBL_DIG__ 15
+#define __DBL_EPSILON__ 2.2204460492503131e-16
+#define __DBL_HAS_DENORM__ 1
+#define __DBL_HAS_INFINITY__ 1
+#define __DBL_HAS_QUIET_NAN__ 1
+#define __DBL_MANT_DIG__ 53
+#define __DBL_MAX_10_EXP__ 308
+#define __DBL_MAX_EXP__ 1024
+#define __DBL_MAX__ 1.7976931348623157e+308
+#define __DBL_MIN_10_EXP__ (-307)
+#define __DBL_MIN_EXP__ (-1021)
+#define __DBL_MIN__ 2.2250738585072014e-308
+#define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__
+#define __DEPRECATED 1
+#define __DYNAMIC__ 1
+#define __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ 101100
+#define __EXCEPTIONS 1
+#define __FINITE_MATH_ONLY__ 0
+#define __FLT16_DECIMAL_DIG__ 5
+#define __FLT16_DENORM_MIN__ 5.9604644775390625e-8F16
+#define __FLT16_DIG__ 3
+#define __FLT16_EPSILON__ 9.765625e-4F16
+#define __FLT16_HAS_DENORM__ 1
+#define __FLT16_HAS_INFINITY__ 1
+#define __FLT16_HAS_QUIET_NAN__ 1
+#define __FLT16_MANT_DIG__ 11
+#define __FLT16_MAX_10_EXP__ 4
+#define __FLT16_MAX_EXP__ 15
+#define __FLT16_MAX__ 6.5504e+4F16
+#define __FLT16_MIN_10_EXP__ (-13)
+#define __FLT16_MIN_EXP__ (-14)
+#define __FLT16_MIN__ 6.103515625e-5F16
+#define __FLT_DECIMAL_DIG__ 9
+#define __FLT_DENORM_MIN__ 1.40129846e-45F
+#define __FLT_DIG__ 6
+#define __FLT_EPSILON__ 1.19209290e-7F
+#define __FLT_EVAL_METHOD__ 0
+#define __FLT_HAS_DENORM__ 1
+#define __FLT_HAS_INFINITY__ 1
+#define __FLT_HAS_QUIET_NAN__ 1
+#define __FLT_MANT_DIG__ 24
+#define __FLT_MAX_10_EXP__ 38
+#define __FLT_MAX_EXP__ 128
+#define __FLT_MAX__ 3.40282347e+38F
+#define __FLT_MIN_10_EXP__ (-37)
+#define __FLT_MIN_EXP__ (-125)
+#define __FLT_MIN__ 1.17549435e-38F
+#define __FLT_RADIX__ 2
+#define __FXSR__ 1
+#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
+#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
+#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
+#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
+#define __GCC_ATOMIC_INT_LOCK_FREE 2
+#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
+#define __GCC_ATOMIC_LONG_LOCK_FREE 2
+#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
+#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
+#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
+#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
+#define __GLIBCXX_BITSIZE_INT_N_0 128
+#define __GLIBCXX_TYPE_INT_N_0 __int128
+#define __GNUC_GNU_INLINE__ 1
+#define __GNUC_MINOR__ 2
+#define __GNUC_PATCHLEVEL__ 1
+#define __GNUC__ 4
+#define __GNUG__ 4
+#define __GXX_ABI_VERSION 1002
+#define __GXX_EXPERIMENTAL_CXX0X__ 1
+#define __GXX_RTTI 1
+#define __GXX_WEAK__ 1
+#define __INT16_C_SUFFIX__ 
+#define __INT16_FMTd__ "hd"
+#define __INT16_FMTi__ "hi"
+#define __INT16_MAX__ 32767
+#define __INT16_TYPE__ short
+#define __INT32_C_SUFFIX__ 
+#define __INT32_FMTd__ "d"
+#define __INT32_FMTi__ "i"
+#define __INT32_MAX__ 2147483647
+#define __INT32_TYPE__ int
+#define __INT64_C_SUFFIX__ LL
+#define __INT64_FMTd__ "lld"
+#define __INT64_FMTi__ "lli"
+#define __INT64_MAX__ 9223372036854775807LL
+#define __INT64_TYPE__ long long int
+#define __INT8_C_SUFFIX__ 
+#define __INT8_FMTd__ "hhd"
+#define __INT8_FMTi__ "hhi"
+#define __INT8_MAX__ 127
+#define __INT8_TYPE__ signed char
+#define __INTMAX_C_SUFFIX__ L
+#define __INTMAX_FMTd__ "ld"
+#define __INTMAX_FMTi__ "li"
+#define __INTMAX_MAX__ 9223372036854775807L
+#define __INTMAX_TYPE__ long int
+#define __INTMAX_WIDTH__ 64
+#define __INTPTR_FMTd__ "ld"
+#define __INTPTR_FMTi__ "li"
+#define __INTPTR_MAX__ 9223372036854775807L
+#define __INTPTR_TYPE__ long int
+#define __INTPTR_WIDTH__ 64
+#define __INT_FAST16_FMTd__ "hd"
+#define __INT_FAST16_FMTi__ "hi"
+#define __INT_FAST16_MAX__ 32767
+#define __INT_FAST16_TYPE__ short
+#define __INT_FAST32_FMTd__ "d"
+#define __INT_FAST32_FMTi__ "i"
+#define __INT_FAST32_MAX__ 2147483647
+#define __INT_FAST32_TYPE__ int
+#define __INT_FAST64_FMTd__ "ld"
+#define __INT_FAST64_FMTi__ "li"
+#define __INT_FAST64_MAX__ 9223372036854775807L
+#define __INT_FAST64_TYPE__ long int
+#define __INT_FAST8_FMTd__ "hhd"
+#define __INT_FAST8_FMTi__ "hhi"
+#define __INT_FAST8_MAX__ 127
+#define __INT_FAST8_TYPE__ signed char
+#define __INT_LEAST16_FMTd__ "hd"
+#define __INT_LEAST16_FMTi__ "hi"
+#define __INT_LEAST16_MAX__ 32767
+#define __INT_LEAST16_TYPE__ short
+#define __INT_LEAST32_FMTd__ "d"
+#define __INT_LEAST32_FMTi__ "i"
+#define __INT_LEAST32_MAX__ 2147483647
+#define __INT_LEAST32_TYPE__ int
+#define __INT_LEAST64_FMTd__ "ld"
+#define __INT_LEAST64_FMTi__ "li"
+#define __INT_LEAST64_MAX__ 9223372036854775807L
+#define __INT_LEAST64_TYPE__ long int
+#define __INT_LEAST8_FMTd__ "hhd"
+#define __INT_LEAST8_FMTi__ "hhi"
+#define __INT_LEAST8_MAX__ 127
+#define __INT_LEAST8_TYPE__ signed char
+#define __INT_MAX__ 2147483647
+#define __LDBL_DECIMAL_DIG__ 21
+#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
+#define __LDBL_DIG__ 18
+#define __LDBL_EPSILON__ 1.08420217248550443401e-19L
+#define __LDBL_HAS_DENORM__ 1
+#define __LDBL_HAS_INFINITY__ 1
+#define __LDBL_HAS_QUIET_NAN__ 1
+#define __LDBL_MANT_DIG__ 64
+#define __LDBL_MAX_10_EXP__ 4932
+#define __LDBL_MAX_EXP__ 16384
+#define __LDBL_MAX__ 1.18973149535723176502e+4932L
+#define __LDBL_MIN_10_EXP__ (-4931)
+#define __LDBL_MIN_EXP__ (-16381)
+#define __LDBL_MIN__ 3.36210314311209350626e-4932L
+#define __LITTLE_ENDIAN__ 1
+#define __LONG_LONG_MAX__ 9223372036854775807LL
+#define __LONG_MAX__ 9223372036854775807L
+#define __LP64__ 1
+#define __MACH__ 1
+#define __MMX__ 1
+#define __NO_INLINE__ 1
+#define __NO_MATH_INLINES 1
+#define __OBJC_BOOL_IS_BOOL 0
+#define __OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES 3
+#define __OPENCL_MEMORY_SCOPE_DEVICE 2
+#define __OPENCL_MEMORY_SCOPE_SUB_GROUP 4
+#define __OPENCL_MEMORY_SCOPE_WORK_GROUP 1
+#define __OPENCL_MEMORY_SCOPE_WORK_ITEM 0
+#define __ORDER_BIG_ENDIAN__ 4321
+#define __ORDER_LITTLE_ENDIAN__ 1234
+#define __ORDER_PDP_ENDIAN__ 3412
+#define __PIC__ 2
+#define __POINTER_WIDTH__ 64
+#define __PRAGMA_REDEFINE_EXTNAME 1
+#define __PTRDIFF_FMTd__ "ld"
+#define __PTRDIFF_FMTi__ "li"
+#define __PTRDIFF_MAX__ 9223372036854775807L
+#define __PTRDIFF_TYPE__ long int
+#define __PTRDIFF_WIDTH__ 64
+#define __REGISTER_PREFIX__ 
+#define __SCHAR_MAX__ 127
+#define __SHRT_MAX__ 32767
+#define __SIG_ATOMIC_MAX__ 2147483647
+#define __SIG_ATOMIC_WIDTH__ 32
+#define __SIZEOF_DOUBLE__ 8
+#define __SIZEOF_FLOAT__ 4
+#define __SIZEOF_INT128__ 16
+#define __SIZEOF_INT__ 4
+#define __SIZEOF_LONG_DOUBLE__ 16
+#define __SIZEOF_LONG_LONG__ 8
+#define __SIZEOF_LONG__ 8
+#define __SIZEOF_POINTER__ 8
+#define __SIZEOF_PTRDIFF_T__ 8
+#define __SIZEOF_SHORT__ 2
+#define __SIZEOF_SIZE_T__ 8
+#define __SIZEOF_WCHAR_T__ 4
+#define __SIZEOF_WINT_T__ 4
+#define __SIZE_FMTX__ "lX"
+#define __SIZE_FMTo__ "lo"
+#define __SIZE_FMTu__ "lu"
+#define __SIZE_FMTx__ "lx"
+#define __SIZE_MAX__ 18446744073709551615UL
+#define __SIZE_TYPE__ long unsigned int
+#define __SIZE_WIDTH__ 64
+#define __SSE2_MATH__ 1
+#define __SSE2__ 1
+#define __SSE3__ 1
+#define __SSE_MATH__ 1
+#define __SSE__ 1
+#define __SSP__ 1
+#define __SSSE3__ 1
+#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 16UL
+#define __STDC_HOSTED__ 1
+#define __STDC_NO_THREADS__ 1
+#define __STDC_UTF_16__ 1
+#define __STDC_UTF_32__ 1
+#define __STDC__ 1
+#define __UINT16_C_SUFFIX__ 
+#define __UINT16_FMTX__ "hX"
+#define __UINT16_FMTo__ "ho"
+#define __UINT16_FMTu__ "hu"
+#define __UINT16_FMTx__ "hx"
+#define __UINT16_MAX__ 65535
+#define __UINT16_TYPE__ unsigned short
+#define __UINT32_C_SUFFIX__ U
+#define __UINT32_FMTX__ "X"
+#define __UINT32_FMTo__ "o"
+#define __UINT32_FMTu__ "u"
+#define __UINT32_FMTx__ "x"
+#define __UINT32_MAX__ 4294967295U
+#define __UINT32_TYPE__ unsigned int
+#define __UINT64_C_SUFFIX__ ULL
+#define __UINT64_FMTX__ "llX"
+#define __UINT64_FMTo__ "llo"
+#define __UINT64_FMTu__ "llu"
+#define __UINT64_FMTx__ "llx"
+#define __UINT64_MAX__ 18446744073709551615ULL
+#define __UINT64_TYPE__ long long unsigned int
+#define __UINT8_C_SUFFIX__ 
+#define __UINT8_FMTX__ "hhX"
+#define __UINT8_FMTo__ "hho"
+#define __UINT8_FMTu__ "hhu"
+#define __UINT8_FMTx__ "hhx"
+#define __UINT8_MAX__ 255
+#define __UINT8_TYPE__ unsigned char
+#define __UINTMAX_C_SUFFIX__ UL
+#define __UINTMAX_FMTX__ "lX"
+#define __UINTMAX_FMTo__ "lo"
+#define __UINTMAX_FMTu__ "lu"
+#define __UINTMAX_FMTx__ "lx"
+#define __UINTMAX_MAX__ 18446744073709551615UL
+#define __UINTMAX_TYPE__ long unsigned int
+#define __UINTMAX_WIDTH__ 64
+#define __UINTPTR_FMTX__ "lX"
+#define __UINTPTR_FMTo__ "lo"
+#define __UINTPTR_FMTu__ "lu"
+#define __UINTPTR_FMTx__ "lx"
+#define __UINTPTR_MAX__ 18446744073709551615UL
+#define __UINTPTR_TYPE__ long unsigned int
+#define __UINTPTR_WIDTH__ 64
+#define __UINT_FAST16_FMTX__ "hX"
+#define __UINT_FAST16_FMTo__ "ho"
+#define __UINT_FAST16_FMTu__ "hu"
+#define __UINT_FAST16_FMTx__ "hx"
+#define __UINT_FAST16_MAX__ 65535
+#define __UINT_FAST16_TYPE__ unsigned short
+#define __UINT_FAST32_FMTX__ "X"
+#define __UINT_FAST32_FMTo__ "o"
+#define __UINT_FAST32_FMTu__ "u"
+#define __UINT_FAST32_FMTx__ "x"
+#define __UINT_FAST32_MAX__ 4294967295U
+#define __UINT_FAST32_TYPE__ unsigned int
+#define __UINT_FAST64_FMTX__ "lX"
+#define __UINT_FAST64_FMTo__ "lo"
+#define __UINT_FAST64_FMTu__ "lu"
+#define __UINT_FAST64_FMTx__ "lx"
+#define __UINT_FAST64_MAX__ 18446744073709551615UL
+#define __UINT_FAST64_TYPE__ long unsigned int
+#define __UINT_FAST8_FMTX__ "hhX"
+#define __UINT_FAST8_FMTo__ "hho"
+#define __UINT_FAST8_FMTu__ "hhu"
+#define __UINT_FAST8_FMTx__ "hhx"
+#define __UINT_FAST8_MAX__ 255
+#define __UINT_FAST8_TYPE__ unsigned char
+#define __UINT_LEAST16_FMTX__ "hX"
+#define __UINT_LEAST16_FMTo__ "ho"
+#define __UINT_LEAST16_FMTu__ "hu"
+#define __UINT_LEAST16_FMTx__ "hx"
+#define __UINT_LEAST16_MAX__ 65535
+#define __UINT_LEAST16_TYPE__ unsigned short
+#define __UINT_LEAST32_FMTX__ "X"
+#define __UINT_LEAST32_FMTo__ "o"
+#define __UINT_LEAST32_FMTu__ "u"
+#define __UINT_LEAST32_FMTx__ "x"
+#define __UINT_LEAST32_MAX__ 4294967295U
+#define __UINT_LEAST32_TYPE__ unsigned int
+#define __UINT_LEAST64_FMTX__ "lX"
+#define __UINT_LEAST64_FMTo__ "lo"
+#define __UINT_LEAST64_FMTu__ "lu"
+#define __UINT_LEAST64_FMTx__ "lx"
+#define __UINT_LEAST64_MAX__ 18446744073709551615UL
+#define __UINT_LEAST64_TYPE__ long unsigned int
+#define __UINT_LEAST8_FMTX__ "hhX"
+#define __UINT_LEAST8_FMTo__ "hho"
+#define __UINT_LEAST8_FMTu__ "hhu"
+#define __UINT_LEAST8_FMTx__ "hhx"
+#define __UINT_LEAST8_MAX__ 255
+#define __UINT_LEAST8_TYPE__ unsigned char
+#define __USER_LABEL_PREFIX__ _
+#define __VERSION__ "4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.5)"
+#define __WCHAR_MAX__ 2147483647
+#define __WCHAR_TYPE__ int
+#define __WCHAR_WIDTH__ 32
+#define __WINT_MAX__ 2147483647
+#define __WINT_TYPE__ int
+#define __WINT_WIDTH__ 32
+#define __amd64 1
+#define __amd64__ 1
+#define __apple_build_version__ 10001145
+#define __block __attribute__((__blocks__(byref)))
+#define __clang__ 1
+#define __clang_major__ 10
+#define __clang_minor__ 0
+#define __clang_patchlevel__ 0
+#define __clang_version__ "10.0.0 (clang-1000.11.45.5)"
+#define __core2 1
+#define __core2__ 1
+#define __cplusplus 201103L
+#define __cpp_alias_templates 200704
+#define __cpp_attributes 200809
+#define __cpp_constexpr 200704
+#define __cpp_decltype 200707
+#define __cpp_delegating_constructors 200604
+#define __cpp_exceptions 199711
+#define __cpp_inheriting_constructors 201511
+#define __cpp_initializer_lists 200806
+#define __cpp_lambdas 200907
+#define __cpp_nsdmi 200809
+#define __cpp_range_based_for 200907
+#define __cpp_raw_strings 200710
+#define __cpp_ref_qualifiers 200710
+#define __cpp_rtti 199711
+#define __cpp_rvalue_references 200610
+#define __cpp_static_assert 200410
+#define __cpp_threadsafe_static_init 200806
+#define __cpp_unicode_characters 200704
+#define __cpp_unicode_literals 200710
+#define __cpp_user_defined_literals 200809
+#define __cpp_variadic_templates 200704
+#define __llvm__ 1
+#define __nonnull _Nonnull
+#define __null_unspecified _Null_unspecified
+#define __nullable _Nullable
+#define __pic__ 2
+#define __private_extern__ extern
+#define __strong 
+#define __tune_core2__ 1
+#define __unsafe_unretained 
+#define __weak __attribute__((objc_gc(weak)))
+#define __x86_64 1
+#define __x86_64__ 1
diff --git a/main.cpp b/main.cpp
index 81c695ce8acca0c57684057cfca756b13049daf0..51a004222024d9dd5b400e33505087c6588cbbc8 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,18 +1,23 @@
 #include <QCoreApplication>
 
-#include "COM/Comsguy.h"
+#include "COM/ComsGirl.hpp"
 
 int main(int argc, char *argv[])
 {
     QCoreApplication a(argc, argv);
 
-    Comsguy *comsguy = new Comsguy;
-
-    QList<QSerialPortInfo> SerialList = QSerialPortInfo::availablePorts();
-    QString serialport = argv[1];
-    comsguy->updateCOM(Start, serialport,"");
-    comsguy->updateCOM(Wifi, "Wifi", serialport);
-
-    return a.exec();
+    // Header:
+    QProcess::execute("clear");
+    printf("########################################################\n");
+    printf("###############  Welcome to FSTelemetry  ###############\n");
+    printf("########################################################\n");
 
+    while (true) {
+        new ComsGirl(ComsGirl::Serial,
+                     ComsGirl::UdpReceiver,
+                     ComsGirl::UdpSender,
+                     ComsGirl::On,
+                     ComsGirl::DefaultNames);
+        a.exec();
+    }
 }
diff --git a/moc_predefs.h b/moc_predefs.h
index 5c70f21cfffc0dfbd265cdb64c376a4f26bc9510..1b5f129bb7a60ea41bbfaef53d3585ad99d00a23 100644
--- a/moc_predefs.h
+++ b/moc_predefs.h
@@ -187,6 +187,7 @@
 #define __LP64__ 1
 #define __MACH__ 1
 #define __MMX__ 1
+#define __NO_INLINE__ 1
 #define __NO_MATH_INLINES 1
 #define __OBJC_BOOL_IS_BOOL 0
 #define __OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES 3
@@ -194,7 +195,6 @@
 #define __OPENCL_MEMORY_SCOPE_SUB_GROUP 4
 #define __OPENCL_MEMORY_SCOPE_WORK_GROUP 1
 #define __OPENCL_MEMORY_SCOPE_WORK_ITEM 0
-#define __OPTIMIZE__ 1
 #define __ORDER_BIG_ENDIAN__ 4321
 #define __ORDER_LITTLE_ENDIAN__ 1234
 #define __ORDER_PDP_ENDIAN__ 3412
diff --git a/zisbvfnJ b/zisbvfnJ
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000