diff --git a/src/plugins/qt4projectmanager/wizards/librarywizarddialog.cpp b/src/plugins/qt4projectmanager/wizards/librarywizarddialog.cpp
index aacd7769b254c95651a885a78a36ff430377b64d..12605eff59dc4c708d9af1429739acb2d7b740e0 100644
--- a/src/plugins/qt4projectmanager/wizards/librarywizarddialog.cpp
+++ b/src/plugins/qt4projectmanager/wizards/librarywizarddialog.cpp
@@ -156,25 +156,41 @@ LibraryWizardDialog::LibraryWizardDialog(const QString &templateName,
     setIntroDescription(tr("This wizard generates a C++ library project."));
 
     m_targetPageId = addTargetSetupPage();
-    Utils::WizardProgressItem *targetItem = wizardProgress()->item(m_targetPageId);
 
-    m_mobilePageId = addPage(m_mobilePage);
-    Utils::WizardProgressItem *mobileItem = wizardProgress()->item(m_mobilePageId);
-    mobileItem->setTitle(QLatin1String("    ") + tr("Symbian Specific"));
+    if (m_targetPageId != -1)
+        m_mobilePageId = addPage(m_mobilePage);
 
     m_modulesPageId = addModulesPage();
-    Utils::WizardProgressItem *modulesItem = wizardProgress()->item(m_modulesPageId);
-
-    targetItem->setNextItems(QList<Utils::WizardProgressItem *>()
-                             << mobileItem << modulesItem);
-    targetItem->setNextShownItem(0);
 
     m_filesPage->setNamespacesEnabled(true);
     m_filesPage->setFormFileInputVisible(false);
     m_filesPage->setClassTypeComboVisible(false);
 
     m_filesPageId = addPage(m_filesPage);
-    wizardProgress()->item(m_filesPageId)->setTitle(tr("Details"));
+
+    Utils::WizardProgressItem *introItem = wizardProgress()->item(startId());
+    Utils::WizardProgressItem *targetItem;
+    if (m_targetPageId != -1)
+        targetItem = wizardProgress()->item(m_targetPageId);
+    Utils::WizardProgressItem *mobileItem = wizardProgress()->item(m_mobilePageId);
+    mobileItem->setTitle(QLatin1String("    ") + tr("Symbian Specific"));
+    Utils::WizardProgressItem *modulesItem = wizardProgress()->item(m_modulesPageId);
+    Utils::WizardProgressItem *filesItem = wizardProgress()->item(m_filesPageId);
+    filesItem->setTitle(tr("Details"));
+
+    if (m_targetPageId != -1) {
+        targetItem->setNextItems(QList<Utils::WizardProgressItem *>()
+                                 << mobileItem << modulesItem << filesItem);
+        targetItem->setNextShownItem(0);
+        mobileItem->setNextItems(QList<Utils::WizardProgressItem *>()
+                                 << modulesItem << filesItem);
+        mobileItem->setNextShownItem(0);
+    } else {
+        introItem->setNextItems(QList<Utils::WizardProgressItem *>()
+                                << modulesItem << filesItem);
+        introItem->setNextShownItem(0);
+    }
+
 
     connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(slotCurrentIdChanged(int)));
 
@@ -202,28 +218,71 @@ QtProjectParameters::Type  LibraryWizardDialog::type() const
     return static_cast<const LibraryIntroPage*>(introPage())->type();
 }
 
