diff --git a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp
index 751f3f7f1f6c78c32ab6f300ba0524283172417a..ca40999dc3b5571dec038b7354c3fdd7c7c43a31 100644
--- a/src/plugins/coreplugin/actionmanager/actioncontainer.cpp
+++ b/src/plugins/coreplugin/actionmanager/actioncontainer.cpp
@@ -307,9 +307,8 @@ Command *ActionContainerPrivate::addSeparator(const Context &context, const Id &
     static int separatorIdCount = 0;
     QAction *separator = new QAction(this);
     separator->setSeparator(true);
-    Command *cmd = ActionManager::registerAction(separator, Id(QString::fromLatin1("%1.Separator.%2")
-                                                 .arg(id().toString()).arg(++separatorIdCount)),
-                                                 context);
+    Id sepId = id().withSuffix(".Separator.").withSuffix(++separatorIdCount);
+    Command *cmd = ActionManager::registerAction(separator, sepId, context);
     addAction(cmd, group);
     if (outSeparator)
         *outSeparator = separator;
diff --git a/src/plugins/coreplugin/actionmanager/actionmanager.cpp b/src/plugins/coreplugin/actionmanager/actionmanager.cpp
index 55430acae28c7982fe62154e7e11900fcd54d18e..2eebd9a2d4db128e314f37222eaa533c6ca92bc0 100644
--- a/src/plugins/coreplugin/actionmanager/actionmanager.cpp
+++ b/src/plugins/coreplugin/actionmanager/actionmanager.cpp
@@ -566,7 +566,7 @@ void ActionManagerPrivate::initialize()
     for (int i = 0; i < shortcuts; ++i) {
         settings->setArrayIndex(i);
         const QKeySequence key(settings->value(QLatin1String(sequenceKey)).toString());
-        const Id id = Id(settings->value(QLatin1String(idKey)).toString());
+        const Id id = Id::fromSetting(settings->value(QLatin1String(idKey)));
 
         Command *cmd = ActionManager::command(id);
         if (cmd)
diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp
index 518752a9f4f644de5b8a4ccafb8fa2fc5a54027a..0400407f99897f7a1b8f1ae5779a0cd8daabb0d3 100644
--- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp
+++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp
@@ -334,7 +334,7 @@ void SettingsDialog::showPage(Id categoryId, Id pageId)
     QString initialPage = pageId.toString();
     if (!initialCategory.isValid() && initialPage.isEmpty()) {
         QSettings *settings = ICore::settings();
-        initialCategory = Id(settings->value(QLatin1String(categoryKeyC), QVariant(QString())).toString());
+        initialCategory = Id::fromSetting(settings->value(QLatin1String(categoryKeyC)));
         initialPage = settings->value(QLatin1String(pageKeyC), QVariant(QString())).toString();
     }
 
diff --git a/src/plugins/coreplugin/documentmanager.cpp b/src/plugins/coreplugin/documentmanager.cpp
index 59bd39936a85f91fb3b420e55b2b6b556e3d5da8..fdcbcf6de7143a042437960f2ebb773abea17caf 100644
--- a/src/plugins/coreplugin/documentmanager.cpp
+++ b/src/plugins/coreplugin/documentmanager.cpp
@@ -1183,7 +1183,7 @@ void readSettings()
             editorId = ids.next();
         if (QFileInfo(fileName).isFile())
             d->m_recentFiles.append(DocumentManager::RecentFile(QDir::fromNativeSeparators(fileName), // from native to guard against old settings
-                                               Id(editorId)));
+                                               Id::fromString(editorId)));
     }
 
     s->beginGroup(QLatin1String(directoryGroupC));
diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp
index 64ede70b7513b7a2dfd9b87ce7164d66e5e860dd..1a57cdcfb89b4b296b2ab0b1a3c358fb7573b608 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.cpp
+++ b/src/plugins/coreplugin/editormanager/editormanager.cpp
@@ -1232,14 +1232,14 @@ Core::Id EditorManager::getOpenWithEditorId(const QString &fileName,
     //Unable to determine mime type of fileName. Falling back to text/plain",
     if (!mt)
         mt = ICore::mimeDatabase()->findByType(QLatin1String("text/plain"));
-    QStringList allEditorIds;
+    QList<Id> allEditorIds;
     QStringList allEditorDisplayNames;
     QList<Id> externalEditorIds;
     // Built-in
     const EditorFactoryList editors = editorFactories(mt, false);
     const int size = editors.size();
     for (int i = 0; i < size; i++) {
-        allEditorIds.push_back(editors.at(i)->id().toString());
+        allEditorIds.push_back(editors.at(i)->id());
         allEditorDisplayNames.push_back(editors.at(i)->displayName());
     }
     // External editors
@@ -1247,7 +1247,7 @@ Core::Id EditorManager::getOpenWithEditorId(const QString &fileName,
     const int esize = exEditors.size();
     for (int i = 0; i < esize; i++) {
         externalEditorIds.push_back(exEditors.at(i)->id());
-        allEditorIds.push_back(exEditors.at(i)->id().toString());
+        allEditorIds.push_back(exEditors.at(i)->id());
         allEditorDisplayNames.push_back(exEditors.at(i)->displayName());
     }
     if (allEditorIds.empty())
@@ -1259,7 +1259,7 @@ Core::Id EditorManager::getOpenWithEditorId(const QString &fileName,
     dialog.setCurrentEditor(0);
     if (dialog.exec() != QDialog::Accepted)
         return Id();
-    const Id selectedId = Id(allEditorIds.at(dialog.editor()));
+    const Id selectedId = allEditorIds.at(dialog.editor());
     if (isExternalEditor)
         *isExternalEditor = externalEditorIds.contains(selectedId);
     return selectedId;
@@ -2019,9 +2019,9 @@ bool EditorManager::restoreState(const QByteArray &state)
                 continue;
             QFileInfo rfi(autoSaveName(fileName));
             if (rfi.exists() && fi.lastModified() < rfi.lastModified())
-                openEditor(fileName, Id(QString::fromUtf8(id)));
+                openEditor(fileName, Id::fromName(id));
             else
-                d->m_editorModel->addRestoredEditor(fileName, displayName, Id(QString::fromUtf8(id)));
+                d->m_editorModel->addRestoredEditor(fileName, displayName, Id::fromName(id));
         }
     }
 
diff --git a/src/plugins/coreplugin/icontext.cpp b/src/plugins/coreplugin/icontext.cpp
index 236f7455f3999f0828f530a6367a069507e32c78..6114a3f1cbcf90558ec02a30d4f675a778541a08 100644
--- a/src/plugins/coreplugin/icontext.cpp
+++ b/src/plugins/coreplugin/icontext.cpp
@@ -28,14 +28,3 @@
 ****************************************************************************/
 
 #include "icontext.h"
-
-#include <QString>
-
-namespace Core {
-
-Context::Context(const char *id, int offset)
-{
-    d.append(Id(QLatin1String(id) + QString::number(offset)).uniqueIdentifier());
-}
-
-} // namespace Core
diff --git a/src/plugins/coreplugin/icontext.h b/src/plugins/coreplugin/icontext.h
index e3395d8a5d5358b72a9d2286654af2bde67c0eae..9a43d96394f93dc4fc016ffc8b4f7a27ff5e8816 100644
--- a/src/plugins/coreplugin/icontext.h
+++ b/src/plugins/coreplugin/icontext.h
@@ -48,7 +48,6 @@ public:
     explicit Context(Id c1) { add(c1); }
     Context(Id c1, Id c2) { add(c1); add(c2); }
     Context(Id c1, Id c2, Id c3) { add(c1); add(c2); add(c3); }
-    Context(const char *base, int offset);
     bool contains(Id c) const { return d.contains(c); }
     int size() const { return d.size(); }
     bool isEmpty() const { return d.isEmpty(); }
diff --git a/src/plugins/coreplugin/id.cpp b/src/plugins/coreplugin/id.cpp
index 3a9f38465fb7e72fbd320909fbfd84f59100290c..b947cb8229b1a9f2915b38d017fb78caad574998 100644
--- a/src/plugins/coreplugin/id.cpp
+++ b/src/plugins/coreplugin/id.cpp
@@ -207,6 +207,8 @@ QString Id::toString() const
   This should not be used to handle a persistent version
   of the Id, use \c{fromSetting()} instead.
 
+  \deprecated
+
   \sa toString(), fromSetting()
 */
 
@@ -215,6 +217,22 @@ Id Id::fromString(const QString &name)
     return Id(theId(name.toUtf8()));
 }
 
+/*!
+  Creates an id from a string representation.
+
+  This should not be used to handle a persistent version
+  of the Id, use \c{fromSetting()} instead.
+
+  \deprecated
+
+  \sa toString(), fromSetting()
+*/
+
+Id Id::fromName(const QByteArray &name)
+{
+    return Id(theId(name));
+}
+
 /*!
   Returns a persistent value representing the id which is
   suitable to be stored in QSettings.
@@ -239,15 +257,41 @@ Id Id::fromSetting(const QVariant &variant)
     return Id(theId(ba));
 }
 
-Id Id::withSuffix(Id id, int suffix)
+/*!
+  Constructs a derived id.
+
+  This can be used to construct groups of ids logically
+  belonging together. The associated internal name
+  will be generated by appending \c{suffix}.
+*/
+
+Id Id::withSuffix(int suffix) const
+{
+    const QByteArray ba = name() + QByteArray::number(suffix);
+    return Id(ba.constData());
+}
+
+/*!
+  \overload
+*/
+
+Id Id::withSuffix(const char *suffix) const
 {
-    const QByteArray ba = id.name() + QByteArray::number(suffix);
+    const QByteArray ba = name() + suffix;
     return Id(ba.constData());
 }
 
-Id Id::withSuffix(Id id, const char *suffix)
+/*!
+  Constructs a derived id.
+
+  This can be used to construct groups of ids logically
+  belonging together. The associated internal name
+  will be generated by prepending \c{prefix}.
+*/
+
+Id Id::withPrefix(const char *prefix) const
 {
-    const QByteArray ba = id.name() + suffix;
+    const QByteArray ba = prefix + name();
     return Id(ba.constData());
 }
 
