diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp
index 2e15c6a8cd5dbd5f2aac0771eee440b0db1ca8a3..205cf76021d75a249b018178a53643b6442e1772 100644
--- a/src/plugins/mercurial/mercurialclient.cpp
+++ b/src/plugins/mercurial/mercurialclient.cpp
@@ -515,12 +515,19 @@ void MercurialClient::update(const QString &repositoryRoot, const QString &revis
 }
 
 void MercurialClient::commit(const QString &repositoryRoot, const QStringList &files,
-                             const QString &committerInfo, const QString &commitMessageFile)
+                             const QString &committerInfo, const QString &commitMessageFile,
+                             bool autoAddRemove)
 {
+    // refuse to do "autoadd" on a commit with working directory only, as this will
+    // add all the untracked stuff.
+    QTC_ASSERT(!(autoAddRemove && files.isEmpty()), return)
     QStringList args(QLatin1String("commit"));
     if (!committerInfo.isEmpty())
         args << QLatin1String("-u") << committerInfo;
-    args << QLatin1String("-l") << commitMessageFile << files;
+    args << QLatin1String("-l") << commitMessageFile;
+    if (autoAddRemove)
+        args << QLatin1String("-A");
+    args << files;
     QSharedPointer<HgTask> job(new HgTask(repositoryRoot, args, false));
     enqueueJob(job);
 }
diff --git a/src/plugins/mercurial/mercurialclient.h b/src/plugins/mercurial/mercurialclient.h
index 53fc0e58d0c135f10567746d4ceb99c451a510dc..8dbfb073c9c67d2aa972344e3b782a8bcf1ccca0 100644
--- a/src/plugins/mercurial/mercurialclient.h
+++ b/src/plugins/mercurial/mercurialclient.h
@@ -89,8 +89,11 @@ public:
     void revertFile(const QString &workingDir, const QString &file, const QString &revision = QString());
     void revertRepository(const QString &workingDir, const QString &revision = QString());
     void update(const QString &repositoryRoot, const QString &revision = QString());
-    void commit(const QString &repositoryRoot, const QStringList &files,
-                const QString &commiterInfo, const QString &commitMessageFile);
+    void commit(const QString &repositoryRoot,
+                const QStringList &files,
+                const QString &commiterInfo,
+                const QString &commitMessageFile,
+                bool autoAddRemove = false);
 
     static QString findTopLevelForFile(const QFileInfo &file);
 
diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp
index 009d44375c69300a3d268e113567b3bcb1e3e830..6da681bc283f5a5b756659590cacf4815411dd61 100644
--- a/src/plugins/mercurial/mercurialplugin.cpp
+++ b/src/plugins/mercurial/mercurialplugin.cpp
@@ -634,7 +634,7 @@ bool MercurialPlugin::submitEditorAboutToClose(VCSBase::VCSBaseSubmitEditor *sub
         core->fileManager()->unblockFileChange(editorFile);
 
         m_client->commit(commitEditor->repoRoot(), files, commitEditor->committerInfo(),
-                       editorFile->fileName());
+                       editorFile->fileName(), true);
     }
     return true;
 }