diff --git a/src/plugins/subversion/subversionclient.cpp b/src/plugins/subversion/subversionclient.cpp
index 9e0b8df70c04ee8bbf6ba89eeacddb7c7d4e8696..70c207e326141f196ea7fdf3f55aaef4c6a88b48 100644
--- a/src/plugins/subversion/subversionclient.cpp
+++ b/src/plugins/subversion/subversionclient.cpp
@@ -209,6 +209,25 @@ QStringList SubversionClient::addAuthenticationOptions(const QStringList &args,
     return rc;
 }
 
+QString SubversionClient::synchronousTopic(const QString &repository)
+{
+    QStringList args;
+    args << QLatin1String("info");
+
+    QByteArray stdOut;
+    if (!vcsFullySynchronousExec(repository, args, &stdOut))
+        return QString();
+
+    const QString revisionString = QLatin1String("Revision: ");
+    // stdOut is ASCII only (at least in those areas we care about).
+    QString output = SynchronousProcess::normalizeNewlines(QString::fromLocal8Bit(stdOut));
+    foreach (const QString &line, output.split(QLatin1Char('\n'))) {
+        if (line.startsWith(revisionString))
+            return QString::fromLatin1("r") + line.mid(revisionString.count());
+    }
+    return QString();
+}
+
 void SubversionClient::diff(const QString &workingDir, const QStringList &files,
                            const QStringList &extraOptions)
 {
diff --git a/src/plugins/subversion/subversionclient.h b/src/plugins/subversion/subversionclient.h
index f73c03ca6a36c87d920b908cdfc74bc9b5be31de..7b0ec2fe0f71335bbffcb9c8387f0383755b9195 100644
--- a/src/plugins/subversion/subversionclient.h
+++ b/src/plugins/subversion/subversionclient.h
@@ -81,6 +81,8 @@ public:
                                                 const QString &userName = QString(),
                                                 const QString &password = QString());
 
+    QString synchronousTopic(const QString &repository);
+
 protected:
     Core::Id vcsEditorKind(VcsCommandTag cmd) const;
     VcsBase::VcsBaseEditorParameterWidget *createDiffEditor(const QString &workingDir,
diff --git a/src/plugins/subversion/subversioncontrol.cpp b/src/plugins/subversion/subversioncontrol.cpp
index b2913363fe3450cad70e906bfd09ea8fdd108198..a69206db0ec73c765afb8ec6c280c66a9798b1f9 100644
--- a/src/plugins/subversion/subversioncontrol.cpp
+++ b/src/plugins/subversion/subversioncontrol.cpp
@@ -36,13 +36,35 @@
 
 #include <QFileInfo>
 
-using namespace Subversion;
-using namespace Subversion::Internal;
+namespace Subversion {
+namespace Internal {
+
+class SubversionTopicCache : public Core::IVersionControl::TopicCache
+{
+public:
+    SubversionTopicCache(SubversionPlugin *plugin) :
+        m_plugin(plugin)
+    { }
+
+protected:
+    QString trackFile(const QString &repository)
+    {
+        return m_plugin->monitorFile(repository);
+    }
+
+    QString refreshTopic(const QString &repository)
+    {
+        return m_plugin->synchronousTopic(repository);
+    }
+
+private:
+    SubversionPlugin *m_plugin;
+};
 
 SubversionControl::SubversionControl(SubversionPlugin *plugin) :
+    Core::IVersionControl(new SubversionTopicCache(plugin)),
     m_plugin(plugin)
-{
-}
+{ }
 
 QString SubversionControl::displayName() const
 {
@@ -153,3 +175,6 @@ void SubversionControl::emitConfigurationChanged()
 {
     emit configurationChanged();
 }
+
+} // namespace Internal
+} // namespace Subversion
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index f920663053a3c6fff4b193b58dbd66f4a29672a2..8a16f6057c2138221922f75b459b8f46918456c6 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -1074,6 +1074,25 @@ SubversionPlugin *SubversionPlugin::instance()
     return m_subversionPluginInstance;
 }
 
+QString SubversionPlugin::monitorFile(const QString &repository) const
+{
+    QTC_ASSERT(!repository.isEmpty(), return QString());
+    QDir repoDir(repository);
+    foreach (const QString &svnDir, m_svnDirectories) {
+        if (repoDir.exists(svnDir)) {
+            QFileInfo fi(repoDir.absoluteFilePath(svnDir + QLatin1String("/wc.db")));
+            if (fi.exists() && fi.isFile())
+                return fi.absoluteFilePath();
+        }
+    }
+    return QString();
+}
+
+QString SubversionPlugin::synchronousTopic(const QString &repository) const
+{
+    return m_client->synchronousTopic(repository);
+}
+
 bool SubversionPlugin::vcsAdd(const QString &workingDir, const QString &rawFileName)
 {
     const QString file = QDir::toNativeSeparators(rawFileName);
diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h
index e9d1ca741f071400469a0e5f1b106bfb799b93f5..7fecab837ea02e43d095ecad943624f99fc7d513 100644
--- a/src/plugins/subversion/subversionplugin.h
+++ b/src/plugins/subversion/subversionplugin.h
@@ -91,6 +91,9 @@ public:
 
     static SubversionPlugin *instance();
 
+    QString monitorFile(const QString &repository) const;
+    QString synchronousTopic(const QString &repository) const;
+
 public slots:
     void vcsAnnotate(const QString &workingDir, const QString &file,
                      const QString &revision = QString(), int lineNumber = -1);