diff --git a/src/plugins/bazaar/bazaarclient.cpp b/src/plugins/bazaar/bazaarclient.cpp
index 431ff8c6a50ad93d5e1829f695ba6b60eada0f83..5df1804457b12923e3b83e3169ea8fe02e1e3cb0 100644
--- a/src/plugins/bazaar/bazaarclient.cpp
+++ b/src/plugins/bazaar/bazaarclient.cpp
@@ -128,6 +128,16 @@ QString BazaarClient::findTopLevelForFile(const QFileInfo &file) const
                                                                    repositoryCheckFile);
 }
 
+bool BazaarClient::managesFile(const QString &workingDirectory, const QString &fileName) const
+{
+    QStringList args(QLatin1String("status"));
+    args << fileName;
+    QByteArray stdOut;
+    if (!vcsFullySynchronousExec(workingDirectory, args, &stdOut))
+        return false;
+    return !stdOut.startsWith("unknown");
+}
+
 void BazaarClient::view(const QString &source, const QString &id, const QStringList &extraOptions)
 {
     QStringList args(QLatin1String("log"));
diff --git a/src/plugins/bazaar/bazaarclient.h b/src/plugins/bazaar/bazaarclient.h
index d0b1f4a216f04ec5870e36c2bfceef434829b875..3dc756ef586546553467da92b5ec1f055e9ed6aa 100644
--- a/src/plugins/bazaar/bazaarclient.h
+++ b/src/plugins/bazaar/bazaarclient.h
@@ -57,6 +57,7 @@ public:
     void view(const QString &source, const QString &id,
               const QStringList &extraOptions = QStringList());
     QString findTopLevelForFile(const QFileInfo &file) const;
+    bool managesFile(const QString &workingDirectory, const QString &fileName) const;
 
 protected:
     Core::Id vcsEditorKind(VcsCommand cmd) const;
diff --git a/src/plugins/bazaar/bazaarcontrol.cpp b/src/plugins/bazaar/bazaarcontrol.cpp
index bf480761a0a04524fef219155930fdbabd45bde2..5d27b46f63faaf34e9ede300633c877d11af5d35 100644
--- a/src/plugins/bazaar/bazaarcontrol.cpp
+++ b/src/plugins/bazaar/bazaarcontrol.cpp
@@ -61,6 +61,11 @@ bool BazaarControl::managesDirectory(const QString &directory, QString *topLevel
     return !topLevelFound.isEmpty();
 }
 
+bool BazaarControl::managesFile(const QString &workingDirectory, const QString &fileName) const
+{
+    return m_bazaarClient->managesFile(workingDirectory, fileName);
+}
+
 bool BazaarControl::isConfigured() const
 {
     const QString binary = m_bazaarClient->settings()->binaryPath();
diff --git a/src/plugins/bazaar/bazaarcontrol.h b/src/plugins/bazaar/bazaarcontrol.h
index 673b70a5240c339fde1d4ce75b30483e2c67ac3b..94e57aebddac3d6e483433122818593fb9d98678 100644
--- a/src/plugins/bazaar/bazaarcontrol.h
+++ b/src/plugins/bazaar/bazaarcontrol.h
@@ -53,6 +53,7 @@ public:
     Core::Id id() const;
 
     bool managesDirectory(const QString &filename, QString *topLevel = 0) const;
+    bool managesFile(const QString &workingDirectory, const QString &fileName) const;
     bool isConfigured() const;
     bool supportsOperation(Operation operation) const;
     bool vcsOpen(const QString &fileName);
diff --git a/src/plugins/clearcase/clearcasecontrol.cpp b/src/plugins/clearcase/clearcasecontrol.cpp
index 79f81242a179d292ab121a20d0bbd150438ee26b..c2f7dd44e0215851f1e6b430b115cf5dc9319ffb 100644
--- a/src/plugins/clearcase/clearcasecontrol.cpp
+++ b/src/plugins/clearcase/clearcasecontrol.cpp
@@ -134,6 +134,11 @@ bool ClearCaseControl::managesDirectory(const QString &directory, QString *topLe
     return m_plugin->managesDirectory(directory, topLevel);
 }
 
+bool ClearCaseControl::managesFile(const QString &workingDirectory, const QString &fileName) const
+{
+    return m_plugin->managesFile(workingDirectory, fileName);
+}
+
 bool ClearCaseControl::vcsAnnotate(const QString &file, int line)
 {
     const QFileInfo fi(file);
diff --git a/src/plugins/clearcase/clearcasecontrol.h b/src/plugins/clearcase/clearcasecontrol.h
index f4a0fb5743c1327cc02fb23a165013af559a9db3..fa980595e26753e14efda128f7aa520c524fc879 100644
--- a/src/plugins/clearcase/clearcasecontrol.h
+++ b/src/plugins/clearcase/clearcasecontrol.h
@@ -48,6 +48,7 @@ public:
     Core::Id id() const;
 
     bool managesDirectory(const QString &directory, QString *topLevel = 0) const;
+    bool managesFile(const QString &workingDirectory, const QString &fileName) const;
 
     bool isConfigured() const;
 
diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp
index 3e2c34a505f8c9e63cd3369689a0e8d3617d2cce..4775f2e87646e6fae9637e5fe2c50b3c11d155f5 100644
--- a/src/plugins/clearcase/clearcaseplugin.cpp
+++ b/src/plugins/clearcase/clearcaseplugin.cpp
@@ -1850,6 +1850,13 @@ bool ClearCasePlugin::ccCheckUcm(const QString &viewname, const QString &working
     return QRegExp(QLatin1String("(^|\\n)ucm\\n")).indexIn(catcsData) != -1;
 }
 
+bool ClearCasePlugin::managesFile(const QString &workingDirectory, const QString &fileName) const
+{
+    QStringList args;
+    args << QLatin1String("ls") << fileName;
+    return runCleartoolSync(workingDirectory, args).contains(QLatin1String("@@"));
+}
+
 ViewData ClearCasePlugin::ccGetView(const QString &workingDir) const
 {
     static QHash<QString, ViewData> viewCache;
diff --git a/src/plugins/clearcase/clearcaseplugin.h b/src/plugins/clearcase/clearcaseplugin.h
index 6d62e2e5e88fe6a9b720841351ebb427ddb75998..929844197af9e910980357b736ee9920904dc8af 100644
--- a/src/plugins/clearcase/clearcaseplugin.h
+++ b/src/plugins/clearcase/clearcaseplugin.h
@@ -166,6 +166,7 @@ public:
     void setStatus(const QString &file, FileStatus::Status status, bool update = true);
 
     bool ccCheckUcm(const QString &viewname, const QString &workingDir) const;
+    bool managesFile(const QString &workingDirectory, const QString &fileName) const;
 
 public slots:
     void vcsAnnotate(const QString &workingDir, const QString &file,
diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h
index 4ba0277a712931e95bf5b85ba1ad96fdbd96a575..329f687f2151c20c5b477dcbd7901ca1c598c1ad 100644
--- a/src/plugins/coreplugin/iversioncontrol.h
+++ b/src/plugins/coreplugin/iversioncontrol.h
@@ -80,6 +80,14 @@ public:
 
     virtual bool managesDirectory(const QString &filename, QString *topLevel = 0) const = 0;
 
+    /*!
+     * Returns whether \a fileName is managed by this version control.
+     *
+     * \a workingDirectory is assumed to be part of a valid repository (not necessarily its
+     * top level). \a fileName is expected to be relative to workingDirectory.
+     */
+    virtual bool managesFile(const QString &workingDirectory, const QString &fileName) const = 0;
+
     /*!
      * Returns true is the VCS is configured to run.
      */
diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp
index c2419d8beb91ef373eeb4aa38f6a89c4802e81e6..1345aca4eaa568533ace383d6f9b9a8f1a251653 100644
--- a/src/plugins/coreplugin/vcsmanager.cpp
+++ b/src/plugins/coreplugin/vcsmanager.cpp
@@ -412,11 +412,20 @@ void VcsManager::promptToAdd(const QString &directory, const QStringList &fileNa
     if (!vc || !vc->supportsOperation(Core::IVersionControl::AddOperation))
         return;
 
+    QStringList unmanagedFiles;
+    QDir dir(directory);
+    foreach (const QString &fileName, fileNames) {
+        if (!vc->managesFile(directory, dir.relativeFilePath(fileName)))
+            unmanagedFiles << fileName;
+    }
+    if (unmanagedFiles.isEmpty())
+        return;
+
     Internal::AddToVcsDialog dlg(Core::ICore::mainWindow(), VcsManager::msgAddToVcsTitle(),
-                                 fileNames, vc->displayName());
+                                 unmanagedFiles, vc->displayName());
     if (dlg.exec() == QDialog::Accepted) {
         QStringList notAddedToVc;
-        foreach (const QString &file, fileNames) {
+        foreach (const QString &file, unmanagedFiles) {
             if (!vc->vcsAdd(file))
                 notAddedToVc << file;
         }
diff --git a/src/plugins/cvs/cvscontrol.cpp b/src/plugins/cvs/cvscontrol.cpp
index 87fdc2cf242bdb794b51b0795de8b988612d6edb..af579f3e99cd2a63ffd205ca51191446a375b81c 100644
--- a/src/plugins/cvs/cvscontrol.cpp
+++ b/src/plugins/cvs/cvscontrol.cpp
@@ -163,6 +163,11 @@ bool CvsControl::managesDirectory(const QString &directory, QString *topLevel) c
     return m_plugin->managesDirectory(directory, topLevel);
 }
 
+bool CvsControl::managesFile(const QString &workingDirectory, const QString &fileName) const
+{
+    return m_plugin->managesFile(workingDirectory, fileName);
+}
+
 void CvsControl::emitRepositoryChanged(const QString &s)
 {
     emit repositoryChanged(s);
diff --git a/src/plugins/cvs/cvscontrol.h b/src/plugins/cvs/cvscontrol.h
index 586296fa4df9563fffb5d727b99357a8e550becd..4a765557a30354a27df0b110b31cc250d3741911 100644
--- a/src/plugins/cvs/cvscontrol.h
+++ b/src/plugins/cvs/cvscontrol.h
@@ -48,6 +48,7 @@ public:
     Core::Id id() const;
 
     bool managesDirectory(const QString &directory, QString *topLevel = 0) const;
+    bool managesFile(const QString &workingDirectory, const QString &fileName) const;
 
     bool isConfigured() const;
     bool supportsOperation(Operation operation) const;
diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp
index adbde2d7df284a2417a065cd7f3766d8b1d45086..9d4a8055f749feabb3d6baf2c07e4e27913e6b5b 100644
--- a/src/plugins/cvs/cvsplugin.cpp
+++ b/src/plugins/cvs/cvsplugin.cpp
@@ -1226,7 +1226,7 @@ CvsResponse CvsPlugin::runCvs(const QString &workingDirectory,
                               const QStringList &arguments,
                               int timeOut,
                               unsigned flags,
-                              QTextCodec *outputCodec)
+                              QTextCodec *outputCodec) const
 {
     const QString executable = m_settings.cvsBinaryPath;
     CvsResponse response;
@@ -1365,6 +1365,17 @@ bool CvsPlugin::managesDirectory(const QString &directory, QString *topLevel /*
     return manages;
 }
 
+bool CvsPlugin::managesFile(const QString &workingDirectory, const QString &fileName) const
+{
+    QStringList args;
+    args << QLatin1String("status") << fileName;
+    const CvsResponse response =
+            runCvs(workingDirectory, args, m_settings.timeOutMS(), SshPasswordPrompt);
+    if (response.result != CvsResponse::Ok)
+        return false;
+    return !response.stdOut.contains(QLatin1String("Status: Unknown"));
+}
+
 bool CvsPlugin::checkCVSDirectory(const QDir &directory) const
 {
     const QString cvsDir = directory.absoluteFilePath(QLatin1String("CVS"));
diff --git a/src/plugins/cvs/cvsplugin.h b/src/plugins/cvs/cvsplugin.h
index ba5aad89b8ff6d1fb79ecf9b6a0ec26d0feb94d7..6d8f057b83b283a63a9cb4476269e94c4cbde982 100644
--- a/src/plugins/cvs/cvsplugin.h
+++ b/src/plugins/cvs/cvsplugin.h
@@ -90,6 +90,7 @@ public:
     bool vcsAdd(const QString &workingDir, const QString &fileName);
     bool vcsDelete(const QString &workingDir, const QString &fileName);
     bool managesDirectory(const QString &directory, QString *topLevel = 0) const;
+    bool managesFile(const QString &workingDirectory, const QString &fileName) const;
     // cvs 'edit' is used to implement 'open' (cvsnt).
     bool edit(const QString &topLevel, const QStringList &files);
 
@@ -143,7 +144,8 @@ private:
     CvsResponse runCvs(const QString &workingDirectory,
                        const QStringList &arguments,
                        int timeOut,
-                       unsigned flags, QTextCodec *outputCodec = 0);
+                       unsigned flags,
+                       QTextCodec *outputCodec = 0) const;
 
     void annotate(const QString &workingDir, const QString &file,
                   const QString &revision = QString(), int lineNumber= -1);
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 413f663e90da88759477b2b4286ad3c2b988f700..eab02e8c0549110c679a0ce7f1164b48417ea8d1 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -972,6 +972,15 @@ QString GitClient::findGitDirForRepository(const QString &repositoryDir) const
     return res;
 }
 
+bool GitClient::managesFile(const QString &workingDirectory, const QString &fileName) const
+{
+    QByteArray output;
+    QStringList arguments;
+    arguments << QLatin1String("ls-files") << QLatin1String("--error-unmatch") << fileName;
+    return fullySynchronousGit(workingDirectory, arguments, &output, 0,
+                               VcsBasePlugin::SuppressCommandLogging);
+}
+
 VcsBase::VcsBaseEditorWidget *GitClient::findExistingVCSEditor(const char *registerDynamicProperty,
                                                                const QString &dynamicPropertyValue) const
 {
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 7517f2629a58c2a5a5458ded42e2bec65ed70e7c..f21a14867281ce0ecee47f22c966d64e3a19e3aa 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -137,6 +137,7 @@ public:
 
     QString findRepositoryForDirectory(const QString &dir);
     QString findGitDirForRepository(const QString &repositoryDir) const;
+    bool managesFile(const QString &workingDirectory, const QString &fileName) const;
 
     void diff(const QString &workingDirectory, const QString &fileName);
     void diff(const QString &workingDirectory,
diff --git a/src/plugins/git/gitversioncontrol.cpp b/src/plugins/git/gitversioncontrol.cpp
index b98e9ea350131d0b5a7433eb7d7e0941b30673ae..ae5154e81efcb2d433d436fec58deb1408d3073b 100644
--- a/src/plugins/git/gitversioncontrol.cpp
+++ b/src/plugins/git/gitversioncontrol.cpp
@@ -229,6 +229,11 @@ bool GitVersionControl::managesDirectory(const QString &directory, QString *topL
     return !topLevelFound.isEmpty();
 }
 
+bool GitVersionControl::managesFile(const QString &workingDirectory, const QString &fileName) const
+{
+    return m_client->managesFile(workingDirectory, fileName);
+}
+
 bool GitVersionControl::vcsAnnotate(const QString &file, int line)
 {
     const QFileInfo fi(file);
diff --git a/src/plugins/git/gitversioncontrol.h b/src/plugins/git/gitversioncontrol.h
index 6baa152077166c5df0f452bc8dc84cb4a4bc7ba6..71c53be43cbbfde979798fd580f7b851fc2c2e57 100644
--- a/src/plugins/git/gitversioncontrol.h
+++ b/src/plugins/git/gitversioncontrol.h
@@ -48,6 +48,7 @@ public:
     Core::Id id() const;
 
     bool managesDirectory(const QString &directory, QString *topLevel) const;
+    bool managesFile(const QString &workingDirectory, const QString &fileName) const;
 
     bool isConfigured() const;
     bool supportsOperation(Operation operation) const;
diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp
index e4966d26271da4b763d74d9b2241550e2c6dd505..f1969682f51fc70659f8f2fed7b51db65bb89c57 100644
--- a/src/plugins/mercurial/mercurialclient.cpp
+++ b/src/plugins/mercurial/mercurialclient.cpp
@@ -257,6 +257,15 @@ QString MercurialClient::vcsGetRepositoryURL(const QString &directory)
     return QString();
 }
 
+bool MercurialClient::managesFile(const QString &workingDirectory, const QString &fileName) const
+{
+    QStringList args;
+    args << QLatin1String("status") << QLatin1String("--unknown") << fileName;
+    QByteArray output;
+    vcsFullySynchronousExec(workingDirectory, args, &output);
+    return output.isEmpty();
+}
+
 void MercurialClient::incoming(const QString &repositoryRoot, const QString &repository)
 {
     QStringList args;
diff --git a/src/plugins/mercurial/mercurialclient.h b/src/plugins/mercurial/mercurialclient.h
index 7f12b8470f3198f814d88fe3a4a1c75e919f8a71..845d2db47864de957447bcbadba580ba5c1e8475 100644
--- a/src/plugins/mercurial/mercurialclient.h
+++ b/src/plugins/mercurial/mercurialclient.h
@@ -63,6 +63,7 @@ public:
     void incoming(const QString &repositoryRoot, const QString &repository = QString());
     void outgoing(const QString &repositoryRoot);
     QString vcsGetRepositoryURL(const QString &directory);
+    bool managesFile(const QString &workingDirectory, const QString &fileName) const;
 
     void annotate(const QString &workingDir, const QString &file,
                   const QString revision = QString(), int lineNumber = -1,
diff --git a/src/plugins/mercurial/mercurialcontrol.cpp b/src/plugins/mercurial/mercurialcontrol.cpp
index 8eaa73dce19b93e53fbffe7e408fc340a1e26d0a..c8fa812e2dd0c8a5f9f9707045f3cc614ffbc485 100644
--- a/src/plugins/mercurial/mercurialcontrol.cpp
+++ b/src/plugins/mercurial/mercurialcontrol.cpp
@@ -64,6 +64,11 @@ bool MercurialControl::managesDirectory(const QString &directory, QString *topLe
     return !topLevelFound.isEmpty();
 }
 
+bool MercurialControl::managesFile(const QString &workingDirectory, const QString &fileName) const
+{
+    return mercurialClient->managesFile(workingDirectory, fileName);
+}
+
 bool MercurialControl::isConfigured() const
 {
     const QString binary = mercurialClient->settings()->binaryPath();
diff --git a/src/plugins/mercurial/mercurialcontrol.h b/src/plugins/mercurial/mercurialcontrol.h
index 3fac104c044220fc853b5e79177a104dfb500305..4a5c2e872c44e496f1094a8bdcf9225fd829bd2e 100644
--- a/src/plugins/mercurial/mercurialcontrol.h
+++ b/src/plugins/mercurial/mercurialcontrol.h
@@ -53,6 +53,7 @@ public:
     QString displayName() const;
     Core::Id id() const;
     bool managesDirectory(const QString &filename, QString *topLevel = 0) const;
+    bool managesFile(const QString &workingDirectory, const QString &fileName) const;
     bool isConfigured() const;
     bool supportsOperation(Operation operation) const;
     bool vcsOpen(const QString &fileName);
diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp
index ec8e13e5eea63e2659244272f71af68c60c21bfc..69dcc62fbcbe5082796fe857334cc2a47c4202de 100644
--- a/src/plugins/perforce/perforceplugin.cpp
+++ b/src/plugins/perforce/perforceplugin.cpp
@@ -828,6 +828,14 @@ bool PerforcePlugin::managesDirectory(const QString &directory, QString *topLeve
     return rc;
 }
 
+bool PerforcePlugin::managesFile(const QString &workingDirectory, const QString &fileName) const
+{
+    QStringList args;
+    args << QLatin1String("fstat") << QLatin1String("-m1") << fileName;
+    const PerforceResponse result = runP4Cmd(workingDirectory, args, RunFullySynchronous);
+    return result.stdOut.contains(QLatin1String("depotFile"));
+}
+
 bool PerforcePlugin::managesDirectoryFstat(const QString &directory)
 {
     if (!m_settings.isValid())
diff --git a/src/plugins/perforce/perforceplugin.h b/src/plugins/perforce/perforceplugin.h
index 71e0a6e39d7ff2c87a2403a481fa87ef1bf89b30..b03fab15c9d2ad3f1d924320b0894a78fdd0e632 100644
--- a/src/plugins/perforce/perforceplugin.h
+++ b/src/plugins/perforce/perforceplugin.h
@@ -86,6 +86,7 @@ public:
     void extensionsInitialized();
 
     bool managesDirectory(const QString &directory, QString *topLevel = 0);
+    bool managesFile(const QString &workingDirectory, const QString &fileName) const;
     bool vcsOpen(const QString &workingDir, const QString &fileName);
     bool vcsAdd(const QString &workingDir, const QString &fileName);
     bool vcsDelete(const QString &workingDir, const QString &filename);
diff --git a/src/plugins/perforce/perforceversioncontrol.cpp b/src/plugins/perforce/perforceversioncontrol.cpp
index a6477335916f7b92c2d491b39a8fdd57c0326738..37c78efce9d3db6286971d36267e63aa47b961ad 100644
--- a/src/plugins/perforce/perforceversioncontrol.cpp
+++ b/src/plugins/perforce/perforceversioncontrol.cpp
@@ -184,6 +184,11 @@ bool PerforceVersionControl::managesDirectory(const QString &directory, QString
     return rc;
 }
 
+bool PerforceVersionControl::managesFile(const QString &workingDirectory, const QString &fileName) const
+{
+    return m_plugin->managesFile(workingDirectory, fileName);
+}
+
 void PerforceVersionControl::emitRepositoryChanged(const QString &s)
 {
     emit repositoryChanged(s);
diff --git a/src/plugins/perforce/perforceversioncontrol.h b/src/plugins/perforce/perforceversioncontrol.h
index 888ce898501425902d30e91e74cf94935beeb912..844791429edc8972d1c17f105734815cf5aeeff9 100644
--- a/src/plugins/perforce/perforceversioncontrol.h
+++ b/src/plugins/perforce/perforceversioncontrol.h
@@ -47,6 +47,7 @@ public:
     Core::Id id() const;
 
     bool managesDirectory(const QString &directory, QString *topLevel = 0) const;
+    bool managesFile(const QString &workingDirectory, const QString &fileName) const;
 
     bool isConfigured() const;
     bool supportsOperation(Operation operation) const;
diff --git a/src/plugins/subversion/subversioncontrol.cpp b/src/plugins/subversion/subversioncontrol.cpp
index 3b11ef8acac422e6c6a5bcd05d1c8d84f9ea922f..200105bb3ba911723855468d6dcadcc6791568ef 100644
--- a/src/plugins/subversion/subversioncontrol.cpp
+++ b/src/plugins/subversion/subversioncontrol.cpp
@@ -146,6 +146,11 @@ bool SubversionControl::managesDirectory(const QString &directory, QString *topL
     return m_plugin->managesDirectory(directory, topLevel);
 }
 
+bool SubversionControl::managesFile(const QString &workingDirectory, const QString &fileName) const
+{
+    return m_plugin->managesFile(workingDirectory, fileName);
+}
+
 bool SubversionControl::vcsAnnotate(const QString &file, int line)
 {
     const QFileInfo fi(file);
diff --git a/src/plugins/subversion/subversioncontrol.h b/src/plugins/subversion/subversioncontrol.h
index d7b3a5ca44427146ef011a7781d0c5d9f7b23b56..ce7c54dfb2872b5fe06af9973e2520e5789c3da6 100644
--- a/src/plugins/subversion/subversioncontrol.h
+++ b/src/plugins/subversion/subversioncontrol.h
@@ -47,6 +47,7 @@ public:
     Core::Id id() const;
 
     bool managesDirectory(const QString &directory, QString *topLevel = 0) const;
+    bool managesFile(const QString &workingDirectory, const QString &fileName) const;
 
     bool isConfigured() const;
     bool supportsOperation(Operation operation) const;
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index 946e8e5026cb342855c376bfa0cd09949d6d4d32..de57be400e12dc51969b8d5651c9eae12b31e1c9 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -1083,7 +1083,7 @@ SubversionResponse
                                  const QStringList &arguments,
                                  int timeOut,
                                  unsigned flags,
-                                 QTextCodec *outputCodec)
+                                 QTextCodec *outputCodec) const
 {
     const bool hasAuth = m_settings.hasAuthentication();
     return runSvn(workingDir,
@@ -1142,7 +1142,7 @@ SubversionPlugin::Version SubversionPlugin::svnVersion()
 SubversionResponse SubversionPlugin::runSvn(const QString &workingDir,
                           const QString &userName, const QString &password,
                           const QStringList &arguments, int timeOut,
-                          unsigned flags, QTextCodec *outputCodec)
+                          unsigned flags, QTextCodec *outputCodec) const
 {
     const QString executable = m_settings.binaryPath();
     SubversionResponse response;
@@ -1354,6 +1354,15 @@ bool SubversionPlugin::managesDirectory(const QString &directory, QString *topLe
     return true;
 }
 
+bool SubversionPlugin::managesFile(const QString &workingDirectory, const QString &fileName) const
+{
+    QStringList args;
+    args << QLatin1String("status") << fileName;
+    SubversionResponse response =
+            runSvn(workingDirectory, args, m_settings.timeOutMs(), 0);
+    return response.stdOut.isEmpty() || response.stdOut.at(0) != QLatin1Char('?');
+}
+
 // Check whether SVN management subdirs exist.
 bool SubversionPlugin::checkSVNSubDir(const QDir &directory, const QString &fileName) const
 {
diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h
index 81a89b668eaa1d5a32b423a21eeb57346f5cf4b7..82940f1ae6dd2de875a0e6982bef292384ae42ce 100644
--- a/src/plugins/subversion/subversionplugin.h
+++ b/src/plugins/subversion/subversionplugin.h
@@ -96,6 +96,7 @@ public:
     bool vcsDelete(const QString &workingDir, const QString &fileName);
     bool vcsMove(const QString &workingDir, const QString &from, const QString &to);
     bool managesDirectory(const QString &directory, QString *topLevel = 0) const;
+    bool managesFile(const QString &workingDirectory, const QString &fileName) const;
     bool vcsCheckout(const QString &directory, const QByteArray &url);
     QString vcsGetRepositoryURL(const QString &directory);
 
@@ -161,12 +162,12 @@ private:
     // Run using the settings' authentication options.
     SubversionResponse runSvn(const QString &workingDir,
                               const QStringList &arguments, int timeOut,
-                              unsigned flags, QTextCodec *outputCodec = 0);
+                              unsigned flags, QTextCodec *outputCodec = 0) const;
     // Run using custom authentication options.
     SubversionResponse runSvn(const QString &workingDir,
                               const QString &userName, const QString &password,
                               const QStringList &arguments, int timeOut,
-                              unsigned flags, QTextCodec *outputCodec = 0);
+                              unsigned flags, QTextCodec *outputCodec = 0) const;
 
     void filelog(const QString &workingDir,
                  const QString &file = QString(),
diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp
index ca8a7dd3ffd275fd5c526be2d07de6353d12f101..442313d87e6ad8c1757572ee12822dc464cea43e 100644
--- a/src/plugins/vcsbase/vcsbaseclient.cpp
+++ b/src/plugins/vcsbase/vcsbaseclient.cpp
@@ -276,7 +276,7 @@ bool VcsBaseClient::synchronousPush(const QString &workingDir,
 
 bool VcsBaseClient::vcsFullySynchronousExec(const QString &workingDir,
                                             const QStringList &args,
-                                            QByteArray *output)
+                                            QByteArray *output) const
 {
     QProcess vcsProcess;
     if (!workingDir.isEmpty())
diff --git a/src/plugins/vcsbase/vcsbaseclient.h b/src/plugins/vcsbase/vcsbaseclient.h
index 2d3ff336a03252ab40e080c7abcc777983deef20..9734e4829cc3242baaa7de130a7b8251172b0e38 100644
--- a/src/plugins/vcsbase/vcsbaseclient.h
+++ b/src/plugins/vcsbase/vcsbaseclient.h
@@ -166,7 +166,7 @@ protected:
     // Fully synchronous VCS execution (QProcess-based)
     bool vcsFullySynchronousExec(const QString &workingDir,
                                  const QStringList &args,
-                                 QByteArray *output);
+                                 QByteArray *output) const;
     // Synchronous VCS execution using Utils::SynchronousProcess, with
     // log windows updating (using VcsBasePlugin::runVcs with flags)
     Utils::SynchronousProcessResponse vcsSynchronousExec(const QString &workingDir,