diff --git a/src/plugins/cvs/checkoutwizard.cpp b/src/plugins/cvs/checkoutwizard.cpp
index 7e7eb026b24651fc334548db2802488c47cd1f21..736cd9e2fc69b0c79d36bf0b6f07e59ed02f7fd7 100644
--- a/src/plugins/cvs/checkoutwizard.cpp
+++ b/src/plugins/cvs/checkoutwizard.cpp
@@ -59,19 +59,21 @@ QString CheckoutWizard::name() const
     return tr("CVS Checkout");
 }
 
-QWizardPage *CheckoutWizard::createParameterPage(const QString &path)
+QList<QWizardPage*> CheckoutWizard::createParameterPages(const QString &path)
 {
     CheckoutWizardPage *cwp = new CheckoutWizardPage;
     cwp->setPath(path);
-    return cwp;
+    QList<QWizardPage*> rc;
+    rc.push_back(cwp);
+    return rc;
 }
 
-QSharedPointer<VCSBase::AbstractCheckoutJob> CheckoutWizard::createJob(const QWizardPage *parameterPage,
+QSharedPointer<VCSBase::AbstractCheckoutJob> CheckoutWizard::createJob(const QList<QWizardPage*> &parameterPages,
                                                                     QString *checkoutPath)
 {
     // Collect parameters for the checkout command.
     // CVS does not allow for checking out into a different directory.
-    const CheckoutWizardPage *cwp = qobject_cast<const CheckoutWizardPage *>(parameterPage);
+    const CheckoutWizardPage *cwp = qobject_cast<const CheckoutWizardPage *>(parameterPages.front());
     QTC_ASSERT(cwp, return QSharedPointer<VCSBase::AbstractCheckoutJob>())
     const CVSSettings settings = CVSPlugin::cvsPluginInstance()->settings();
     const QString binary = settings.cvsCommand;
diff --git a/src/plugins/cvs/checkoutwizard.h b/src/plugins/cvs/checkoutwizard.h
index 53c7f86a96117ea367ab01c707bc8c56a4ab432a..a35eda2c25c418e0b5542eb42981c0dcef2e537e 100644
--- a/src/plugins/cvs/checkoutwizard.h
+++ b/src/plugins/cvs/checkoutwizard.h
@@ -47,8 +47,8 @@ public:
 
 protected:
     // BaseCheckoutWizard
-    virtual QWizardPage *createParameterPage(const QString &path);
-    virtual QSharedPointer<VCSBase::AbstractCheckoutJob> createJob(const QWizardPage *parameterPage,
+    virtual QList<QWizardPage*> createParameterPages(const QString &path);
+    virtual QSharedPointer<VCSBase::AbstractCheckoutJob> createJob(const QList<QWizardPage*> &parameterPage,
                                                                    QString *checkoutPath);
 };
 
diff --git a/src/plugins/git/clonewizard.cpp b/src/plugins/git/clonewizard.cpp
index 80d3112504d3b608142e43558485b4fbad35056a..03903aa4ff6560b91a8f1ed74b131455e3b198c8 100644
--- a/src/plugins/git/clonewizard.cpp
+++ b/src/plugins/git/clonewizard.cpp
@@ -60,18 +60,20 @@ QString CloneWizard::name() const
     return tr("Git Repository Clone");
 }
 
-QWizardPage *CloneWizard::createParameterPage(const QString &path)
+QList<QWizardPage*> CloneWizard::createParameterPages(const QString &path)
 {
     CloneWizardPage *cwp = new CloneWizardPage;
     cwp->setPath(path);
-    return cwp;
+    QList<QWizardPage*> rc;
+    rc.push_back(cwp);
+    return rc;
 }
 
-QSharedPointer<VCSBase::AbstractCheckoutJob> CloneWizard::createJob(const QWizardPage *parameterPage,
+QSharedPointer<VCSBase::AbstractCheckoutJob> CloneWizard::createJob(const QList<QWizardPage*> &parameterPages,
                                                                     QString *checkoutPath)
 {
     // Collect parameters for the clone command.
-    const CloneWizardPage *cwp = qobject_cast<const CloneWizardPage *>(parameterPage);
+    const CloneWizardPage *cwp = qobject_cast<const CloneWizardPage *>(parameterPages.front());
     QTC_ASSERT(cwp, return QSharedPointer<VCSBase::AbstractCheckoutJob>())
     const GitClient *client = GitPlugin::instance()->gitClient();
     QStringList args = client->binary();
diff --git a/src/plugins/git/clonewizard.h b/src/plugins/git/clonewizard.h
index 2a1c0ff3b55b4a8ba9a10a912a38c1253eed7d9b..241be32d75ab723effb18695f2f255dbd0752dd5 100644
--- a/src/plugins/git/clonewizard.h
+++ b/src/plugins/git/clonewizard.h
@@ -47,8 +47,8 @@ public:
 
 protected:
     // BaseCheckoutWizard
-    virtual QWizardPage *createParameterPage(const QString &path);
-    virtual QSharedPointer<VCSBase::AbstractCheckoutJob> createJob(const QWizardPage *parameterPage,
+    virtual QList<QWizardPage*> createParameterPages(const QString &path);
+    virtual QSharedPointer<VCSBase::AbstractCheckoutJob> createJob(const QList<QWizardPage*> &parameterPages,
                                                                    QString *checkoutPath);
 };
 
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 6b900a5d8f54f0e011181281f2c459e99f25e756..5c50e52ffdd8f4932cbfbaf62a4d9ea9aae4d31b 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -684,25 +684,6 @@ GitClient::StatusResult GitClient::gitStatus(const QString &workingDirectory,
     return StatusChanged;
 }
 
-// Filter out untracked files that are not part of the project
-static void filterUntrackedFilesOfProject(const QString &repoDir, QStringList *l)
-{
-    if (l->empty())
-        return;
-    const QStringList nativeProjectFiles = VCSBase::VCSBaseSubmitEditor::currentProjectFiles(true);
-    if (nativeProjectFiles.empty())
-        return;
-    const QDir repoDirectory(repoDir);
-    for (QStringList::iterator it = l->begin(); it != l->end(); ) {
-        const QString path = QDir::toNativeSeparators(repoDirectory.absoluteFilePath(*it));
-        if (nativeProjectFiles.contains(path)) {
-            ++it;
-        } else {
-            it = l->erase(it);
-        }
-    }
-}
-
 bool GitClient::getCommitData(const QString &workingDirectory,
                               QString *commitTemplate,
                               CommitData *d,
@@ -771,7 +752,7 @@ bool GitClient::getCommitData(const QString &workingDirectory,
         return false;
     }
     // Filter out untracked files that are not part of the project
-    filterUntrackedFilesOfProject(repoDirectory, &d->untrackedFiles);
+    VCSBase::VCSBaseSubmitEditor::filterUntrackedFilesOfProject(repoDirectory, &d->untrackedFiles);
     if (d->filesEmpty()) {
         *errorMessage = msgNoChangedFiles();
         return false;
diff --git a/src/plugins/subversion/checkoutwizard.cpp b/src/plugins/subversion/checkoutwizard.cpp
index 5285b704c3f8c42a992021249e130047fb2fc2a9..955f34a3b4e186eca69ef684b9aa5751bb149c46 100644
--- a/src/plugins/subversion/checkoutwizard.cpp
+++ b/src/plugins/subversion/checkoutwizard.cpp
@@ -59,18 +59,20 @@ QString CheckoutWizard::name() const
     return tr("Subversion Checkout");
 }
 
-QWizardPage *CheckoutWizard::createParameterPage(const QString &path)
+QList<QWizardPage*> CheckoutWizard::createParameterPages(const QString &path)
 {
     CheckoutWizardPage *cwp = new CheckoutWizardPage;
     cwp->setPath(path);
-    return cwp;
+    QList<QWizardPage*> rc;
+    rc.push_back(cwp);
+    return rc;
 }
 
-QSharedPointer<VCSBase::AbstractCheckoutJob> CheckoutWizard::createJob(const QWizardPage *parameterPage,
+QSharedPointer<VCSBase::AbstractCheckoutJob> CheckoutWizard::createJob(const QList<QWizardPage*> &parameterPages,
                                                                     QString *checkoutPath)
 {
     // Collect parameters for the checkout command.
-    const CheckoutWizardPage *cwp = qobject_cast<const CheckoutWizardPage *>(parameterPage);
+    const CheckoutWizardPage *cwp = qobject_cast<const CheckoutWizardPage *>(parameterPages.front());
     QTC_ASSERT(cwp, return QSharedPointer<VCSBase::AbstractCheckoutJob>())
     const SubversionSettings settings = SubversionPlugin::subversionPluginInstance()->settings();
     const QString binary = settings.svnCommand;
diff --git a/src/plugins/subversion/checkoutwizard.h b/src/plugins/subversion/checkoutwizard.h
index fbc9c1e1d36660ea688c658f7c99e5084f1b0d95..6b651c878882023eadaaa9c070446b1709d61f7e 100644
--- a/src/plugins/subversion/checkoutwizard.h
+++ b/src/plugins/subversion/checkoutwizard.h
@@ -47,8 +47,8 @@ public:
 
 protected:
     // BaseCheckoutWizard
-    virtual QWizardPage *createParameterPage(const QString &path);
-    virtual QSharedPointer<VCSBase::AbstractCheckoutJob> createJob(const QWizardPage *parameterPage,
+    virtual QList<QWizardPage*> createParameterPages(const QString &path);
+    virtual QSharedPointer<VCSBase::AbstractCheckoutJob> createJob(const QList<QWizardPage*> &parameterPage,
                                                                    QString *checkoutPath);
 };
 
diff --git a/src/plugins/vcsbase/basecheckoutwizard.cpp b/src/plugins/vcsbase/basecheckoutwizard.cpp
index 384fea0a05b2a102aeaddd8332deba19c212af1f..208983eb5fda502ad122d07139bb9f1f0e3ec12d 100644
--- a/src/plugins/vcsbase/basecheckoutwizard.cpp
+++ b/src/plugins/vcsbase/basecheckoutwizard.cpp
@@ -43,17 +43,17 @@
 namespace VCSBase {
 
 struct BaseCheckoutWizardPrivate {
-    BaseCheckoutWizardPrivate() : dialog(0), parameterPage(0) {}
+    BaseCheckoutWizardPrivate() : dialog(0) {}
     void clear();
 
     Internal::CheckoutWizardDialog *dialog;
-    QWizardPage *parameterPage;
+    QList<QWizardPage *> parameterPages;
     QString checkoutPath;
 };
 
 void BaseCheckoutWizardPrivate::clear()
 {
-    parameterPage = 0;
+    parameterPages.clear();
     dialog = 0;
     checkoutPath.clear();
 }
@@ -87,8 +87,8 @@ QString BaseCheckoutWizard::trCategory() const
 QStringList BaseCheckoutWizard::runWizard(const QString &path, QWidget *parent)
 {
     // Create dialog and launch
-    d->parameterPage = createParameterPage(path);
-    Internal::CheckoutWizardDialog dialog(d->parameterPage, parent);
+    d->parameterPages = createParameterPages(path);
+    Internal::CheckoutWizardDialog dialog(d->parameterPages, parent);
     d->dialog = &dialog;
     connect(&dialog, SIGNAL(progressPageShown()), this, SLOT(slotProgressPageShown()));
     dialog.setWindowTitle(name());
@@ -142,7 +142,7 @@ QString BaseCheckoutWizard::openProject(const QString &path, QString *errorMessa
 
 void BaseCheckoutWizard::slotProgressPageShown()
 {
-    const QSharedPointer<AbstractCheckoutJob> job = createJob(d->parameterPage, &(d->checkoutPath));
+    const QSharedPointer<AbstractCheckoutJob> job = createJob(d->parameterPages, &(d->checkoutPath));
     if (!job.isNull())
         d->dialog->start(job);
 }
diff --git a/src/plugins/vcsbase/basecheckoutwizard.h b/src/plugins/vcsbase/basecheckoutwizard.h
index 51ea090caf1f57f2df1abd1ab0ecfde37aaa3cb2..228e84e26243fa96fc8d6e8d554e9fce269d3cda 100644
--- a/src/plugins/vcsbase/basecheckoutwizard.h
+++ b/src/plugins/vcsbase/basecheckoutwizard.h
@@ -34,6 +34,7 @@
 #include <coreplugin/dialogs/iwizard.h>
 
 #include <QtCore/QSharedPointer>
+#include <QtCore/QList>
 
 QT_BEGIN_NAMESPACE
 class QWizardPage;
@@ -76,8 +77,8 @@ public:
     static QString openProject(const QString &path, QString *errorMessage);
 
 protected:
-    virtual QWizardPage *createParameterPage(const QString &path) = 0;
-    virtual QSharedPointer<AbstractCheckoutJob> createJob(const QWizardPage *parameterPage,
+    virtual QList<QWizardPage *> createParameterPages(const QString &path) = 0;
+    virtual QSharedPointer<AbstractCheckoutJob> createJob(const QList<QWizardPage *> &parameterPages,
                                                           QString *checkoutPath) = 0;
 
 private slots:
diff --git a/src/plugins/vcsbase/checkoutwizarddialog.cpp b/src/plugins/vcsbase/checkoutwizarddialog.cpp
index 23cac1009d878db88275ba51868bef86150347b5..30a671129a8ac9b15e0a5c86983686a3aae1d032 100644
--- a/src/plugins/vcsbase/checkoutwizarddialog.cpp
+++ b/src/plugins/vcsbase/checkoutwizarddialog.cpp
@@ -39,16 +39,17 @@
 namespace VCSBase {
 namespace Internal {
 
-enum PageId { ParameterPageId, ProgressPageId };
-
-CheckoutWizardDialog::CheckoutWizardDialog(QWizardPage *parameterPage,
+CheckoutWizardDialog::CheckoutWizardDialog(const QList<QWizardPage *> &parameterPages,
                                            QWidget *parent) :
     QWizard(parent),
-    m_progressPage(new CheckoutProgressWizardPage)
+    m_progressPage(new CheckoutProgressWizardPage),
+    m_progressPageId(-1)
 {
     setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
-    setPage(ParameterPageId, parameterPage);
-    setPage(ProgressPageId, m_progressPage);
+    foreach(QWizardPage *wp, parameterPages)
+        addPage(wp);
+    m_progressPageId = parameterPages.size();
+    setPage(m_progressPageId, m_progressPage);
     connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(slotPageChanged(int)));
     connect(m_progressPage, SIGNAL(terminated(bool)), this, SLOT(slotTerminated(bool)));
     Core::BaseFileWizard::setupWizard(this);
@@ -56,7 +57,7 @@ CheckoutWizardDialog::CheckoutWizardDialog(QWizardPage *parameterPage,
 
 void CheckoutWizardDialog::slotPageChanged(int id)
 {
-    if (id == ProgressPageId)
+    if (id == m_progressPageId)
         emit progressPageShown();
 }
 
@@ -74,15 +75,10 @@ void CheckoutWizardDialog::start(const QSharedPointer<AbstractCheckoutJob> &job)
     button(QWizard::BackButton)->setEnabled(false);
 }
 
-const QWizardPage *CheckoutWizardDialog::parameterPage() const
-{
-    return page(ParameterPageId);
-}
-
 void CheckoutWizardDialog::reject()
 {
     // First click kills, 2nd closes
-    if (currentId() == ProgressPageId && m_progressPage->isRunning()) {
+    if (currentId() == m_progressPageId && m_progressPage->isRunning()) {
         m_progressPage->terminate();
     } else {
         QWizard::reject();
diff --git a/src/plugins/vcsbase/checkoutwizarddialog.h b/src/plugins/vcsbase/checkoutwizarddialog.h
index 624cacf03b5142854df00a037a4f8b135331ca99..a05c6e7a8e457892b4803e635fea77e5d5171cab 100644
--- a/src/plugins/vcsbase/checkoutwizarddialog.h
+++ b/src/plugins/vcsbase/checkoutwizarddialog.h
@@ -31,6 +31,7 @@
 #define CHECKOUTWIZARDDIALOG_H
 
 #include <QtCore/QSharedPointer>
+#include <QtCore/QList>
 #include <QtGui/QWizard>
 
 namespace VCSBase {
@@ -46,11 +47,10 @@ class CheckoutProgressWizardPage;
 class CheckoutWizardDialog : public QWizard {
     Q_OBJECT
 public:
-    CheckoutWizardDialog(QWizardPage *parameterPage,
+    CheckoutWizardDialog(const QList<QWizardPage *> &parameterPages,
                          QWidget *parent = 0);
 
     void start(const QSharedPointer<AbstractCheckoutJob> &job);
-    const QWizardPage *parameterPage() const;
 
 signals:
     void progressPageShown();
@@ -62,6 +62,7 @@ private slots:
 
 private:
     CheckoutProgressWizardPage *m_progressPage;
+    int m_progressPageId;
 };
 
 } // namespace Internal
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
index baf2fdda70c9a739256c0c0ea79508a0c987c8dc..0e7b369d11eebef0ea134fbb20c996eab7ad2e2f 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
@@ -576,6 +576,7 @@ QIcon VCSBaseSubmitEditor::submitIcon()
     return QIcon(QLatin1String(":/vcsbase/images/submit.png"));
 }
 
+// Compile a list if files in the current projects. TODO: Recurse down qrc files?
 QStringList VCSBaseSubmitEditor::currentProjectFiles(bool nativeSeparators, QString *name)
 {
     using namespace ProjectExplorer;
@@ -606,6 +607,26 @@ QStringList VCSBaseSubmitEditor::currentProjectFiles(bool nativeSeparators, QStr
     return files;
 }
 
+// Reduce a list of untracked files reported by a VCS down to the files
+// that are actually part of the current project(s).
+void VCSBaseSubmitEditor::filterUntrackedFilesOfProject(const QString &repositoryDirectory, QStringList *untrackedFiles)
+{
+    if (untrackedFiles->empty())
+        return;
+    const QStringList nativeProjectFiles = VCSBase::VCSBaseSubmitEditor::currentProjectFiles(true);
+    if (nativeProjectFiles.empty())
+        return;
+    const QDir repoDir(repositoryDirectory);
+    for (QStringList::iterator it = untrackedFiles->begin(); it != untrackedFiles->end(); ) {
+        const QString path = QDir::toNativeSeparators(repoDir.absoluteFilePath(*it));
+        if (nativeProjectFiles.contains(path)) {
+            ++it;
+        } else {
+            it = untrackedFiles->erase(it);
+        }
+    }
+}
+
 // Helper to raise an already open submit editor to prevent opening twice.
 bool VCSBaseSubmitEditor::raiseSubmitEditor()
 {
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.h b/src/plugins/vcsbase/vcsbasesubmiteditor.h
index 54d862f69cf4903ac672d95059b45c9d7fa619e2..6c5d05ad7ecea4a1875ab1d25af5e8e5332493d6 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.h
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.h
@@ -162,6 +162,10 @@ public:
     // be restricted to them
     static QStringList currentProjectFiles(bool nativeSeparators, QString *name = 0);
 
+    // Reduce a list of untracked files reported by a VCS down to the files
+    // that are actually part of the current project(s).
+    static void filterUntrackedFilesOfProject(const QString &repositoryDirectory, QStringList *untrackedFiles);
+
     virtual bool isTemporary() const { return true; }
 
     // Helper to raise an already open submit editor to prevent opening twice.