diff --git a/src/plugins/cvs/cvseditor.cpp b/src/plugins/cvs/cvseditor.cpp
index e4761ab151830780fdbaeeb3dfaba3eedba8b062..914199920d366850095f26e3a914de48c22a46e1 100644
--- a/src/plugins/cvs/cvseditor.cpp
+++ b/src/plugins/cvs/cvseditor.cpp
@@ -54,6 +54,7 @@ CVSEditor::CVSEditor(const VCSBase::VCSBaseEditorParameters *type,
 {
     QTC_ASSERT(m_revisionAnnotationPattern.isValid(), return);
     QTC_ASSERT(m_revisionLogPattern.isValid(), return);
+    setAnnotateRevisionTextFormat(tr("Annotate revision \"%1\""));
 }
 
 QSet<QString> CVSEditor::annotationChanges() const
@@ -149,11 +150,10 @@ QString CVSEditor::fileNameFromDiffSpecification(const QTextBlock &inBlock) cons
     return QString();
 }
 
-QStringList CVSEditor::annotationPreviousVersions(const QString &revision, QString *actionTextFormat) const
+QStringList CVSEditor::annotationPreviousVersions(const QString &revision) const
 {
     if (isFirstRevision(revision))
         return QStringList();
-    *actionTextFormat = tr("Annotate revision \"%1\"");
     return QStringList(previousRevision(revision));
 }
 
diff --git a/src/plugins/cvs/cvseditor.h b/src/plugins/cvs/cvseditor.h
index 614f4adc88465d23bba178f0edfbf88c28ae9eea..0d313e4e41f2fecf0fb5ee5f97829fc9abca3d34 100644
--- a/src/plugins/cvs/cvseditor.h
+++ b/src/plugins/cvs/cvseditor.h
@@ -51,7 +51,7 @@ private:
     virtual VCSBase::DiffHighlighter *createDiffHighlighter() const;
     virtual VCSBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes) const;
     virtual QString fileNameFromDiffSpecification(const QTextBlock &diffFileName) const;
-    virtual QStringList annotationPreviousVersions(const QString &revision, QString *actionTextFormat) const;
+    virtual QStringList annotationPreviousVersions(const QString &revision) const;
 
     const QRegExp m_revisionAnnotationPattern;
     const QRegExp m_revisionLogPattern;
diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp
index e81bb94341424259e8f714454127a481ac1267a3..3f3ed34d59616adb8a2f035c42187942019457a5 100644
--- a/src/plugins/cvs/cvsplugin.cpp
+++ b/src/plugins/cvs/cvsplugin.cpp
@@ -95,6 +95,9 @@ static const char * const CMD_ID_ANNOTATE_CURRENT   = "CVS.AnnotateCurrent";
 static const char * const CMD_ID_SEPARATOR3         = "CVS.Separator3";
 static const char * const CMD_ID_STATUS             = "CVS.Status";
 static const char * const CMD_ID_UPDATE             = "CVS.Update";
+static const char * const CMD_ID_PROJECTLOG         = "CVS.ProjectLog";
+static const char * const CMD_ID_REPOSITORYLOG      = "CVS.RepositoryLog";
+static const char * const CMD_ID_SEPARATOR4         = "CVS.Separator4";
 
 static const VCSBase::VCSBaseEditorParameters editorParameters[] = {
 {
@@ -149,6 +152,8 @@ CVSPlugin::CVSPlugin() :
     m_revertAction(0),
     m_diffProjectAction(0),
     m_diffCurrentAction(0),
+    m_logProjectAction(0),
+    m_logRepositoryAction(0),
     m_commitAllAction(0),
     m_commitCurrentAction(0),
     m_filelogCurrentAction(0),
@@ -325,12 +330,24 @@ bool CVSPlugin::initialize(const QStringList & /*arguments */, QString *errorMes
     connect(m_statusProjectAction, SIGNAL(triggered()), this, SLOT(projectStatus()));
     cvsMenu->addAction(command);
 
+    m_logProjectAction = new Utils::ParameterAction(tr("Log Project"), tr("Log Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
+    command = ami->registerAction(m_logProjectAction, CMD_ID_PROJECTLOG, globalcontext);
+    command->setAttribute(Core::Command::CA_UpdateText);
+    connect(m_logProjectAction, SIGNAL(triggered()), this, SLOT(logProject()));
+    cvsMenu->addAction(command);
+
     m_updateProjectAction = new Utils::ParameterAction(tr("Update Project"), tr("Update Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
     command = ami->registerAction(m_updateProjectAction, CMD_ID_UPDATE, globalcontext);
     command->setAttribute(Core::Command::CA_UpdateText);
     connect(m_updateProjectAction, SIGNAL(triggered()), this, SLOT(updateProject()));
     cvsMenu->addAction(command);
 
+    cvsMenu->addAction(createSeparator(this, ami, CMD_ID_SEPARATOR4, globalcontext));
+    m_logRepositoryAction = new QAction(tr("Repository Log"), this);
+    command = ami->registerAction(m_logRepositoryAction, CMD_ID_REPOSITORYLOG, globalcontext);
+    connect(m_logRepositoryAction, SIGNAL(triggered()), this, SLOT(logRepository()));
+    cvsMenu->addAction(command);
+
     // Actions of the submit editor
     QList<int> cvscommitcontext;
     cvscommitcontext << Core::UniqueIDManager::instance()->uniqueIdentifier(Constants::CVSCOMMITEDITOR);
@@ -475,6 +492,8 @@ void CVSPlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as)
     if (!VCSBase::VCSBasePlugin::enableMenuAction(as, m_menuAction))
         return;
 
+    m_logRepositoryAction->setEnabled(currentState().hasTopLevel());
+
     const QString currentFileName = currentState().currentFileName();
     m_addAction->setParameter(currentFileName);
     m_deleteAction->setParameter(currentFileName);
@@ -488,6 +507,7 @@ void CVSPlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as)
     m_diffProjectAction->setParameter(currentProjectName);
     m_statusProjectAction->setParameter(currentProjectName);
     m_updateProjectAction->setParameter(currentProjectName);
+    m_logProjectAction->setParameter(currentProjectName);
 
     m_commitAllAction->setEnabled(currentState().hasTopLevel());
 }
@@ -641,10 +661,26 @@ void CVSPlugin::filelogCurrentFile()
 {
     const VCSBase::VCSBasePluginState state = currentState();
     QTC_ASSERT(state.hasFile(), return)
-    filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()));
+    filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()), true);
 }
 
-void CVSPlugin::filelog(const QString &workingDir, const QStringList &files)
+void CVSPlugin::logProject()
+{
+    const VCSBase::VCSBasePluginState state = currentState();
+    QTC_ASSERT(state.hasProject(), return)
+    filelog(state.currentProjectTopLevel(), state.relativeCurrentProject());
+}
+
+void CVSPlugin::logRepository()
+{
+    const VCSBase::VCSBasePluginState state = currentState();
+    QTC_ASSERT(state.hasTopLevel(), return)
+    filelog(state.topLevel());
+}
+
+void CVSPlugin::filelog(const QString &workingDir,
+                        const QStringList &files,
+                        bool enableAnnotationContextMenu)
 {
     QTextCodec *codec = VCSBase::VCSBaseEditor::getCodec(workingDir, files);
     // no need for temp file
@@ -659,7 +695,6 @@ void CVSPlugin::filelog(const QString &workingDir, const QStringList &files)
 
     // Re-use an existing view if possible to support
     // the common usage pattern of continuously changing and diffing a file
-
     if (Core::IEditor *editor = locateEditor("logFileName", id)) {
         editor->createNew(response.stdOut);
         Core::EditorManager::instance()->activateEditor(editor);
@@ -667,6 +702,8 @@ void CVSPlugin::filelog(const QString &workingDir, const QStringList &files)
         const QString title = QString::fromLatin1("cvs log %1").arg(id);
         Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::LogOutput, source, codec);
         newEditor->setProperty("logFileName", id);
+        if (enableAnnotationContextMenu)
+            VCSBase::VCSBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true);
     }
 }
 
