diff --git a/share/qtcreator/externaltools/lrelease.xml b/share/qtcreator/externaltools/lrelease.xml
index 5629ca3950857f02a2ebf7617a5b86822c6cdc00..86b05343c4c2218b162e9f9fa604a0db1f1e57d5 100644
--- a/share/qtcreator/externaltools/lrelease.xml
+++ b/share/qtcreator/externaltools/lrelease.xml
@@ -29,7 +29,7 @@
 **
 **************************************************************************/
 -->
-<externaltool>
+<externaltool id="lrelease">
     <description>Creates qm translation files that can be used by an application from the translator's ts files</description>
     <description xml:lang="de">Erstellt die von Anwendungen nutzbaren qm-Dateien aus ts-Dateien von Ãœbersetzern</description>
     <displayname>Release translations (lrelease)</displayname>
diff --git a/share/qtcreator/externaltools/lupdate.xml b/share/qtcreator/externaltools/lupdate.xml
index 1ee57cd71e4cb40da250da9381900931141d2c7a..ba8b05053ac135bc3d99aee60a308914f9d73024 100644
--- a/share/qtcreator/externaltools/lupdate.xml
+++ b/share/qtcreator/externaltools/lupdate.xml
@@ -29,7 +29,7 @@
 **
 **************************************************************************/
 -->
-<externaltool>
+<externaltool id="lupdate">
     <description>Synchronizes translator's ts files with the program code</description>
     <description xml:lang="de">Synchronisiert die ts-Ãœbersetzungsdateien mit dem Programmcode</description>
     <displayname>Update translations (lupdate)</displayname>
diff --git a/share/qtcreator/externaltools/sort.xml b/share/qtcreator/externaltools/sort.xml
index c7c5a826ae2b238b80b5e53a6b85f8ecd649ca76..92cd550cd3d4d18cc0b05ce43a9e770d9f8f8aeb 100644
--- a/share/qtcreator/externaltools/sort.xml
+++ b/share/qtcreator/externaltools/sort.xml
@@ -29,7 +29,7 @@
 **
 **************************************************************************/
 -->
-<externaltool>
+<externaltool id="sort">
     <description>Sorts the selected text</description>
     <description xml:lang="de">Sortiert den ausgewählten Text</description>
     <displayname>Sort</displayname>
diff --git a/share/qtcreator/externaltools/vi.xml b/share/qtcreator/externaltools/vi.xml
index b76ba327e9af608c93be167b880d6d2cfb3d6f23..dd4a88a45305e706a208170f20bc64123451d52d 100644
--- a/share/qtcreator/externaltools/vi.xml
+++ b/share/qtcreator/externaltools/vi.xml
@@ -29,7 +29,7 @@
 **
 **************************************************************************/
 -->
-<externaltool>
+<externaltool id="vi">
     <description>Opens the current file in vi</description>
     <description xml:lang="de">Öffnet die aktuelle Datei in vi</description>
     <displayname>Edit with vi</displayname>
diff --git a/src/plugins/coreplugin/externaltool.cpp b/src/plugins/coreplugin/externaltool.cpp
index 2cf22c4ee4abf940b4a9284920711cc58bd770ca..e5eda6593be5177650e926d39eefe55f81d0091d 100644
--- a/src/plugins/coreplugin/externaltool.cpp
+++ b/src/plugins/coreplugin/externaltool.cpp
@@ -59,6 +59,11 @@ ExternalTool::ExternalTool() :
 {
 }
 