diff --git a/src/plugins/coreplugin/id.h b/src/plugins/coreplugin/id.h
index e19f2336ad2b7412ab8df5e196fb02d8cf5ddfb7..d2d3e93456e378651952eea80d58f33e554a0816 100644
--- a/src/plugins/coreplugin/id.h
+++ b/src/plugins/coreplugin/id.h
@@ -47,9 +47,13 @@ public:
     Id() : m_id(0) {}
     Id(int uid) : m_id(uid) {}
     Id(const char *name);
-    explicit Id(const QByteArray &name);
-    // FIXME: Remove
     explicit Id(const QString &name);
+    explicit Id(const QByteArray &name);
+
+    Id withSuffix(int suffix) const;
+    Id withSuffix(const char *name) const;
+    Id withPrefix(const char *name) const;
+
     QByteArray name() const;
     QString toString() const; // Avoid.
     QVariant toSetting() const; // Good to use.
@@ -63,9 +67,8 @@ public:
     int uniqueIdentifier() const { return m_id; }
     static Id fromUniqueIdentifier(int uid) { return Id(uid); }
     static Id fromString(const QString &str); // FIXME: avoid.
+    static Id fromName(const QByteArray &ba); // FIXME: avoid.
     static Id fromSetting(const QVariant &variant); // Good to use.
-    static Id withSuffix(Id base, int suffix);
-    static Id withSuffix(Id base, const char *name);
     static void registerId(int uid, const char *name);
 
 private:
diff --git a/src/plugins/coreplugin/infobar.cpp b/src/plugins/coreplugin/infobar.cpp
index 50257f03f68d0bd7f7f6e7449cd86bccf7e9f517..38e20d275ad0a2461d6cda278ad7930e84af63cb 100644
--- a/src/plugins/coreplugin/infobar.cpp
+++ b/src/plugins/coreplugin/infobar.cpp
@@ -143,7 +143,7 @@ void InfoBar::initializeGloballySuppressed()
 {
     QStringList list = ICore::settings()->value(QLatin1String(C_SUPPRESSED_WARNINGS)).toStringList();
     foreach (const QString &id, list)
-        globallySuppressed.insert(Id(id.toLatin1()));
+        globallySuppressed.insert(Id::fromString(id));
 }
 
 void InfoBar::clearGloballySuppressed()
diff --git a/src/plugins/coreplugin/modemanager.cpp b/src/plugins/coreplugin/modemanager.cpp
index 583ce0cee636d1b6e0cb1bb28c12f526e7ddfdb1..e3c610ab523577efd14691be9a9122a46554d32a 100644
--- a/src/plugins/coreplugin/modemanager.cpp
+++ b/src/plugins/coreplugin/modemanager.cpp
@@ -198,7 +198,7 @@ void ModeManager::objectAdded(QObject *obj)
     d->m_modeStack->setTabEnabled(index, mode->isEnabled());
 
     // Register mode shortcut
-    const Id shortcutId(QLatin1String("QtCreator.Mode.") + mode->id().toString());
+    const Id shortcutId = mode->id().withPrefix("QtCreator.Mode.");
     QShortcut *shortcut = new QShortcut(d->m_mainWindow);
     shortcut->setWhatsThis(tr("Switch to <b>%1</b> mode").arg(mode->displayName()));
     Command *cmd = ActionManager::registerShortcut(shortcut, shortcutId, Context(Constants::C_GLOBAL));
diff --git a/src/plugins/coreplugin/navigationwidget.cpp b/src/plugins/coreplugin/navigationwidget.cpp
index 5c6fcb86b80f53f7a5c338e1b36f5284b887fbce..cfd699cc9658f2a38f65994f59ba827e181b72ad 100644
--- a/src/plugins/coreplugin/navigationwidget.cpp
+++ b/src/plugins/coreplugin/navigationwidget.cpp
@@ -195,7 +195,7 @@ void NavigationWidget::setFactories(const QList<INavigationWidgetFactory *> fact
         d->m_shortcutMap.insert(shortcut, id);
 
         Command *cmd = ActionManager::registerShortcut(shortcut,
-            Id(QLatin1String("QtCreator.Sidebar.") + QLatin1String(id.name())), navicontext);
+            id.withPrefix("QtCreator.Sidebar."), navicontext);
         cmd->setDefaultKeySequence(factory->activationSequence());
         d->m_commandMap.insert(id, cmd);
 
diff --git a/src/plugins/cpptools/modelmanagertesthelper.h b/src/plugins/cpptools/modelmanagertesthelper.h
index 5de107888d8056aa81860ead67658384281267a9..f0e1a2af29991dbb35efa56eb978ec0cdf7d2bb2 100644
--- a/src/plugins/cpptools/modelmanagertesthelper.h
+++ b/src/plugins/cpptools/modelmanagertesthelper.h
@@ -49,7 +49,7 @@ public:
     { return m_name; }
 
     virtual Core::Id id() const
-    { return Core::Id(m_name); }
+    { return Core::Id::fromString(m_name); }
 
     virtual Core::IDocument *document() const
     { return 0; }