@@ -726,8 +763,6 @@ void CVSPlugin::annotate(const QString &workingDir, const QString &file,
         const QString title = QString::fromLatin1("cvs annotate %1").arg(id);
         Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::AnnotateOutput, source, codec);
         newEditor->setProperty("annotateFileName", id);
-        connect(newEditor, SIGNAL(annotatePreviousRequested(QString,QString,int)),
-                this, SLOT(annotateVersion(QString,QString,int)));
         VCSBase::VCSBaseEditor::gotoLineOfEditor(newEditor, lineNumber);
     }
 }
@@ -992,6 +1027,8 @@ Core::IEditor * CVSPlugin::showOutputInEditor(const QString& title, const QStrin
         qDebug() << "CVSPlugin::showOutputInEditor" << title << kind <<  "source=" << source << "Size= " << output.size() <<  " Type=" << editorType << debugCodec(codec);
     QString s = title;
     Core::IEditor *editor = Core::EditorManager::instance()->openEditorWithContents(kind, &s, output.toLocal8Bit());
+    connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,int)),
+            this, SLOT(annotateVersion(QString,QString,int)));
     CVSEditor *e = qobject_cast<CVSEditor*>(editor->widget());
     if (!e)
         return 0;
diff --git a/src/plugins/cvs/cvsplugin.h b/src/plugins/cvs/cvsplugin.h
index dd4eeb81d001f84655845e8ab5a42ae4c19bdef7..74eb3055cc153953d37749eb3d872fe8ac89450b 100644
--- a/src/plugins/cvs/cvsplugin.h
+++ b/src/plugins/cvs/cvsplugin.h
@@ -113,6 +113,8 @@ private slots:
     void updateProject();
     void submitCurrentLog();
     void diffCommitFiles(const QStringList &);
+    void logProject();
+    void logRepository();
 
 protected:
     virtual void updateActions(VCSBase::VCSBasePlugin::ActionState);
@@ -135,7 +137,9 @@ private:
     bool describe(const QString &source, const QString &changeNr, QString *errorMessage);
     bool describe(const QString &toplevel, const QString &source, const QString &changeNr, QString *errorMessage);
     bool describe(const QString &repository, QList<CVS_LogEntry> entries, QString *errorMessage);
-    void filelog(const QString &workingDir, const QStringList &files = QStringList());
+    void filelog(const QString &workingDir,
+                 const QStringList &files = QStringList(),
+                 bool enableAnnotationContextMenu = false);
     bool managesDirectory(const QDir &directory) const;
     QString findTopLevelForDirectoryI(const QString &directory) const;
     void startCommit(const QString &workingDir, const QStringList &files = QStringList());
@@ -152,6 +156,8 @@ private:
     Utils::ParameterAction *m_revertAction;
     Utils::ParameterAction *m_diffProjectAction;
     Utils::ParameterAction *m_diffCurrentAction;
+    Utils::ParameterAction *m_logProjectAction;
+    QAction *m_logRepositoryAction;
     QAction *m_commitAllAction;
     Utils::ParameterAction *m_commitCurrentAction;
     Utils::ParameterAction *m_filelogCurrentAction;
diff --git a/src/plugins/perforce/perforceeditor.cpp b/src/plugins/perforce/perforceeditor.cpp
index 44ecd104017f50b38e2ebb4a1c23f33323bca3ca..d6e3f9e9a36a996b1f41b76abbc6b221922bfe04 100644
--- a/src/plugins/perforce/perforceeditor.cpp
+++ b/src/plugins/perforce/perforceeditor.cpp
@@ -62,6 +62,7 @@ PerforceEditor::PerforceEditor(const VCSBase::VCSBaseEditorParameters *type,
     m_plugin(PerforcePlugin::perforcePluginInstance())
 {
     QTC_ASSERT(m_changeNumberPattern.isValid(), /**/);
+    setAnnotateRevisionTextFormat(tr("Annotate change list \"%1\""));
     if (Perforce::Constants::debug)
         qDebug() << "PerforceEditor::PerforceEditor" << type->type << type->kind;
 }
@@ -154,13 +155,12 @@ QString PerforceEditor::fileNameFromDiffSpecification(const QTextBlock &inBlock)
     return QString();
 }
 
-QStringList PerforceEditor::annotationPreviousVersions(const QString &v, QString *actionTextFormat) const
+QStringList PerforceEditor::annotationPreviousVersions(const QString &v) const
 {
     bool ok;
     const int changeList = v.toInt(&ok);
     if (!ok || changeList < 2)
         return QStringList();
-    *actionTextFormat = tr("Annotate change list \"%1\"");
     return QStringList(QString::number(changeList - 1));
 }
 
diff --git a/src/plugins/perforce/perforceeditor.h b/src/plugins/perforce/perforceeditor.h
index 86bbbb6792c20c07598ffbb2709f66818930e080..50650e41d17f1df32c413b48ed19542645a5df74 100644
--- a/src/plugins/perforce/perforceeditor.h
+++ b/src/plugins/perforce/perforceeditor.h
@@ -53,7 +53,7 @@ private:
     virtual VCSBase::DiffHighlighter *createDiffHighlighter() const;
     virtual VCSBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes) const;
     virtual QString fileNameFromDiffSpecification(const QTextBlock &diffFileName) const;
-    virtual QStringList annotationPreviousVersions(const QString &v, QString *actionTextFormat) const;
+    virtual QStringList annotationPreviousVersions(const QString &v) const;
 
     const QRegExp m_changeNumberPattern;
     PerforcePlugin *m_plugin;
diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp
index c3fd22d3f24c2759adc493974a1a624058660576..2320b57d519b9c154b5d3b0d185953a0153ec5a8 100644
--- a/src/plugins/perforce/perforceplugin.cpp
+++ b/src/plugins/perforce/perforceplugin.cpp
@@ -133,6 +133,8 @@ static const char * const CMD_ID_EDIT = "Perforce.Edit";
 static const char * const CMD_ID_ADD = "Perforce.Add";
 static const char * const CMD_ID_DELETE_FILE = "Perforce.Delete";
 static const char * const CMD_ID_OPENED = "Perforce.Opened";
+static const char * const CMD_ID_PROJECTLOG = "Perforce.ProjectLog";
+static const char * const CMD_ID_REPOSITORYLOG = "Perforce.RepositoryLog";
 static const char * const CMD_ID_REVERT = "Perforce.Revert";
 static const char * const CMD_ID_DIFF_CURRENT = "Perforce.DiffCurrent";
 static const char * const CMD_ID_DIFF_PROJECT = "Perforce.DiffProject";
@@ -152,6 +154,7 @@ static const char * const CMD_ID_UPDATEALL = "Perforce.UpdateAll";
 static const char * const CMD_ID_SEPARATOR1 = "Perforce.Separator1";
 static const char * const CMD_ID_SEPARATOR2 = "Perforce.Separator2";
 static const char * const CMD_ID_SEPARATOR3 = "Perforce.Separator3";
+static const char * const CMD_ID_SEPARATOR4 = "Perforce.Separator4";
 
 ////
 // PerforcePlugin
