diff --git a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -79,6 +79,7 @@ add_executable(${PROGRAM_NAME} WIN32
   plotsnapshotoverlay.cpp
   commandpanel.cpp
   commandwidget.cpp
+  commandedit.cpp
   ${UI_FILES}
   ${RES_FILES}
   misc/windows_icon.rc
diff --git a/commandedit.cpp b/commandedit.cpp
new file mode 100644
--- /dev/null
+++ b/commandedit.cpp
@@ -0,0 +1,102 @@
+/*
+  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 
+
+#include "commandedit.h"
+
+class HexCommandValidator : public QRegExpValidator
+{
+public:
+    explicit HexCommandValidator(QObject* parent = 0);
+    QValidator::State validate(QString & input, int & pos) const;
+};
+
+HexCommandValidator::HexCommandValidator(QObject* parent) :
+    QRegExpValidator(parent)
+{
+    QRegExp regExp("^(?:(?:[0-9A-F]{2}[ ])+(?:[0-9A-F]{2}))|(?:[0-9A-F]{2})$");
+    setRegExp(regExp);
+}
+
+QValidator::State HexCommandValidator::validate(QString & input, int & pos) const
+{
+    input = input.toUpper();
+
+    // don't let pos to be altered at this stage
+    int orgPos = pos;
+    auto r = QRegExpValidator::validate(input, pos);
+    pos = orgPos;
+
+    // try fixing up spaces
+    if (r != QValidator::Acceptable)
+    {
+        input = input.replace(" ", "");
+        input.replace(QRegExp("([0-9A-F]{2}(?!$))"), "\\1 ");
+        if (pos == input.size()-1) pos = input.size();
+        r = QRegExpValidator::validate(input, pos);
+    }
+
+    return r;
+}
+
+CommandEdit::CommandEdit(QWidget *parent) :
+    QLineEdit(parent)
+{
+    hexValidator = new HexCommandValidator(this);
+    ascii_mode = true;
+}
+
+CommandEdit::~CommandEdit()
+{
+    delete hexValidator;
+}
+
+void CommandEdit::setMode(bool ascii)
+{
+    ascii_mode = ascii;
+    if (ascii)
+    {
+        setValidator(0);
+    }
+    else
+    {
+        setValidator(hexValidator);
+    }
+}
+
+void CommandEdit::keyPressEvent(QKeyEvent * event)
+{
+    if (ascii_mode)
+    {
+        QLineEdit::keyPressEvent(event);
+        return;
+    }
+
+    if (event->key() == Qt::Key_Backspace && !hasSelectedText())
+    {
+        int cursor = cursorPosition();
+        if (cursor != 0 && text()[cursor-1] == ' ')
+        {
+            setCursorPosition(cursor-1);
+        }
+    }
+
+    QLineEdit::keyPressEvent(event);
+}
diff --git a/commandedit.h b/commandedit.h
new file mode 100644
--- /dev/null
+++ b/commandedit.h
@@ -0,0 +1,43 @@
+/*
+  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 .
+*/
+
+#ifndef COMMANDEDIT_H
+#define COMMANDEDIT_H
+
+#include 
+#include 
+
+class CommandEdit : public QLineEdit
+{
+    Q_OBJECT
+
+public:
+    explicit CommandEdit(QWidget *parent = 0);
+    ~CommandEdit();
+    void setMode(bool ascii); // true = ascii, false = hex
+
+private:
+    bool ascii_mode;
+    QValidator* hexValidator;
+
+protected:
+    void keyPressEvent(QKeyEvent * event) Q_DECL_OVERRIDE;
+};
+
+#endif // COMMANDEDIT_H
diff --git a/commandwidget.cpp b/commandwidget.cpp
--- a/commandwidget.cpp
+++ b/commandwidget.cpp
@@ -23,40 +23,7 @@
 #include 
 #include 
 
-class HexCommandValidator : public QRegExpValidator
-{
-public:
-    explicit HexCommandValidator(QObject* parent = 0);
-    QValidator::State validate(QString & input, int & pos) const;
-};
-
-HexCommandValidator::HexCommandValidator(QObject* parent) :
-    QRegExpValidator(parent)
-{
-    QRegExp regExp("^(?:(?:[0-9A-F]{2}[ ])+(?:[0-9A-F]{2}))|(?:[0-9A-F]{2})$");
-    setRegExp(regExp);
-}
-
-QValidator::State HexCommandValidator::validate(QString & input, int & pos) const
-{
-    input = input.toUpper();
-
-    // don't let pos to be altered at this stage
-    int orgPos = pos;
-    auto r = QRegExpValidator::validate(input, pos);
-    pos = orgPos;
-
-    // try fixing up spaces
-    if (r != QValidator::Acceptable)
-    {
-        input = input.replace(" ", "");
-        input.replace(QRegExp("([0-9A-F]{2}(?!$))"), "\\1 ");
-        if (pos == input.size()-1) pos = input.size();
-        r = QRegExpValidator::validate(input, pos);
-    }
-
-    return r;
-}
+#include 
 
 CommandWidget::CommandWidget(QWidget *parent) :
     QWidget(parent),
@@ -67,14 +34,11 @@ CommandWidget::CommandWidget(QWidget *pa
     connect(ui->pbDelete, &QPushButton::clicked, this, &CommandWidget::onDeleteClicked);
     connect(ui->pbSend, &QPushButton::clicked, this, &CommandWidget::onSendClicked);
     connect(ui->pbASCII, &QPushButton::toggled, this, &CommandWidget::onASCIIToggled);
-
-    hexValidator = new HexCommandValidator(this);
 }
 
 CommandWidget::~CommandWidget()
 {
     delete ui;
-    delete hexValidator;
 }
 
 void CommandWidget::onDeleteClicked()
@@ -89,12 +53,5 @@ void CommandWidget::onSendClicked()
 
 void CommandWidget::onASCIIToggled(bool checked)
 {
-    if (checked)
-    {
-        ui->leCommand->setValidator(0);
-    }
-    else
-    {
-        ui->leCommand->setValidator(hexValidator);
-    }
+    ui->leCommand->setMode(checked);
 }
diff --git a/commandwidget.h b/commandwidget.h
--- a/commandwidget.h
+++ b/commandwidget.h
@@ -22,7 +22,6 @@
 
 #include 
 #include 
-#include 
 
 namespace Ui {
 class CommandWidget;
@@ -42,7 +41,6 @@ signals:
 
 private:
     Ui::CommandWidget *ui;
-    QValidator* hexValidator;
 
 private slots:
     void onDeleteClicked();
diff --git a/commandwidget.ui b/commandwidget.ui
--- a/commandwidget.ui
+++ b/commandwidget.ui
@@ -48,7 +48,7 @@
     
    
    - 
-    
+    
      
       
        0
@@ -155,6 +155,13 @@
    
 
   
  
+ 
+  
+   CommandEdit
+   QLineEdit
+   
+  
+ 
  
  
 
diff --git a/serialplot.pro b/serialplot.pro
--- a/serialplot.pro
+++ b/serialplot.pro
@@ -48,7 +48,8 @@ SOURCES += main.cpp\
     snapshot.cpp \
     plotsnapshotoverlay.cpp \
     commandpanel.cpp \
-    commandwidget.cpp
+    commandwidget.cpp \
+    commandedit.cpp
 
 HEADERS  += mainwindow.h \
     utils.h \
@@ -66,7 +67,8 @@ HEADERS  += mainwindow.h \
     snapshot.h \
     plotsnapshotoverlay.h \
     commandpanel.h \
-    commandwidget.h
+    commandwidget.h \
+    commandedit.h
 
 FORMS    += mainwindow.ui \
     about_dialog.ui \