diff --git a/commandwidget.cpp b/commandwidget.cpp
new file mode 100644
--- /dev/null
+++ b/commandwidget.cpp
@@ -0,0 +1,95 @@
+/*
+  Copyright © 2015 Hasan Yavuz Özderya
+
+  This file is part of serialplot.
+
+  serialplot is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  serialplot is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with serialplot.  If not, see .
+*/
+
+#include "commandwidget.h"
+#include "ui_commandwidget.h"
+
+#include 
+#include 
+#include 
+#include 
+
+CommandWidget::CommandWidget(QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::CommandWidget)
+{
+    ui->setupUi(this);
+
+#ifdef Q_OS_WIN
+    ui->pbDelete->setIcon(QIcon(":/icons/list-remove"));
+#endif // Q_OS_WIN
+
+    connect(ui->pbDelete, &QPushButton::clicked, this, &CommandWidget::onDeleteClicked);
+    connect(ui->pbSend, &QPushButton::clicked, this, &CommandWidget::onSendClicked);
+    connect(ui->pbASCII, &QPushButton::toggled, this, &CommandWidget::onASCIIToggled);
+}
+
+CommandWidget::~CommandWidget()
+{
+    delete ui;
+}
+
+void CommandWidget::onDeleteClicked()
+{
+    this->deleteLater();
+}
+
+void CommandWidget::onSendClicked()
+{
+    auto command = ui->leCommand->text();
+
+    if (command.isEmpty())
+    {
+        qWarning() << "Enter a command to send!";
+        ui->leCommand->setFocus(Qt::OtherFocusReason);
+        return;
+    }
+
+    if (isASCIIMode())
+    {
+        qDebug() << "Sending:" << command;
+        emit sendCommand(ui->leCommand->unEscapedText().toLatin1());
+    }
+    else // hex mode
+    {
+        command = command.remove(' ');
+        // check if nibbles are missing
+        if (command.size() % 2 == 1)
+        {
+            qWarning() << "HEX command is missing a nibble at the end!";
+            ui->leCommand->setFocus(Qt::OtherFocusReason);
+            // highlight the byte that is missing a nibble (last byte obviously)
+            int textSize = ui->leCommand->text().size();
+            ui->leCommand->setSelection(textSize-1, textSize);
+            return;
+        }
+        qDebug() << "Sending HEX:" << command;
+        emit sendCommand(QByteArray::fromHex(command.toLatin1()));
+    }
+}
+
+void CommandWidget::onASCIIToggled(bool checked)
+{
+    ui->leCommand->setMode(checked);
+}
+
+bool CommandWidget::isASCIIMode()
+{
+    return ui->pbASCII->isChecked();
+}