@@ -188,6 +191,8 @@ PerforcePlugin::PerforcePlugin() :
     m_annotateAction(0),
     m_filelogCurrentAction(0),
     m_filelogAction(0),
+    m_logProjectAction(0),
+    m_logRepositoryAction(0),
     m_submitCurrentLogAction(0),
     m_updateAllAction(0),
     m_submitActionTriggered(false),
@@ -318,6 +323,12 @@ bool PerforcePlugin::initialize(const QStringList & /* arguments */, QString * e
     connect(m_openedAction, SIGNAL(triggered()), this, SLOT(printOpenedFileList()));
     mperforce->addAction(command);
 
+    m_logProjectAction = new Utils::ParameterAction(tr("Log Project Log"), tr("Log Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
+    command = am->registerAction(m_logProjectAction, CMD_ID_PROJECTLOG, globalcontext);
+    command->setAttribute(Core::Command::CA_UpdateText);
+    connect(m_logProjectAction, SIGNAL(triggered()), this, SLOT(logProject()));
+    mperforce->addAction(command);
+
     m_submitProjectAction = new Utils::ParameterAction(tr("Submit Project"), tr("Submit Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
     command = am->registerAction(m_submitProjectAction, CMD_ID_SUBMIT, globalcontext);
     command->setAttribute(Core::Command::CA_UpdateText);
@@ -385,6 +396,16 @@ bool PerforcePlugin::initialize(const QStringList & /* arguments */, QString * e
     connect(m_filelogAction, SIGNAL(triggered()), this, SLOT(filelog()));
     mperforce->addAction(command);
 
+    tmpaction = new QAction(this);
+    tmpaction->setSeparator(true);
+    command = am->registerAction(tmpaction, QLatin1String(CMD_ID_SEPARATOR4), globalcontext);
+    mperforce->addAction(command);
+
+    m_logRepositoryAction = new QAction(tr("Repository Log"), this);
+    command = am->registerAction(m_logRepositoryAction, CMD_ID_REPOSITORYLOG, globalcontext);
+    connect(m_logRepositoryAction, SIGNAL(triggered()), this, SLOT(logRepository()));
+    mperforce->addAction(command);
+
     m_updateAllAction = new QAction(tr("Update All"), this);
     command = am->registerAction(m_updateAllAction, CMD_ID_UPDATEALL, globalcontext);
     connect(m_updateAllAction, SIGNAL(triggered()), this, SLOT(updateAll()));
@@ -715,8 +736,6 @@ void PerforcePlugin::annotate(const QString &workingDir,
         Core::IEditor *ed = showOutputInEditor(tr("p4 annotate %1").arg(id),
                                                result.stdOut, VCSBase::AnnotateOutput,
                                                source, codec);
-        connect(ed, SIGNAL(annotatePreviousRequested(QString,QString,int)),
-                this, SLOT(annotateVersion(QString,QString,int)));
         VCSBase::VCSBaseEditor::gotoLineOfEditor(ed, lineNumber);
     }
 }
@@ -725,7 +744,7 @@ void PerforcePlugin::filelogCurrentFile()
 {
     const VCSBase::VCSBasePluginState state = currentState();
     QTC_ASSERT(state.hasFile(), return)
-    filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()));
+    filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()), true);
 }
 
 void PerforcePlugin::filelog()
@@ -737,21 +756,40 @@ void PerforcePlugin::filelog()
     }
 }
 
-void PerforcePlugin::filelog(const QString &workingDir, const QStringList &fileNames)
+void PerforcePlugin::logProject()
+{
+    const VCSBase::VCSBasePluginState state = currentState();
+    QTC_ASSERT(state.hasProject(), return)
+    filelog(state.currentProjectTopLevel(), perforceRelativeFileArguments(state.relativeCurrentProject()));
+}
+
+void PerforcePlugin::logRepository()
+{
+    const VCSBase::VCSBasePluginState state = currentState();
+    QTC_ASSERT(state.hasTopLevel(), return)
+    filelog(state.topLevel(), perforceRelativeFileArguments(QStringList()));
+}
+
+void PerforcePlugin::filelog(const QString &workingDir, const QStringList &fileNames,
+                             bool enableAnnotationContextMenu)
 {
     const QString id = VCSBase::VCSBaseEditor::getTitleId(workingDir, fileNames);
     QTextCodec *codec = VCSBase::VCSBaseEditor::getCodec(workingDir, fileNames);
     QStringList args;
     args << QLatin1String("filelog") << QLatin1String("-li");
+    if (m_settings.logCount() > 0)
+        args << QLatin1String("-m") << QString::number(m_settings.logCount());
     args.append(fileNames);
     const PerforceResponse result = runP4Cmd(workingDir, args,
                                              CommandToWindow|StdErrToWindow|ErrorToWindow,
                                              QStringList(), QByteArray(), codec);
-    if (!result.error)
-        showOutputInEditor(tr("p4 filelog %1").arg(id), result.stdOut,
-                           VCSBase::LogOutput,
-                           VCSBase::VCSBaseEditor::getSource(workingDir, fileNames),
-                           codec);
+    if (!result.error) {
+        const QString source = VCSBase::VCSBaseEditor::getSource(workingDir, fileNames);
+        Core::IEditor *editor = showOutputInEditor(tr("p4 filelog %1").arg(id), result.stdOut,
+                                VCSBase::LogOutput, source, codec);
+        if (enableAnnotationContextMenu)
+            VCSBase::VCSBaseEditor::getVcsBaseEditor(editor)->setFileLogAnnotateEnabled(true);
+    }
 }
 
 void PerforcePlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as)
@@ -759,6 +797,8 @@ void PerforcePlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as)
     if (!VCSBase::VCSBasePlugin::enableMenuAction(as, m_menuAction))
         return;
 
+    m_logRepositoryAction->setEnabled(currentState().hasTopLevel());
+
     const QString fileName = currentState().currentFileName();
     m_editAction->setParameter(fileName);
     m_addAction->setParameter(fileName);
@@ -769,6 +809,7 @@ void PerforcePlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as)
     m_filelogCurrentAction->setParameter(fileName);
 
     const QString projectName = currentState().currentProjectName();
+    m_logProjectAction->setParameter(projectName);
     m_updateProjectAction->setParameter(projectName);
     m_diffProjectAction->setParameter(projectName);
     m_submitProjectAction->setParameter(projectName);
@@ -1110,6 +1151,8 @@ Core::IEditor * PerforcePlugin::showOutputInEditor(const QString& title, const Q
         qDebug() << "PerforcePlugin::showOutputInEditor" << title << kind <<  "Size= " << output.size() <<  " Type=" << editorType << debugCodec(codec);
     QString s = title;
     Core::IEditor *editor = Core::EditorManager::instance()->openEditorWithContents(kind, &s, output);
+    connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,int)),
+            this, SLOT(annotateVersion(QString,QString,int)));
     PerforceEditor *e = qobject_cast<PerforceEditor*>(editor->widget());
     if (!e)
         return 0;
diff --git a/src/plugins/perforce/perforceplugin.h b/src/plugins/perforce/perforceplugin.h
index b0b4c947e953d45a0b77e27a0055f4ccfaf2f90e..8f7c3819e495bb7e15cabc096eda8e06e9eebfb1 100644
--- a/src/plugins/perforce/perforceplugin.h
+++ b/src/plugins/perforce/perforceplugin.h
@@ -123,6 +123,8 @@ private slots:
     void annotateVersion(const QString &file, const QString &revision, int lineNumber);
     void filelogCurrentFile();
     void filelog();
+    void logProject();
+    void logRepository();
 
     void submitCurrentLog();
     void printPendingChanges();
