From f66536d84b38aa0eb46e928fdaf13d7da790b2ee Mon Sep 17 00:00:00 2001
From: daniel-Jones <daniel@danieljon.es>
Date: Sun, 4 Jun 2017 16:26:56 +0930
Subject: added HTML/JS/PHP pages/scripts to allow RGB changes over a web page.
 Integrated a server into the application to allow incoming connections and
 receive commands

---
 qt/RGBController/.controllerwindow.cpp.swn         | Bin 0 -> 16384 bytes
 qt/RGBController/Makefile                          |  45 +-
 qt/RGBController/RGBController                     | Bin 136960 -> 143248 bytes
 qt/RGBController/RGBController.pro                 |   6 +-
 qt/RGBController/controllerwindow.cpp              |  39 +-
 qt/RGBController/controllerwindow.h                |  15 +-
 qt/RGBController/controllerwindow.ui               |  59 +-
 qt/RGBController/irc.cpp                           |   2 +-
 qt/RGBController/server.cpp                        |  54 ++
 qt/RGBController/server.h                          |  26 +
 qt/build-RGBController-Desktop-Debug/Makefile      |  60 +-
 qt/build-RGBController-Desktop-Debug/RGBController | Bin 1614688 -> 1813016 bytes
 .../moc_controllerwindow.cpp                       | 250 ++++---
 qt/build-RGBController-Desktop-Debug/moc_irc.cpp   | 148 ++++
 .../moc_server.cpp                                 | 139 ++++
 .../ui_controllerwindow.h                          | 621 +++++++++++-----
 qt/ircbot/.qmake.stash                             |  12 +
 qt/ircbot/Makefile                                 | 825 +++++++++++++++++++++
 qt/ircbot/main.cpp                                 |  13 +
 qt/ircbot/moc_predefs.h                            | 284 +++++++
 qt/ircbot/moc_qtbot.cpp                            | 156 ++++
 qt/ircbot/qtbot                                    | Bin 0 -> 30944 bytes
 qt/ircbot/qtbot.cpp                                |  82 ++
 qt/ircbot/qtbot.h                                  |  37 +
 qt/ircbot/qtbot.pro                                |  27 +
 qt/ircbot/qtbot.pro.user                           | 336 +++++++++
 26 files changed, 2876 insertions(+), 360 deletions(-)
 create mode 100644 qt/RGBController/.controllerwindow.cpp.swn
 create mode 100644 qt/RGBController/server.cpp
 create mode 100644 qt/RGBController/server.h
 create mode 100644 qt/build-RGBController-Desktop-Debug/moc_irc.cpp
 create mode 100644 qt/build-RGBController-Desktop-Debug/moc_server.cpp
 create mode 100644 qt/ircbot/.qmake.stash
 create mode 100644 qt/ircbot/Makefile
 create mode 100644 qt/ircbot/main.cpp
 create mode 100644 qt/ircbot/moc_predefs.h
 create mode 100644 qt/ircbot/moc_qtbot.cpp
 create mode 100755 qt/ircbot/qtbot
 create mode 100644 qt/ircbot/qtbot.cpp
 create mode 100644 qt/ircbot/qtbot.h
 create mode 100644 qt/ircbot/qtbot.pro
 create mode 100644 qt/ircbot/qtbot.pro.user

(limited to 'qt')

diff --git a/qt/RGBController/.controllerwindow.cpp.swn b/qt/RGBController/.controllerwindow.cpp.swn
new file mode 100644
index 0000000..bc195e4
Binary files /dev/null and b/qt/RGBController/.controllerwindow.cpp.swn differ
diff --git a/qt/RGBController/Makefile b/qt/RGBController/Makefile
index f615390..4f437ac 100644
--- a/qt/RGBController/Makefile
+++ b/qt/RGBController/Makefile
@@ -50,13 +50,17 @@ OBJECTS_DIR   = ./
 
 SOURCES       = main.cpp \
 		controllerwindow.cpp \
-		irc.cpp moc_controllerwindow.cpp \
-		moc_irc.cpp
+		irc.cpp \
+		server.cpp moc_controllerwindow.cpp \
+		moc_irc.cpp \
+		moc_server.cpp
 OBJECTS       = main.o \
 		controllerwindow.o \
 		irc.o \
+		server.o \
 		moc_controllerwindow.o \
-		moc_irc.o
+		moc_irc.o \
+		moc_server.o
 DIST          = /usr/lib/qt/mkspecs/features/spec_pre.prf \
 		/usr/lib/qt/mkspecs/common/unix.conf \
 		/usr/lib/qt/mkspecs/common/linux.conf \
@@ -281,9 +285,11 @@ DIST          = /usr/lib/qt/mkspecs/features/spec_pre.prf \
 		/usr/lib/qt/mkspecs/features/yacc.prf \
 		/usr/lib/qt/mkspecs/features/lex.prf \
 		RGBController.pro controllerwindow.h \
-		irc.h main.cpp \
+		irc.h \
+		server.h main.cpp \
 		controllerwindow.cpp \
-		irc.cpp
+		irc.cpp \
+		server.cpp
 QMAKE_TARGET  = RGBController
 DESTDIR       = 
 TARGET        = RGBController
@@ -769,8 +775,8 @@ distdir: FORCE
 	@test -d $(DISTDIR) || mkdir -p $(DISTDIR)
 	$(COPY_FILE) --parents $(DIST) $(DISTDIR)/
 	$(COPY_FILE) --parents /usr/lib/qt/mkspecs/features/data/dummy.cpp $(DISTDIR)/
-	$(COPY_FILE) --parents controllerwindow.h irc.h $(DISTDIR)/
-	$(COPY_FILE) --parents main.cpp controllerwindow.cpp irc.cpp $(DISTDIR)/
+	$(COPY_FILE) --parents controllerwindow.h irc.h server.h $(DISTDIR)/
+	$(COPY_FILE) --parents main.cpp controllerwindow.cpp irc.cpp server.cpp $(DISTDIR)/
 	$(COPY_FILE) --parents controllerwindow.ui $(DISTDIR)/
 
 
@@ -803,10 +809,12 @@ compiler_moc_predefs_clean:
 moc_predefs.h: /usr/lib/qt/mkspecs/features/data/dummy.cpp
 	g++ -pipe -O2 -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -Wall -W -dM -E -o moc_predefs.h /usr/lib/qt/mkspecs/features/data/dummy.cpp
 
-compiler_moc_header_make_all: moc_controllerwindow.cpp moc_irc.cpp
+compiler_moc_header_make_all: moc_controllerwindow.cpp moc_irc.cpp moc_server.cpp
 compiler_moc_header_clean:
-	-$(DEL_FILE) moc_controllerwindow.cpp moc_irc.cpp
+	-$(DEL_FILE) moc_controllerwindow.cpp moc_irc.cpp moc_server.cpp
 moc_controllerwindow.cpp: ui_controllerwindow.h \
+		irc.h \
+		server.h \
 		controllerwindow.h \
 		moc_predefs.h \
 		/usr/bin/moc
@@ -817,6 +825,11 @@ moc_irc.cpp: irc.h \
 		/usr/bin/moc
 	/usr/bin/moc $(DEFINES) --include ./moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I'/home/daniel_j/documents/school/2016 research project/RGBController/qt/RGBController' -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtSerialPort -I/usr/include/qt/QtNetwork -I/usr/include/qt/QtCore -I/usr/include/c++/6.3.1 -I/usr/include/c++/6.3.1/x86_64-pc-linux-gnu -I/usr/include/c++/6.3.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include -I/usr/local/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include-fixed -I/usr/include irc.h -o moc_irc.cpp
 
+moc_server.cpp: server.h \
+		moc_predefs.h \
+		/usr/bin/moc
+	/usr/bin/moc $(DEFINES) --include ./moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I'/home/daniel_j/documents/school/2016 research project/RGBController/qt/RGBController' -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtSerialPort -I/usr/include/qt/QtNetwork -I/usr/include/qt/QtCore -I/usr/include/c++/6.3.1 -I/usr/include/c++/6.3.1/x86_64-pc-linux-gnu -I/usr/include/c++/6.3.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include -I/usr/local/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include-fixed -I/usr/include server.h -o moc_server.cpp
+
 compiler_moc_source_make_all:
 compiler_moc_source_clean:
 compiler_uic_make_all: ui_controllerwindow.h
@@ -837,22 +850,32 @@ compiler_clean: compiler_moc_predefs_clean compiler_moc_header_clean compiler_ui
 ####### Compile
 
 main.o: main.cpp controllerwindow.h \
-		ui_controllerwindow.h
+		ui_controllerwindow.h \
+		irc.h \
+		server.h
 	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp
 
 controllerwindow.o: controllerwindow.cpp controllerwindow.h \
-		ui_controllerwindow.h
+		ui_controllerwindow.h \
+		irc.h \
+		server.h
 	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o controllerwindow.o controllerwindow.cpp
 
 irc.o: irc.cpp irc.h
 	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o irc.o irc.cpp
 
+server.o: server.cpp server.h
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o server.o server.cpp
+
 moc_controllerwindow.o: moc_controllerwindow.cpp 
 	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_controllerwindow.o moc_controllerwindow.cpp
 
 moc_irc.o: moc_irc.cpp 
 	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_irc.o moc_irc.cpp
 
+moc_server.o: moc_server.cpp 
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_server.o moc_server.cpp
+
 ####### Install
 
 install:  FORCE
diff --git a/qt/RGBController/RGBController b/qt/RGBController/RGBController
index 7b54e8c..a6cfd3f 100755
Binary files a/qt/RGBController/RGBController and b/qt/RGBController/RGBController differ
diff --git a/qt/RGBController/RGBController.pro b/qt/RGBController/RGBController.pro
index 07060da..a4ed2e3 100755
--- a/qt/RGBController/RGBController.pro
+++ b/qt/RGBController/RGBController.pro
@@ -14,10 +14,12 @@ TEMPLATE = app
 
 SOURCES += main.cpp\
         controllerwindow.cpp \
-    irc.cpp
+    irc.cpp \
+    server.cpp
 
 
 HEADERS  += controllerwindow.h \
-    irc.h
+    irc.h \
+    server.h
 
 FORMS    += controllerwindow.ui
diff --git a/qt/RGBController/controllerwindow.cpp b/qt/RGBController/controllerwindow.cpp
index 7c4f552..dd21ece 100755
--- a/qt/RGBController/controllerwindow.cpp
+++ b/qt/RGBController/controllerwindow.cpp
@@ -12,9 +12,12 @@ controllerWindow::controllerWindow(QWidget *parent) :
 	connect(ser, &QSerialPort::readyRead, this, &controllerWindow::read);
 	ptimer = new QTimer(this);
 	connect(ptimer, SIGNAL(timeout()), this, SLOT(ping()));
-	connect (&ircbot, SIGNAL(sendcmd(QString)), this, SLOT(cmdrecv(QString)));
+	connect(&ircbot, SIGNAL(sendcmd(QString)), this, SLOT(cmdrecv(QString)));
+	connect(&srv, SIGNAL(sendcmd(QString)), this, SLOT(cmdrecv(QString))); 
 	pingtries = 0;
 	irccon = false;
+	pingcount = 0;
+	server_started = false;
 	/* disable buttons and widgets that should not be enabled yet, set slider values to 0 */
 	ui->disconnect_button->setEnabled(false);
 	ui->connect_button->setEnabled(false);
@@ -413,6 +416,7 @@ void controllerWindow::on_off_button_clicked()
 	ui->r_slider->setValue(0);
 	ui->g_slider->setValue(0);
 	ui->b_slider->setValue(0);
+	send("off");
 }
 
 void controllerWindow::on_set_preset_button_clicked()
@@ -616,6 +620,8 @@ void controllerWindow::ping()
 	send("ping\n");
 	tping = false;
 	QTimer::singleShot(1000, this, SLOT(check_ping()));
+	pingcount++;
+	ui->ping_count_label->setText("Ping: " + QString::number(pingcount));
 }
 
 void controllerWindow::check_ping()
@@ -658,6 +664,37 @@ void controllerWindow::on_irc_connect_button_clicked()
 	}
 }
 
+void controllerWindow::on_server_start_button_clicked()
+{
+	if (!server_started)
+	{
+		if (srv.server_start())
+		{
+			server_started = true;
+			ui->server_start_button->setText("Stop server");
+			info_log("Server started");
+		}
+		else
+		{
+			info_log("Server could not start");
+		}
+	}
+
+	else if (server_started)
+	{
+		if (srv.server_stop())
+		{
+			server_started = false;
+			ui->server_start_button->setText("Start server");
+			info_log("Server stopped");
+		}
+		else
+		{
+			info_log("Server not not be stopped");
+		}
+	}
+}
+
 void controllerWindow::cmdrecv(QString cmd)
 {
 	qDebug() << "got cmd" << cmd;
diff --git a/qt/RGBController/controllerwindow.h b/qt/RGBController/controllerwindow.h
index a9196d2..b36d70b 100755
--- a/qt/RGBController/controllerwindow.h
+++ b/qt/RGBController/controllerwindow.h
@@ -15,6 +15,7 @@
 #include <QTimer>
 #include "ui_controllerwindow.h"
 #include "irc.h"
+#include "server.h"
 
 namespace Ui {
 	class controllerWindow;
@@ -64,7 +65,7 @@ class controllerWindow : public QMainWindow
 			void cmdrecv(QString cmd);
 		private slots:
 			/* these slots are used to trigger button clicks and drop down items selections etc */
-		void on_connect_button_clicked();
+			void on_connect_button_clicked();
 
 		void on_disconnect_button_clicked();
 
@@ -120,16 +121,22 @@ class controllerWindow : public QMainWindow
 
 		void on_bto_valueChanged(int arg1);
 
-	        void on_serial_send_button_clicked();
+		void on_serial_send_button_clicked();
 		void ping();
 		void check_ping();
 
-        void on_irc_connect_button_clicked();
+		void on_irc_connect_button_clicked();
 
-private:
+		void on_server_start_button_clicked();
+
+
+	private:
 		Ui::controllerWindow *ui;
 		bool irccon;
 		irc ircbot;
+		server srv;
+		int pingcount;
+		bool server_started;
 };
 
 #endif // CONTROLLERWINDOW_H
diff --git a/qt/RGBController/controllerwindow.ui b/qt/RGBController/controllerwindow.ui
index 63a91b1..0a10269 100644
--- a/qt/RGBController/controllerwindow.ui
+++ b/qt/RGBController/controllerwindow.ui
@@ -9,8 +9,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>364</width>
-    <height>238</height>
+    <width>433</width>
+    <height>254</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -21,7 +21,7 @@
     <item row="7" column="1">
      <widget class="QTabWidget" name="display_tab">
       <property name="currentIndex">
-       <number>4</number>
+       <number>5</number>
       </property>
       <widget class="QWidget" name="status_tab">
        <attribute name="title">
@@ -528,21 +528,21 @@
           </property>
          </widget>
         </item>
-        <item row="1" column="0">
+        <item row="2" column="0">
          <widget class="QLabel" name="irc_server_label">
           <property name="text">
            <string>Server</string>
           </property>
          </widget>
         </item>
-        <item row="3" column="0">
+        <item row="5" column="0">
          <widget class="QLineEdit" name="irc_server_input">
           <property name="text">
            <string>irc.danieljon.es</string>
           </property>
          </widget>
         </item>
-        <item row="3" column="1">
+        <item row="5" column="1">
          <widget class="QSpinBox" name="irc_bot_spinbox">
           <property name="maximumSize">
            <size>
@@ -558,42 +558,42 @@
           </property>
          </widget>
         </item>
-        <item row="4" column="0">
+        <item row="6" column="0">
          <widget class="QLabel" name="irc_channel_label">
           <property name="text">
            <string>Channel</string>
           </property>
          </widget>
         </item>
-        <item row="5" column="0">
+        <item row="7" column="0">
          <widget class="QLineEdit" name="irc_channel_input">
           <property name="text">
            <string>#csgo</string>
           </property>
          </widget>
         </item>
-        <item row="6" column="0">
+        <item row="8" column="0">
          <widget class="QLabel" name="irc_name_label">
           <property name="text">
            <string>Name</string>
           </property>
          </widget>
         </item>
-        <item row="7" column="0">
+        <item row="9" column="0">
          <widget class="QLineEdit" name="irc_name_input">
           <property name="text">
            <string>LightBot</string>
           </property>
          </widget>
         </item>
-        <item row="1" column="1">
+        <item row="2" column="1">
          <widget class="QLabel" name="irc_port_label">
           <property name="text">
            <string>Port</string>
           </property>
          </widget>
         </item>
-        <item row="8" column="0">
+        <item row="10" column="0">
          <widget class="QPushButton" name="irc_connect_button">
           <property name="text">
            <string>Connect</string>
@@ -602,15 +602,40 @@
         </item>
        </layout>
       </widget>
+      <widget class="QWidget" name="server_tab">
+       <attribute name="title">
+        <string>Server</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_6">
+        <item row="0" column="0">
+         <layout class="QFormLayout" name="server_tab_layout">
+          <item row="0" column="0">
+           <widget class="QPushButton" name="server_start_button">
+            <property name="text">
+             <string>Start server</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
       <widget class="QWidget" name="log_tab">
        <attribute name="title">
         <string>Log</string>
        </attribute>
        <layout class="QGridLayout" name="gridLayout_3">
-        <item row="2" column="0">
+        <item row="5" column="0">
          <widget class="QLineEdit" name="serial_input"/>
         </item>
-        <item row="1" column="0">
+        <item row="5" column="1">
+         <widget class="QPushButton" name="serial_send_button">
+          <property name="text">
+           <string>Send</string>
+          </property>
+         </widget>
+        </item>
+        <item row="4" column="0" colspan="2">
          <widget class="QTextEdit" name="info_log_textarea"/>
         </item>
         <item row="0" column="0">
@@ -620,10 +645,10 @@
           </property>
          </widget>
         </item>
-        <item row="2" column="1">
-         <widget class="QPushButton" name="serial_send_button">
+        <item row="0" column="1">
+         <widget class="QLabel" name="ping_count_label">
           <property name="text">
-           <string>Send</string>
+           <string>Ping</string>
           </property>
          </widget>
         </item>
diff --git a/qt/RGBController/irc.cpp b/qt/RGBController/irc.cpp
index 50f7fac..9c3c14d 100644
--- a/qt/RGBController/irc.cpp
+++ b/qt/RGBController/irc.cpp
@@ -33,7 +33,7 @@ void irc::read()
 		buf = "JOIN " + channel + "\r\n";
 		socket->write(buf.toUtf8());
 	}
-	if (line.contains("!")) /* mostl ikely a message to handle */
+	if (line.contains("!")) /* most likely a message to handle */
 		handle(line);
 	if(socket->canReadLine())
 		read();
