diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index f81480bd3a7306462a65fda9c41078c91cea8c76..8328e79b6c11c3ec3d23848f790de538ef3c67c4 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -1679,6 +1679,16 @@ void GitClient::revert(const QStringList &files, bool revertStaging)
     }
 }
 
+bool GitClient::synchronousFetch(const QString &workingDirectory)
+{
+    QStringList arguments(QLatin1String("fetch"));
+    // Disable UNIX terminals to suppress SSH prompting.
+    const unsigned flags = VCSBase::VCSBasePlugin::SshPasswordPrompt|VCSBase::VCSBasePlugin::ShowStdOutInLogWindow
+                           |VCSBase::VCSBasePlugin::ShowSuccessMessage;
+    const Utils::SynchronousProcessResponse resp = synchronousGit(workingDirectory, arguments, flags);
+    return resp.result == Utils::SynchronousProcessResponse::Finished;
+}
+
 bool GitClient::synchronousPull(const QString &workingDirectory)
 {
     return synchronousPull(workingDirectory, m_settings.pullRebase);
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index dbf0ea58a9dd644cf9c9b9c155defaf6bbb5dd7e..f5d1c74995448e0bb13d22df5d884a85cd042efa 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -158,6 +158,7 @@ public:
     unsigned gitVersion(bool silent, QString *errorMessage = 0);
     QString gitVersionString(bool silent, QString *errorMessage = 0);
 
+    bool synchronousFetch(const QString &workingDirectory);
     bool synchronousPull(const QString &workingDirectory);
     bool synchronousPush(const QString &workingDirectory);
 
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index 404869ce6dde1000ab4f233bc7a7aceaa7c2e55a..e549e6d48328a43f0f3e44228d7e031043e0f62f 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -437,6 +437,10 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage)
                                            globalcontext, true, SLOT(stash()));
     actionCommand.first->setToolTip(tr("Saves the current state of your work and resets the repository."));
 
+    createRepositoryAction(actionManager, gitContainer,
+                           tr("Fetch"), QLatin1String("Git.Fetch"),
+                           globalcontext, true, SLOT(fetch()));
+
     createRepositoryAction(actionManager, gitContainer,
                            tr("Pull"), QLatin1String("Git.Pull"),
                            globalcontext, true, SLOT(pull()));
@@ -760,6 +764,11 @@ bool GitPlugin::submitEditorAboutToClose(VCSBase::VCSBaseSubmitEditor *submitEdi
     return closeEditor;
 }
 
+void GitPlugin::fetch()
+{
+    m_gitClient->synchronousFetch(currentState().topLevel());
+}
+
 void GitPlugin::pull()
 {
     const VCSBase::VCSBasePluginState state = currentState();
diff --git a/src/plugins/git/gitplugin.h b/src/plugins/git/gitplugin.h
index cec2821bd724c2f783501749935ca901161f87ce..c35488361266032413bd550eb2c57d6a40b87292 100644
--- a/src/plugins/git/gitplugin.h
+++ b/src/plugins/git/gitplugin.h
@@ -127,6 +127,7 @@ private slots:
     void stashSnapshot();
     void branchList();
     void stashList();
+    void fetch();
     void pull();
     void push();