@@ -177,7 +179,8 @@ private:
     QString clientFilePath(const QString &serverFilePath);
     void annotate(const QString &workingDir, const QString &fileName,
                   const QString &changeList = QString(), int lineNumber = -1);
-    void filelog(const QString &workingDir, const QStringList &fileNames);
+    void filelog(const QString &workingDir, const QStringList &fileNames = QStringList(),
+                 bool enableAnnotationContextMenu = false);
     void cleanCommitMessageFile();
     bool isCommitEditorOpen() const;
     QSharedPointer<QTemporaryFile> createTemporaryArgumentFile(const QStringList &extraArgs) const;
@@ -208,6 +211,8 @@ private:
     QAction *m_annotateAction;
     Utils::ParameterAction *m_filelogCurrentAction;
     QAction *m_filelogAction;
+    Utils::ParameterAction *m_logProjectAction;
+    QAction *m_logRepositoryAction;
     QAction *m_submitCurrentLogAction;
     QAction *m_updateAllAction;
     bool m_submitActionTriggered;
diff --git a/src/plugins/perforce/perforcesettings.cpp b/src/plugins/perforce/perforcesettings.cpp
index f50fbe72dc84552161eb68e9bc1bb68cb0323f6b..149e895f1727405c0856bf543fc4faca1e8b1025 100644
--- a/src/plugins/perforce/perforcesettings.cpp
+++ b/src/plugins/perforce/perforcesettings.cpp
@@ -47,8 +47,9 @@ static const char *clientKeyC = "Client";
 static const char *userKeyC = "User";
 static const char *promptToSubmitKeyC = "PromptForSubmit";
 static const char *timeOutKeyC = "TimeOut";
+static const char *logCountKeyC = "LogCount";
 
-enum { defaultTimeOutS = 30 };
+enum { defaultTimeOutS = 30, defaultLogCount = 1000 };
 
 static QString defaultCommand()
 {
@@ -64,6 +65,7 @@ namespace Perforce {
 namespace Internal {
 
 Settings::Settings() :
+    logCount(defaultLogCount),
     defaultEnv(true),
     timeOutS(defaultTimeOutS),
     promptToSubmit(true)
@@ -73,6 +75,7 @@ Settings::Settings() :
 bool Settings::equals(const Settings &rhs) const
 {
     return defaultEnv == rhs.defaultEnv
+            && logCount == rhs.logCount
             && p4Command == rhs.p4Command && p4Port == rhs.p4Port
             && p4Client == rhs.p4Client && p4User == rhs.p4User
             && timeOutS == rhs.timeOutS && promptToSubmit == rhs.promptToSubmit;
@@ -111,6 +114,7 @@ void PerforceSettings::fromSettings(QSettings *settings)
     m_settings.p4User = settings->value(QLatin1String(userKeyC), QString()).toString();
     m_settings.timeOutS = settings->value(QLatin1String(timeOutKeyC), defaultTimeOutS).toInt();
     m_settings.promptToSubmit = settings->value(QLatin1String(promptToSubmitKeyC), true).toBool();
+    m_settings.logCount = settings->value(QLatin1String(logCountKeyC), int(defaultLogCount)).toInt();
     settings->endGroup();
 }
 
@@ -124,6 +128,7 @@ void PerforceSettings::toSettings(QSettings *settings) const
     settings->setValue(QLatin1String(userKeyC), m_settings.p4User);
     settings->setValue(QLatin1String(timeOutKeyC), m_settings.timeOutS);
     settings->setValue(QLatin1String(promptToSubmitKeyC), m_settings.promptToSubmit);
+    settings->setValue(QLatin1String(logCountKeyC), m_settings.logCount);
     settings->endGroup();
 }
 
diff --git a/src/plugins/perforce/perforcesettings.h b/src/plugins/perforce/perforcesettings.h
index feeae3f26821bca8e9bf9e8df26c2a0fbae63f4d..2cf8cb978dfcfdec957874ebab972372ef3d68a0 100644
--- a/src/plugins/perforce/perforcesettings.h
+++ b/src/plugins/perforce/perforcesettings.h
@@ -57,6 +57,7 @@ struct Settings {
     QString p4Client;
     QString p4User;
     QString errorString;
+    int logCount;
     bool defaultEnv;
     int timeOutS;
     bool promptToSubmit;
@@ -97,6 +98,8 @@ public:
     inline int timeOutMS()     const { return m_settings.timeOutS * 1000;  }
     inline int longTimeOutMS() const { return m_settings.timeOutS * 10000; }
 
+    inline int logCount() const { return m_settings.logCount; }
+
     QString topLevel() const;
     QString topLevelSymLinkTarget() const;
 
diff --git a/src/plugins/perforce/settingspage.cpp b/src/plugins/perforce/settingspage.cpp
index 456a049805a06474f8752deb92dfc1401a42d501..793697bc42be7d39c5e1624e7da1b75487b82d41 100644
--- a/src/plugins/perforce/settingspage.cpp
+++ b/src/plugins/perforce/settingspage.cpp
@@ -82,6 +82,7 @@ Settings SettingsPageWidget::settings() const
     settings.p4User = m_ui.userLineEdit->text();
     settings.p4Client=  m_ui.clientLineEdit->text();
     settings.timeOutS = m_ui.timeOutSpinBox->value();
+    settings.logCount = m_ui.logCountSpinBox->value();
     settings.promptToSubmit = m_ui.promptToSubmitCheckBox->isChecked();
     return settings;
 }
@@ -93,6 +94,7 @@ void SettingsPageWidget::setSettings(const PerforceSettings &s)
     m_ui.portLineEdit->setText(s.p4Port());
     m_ui.clientLineEdit->setText(s.p4Client());
     m_ui.userLineEdit->setText(s.p4User());
+    m_ui.logCountSpinBox->setValue(s.logCount());
     m_ui.timeOutSpinBox->setValue(s.timeOutS());
     m_ui.promptToSubmitCheckBox->setChecked(s.promptToSubmit());
 }
diff --git a/src/plugins/perforce/settingspage.ui b/src/plugins/perforce/settingspage.ui
index a81afdc3e766877a7dd36c898a3e93aa1ddae482..dcdd04c0833e6112b611e7f477373464198e2485 100644
--- a/src/plugins/perforce/settingspage.ui
+++ b/src/plugins/perforce/settingspage.ui
@@ -90,21 +90,17 @@
       <string>Miscellaneous</string>
      </property>
      <layout class="QFormLayout" name="formLayout_2">
-      <item row="1" column="0" colspan="2">
-       <widget class="QCheckBox" name="promptToSubmitCheckBox">
-        <property name="text">
-         <string>Prompt on submit</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="0">
+      <property name="fieldGrowthPolicy">
+       <enum>QFormLayout::ExpandingFieldsGrow</enum>
+      </property>
+      <item row="1" column="0">
        <widget class="QLabel" name="timeOutLabel">
         <property name="text">
          <string>Timeout:</string>
         </property>
        </widget>
       </item>
-      <item row="0" column="1">
+      <item row="1" column="1">
        <widget class="QSpinBox" name="timeOutSpinBox">
         <property name="suffix">
          <string>s</string>
@@ -117,6 +113,27 @@
         </property>
        </widget>
       </item>
+      <item row="2" column="0" colspan="2">
+       <widget class="QCheckBox" name="promptToSubmitCheckBox">
+        <property name="text">
+         <string>Prompt on submit</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="0">
+       <widget class="QLabel" name="logCountLabel">
+        <property name="text">
+         <string>Log count:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QSpinBox" name="logCountSpinBox">
+        <property name="maximum">
+         <number>10000</number>
+        </property>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>
diff --git a/src/plugins/subversion/settingspage.cpp b/src/plugins/subversion/settingspage.cpp
index 5976c9bdd987ce6d9e45c28f3355daa9f800b56e..6fb8352c53c202fa82524cfb40d454f15e8e2d8e 100644
--- a/src/plugins/subversion/settingspage.cpp
+++ b/src/plugins/subversion/settingspage.cpp
@@ -63,6 +63,7 @@ SubversionSettings SettingsPageWidget::settings() const
         rc.useAuthentication = false;
     rc.promptToSubmit = m_ui.promptToSubmitCheckBox->isChecked();
     rc.spaceIgnorantAnnotation = m_ui.spaceIgnorantAnnotationCheckBox->isChecked();
+    rc.logCount = m_ui.logCountSpinBox->value();
     return rc;
 }
 