diff --git a/qt/RGBController/server.cpp b/qt/RGBController/server.cpp
new file mode 100644
index 0000000..85e43ee
--- /dev/null
+++ b/qt/RGBController/server.cpp
@@ -0,0 +1,54 @@
+#include "server.h"
+
+server::server(QObject *parent) : QObject(parent)
+{
+	srv = new QTcpServer();
+	connect(srv, SIGNAL(newConnection()), this, SLOT(new_connection()));
+}
+
+bool server::server_start()
+{
+	if (srv->listen(QHostAddress::Any, 3001))
+	{
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
+
+bool server::server_stop()
+{
+	srv->close();
+	if (srv->isListening())
+		return false;
+	return true;
+}
+
+void server::new_connection()
+{
+	QTcpSocket *socket;
+	socket = srv->nextPendingConnection();
+	socket->waitForReadyRead(3000);
+	handle(QString(socket->readAll()).remove(QRegExp("[\\n\\t\\r]")));
+	socket->close();
+	delete socket;
+}
+
+void server::handle(QString msg)
+{
+	if (msg.contains(";"))
+	{
+		QStringList tmp = msg.split(";");
+		for (int x = 0; x < tmp.size(); x++)
+		{
+			emit sendcmd(tmp.at(x));
+		}
+	}
+	else
+	{
+		emit sendcmd(msg);
+	}
+
+}
diff --git a/qt/RGBController/server.h b/qt/RGBController/server.h
new file mode 100644
index 0000000..8d46539
--- /dev/null
+++ b/qt/RGBController/server.h
@@ -0,0 +1,26 @@
+#ifndef SERVER_H
+#define SERVER_H
+
+#include <QTcpServer>
+#include <QTcpSocket>
+
+class server : public QObject
+{
+	Q_OBJECT
+	public:
+		explicit server(QObject *parent = 0);
+		bool server_start();
+		bool server_stop();
+	private:
+		QTcpServer *srv;
+		void handle(QString msg);
+		private slots:
+			void new_connection();
+signals:
+		void sendcmd(QString cmd);
+
+
+		public slots:
+};
+
+#endif // SERVER_H
diff --git a/qt/build-RGBController-Desktop-Debug/Makefile b/qt/build-RGBController-Desktop-Debug/Makefile
index 1314c66..524bb85 100644
--- a/qt/build-RGBController-Desktop-Debug/Makefile
+++ b/qt/build-RGBController-Desktop-Debug/Makefile
@@ -49,10 +49,18 @@ OBJECTS_DIR   = ./
 ####### Files
 
 SOURCES       = ../RGBController/main.cpp \
-		../RGBController/controllerwindow.cpp moc_controllerwindow.cpp
+		../RGBController/controllerwindow.cpp \
+		../RGBController/irc.cpp \
+		../RGBController/server.cpp moc_controllerwindow.cpp \
+		moc_irc.cpp \
+		moc_server.cpp
 OBJECTS       = main.o \
 		controllerwindow.o \
-		moc_controllerwindow.o
+		irc.o \
+		server.o \
+		moc_controllerwindow.o \
+		moc_irc.o \
+		moc_server.o
 DIST          = /usr/lib/qt/mkspecs/features/spec_pre.prf \
 		/usr/lib/qt/mkspecs/common/unix.conf \
 		/usr/lib/qt/mkspecs/common/linux.conf \
@@ -276,8 +284,12 @@ DIST          = /usr/lib/qt/mkspecs/features/spec_pre.prf \
 		/usr/lib/qt/mkspecs/features/exceptions.prf \
 		/usr/lib/qt/mkspecs/features/yacc.prf \
 		/usr/lib/qt/mkspecs/features/lex.prf \
-		../RGBController/RGBController.pro ../RGBController/controllerwindow.h ../RGBController/main.cpp \
-		../RGBController/controllerwindow.cpp
+		../RGBController/RGBController.pro ../RGBController/controllerwindow.h \
+		../RGBController/irc.h \
+		../RGBController/server.h ../RGBController/main.cpp \
+		../RGBController/controllerwindow.cpp \
+		../RGBController/irc.cpp \
+		../RGBController/server.cpp
 QMAKE_TARGET  = RGBController
 DESTDIR       = 
 TARGET        = RGBController
@@ -763,8 +775,8 @@ distdir: FORCE
 	@test -d $(DISTDIR) || mkdir -p $(DISTDIR)
 	$(COPY_FILE) --parents $(DIST) $(DISTDIR)/
 	$(COPY_FILE) --parents /usr/lib/qt/mkspecs/features/data/dummy.cpp $(DISTDIR)/
-	$(COPY_FILE) --parents ../RGBController/controllerwindow.h $(DISTDIR)/
-	$(COPY_FILE) --parents ../RGBController/main.cpp ../RGBController/controllerwindow.cpp $(DISTDIR)/
+	$(COPY_FILE) --parents ../RGBController/controllerwindow.h ../RGBController/irc.h ../RGBController/server.h $(DISTDIR)/
+	$(COPY_FILE) --parents ../RGBController/main.cpp ../RGBController/controllerwindow.cpp ../RGBController/irc.cpp ../RGBController/server.cpp $(DISTDIR)/
 	$(COPY_FILE) --parents ../RGBController/controllerwindow.ui $(DISTDIR)/
 
 
@@ -797,15 +809,27 @@ compiler_moc_predefs_clean:
 moc_predefs.h: /usr/lib/qt/mkspecs/features/data/dummy.cpp
 	g++ -pipe -g -Wall -W -dM -E -o moc_predefs.h /usr/lib/qt/mkspecs/features/data/dummy.cpp
 
-compiler_moc_header_make_all: moc_controllerwindow.cpp
+compiler_moc_header_make_all: moc_controllerwindow.cpp moc_irc.cpp moc_server.cpp
 compiler_moc_header_clean:
-	-$(DEL_FILE) moc_controllerwindow.cpp
+	-$(DEL_FILE) moc_controllerwindow.cpp moc_irc.cpp moc_server.cpp
 moc_controllerwindow.cpp: ../RGBController/ui_controllerwindow.h \
+		../RGBController/irc.h \
+		../RGBController/server.h \
 		../RGBController/controllerwindow.h \
 		moc_predefs.h \
 		/usr/bin/moc
 	/usr/bin/moc $(DEFINES) --include ./moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I'/home/daniel_j/documents/school/2016 research project/RGBController/qt/RGBController' -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtSerialPort -I/usr/include/qt/QtNetwork -I/usr/include/qt/QtCore -I. -I/usr/include/c++/6.3.1 -I/usr/include/c++/6.3.1/x86_64-pc-linux-gnu -I/usr/include/c++/6.3.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include -I/usr/local/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include-fixed -I/usr/include ../RGBController/controllerwindow.h -o moc_controllerwindow.cpp
 
+moc_irc.cpp: ../RGBController/irc.h \
+		moc_predefs.h \
+		/usr/bin/moc
+	/usr/bin/moc $(DEFINES) --include ./moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I'/home/daniel_j/documents/school/2016 research project/RGBController/qt/RGBController' -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtSerialPort -I/usr/include/qt/QtNetwork -I/usr/include/qt/QtCore -I. -I/usr/include/c++/6.3.1 -I/usr/include/c++/6.3.1/x86_64-pc-linux-gnu -I/usr/include/c++/6.3.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include -I/usr/local/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include-fixed -I/usr/include ../RGBController/irc.h -o moc_irc.cpp
+
+moc_server.cpp: ../RGBController/server.h \
+		moc_predefs.h \
+		/usr/bin/moc
+	/usr/bin/moc $(DEFINES) --include ./moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I'/home/daniel_j/documents/school/2016 research project/RGBController/qt/RGBController' -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtSerialPort -I/usr/include/qt/QtNetwork -I/usr/include/qt/QtCore -I. -I/usr/include/c++/6.3.1 -I/usr/include/c++/6.3.1/x86_64-pc-linux-gnu -I/usr/include/c++/6.3.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include -I/usr/local/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include-fixed -I/usr/include ../RGBController/server.h -o moc_server.cpp
+
 compiler_moc_source_make_all:
 compiler_moc_source_clean:
 compiler_uic_make_all: ui_controllerwindow.h
@@ -826,16 +850,32 @@ compiler_clean: compiler_moc_predefs_clean compiler_moc_header_clean compiler_ui
 ####### Compile
 
 main.o: ../RGBController/main.cpp ../RGBController/controllerwindow.h \
-		../RGBController/ui_controllerwindow.h
+		../RGBController/ui_controllerwindow.h \
+		../RGBController/irc.h \
+		../RGBController/server.h
 	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o ../RGBController/main.cpp
 
 controllerwindow.o: ../RGBController/controllerwindow.cpp ../RGBController/controllerwindow.h \
-		../RGBController/ui_controllerwindow.h
+		../RGBController/ui_controllerwindow.h \
+		../RGBController/irc.h \
+		../RGBController/server.h
 	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o controllerwindow.o ../RGBController/controllerwindow.cpp
 
+irc.o: ../RGBController/irc.cpp ../RGBController/irc.h
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o irc.o ../RGBController/irc.cpp
+
+server.o: ../RGBController/server.cpp ../RGBController/server.h
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o server.o ../RGBController/server.cpp
+
 moc_controllerwindow.o: moc_controllerwindow.cpp 
 	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_controllerwindow.o moc_controllerwindow.cpp
 
+moc_irc.o: moc_irc.cpp 
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_irc.o moc_irc.cpp
+
+moc_server.o: moc_server.cpp 
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_server.o moc_server.cpp
+
 ####### Install
 
 install:  FORCE
diff --git a/qt/build-RGBController-Desktop-Debug/RGBController b/qt/build-RGBController-Desktop-Debug/RGBController
index 8091a3a..dbe7020 100755
Binary files a/qt/build-RGBController-Desktop-Debug/RGBController and b/qt/build-RGBController-Desktop-Debug/RGBController differ
diff --git a/qt/build-RGBController-Desktop-Debug/moc_controllerwindow.cpp b/qt/build-RGBController-Desktop-Debug/moc_controllerwindow.cpp
index 9e86e81..e0fde24 100644
--- a/qt/build-RGBController-Desktop-Debug/moc_controllerwindow.cpp
+++ b/qt/build-RGBController-Desktop-Debug/moc_controllerwindow.cpp
@@ -21,8 +21,8 @@ QT_BEGIN_MOC_NAMESPACE
 QT_WARNING_PUSH
 QT_WARNING_DISABLE_DEPRECATED
 struct qt_meta_stringdata_controllerWindow_t {
-    QByteArrayData data[33];
-    char stringdata0[777];
+    QByteArrayData data[40];
+    char stringdata0[896];
 };
 #define QT_MOC_LITERAL(idx, ofs, len) \
     Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
@@ -32,42 +32,50 @@ struct qt_meta_stringdata_controllerWindow_t {
 static const qt_meta_stringdata_controllerWindow_t qt_meta_stringdata_controllerWindow = {
     {
 QT_MOC_LITERAL(0, 0, 16), // "controllerWindow"
-QT_MOC_LITERAL(1, 17, 25), // "on_connect_button_clicked"
-QT_MOC_LITERAL(2, 43, 0), // ""
-QT_MOC_LITERAL(3, 44, 28), // "on_disconnect_button_clicked"
-QT_MOC_LITERAL(4, 73, 30), // "on_refresh_port_button_clicked"
-QT_MOC_LITERAL(5, 104, 31), // "on_reload_preset_button_clicked"
-QT_MOC_LITERAL(6, 136, 24), // "on_r_slider_valueChanged"
-QT_MOC_LITERAL(7, 161, 5), // "value"
-QT_MOC_LITERAL(8, 167, 24), // "on_g_slider_valueChanged"
-QT_MOC_LITERAL(9, 192, 24), // "on_b_slider_valueChanged"
-QT_MOC_LITERAL(10, 217, 21), // "on_red_button_clicked"
-QT_MOC_LITERAL(11, 239, 23), // "on_green_button_clicked"
-QT_MOC_LITERAL(12, 263, 22), // "on_blue_button_clicked"
-QT_MOC_LITERAL(13, 286, 21), // "on_off_button_clicked"
-QT_MOC_LITERAL(14, 308, 28), // "on_set_preset_button_clicked"
-QT_MOC_LITERAL(15, 337, 39), // "on_presets_dropdown_currentIn..."
-QT_MOC_LITERAL(16, 377, 5), // "index"
-QT_MOC_LITERAL(17, 383, 29), // "on_preset_save_button_clicked"
-QT_MOC_LITERAL(18, 413, 31), // "on_preset_delete_button_clicked"
-QT_MOC_LITERAL(19, 445, 26), // "on_red_fade_button_clicked"
-QT_MOC_LITERAL(20, 472, 28), // "on_green_fade_button_clicked"
-QT_MOC_LITERAL(21, 501, 27), // "on_blue_fade_button_clicked"
-QT_MOC_LITERAL(22, 529, 23), // "on_speed_button_clicked"
-QT_MOC_LITERAL(23, 553, 30), // "on_r_speed_slider_valueChanged"
-QT_MOC_LITERAL(24, 584, 30), // "on_g_speed_slider_valueChanged"
-QT_MOC_LITERAL(25, 615, 30), // "on_b_speed_slider_valueChanged"
-QT_MOC_LITERAL(26, 646, 21), // "on_rfrom_valueChanged"
-QT_MOC_LITERAL(27, 668, 4), // "arg1"
-QT_MOC_LITERAL(28, 673, 19), // "on_rto_valueChanged"
-QT_MOC_LITERAL(29, 693, 21), // "on_gfrom_valueChanged"
-QT_MOC_LITERAL(30, 715, 19), // "on_gto_valueChanged"
-QT_MOC_LITERAL(31, 735, 21), // "on_bfrom_valueChanged"
-QT_MOC_LITERAL(32, 757, 19) // "on_bto_valueChanged"
+QT_MOC_LITERAL(1, 17, 7), // "cmdrecv"
+QT_MOC_LITERAL(2, 25, 0), // ""
+QT_MOC_LITERAL(3, 26, 3), // "cmd"
+QT_MOC_LITERAL(4, 30, 25), // "on_connect_button_clicked"
+QT_MOC_LITERAL(5, 56, 28), // "on_disconnect_button_clicked"
+QT_MOC_LITERAL(6, 85, 30), // "on_refresh_port_button_clicked"
+QT_MOC_LITERAL(7, 116, 31), // "on_reload_preset_button_clicked"
+QT_MOC_LITERAL(8, 148, 24), // "on_r_slider_valueChanged"
+QT_MOC_LITERAL(9, 173, 5), // "value"
+QT_MOC_LITERAL(10, 179, 24), // "on_g_slider_valueChanged"
+QT_MOC_LITERAL(11, 204, 24), // "on_b_slider_valueChanged"
+QT_MOC_LITERAL(12, 229, 21), // "on_red_button_clicked"
+QT_MOC_LITERAL(13, 251, 23), // "on_green_button_clicked"
+QT_MOC_LITERAL(14, 275, 22), // "on_blue_button_clicked"
+QT_MOC_LITERAL(15, 298, 21), // "on_off_button_clicked"
+QT_MOC_LITERAL(16, 320, 28), // "on_set_preset_button_clicked"
+QT_MOC_LITERAL(17, 349, 39), // "on_presets_dropdown_currentIn..."
+QT_MOC_LITERAL(18, 389, 5), // "index"
+QT_MOC_LITERAL(19, 395, 29), // "on_preset_save_button_clicked"
+QT_MOC_LITERAL(20, 425, 31), // "on_preset_delete_button_clicked"
+QT_MOC_LITERAL(21, 457, 26), // "on_red_fade_button_clicked"
+QT_MOC_LITERAL(22, 484, 28), // "on_green_fade_button_clicked"
+QT_MOC_LITERAL(23, 513, 27), // "on_blue_fade_button_clicked"
+QT_MOC_LITERAL(24, 541, 23), // "on_speed_button_clicked"
+QT_MOC_LITERAL(25, 565, 30), // "on_r_speed_slider_valueChanged"
+QT_MOC_LITERAL(26, 596, 30), // "on_g_speed_slider_valueChanged"
+QT_MOC_LITERAL(27, 627, 30), // "on_b_speed_slider_valueChanged"
+QT_MOC_LITERAL(28, 658, 21), // "on_rfrom_valueChanged"
+QT_MOC_LITERAL(29, 680, 4), // "arg1"
+QT_MOC_LITERAL(30, 685, 19), // "on_rto_valueChanged"
+QT_MOC_LITERAL(31, 705, 21), // "on_gfrom_valueChanged"
+QT_MOC_LITERAL(32, 727, 19), // "on_gto_valueChanged"
+QT_MOC_LITERAL(33, 747, 21), // "on_bfrom_valueChanged"
+QT_MOC_LITERAL(34, 769, 19), // "on_bto_valueChanged"
+QT_MOC_LITERAL(35, 789, 29), // "on_serial_send_button_clicked"
+QT_MOC_LITERAL(36, 819, 4), // "ping"
+QT_MOC_LITERAL(37, 824, 10), // "check_ping"
+QT_MOC_LITERAL(38, 835, 29), // "on_irc_connect_button_clicked"
+QT_MOC_LITERAL(39, 865, 30) // "on_server_start_button_clicked"
 
     },
-    "controllerWindow\0on_connect_button_clicked\0"
-    "\0on_disconnect_button_clicked\0"
+    "controllerWindow\0cmdrecv\0\0cmd\0"
+    "on_connect_button_clicked\0"
+    "on_disconnect_button_clicked\0"
     "on_refresh_port_button_clicked\0"
     "on_reload_preset_button_clicked\0"
     "on_r_slider_valueChanged\0value\0"
@@ -89,7 +97,9 @@ QT_MOC_LITERAL(32, 757, 19) // "on_bto_valueChanged"
     "on_rfrom_valueChanged\0arg1\0"
     "on_rto_valueChanged\0on_gfrom_valueChanged\0"
     "on_gto_valueChanged\0on_bfrom_valueChanged\0"
-    "on_bto_valueChanged"
+    "on_bto_valueChanged\0on_serial_send_button_clicked\0"
+    "ping\0check_ping\0on_irc_connect_button_clicked\0"
+    "on_server_start_button_clicked"
 };
 #undef QT_MOC_LITERAL
 
@@ -99,7 +109,7 @@ static const uint qt_meta_data_controllerWindow[] = {
        7,       // revision
        0,       // classname
        0,    0, // classinfo
-      28,   14, // methods
+      34,   14, // methods
        0,    0, // properties
        0,    0, // enums/sets
        0,    0, // constructors
@@ -107,64 +117,76 @@ static const uint qt_meta_data_controllerWindow[] = {
        0,       // signalCount
 
  // slots: name, argc, parameters, tag, flags
-       1,    0,  154,    2, 0x08 /* Private */,
-       3,    0,  155,    2, 0x08 /* Private */,
-       4,    0,  156,    2, 0x08 /* Private */,
-       5,    0,  157,    2, 0x08 /* Private */,
-       6,    1,  158,    2, 0x08 /* Private */,
-       8,    1,  161,    2, 0x08 /* Private */,
-       9,    1,  164,    2, 0x08 /* Private */,
-      10,    0,  167,    2, 0x08 /* Private */,
-      11,    0,  168,    2, 0x08 /* Private */,
-      12,    0,  169,    2, 0x08 /* Private */,
-      13,    0,  170,    2, 0x08 /* Private */,
-      14,    0,  171,    2, 0x08 /* Private */,
-      15,    1,  172,    2, 0x08 /* Private */,
-      17,    0,  175,    2, 0x08 /* Private */,
-      18,    0,  176,    2, 0x08 /* Private */,
-      19,    0,  177,    2, 0x08 /* Private */,
-      20,    0,  178,    2, 0x08 /* Private */,
-      21,    0,  179,    2, 0x08 /* Private */,
-      22,    0,  180,    2, 0x08 /* Private */,
-      23,    1,  181,    2, 0x08 /* Private */,
-      24,    1,  184,    2, 0x08 /* Private */,
-      25,    1,  187,    2, 0x08 /* Private */,
-      26,    1,  190,    2, 0x08 /* Private */,
-      28,    1,  193,    2, 0x08 /* Private */,
-      29,    1,  196,    2, 0x08 /* Private */,
-      30,    1,  199,    2, 0x08 /* Private */,
-      31,    1,  202,    2, 0x08 /* Private */,
-      32,    1,  205,    2, 0x08 /* Private */,
+       1,    1,  184,    2, 0x0a /* Public */,
+       4,    0,  187,    2, 0x08 /* Private */,
+       5,    0,  188,    2, 0x08 /* Private */,
+       6,    0,  189,    2, 0x08 /* Private */,
+       7,    0,  190,    2, 0x08 /* Private */,
+       8,    1,  191,    2, 0x08 /* Private */,
+      10,    1,  194,    2, 0x08 /* Private */,
+      11,    1,  197,    2, 0x08 /* Private */,
+      12,    0,  200,    2, 0x08 /* Private */,
+      13,    0,  201,    2, 0x08 /* Private */,
+      14,    0,  202,    2, 0x08 /* Private */,
+      15,    0,  203,    2, 0x08 /* Private */,
+      16,    0,  204,    2, 0x08 /* Private */,
+      17,    1,  205,    2, 0x08 /* Private */,
+      19,    0,  208,    2, 0x08 /* Private */,
+      20,    0,  209,    2, 0x08 /* Private */,
+      21,    0,  210,    2, 0x08 /* Private */,
+      22,    0,  211,    2, 0x08 /* Private */,
+      23,    0,  212,    2, 0x08 /* Private */,
+      24,    0,  213,    2, 0x08 /* Private */,
+      25,    1,  214,    2, 0x08 /* Private */,
+      26,    1,  217,    2, 0x08 /* Private */,
+      27,    1,  220,    2, 0x08 /* Private */,
+      28,    1,  223,    2, 0x08 /* Private */,
+      30,    1,  226,    2, 0x08 /* Private */,
+      31,    1,  229,    2, 0x08 /* Private */,
+      32,    1,  232,    2, 0x08 /* Private */,
+      33,    1,  235,    2, 0x08 /* Private */,
+      34,    1,  238,    2, 0x08 /* Private */,
+      35,    0,  241,    2, 0x08 /* Private */,
+      36,    0,  242,    2, 0x08 /* Private */,
+      37,    0,  243,    2, 0x08 /* Private */,
+      38,    0,  244,    2, 0x08 /* Private */,
+      39,    0,  245,    2, 0x08 /* Private */,
 
  // slots: parameters
+    QMetaType::Void, QMetaType::QString,    3,
     QMetaType::Void,
     QMetaType::Void,
     QMetaType::Void,
     QMetaType::Void,
-    QMetaType::Void, QMetaType::Int,    7,
-    QMetaType::Void, QMetaType::Int,    7,
-    QMetaType::Void, QMetaType::Int,    7,
+    QMetaType::Void, QMetaType::Int,    9,
+    QMetaType::Void, QMetaType::Int,    9,
+    QMetaType::Void, QMetaType::Int,    9,
     QMetaType::Void,
     QMetaType::Void,
     QMetaType::Void,
     QMetaType::Void,
     QMetaType::Void,
-    QMetaType::Void, QMetaType::Int,   16,
+    QMetaType::Void, QMetaType::Int,   18,
     QMetaType::Void,
     QMetaType::Void,
     QMetaType::Void,
     QMetaType::Void,
     QMetaType::Void,
     QMetaType::Void,
-    QMetaType::Void, QMetaType::Int,    7,
-    QMetaType::Void, QMetaType::Int,    7,
-    QMetaType::Void, QMetaType::Int,    7,
-    QMetaType::Void, QMetaType::Int,   27,
-    QMetaType::Void, QMetaType::Int,   27,
-    QMetaType::Void, QMetaType::Int,   27,
-    QMetaType::Void, QMetaType::Int,   27,
-    QMetaType::Void, QMetaType::Int,   27,
-    QMetaType::Void, QMetaType::Int,   27,
+    QMetaType::Void, QMetaType::Int,    9,
+    QMetaType::Void, QMetaType::Int,    9,
+    QMetaType::Void, QMetaType::Int,    9,
+    QMetaType::Void, QMetaType::Int,   29,
+    QMetaType::Void, QMetaType::Int,   29,
+    QMetaType::Void, QMetaType::Int,   29,
+    QMetaType::Void, QMetaType::Int,   29,
+    QMetaType::Void, QMetaType::Int,   29,
+    QMetaType::Void, QMetaType::Int,   29,
+    QMetaType::Void,
+    QMetaType::Void,
+    QMetaType::Void,
+    QMetaType::Void,
+    QMetaType::Void,
 
        0        // eod
 };
@@ -175,34 +197,40 @@ void controllerWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int
         controllerWindow *_t = static_cast<controllerWindow *>(_o);
         Q_UNUSED(_t)
         switch (_id) {
-        case 0: _t->on_connect_button_clicked(); break;
-        case 1: _t->on_disconnect_button_clicked(); break;
-        case 2: _t->on_refresh_port_button_clicked(); break;
-        case 3: _t->on_reload_preset_button_clicked(); break;
-        case 4: _t->on_r_slider_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
-        case 5: _t->on_g_slider_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
-        case 6: _t->on_b_slider_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
-        case 7: _t->on_red_button_clicked(); break;
-        case 8: _t->on_green_button_clicked(); break;
-        case 9: _t->on_blue_button_clicked(); break;
-        case 10: _t->on_off_button_clicked(); break;
-        case 11: _t->on_set_preset_button_clicked(); break;
-        case 12: _t->on_presets_dropdown_currentIndexChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
-        case 13: _t->on_preset_save_button_clicked(); break;
-        case 14: _t->on_preset_delete_button_clicked(); break;
-        case 15: _t->on_red_fade_button_clicked(); break;
-        case 16: _t->on_green_fade_button_clicked(); break;
-        case 17: _t->on_blue_fade_button_clicked(); break;
-        case 18: _t->on_speed_button_clicked(); break;
-        case 19: _t->on_r_speed_slider_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
-        case 20: _t->on_g_speed_slider_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
-        case 21: _t->on_b_speed_slider_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
-        case 22: _t->on_rfrom_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
-        case 23: _t->on_rto_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
-        case 24: _t->on_gfrom_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
-        case 25: _t->on_gto_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
-        case 26: _t->on_bfrom_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
-        case 27: _t->on_bto_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
+        case 0: _t->cmdrecv((*reinterpret_cast< QString(*)>(_a[1]))); break;
+        case 1: _t->on_connect_button_clicked(); break;
+        case 2: _t->on_disconnect_button_clicked(); break;
+        case 3: _t->on_refresh_port_button_clicked(); break;
+        case 4: _t->on_reload_preset_button_clicked(); break;
+        case 5: _t->on_r_slider_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
+        case 6: _t->on_g_slider_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
+        case 7: _t->on_b_slider_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
+        case 8: _t->on_red_button_clicked(); break;
+        case 9: _t->on_green_button_clicked(); break;
+        case 10: _t->on_blue_button_clicked(); break;
+        case 11: _t->on_off_button_clicked(); break;
+        case 12: _t->on_set_preset_button_clicked(); break;
+        case 13: _t->on_presets_dropdown_currentIndexChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
+        case 14: _t->on_preset_save_button_clicked(); break;
+        case 15: _t->on_preset_delete_button_clicked(); break;
+        case 16: _t->on_red_fade_button_clicked(); break;
+        case 17: _t->on_green_fade_button_clicked(); break;
+        case 18: _t->on_blue_fade_button_clicked(); break;
+        case 19: _t->on_speed_button_clicked(); break;
+        case 20: _t->on_r_speed_slider_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
+        case 21: _t->on_g_speed_slider_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
+        case 22: _t->on_b_speed_slider_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
+        case 23: _t->on_rfrom_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
+        case 24: _t->on_rto_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
+        case 25: _t->on_gfrom_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
+        case 26: _t->on_gto_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
+        case 27: _t->on_bfrom_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
+        case 28: _t->on_bto_valueChanged((*reinterpret_cast< int(*)>(_a[1]))); break;
+        case 29: _t->on_serial_send_button_clicked(); break;
+        case 30: _t->ping(); break;
+        case 31: _t->check_ping(); break;
+        case 32: _t->on_irc_connect_button_clicked(); break;
+        case 33: _t->on_server_start_button_clicked(); break;
         default: ;
         }
     }
@@ -233,13 +261,13 @@ int controllerWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
     if (_id < 0)
         return _id;
     if (_c == QMetaObject::InvokeMetaMethod) {
-        if (_id < 28)
+        if (_id < 34)
             qt_static_metacall(this, _c, _id, _a);
-        _id -= 28;
+        _id -= 34;
     } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
-        if (_id < 28)
+        if (_id < 34)
             *reinterpret_cast<int*>(_a[0]) = -1;
-        _id -= 28;
+        _id -= 34;
     }
     return _id;
 }
diff --git a/qt/build-RGBController-Desktop-Debug/moc_irc.cpp b/qt/build-RGBController-Desktop-Debug/moc_irc.cpp
new file mode 100644
index 0000000..4756835
--- /dev/null
+++ b/qt/build-RGBController-Desktop-Debug/moc_irc.cpp
@@ -0,0 +1,148 @@
+/****************************************************************************
+** Meta object code from reading C++ file 'irc.h'
+**
+** Created by: The Qt Meta Object Compiler version 67 (Qt 5.8.0)
+**
+** WARNING! All changes made in this file will be lost!
+*****************************************************************************/
+
+#include "../RGBController/irc.h"
+#include <QtCore/qbytearray.h>
+#include <QtCore/qmetatype.h>
+#if !defined(Q_MOC_OUTPUT_REVISION)
+#error "The header file 'irc.h' doesn't include <QObject>."
+#elif Q_MOC_OUTPUT_REVISION != 67
+#error "This file was generated using the moc from 5.8.0. It"
+#error "cannot be used with the include files from this version of Qt."
+#error "(The moc has changed too much.)"
+#endif
+
+QT_BEGIN_MOC_NAMESPACE
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+struct qt_meta_stringdata_irc_t {
+    QByteArrayData data[8];
+    char stringdata0[37];
+};
+#define QT_MOC_LITERAL(idx, ofs, len) \
+    Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
+    qptrdiff(offsetof(qt_meta_stringdata_irc_t, stringdata0) + ofs \
+        - idx * sizeof(QByteArrayData)) \
+    )
+static const qt_meta_stringdata_irc_t qt_meta_stringdata_irc = {
+    {
+QT_MOC_LITERAL(0, 0, 3), // "irc"
+QT_MOC_LITERAL(1, 4, 7), // "sendcmd"
+QT_MOC_LITERAL(2, 12, 0), // ""
+QT_MOC_LITERAL(3, 13, 3), // "cmd"
+QT_MOC_LITERAL(4, 17, 4), // "read"
+QT_MOC_LITERAL(5, 22, 3), // "con"
+QT_MOC_LITERAL(6, 26, 6), // "handle"
+QT_MOC_LITERAL(7, 33, 3) // "str"
+
+    },
+    "irc\0sendcmd\0\0cmd\0read\0con\0handle\0str"
+};
+#undef QT_MOC_LITERAL
+
+static const uint qt_meta_data_irc[] = {
+
+ // content:
+       7,       // revision
+       0,       // classname
+       0,    0, // classinfo
+       4,   14, // methods
+       0,    0, // properties
+       0,    0, // enums/sets
+       0,    0, // constructors
+       0,       // flags
+       1,       // signalCount
+
+ // signals: name, argc, parameters, tag, flags
+       1,    1,   34,    2, 0x06 /* Public */,
+
+ // slots: name, argc, parameters, tag, flags
+       4,    0,   37,    2, 0x08 /* Private */,
+       5,    0,   38,    2, 0x08 /* Private */,
+       6,    1,   39,    2, 0x08 /* Private */,
+
+ // signals: parameters
+    QMetaType::Void, QMetaType::QString,    3,
+
+ // slots: parameters
+    QMetaType::Void,
+    QMetaType::Void,
+    QMetaType::Void, QMetaType::QString,    7,
+
+       0        // eod
+};
+
+void irc::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
+{
+    if (_c == QMetaObject::InvokeMetaMethod) {
+        irc *_t = static_cast<irc *>(_o);
+        Q_UNUSED(_t)
+        switch (_id) {
+        case 0: _t->sendcmd((*reinterpret_cast< QString(*)>(_a[1]))); break;
+        case 1: _t->read(); break;
+        case 2: _t->con(); break;
+        case 3: _t->handle((*reinterpret_cast< QString(*)>(_a[1]))); break;
+        default: ;
+        }
+    } else if (_c == QMetaObject::IndexOfMethod) {
+        int *result = reinterpret_cast<int *>(_a[0]);
+        void **func = reinterpret_cast<void **>(_a[1]);
+        {
+            typedef void (irc::*_t)(QString );
+            if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&irc::sendcmd)) {
+                *result = 0;
+                return;
+            }
+        }
+    }
+}
+
+const QMetaObject irc::staticMetaObject = {
+    { &QObject::staticMetaObject, qt_meta_stringdata_irc.data,
+      qt_meta_data_irc,  qt_static_metacall, Q_NULLPTR, Q_NULLPTR}
+};
+
+
+const QMetaObject *irc::metaObject() const
+{
+    return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
+}
+
+void *irc::qt_metacast(const char *_clname)
+{
+    if (!_clname) return Q_NULLPTR;
+    if (!strcmp(_clname, qt_meta_stringdata_irc.stringdata0))
+        return static_cast<void*>(const_cast< irc*>(this));
+    return QObject::qt_metacast(_clname);
+}
+
+int irc::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
+{
+    _id = QObject::qt_metacall(_c, _id, _a);
+    if (_id < 0)
+        return _id;
+    if (_c == QMetaObject::InvokeMetaMethod) {
+        if (_id < 4)
+            qt_static_metacall(this, _c, _id, _a);
+        _id -= 4;
+    } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
+        if (_id < 4)
+            *reinterpret_cast<int*>(_a[0]) = -1;
+        _id -= 4;
+    }
+    return _id;
+}
+
+// SIGNAL 0
+void irc::sendcmd(QString _t1)
+{
+    void *_a[] = { Q_NULLPTR, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
+    QMetaObject::activate(this, &staticMetaObject, 0, _a);
+}
+QT_WARNING_POP
+QT_END_MOC_NAMESPACE
diff --git a/qt/build-RGBController-Desktop-Debug/moc_server.cpp b/qt/build-RGBController-Desktop-Debug/moc_server.cpp
new file mode 100644
index 0000000..9cc6f2b
--- /dev/null
+++ b/qt/build-RGBController-Desktop-Debug/moc_server.cpp
@@ -0,0 +1,139 @@
+/****************************************************************************
+** Meta object code from reading C++ file 'server.h'
+**
+** Created by: The Qt Meta Object Compiler version 67 (Qt 5.8.0)
+**
+** WARNING! All changes made in this file will be lost!
+*****************************************************************************/
+
+#include "../RGBController/server.h"
+#include <QtCore/qbytearray.h>
+#include <QtCore/qmetatype.h>
+#if !defined(Q_MOC_OUTPUT_REVISION)
+#error "The header file 'server.h' doesn't include <QObject>."
+#elif Q_MOC_OUTPUT_REVISION != 67
+#error "This file was generated using the moc from 5.8.0. It"
+#error "cannot be used with the include files from this version of Qt."
+#error "(The moc has changed too much.)"
+#endif
+
+QT_BEGIN_MOC_NAMESPACE
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+struct qt_meta_stringdata_server_t {
+    QByteArrayData data[5];
+    char stringdata0[35];
+};
+#define QT_MOC_LITERAL(idx, ofs, len) \
+    Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
+    qptrdiff(offsetof(qt_meta_stringdata_server_t, stringdata0) + ofs \
+        - idx * sizeof(QByteArrayData)) \
+    )
+static const qt_meta_stringdata_server_t qt_meta_stringdata_server = {
+    {
+QT_MOC_LITERAL(0, 0, 6), // "server"
+QT_MOC_LITERAL(1, 7, 7), // "sendcmd"
+QT_MOC_LITERAL(2, 15, 0), // ""
+QT_MOC_LITERAL(3, 16, 3), // "cmd"
+QT_MOC_LITERAL(4, 20, 14) // "new_connection"
+
+    },
+    "server\0sendcmd\0\0cmd\0new_connection"
+};
+#undef QT_MOC_LITERAL
+
+static const uint qt_meta_data_server[] = {
+
+ // content:
+       7,       // revision
+       0,       // classname
+       0,    0, // classinfo
+       2,   14, // methods
+       0,    0, // properties
+       0,    0, // enums/sets
+       0,    0, // constructors
+       0,       // flags
+       1,       // signalCount
+
+ // signals: name, argc, parameters, tag, flags
+       1,    1,   24,    2, 0x06 /* Public */,
+
+ // slots: name, argc, parameters, tag, flags
+       4,    0,   27,    2, 0x08 /* Private */,
+
+ // signals: parameters
+    QMetaType::Void, QMetaType::QString,    3,
+
+ // slots: parameters
+    QMetaType::Void,
+
+       0        // eod
+};
+
+void server::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
+{
+    if (_c == QMetaObject::InvokeMetaMethod) {
+        server *_t = static_cast<server *>(_o);
+        Q_UNUSED(_t)
+        switch (_id) {
+        case 0: _t->sendcmd((*reinterpret_cast< QString(*)>(_a[1]))); break;
+        case 1: _t->new_connection(); break;
+        default: ;
+        }
+    } else if (_c == QMetaObject::IndexOfMethod) {
+        int *result = reinterpret_cast<int *>(_a[0]);
+        void **func = reinterpret_cast<void **>(_a[1]);
+        {
+            typedef void (server::*_t)(QString );
+            if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&server::sendcmd)) {
+                *result = 0;
+                return;
+            }
+        }
+    }
+}
+
+const QMetaObject server::staticMetaObject = {
+    { &QObject::staticMetaObject, qt_meta_stringdata_server.data,
+      qt_meta_data_server,  qt_static_metacall, Q_NULLPTR, Q_NULLPTR}
+};
+
+
+const QMetaObject *server::metaObject() const
+{
+    return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
+}
+
+void *server::qt_metacast(const char *_clname)
+{
+    if (!_clname) return Q_NULLPTR;
+    if (!strcmp(_clname, qt_meta_stringdata_server.stringdata0))
+        return static_cast<void*>(const_cast< server*>(this));
+    return QObject::qt_metacast(_clname);
+}
+
+int server::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
+{
+    _id = QObject::qt_metacall(_c, _id, _a);
+    if (_id < 0)
+        return _id;
+    if (_c == QMetaObject::InvokeMetaMethod) {
+        if (_id < 2)
+            qt_static_metacall(this, _c, _id, _a);
+        _id -= 2;
+    } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
+        if (_id < 2)
+            *reinterpret_cast<int*>(_a[0]) = -1;
+        _id -= 2;
+    }
+    return _id;
+}
+
+// SIGNAL 0
+void server::sendcmd(QString _t1)
+{
+    void *_a[] = { Q_NULLPTR, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
+    QMetaObject::activate(this, &staticMetaObject, 0, _a);
+}
+QT_WARNING_POP
+QT_END_MOC_NAMESPACE
diff --git a/qt/build-RGBController-Desktop-Debug/ui_controllerwindow.h b/qt/build-RGBController-Desktop-Debug/ui_controllerwindow.h
index 5c2c857..8b77987 100644
--- a/qt/build-RGBController-Desktop-Debug/ui_controllerwindow.h
+++ b/qt/build-RGBController-Desktop-Debug/ui_controllerwindow.h
@@ -14,6 +14,7 @@
 #include <QtWidgets/QApplication>
 #include <QtWidgets/QButtonGroup>
 #include <QtWidgets/QComboBox>
+#include <QtWidgets/QFormLayout>
 #include <QtWidgets/QGridLayout>
 #include <QtWidgets/QHeaderView>
 #include <QtWidgets/QLabel>
@@ -22,6 +23,7 @@
 #include <QtWidgets/QPushButton>
 #include <QtWidgets/QSlider>
 #include <QtWidgets/QSpinBox>
+#include <QtWidgets/QTabWidget>
 #include <QtWidgets/QTextEdit>
 #include <QtWidgets/QWidget>
 
@@ -32,366 +34,579 @@ class Ui_controllerWindow
 public:
     QWidget *centralWidget;
     QGridLayout *gridLayout_2;
-    QPushButton *reload_preset_button;
-    QPushButton *off_button;
-    QPushButton *preset_delete_button;
-    QLabel *presets_label;
-    QPushButton *disconnect_button;
+    QTabWidget *display_tab;
+    QWidget *status_tab;
+    QFormLayout *formLayout;
+    QGridLayout *gridLayout_5;
+    QLabel *arduino_port_label;
+    QPushButton *refresh_port_button;
+    QLabel *status_label;
     QLabel *arduino_status_label;
     QComboBox *arduino_port_dropdown;
-    QSlider *b_slider;
-    QSlider *b_speed_slider;
-    QTextEdit *info_log_textarea;
-    QLineEdit *preset_name_textbox;
-    QComboBox *presets_dropdown;
-    QLabel *info_log_label;
-    QPushButton *green_button;
-    QPushButton *refresh_port_button;
-    QSlider *g_speed_slider;
+    QPushButton *disconnect_button;
+    QPushButton *connect_button;
+    QWidget *color_tab;
+    QFormLayout *formLayout_2;
     QLabel *rgb_label;
-    QLabel *status_label;
-    QPushButton *preset_save_button;
-    QSlider *g_slider;
-    QSlider *r_speed_slider;
-    QLabel *g_speed_label;
+    QSlider *r_slider;
     QPushButton *red_button;
+    QSlider *g_slider;
+    QPushButton *green_button;
+    QSlider *b_slider;
     QPushButton *blue_button;
-    QPushButton *connect_button;
-    QLabel *r_speed_label;
-    QSlider *r_slider;
-    QPushButton *set_preset_button;
+    QPushButton *off_button;
+    QWidget *fade_tab;
+    QFormLayout *formLayout_3;
     QGridLayout *gridLayout;
     QPushButton *blue_fade_button;
-    QSpinBox *bfrom;
-    QSpinBox *rto;
     QSpinBox *gfrom;
-    QLabel *r_to_label;
-    QSpinBox *rfrom;
     QLabel *g_to_label;
+    QLabel *r_to_label;
     QSpinBox *bto;
-    QSpinBox *gto;
+    QSpinBox *rto;
+    QSpinBox *bfrom;
     QPushButton *green_fade_button;
+    QSlider *b_speed_slider;
+    QSlider *g_speed_slider;
+    QSpinBox *gto;
+    QSpinBox *rfrom;
     QPushButton *red_fade_button;
     QLabel *_to_label;
     QLabel *fade_label;
-    QLabel *arduino_port_label;
+    QSlider *r_speed_slider;
+    QSlider *speed_slider;
+    QLabel *r_speed_label;
+    QLabel *g_speed_label;
     QLabel *b_speed_label;
     QPushButton *speed_button;
-    QSlider *speed_slider;
+    QWidget *presets_tab;
+    QFormLayout *formLayout_4;
+    QLabel *presets_label;
+    QComboBox *presets_dropdown;
+    QPushButton *set_preset_button;
+    QPushButton *reload_preset_button;
+    QLineEdit *preset_name_textbox;
+    QPushButton *preset_save_button;
+    QPushButton *preset_delete_button;
+    QWidget *irc_tab;
+    QFormLayout *formLayout_5;
+    QLabel *irc_bot_label;
+    QLabel *irc_server_label;
+    QLineEdit *irc_server_input;
+    QSpinBox *irc_bot_spinbox;
+    QLabel *irc_channel_label;
+    QLineEdit *irc_channel_input;
+    QLabel *irc_name_label;
+    QLineEdit *irc_name_input;
+    QLabel *irc_port_label;
+    QPushButton *irc_connect_button;
+    QWidget *server_tab;
+    QGridLayout *gridLayout_6;
+    QFormLayout *server_tab_layout;
+    QPushButton *server_start_button;
+    QWidget *log_tab;
+    QGridLayout *gridLayout_3;
+    QLineEdit *serial_input;
+    QPushButton *serial_send_button;
+    QTextEdit *info_log_textarea;
+    QLabel *info_log_label;
+    QLabel *ping_count_label;
 
     void setupUi(QMainWindow *controllerWindow)
     {
         if (controllerWindow->objectName().isEmpty())
             controllerWindow->setObjectName(QStringLiteral("controllerWindow"));
         controllerWindow->setWindowModality(Qt::WindowModal);
-        controllerWindow->resize(232, 629);
+        controllerWindow->resize(433, 254);
         centralWidget = new QWidget(controllerWindow);
         centralWidget->setObjectName(QStringLiteral("centralWidget"));
         gridLayout_2 = new QGridLayout(centralWidget);
         gridLayout_2->setSpacing(6);
         gridLayout_2->setContentsMargins(11, 11, 11, 11);
         gridLayout_2->setObjectName(QStringLiteral("gridLayout_2"));
-        reload_preset_button = new QPushButton(centralWidget);
-        reload_preset_button->setObjectName(QStringLiteral("reload_preset_button"));
+        display_tab = new QTabWidget(centralWidget);
+        display_tab->setObjectName(QStringLiteral("display_tab"));
+        status_tab = new QWidget();
+        status_tab->setObjectName(QStringLiteral("status_tab"));
+        formLayout = new QFormLayout(status_tab);
+        formLayout->setSpacing(6);
+        formLayout->setContentsMargins(11, 11, 11, 11);
+        formLayout->setObjectName(QStringLiteral("formLayout"));
+        gridLayout_5 = new QGridLayout();
+        gridLayout_5->setSpacing(6);
+        gridLayout_5->setObjectName(QStringLiteral("gridLayout_5"));
+        arduino_port_label = new QLabel(status_tab);
+        arduino_port_label->setObjectName(QStringLiteral("arduino_port_label"));
+        arduino_port_label->setMinimumSize(QSize(120, 0));
 
-        gridLayout_2->addWidget(reload_preset_button, 11, 0, 1, 1);
+        gridLayout_5->addWidget(arduino_port_label, 1, 0, 1, 1);
 
-        off_button = new QPushButton(centralWidget);
-        off_button->setObjectName(QStringLiteral("off_button"));
+        refresh_port_button = new QPushButton(status_tab);
+        refresh_port_button->setObjectName(QStringLiteral("refresh_port_button"));
 
-        gridLayout_2->addWidget(off_button, 8, 1, 1, 1);
+        gridLayout_5->addWidget(refresh_port_button, 2, 1, 1, 1);
 
-        preset_delete_button = new QPushButton(centralWidget);
-        preset_delete_button->setObjectName(QStringLiteral("preset_delete_button"));
+        status_label = new QLabel(status_tab);
+        status_label->setObjectName(QStringLiteral("status_label"));
 
-        gridLayout_2->addWidget(preset_delete_button, 13, 1, 1, 1);
+        gridLayout_5->addWidget(status_label, 0, 0, 1, 1);
 
-        presets_label = new QLabel(centralWidget);
-        presets_label->setObjectName(QStringLiteral("presets_label"));
+        arduino_status_label = new QLabel(status_tab);
+        arduino_status_label->setObjectName(QStringLiteral("arduino_status_label"));
+
+        gridLayout_5->addWidget(arduino_status_label, 0, 1, 1, 1);
 
-        gridLayout_2->addWidget(presets_label, 9, 0, 1, 1);
+        arduino_port_dropdown = new QComboBox(status_tab);
+        arduino_port_dropdown->setObjectName(QStringLiteral("arduino_port_dropdown"));
+
+        gridLayout_5->addWidget(arduino_port_dropdown, 1, 1, 1, 1);
 
-        disconnect_button = new QPushButton(centralWidget);
+        disconnect_button = new QPushButton(status_tab);
         disconnect_button->setObjectName(QStringLiteral("disconnect_button"));
 
-        gridLayout_2->addWidget(disconnect_button, 3, 1, 1, 1);
+        gridLayout_5->addWidget(disconnect_button, 3, 1, 1, 1);
 
-        arduino_status_label = new QLabel(centralWidget);
-        arduino_status_label->setObjectName(QStringLiteral("arduino_status_label"));
+        connect_button = new QPushButton(status_tab);
+        connect_button->setObjectName(QStringLiteral("connect_button"));
 
-        gridLayout_2->addWidget(arduino_status_label, 0, 1, 1, 1);
+        gridLayout_5->addWidget(connect_button, 3, 0, 1, 1);
 
-        arduino_port_dropdown = new QComboBox(centralWidget);
-        arduino_port_dropdown->setObjectName(QStringLiteral("arduino_port_dropdown"));
 
-        gridLayout_2->addWidget(arduino_port_dropdown, 1, 1, 1, 1);
+        formLayout->setLayout(0, QFormLayout::LabelRole, gridLayout_5);
+
+        display_tab->addTab(status_tab, QString());
+        color_tab = new QWidget();
+        color_tab->setObjectName(QStringLiteral("color_tab"));
+        formLayout_2 = new QFormLayout(color_tab);
+        formLayout_2->setSpacing(6);
+        formLayout_2->setContentsMargins(11, 11, 11, 11);
+        formLayout_2->setObjectName(QStringLiteral("formLayout_2"));
+        rgb_label = new QLabel(color_tab);
+        rgb_label->setObjectName(QStringLiteral("rgb_label"));
+
+        formLayout_2->setWidget(0, QFormLayout::LabelRole, rgb_label);
+
+        r_slider = new QSlider(color_tab);
+        r_slider->setObjectName(QStringLiteral("r_slider"));
+        r_slider->setMinimumSize(QSize(120, 0));
+        r_slider->setMaximumSize(QSize(120, 16777215));
+        r_slider->setMaximum(255);
+        r_slider->setOrientation(Qt::Horizontal);
+
+        formLayout_2->setWidget(1, QFormLayout::LabelRole, r_slider);
+
+        red_button = new QPushButton(color_tab);
+        red_button->setObjectName(QStringLiteral("red_button"));
+        red_button->setMaximumSize(QSize(90, 16777215));
+
+        formLayout_2->setWidget(1, QFormLayout::FieldRole, red_button);
 
-        b_slider = new QSlider(centralWidget);
+        g_slider = new QSlider(color_tab);
+        g_slider->setObjectName(QStringLiteral("g_slider"));
+        g_slider->setMinimumSize(QSize(120, 0));
+        g_slider->setMaximumSize(QSize(120, 16777215));
+        g_slider->setMaximum(255);
+        g_slider->setOrientation(Qt::Horizontal);
+
+        formLayout_2->setWidget(2, QFormLayout::LabelRole, g_slider);
+
+        green_button = new QPushButton(color_tab);
+        green_button->setObjectName(QStringLiteral("green_button"));
+        green_button->setMaximumSize(QSize(90, 16777215));
+
+        formLayout_2->setWidget(2, QFormLayout::FieldRole, green_button);
+
+        b_slider = new QSlider(color_tab);
         b_slider->setObjectName(QStringLiteral("b_slider"));
         b_slider->setMinimumSize(QSize(120, 0));
         b_slider->setMaximumSize(QSize(120, 16777215));
         b_slider->setMaximum(255);
         b_slider->setOrientation(Qt::Horizontal);
 
-        gridLayout_2->addWidget(b_slider, 7, 0, 1, 1);
+        formLayout_2->setWidget(3, QFormLayout::LabelRole, b_slider);
 
-        b_speed_slider = new QSlider(centralWidget);
-        b_speed_slider->setObjectName(QStringLiteral("b_speed_slider"));
-        b_speed_slider->setMinimum(1);
-        b_speed_slider->setMaximum(500);
-        b_speed_slider->setOrientation(Qt::Horizontal);
+        blue_button = new QPushButton(color_tab);
+        blue_button->setObjectName(QStringLiteral("blue_button"));
+        blue_button->setMaximumSize(QSize(90, 16777215));
 
-        gridLayout_2->addWidget(b_speed_slider, 17, 0, 1, 1);
+        formLayout_2->setWidget(3, QFormLayout::FieldRole, blue_button);
 
-        info_log_textarea = new QTextEdit(centralWidget);
-        info_log_textarea->setObjectName(QStringLiteral("info_log_textarea"));
+        off_button = new QPushButton(color_tab);
+        off_button->setObjectName(QStringLiteral("off_button"));
+        off_button->setMaximumSize(QSize(90, 16777215));
+
+        formLayout_2->setWidget(4, QFormLayout::FieldRole, off_button);
+
+        display_tab->addTab(color_tab, QString());
+        rgb_label->raise();
+        r_slider->raise();
+        g_slider->raise();
+        b_slider->raise();
+        red_button->raise();
+        green_button->raise();
+        blue_button->raise();
+        off_button->raise();
+        fade_tab = new QWidget();
+        fade_tab->setObjectName(QStringLiteral("fade_tab"));
+        formLayout_3 = new QFormLayout(fade_tab);
+        formLayout_3->setSpacing(6);
+        formLayout_3->setContentsMargins(11, 11, 11, 11);
+        formLayout_3->setObjectName(QStringLiteral("formLayout_3"));
+        gridLayout = new QGridLayout();
+        gridLayout->setSpacing(6);
+        gridLayout->setObjectName(QStringLiteral("gridLayout"));
+        blue_fade_button = new QPushButton(fade_tab);
+        blue_fade_button->setObjectName(QStringLiteral("blue_fade_button"));
 
-        gridLayout_2->addWidget(info_log_textarea, 20, 0, 1, 2);
+        gridLayout->addWidget(blue_fade_button, 4, 3, 1, 1);
 
-        preset_name_textbox = new QLineEdit(centralWidget);
-        preset_name_textbox->setObjectName(QStringLiteral("preset_name_textbox"));
+        gfrom = new QSpinBox(fade_tab);
+        gfrom->setObjectName(QStringLiteral("gfrom"));
+        gfrom->setMaximumSize(QSize(50, 16777215));
+        gfrom->setMaximum(255);
 
-        gridLayout_2->addWidget(preset_name_textbox, 12, 0, 1, 1);
+        gridLayout->addWidget(gfrom, 3, 0, 1, 1);
 
-        presets_dropdown = new QComboBox(centralWidget);
-        presets_dropdown->setObjectName(QStringLiteral("presets_dropdown"));
-        presets_dropdown->setMinimumSize(QSize(120, 0));
+        g_to_label = new QLabel(fade_tab);
+        g_to_label->setObjectName(QStringLiteral("g_to_label"));
 
-        gridLayout_2->addWidget(presets_dropdown, 10, 0, 1, 1);
+        gridLayout->addWidget(g_to_label, 3, 1, 1, 1);
 
-        info_log_label = new QLabel(centralWidget);
-        info_log_label->setObjectName(QStringLiteral("info_log_label"));
+        r_to_label = new QLabel(fade_tab);
+        r_to_label->setObjectName(QStringLiteral("r_to_label"));
 
-        gridLayout_2->addWidget(info_log_label, 19, 0, 1, 1);
+        gridLayout->addWidget(r_to_label, 1, 1, 1, 1);
 
-        green_button = new QPushButton(centralWidget);
-        green_button->setObjectName(QStringLiteral("green_button"));
+        bto = new QSpinBox(fade_tab);
+        bto->setObjectName(QStringLiteral("bto"));
+        bto->setMaximumSize(QSize(50, 16777215));
+        bto->setMaximum(255);
 
-        gridLayout_2->addWidget(green_button, 6, 1, 1, 1);
+        gridLayout->addWidget(bto, 4, 2, 1, 1);
 
-        refresh_port_button = new QPushButton(centralWidget);
-        refresh_port_button->setObjectName(QStringLiteral("refresh_port_button"));
+        rto = new QSpinBox(fade_tab);
+        rto->setObjectName(QStringLiteral("rto"));
+        rto->setMaximumSize(QSize(50, 16777215));
+        rto->setMaximum(255);
+
+        gridLayout->addWidget(rto, 1, 2, 1, 1);
+
+        bfrom = new QSpinBox(fade_tab);
+        bfrom->setObjectName(QStringLiteral("bfrom"));
+        bfrom->setMaximumSize(QSize(50, 16777215));
+        bfrom->setMaximum(255);
+
+        gridLayout->addWidget(bfrom, 4, 0, 1, 1);
+
+        green_fade_button = new QPushButton(fade_tab);
+        green_fade_button->setObjectName(QStringLiteral("green_fade_button"));
+
+        gridLayout->addWidget(green_fade_button, 3, 3, 1, 1);
+
+        b_speed_slider = new QSlider(fade_tab);
+        b_speed_slider->setObjectName(QStringLiteral("b_speed_slider"));
+        b_speed_slider->setMinimum(1);
+        b_speed_slider->setMaximum(500);
+        b_speed_slider->setOrientation(Qt::Horizontal);
 
-        gridLayout_2->addWidget(refresh_port_button, 2, 1, 1, 1);
+        gridLayout->addWidget(b_speed_slider, 7, 0, 1, 1);
 
-        g_speed_slider = new QSlider(centralWidget);
+        g_speed_slider = new QSlider(fade_tab);
         g_speed_slider->setObjectName(QStringLiteral("g_speed_slider"));
         g_speed_slider->setMinimum(1);
         g_speed_slider->setMaximum(500);
         g_speed_slider->setOrientation(Qt::Horizontal);
 
-        gridLayout_2->addWidget(g_speed_slider, 16, 0, 1, 1);
+        gridLayout->addWidget(g_speed_slider, 6, 0, 1, 1);
 
-        rgb_label = new QLabel(centralWidget);
-        rgb_label->setObjectName(QStringLiteral("rgb_label"));
+        gto = new QSpinBox(fade_tab);
+        gto->setObjectName(QStringLiteral("gto"));
+        gto->setMaximumSize(QSize(50, 16777215));
+        gto->setMaximum(255);
 
-        gridLayout_2->addWidget(rgb_label, 4, 0, 1, 1);
+        gridLayout->addWidget(gto, 3, 2, 1, 1);
 
-        status_label = new QLabel(centralWidget);
-        status_label->setObjectName(QStringLiteral("status_label"));
+        rfrom = new QSpinBox(fade_tab);
+        rfrom->setObjectName(QStringLiteral("rfrom"));
+        rfrom->setMaximumSize(QSize(50, 16777215));
+        rfrom->setMaximum(255);
 
-        gridLayout_2->addWidget(status_label, 0, 0, 1, 1);
+        gridLayout->addWidget(rfrom, 1, 0, 1, 1);
 
-        preset_save_button = new QPushButton(centralWidget);
-        preset_save_button->setObjectName(QStringLiteral("preset_save_button"));
+        red_fade_button = new QPushButton(fade_tab);
+        red_fade_button->setObjectName(QStringLiteral("red_fade_button"));
 
-        gridLayout_2->addWidget(preset_save_button, 12, 1, 1, 1);
+        gridLayout->addWidget(red_fade_button, 1, 3, 1, 1);
 
-        g_slider = new QSlider(centralWidget);
-        g_slider->setObjectName(QStringLiteral("g_slider"));
-        g_slider->setMinimumSize(QSize(120, 0));
-        g_slider->setMaximumSize(QSize(120, 16777215));
-        g_slider->setMaximum(255);
-        g_slider->setOrientation(Qt::Horizontal);
+        _to_label = new QLabel(fade_tab);
+        _to_label->setObjectName(QStringLiteral("_to_label"));
 
-        gridLayout_2->addWidget(g_slider, 6, 0, 1, 1);
+        gridLayout->addWidget(_to_label, 4, 1, 1, 1);
 
-        r_speed_slider = new QSlider(centralWidget);
+        fade_label = new QLabel(fade_tab);
+        fade_label->setObjectName(QStringLiteral("fade_label"));
+
+        gridLayout->addWidget(fade_label, 0, 0, 1, 1);
+
+        r_speed_slider = new QSlider(fade_tab);
         r_speed_slider->setObjectName(QStringLiteral("r_speed_slider"));
         r_speed_slider->setMinimum(1);
-        r_speed_slider->setMaximum(500);
+        r_speed_slider->setMaximum(100);
         r_speed_slider->setOrientation(Qt::Horizontal);
 
-        gridLayout_2->addWidget(r_speed_slider, 15, 0, 1, 1);
+        gridLayout->addWidget(r_speed_slider, 5, 0, 1, 1);
+
+        speed_slider = new QSlider(fade_tab);
+        speed_slider->setObjectName(QStringLiteral("speed_slider"));
+        speed_slider->setMinimum(10);
+        speed_slider->setMaximum(500);
+        speed_slider->setOrientation(Qt::Horizontal);
+
+        gridLayout->addWidget(speed_slider, 8, 0, 1, 1);
+
+        r_speed_label = new QLabel(fade_tab);
+        r_speed_label->setObjectName(QStringLiteral("r_speed_label"));
+
+        gridLayout->addWidget(r_speed_label, 5, 2, 1, 1);
 
-        g_speed_label = new QLabel(centralWidget);
+        g_speed_label = new QLabel(fade_tab);
         g_speed_label->setObjectName(QStringLiteral("g_speed_label"));
 
-        gridLayout_2->addWidget(g_speed_label, 16, 1, 1, 1);
+        gridLayout->addWidget(g_speed_label, 6, 2, 1, 1);
 
-        red_button = new QPushButton(centralWidget);
-        red_button->setObjectName(QStringLiteral("red_button"));
+        b_speed_label = new QLabel(fade_tab);
+        b_speed_label->setObjectName(QStringLiteral("b_speed_label"));
 
-        gridLayout_2->addWidget(red_button, 5, 1, 1, 1);
+        gridLayout->addWidget(b_speed_label, 7, 2, 1, 1);
 
-        blue_button = new QPushButton(centralWidget);
-        blue_button->setObjectName(QStringLiteral("blue_button"));
+        speed_button = new QPushButton(fade_tab);
+        speed_button->setObjectName(QStringLiteral("speed_button"));
 
-        gridLayout_2->addWidget(blue_button, 7, 1, 1, 1);
+        gridLayout->addWidget(speed_button, 8, 2, 1, 1);
 
-        connect_button = new QPushButton(centralWidget);
-        connect_button->setObjectName(QStringLiteral("connect_button"));
 
-        gridLayout_2->addWidget(connect_button, 3, 0, 1, 1);
+        formLayout_3->setLayout(0, QFormLayout::LabelRole, gridLayout);
 
-        r_speed_label = new QLabel(centralWidget);
-        r_speed_label->setObjectName(QStringLiteral("r_speed_label"));
+        display_tab->addTab(fade_tab, QString());
+        presets_tab = new QWidget();
+        presets_tab->setObjectName(QStringLiteral("presets_tab"));
+        formLayout_4 = new QFormLayout(presets_tab);
+        formLayout_4->setSpacing(6);
+        formLayout_4->setContentsMargins(11, 11, 11, 11);
+        formLayout_4->setObjectName(QStringLiteral("formLayout_4"));
+        presets_label = new QLabel(presets_tab);
+        presets_label->setObjectName(QStringLiteral("presets_label"));
 
-        gridLayout_2->addWidget(r_speed_label, 15, 1, 1, 1);
+        formLayout_4->setWidget(0, QFormLayout::LabelRole, presets_label);
 
-        r_slider = new QSlider(centralWidget);
-        r_slider->setObjectName(QStringLiteral("r_slider"));
-        r_slider->setMinimumSize(QSize(120, 0));
-        r_slider->setMaximumSize(QSize(120, 16777215));
-        r_slider->setMaximum(255);
-        r_slider->setOrientation(Qt::Horizontal);
+        presets_dropdown = new QComboBox(presets_tab);
+        presets_dropdown->setObjectName(QStringLiteral("presets_dropdown"));
+        presets_dropdown->setMinimumSize(QSize(120, 0));
 
-        gridLayout_2->addWidget(r_slider, 5, 0, 1, 1);
+        formLayout_4->setWidget(1, QFormLayout::LabelRole, presets_dropdown);
 
-        set_preset_button = new QPushButton(centralWidget);
+        set_preset_button = new QPushButton(presets_tab);
         set_preset_button->setObjectName(QStringLiteral("set_preset_button"));
+        set_preset_button->setMaximumSize(QSize(90, 16777215));
 
-        gridLayout_2->addWidget(set_preset_button, 10, 1, 1, 1);
+        formLayout_4->setWidget(1, QFormLayout::FieldRole, set_preset_button);
 
-        gridLayout = new QGridLayout();
-        gridLayout->setSpacing(6);
-        gridLayout->setObjectName(QStringLiteral("gridLayout"));
-        blue_fade_button = new QPushButton(centralWidget);
-        blue_fade_button->setObjectName(QStringLiteral("blue_fade_button"));
+        reload_preset_button = new QPushButton(presets_tab);
+        reload_preset_button->setObjectName(QStringLiteral("reload_preset_button"));
 
-        gridLayout->addWidget(blue_fade_button, 4, 3, 1, 1);
+        formLayout_4->setWidget(2, QFormLayout::LabelRole, reload_preset_button);
 
-        bfrom = new QSpinBox(centralWidget);
-        bfrom->setObjectName(QStringLiteral("bfrom"));
-        bfrom->setMaximum(255);
+        preset_name_textbox = new QLineEdit(presets_tab);
+        preset_name_textbox->setObjectName(QStringLiteral("preset_name_textbox"));
 
-        gridLayout->addWidget(bfrom, 4, 0, 1, 1);
+        formLayout_4->setWidget(3, QFormLayout::LabelRole, preset_name_textbox);
 
-        rto = new QSpinBox(centralWidget);
-        rto->setObjectName(QStringLiteral("rto"));
-        rto->setMaximum(255);
+        preset_save_button = new QPushButton(presets_tab);
+        preset_save_button->setObjectName(QStringLiteral("preset_save_button"));
+        preset_save_button->setMaximumSize(QSize(90, 16777215));
 
-        gridLayout->addWidget(rto, 1, 2, 1, 1);
+        formLayout_4->setWidget(3, QFormLayout::FieldRole, preset_save_button);
 
-        gfrom = new QSpinBox(centralWidget);
-        gfrom->setObjectName(QStringLiteral("gfrom"));
-        gfrom->setMaximum(255);
+        preset_delete_button = new QPushButton(presets_tab);
+        preset_delete_button->setObjectName(QStringLiteral("preset_delete_button"));
+        preset_delete_button->setMaximumSize(QSize(90, 16777215));
 
-        gridLayout->addWidget(gfrom, 3, 0, 1, 1);
+        formLayout_4->setWidget(4, QFormLayout::FieldRole, preset_delete_button);
 
-        r_to_label = new QLabel(centralWidget);
-        r_to_label->setObjectName(QStringLiteral("r_to_label"));
+        display_tab->addTab(presets_tab, QString());
+        irc_tab = new QWidget();
+        irc_tab->setObjectName(QStringLiteral("irc_tab"));
+        formLayout_5 = new QFormLayout(irc_tab);
+        formLayout_5->setSpacing(6);
+        formLayout_5->setContentsMargins(11, 11, 11, 11);
+        formLayout_5->setObjectName(QStringLiteral("formLayout_5"));
+        irc_bot_label = new QLabel(irc_tab);
+        irc_bot_label->setObjectName(QStringLiteral("irc_bot_label"));
 
-        gridLayout->addWidget(r_to_label, 1, 1, 1, 1);
+        formLayout_5->setWidget(0, QFormLayout::LabelRole, irc_bot_label);
 
-        rfrom = new QSpinBox(centralWidget);
-        rfrom->setObjectName(QStringLiteral("rfrom"));
-        rfrom->setMaximum(255);
+        irc_server_label = new QLabel(irc_tab);
+        irc_server_label->setObjectName(QStringLiteral("irc_server_label"));
 
-        gridLayout->addWidget(rfrom, 1, 0, 1, 1);
+        formLayout_5->setWidget(2, QFormLayout::LabelRole, irc_server_label);
 
-        g_to_label = new QLabel(centralWidget);
-        g_to_label->setObjectName(QStringLiteral("g_to_label"));
+        irc_server_input = new QLineEdit(irc_tab);
+        irc_server_input->setObjectName(QStringLiteral("irc_server_input"));
 
-        gridLayout->addWidget(g_to_label, 3, 1, 1, 1);
+        formLayout_5->setWidget(5, QFormLayout::LabelRole, irc_server_input);
 
-        bto = new QSpinBox(centralWidget);
-        bto->setObjectName(QStringLiteral("bto"));
-        bto->setMaximum(255);
+        irc_bot_spinbox = new QSpinBox(irc_tab);
+        irc_bot_spinbox->setObjectName(QStringLiteral("irc_bot_spinbox"));
+        irc_bot_spinbox->setMaximumSize(QSize(50, 16777215));
+        irc_bot_spinbox->setMaximum(99999);
+        irc_bot_spinbox->setValue(6667);
 
-        gridLayout->addWidget(bto, 4, 2, 1, 1);
+        formLayout_5->setWidget(5, QFormLayout::FieldRole, irc_bot_spinbox);
 
-        gto = new QSpinBox(centralWidget);
-        gto->setObjectName(QStringLiteral("gto"));
-        gto->setMaximum(255);
+        irc_channel_label = new QLabel(irc_tab);
+        irc_channel_label->setObjectName(QStringLiteral("irc_channel_label"));
 
-        gridLayout->addWidget(gto, 3, 2, 1, 1);
+        formLayout_5->setWidget(6, QFormLayout::LabelRole, irc_channel_label);
 
-        green_fade_button = new QPushButton(centralWidget);
-        green_fade_button->setObjectName(QStringLiteral("green_fade_button"));
+        irc_channel_input = new QLineEdit(irc_tab);
+        irc_channel_input->setObjectName(QStringLiteral("irc_channel_input"));
 
-        gridLayout->addWidget(green_fade_button, 3, 3, 1, 1);
+        formLayout_5->setWidget(7, QFormLayout::LabelRole, irc_channel_input);
 
-        red_fade_button = new QPushButton(centralWidget);
-        red_fade_button->setObjectName(QStringLiteral("red_fade_button"));
+        irc_name_label = new QLabel(irc_tab);
+        irc_name_label->setObjectName(QStringLiteral("irc_name_label"));
 
-        gridLayout->addWidget(red_fade_button, 1, 3, 1, 1);
+        formLayout_5->setWidget(8, QFormLayout::LabelRole, irc_name_label);
 
-        _to_label = new QLabel(centralWidget);
-        _to_label->setObjectName(QStringLiteral("_to_label"));
+        irc_name_input = new QLineEdit(irc_tab);
+        irc_name_input->setObjectName(QStringLiteral("irc_name_input"));
 
-        gridLayout->addWidget(_to_label, 4, 1, 1, 1);
+        formLayout_5->setWidget(9, QFormLayout::LabelRole, irc_name_input);
 
-        fade_label = new QLabel(centralWidget);
-        fade_label->setObjectName(QStringLiteral("fade_label"));
+        irc_port_label = new QLabel(irc_tab);
+        irc_port_label->setObjectName(QStringLiteral("irc_port_label"));
 
-        gridLayout->addWidget(fade_label, 0, 0, 1, 1);
+        formLayout_5->setWidget(2, QFormLayout::FieldRole, irc_port_label);
 
+        irc_connect_button = new QPushButton(irc_tab);
+        irc_connect_button->setObjectName(QStringLiteral("irc_connect_button"));
 
-        gridLayout_2->addLayout(gridLayout, 14, 0, 1, 2);
+        formLayout_5->setWidget(10, QFormLayout::LabelRole, irc_connect_button);
 
-        arduino_port_label = new QLabel(centralWidget);
-        arduino_port_label->setObjectName(QStringLiteral("arduino_port_label"));
-        arduino_port_label->setMinimumSize(QSize(120, 0));
+        display_tab->addTab(irc_tab, QString());
+        server_tab = new QWidget();
+        server_tab->setObjectName(QStringLiteral("server_tab"));
+        gridLayout_6 = new QGridLayout(server_tab);
+        gridLayout_6->setSpacing(6);
+        gridLayout_6->setContentsMargins(11, 11, 11, 11);
+        gridLayout_6->setObjectName(QStringLiteral("gridLayout_6"));
+        server_tab_layout = new QFormLayout();
+        server_tab_layout->setSpacing(6);
+        server_tab_layout->setObjectName(QStringLiteral("server_tab_layout"));
+        server_start_button = new QPushButton(server_tab);
+        server_start_button->setObjectName(QStringLiteral("server_start_button"));
 
-        gridLayout_2->addWidget(arduino_port_label, 1, 0, 1, 1);
+        server_tab_layout->setWidget(0, QFormLayout::LabelRole, server_start_button);
 
-        b_speed_label = new QLabel(centralWidget);
-        b_speed_label->setObjectName(QStringLiteral("b_speed_label"));
 
-        gridLayout_2->addWidget(b_speed_label, 17, 1, 1, 1);
+        gridLayout_6->addLayout(server_tab_layout, 0, 0, 1, 1);
 
-        speed_button = new QPushButton(centralWidget);
-        speed_button->setObjectName(QStringLiteral("speed_button"));
+        display_tab->addTab(server_tab, QString());
+        log_tab = new QWidget();
+        log_tab->setObjectName(QStringLiteral("log_tab"));
+        gridLayout_3 = new QGridLayout(log_tab);
+        gridLayout_3->setSpacing(6);
+        gridLayout_3->setContentsMargins(11, 11, 11, 11);
+        gridLayout_3->setObjectName(QStringLiteral("gridLayout_3"));
+        serial_input = new QLineEdit(log_tab);
+        serial_input->setObjectName(QStringLiteral("serial_input"));
 
-        gridLayout_2->addWidget(speed_button, 18, 1, 1, 1);
+        gridLayout_3->addWidget(serial_input, 5, 0, 1, 1);
 
-        speed_slider = new QSlider(centralWidget);
-        speed_slider->setObjectName(QStringLiteral("speed_slider"));
-        speed_slider->setMinimum(10);
-        speed_slider->setMaximum(500);
-        speed_slider->setOrientation(Qt::Horizontal);
+        serial_send_button = new QPushButton(log_tab);
+        serial_send_button->setObjectName(QStringLiteral("serial_send_button"));
+
+        gridLayout_3->addWidget(serial_send_button, 5, 1, 1, 1);
+
+        info_log_textarea = new QTextEdit(log_tab);
+        info_log_textarea->setObjectName(QStringLiteral("info_log_textarea"));
+
+        gridLayout_3->addWidget(info_log_textarea, 4, 0, 1, 2);
+
+        info_log_label = new QLabel(log_tab);
+        info_log_label->setObjectName(QStringLiteral("info_log_label"));
+
+        gridLayout_3->addWidget(info_log_label, 0, 0, 1, 1);
+
+        ping_count_label = new QLabel(log_tab);
+        ping_count_label->setObjectName(QStringLiteral("ping_count_label"));
+
+        gridLayout_3->addWidget(ping_count_label, 0, 1, 1, 1);
 
-        gridLayout_2->addWidget(speed_slider, 18, 0, 1, 1);
+        display_tab->addTab(log_tab, QString());
+
+        gridLayout_2->addWidget(display_tab, 7, 1, 1, 1);
 
         controllerWindow->setCentralWidget(centralWidget);
 
         retranslateUi(controllerWindow);
 
+        display_tab->setCurrentIndex(5);
+
+
         QMetaObject::connectSlotsByName(controllerWindow);
     } // setupUi
 
     void retranslateUi(QMainWindow *controllerWindow)
     {
         controllerWindow->setWindowTitle(QApplication::translate("controllerWindow", "RGB Controller", Q_NULLPTR));
-        reload_preset_button->setText(QApplication::translate("controllerWindow", "Reload", Q_NULLPTR));
-        off_button->setText(QApplication::translate("controllerWindow", "Off", Q_NULLPTR));
-        preset_delete_button->setText(QApplication::translate("controllerWindow", "Delete", Q_NULLPTR));
-        presets_label->setText(QApplication::translate("controllerWindow", "Presets", Q_NULLPTR));
-        disconnect_button->setText(QApplication::translate("controllerWindow", "Disconnect", Q_NULLPTR));
-        arduino_status_label->setText(QApplication::translate("controllerWindow", "<font color = red>Disconnected</font>", Q_NULLPTR));
-        info_log_label->setText(QApplication::translate("controllerWindow", "Information log", Q_NULLPTR));
-        green_button->setText(QApplication::translate("controllerWindow", "Green", Q_NULLPTR));
+        arduino_port_label->setText(QApplication::translate("controllerWindow", "Arduino port", Q_NULLPTR));
         refresh_port_button->setText(QApplication::translate("controllerWindow", "Refresh", Q_NULLPTR));
-        rgb_label->setText(QApplication::translate("controllerWindow", "RGB colors", Q_NULLPTR));
         status_label->setText(QApplication::translate("controllerWindow", "Status", Q_NULLPTR));
-        preset_save_button->setText(QApplication::translate("controllerWindow", "Save", Q_NULLPTR));
-        g_speed_label->setText(QApplication::translate("controllerWindow", "Green speed", Q_NULLPTR));
+        arduino_status_label->setText(QApplication::translate("controllerWindow", "<font color = red>Disconnected</font>", Q_NULLPTR));
+        disconnect_button->setText(QApplication::translate("controllerWindow", "Disconnect", Q_NULLPTR));
+        connect_button->setText(QApplication::translate("controllerWindow", "Connect", Q_NULLPTR));
+        display_tab->setTabText(display_tab->indexOf(status_tab), QApplication::translate("controllerWindow", "Status", Q_NULLPTR));
+        rgb_label->setText(QApplication::translate("controllerWindow", "RGB colors", Q_NULLPTR));
         red_button->setText(QApplication::translate("controllerWindow", "Red", Q_NULLPTR));
+        green_button->setText(QApplication::translate("controllerWindow", "Green", Q_NULLPTR));
         blue_button->setText(QApplication::translate("controllerWindow", "Blue", Q_NULLPTR));
-        connect_button->setText(QApplication::translate("controllerWindow", "Connect", Q_NULLPTR));
-        r_speed_label->setText(QApplication::translate("controllerWindow", "Red speed", Q_NULLPTR));
-        set_preset_button->setText(QApplication::translate("controllerWindow", "Set", Q_NULLPTR));
+        off_button->setText(QApplication::translate("controllerWindow", "Off", Q_NULLPTR));
+        display_tab->setTabText(display_tab->indexOf(color_tab), QApplication::translate("controllerWindow", "Color", Q_NULLPTR));
         blue_fade_button->setText(QApplication::translate("controllerWindow", "Blue toggle", Q_NULLPTR));
-        r_to_label->setText(QApplication::translate("controllerWindow", "to", Q_NULLPTR));
         g_to_label->setText(QApplication::translate("controllerWindow", "to", Q_NULLPTR));
+        r_to_label->setText(QApplication::translate("controllerWindow", "to", Q_NULLPTR));
         green_fade_button->setText(QApplication::translate("controllerWindow", "Green toggle", Q_NULLPTR));
         red_fade_button->setText(QApplication::translate("controllerWindow", "Red toggle", Q_NULLPTR));
         _to_label->setText(QApplication::translate("controllerWindow", "to", Q_NULLPTR));
         fade_label->setText(QApplication::translate("controllerWindow", "Fade", Q_NULLPTR));
-        arduino_port_label->setText(QApplication::translate("controllerWindow", "Arduino port", Q_NULLPTR));
+        r_speed_label->setText(QApplication::translate("controllerWindow", "Red speed", Q_NULLPTR));
+        g_speed_label->setText(QApplication::translate("controllerWindow", "Green speed", Q_NULLPTR));
         b_speed_label->setText(QApplication::translate("controllerWindow", "Blue speed", Q_NULLPTR));
         speed_button->setText(QApplication::translate("controllerWindow", "Speed", Q_NULLPTR));
+        display_tab->setTabText(display_tab->indexOf(fade_tab), QApplication::translate("controllerWindow", "Fade", Q_NULLPTR));
+        presets_label->setText(QApplication::translate("controllerWindow", "Presets", Q_NULLPTR));
+        set_preset_button->setText(QApplication::translate("controllerWindow", "Set", Q_NULLPTR));
+        reload_preset_button->setText(QApplication::translate("controllerWindow", "Reload", Q_NULLPTR));
+        preset_save_button->setText(QApplication::translate("controllerWindow", "Save", Q_NULLPTR));
+        preset_delete_button->setText(QApplication::translate("controllerWindow", "Delete", Q_NULLPTR));
+        display_tab->setTabText(display_tab->indexOf(presets_tab), QApplication::translate("controllerWindow", "Presets", Q_NULLPTR));
+        irc_bot_label->setText(QApplication::translate("controllerWindow", "IRC bot", Q_NULLPTR));
+        irc_server_label->setText(QApplication::translate("controllerWindow", "Server", Q_NULLPTR));
+        irc_server_input->setText(QApplication::translate("controllerWindow", "irc.danieljon.es", Q_NULLPTR));
+        irc_channel_label->setText(QApplication::translate("controllerWindow", "Channel", Q_NULLPTR));
+        irc_channel_input->setText(QApplication::translate("controllerWindow", "#csgo", Q_NULLPTR));
+        irc_name_label->setText(QApplication::translate("controllerWindow", "Name", Q_NULLPTR));
+        irc_name_input->setText(QApplication::translate("controllerWindow", "LightBot", Q_NULLPTR));
+        irc_port_label->setText(QApplication::translate("controllerWindow", "Port", Q_NULLPTR));
+        irc_connect_button->setText(QApplication::translate("controllerWindow", "Connect", Q_NULLPTR));
+        display_tab->setTabText(display_tab->indexOf(irc_tab), QApplication::translate("controllerWindow", "IRC", Q_NULLPTR));
+        server_start_button->setText(QApplication::translate("controllerWindow", "Start server", Q_NULLPTR));
+        display_tab->setTabText(display_tab->indexOf(server_tab), QApplication::translate("controllerWindow", "Server", Q_NULLPTR));
+        serial_send_button->setText(QApplication::translate("controllerWindow", "Send", Q_NULLPTR));
+        info_log_label->setText(QApplication::translate("controllerWindow", "Information log", Q_NULLPTR));
+        ping_count_label->setText(QApplication::translate("controllerWindow", "Ping", Q_NULLPTR));
+        display_tab->setTabText(display_tab->indexOf(log_tab), QApplication::translate("controllerWindow", "Log", Q_NULLPTR));
     } // retranslateUi
 
 };