+bool LibraryWizardDialog::isModulesPageSkipped() const
+{
+    // When leaving the intro, target or mobile page, the modules page is skipped
+    // in the case of a plugin since it knows its dependencies by itself.
+    return type() == QtProjectParameters::Qt4Plugin;
+}
+
+int LibraryWizardDialog::skipModulesPageIfNeeded() const
+{
+    if (isModulesPageSkipped())
+        return m_filesPageId;
+    return m_modulesPageId;
+}
+
 int LibraryWizardDialog::nextId() const
 {
-    //if there was no Symbian target defined we omit "Symbian specific" step
-    //we omit this step if the library type is not dll
-    if (currentId() == m_filesPageId) {
-        bool symbianTargetEnabled = isTargetSelected(QLatin1String(Constants::S60_DEVICE_TARGET_ID))
-                || isTargetSelected(QLatin1String(Constants::S60_EMULATOR_TARGET_ID));
-        if (!symbianTargetEnabled || type() != QtProjectParameters::SharedLibrary) {
-            QList<int> ids = pageIds();
-            int mobileIndex = ids.lastIndexOf(m_mobilePageId);
-            if (mobileIndex>=0)
-                return ids[mobileIndex+1];
+    if (m_targetPageId != -1) {
+        if (currentId() == m_targetPageId) {
+
+            int next = m_modulesPageId;
+
+            const bool symbianTargetEnabled = isTargetSelected(QLatin1String(Constants::S60_DEVICE_TARGET_ID))
+                    || isTargetSelected(QLatin1String(Constants::S60_EMULATOR_TARGET_ID));
+
+            // If there was no Symbian target defined we omit "Symbian specific" step
+            // We also omit this step if the library type is not dll
+            if (symbianTargetEnabled && type() == QtProjectParameters::SharedLibrary)
+                next = m_mobilePageId;
+
+            if (next == m_modulesPageId)
+                return skipModulesPageIfNeeded();
+
+            return next;
+        } else if (currentId() == m_mobilePageId) {
+            return skipModulesPageIfNeeded();
         }
+    } else if (currentId() == startId()) {
+        return skipModulesPageIfNeeded();
     }
-    // When leaving the intro or target page, the modules page is skipped
-    // in the case of a plugin since it knows its dependencies by itself.
-    const int m_beforeModulesPageId = m_targetPageId != -1 ? m_targetPageId : 0;
-    if (currentId() != m_beforeModulesPageId)
-        return BaseQt4ProjectWizardDialog::nextId();
-    if (type() != QtProjectParameters::Qt4Plugin && m_modulesPageId != -1)
-        return m_modulesPageId;
-    return m_filesPageId;
+
+    return BaseQt4ProjectWizardDialog::nextId();
+}
+
+void LibraryWizardDialog::initializePage(int id)
+{
+    if (m_targetPageId != -1 && id == m_targetPageId) {
+        Utils::WizardProgressItem *mobileItem = wizardProgress()->item(m_mobilePageId);
+        Utils::WizardProgressItem *modulesItem = wizardProgress()->item(m_modulesPageId);
+        Utils::WizardProgressItem *filesItem = wizardProgress()->item(m_filesPageId);
+        if (isModulesPageSkipped())
+            mobileItem->setNextShownItem(filesItem);
+        else
+            mobileItem->setNextShownItem(modulesItem);
+
+    }
+    BaseQt4ProjectWizardDialog::initializePage(id);
+}
+
+void LibraryWizardDialog::cleanupPage(int id)
+{
+    if (m_targetPageId != -1 && id == m_targetPageId) {
+        Utils::WizardProgressItem *mobileItem = wizardProgress()->item(m_mobilePageId);
+        mobileItem->setNextShownItem(0);
+    }
+    BaseQt4ProjectWizardDialog::cleanupPage(id);
 }
 
 QtProjectParameters LibraryWizardDialog::parameters() const
diff --git a/src/plugins/qt4projectmanager/wizards/librarywizarddialog.h b/src/plugins/qt4projectmanager/wizards/librarywizarddialog.h
index 7d8892cda1046f6276fe101a4462f4a9f1331fe6..481061dc8fe33b0dcb87b0a99857c6189a72c363 100644
--- a/src/plugins/qt4projectmanager/wizards/librarywizarddialog.h
+++ b/src/plugins/qt4projectmanager/wizards/librarywizarddialog.h
@@ -68,6 +68,10 @@ public:
 
     virtual int nextId() const;
 
+protected:
+    void initializePage(int id);
+    void cleanupPage(int id);
+
 private slots:
     void slotCurrentIdChanged(int);
 
@@ -75,6 +79,8 @@ private:
     QtProjectParameters::Type type() const;
     void setupFilesPage();
     void setupMobilePage();
+    bool isModulesPageSkipped() const;
+    int skipModulesPageIfNeeded() const;
 
     FilesPage *m_filesPage;
     MobileLibraryWizardOptionPage *m_mobilePage;