@@ -75,6 +76,7 @@ void SettingsPageWidget::setSettings(const SubversionSettings &s)
     m_ui.timeOutSpinBox->setValue(s.timeOutS);
     m_ui.promptToSubmitCheckBox->setChecked(s.promptToSubmit);
     m_ui.spaceIgnorantAnnotationCheckBox->setChecked(s.spaceIgnorantAnnotation);
+    m_ui.logCountSpinBox->setValue(s.logCount);
 }
 
 QString SettingsPageWidget::searchKeywords() const
diff --git a/src/plugins/subversion/settingspage.ui b/src/plugins/subversion/settingspage.ui
index d74fa3c839616b9f40fe3e1bc01de6041b85a65b..861f81902f6d862bf8fe96daa7fba32b854ef001 100644
--- a/src/plugins/subversion/settingspage.ui
+++ b/src/plugins/subversion/settingspage.ui
@@ -2,14 +2,6 @@
 <ui version="4.0">
  <class>Subversion::Internal::SettingsPage</class>
  <widget class="QWidget" name="Subversion::Internal::SettingsPage">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>496</width>
-    <height>295</height>
-   </rect>
-  </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QGroupBox" name="generalGroupBox">
@@ -72,21 +64,17 @@
       <string>Miscellaneous</string>
      </property>
      <layout class="QFormLayout" name="formLayout_2">
-      <item row="1" column="0" colspan="2">
-       <widget class="QCheckBox" name="promptToSubmitCheckBox">
-        <property name="text">
-         <string>Prompt on submit</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="0">
+      <property name="fieldGrowthPolicy">
+       <enum>QFormLayout::ExpandingFieldsGrow</enum>
+      </property>
+      <item row="1" column="0">
        <widget class="QLabel" name="timeOutLabel">
         <property name="text">
          <string>Timeout:</string>
         </property>
        </widget>
       </item>
-      <item row="0" column="1">
+      <item row="1" column="1">
        <widget class="QSpinBox" name="timeOutSpinBox">
         <property name="suffix">
          <string>s</string>
@@ -100,12 +88,33 @@
        </widget>
       </item>
       <item row="2" column="0" colspan="2">
+       <widget class="QCheckBox" name="promptToSubmitCheckBox">
+        <property name="text">
+         <string>Prompt on submit</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0" colspan="2">
        <widget class="QCheckBox" name="spaceIgnorantAnnotationCheckBox">
         <property name="text">
          <string>Ignore whitespace changes in annotation</string>
         </property>
        </widget>
       </item>
+      <item row="0" column="0">
+       <widget class="QLabel" name="logCountLabel">
+        <property name="text">
+         <string>Log count:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QSpinBox" name="logCountSpinBox">
+        <property name="maximum">
+         <number>10000</number>
+        </property>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>
diff --git a/src/plugins/subversion/subversioneditor.cpp b/src/plugins/subversion/subversioneditor.cpp
index 04eeebf2707aa94149d5b0fd5479c3275ddf5550..1a6ae8177921ff6508964a561056596d11d462a1 100644
--- a/src/plugins/subversion/subversioneditor.cpp
+++ b/src/plugins/subversion/subversioneditor.cpp
@@ -51,6 +51,7 @@ SubversionEditor::SubversionEditor(const VCSBase::VCSBaseEditorParameters *type,
 {
     QTC_ASSERT(m_changeNumberPattern.isValid(), return);
     QTC_ASSERT(m_revisionNumberPattern.isValid(), return);
+    setAnnotateRevisionTextFormat(tr("Annotate revision \"%1\""));
 }
 
 QSet<QString> SubversionEditor::annotationChanges() const
@@ -138,12 +139,11 @@ QString SubversionEditor::fileNameFromDiffSpecification(const QTextBlock &inBloc
     return QString();
 }
 
-QStringList SubversionEditor::annotationPreviousVersions(const QString &v, QString *actionTextFormat) const
+QStringList SubversionEditor::annotationPreviousVersions(const QString &v) const
 {
     bool ok;
     const int revision = v.toInt(&ok);
     if (!ok || revision < 2)
         return QStringList();
-    *actionTextFormat = tr("Annotate revision \"%1\"");
     return QStringList(QString::number(revision - 1));
 }
diff --git a/src/plugins/subversion/subversioneditor.h b/src/plugins/subversion/subversioneditor.h
index cbf276e229f3dab4cfe4898a911d0b05ef4166c3..3c573a9f0161106b348fc7eb9d4955878e20d039 100644
--- a/src/plugins/subversion/subversioneditor.h
+++ b/src/plugins/subversion/subversioneditor.h
@@ -51,7 +51,7 @@ private:
     virtual VCSBase::DiffHighlighter *createDiffHighlighter() const;
     virtual VCSBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes) const;
     virtual QString fileNameFromDiffSpecification(const QTextBlock &diffFileName) const;
-    virtual QStringList annotationPreviousVersions(const QString &, QString *actionTextFormat) const;
+    virtual QStringList annotationPreviousVersions(const QString &) const;
 
     const QRegExp m_changeNumberPattern;
     const QRegExp m_revisionNumberPattern;
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index a3029043566a2d859ef6268417e8c2e40bc1af45..2404a202022541c6c87b5552b9f322d78fd411cb 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -85,7 +85,10 @@ static const char * const CMD_ID_SEPARATOR2         = "Subversion.Separator2";
 static const char * const CMD_ID_FILELOG_CURRENT    = "Subversion.FilelogCurrent";
 static const char * const CMD_ID_ANNOTATE_CURRENT   = "Subversion.AnnotateCurrent";
 static const char * const CMD_ID_SEPARATOR3         = "Subversion.Separator3";
+static const char * const CMD_ID_SEPARATOR4         = "Subversion.Separator4";
 static const char * const CMD_ID_STATUS             = "Subversion.Status";
+static const char * const CMD_ID_PROJECTLOG         = "Subversion.ProjectLog";
+static const char * const CMD_ID_REPOSITORYLOG      = "Subversion.RepositoryLog";
 static const char * const CMD_ID_UPDATE             = "Subversion.Update";
 static const char * const CMD_ID_DESCRIBE           = "Subversion.Describe";
 
@@ -179,6 +182,8 @@ SubversionPlugin::SubversionPlugin() :
     m_revertAction(0),
     m_diffProjectAction(0),
     m_diffCurrentAction(0),
+    m_logProjectAction(0),
+    m_logRepositoryAction(0),
     m_commitAllAction(0),
     m_commitCurrentAction(0),
     m_filelogCurrentAction(0),
