diff --git a/src/plugins/git/branchadddialog.cpp b/src/plugins/git/branchadddialog.cpp
index bcb16b392556ca0182f2936b37a692d406b6c56b..1beab9c93b2ab3fedcd0e29c1f6ca2c4b9ad315b 100644
--- a/src/plugins/git/branchadddialog.cpp
+++ b/src/plugins/git/branchadddialog.cpp
@@ -95,11 +95,12 @@ private:
 };
 
 
-BranchAddDialog::BranchAddDialog(QWidget *parent) :
+BranchAddDialog::BranchAddDialog(QWidget *parent, bool addBranch) :
     QDialog(parent),
     m_ui(new Ui::BranchAddDialog)
 {
     m_ui->setupUi(this);
+    setWindowTitle(addBranch ? tr("Add Branch") : tr("Rename Branch"));
     m_ui->branchNameEdit->setValidator(new BranchNameValidator(this));
     connect(m_ui->branchNameEdit, SIGNAL(textChanged(QString)), this, SLOT(updateButtonStatus()));
 }
diff --git a/src/plugins/git/branchadddialog.h b/src/plugins/git/branchadddialog.h
index ef1088795ed73a69be3366ff63c0183f0e7287ab..7c50d80c2a41b924c4cf41372d5c0c465e20aecd 100644
--- a/src/plugins/git/branchadddialog.h
+++ b/src/plugins/git/branchadddialog.h
@@ -45,7 +45,7 @@ class BranchAddDialog : public QDialog
     Q_OBJECT
 
 public:
-    explicit BranchAddDialog(QWidget *parent = 0);
+    explicit BranchAddDialog(QWidget *parent = 0, bool addBranch = true);
     ~BranchAddDialog();
 
     void setBranchName(const QString &);
diff --git a/src/plugins/git/branchadddialog.ui b/src/plugins/git/branchadddialog.ui
index b891a7d4efe00a6fffb96bf52f930fbf02e8a04f..d319d79afba6fc773e0a509e1a4d144f24e1d350 100644
--- a/src/plugins/git/branchadddialog.ui
+++ b/src/plugins/git/branchadddialog.ui
@@ -11,7 +11,7 @@
    </rect>
   </property>
   <property name="windowTitle">
-   <string>Add Branch</string>
+   <string/>
   </property>
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
diff --git a/src/plugins/git/branchdialog.cpp b/src/plugins/git/branchdialog.cpp
index e902223734e8297a43c8b83f459cd8aead546d0c..99d315dd0035f143ba9abdcd69bed126c4d7cd54 100644
--- a/src/plugins/git/branchdialog.cpp
+++ b/src/plugins/git/branchdialog.cpp
@@ -64,6 +64,7 @@ BranchDialog::BranchDialog(QWidget *parent) :
     connect(m_ui->addButton, SIGNAL(clicked()), this, SLOT(add()));
     connect(m_ui->checkoutButton, SIGNAL(clicked()), this, SLOT(checkout()));
     connect(m_ui->removeButton, SIGNAL(clicked()), this, SLOT(remove()));
+    connect(m_ui->renameButton, SIGNAL(clicked()), this, SLOT(rename()));
     connect(m_ui->diffButton, SIGNAL(clicked()), this, SLOT(diff()));
     connect(m_ui->logButton, SIGNAL(clicked()), this, SLOT(log()));
     connect(m_ui->mergeButton, SIGNAL(clicked()), this, SLOT(merge()));
@@ -106,6 +107,7 @@ void BranchDialog::enableButtons()
     const bool currentLocal = m_model->isLocal(m_model->currentBranch());
 
     m_ui->removeButton->setEnabled(hasSelection && !currentSelected && isLocal && isLeaf);
+    m_ui->renameButton->setEnabled(hasSelection && isLocal && isLeaf);
     m_ui->logButton->setEnabled(hasSelection && isLeaf);
     m_ui->diffButton->setEnabled(hasSelection && isLeaf);
     m_ui->checkoutButton->setEnabled(hasSelection && !currentSelected && isLeaf);
@@ -230,6 +232,36 @@ void BranchDialog::remove()
         m_model->removeBranch(selected);
 }
 
+void BranchDialog::rename()
+{
+    QModelIndex selected = selectedIndex();
+    QTC_CHECK(selected != m_model->currentBranch()); // otherwise the button would not be enabled!
+    QTC_CHECK(m_model->isLocal(selected));           // otherwise the button would not be enabled!
+
+    QString oldBranchName = m_model->branchName(selected);
+    QStringList localNames = m_model->localBranchNames();
+
+    QPointer<BranchAddDialog> branchAddDialog = new BranchAddDialog(this, false);
+    branchAddDialog->setBranchName(oldBranchName);
+    branchAddDialog->setTrackedBranchName(QString(), false);
+
+    branchAddDialog->exec();
+
+    if (!branchAddDialog.isNull() && branchAddDialog->result() == QDialog::Accepted && m_model) {
+        if (branchAddDialog->branchName() == oldBranchName)
+            return;
+        if (localNames.contains(branchAddDialog->branchName())) {
+            QMessageBox::critical(this, tr("Branch exists"),
+                                  tr("Local Branch \'%1\' already exists.")
+                                  .arg(branchAddDialog->branchName()));
+            return;
+        }
+        m_model->renameBranch(oldBranchName, branchAddDialog->branchName());
+        refresh();
+    }
+    enableButtons();
+}
+
 void BranchDialog::diff()
 {
     QString branchName = m_model->branchName(selectedIndex());
diff --git a/src/plugins/git/branchdialog.h b/src/plugins/git/branchdialog.h
index 0725d00dfc5fd4366377cacf1807163979606f10..34afa8aa559632f2b3cf8a38e0942e1d10dec188 100644
--- a/src/plugins/git/branchdialog.h
+++ b/src/plugins/git/branchdialog.h
@@ -68,6 +68,7 @@ private slots:
     void add();
     void checkout();
     void remove();
+    void rename();
     void diff();
     void log();
     void merge();
diff --git a/src/plugins/git/branchdialog.ui b/src/plugins/git/branchdialog.ui
index 5c9f1fd462fcc3e09ad37c6dc6dfebfd43b042cf..e23889a3424deeda5bcdfcd78367c831fcadb2b8 100644
--- a/src/plugins/git/branchdialog.ui
+++ b/src/plugins/git/branchdialog.ui
@@ -95,6 +95,13 @@
             </property>
            </widget>
           </item>
+          <item>
+           <widget class="QPushButton" name="renameButton">
+            <property name="text">
+             <string>Re&amp;name</string>
+            </property>
+           </widget>
+          </item>
           <item>
            <widget class="QPushButton" name="checkoutButton">
             <property name="text">