+QString ExternalTool::id() const
+{
+    return m_id;
+}
+
 QString ExternalTool::description() const
 {
     return m_description;
@@ -153,6 +158,9 @@ ExternalTool * ExternalTool::createFromXml(const QString &xml, QString *errorMes
 
     if (!reader.readNextStartElement() || reader.name() != QLatin1String(kExternalTool))
         reader.raiseError(QLatin1String("Missing start element <externaltool>"));
+    tool->m_id = reader.attributes().value(QLatin1String("id")).toString();
+    if (tool->m_id.isEmpty())
+        reader.raiseError(QLatin1String("Missing or empty id attribute for <externaltool>"));
     while (reader.readNextStartElement()) {
         if (reader.name() == QLatin1String(kDescription)) {
             localizedText(locales, &reader, &descriptionLocale, &tool->m_description);
diff --git a/src/plugins/coreplugin/externaltool.h b/src/plugins/coreplugin/externaltool.h
index bb45d47291abb23c7243b9bfba00911721226875..850c8bf6ca066b833e5514ce2885fc698469a422 100644
--- a/src/plugins/coreplugin/externaltool.h
+++ b/src/plugins/coreplugin/externaltool.h
@@ -47,6 +47,7 @@ public:
 
     ExternalTool();
 
+    QString id() const;
     QString description() const;
     QString displayName() const;
     QString displayCategory() const;
@@ -60,6 +61,7 @@ public:
     static ExternalTool *createFromXml(const QString &xml, QString *errorMessage = 0, const QString &locale = QString());
 
 private:
+    QString m_id;
     QString m_description;
     QString m_displayName;
     QString m_displayCategory;
diff --git a/tests/auto/externaltool/tst_externaltooltest.cpp b/tests/auto/externaltool/tst_externaltooltest.cpp
index 33f24faad2c79518c68592d9ca60bb2bf1a53451..35479c931aa66eab6980a2c5b128abb292f07b9a 100644
--- a/tests/auto/externaltool/tst_externaltooltest.cpp
+++ b/tests/auto/externaltool/tst_externaltooltest.cpp
@@ -6,7 +6,7 @@
 using namespace Core::Internal;
 
 static const char * const TEST_XML1 =
-"<externaltool>"
+"<externaltool id=\"lupdate\">"
 "    <description>Synchronizes translator's ts files with the program code</description>"
 "    <description xml:lang=\"de\">Synchronisiert die ts-Ãœbersetzungsdateien mit dem Programmcode</description>"
 "    <displayname>Update translations (lupdate)</displayname>"
@@ -24,7 +24,7 @@ static const char * const TEST_XML1 =
 ;
 
 static const char * const TEST_XML2 =
-"<externaltool>"
+"<externaltool id=\"sort\">"
 "    <description>Sorts the selected text</description>"
 "    <description xml:lang=\"de\">Sortiert den ausgewählten Text</description>"
 "    <displayname>Sort</displayname>"
@@ -39,7 +39,7 @@ static const char * const TEST_XML2 =
 "</externaltool>";
 
 static const char * const TEST_XML3 =
-"<externaltool>"
+"<externaltool id=\"vi\">"
 "    <description>Opens the current file in vi</description>"
 "    <description xml:lang=\"de\">Öffnet die aktuelle Datei in vi</description>"
 "    <displayname>Edit with vi</displayname>"
@@ -54,7 +54,7 @@ static const char * const TEST_XML3 =
 "</externaltool>";
 
 static const char * const TEST_XML_LANG =
-"<externaltool>"
+"<externaltool id=\"temp\">"
 "    <description>Hi</description>"
 "    <description xml:lang=\"de\">Hallo</description>"
 "    <description xml:lang=\"de_CH\">Grüezi</description>"
@@ -86,6 +86,7 @@ void ExternaltoolTest::testRead1()
     ExternalTool *tool = ExternalTool::createFromXml(QLatin1String(TEST_XML1), &error);
     QVERIFY(tool != 0);
     QVERIFY(error.isEmpty());
+    QCOMPARE(tool->id(), QString::fromLatin1("lupdate"));
     QVERIFY(tool->description().startsWith(QLatin1String("Synchronizes tran")));
     QCOMPARE(tool->displayName(), QString::fromLatin1("Update translations (lupdate)"));
     QCOMPARE(tool->displayCategory(), QString::fromLatin1("Linguist"));
@@ -105,6 +106,7 @@ void ExternaltoolTest::testRead2()
     ExternalTool *tool = ExternalTool::createFromXml(QLatin1String(TEST_XML2), &error);
     QVERIFY(tool != 0);
     QVERIFY(error.isEmpty());
+    QCOMPARE(tool->id(), QString::fromLatin1("sort"));
     QVERIFY(tool->description().startsWith(QLatin1String("Sorts the")));
     QCOMPARE(tool->displayName(), QString::fromLatin1("Sort"));
     QCOMPARE(tool->displayCategory(), QString::fromLatin1("Text"));
@@ -123,6 +125,7 @@ void ExternaltoolTest::testRead3()
     ExternalTool *tool = ExternalTool::createFromXml(QLatin1String(TEST_XML3), &error);
     QVERIFY(tool != 0);
     QVERIFY(error.isEmpty());
+    QCOMPARE(tool->id(), QString::fromLatin1("vi"));
     QVERIFY(tool->description().startsWith(QLatin1String("Opens the")));
     QCOMPARE(tool->displayName(), QString::fromLatin1("Edit with vi"));
     QCOMPARE(tool->displayCategory(), QString::fromLatin1("Text"));