@@ -361,12 +366,24 @@ bool SubversionPlugin::initialize(const QStringList & /*arguments */, QString *e
     connect(m_statusProjectAction, SIGNAL(triggered()), this, SLOT(projectStatus()));
     subversionMenu->addAction(command);
 
+    m_logProjectAction = new Utils::ParameterAction(tr("Log Project Log"), tr("Log Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
+    command = ami->registerAction(m_logProjectAction, CMD_ID_PROJECTLOG, globalcontext);
+    command->setAttribute(Core::Command::CA_UpdateText);
+    connect(m_logProjectAction, SIGNAL(triggered()), this, SLOT(logProject()));
+    subversionMenu->addAction(command);
+
     m_updateProjectAction = new Utils::ParameterAction(tr("Update Project"), tr("Update Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this);
     command = ami->registerAction(m_updateProjectAction, CMD_ID_UPDATE, globalcontext);
     connect(m_updateProjectAction, SIGNAL(triggered()), this, SLOT(updateProject()));
     command->setAttribute(Core::Command::CA_UpdateText);
     subversionMenu->addAction(command);
 
+    subversionMenu->addAction(createSeparator(this, ami, CMD_ID_SEPARATOR4, globalcontext));
+    m_logRepositoryAction = new QAction(tr("Repository Log"), this);
+    command = ami->registerAction(m_logRepositoryAction, CMD_ID_REPOSITORYLOG, globalcontext);
+    connect(m_logRepositoryAction, SIGNAL(triggered()), this, SLOT(logRepository()));
+    subversionMenu->addAction(command);
+
     // Actions of the submit editor
     QList<int> svncommitcontext;
     svncommitcontext << Core::UniqueIDManager::instance()->uniqueIdentifier(Constants::SUBVERSIONCOMMITEDITOR);
@@ -504,10 +521,13 @@ void SubversionPlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as)
     if (!VCSBase::VCSBasePlugin::enableMenuAction(as, m_menuAction))
         return;
 
+    m_logRepositoryAction->setEnabled(currentState().hasTopLevel());
+
     const QString projectName = currentState().currentProjectName();
     m_diffProjectAction->setParameter(projectName);
     m_statusProjectAction->setParameter(projectName);
     m_updateProjectAction->setParameter(projectName);
+    m_logProjectAction->setParameter(projectName);
 
     const bool repoEnabled = currentState().hasTopLevel();
     m_commitAllAction->setEnabled(repoEnabled);
@@ -662,14 +682,32 @@ void SubversionPlugin::filelogCurrentFile()
 {
     const VCSBase::VCSBasePluginState state = currentState();
     QTC_ASSERT(state.hasFile(), return)
-   filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()));
+   filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()), true);
+}
+
+void SubversionPlugin::logProject()
+{
+    const VCSBase::VCSBasePluginState state = currentState();
+    QTC_ASSERT(state.hasProject(), return)
+    filelog(state.currentProjectTopLevel(), state.relativeCurrentProject());
+}
+
+void SubversionPlugin::logRepository()
+{
+    const VCSBase::VCSBasePluginState state = currentState();
+    QTC_ASSERT(state.hasTopLevel(), return)
+    filelog(state.topLevel());
 }
 
-void SubversionPlugin::filelog(const QString &workingDir, const QStringList &files)
+void SubversionPlugin::filelog(const QString &workingDir,
+                               const QStringList &files,
+                               bool enableAnnotationContextMenu)
 {
     QTextCodec *codec = VCSBase::VCSBaseEditor::getCodec(workingDir, files);
     // no need for temp file
     QStringList args(QLatin1String("log"));
+    if (m_settings.logCount > 0)
+        args << QLatin1String("-l") << QString::number(m_settings.logCount);
     foreach(const QString &file, files)
         args.append(QDir::toNativeSeparators(file));
 
@@ -689,6 +727,8 @@ void SubversionPlugin::filelog(const QString &workingDir, const QStringList &fil
         const QString source = VCSBase::VCSBaseEditor::getSource(workingDir, files);
         Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::LogOutput, source, codec);
         newEditor->setProperty("logFileName", id);
+        if (enableAnnotationContextMenu)
+            VCSBase::VCSBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true);
     }
 }
 
@@ -753,8 +793,6 @@ void SubversionPlugin::annotate(const QString &workingDir, const QString &file,
     } else {
         const QString title = QString::fromLatin1("svn annotate %1").arg(id);
         Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::AnnotateOutput, source, codec);
-        connect(newEditor, SIGNAL(annotatePreviousRequested(QString,QString,int)),
-                this, SLOT(annotateVersion(QString,QString,int)));
         newEditor->setProperty("annotateFileName", id);
         VCSBase::VCSBaseEditor::gotoLineOfEditor(newEditor, lineNumber);
     }
@@ -939,6 +977,8 @@ Core::IEditor * SubversionPlugin::showOutputInEditor(const QString& title, const
         qDebug() << "SubversionPlugin::showOutputInEditor" << title << kind <<  "Size= " << output.size() <<  " Type=" << editorType << debugCodec(codec);
     QString s = title;
     Core::IEditor *editor = Core::EditorManager::instance()->openEditorWithContents(kind, &s, output);
+    connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,int)),
+            this, SLOT(annotateVersion(QString,QString,int)));
     SubversionEditor *e = qobject_cast<SubversionEditor*>(editor->widget());
     if (!e)
         return 0;
diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h
index b4aeda858a86936e654e8e7556e58c5d26285aab..3a7e3bfb4867e9569005c9136eb09871839889ff 100644
--- a/src/plugins/subversion/subversionplugin.h
+++ b/src/plugins/subversion/subversionplugin.h
@@ -111,7 +111,8 @@ private slots:
     void updateProject();
     void submitCurrentLog();
     void diffCommitFiles(const QStringList &);
-
+    void logProject();
+    void logRepository();
 
 protected:
     virtual void updateActions(VCSBase::VCSBasePlugin::ActionState);
@@ -127,7 +128,9 @@ private:
                               bool showStdOutInOutputWindow, QTextCodec *outputCodec = 0);
     void annotate(const QString &workingDir, const QString &file,
                   const QString &revision = QString(), int lineNumber = -1);
-    void filelog(const QString &workingDir, const QStringList &file = QStringList());
+    void filelog(const QString &workingDir,
+                 const QStringList &file = QStringList(),
+                 bool enableAnnotationContextMenu = false);
     bool managesDirectory(const QDir &directory) const;
     QString findTopLevelForDirectoryI(const QString &directory) const;
     void startCommit(const QString &workingDir, const QStringList &files = QStringList());
@@ -146,6 +149,8 @@ private:
     Utils::ParameterAction *m_revertAction;
     Utils::ParameterAction *m_diffProjectAction;
     Utils::ParameterAction *m_diffCurrentAction;
+    Utils::ParameterAction *m_logProjectAction;
+    QAction *m_logRepositoryAction;
     QAction *m_commitAllAction;
     Utils::ParameterAction *m_commitCurrentAction;
     Utils::ParameterAction *m_filelogCurrentAction;
diff --git a/src/plugins/subversion/subversionsettings.cpp b/src/plugins/subversion/subversionsettings.cpp
index dd6bdc122ded957b1e7ebd5eae9720a8125b2773..8e0f06cba5e0743879916a13fccc43b273be51da 100644
--- a/src/plugins/subversion/subversionsettings.cpp
+++ b/src/plugins/subversion/subversionsettings.cpp
@@ -43,8 +43,9 @@ static const char *passwordOptionC = "--password";
 static const char *promptToSubmitKeyC = "PromptForSubmit";
 static const char *timeOutKeyC = "TimeOut";
 static const char *spaceIgnorantAnnotationKeyC = "SpaceIgnorantAnnotation";
+static const char *logCountKeyC = "LogCount";
 
