diff --git a/src/plugins/bazaar/bazaarclient.h b/src/plugins/bazaar/bazaarclient.h
index 913f34154098a59f36c4ee613b5c0c65f3e13553..42005bd1662217e830725e99082f018d9884e8db 100644
--- a/src/plugins/bazaar/bazaarclient.h
+++ b/src/plugins/bazaar/bazaarclient.h
@@ -38,6 +38,7 @@ namespace Bazaar {
 namespace Internal {
 
 class BazaarSettings;
+class BazaarControl;
 
 class BazaarClient : public VcsBase::VcsBaseClient
 {
@@ -70,6 +71,7 @@ protected:
 
 private:
     friend class CloneWizard;
+    friend class BazaarControl;
 };
 
 } // namespace Internal
diff --git a/src/plugins/bazaar/bazaarcontrol.cpp b/src/plugins/bazaar/bazaarcontrol.cpp
index e9a9be117dcde42f93e51cf0394d165b401aa632..5827a9cd603818b08260f408db629e46e58e34c1 100644
--- a/src/plugins/bazaar/bazaarcontrol.cpp
+++ b/src/plugins/bazaar/bazaarcontrol.cpp
@@ -29,8 +29,11 @@
 ****************************************************************************/
 #include "bazaarcontrol.h"
 #include "bazaarclient.h"
+#include "bazaarplugin.h"
 
+#include <vcsbase/vcsbaseclientsettings.h>
 #include <vcsbase/vcsbaseconstants.h>
+#include <vcsbase/vcscommand.h>
 
 #include <utils/fileutils.h>
 
@@ -88,6 +91,7 @@ bool BazaarControl::supportsOperation(Operation operation) const
     case Core::IVersionControl::MoveOperation:
     case Core::IVersionControl::CreateRepositoryOperation:
     case Core::IVersionControl::AnnotateOperation:
+    case Core::IVersionControl::InitialCheckoutOperation:
         break;
     case Core::IVersionControl::SnapshotOperations:
         supported = false;
@@ -135,6 +139,21 @@ bool BazaarControl::vcsAnnotate(const QString &file, int line)
     return true;
 }
 
+Core::ShellCommand *BazaarControl::createInitialCheckoutCommand(const QString &url,
+                                                                const Utils::FileName &baseDirectory,
+                                                                const QString &localName,
+                                                                const QStringList &extraArgs)
+{
+    QStringList args;
+    args << m_bazaarClient->vcsCommandString(BazaarClient::CloneCommand)
+         << extraArgs << url << localName;
+
+    auto command = new VcsBase::VcsCommand(baseDirectory.toString(),
+                                           m_bazaarClient->processEnvironment());
+    command->addJob(m_bazaarClient->vcsBinary(), args, -1);
+    return command;
+}
+
 void BazaarControl::changed(const QVariant &v)
 {
     switch (v.type()) {
diff --git a/src/plugins/bazaar/bazaarcontrol.h b/src/plugins/bazaar/bazaarcontrol.h
index bd74926d419f5f85eb4a9189bb9d11b1993e8b1c..f55ad73ca3970bab55e3169c5d39c4ed08aa898a 100644
--- a/src/plugins/bazaar/bazaarcontrol.h
+++ b/src/plugins/bazaar/bazaarcontrol.h
@@ -64,6 +64,11 @@ public:
     bool vcsCreateRepository(const QString &directory) override;
     bool vcsAnnotate(const QString &file, int line) override;
 
+    Core::ShellCommand *createInitialCheckoutCommand(const QString &url,
+                                                     const Utils::FileName &baseDirectory,
+                                                     const QString &localName,
+                                                     const QStringList &extraArgs) override;
+
 public slots:
     // To be connected to the VCSTask's success signal to emit the repository/
     // files changed signals according to the variant's type:
diff --git a/src/plugins/clearcase/clearcasecontrol.cpp b/src/plugins/clearcase/clearcasecontrol.cpp
index 686f782a92dd69a55e04faeea49f76c6008ecd10..472d79a81b747625579be2fcaad23c8ccfc27dee 100644
--- a/src/plugins/clearcase/clearcasecontrol.cpp
+++ b/src/plugins/clearcase/clearcasecontrol.cpp
@@ -80,6 +80,7 @@ bool ClearCaseControl::supportsOperation(Operation operation) const
         break;
     case CreateRepositoryOperation:
     case SnapshotOperations:
+    case Core::IVersionControl::InitialCheckoutOperation:
         rc = false;
         break;
     }
diff --git a/src/plugins/coreplugin/iversioncontrol.cpp b/src/plugins/coreplugin/iversioncontrol.cpp
index f9cbf4a90d1a69d8274a9c189fe435ee98f2fffa..d7af51eabbd13dc0ae58b7489fb4241c7e9ccfe7 100644
--- a/src/plugins/coreplugin/iversioncontrol.cpp
+++ b/src/plugins/coreplugin/iversioncontrol.cpp
@@ -83,6 +83,18 @@ QStringList IVersionControl::additionalToolsPath() const
     return QStringList();
 }
 