diff --git a/qt/ircbot/.qmake.stash b/qt/ircbot/.qmake.stash
new file mode 100644
index 0000000..39abb16
--- /dev/null
+++ b/qt/ircbot/.qmake.stash
@@ -0,0 +1,12 @@
+QMAKE_DEFAULT_INCDIRS = \
+    /usr/include/c++/6.3.1 \
+    /usr/include/c++/6.3.1/x86_64-pc-linux-gnu \
+    /usr/include/c++/6.3.1/backward \
+    /usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include \
+    /usr/local/include \
+    /usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include-fixed \
+    /usr/include
+QMAKE_DEFAULT_LIBDIRS = \
+    /usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1 \
+    /usr/lib \
+    /lib
diff --git a/qt/ircbot/Makefile b/qt/ircbot/Makefile
new file mode 100644
index 0000000..42c2015
--- /dev/null
+++ b/qt/ircbot/Makefile
@@ -0,0 +1,825 @@
+#############################################################################
+# Makefile for building: qtbot
+# Generated by qmake (3.1) (Qt 5.8.0)
+# Project:  qtbot.pro
+# Template: app
+# Command: /usr/bin/qmake -o Makefile qtbot.pro
+#############################################################################
+
+MAKEFILE      = Makefile
+
+####### Compiler, tools and options
+
+CC            = gcc
+CXX           = g++
+DEFINES       = -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_NETWORK_LIB -DQT_SERIALPORT_LIB -DQT_CORE_LIB
+CFLAGS        = -pipe -O2 -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -Wall -W -D_REENTRANT -fPIC $(DEFINES)
+CXXFLAGS      = -pipe -O2 -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -std=gnu++11 -Wall -W -D_REENTRANT -fPIC $(DEFINES)
+INCPATH       = -I. -isystem /usr/include/qt -isystem /usr/include/qt/QtNetwork -isystem /usr/include/qt/QtSerialPort -isystem /usr/include/qt/QtCore -I. -I/usr/lib/qt/mkspecs/linux-g++
+QMAKE         = /usr/bin/qmake
+DEL_FILE      = rm -f
+CHK_DIR_EXISTS= test -d
+MKDIR         = mkdir -p
+COPY          = cp -f
+COPY_FILE     = cp -f
+COPY_DIR      = cp -f -R
+INSTALL_FILE  = install -m 644 -p
+INSTALL_PROGRAM = install -m 755 -p
+INSTALL_DIR   = cp -f -R
+DEL_FILE      = rm -f
+SYMLINK       = ln -f -s
+DEL_DIR       = rmdir
+MOVE          = mv -f
+TAR           = tar -cf
+COMPRESS      = gzip -9f
+DISTNAME      = qtbot1.0.0
+DISTDIR = /home/daniel_j/documents/school/2016\ research\ project/RGBController/qt/ircbot/.tmp/qtbot1.0.0
+LINK          = g++
+LFLAGS        = -Wl,-O1 -Wl,-O1,--sort-common,--as-needed,-z,relro
+LIBS          = $(SUBLIBS) -lQt5Network -lQt5SerialPort -lQt5Core -lpthread 
+AR            = ar cqs
+RANLIB        = 
+SED           = sed
+STRIP         = strip
+
+####### Output directory
+
+OBJECTS_DIR   = ./
+
+####### Files
+
+SOURCES       = main.cpp \
+		qtbot.cpp moc_qtbot.cpp
+OBJECTS       = main.o \
+		qtbot.o \
+		moc_qtbot.o
+DIST          = /usr/lib/qt/mkspecs/features/spec_pre.prf \
+		/usr/lib/qt/mkspecs/common/unix.conf \
+		/usr/lib/qt/mkspecs/common/linux.conf \
+		/usr/lib/qt/mkspecs/common/sanitize.conf \
+		/usr/lib/qt/mkspecs/common/gcc-base.conf \
+		/usr/lib/qt/mkspecs/common/gcc-base-unix.conf \
+		/usr/lib/qt/mkspecs/common/g++-base.conf \
+		/usr/lib/qt/mkspecs/common/g++-unix.conf \
+		/usr/lib/qt/mkspecs/qconfig.pri \
+		/usr/lib/qt/mkspecs/modules/qt_Attica.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KArchive.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KAuth.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KBookmarks.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KCodecs.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KCompletion.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KConfigCore.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KConfigGui.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KConfigWidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KCoreAddons.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KCrash.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KDBusAddons.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KDEWebKit.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KEmoticons.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KGlobalAccel.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KGuiAddons.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KI18n.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KIconThemes.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KIOCore.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KIOFileWidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KIOGui.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KIOWidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KItemModels.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KItemViews.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KJobWidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KNewStuff.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KNewStuffCore.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KNotifications.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KNotifyConfig.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KNTLM.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KParts.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KPlotting.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KPty.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KService.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KTextWidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KUnitConversion.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KWallet.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KWidgetsAddons.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KWindowSystem.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KXmlGui.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dcore.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dcore_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dextras.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dextras_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dinput.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dinput_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dlogic.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dlogic_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquick.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquick_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquickextras.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquickextras_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquickinput.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquickinput_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquickrender.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquickrender_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3drender.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3drender_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_accessibility_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_bluetooth.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_bluetooth_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_bootstrap_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_charts.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_charts_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_clucene_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_concurrent.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_concurrent_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_core.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_core_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_datavisualization.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_datavisualization_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_dbus.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_dbus_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_designer.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_designer_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_designercomponents_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_egl_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_enginio.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_enginio_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_fb_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_gamepad.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_gamepad_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_glx_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_gui.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_gui_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_help.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_help_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_input_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_location.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_location_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_multimedia.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_multimedia_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_network.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_network_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_networkauth.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_networkauth_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_nfc.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_nfc_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_opengl.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_opengl_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_openglextensions.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_openglextensions_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_positioning.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_positioning_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_printsupport.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_printsupport_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_qml.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_qml_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_qmldebug_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_qmldevtools_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_qmltest.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_qmltest_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quick.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quick_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quickparticles_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_script.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_script_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_scripttools.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_scripttools_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_scxml.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_scxml_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_sensors.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_sensors_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_serialbus.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_serialbus_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_serialport.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_serialport_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_service_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_sql.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_sql_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_svg.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_svg_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_testlib.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_testlib_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_texttospeech.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_texttospeech_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_theme_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_uiplugin.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_uitools.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_uitools_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_waylandclient.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_waylandclient_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webchannel.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webchannel_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webengine.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webengine_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webenginecore.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webenginecore_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webenginewidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webenginewidgets_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webkit.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webkit_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webkitwidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webkitwidgets_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_websockets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_websockets_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webview.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webview_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_widgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_widgets_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_x11extras.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_x11extras_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_xml.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_xml_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_xmlpatterns.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_xmlpatterns_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_phonon4qt5.pri \
+		/usr/lib/qt/mkspecs/modules/qt_QGpgme.pri \
+		/usr/lib/qt/mkspecs/modules/qt_Solid.pri \
+		/usr/lib/qt/mkspecs/modules/qt_SonnetCore.pri \
+		/usr/lib/qt/mkspecs/modules/qt_SonnetUi.pri \
+		/usr/lib/qt/mkspecs/features/qt_functions.prf \
+		/usr/lib/qt/mkspecs/features/qt_config.prf \
+		/usr/lib/qt/mkspecs/linux-g++/qmake.conf \
+		/usr/lib/qt/mkspecs/features/spec_post.prf \
+		.qmake.stash \
+		/usr/lib/qt/mkspecs/features/exclusive_builds.prf \
+		/usr/lib/qt/mkspecs/features/toolchain.prf \
+		/usr/lib/qt/mkspecs/features/default_pre.prf \
+		/usr/lib/qt/mkspecs/features/resolve_config.prf \
+		/usr/lib/qt/mkspecs/features/default_post.prf \
+		/usr/lib/qt/mkspecs/features/warn_on.prf \
+		/usr/lib/qt/mkspecs/features/qt.prf \
+		/usr/lib/qt/mkspecs/features/resources.prf \
+		/usr/lib/qt/mkspecs/features/moc.prf \
+		/usr/lib/qt/mkspecs/features/unix/thread.prf \
+		/usr/lib/qt/mkspecs/features/qmake_use.prf \
+		/usr/lib/qt/mkspecs/features/file_copies.prf \
+		/usr/lib/qt/mkspecs/features/testcase_targets.prf \
+		/usr/lib/qt/mkspecs/features/exceptions.prf \
+		/usr/lib/qt/mkspecs/features/yacc.prf \
+		/usr/lib/qt/mkspecs/features/lex.prf \
+		qtbot.pro qtbot.h main.cpp \
+		qtbot.cpp
+QMAKE_TARGET  = qtbot
+DESTDIR       = 
+TARGET        = qtbot
+
+
+first: all
+####### Build rules
+
+$(TARGET):  $(OBJECTS)  
+	$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
+
+Makefile: qtbot.pro /usr/lib/qt/mkspecs/linux-g++/qmake.conf /usr/lib/qt/mkspecs/features/spec_pre.prf \
+		/usr/lib/qt/mkspecs/common/unix.conf \
+		/usr/lib/qt/mkspecs/common/linux.conf \
+		/usr/lib/qt/mkspecs/common/sanitize.conf \
+		/usr/lib/qt/mkspecs/common/gcc-base.conf \
+		/usr/lib/qt/mkspecs/common/gcc-base-unix.conf \
+		/usr/lib/qt/mkspecs/common/g++-base.conf \
+		/usr/lib/qt/mkspecs/common/g++-unix.conf \
+		/usr/lib/qt/mkspecs/qconfig.pri \
+		/usr/lib/qt/mkspecs/modules/qt_Attica.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KArchive.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KAuth.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KBookmarks.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KCodecs.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KCompletion.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KConfigCore.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KConfigGui.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KConfigWidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KCoreAddons.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KCrash.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KDBusAddons.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KDEWebKit.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KEmoticons.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KGlobalAccel.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KGuiAddons.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KI18n.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KIconThemes.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KIOCore.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KIOFileWidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KIOGui.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KIOWidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KItemModels.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KItemViews.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KJobWidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KNewStuff.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KNewStuffCore.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KNotifications.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KNotifyConfig.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KNTLM.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KParts.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KPlotting.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KPty.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KService.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KTextWidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KUnitConversion.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KWallet.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KWidgetsAddons.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KWindowSystem.pri \
+		/usr/lib/qt/mkspecs/modules/qt_KXmlGui.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dcore.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dcore_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dextras.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dextras_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dinput.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dinput_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dlogic.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dlogic_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquick.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquick_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquickextras.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquickextras_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquickinput.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquickinput_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquickrender.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3dquickrender_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3drender.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_3drender_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_accessibility_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_bluetooth.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_bluetooth_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_bootstrap_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_charts.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_charts_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_clucene_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_concurrent.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_concurrent_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_core.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_core_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_datavisualization.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_datavisualization_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_dbus.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_dbus_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_designer.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_designer_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_designercomponents_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_egl_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_enginio.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_enginio_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_fb_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_gamepad.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_gamepad_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_glx_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_gui.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_gui_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_help.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_help_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_input_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_location.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_location_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_multimedia.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_multimedia_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_network.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_network_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_networkauth.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_networkauth_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_nfc.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_nfc_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_opengl.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_opengl_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_openglextensions.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_openglextensions_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_positioning.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_positioning_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_printsupport.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_printsupport_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_qml.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_qml_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_qmldebug_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_qmldevtools_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_qmltest.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_qmltest_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quick.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quick_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quickparticles_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_script.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_script_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_scripttools.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_scripttools_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_scxml.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_scxml_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_sensors.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_sensors_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_serialbus.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_serialbus_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_serialport.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_serialport_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_service_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_sql.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_sql_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_svg.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_svg_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_testlib.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_testlib_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_texttospeech.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_texttospeech_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_theme_support_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_uiplugin.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_uitools.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_uitools_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_waylandclient.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_waylandclient_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webchannel.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webchannel_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webengine.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webengine_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webenginecore.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webenginecore_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webenginewidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webenginewidgets_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webkit.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webkit_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webkitwidgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webkitwidgets_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_websockets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_websockets_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webview.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_webview_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_widgets.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_widgets_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_x11extras.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_x11extras_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_xml.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_xml_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_xmlpatterns.pri \
+		/usr/lib/qt/mkspecs/modules/qt_lib_xmlpatterns_private.pri \
+		/usr/lib/qt/mkspecs/modules/qt_phonon4qt5.pri \
+		/usr/lib/qt/mkspecs/modules/qt_QGpgme.pri \
+		/usr/lib/qt/mkspecs/modules/qt_Solid.pri \
+		/usr/lib/qt/mkspecs/modules/qt_SonnetCore.pri \
+		/usr/lib/qt/mkspecs/modules/qt_SonnetUi.pri \
+		/usr/lib/qt/mkspecs/features/qt_functions.prf \
+		/usr/lib/qt/mkspecs/features/qt_config.prf \
+		/usr/lib/qt/mkspecs/linux-g++/qmake.conf \
+		/usr/lib/qt/mkspecs/features/spec_post.prf \
+		.qmake.stash \
+		/usr/lib/qt/mkspecs/features/exclusive_builds.prf \
+		/usr/lib/qt/mkspecs/features/toolchain.prf \
+		/usr/lib/qt/mkspecs/features/default_pre.prf \
+		/usr/lib/qt/mkspecs/features/resolve_config.prf \
+		/usr/lib/qt/mkspecs/features/default_post.prf \
+		/usr/lib/qt/mkspecs/features/warn_on.prf \
+		/usr/lib/qt/mkspecs/features/qt.prf \
+		/usr/lib/qt/mkspecs/features/resources.prf \
+		/usr/lib/qt/mkspecs/features/moc.prf \
+		/usr/lib/qt/mkspecs/features/unix/thread.prf \
+		/usr/lib/qt/mkspecs/features/qmake_use.prf \
+		/usr/lib/qt/mkspecs/features/file_copies.prf \
+		/usr/lib/qt/mkspecs/features/testcase_targets.prf \
+		/usr/lib/qt/mkspecs/features/exceptions.prf \
+		/usr/lib/qt/mkspecs/features/yacc.prf \
+		/usr/lib/qt/mkspecs/features/lex.prf \
+		qtbot.pro \
+		/usr/lib/libQt5Network.prl \
+		/usr/lib/libQt5SerialPort.prl \
+		/usr/lib/libQt5Core.prl
+	$(QMAKE) -o Makefile qtbot.pro
+/usr/lib/qt/mkspecs/features/spec_pre.prf:
+/usr/lib/qt/mkspecs/common/unix.conf:
+/usr/lib/qt/mkspecs/common/linux.conf:
+/usr/lib/qt/mkspecs/common/sanitize.conf:
+/usr/lib/qt/mkspecs/common/gcc-base.conf:
+/usr/lib/qt/mkspecs/common/gcc-base-unix.conf:
+/usr/lib/qt/mkspecs/common/g++-base.conf:
+/usr/lib/qt/mkspecs/common/g++-unix.conf:
+/usr/lib/qt/mkspecs/qconfig.pri:
+/usr/lib/qt/mkspecs/modules/qt_Attica.pri:
+/usr/lib/qt/mkspecs/modules/qt_KArchive.pri:
+/usr/lib/qt/mkspecs/modules/qt_KAuth.pri:
+/usr/lib/qt/mkspecs/modules/qt_KBookmarks.pri:
+/usr/lib/qt/mkspecs/modules/qt_KCodecs.pri:
+/usr/lib/qt/mkspecs/modules/qt_KCompletion.pri:
+/usr/lib/qt/mkspecs/modules/qt_KConfigCore.pri:
+/usr/lib/qt/mkspecs/modules/qt_KConfigGui.pri:
+/usr/lib/qt/mkspecs/modules/qt_KConfigWidgets.pri:
+/usr/lib/qt/mkspecs/modules/qt_KCoreAddons.pri:
+/usr/lib/qt/mkspecs/modules/qt_KCrash.pri:
+/usr/lib/qt/mkspecs/modules/qt_KDBusAddons.pri:
+/usr/lib/qt/mkspecs/modules/qt_KDEWebKit.pri:
+/usr/lib/qt/mkspecs/modules/qt_KEmoticons.pri:
+/usr/lib/qt/mkspecs/modules/qt_KGlobalAccel.pri:
+/usr/lib/qt/mkspecs/modules/qt_KGuiAddons.pri:
+/usr/lib/qt/mkspecs/modules/qt_KI18n.pri:
+/usr/lib/qt/mkspecs/modules/qt_KIconThemes.pri:
+/usr/lib/qt/mkspecs/modules/qt_KIOCore.pri:
+/usr/lib/qt/mkspecs/modules/qt_KIOFileWidgets.pri:
+/usr/lib/qt/mkspecs/modules/qt_KIOGui.pri:
+/usr/lib/qt/mkspecs/modules/qt_KIOWidgets.pri:
+/usr/lib/qt/mkspecs/modules/qt_KItemModels.pri:
+/usr/lib/qt/mkspecs/modules/qt_KItemViews.pri:
+/usr/lib/qt/mkspecs/modules/qt_KJobWidgets.pri:
+/usr/lib/qt/mkspecs/modules/qt_KNewStuff.pri:
+/usr/lib/qt/mkspecs/modules/qt_KNewStuffCore.pri:
+/usr/lib/qt/mkspecs/modules/qt_KNotifications.pri:
+/usr/lib/qt/mkspecs/modules/qt_KNotifyConfig.pri:
+/usr/lib/qt/mkspecs/modules/qt_KNTLM.pri:
+/usr/lib/qt/mkspecs/modules/qt_KParts.pri:
+/usr/lib/qt/mkspecs/modules/qt_KPlotting.pri:
+/usr/lib/qt/mkspecs/modules/qt_KPty.pri:
+/usr/lib/qt/mkspecs/modules/qt_KService.pri:
+/usr/lib/qt/mkspecs/modules/qt_KTextWidgets.pri:
+/usr/lib/qt/mkspecs/modules/qt_KUnitConversion.pri:
+/usr/lib/qt/mkspecs/modules/qt_KWallet.pri:
+/usr/lib/qt/mkspecs/modules/qt_KWidgetsAddons.pri:
+/usr/lib/qt/mkspecs/modules/qt_KWindowSystem.pri:
+/usr/lib/qt/mkspecs/modules/qt_KXmlGui.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dcore.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dcore_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dextras.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dextras_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dinput.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dinput_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dlogic.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dlogic_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dquick.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dquick_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dquickextras.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dquickextras_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dquickinput.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dquickinput_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dquickrender.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3dquickrender_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3drender.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_3drender_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_accessibility_support_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_bluetooth.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_bluetooth_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_bootstrap_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_charts.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_charts_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_clucene_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_concurrent.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_concurrent_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_core.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_core_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_datavisualization.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_datavisualization_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_dbus.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_dbus_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_designer.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_designer_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_designercomponents_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_egl_support_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_enginio.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_enginio_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_fb_support_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_fontdatabase_support_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_gamepad.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_gamepad_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_glx_support_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_gui.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_gui_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_help.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_help_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_input_support_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_location.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_location_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_multimedia.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_multimedia_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_network.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_network_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_networkauth.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_networkauth_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_nfc.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_nfc_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_opengl.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_opengl_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_openglextensions.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_openglextensions_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_platformcompositor_support_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_positioning.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_positioning_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_printsupport.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_printsupport_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_qml.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_qml_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_qmldebug_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_qmldevtools_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_qmltest.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_qmltest_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_quick.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_quick_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_quickparticles_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_script.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_script_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_scripttools.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_scripttools_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_scxml.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_scxml_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_sensors.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_sensors_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_serialbus.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_serialbus_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_serialport.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_serialport_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_service_support_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_sql.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_sql_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_svg.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_svg_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_testlib.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_testlib_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_texttospeech.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_texttospeech_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_theme_support_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_uiplugin.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_uitools.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_uitools_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_waylandclient.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_waylandclient_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webchannel.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webchannel_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webengine.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webengine_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webenginecore.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webenginecore_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webenginewidgets.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webenginewidgets_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webkit.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webkit_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webkitwidgets.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webkitwidgets_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_websockets.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_websockets_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webview.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_webview_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_widgets.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_widgets_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_x11extras.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_x11extras_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_xml.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_xml_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_xmlpatterns.pri:
+/usr/lib/qt/mkspecs/modules/qt_lib_xmlpatterns_private.pri:
+/usr/lib/qt/mkspecs/modules/qt_phonon4qt5.pri:
+/usr/lib/qt/mkspecs/modules/qt_QGpgme.pri:
+/usr/lib/qt/mkspecs/modules/qt_Solid.pri:
+/usr/lib/qt/mkspecs/modules/qt_SonnetCore.pri:
+/usr/lib/qt/mkspecs/modules/qt_SonnetUi.pri:
+/usr/lib/qt/mkspecs/features/qt_functions.prf:
+/usr/lib/qt/mkspecs/features/qt_config.prf:
+/usr/lib/qt/mkspecs/linux-g++/qmake.conf:
+/usr/lib/qt/mkspecs/features/spec_post.prf:
+.qmake.stash:
+/usr/lib/qt/mkspecs/features/exclusive_builds.prf:
+/usr/lib/qt/mkspecs/features/toolchain.prf:
+/usr/lib/qt/mkspecs/features/default_pre.prf:
+/usr/lib/qt/mkspecs/features/resolve_config.prf:
+/usr/lib/qt/mkspecs/features/default_post.prf:
+/usr/lib/qt/mkspecs/features/warn_on.prf:
+/usr/lib/qt/mkspecs/features/qt.prf:
+/usr/lib/qt/mkspecs/features/resources.prf:
+/usr/lib/qt/mkspecs/features/moc.prf:
+/usr/lib/qt/mkspecs/features/unix/thread.prf:
+/usr/lib/qt/mkspecs/features/qmake_use.prf:
+/usr/lib/qt/mkspecs/features/file_copies.prf:
+/usr/lib/qt/mkspecs/features/testcase_targets.prf:
+/usr/lib/qt/mkspecs/features/exceptions.prf:
+/usr/lib/qt/mkspecs/features/yacc.prf:
+/usr/lib/qt/mkspecs/features/lex.prf:
+qtbot.pro:
+/usr/lib/libQt5Network.prl:
+/usr/lib/libQt5SerialPort.prl:
+/usr/lib/libQt5Core.prl:
+qmake: FORCE
+	@$(QMAKE) -o Makefile qtbot.pro
+
+qmake_all: FORCE
+
+
+all: Makefile $(TARGET)
+
+dist: distdir FORCE
+	(cd `dirname $(DISTDIR)` && $(TAR) $(DISTNAME).tar $(DISTNAME) && $(COMPRESS) $(DISTNAME).tar) && $(MOVE) `dirname $(DISTDIR)`/$(DISTNAME).tar.gz . && $(DEL_FILE) -r $(DISTDIR)
+
+distdir: FORCE
+	@test -d $(DISTDIR) || mkdir -p $(DISTDIR)
+	$(COPY_FILE) --parents $(DIST) $(DISTDIR)/
+	$(COPY_FILE) --parents /usr/lib/qt/mkspecs/features/data/dummy.cpp $(DISTDIR)/
+	$(COPY_FILE) --parents qtbot.h $(DISTDIR)/
+	$(COPY_FILE) --parents main.cpp qtbot.cpp $(DISTDIR)/
+
+
+clean: compiler_clean 
+	-$(DEL_FILE) $(OBJECTS)
+	-$(DEL_FILE) *~ core *.core
+
+
+distclean: clean 
+	-$(DEL_FILE) $(TARGET) 
+	-$(DEL_FILE) .qmake.stash
+	-$(DEL_FILE) Makefile
+
+
+####### Sub-libraries
+
+mocclean: compiler_moc_header_clean compiler_moc_source_clean
+
+mocables: compiler_moc_header_make_all compiler_moc_source_make_all
+
+check: first
+
+benchmark: first
+
+compiler_rcc_make_all:
+compiler_rcc_clean:
+compiler_moc_predefs_make_all: moc_predefs.h
+compiler_moc_predefs_clean:
+	-$(DEL_FILE) moc_predefs.h
+moc_predefs.h: /usr/lib/qt/mkspecs/features/data/dummy.cpp
+	g++ -pipe -O2 -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -std=gnu++11 -Wall -W -dM -E -o moc_predefs.h /usr/lib/qt/mkspecs/features/data/dummy.cpp
+
+compiler_moc_header_make_all: moc_qtbot.cpp
+compiler_moc_header_clean:
+	-$(DEL_FILE) moc_qtbot.cpp
+moc_qtbot.cpp: qtbot.h \
+		moc_predefs.h \
+		/usr/bin/moc
+	/usr/bin/moc $(DEFINES) --include ./moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I'/home/daniel_j/documents/school/2016 research project/RGBController/qt/ircbot' -I/usr/include/qt -I/usr/include/qt/QtNetwork -I/usr/include/qt/QtSerialPort -I/usr/include/qt/QtCore -I/usr/include/c++/6.3.1 -I/usr/include/c++/6.3.1/x86_64-pc-linux-gnu -I/usr/include/c++/6.3.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include -I/usr/local/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include-fixed -I/usr/include qtbot.h -o moc_qtbot.cpp
+
+compiler_moc_source_make_all:
+compiler_moc_source_clean:
+compiler_yacc_decl_make_all:
+compiler_yacc_decl_clean:
+compiler_yacc_impl_make_all:
+compiler_yacc_impl_clean:
+compiler_lex_make_all:
+compiler_lex_clean:
+compiler_clean: compiler_moc_predefs_clean compiler_moc_header_clean 
+
+####### Compile
+
+main.o: main.cpp qtbot.h
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp
+
+qtbot.o: qtbot.cpp qtbot.h
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o qtbot.o qtbot.cpp
+
+moc_qtbot.o: moc_qtbot.cpp 
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_qtbot.o moc_qtbot.cpp
+
+####### Install
+
+install:  FORCE
+
+uninstall:  FORCE
+
+FORCE:
+
diff --git a/qt/ircbot/main.cpp b/qt/ircbot/main.cpp
new file mode 100644
index 0000000..7022866
--- /dev/null
+++ b/qt/ircbot/main.cpp
@@ -0,0 +1,13 @@
+#include <QCoreApplication>
+#include <QObject>
+#include <QTimer>
+#include <qtbot.h>
+
+int main(int argc, char *argv[])
+{
+    QCoreApplication a(argc, argv);
+	QtBot qtbot;
+	QObject::connect(&qtbot, SIGNAL(done()), &a, SLOT(quit()), Qt::QueuedConnection);
+	QTimer::singleShot(0, &qtbot, SLOT(setup()));
+    return a.exec();
+}
diff --git a/qt/ircbot/moc_predefs.h b/qt/ircbot/moc_predefs.h
new file mode 100644
index 0000000..6a9590c
--- /dev/null
+++ b/qt/ircbot/moc_predefs.h
@@ -0,0 +1,284 @@
+#define __SSP_STRONG__ 3
+#define __DBL_MIN_EXP__ (-1021)
+#define __cpp_attributes 200809
+#define __UINT_LEAST16_MAX__ 0xffff
+#define __ATOMIC_ACQUIRE 2
+#define __FLT_MIN__ 1.17549435082228750797e-38F
+#define __GCC_IEC_559_COMPLEX 2
+#define __UINT_LEAST8_TYPE__ unsigned char
+#define __SIZEOF_FLOAT80__ 16
+#define __INTMAX_C(c) c ## L
+#define __CHAR_BIT__ 8
+#define __UINT8_MAX__ 0xff
+#define __WINT_MAX__ 0xffffffffU
+#define __cpp_static_assert 200410
+#define __ORDER_LITTLE_ENDIAN__ 1234
+#define __SIZE_MAX__ 0xffffffffffffffffUL
+#define __WCHAR_MAX__ 0x7fffffff
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
+#define __DBL_DENORM_MIN__ double(4.94065645841246544177e-324L)
+#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
+#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
+#define __GCC_IEC_559 2
+#define __FLT_EVAL_METHOD__ 0
+#define __unix__ 1
+#define __cpp_binary_literals 201304
+#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
+#define __x86_64 1
+#define __cpp_variadic_templates 200704
+#define __UINT_FAST64_MAX__ 0xffffffffffffffffUL
+#define __SIG_ATOMIC_TYPE__ int
+#define __DBL_MIN_10_EXP__ (-307)
+#define __FINITE_MATH_ONLY__ 0
+#define __GNUC_PATCHLEVEL__ 1
+#define __UINT_FAST8_MAX__ 0xff
+#define __has_include(STR) __has_include__(STR)
+#define __DEC64_MAX_EXP__ 385
+#define __INT8_C(c) c
+#define __UINT_LEAST64_MAX__ 0xffffffffffffffffUL
+#define __SHRT_MAX__ 0x7fff
+#define __LDBL_MAX__ 1.18973149535723176502e+4932L
+#define __UINT_LEAST8_MAX__ 0xff
+#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
+#define __UINTMAX_TYPE__ long unsigned int
+#define __linux 1
+#define __DEC32_EPSILON__ 1E-6DF
+#define __OPTIMIZE__ 1
+#define __unix 1
+#define __UINT32_MAX__ 0xffffffffU
+#define __GXX_EXPERIMENTAL_CXX0X__ 1
+#define __LDBL_MAX_EXP__ 16384
+#define __WINT_MIN__ 0U
+#define __linux__ 1
+#define __SCHAR_MAX__ 0x7f
+#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1)
+#define __INT64_C(c) c ## L
+#define __DBL_DIG__ 15
+#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
+#define __SIZEOF_INT__ 4
+#define __SIZEOF_POINTER__ 8
+#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
+#define __USER_LABEL_PREFIX__ 
+#define __STDC_HOSTED__ 1
+#define __LDBL_HAS_INFINITY__ 1
+#define __FLT_EPSILON__ 1.19209289550781250000e-7F
+#define __GXX_WEAK__ 1
+#define __LDBL_MIN__ 3.36210314311209350626e-4932L
+#define __DEC32_MAX__ 9.999999E96DF
+#define __INT32_MAX__ 0x7fffffff
+#define __SIZEOF_LONG__ 8
+#define __STDC_IEC_559__ 1
+#define __STDC_ISO_10646__ 201505L
+#define __UINT16_C(c) c
+#define __DECIMAL_DIG__ 21
+#define __gnu_linux__ 1
+#define __has_include_next(STR) __has_include_next__(STR)
+#define __LDBL_HAS_QUIET_NAN__ 1
+#define __GNUC__ 6
+#define __GXX_RTTI 1
+#define __MMX__ 1
+#define __cpp_delegating_constructors 200604
+#define __FLT_HAS_DENORM__ 1
+#define __SIZEOF_LONG_DOUBLE__ 16
+#define __BIGGEST_ALIGNMENT__ 16
+#define __STDC_UTF_16__ 1
+#define __DBL_MAX__ double(1.79769313486231570815e+308L)
+#define __cpp_raw_strings 200710
+#define __INT_FAST32_MAX__ 0x7fffffffffffffffL
+#define __DBL_HAS_INFINITY__ 1
+#define __INT64_MAX__ 0x7fffffffffffffffL
+#define __DEC32_MIN_EXP__ (-94)
+#define __INT_FAST16_TYPE__ long int
+#define __LDBL_HAS_DENORM__ 1
+#define __cplusplus 201103L
+#define __cpp_ref_qualifiers 200710
+#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
+#define __INT_LEAST32_MAX__ 0x7fffffff
+#define __DEC32_MIN__ 1E-95DF
+#define __DEPRECATED 1
+#define __cpp_rvalue_references 200610
+#define __DBL_MAX_EXP__ 1024
+#define __DEC128_EPSILON__ 1E-33DL
+#define __SSE2_MATH__ 1
+#define __ATOMIC_HLE_RELEASE 131072
+#define __PTRDIFF_MAX__ 0x7fffffffffffffffL
+#define __amd64 1
+#define __STDC_NO_THREADS__ 1
+#define __ATOMIC_HLE_ACQUIRE 65536
+#define __GNUG__ 6
+#define __LONG_LONG_MAX__ 0x7fffffffffffffffLL
+#define __SIZEOF_SIZE_T__ 8
+#define __cpp_rvalue_reference 200610
+#define __cpp_nsdmi 200809
+#define __SIZEOF_WINT_T__ 4
+#define __cpp_initializer_lists 200806
+#define __cpp_hex_float 201603
+#define __GCC_HAVE_DWARF2_CFI_ASM 1
+#define __GXX_ABI_VERSION 1010
+#define __FLT_MIN_EXP__ (-125)
+#define __cpp_lambdas 200907
+#define __INT_FAST64_TYPE__ long int
+#define __DBL_MIN__ double(2.22507385850720138309e-308L)
+#define __LP64__ 1
+#define __DECIMAL_BID_FORMAT__ 1
+#define __DEC128_MIN__ 1E-6143DL
+#define __REGISTER_PREFIX__ 
+#define __UINT16_MAX__ 0xffff
+#define __DBL_HAS_DENORM__ 1
+#define __UINT8_TYPE__ unsigned char
+#define __FLT_MANT_DIG__ 24
+#define __VERSION__ "6.3.1 20170306"
+#define __UINT64_C(c) c ## UL
+#define __cpp_unicode_characters 200704
+#define _STDC_PREDEF_H 1
+#define __GCC_ATOMIC_INT_LOCK_FREE 2
+#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__
+#define __STDC_IEC_559_COMPLEX__ 1
+#define __INT32_C(c) c
+#define __DEC64_EPSILON__ 1E-15DD
+#define __ORDER_PDP_ENDIAN__ 3412
+#define __DEC128_MIN_EXP__ (-6142)
+#define __INT_FAST32_TYPE__ long int
+#define __UINT_LEAST16_TYPE__ short unsigned int
+#define unix 1
+#define __INT16_MAX__ 0x7fff
+#define __cpp_rtti 199711
+#define __SIZE_TYPE__ long unsigned int
+#define __UINT64_MAX__ 0xffffffffffffffffUL
+#define __INT8_TYPE__ signed char
+#define __ELF__ 1
+#define __GCC_ASM_FLAG_OUTPUTS__ 1
+#define __FLT_RADIX__ 2
+#define __INT_LEAST16_TYPE__ short int
+#define __LDBL_EPSILON__ 1.08420217248550443401e-19L
+#define __UINTMAX_C(c) c ## UL
+#define __GLIBCXX_BITSIZE_INT_N_0 128
+#define __k8 1
+#define __SIG_ATOMIC_MAX__ 0x7fffffff
+#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
+#define __SIZEOF_PTRDIFF_T__ 8
+#define __x86_64__ 1
+#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF
+#define __INT_FAST16_MAX__ 0x7fffffffffffffffL
+#define __UINT_FAST32_MAX__ 0xffffffffffffffffUL
+#define __UINT_LEAST64_TYPE__ long unsigned int
+#define __FLT_HAS_QUIET_NAN__ 1
+#define __FLT_MAX_10_EXP__ 38
+#define __LONG_MAX__ 0x7fffffffffffffffL
+#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL
+#define __FLT_HAS_INFINITY__ 1
+#define __cpp_unicode_literals 200710
+#define __UINT_FAST16_TYPE__ long unsigned int
+#define __DEC64_MAX__ 9.999999999999999E384DD
+#define __CHAR16_TYPE__ short unsigned int
+#define __PRAGMA_REDEFINE_EXTNAME 1
+#define __SEG_FS 1
+#define __INT_LEAST16_MAX__ 0x7fff
+#define __DEC64_MANT_DIG__ 16
+#define __UINT_LEAST32_MAX__ 0xffffffffU
+#define __SEG_GS 1
+#define __GCC_ATOMIC_LONG_LOCK_FREE 2
+#define __INT_LEAST64_TYPE__ long int
+#define __INT16_TYPE__ short int
+#define __INT_LEAST8_TYPE__ signed char
+#define __DEC32_MAX_EXP__ 97
+#define __INT_FAST8_MAX__ 0x7f
+#define __INTPTR_MAX__ 0x7fffffffffffffffL
+#define linux 1
+#define __cpp_range_based_for 200907
+#define __SSE2__ 1
+#define __EXCEPTIONS 1
+#define __LDBL_MANT_DIG__ 64
+#define __DBL_HAS_QUIET_NAN__ 1
+#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1)
+#define __code_model_small__ 1
+#define __k8__ 1
+#define __INTPTR_TYPE__ long int
+#define __UINT16_TYPE__ short unsigned int
+#define __WCHAR_TYPE__ int
+#define __SIZEOF_FLOAT__ 4
+#define __UINTPTR_MAX__ 0xffffffffffffffffUL
+#define __DEC64_MIN_EXP__ (-382)
+#define __cpp_decltype 200707
+#define __INT_FAST64_MAX__ 0x7fffffffffffffffL
+#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
+#define __FLT_DIG__ 6
+#define __UINT_FAST64_TYPE__ long unsigned int
+#define __INT_MAX__ 0x7fffffff
+#define __amd64__ 1
+#define __INT64_TYPE__ long int
+#define __FLT_MAX_EXP__ 128
+#define __ORDER_BIG_ENDIAN__ 4321
+#define __DBL_MANT_DIG__ 53
+#define __cpp_inheriting_constructors 200802
+#define __SIZEOF_FLOAT128__ 16
+#define __INT_LEAST64_MAX__ 0x7fffffffffffffffL
+#define __DEC64_MIN__ 1E-383DD
+#define __WINT_TYPE__ unsigned int
+#define __UINT_LEAST32_TYPE__ unsigned int
+#define __SIZEOF_SHORT__ 2
+#define __SSE__ 1
+#define __LDBL_MIN_EXP__ (-16381)
+#define __INT_LEAST8_MAX__ 0x7f
+#define __SIZEOF_INT128__ 16
+#define __LDBL_MAX_10_EXP__ 4932
+#define __ATOMIC_RELAXED 0
+#define __DBL_EPSILON__ double(2.22044604925031308085e-16L)
+#define _LP64 1
+#define __UINT8_C(c) c
+#define __INT_LEAST32_TYPE__ int
+#define __SIZEOF_WCHAR_T__ 4
+#define __UINT64_TYPE__ long unsigned int
+#define __INT_FAST8_TYPE__ signed char
+#define __GNUC_STDC_INLINE__ 1
+#define __DBL_DECIMAL_DIG__ 17
+#define __STDC_UTF_32__ 1
+#define __FXSR__ 1
+#define __DEC_EVAL_METHOD__ 2
+#define __cpp_runtime_arrays 198712
+#define __UINT32_C(c) c ## U
+#define __INTMAX_MAX__ 0x7fffffffffffffffL
+#define __cpp_alias_templates 200704
+#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
+#define __FLT_DENORM_MIN__ 1.40129846432481707092e-45F
+#define __INT8_MAX__ 0x7f
+#define __UINT_FAST32_TYPE__ long unsigned int
+#define __CHAR32_TYPE__ unsigned int
+#define __FLT_MAX__ 3.40282346638528859812e+38F
+#define __cpp_constexpr 200704
+#define __INT32_TYPE__ int
+#define __SIZEOF_DOUBLE__ 8
+#define __cpp_exceptions 199711
+#define __INTMAX_TYPE__ long int
+#define __DEC128_MAX_EXP__ 6145
+#define __ATOMIC_CONSUME 1
+#define __GNUC_MINOR__ 3
+#define __GLIBCXX_TYPE_INT_N_0 __int128
+#define __UINTMAX_MAX__ 0xffffffffffffffffUL
+#define __DEC32_MANT_DIG__ 7
+#define __DBL_MAX_10_EXP__ 308
+#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
+#define __INT16_C(c) c
+#define __STDC__ 1
+#define __PTRDIFF_TYPE__ long int
+#define __ATOMIC_SEQ_CST 5
+#define __UINT32_TYPE__ unsigned int
+#define __UINTPTR_TYPE__ long unsigned int
+#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD
+#define __DEC128_MANT_DIG__ 34
+#define __LDBL_MIN_10_EXP__ (-4931)
+#define __SSE_MATH__ 1
+#define __SIZEOF_LONG_LONG__ 8
+#define __cpp_user_defined_literals 200809
+#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
+#define __LDBL_DIG__ 18
+#define __FLT_DECIMAL_DIG__ 9
+#define __UINT_FAST16_MAX__ 0xffffffffffffffffUL
+#define __FLT_MIN_10_EXP__ (-37)
+#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
+#define __UINT_FAST8_TYPE__ unsigned char
+#define _GNU_SOURCE 1
+#define __ATOMIC_ACQ_REL 4
+#define __ATOMIC_RELEASE 3
diff --git a/qt/ircbot/moc_qtbot.cpp b/qt/ircbot/moc_qtbot.cpp
new file mode 100644
index 0000000..4eff919
--- /dev/null
+++ b/qt/ircbot/moc_qtbot.cpp
@@ -0,0 +1,156 @@
+/****************************************************************************
+** Meta object code from reading C++ file 'qtbot.h'
+**
+** Created by: The Qt Meta Object Compiler version 67 (Qt 5.8.0)
+**
+** WARNING! All changes made in this file will be lost!
+*****************************************************************************/
+
+#include "qtbot.h"
+#include <QtCore/qbytearray.h>
+#include <QtCore/qmetatype.h>
+#if !defined(Q_MOC_OUTPUT_REVISION)
+#error "The header file 'qtbot.h' doesn't include <QObject>."
+#elif Q_MOC_OUTPUT_REVISION != 67
+#error "This file was generated using the moc from 5.8.0. It"
+#error "cannot be used with the include files from this version of Qt."
+#error "(The moc has changed too much.)"
+#endif
+
+QT_BEGIN_MOC_NAMESPACE
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+struct qt_meta_stringdata_QtBot_t {
+    QByteArrayData data[10];
+    char stringdata0[52];
+};
+#define QT_MOC_LITERAL(idx, ofs, len) \
+    Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
+    qptrdiff(offsetof(qt_meta_stringdata_QtBot_t, stringdata0) + ofs \
+        - idx * sizeof(QByteArrayData)) \
+    )
+static const qt_meta_stringdata_QtBot_t qt_meta_stringdata_QtBot = {
+    {
+QT_MOC_LITERAL(0, 0, 5), // "QtBot"
+QT_MOC_LITERAL(1, 6, 4), // "done"
+QT_MOC_LITERAL(2, 11, 0), // ""
+QT_MOC_LITERAL(3, 12, 4), // "read"
+QT_MOC_LITERAL(4, 17, 8), // "bconnect"
+QT_MOC_LITERAL(5, 26, 5), // "parse"
+QT_MOC_LITERAL(6, 32, 4), // "line"
+QT_MOC_LITERAL(7, 37, 4), // "send"
+QT_MOC_LITERAL(8, 42, 3), // "com"
+QT_MOC_LITERAL(9, 46, 5) // "setup"
+
+    },
+    "QtBot\0done\0\0read\0bconnect\0parse\0line\0"
+    "send\0com\0setup"
+};
+#undef QT_MOC_LITERAL
+
+static const uint qt_meta_data_QtBot[] = {
+
+ // content:
+       7,       // revision
+       0,       // classname
+       0,    0, // classinfo
+       6,   14, // methods
+       0,    0, // properties
+       0,    0, // enums/sets
+       0,    0, // constructors
+       0,       // flags
+       1,       // signalCount
+
+ // signals: name, argc, parameters, tag, flags
+       1,    0,   44,    2, 0x06 /* Public */,
+
+ // slots: name, argc, parameters, tag, flags
+       3,    0,   45,    2, 0x08 /* Private */,
+       4,    0,   46,    2, 0x08 /* Private */,
+       5,    1,   47,    2, 0x08 /* Private */,
+       7,    1,   50,    2, 0x08 /* Private */,
+       9,    0,   53,    2, 0x0a /* Public */,
+
+ // signals: parameters
+    QMetaType::Void,
+
+ // slots: parameters
+    QMetaType::Void,
+    QMetaType::Void,
+    QMetaType::Void, QMetaType::QString,    6,
+    QMetaType::Void, QMetaType::QString,    8,
+    QMetaType::Void,
+
+       0        // eod
+};
+
+void QtBot::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
+{
+    if (_c == QMetaObject::InvokeMetaMethod) {
+        QtBot *_t = static_cast<QtBot *>(_o);
+        Q_UNUSED(_t)
+        switch (_id) {
+        case 0: _t->done(); break;
+        case 1: _t->read(); break;
+        case 2: _t->bconnect(); break;
+        case 3: _t->parse((*reinterpret_cast< QString(*)>(_a[1]))); break;
+        case 4: _t->send((*reinterpret_cast< QString(*)>(_a[1]))); break;
+        case 5: _t->setup(); break;
+        default: ;
+        }
+    } else if (_c == QMetaObject::IndexOfMethod) {
+        int *result = reinterpret_cast<int *>(_a[0]);
+        void **func = reinterpret_cast<void **>(_a[1]);
+        {
+            typedef void (QtBot::*_t)();
+            if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&QtBot::done)) {
+                *result = 0;
+                return;
+            }
+        }
+    }
+}
+
+const QMetaObject QtBot::staticMetaObject = {
+    { &QObject::staticMetaObject, qt_meta_stringdata_QtBot.data,
+      qt_meta_data_QtBot,  qt_static_metacall, Q_NULLPTR, Q_NULLPTR}
+};
+
+
+const QMetaObject *QtBot::metaObject() const
+{
+    return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
+}
+
+void *QtBot::qt_metacast(const char *_clname)
+{
+    if (!_clname) return Q_NULLPTR;
+    if (!strcmp(_clname, qt_meta_stringdata_QtBot.stringdata0))
+        return static_cast<void*>(const_cast< QtBot*>(this));
+    return QObject::qt_metacast(_clname);
+}
+
+int QtBot::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
+{
+    _id = QObject::qt_metacall(_c, _id, _a);
+    if (_id < 0)
+        return _id;
+    if (_c == QMetaObject::InvokeMetaMethod) {
+        if (_id < 6)
+            qt_static_metacall(this, _c, _id, _a);
+        _id -= 6;
+    } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
+        if (_id < 6)
+            *reinterpret_cast<int*>(_a[0]) = -1;
+        _id -= 6;
+    }
+    return _id;
+}
+
+// SIGNAL 0
+void QtBot::done()
+{
+    QMetaObject::activate(this, &staticMetaObject, 0, Q_NULLPTR);
+}
+QT_WARNING_POP
+QT_END_MOC_NAMESPACE
diff --git a/qt/ircbot/qtbot b/qt/ircbot/qtbot
new file mode 100755
index 0000000..72dc64d
Binary files /dev/null and b/qt/ircbot/qtbot differ
diff --git a/qt/ircbot/qtbot.cpp b/qt/ircbot/qtbot.cpp
new file mode 100644
index 0000000..2cb67dd
--- /dev/null
+++ b/qt/ircbot/qtbot.cpp
@@ -0,0 +1,82 @@
+#include "qtbot.h"
+
+QtBot::QtBot(QObject *parent) : QObject(parent)
+{
+
+}
+
+void QtBot::setup()
+{
+	qDebug() << "setup()";
+	/* setup socket, connect signal/slot */
+	socket = new QTcpSocket(this);
+	connect(socket, SIGNAL(readyRead()), this, SLOT(read()));
+	/* connect */
+	bconnect();
+	/* serial connect */
+	ser = new QSerialPort(this);
+	ser->setPortName("ttyACM0");
+	ser->setBaudRate(QSerialPort::Baud9600);
+	ser->setDataBits(QSerialPort::Data8);
+	ser->setParity(QSerialPort::NoParity);
+	ser->setStopBits(QSerialPort::OneStop);
+	ser->setFlowControl(QSerialPort::NoFlowControl);
+	ser->open(QIODevice::ReadWrite);
+	ser->waitForBytesWritten(9000);
+	if (ser->isWritable())
+	{
+		qDebug() << "Writable serial";
+	}
+}
+
+void QtBot::send(QString com)
+{
+	data = "";
+	qDebug() << "sending" << com;
+	data.append(com + "\n");
+	if (ser->isOpen())
+		ser->write(data);
+}
+
+void QtBot::read()
+{
+	QString line = socket->readLine();
+	if (line.contains("PING :"))
+	{
+		QString sline = "PONG :" + line.split(":")[1];
+		socket->write(sline.toLatin1());
+	}
+	if (line.contains("qtbot MODE qtbot :+"))
+	{
+		socket->write("JOIN #bukkake \r\n");
+		socket->write("JOIN #fun \r\n");
+	}
+	if (line.contains("!"))
+		parse(line);
+	if(socket->canReadLine())
+		read();
+}
+
+void QtBot::bconnect()
+{
+	socket->connectToHost(server, port);	
+	socket->write("NICK qtbot \r\n");
+	socket->write("USER qtbot 8 * :qtbot \r\n");
+}
+
+void QtBot::parse(QString line)
+{
+	QString l = line.split(":")[2].remove(QRegExp("[\\n\\t\\r]"));
+	qDebug() << "parsing: " << l;
+	if (l.split(" ")[0] == ".command")
+	{
+		if (l.split(" ")[1].size() > 2)
+		{
+			QString sendl = "PRIVMSG #tests :red set. \r\n";
+			QString command = l.split(" ")[1];
+			qDebug() << "command is " << command;
+			send(command);
+			//socket->write(send.toLocal8Bit());
+		}	
+	}
+}
diff --git a/qt/ircbot/qtbot.h b/qt/ircbot/qtbot.h
new file mode 100644
index 0000000..5878def
--- /dev/null
+++ b/qt/ircbot/qtbot.h
@@ -0,0 +1,37 @@
+#ifndef QTBOT_H
+#define QTBOT_H
+
+#include <QObject>
+#include <QDebug>
+#include <QtNetwork/QTcpSocket>
+#include <QSerialPort>
+#include <QSerialPortInfo>
+
+class QtBot : public QObject
+{
+	Q_OBJECT
+	public:
+		explicit QtBot(QObject *parent = 0);
+		QString server = "irc.danieljon.es";
+		int port = 6667;
+		QString name = "RGBBot";
+		QSerialPort *ser;
+		QByteArray data;
+		QByteArray serdata;
+
+	private:
+		QTcpSocket *socket;
+		private slots:
+			void read();
+		void bconnect();
+		void parse(QString line);
+		void send(QString com);
+
+signals:
+		void done();
+
+		public slots:
+			void setup();
+};
+
+#endif // QTBOT_H
diff --git a/qt/ircbot/qtbot.pro b/qt/ircbot/qtbot.pro
new file mode 100644
index 0000000..1f87c7f
--- /dev/null
+++ b/qt/ircbot/qtbot.pro
@@ -0,0 +1,27 @@
+QT += core network serialport
+QT -= gui
+
+CONFIG += c++11
+
+TARGET = qtbot
+CONFIG += console
+CONFIG -= app_bundle
+
+TEMPLATE = app
+
+SOURCES += main.cpp \
+	qtbot.cpp
+
+# The following define makes your compiler emit warnings if you use
+# any feature of Qt which as been marked deprecated (the exact warnings
+# depend on your compiler). Please consult the documentation of the
+# deprecated API in order to know how to port your code away from it.
+DEFINES += QT_DEPRECATED_WARNINGS
+
+# You can also make your code fail to compile if you use deprecated APIs.
+# In order to do so, uncomment the following line.
+# You can also select to disable deprecated APIs only up to a certain version of Qt.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
+
+HEADERS += \
+    qtbot.h \
diff --git a/qt/ircbot/qtbot.pro.user b/qt/ircbot/qtbot.pro.user
new file mode 100644
index 0000000..c51a605
--- /dev/null
+++ b/qt/ircbot/qtbot.pro.user
@@ -0,0 +1,336 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE QtCreatorProject>
+<!-- Written by QtCreator 4.2.1, 2017-03-11T20:53:50. -->
+<qtcreator>
+ <data>
+  <variable>EnvironmentId</variable>
+  <value type="QByteArray">{c148e485-3cf0-4847-b5fd-56246b2688e8}</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.ActiveTarget</variable>
+  <value type="int">0</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.EditorSettings</variable>
+  <valuemap type="QVariantMap">
+   <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
+   <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
+   <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
+    <value type="QString" key="language">Cpp</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
+    </valuemap>
+   </valuemap>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
+    <value type="QString" key="language">QmlJS</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
+    </valuemap>
+   </valuemap>
+   <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
+   <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
+   <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
+   <value type="int" key="EditorConfiguration.IndentSize">4</value>
+   <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
+   <value type="int" key="EditorConfiguration.MarginColumn">80</value>
+   <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
+   <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
+   <value type="int" key="EditorConfiguration.PaddingMode">1</value>
+   <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
+   <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
+   <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
+   <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
+   <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
+   <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
+   <value type="int" key="EditorConfiguration.TabSize">8</value>
+   <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
+   <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
+   <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
+   <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
+   <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
+   <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.PluginSettings</variable>
+  <valuemap type="QVariantMap"/>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Target.0</variable>
+  <valuemap type="QVariantMap">
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{a6071b8b-a567-46c9-babb-33312c5773b5}</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/daniel_j/programming/c++/build-qtbot-Desktop-Debug</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
+    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/daniel_j/programming/c++/build-qtbot-Desktop-Release</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/daniel_j/programming/c++/build-qtbot-Desktop-Profile</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy locally</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
+    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
+    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
+    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
+    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
+    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
+    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
+    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
+    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
+    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
+     <value type="int">0</value>
+     <value type="int">1</value>
+     <value type="int">2</value>
+     <value type="int">3</value>
+     <value type="int">4</value>
+     <value type="int">5</value>
+     <value type="int">6</value>
+     <value type="int">7</value>
+     <value type="int">8</value>
+     <value type="int">9</value>
+     <value type="int">10</value>
+     <value type="int">11</value>
+     <value type="int">12</value>
+     <value type="int">13</value>
+     <value type="int">14</value>
+    </valuelist>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qtbot</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/daniel_j/programming/c++/qtbot/qtbot.pro</value>
+    <value type="bool" key="QmakeProjectManager.QmakeRunConfiguration.UseLibrarySearchPath">true</value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">qtbot.pro</value>
+    <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default">/home/daniel_j/programming/c++/build-qtbot-Desktop-Debug</value>
+    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
+    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.TargetCount</variable>
+  <value type="int">1</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
+  <value type="int">18</value>
+ </data>
+ <data>
+  <variable>Version</variable>
+  <value type="int">18</value>
+ </data>
+</qtcreator>
-- 
cgit v1.2.3