diff --git a/src/plugins/git/gitgrep.cpp b/src/plugins/git/gitgrep.cpp
index 3f0729e9f5496d11dd3af5bcc0dfefef023f65d4..f0fd31eb34a09b95cc56d8f4bbe30f7eeb211dc0 100644
--- a/src/plugins/git/gitgrep.cpp
+++ b/src/plugins/git/gitgrep.cpp
@@ -29,20 +29,21 @@
 
 #include <coreplugin/vcsmanager.h>
 #include <texteditor/findinfiles.h>
+#include <vcsbase/vcscommand.h>
 #include <vcsbase/vcsbaseconstants.h>
 
 #include <utils/filesearch.h>
 #include <utils/fileutils.h>
 #include <utils/qtcassert.h>
-#include <utils/qtcprocess.h>
 #include <utils/runextensions.h>
+#include <utils/synchronousprocess.h>
 
 #include <QCheckBox>
-#include <QCoreApplication>
-#include <QEventLoop>
 #include <QFuture>
 #include <QFutureWatcher>
+#include <QScopedPointer>
 #include <QSettings>
+#include <QTextStream>
 
 using namespace Utils;
 
@@ -50,6 +51,7 @@ namespace Git {
 namespace Internal {
 
 using namespace Core;
+using VcsBase::VcsCommand;
 
 namespace {
 
@@ -68,33 +70,33 @@ public:
         m_directory = parameters.additionalParameters.toString();
     }
 
-    void processLine(const QByteArray &line, FileSearchResultList *resultList) const
+    void processLine(const QString &line, FileSearchResultList *resultList) const
     {
         if (line.isEmpty())
             return;
-        static const char boldRed[] = "\x1b[1;31m";
-        static const char resetColor[] = "\x1b[m";
+        static const QLatin1String boldRed("\x1b[1;31m");
+        static const QLatin1String resetColor("\x1b[m");
         FileSearchResult single;
-        const int lineSeparator = line.indexOf('\0');
+        const int lineSeparator = line.indexOf(QChar::Null);
         single.fileName = m_directory + QLatin1Char('/')
-                + QString::fromLocal8Bit(line.left(lineSeparator));
-        const int textSeparator = line.indexOf('\0', lineSeparator + 1);
+                + line.left(lineSeparator);
+        const int textSeparator = line.indexOf(QChar::Null, lineSeparator + 1);
         single.lineNumber = line.mid(lineSeparator + 1, textSeparator - lineSeparator - 1).toInt();
-        QByteArray text = line.mid(textSeparator + 1);
+        QString text = line.mid(textSeparator + 1);
         QVector<QPair<int, int>> matches;
         for (;;) {
             const int matchStart = text.indexOf(boldRed);
             if (matchStart == -1)
                 break;
-            const int matchTextStart = matchStart + int(sizeof(boldRed)) - 1;
+            const int matchTextStart = matchStart + boldRed.size();
             const int matchEnd = text.indexOf(resetColor, matchTextStart);
             QTC_ASSERT(matchEnd != -1, break);
             const int matchLength = matchEnd - matchTextStart;
             matches.append(qMakePair(matchStart, matchLength));
             text = text.left(matchStart) + text.mid(matchTextStart, matchLength)
-                    + text.mid(matchEnd + int(sizeof(resetColor)) - 1);
+                    + text.mid(matchEnd + resetColor.size());
         }
-        single.matchingLine = QString::fromLocal8Bit(text);
+        single.matchingLine = text;
         foreach (auto match, matches) {
             single.matchStart = match.first;
             single.matchLength = match.second;
@@ -102,11 +104,13 @@ public:
         }
     }
 
-    void read()
+    void read(const QString &text)
     {
         FileSearchResultList resultList;
-        while (m_process.canReadLine() && !m_fi.isCanceled())
-            processLine(m_process.readLine().trimmed(), &resultList);
+        QString t = text;
+        QTextStream stream(&t);
+        while (!stream.atEnd() && !m_fi.isCanceled())
+            processLine(stream.readLine(), &resultList);
         if (!resultList.isEmpty())
             m_fi.reportResult(resultList);
     }
@@ -130,27 +134,18 @@ public:
             arguments << QLatin1String("-F");
         arguments << m_parameters.text;
         arguments << QLatin1String("--") << m_parameters.nameFilters;
-        QString args;
-        m_process.addArgs(&args, arguments);
-        m_process.setWorkingDirectory(m_directory);
-        m_process.setCommand(GitPlugin::instance()->client()->vcsBinary().toString(), args);
+        GitClient *client = GitPlugin::instance()->client();
+        QScopedPointer<VcsCommand> command(client->createCommand(m_directory));
+        command->addFlags(VcsCommand::SilentOutput);
+        command->setProgressiveOutput(true);
         QFutureWatcher<FileSearchResultList> watcher;
         watcher.setFuture(m_fi.future());
         connect(&watcher, &QFutureWatcher<FileSearchResultList>::canceled,
-                &m_process, &QtcProcess::kill);
-        connect(&m_process, &QProcess::readyRead,
-                this, &GitGrepRunner::read);
-        m_process.start();
-        if (!m_process.waitForStarted())
-            return;
-        QEventLoop eventLoop;
-        connect(&m_process, static_cast<void(QProcess::*)(int)>(&QProcess::finished),
-                this, [this, &eventLoop]() {
-            read();
-            eventLoop.quit();
-        });
-        eventLoop.exec();
-        m_fi.setProgressValue(1);
+                command.data(), &VcsCommand::cancel);
+        connect(command.data(), &VcsCommand::stdOutText, this, &GitGrepRunner::read);
+        SynchronousProcessResponse resp = command->runCommand(client->vcsBinary(), arguments, 0);
+        if (resp.result != SynchronousProcessResponse::Finished)
+            m_fi.reportCanceled();
     }
 
     static void run(QFutureInterface<FileSearchResultList> &fi,
@@ -161,7 +156,6 @@ public:
     }
 
 private:
-    QtcProcess m_process;
     FutureInterfaceType m_fi;
     QString m_directory;
     const TextEditor::FileFindParameters &m_parameters;