+ShellCommand *IVersionControl::createInitialCheckoutCommand(const QString &url,
+                                                            const Utils::FileName &baseDirectory,
+                                                            const QString &localName,
+                                                            const QStringList &extraArgs)
+{
+    Q_UNUSED(url);
+    Q_UNUSED(baseDirectory);
+    Q_UNUSED(localName);
+    Q_UNUSED(extraArgs);
+    return 0;
+}
+
 QString IVersionControl::vcsTopic(const QString &topLevel)
 {
     return m_topicCache ? m_topicCache->topic(topLevel) : QString();
diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h
index f9a9d2b76e3f1eb88465f5a09d3068e97aa9759c..04c733cefd19deba7b4bfc6125b361e0fc0acee7 100644
--- a/src/plugins/coreplugin/iversioncontrol.h
+++ b/src/plugins/coreplugin/iversioncontrol.h
@@ -34,6 +34,8 @@
 #include "core_global.h"
 #include "id.h"
 
+#include <utils/fileutils.h>
+
 #include <QDateTime>
 #include <QFlags>
 #include <QHash>
@@ -42,6 +44,8 @@
 
 namespace Core {
 
+class ShellCommand;
+
 class CORE_EXPORT IVersionControl : public QObject
 {
     Q_OBJECT
@@ -56,7 +60,8 @@ public:
         AddOperation, DeleteOperation, MoveOperation,
         CreateRepositoryOperation,
         SnapshotOperations,
-        AnnotateOperation
+        AnnotateOperation,
+        InitialCheckoutOperation
     };
 
     enum OpenSupportMode {
@@ -194,6 +199,17 @@ public:
      */
     virtual QStringList additionalToolsPath() const;
 
+    /*!
+     * Return a ShellCommand capable of checking out \a url into \a baseDirectory, where
+     * a new subdirectory with \a localName will be created.
+     *
+     * \a extraArgs are passed on to the command being run.
+     */
+    virtual ShellCommand *createInitialCheckoutCommand(const QString &url,
+                                                       const Utils::FileName &baseDirectory,
+                                                       const QString &localName,
+                                                       const QStringList &extraArgs);
+
 signals:
     void repositoryChanged(const QString &repository);
     void filesChanged(const QStringList &files);
diff --git a/src/plugins/cvs/cvscontrol.cpp b/src/plugins/cvs/cvscontrol.cpp
index ceb1eeca664b7f078312f66aca81784a77a4ff55..82e09bc38aa1ab3fe2e1d61fa267ad1e7562cc51 100644
--- a/src/plugins/cvs/cvscontrol.cpp
+++ b/src/plugins/cvs/cvscontrol.cpp
@@ -35,8 +35,10 @@
 #include "cvssettings.h"
 
 #include <vcsbase/vcsbaseconstants.h>
+#include <vcsbase/vcscommand.h>
 
 #include <utils/fileutils.h>
+#include <utils/qtcassert.h>
 
 #include <QFileInfo>
 
@@ -74,6 +76,7 @@ bool CvsControl::supportsOperation(Operation operation) const
     case AddOperation:
     case DeleteOperation:
     case AnnotateOperation:
+    case InitialCheckoutOperation:
         break;
     case MoveOperation:
     case CreateRepositoryOperation:
@@ -132,6 +135,24 @@ QString CvsControl::vcsOpenText() const
     return tr("&Edit");
 }
 
+Core::ShellCommand *CvsControl::createInitialCheckoutCommand(const QString &url,
+                                                             const Utils::FileName &baseDirectory,
+                                                             const QString &localName,
+                                                             const QStringList &extraArgs)
+{
+    QTC_ASSERT(localName == url, return 0);
+
+    const CvsSettings settings = CvsPlugin::instance()->client()->settings();
+
+    QStringList args;
+    args << QLatin1String("checkout") << url << extraArgs;
+
+    auto command = new VcsBase::VcsCommand(baseDirectory.toString(),
+                                           QProcessEnvironment::systemEnvironment());
+    command->addJob(m_plugin->client()->vcsBinary(), settings.addOptions(args), -1);
+    return command;
+}
+
 bool CvsControl::managesDirectory(const QString &directory, QString *topLevel) const
 {
     return m_plugin->managesDirectory(directory, topLevel);
diff --git a/src/plugins/cvs/cvscontrol.h b/src/plugins/cvs/cvscontrol.h
index 7d2425aaadf51119d6f86cc7e90be782b2ca3d8a..ec18756877ad71196fb0bb3381b90d65b3d93e36 100644
--- a/src/plugins/cvs/cvscontrol.h
+++ b/src/plugins/cvs/cvscontrol.h
@@ -63,6 +63,11 @@ public:
 
     QString vcsOpenText() const override;
 
+    Core::ShellCommand *createInitialCheckoutCommand(const QString &url,
+                                                     const Utils::FileName &baseDirectory,
+                                                     const QString &localName,
+                                                     const QStringList &extraArgs) override;
+
     void emitRepositoryChanged(const QString &s);
     void emitFilesChanged(const QStringList &l);
 
diff --git a/src/plugins/git/gitversioncontrol.cpp b/src/plugins/git/gitversioncontrol.cpp
index ba9ec5589e22cda6e697c9ab0b4ef73b0831a2ba..bb5f7024e9c7aac11ba79ab972f608b96384dd34 100644
--- a/src/plugins/git/gitversioncontrol.cpp
+++ b/src/plugins/git/gitversioncontrol.cpp
@@ -33,8 +33,10 @@
 #include "gitutils.h"
 
 #include <vcsbase/vcsbaseconstants.h>
+#include <vcsbase/vcscommand.h>
 
 #include <QFileInfo>
+#include <QProcessEnvironment>
 
 namespace Git {
 namespace Internal {
@@ -44,8 +46,7 @@ class GitTopicCache : public Core::IVersionControl::TopicCache
 public:
     GitTopicCache(GitClient *client) :
         m_client(client)
-    {
-    }
+    { }
 
 protected:
     QString trackFile(const QString &repository) override
@@ -66,8 +67,7 @@ private:
 GitVersionControl::GitVersionControl(GitClient *client) :
     Core::IVersionControl(new GitTopicCache(client)),
     m_client(client)
-{
-}
+{ }
 
 QString GitVersionControl::displayName() const
 {
@@ -96,6 +96,7 @@ bool GitVersionControl::supportsOperation(Operation operation) const
     case CreateRepositoryOperation:
     case SnapshotOperations:
     case AnnotateOperation:
+    case InitialCheckoutOperation:
         return true;
     }
     return false;
@@ -139,6 +140,19 @@ QString GitVersionControl::vcsTopic(const QString &directory)
     return topic;
 }
 
+Core::ShellCommand *GitVersionControl::createInitialCheckoutCommand(const QString &url,
+                                                                    const Utils::FileName &baseDirectory,
+                                                                    const QString &localName,
+                                                                    const QStringList &extraArgs)
+{
+    QStringList args;
+    args << QLatin1String("clone") << extraArgs << url << localName;
+
+    auto command = new VcsBase::VcsCommand(baseDirectory.toString(), m_client->processEnvironment());
+    command->addJob(m_client->vcsBinary(), args, -1);
+    return command;
+}
+
 QStringList GitVersionControl::additionalToolsPath() const
 {
     QStringList res = m_client->settings().searchPathList();
diff --git a/src/plugins/git/gitversioncontrol.h b/src/plugins/git/gitversioncontrol.h
index 2e528ab48736240d15fae84bb149c9295c5d997e..71dedb09ee3cf59f79f8050c34b9391dd37683b0 100644
--- a/src/plugins/git/gitversioncontrol.h
+++ b/src/plugins/git/gitversioncontrol.h
@@ -62,6 +62,11 @@ public:
     bool vcsAnnotate(const QString &file, int line) override;
     QString vcsTopic(const QString &directory) override;
 
+    Core::ShellCommand *createInitialCheckoutCommand(const QString &url,
+                                                     const Utils::FileName &baseDirectory,
+                                                     const QString &localName,
+                                                     const QStringList &extraArgs) override;
+
     QStringList additionalToolsPath() const override;
 
     void emitFilesChanged(const QStringList &);
diff --git a/src/plugins/mercurial/mercurialcontrol.cpp b/src/plugins/mercurial/mercurialcontrol.cpp
index 6f5ad95fb16ead5b271089353bdc595354e04930..827355601ffe0f02a0d0b2659a62a06a49deabd3 100644
--- a/src/plugins/mercurial/mercurialcontrol.cpp
+++ b/src/plugins/mercurial/mercurialcontrol.cpp
@@ -33,12 +33,14 @@
 
 #include <vcsbase/vcsbaseclientsettings.h>
 #include <vcsbase/vcsbaseconstants.h>
+#include <vcsbase/vcscommand.h>
 
 #include <coreplugin/vcsmanager.h>
 
 #include <utils/fileutils.h>
 
 #include <QFileInfo>
+#include <QProcessEnvironment>
 #include <QVariant>
 #include <QStringList>
 #include <QDir>
@@ -114,6 +116,7 @@ bool MercurialControl::supportsOperation(Operation operation) const
     case Core::IVersionControl::MoveOperation:
     case Core::IVersionControl::CreateRepositoryOperation:
     case Core::IVersionControl::AnnotateOperation:
+    case Core::IVersionControl::InitialCheckoutOperation:
         break;
     case Core::IVersionControl::SnapshotOperations:
         supported = false;
@@ -161,6 +164,19 @@ bool MercurialControl::vcsAnnotate(const QString &file, int line)
     return true;
 }
 
+Core::ShellCommand *MercurialControl::createInitialCheckoutCommand(const QString &url,
+                                                                   const Utils::FileName &baseDirectory,
+                                                                   const QString &localName,
+                                                                   const QStringList &extraArgs)
+{
+    QStringList args;
+    args << QLatin1String("clone") << extraArgs << url << localName;
+    auto command = new VcsBase::VcsCommand(baseDirectory.toString(),
+                                           mercurialClient->processEnvironment());
+    command->addJob(mercurialClient->vcsBinary(), args, -1);
+    return command;
+}
+
 bool MercurialControl::sccManaged(const QString &filename)
 {
     const QFileInfo fi(filename);
diff --git a/src/plugins/mercurial/mercurialcontrol.h b/src/plugins/mercurial/mercurialcontrol.h
index 6807e57abab2b5c80076c209278e7e166b75d0ae..30b33c8de3aa1aca6fc1085ac04ffd9413a473b0 100644
--- a/src/plugins/mercurial/mercurialcontrol.h
+++ b/src/plugins/mercurial/mercurialcontrol.h
@@ -64,6 +64,11 @@ public:
     bool vcsCreateRepository(const QString &directory) override;
     bool vcsAnnotate(const QString &file, int line) override;
 
+    Core::ShellCommand *createInitialCheckoutCommand(const QString &url,
+                                                     const Utils::FileName &baseDirectory,
+                                                     const QString &localName,
+                                                     const QStringList &extraArgs) override;
+
     bool sccManaged(const QString &filename);
 
 public slots:
diff --git a/src/plugins/perforce/perforceversioncontrol.cpp b/src/plugins/perforce/perforceversioncontrol.cpp
index 8ae4b02c0697d0a28e954f9c4af6691e5f4a886a..5e7cb29bb054df32e7a906a43022f3b8afd05f70 100644
--- a/src/plugins/perforce/perforceversioncontrol.cpp
+++ b/src/plugins/perforce/perforceversioncontrol.cpp
@@ -76,6 +76,7 @@ bool PerforceVersionControl::supportsOperation(Operation operation) const
         return supported;
     case CreateRepositoryOperation:
     case SnapshotOperations:
+    case InitialCheckoutOperation:
         break;
     }
     return false;
diff --git a/src/plugins/subversion/subversioncontrol.cpp b/src/plugins/subversion/subversioncontrol.cpp
index a6fe4d48d49ba79be20fc59ac570fb41e9f0371a..90175620215d45f0314a40e0e6b11f2454993cdc 100644
--- a/src/plugins/subversion/subversioncontrol.cpp
+++ b/src/plugins/subversion/subversioncontrol.cpp
@@ -31,10 +31,12 @@
 #include "subversioncontrol.h"
 
 #include "subversionclient.h"
+#include "subversionconstants.h"
 #include "subversionplugin.h"
 #include "subversionsettings.h"
 
 #include <vcsbase/vcsbaseconstants.h>
+#include <vcsbase/vcsbaseclientsettings.h>
 
 #include <utils/fileutils.h>
 
@@ -97,6 +99,7 @@ bool SubversionControl::supportsOperation(Operation operation) const
     case DeleteOperation:
     case MoveOperation:
     case AnnotateOperation:
+    case InitialCheckoutOperation:
         break;
     case CreateRepositoryOperation:
     case SnapshotOperations:
@@ -153,6 +156,24 @@ bool SubversionControl::vcsAnnotate(const QString &file, int line)
     return true;
 }
 
+Core::ShellCommand *SubversionControl::createInitialCheckoutCommand(const QString &url,
+                                                                    const Utils::FileName &baseDirectory,
+                                                                    const QString &localName,
+                                                                    const QStringList &extraArgs)
+{
+    SubversionClient *client = m_plugin->client();
+
+    QStringList args;
+    args << QLatin1String("checkout");
+    args << SubversionClient::addAuthenticationOptions(client->settings());
+    args << QLatin1String(Subversion::Constants::NON_INTERACTIVE_OPTION);
+    args << extraArgs << url << localName;
+
+    auto command = new VcsBase::VcsCommand(baseDirectory.toString(), client->processEnvironment());
+    command->addJob(client->vcsBinary(), args, -1);
+    return command;
+}
+
 void SubversionControl::emitRepositoryChanged(const QString &s)
 {
     emit repositoryChanged(s);
diff --git a/src/plugins/subversion/subversioncontrol.h b/src/plugins/subversion/subversioncontrol.h
index 62d2ee902f628e50971aeabb2c8873d09ab8285b..f05185ac1ed216abdf67b7d1c7b0839599292025 100644
--- a/src/plugins/subversion/subversioncontrol.h
+++ b/src/plugins/subversion/subversioncontrol.h
@@ -60,6 +60,11 @@ public:
 
     bool vcsAnnotate(const QString &file, int line) override;
 
+    Core::ShellCommand *createInitialCheckoutCommand(const QString &url,
+                                                     const Utils::FileName &baseDirectory,
+                                                     const QString &localName,
+                                                     const QStringList &extraArgs) override;
+
     void emitRepositoryChanged(const QString &);
     void emitFilesChanged(const QStringList &);