-enum { defaultTimeOutS = 30 };
+enum { defaultTimeOutS = 30, defaultLogCount = 1000 };
 
 static QString defaultCommand()
 {
@@ -61,6 +62,7 @@ using namespace Subversion::Internal;
 SubversionSettings::SubversionSettings() :
     svnCommand(defaultCommand()),
     useAuthentication(false),
+    logCount(defaultLogCount),
     timeOutS(defaultTimeOutS),
     promptToSubmit(true),
     spaceIgnorantAnnotation(true)
@@ -77,6 +79,7 @@ void SubversionSettings::fromSettings(QSettings *settings)
     timeOutS = settings->value(QLatin1String(timeOutKeyC), defaultTimeOutS).toInt();
     promptToSubmit = settings->value(QLatin1String(promptToSubmitKeyC), true).toBool();
     spaceIgnorantAnnotation = settings->value(QLatin1String(spaceIgnorantAnnotationKeyC), true).toBool();
+    logCount = settings->value(QLatin1String(logCountKeyC), int(defaultLogCount)).toInt();
     settings->endGroup();
 }
 
@@ -90,6 +93,7 @@ void SubversionSettings::toSettings(QSettings *settings) const
     settings->setValue(QLatin1String(promptToSubmitKeyC), promptToSubmit);
     settings->setValue(QLatin1String(timeOutKeyC), timeOutS);
     settings->setValue(QLatin1String(spaceIgnorantAnnotationKeyC), spaceIgnorantAnnotation);
+    settings->setValue(QLatin1String(logCountKeyC), logCount);
     settings->endGroup();
 }
 
@@ -99,6 +103,7 @@ bool SubversionSettings::equals(const SubversionSettings &s) const
         && useAuthentication == s.useAuthentication
         && user              == s.user
         && password          == s.password
+        && logCount          == s.logCount
         && timeOutS          == s.timeOutS
         && promptToSubmit    == s.promptToSubmit
         && spaceIgnorantAnnotation == s.spaceIgnorantAnnotation;
diff --git a/src/plugins/subversion/subversionsettings.h b/src/plugins/subversion/subversionsettings.h
index 802c51ed35650e35316aa136f4f0352facee7f51..79c33edcb1e22dd641472a8eed1bf9ced62b2185 100644
--- a/src/plugins/subversion/subversionsettings.h
+++ b/src/plugins/subversion/subversionsettings.h
@@ -62,6 +62,7 @@ struct SubversionSettings
     bool useAuthentication;
     QString user;
     QString password;
+    int logCount;
     int timeOutS;
     bool promptToSubmit;
     bool spaceIgnorantAnnotation;
diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp
index 8cfbc6ee90d66cf4c9ae098594ffef43340ff5f3..b556835554a5f559973df4bb907deaaf04d20b20 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.cpp
+++ b/src/plugins/vcsbase/vcsbaseeditor.cpp
@@ -85,7 +85,7 @@ public:
 
 signals:
     void describeRequested(const QString &source, const QString &change);
-    void annotatePreviousRequested(const QString &source, const QString &change, int line);
+    void annotateRevisionRequested(const QString &source, const QString &change, int line);
 
 private:
     const char *m_kind;
@@ -147,11 +147,10 @@ VCSBaseDiffEditorEditable::~VCSBaseDiffEditorEditable()
 
 struct VCSBaseEditorPrivate
 {
-    VCSBaseEditorPrivate(const VCSBaseEditorParameters *type, QObject *parent);
+    VCSBaseEditorPrivate(const VCSBaseEditorParameters *type);
 
     const VCSBaseEditorParameters *m_parameters;
 
-    QAction *m_describeAction;
     QString m_currentChange;
     QString m_source;
     QString m_diffBaseDirectory;
@@ -159,25 +158,27 @@ struct VCSBaseEditorPrivate
     QRegExp m_diffFilePattern;
     QList<int> m_diffSections; // line number where this section starts
     int m_cursorLine;
+    QString m_annotateRevisionTextFormat;
+    bool m_fileLogAnnotateEnabled;
 };
 
-VCSBaseEditorPrivate::VCSBaseEditorPrivate(const VCSBaseEditorParameters *type, QObject *parent)  :
-        m_parameters(type),
-        m_describeAction(new QAction(parent)),
-        m_cursorLine(-1)
+VCSBaseEditorPrivate::VCSBaseEditorPrivate(const VCSBaseEditorParameters *type)  :
+    m_parameters(type),
+    m_cursorLine(-1),
+    m_annotateRevisionTextFormat(VCSBaseEditor::tr("Annotate \"%1\"")),
+    m_fileLogAnnotateEnabled(false)
 {
 }
 
 // ------------ VCSBaseEditor
 VCSBaseEditor::VCSBaseEditor(const VCSBaseEditorParameters *type, QWidget *parent)
   : BaseTextEditor(parent),
-    d(new VCSBaseEditorPrivate(type, this))
+    d(new VCSBaseEditorPrivate(type))
 {
     if (VCSBase::Constants::Internal::debug)
         qDebug() << "VCSBaseEditor::VCSBaseEditor" << type->type << type->kind;
 
     setReadOnly(true);
-    connect(d->m_describeAction, SIGNAL(triggered()), this, SLOT(describe()));
     viewport()->setMouseTracking(true);
     setBaseTextDocument(new Internal::VCSBaseTextDocument);
     setMimeType(QLatin1String(d->m_parameters->mimeType));
@@ -218,6 +219,26 @@ void VCSBaseEditor::setSource(const  QString &source)
     d->m_source = source;
 }
 
+QString VCSBaseEditor::annotateRevisionTextFormat() const
+{
+    return d->m_annotateRevisionTextFormat;
+}
+
+void VCSBaseEditor::setAnnotateRevisionTextFormat(const QString &f)
+{
+    d->m_annotateRevisionTextFormat = f;
+}
+
+bool VCSBaseEditor::isFileLogAnnotateEnabled() const
+{
+    return d->m_fileLogAnnotateEnabled;
+}
+
+void VCSBaseEditor::setFileLogAnnotateEnabled(bool e)
+{
+    d->m_fileLogAnnotateEnabled = e;
+}
+
 QString VCSBaseEditor::diffBaseDirectory() const
 {
     return d->m_diffBaseDirectory;
@@ -267,8 +288,8 @@ TextEditor::BaseTextEditorEditable *VCSBaseEditor::createEditableInterface()
     // Pass on signals.
     connect(this, SIGNAL(describeRequested(QString,QString)),
             editable, SIGNAL(describeRequested(QString,QString)));
-    connect(this, SIGNAL(annotatePreviousRequested(QString,QString,int)),
-            editable, SIGNAL(annotatePreviousRequested(QString,QString,int)));
+    connect(this, SIGNAL(annotateRevisionRequested(QString,QString,int)),
+            editable, SIGNAL(annotateRevisionRequested(QString,QString,int)));
     return editable;
 }
 
@@ -345,6 +366,21 @@ void VCSBaseEditor::slotDiffCursorPositionChanged()
     }
 }
 
