diff --git a/src/plugins/git/branchadddialog.cpp b/src/plugins/git/branchadddialog.cpp
index 4f9df40187dc51b574c04b45b91dfd596f722d46..ccb4cef21a278a72d66b6dcc7e643d58c463cae9 100644
--- a/src/plugins/git/branchadddialog.cpp
+++ b/src/plugins/git/branchadddialog.cpp
@@ -30,14 +30,78 @@
 #include "branchadddialog.h"
 #include "ui_branchadddialog.h"
 
+#include <QPushButton>
+#include <QValidator>
+
 namespace Git {
 namespace Internal {
 
+/*!
+ * \brief Validates the corresponding string as a valid git branch name
+ *
+ * The class does this by a couple of rules that are applied on the string.
+ *
+ */
+class BranchNameValidator : public QValidator
+{
+public:
+    BranchNameValidator(QObject *parent = 0) :
+        QValidator(parent),
+        m_invalidChars(QLatin1String(
+                                   "\\s"          // no whitespace
+                                   "|~"         // no "~"
+                                   "|\\^"       // no "^"
+                                   "|\\["       // no "["
+                                   "|\\.\\."    // no ".."
+                                   "|/\\."      // no slashdot
+                                   "|:"         // no ":"
+                                   "|@\\{"      // no "@{" sequence
+                                   "|\\\\"      // no backslash
+                                   "|//"    // no double slash
+                                   "|^/"  // no leading slash
+                                   ))
+    {
+    }
+
+    ~BranchNameValidator() {}
+
+    State validate(QString &input, int &pos) const
+    {
+        Q_UNUSED(pos)
+
+        // NoGos
+
+        if (input.contains(m_invalidChars))
+            return Invalid;
+
+
+        // "Intermediate" patterns, may change to Acceptable when user edits further:
+
+        if (input.endsWith(QLatin1String(".lock"))) //..may not end with ".lock"
+            return Intermediate;
+
+        if (input.endsWith(QLatin1Char('.'))) // no dot at the end (but allowed in the middle)
+            return Intermediate;
+
+        if (input.endsWith(QLatin1Char('/'))) // no slash at the end (but allowed in the middle)
+            return Intermediate;
+
+        // is a valid branch name
+        return Acceptable;
+    }
+
+private:
+    const QRegExp m_invalidChars;
+};
+
+
 BranchAddDialog::BranchAddDialog(QWidget *parent) :
     QDialog(parent),
     m_ui(new Ui::BranchAddDialog)
 {
     m_ui->setupUi(this);
+    m_ui->branchNameEdit->setValidator(new BranchNameValidator(this));
+    connect(m_ui->branchNameEdit, SIGNAL(textChanged(QString)), this, SLOT(updateButtonStatus()));
 }
 
 BranchAddDialog::~BranchAddDialog()
@@ -72,5 +136,11 @@ bool BranchAddDialog::track()
     return m_ui->trackingCheckBox->isChecked();
 }
 
+/*! Updates the ok button enabled state of the dialog according to the validity of the branch name. */
+void BranchAddDialog::updateButtonStatus()
+{
+    m_ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(m_ui->branchNameEdit->hasAcceptableInput());
+}
+
 } // namespace Internal
 } // namespace Git
diff --git a/src/plugins/git/branchadddialog.h b/src/plugins/git/branchadddialog.h
index 77bd9b87041d1cbfbc8c3ea14bfd071493aca936..ed8055a4736bda7f7fbb51f660a87804e3e010f8 100644
--- a/src/plugins/git/branchadddialog.h
+++ b/src/plugins/git/branchadddialog.h
@@ -55,6 +55,9 @@ public:
 
     bool track();
 
+private slots:
+    void updateButtonStatus();
+
 private:
     Ui::BranchAddDialog *m_ui;
 };