+QAction *VCSBaseEditor::createDescribeAction(const QString &change)
+{
+    QAction *a = new QAction(tr("Describe change %1").arg(change), 0);
+    connect(a, SIGNAL(triggered()), this, SLOT(describe()));
+    return a;
+}
+
+QAction *VCSBaseEditor::createAnnotateAction(const QString &change)
+{
+    QAction *a = new QAction(d->m_annotateRevisionTextFormat.arg(change), 0);
+    a->setData(change);
+    connect(a, SIGNAL(triggered()), this, SLOT(slotAnnotateRevision()));
+    return a;
+}
+
 void VCSBaseEditor::contextMenuEvent(QContextMenuEvent *e)
 {
     QMenu *menu = createStandardContextMenu();
@@ -352,25 +388,28 @@ void VCSBaseEditor::contextMenuEvent(QContextMenuEvent *e)
     if (d->m_parameters->type == LogOutput || d->m_parameters->type == AnnotateOutput) {
         d->m_currentChange = changeUnderCursor(cursorForPosition(e->pos()));
         if (!d->m_currentChange.isEmpty()) {
-            d->m_describeAction->setText(tr("Describe change %1").arg(d->m_currentChange));
-            menu->addSeparator();
-            menu->addAction(d->m_describeAction);
-            // Offer to annotate previous changes
-            if (contentType() == AnnotateOutput) {
-                QString actionTextFormat;
-                const QStringList previousVersions = annotationPreviousVersions(d->m_currentChange, &actionTextFormat);
-                if (!previousVersions.isEmpty()) {
-                    if (actionTextFormat.isEmpty())
-                        actionTextFormat = tr("Annotate \"%1\"");
+            switch (d->m_parameters->type) {
+            case LogOutput: // Describe current / Annotate file of current
+                menu->addSeparator();
+                menu->addAction(createDescribeAction(d->m_currentChange));
+                if (d->m_fileLogAnnotateEnabled)
+                    menu->addAction(createAnnotateAction(d->m_currentChange));
+                break;
+            case AnnotateOutput: { // Describe current / annotate previous
                     menu->addSeparator();
-                    foreach(const QString &pv, previousVersions) {
-                        QAction *a = menu->addAction(actionTextFormat.arg(pv));
-                        a->setData(pv);
-                        connect(a, SIGNAL(triggered()), this, SLOT(slotAnnotatePrevious()));
-                    }
+                    menu->addAction(createDescribeAction(d->m_currentChange));
+                    const QStringList previousVersions = annotationPreviousVersions(d->m_currentChange);
+                    if (!previousVersions.isEmpty()) {
+                        menu->addSeparator();
+                        foreach(const QString &pv, previousVersions)
+                            menu->addAction(createAnnotateAction(pv));
+                    } // has previous versions
                 }
-            }
-        }
+                break;
+            default:
+                break;
+            }         // switch type
+        }             // has current change
     }
     menu->exec(e->globalPos());
     delete menu;
@@ -763,14 +802,14 @@ QString VCSBaseEditor::findDiffFile(const QString &f, Core::IVersionControl *con
     return QString();
 }
 
-void VCSBaseEditor::slotAnnotatePrevious()
+void VCSBaseEditor::slotAnnotateRevision()
 {
     if (const QAction *a = qobject_cast<const QAction *>(sender()))
-        emit annotatePreviousRequested(source(), a->data().toString(),
+        emit annotateRevisionRequested(source(), a->data().toString(),
                                        editableInterface()->currentLine());
 }
 
-QStringList VCSBaseEditor::annotationPreviousVersions(const QString &, QString *) const
+QStringList VCSBaseEditor::annotationPreviousVersions(const QString &) const
 {
     return QStringList();
 }
diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h
index 7e66e83d471ab636178d92c981a1623818af133c..4b5ace33f07d127f6a381fd5f571c72000058355 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.h
+++ b/src/plugins/vcsbase/vcsbaseeditor.h
@@ -52,15 +52,16 @@ struct VCSBaseEditorPrivate;
 class DiffHighlighter;
 class BaseAnnotationHighlighter;
 
-// Contents of a VCSBaseEditor
+// Contents of a VCSBaseEditor and its interaction.
 enum EditorContentType {
     // No special handling.
     RegularCommandOutput,
     // Log of a file under revision control. Provide  'click on change'
-    // description.
+    // description and 'Annotate' if is the log of a single file.
     LogOutput,
     // <change description>: file line
     // Color per change number and provide 'click on change' description.
+    // Context menu offers "Annotate previous version".
     AnnotateOutput,
     // Diff output. Might includes describe output, which consists of a
     // header and diffs. Interaction is 'double click in  hunk' which
@@ -89,6 +90,8 @@ class VCSBASE_EXPORT VCSBaseEditor : public TextEditor::BaseTextEditor
     Q_PROPERTY(QString source READ source WRITE setSource)
     Q_PROPERTY(QString diffBaseDirectory READ diffBaseDirectory WRITE setDiffBaseDirectory)
     Q_PROPERTY(QTextCodec *codec READ codec WRITE setCodec)
+    Q_PROPERTY(QString annotateRevisionTextFormat READ annotateRevisionTextFormat WRITE setAnnotateRevisionTextFormat)
+    Q_PROPERTY(bool isFileLogAnnotateEnabled READ isFileLogAnnotateEnabled WRITE setFileLogAnnotateEnabled)
     Q_OBJECT
 protected:
     // Initialization requires calling init() (which in turns calls
@@ -103,6 +106,15 @@ public:
     QString source() const;
     void setSource(const  QString &source);
 
+    // Format for "Annotate" revision menu entries. Should contain '%1" placeholder
+    QString annotateRevisionTextFormat() const;
+    void setAnnotateRevisionTextFormat(const QString &);
+
+    // Enable "Annotate" context menu in file log view
+    // (set to true if the source is a single file and the VCS implements it)
+    bool isFileLogAnnotateEnabled() const;
+    void setFileLogAnnotateEnabled(bool e);
+
     QTextCodec *codec() const;
     void setCodec(QTextCodec *);
 
@@ -144,15 +156,16 @@ public:
     static QString getSource(const QString &workingDirectory, const QString &fileName);
     static QString getSource(const QString &workingDirectory, const QStringList &fileNames);
     // Convenience functions to determine an title/id to identify the editor
-    // from the arguments (','-joined arguments or directory).
+    // from the arguments (','-joined arguments or directory) + revision.
     static QString getTitleId(const QString &workingDirectory,
                               const QStringList &fileNames,
                               const QString &revision = QString());
 signals:
     // These signals also exist in the opaque editable (IEditor) that is
-    // handled by the editor manager for convenience.
+    // handled by the editor manager for convenience. They are emitted
+    // for LogOutput/AnnotateOutput content types.
     void describeRequested(const QString &source, const QString &change);
-    void annotatePreviousRequested(const QString &source, const QString &change, int lineNumber);
+    void annotateRevisionRequested(const QString &source, const QString &change, int lineNumber);
 
 public slots:
     // Convenience slot to set data read from stdout, will use the
@@ -177,7 +190,7 @@ private slots:
     void slotPopulateDiffBrowser();
     void slotDiffBrowse(int);
     void slotDiffCursorPositionChanged();
-    void slotAnnotatePrevious();
+    void slotAnnotateRevision();
 
 protected:
     /* A helper that can be used to locate a file in a diff in case it
@@ -198,11 +211,12 @@ private:
     // (text cursor at position above change hunk)
     virtual QString fileNameFromDiffSpecification(const QTextBlock &diffFileSpec) const = 0;
     // Implement to return the previous version[s] of an annotation change
-    // for "Annotate previous version" and a format for the action text containing %1
-    // for the revision
-    virtual QStringList annotationPreviousVersions(const QString &revision, QString *actionTextFormat) const;
+    // for "Annotate previous version"
+    virtual QStringList annotationPreviousVersions(const QString &revision) const;
 
     void jumpToChangeFromDiff(QTextCursor cursor);
+    QAction *createDescribeAction(const QString &change);
+    QAction *createAnnotateAction(const QString &change);
 
     VCSBaseEditorPrivate *d;
 };