diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 2bc84d6cbbf525eae55ec4fd7422b1bf6c3c82f8..bd0074b25b070b6a98adbffed5d41d4726a8c289 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -163,6 +163,7 @@ struct ProjectExplorerPluginPrivate {
     QAction *m_addNewFileAction;
     QAction *m_addExistingFilesAction;
     QAction *m_removeFileAction;
+    QAction *m_removeProjectAction;
     QAction *m_deleteFileAction;
     QAction *m_renameFileAction;
     QAction *m_openFileAction;
@@ -725,6 +726,12 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
                        globalcontext);
     mfilec->addAction(cmd, Constants::G_FILE_OTHER);
 
+    // remove project action
+    d->m_removeProjectAction = new QAction(tr("Remove Project"), this);
+    cmd = am->registerAction(d->m_removeProjectAction, ProjectExplorer::Constants::REMOVEPROJECT,
+                       globalcontext);
+    msubProject->addAction(cmd, Constants::G_PROJECT_FILES);
+
     // delete file action
     d->m_deleteFileAction = new QAction(tr("Delete File..."), this);
     cmd = am->registerAction(d->m_deleteFileAction, ProjectExplorer::Constants::DELETEFILE,
@@ -826,6 +833,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
     connect(d->m_clearSession, SIGNAL(triggered()), this, SLOT(clearSession()));
     connect(d->m_addNewFileAction, SIGNAL(triggered()), this, SLOT(addNewFile()));
     connect(d->m_addExistingFilesAction, SIGNAL(triggered()), this, SLOT(addExistingFiles()));
+    connect(d->m_removeProjectAction, SIGNAL(triggered()), this, SLOT(removeProject()));
     connect(d->m_openFileAction, SIGNAL(triggered()), this, SLOT(openFile()));
     connect(d->m_showInGraphicalShell, SIGNAL(triggered()), this, SLOT(showInGraphicalShell()));
     connect(d->m_openTerminalHere, SIGNAL(triggered()), this, SLOT(openTerminalHere()));
@@ -2088,6 +2096,19 @@ void ProjectExplorerPlugin::addExistingFiles()
         }
 }
 
+void ProjectExplorerPlugin::removeProject()
+{
+    ProjectNode *subProjectNode = qobject_cast<ProjectNode*>(d->m_currentNode->projectNode());
+    ProjectNode *projectNode = qobject_cast<ProjectNode *>(subProjectNode->parentFolderNode());
+    if (projectNode) {
+        Core::ICore *core = Core::ICore::instance();
+        RemoveFileDialog removeFileDialog(subProjectNode->path(), core->mainWindow());
+        removeFileDialog.setDeleteFileVisible(false);
+        if (removeFileDialog.exec() == QDialog::Accepted)
+            projectNode->removeSubProjects(QStringList() << subProjectNode->path());
+    }
+}
+
 void ProjectExplorerPlugin::openFile()
 {
     QTC_ASSERT(d->m_currentNode, return)
diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h
index 1770f274401bdeef52a4b75fa9aeed3f2728fc69..f9c0ebf014eb0e5ef91e91ef4bcdcf1ed8834aad 100644
--- a/src/plugins/projectexplorer/projectexplorer.h
+++ b/src/plugins/projectexplorer/projectexplorer.h
@@ -170,6 +170,7 @@ private slots:
 
     void addNewFile();
     void addExistingFiles();
+    void removeProject();
     void openFile();
     void showInGraphicalShell();
     void removeFile();
diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h
index 0f76253ce71186db0940c5a83627091bbdc969e1..69eb3e55af068c45040c4a268f43bc9bc80bf787 100644
--- a/src/plugins/projectexplorer/projectexplorerconstants.h
+++ b/src/plugins/projectexplorer/projectexplorerconstants.h
@@ -74,6 +74,7 @@ const char * const FINDINALLPROJECTS    = "ProjectExplorer.FindInAllProjects";
 const char * const SHOWPROPERTIES       = "ProjectExplorer.ShowProperties";
 const char * const ADDNEWFILE           = "ProjectExplorer.AddNewFile";
 const char * const ADDEXISTINGFILES     = "ProjectExplorer.AddExistingFiles";
+const char * const REMOVEPROJECT        = "ProjectExplorer.RemoveProject";
 const char * const OPENFILE             = "ProjectExplorer.OpenFile";
 const char * const SHOWINGRAPHICALSHELL = "ProjectExplorer.ShowInGraphicalShell";
 const char * const OPENTERMIANLHERE     = "ProjectExplorer.OpenTerminalHere";
diff --git a/src/plugins/projectexplorer/removefiledialog.cpp b/src/plugins/projectexplorer/removefiledialog.cpp
index de911ba0a1fbbfce7bdead4268803e49fc999ac2..b5acf09e46cae162817a79c54ce91ac4411e69d1 100644
--- a/src/plugins/projectexplorer/removefiledialog.cpp
+++ b/src/plugins/projectexplorer/removefiledialog.cpp
@@ -50,6 +50,11 @@ RemoveFileDialog::~RemoveFileDialog()
     delete m_ui;
 }
 
+void RemoveFileDialog::setDeleteFileVisible(bool visible)
+{
+    m_ui->deleteFileCheckBox->setVisible(visible);
+}
+
 bool RemoveFileDialog::isDeleteFileChecked() const
 {
     return m_ui->deleteFileCheckBox->isChecked();
diff --git a/src/plugins/projectexplorer/removefiledialog.h b/src/plugins/projectexplorer/removefiledialog.h
index a9b2b0484b2bddfd6f70bbe0e9c2eaa21601168d..6a3a12d34de39b528b9a773338c70e0fe5f46101 100644
--- a/src/plugins/projectexplorer/removefiledialog.h
+++ b/src/plugins/projectexplorer/removefiledialog.h
@@ -47,6 +47,7 @@ public:
     explicit RemoveFileDialog(const QString &filePath, QWidget *parent = 0);
     virtual ~RemoveFileDialog();
 
+    void setDeleteFileVisible(bool visible);
     bool isDeleteFileChecked() const;
 
 protected:
diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index f266a395b7f7b4441c494b98631f245b3f49ce21..d6d2f769650981c9168deea5eb50ec7798a64b30 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -780,6 +780,18 @@ bool Qt4PriFileNode::canAddSubProject(const QString &proFilePath) const
     return false;
 }
 
+static QString simplifyProFilePath(const QString &proFilePath)
+{
+    // if proFilePath is like: _path_/projectName/projectName.pro
+    // we simplify it to: _path_/projectName
+    QFileInfo fi(proFilePath);
+    const QString parentPath = fi.absolutePath();
+    QFileInfo parentFi(parentPath);
+    if (parentFi.fileName() == fi.completeBaseName())
+        return parentPath;
+    return proFilePath;
+}
+
 bool Qt4PriFileNode::addSubProjects(const QStringList &proFilePaths)
 {
     ProjectExplorer::FindAllFilesVisitor visitor;
@@ -787,18 +799,9 @@ bool Qt4PriFileNode::addSubProjects(const QStringList &proFilePaths)
     const QStringList &allFiles = visitor.filePaths();
 
     QStringList uniqueProFilePaths;
-    foreach (const QString &proFile, proFilePaths) {
-        if (!allFiles.contains(proFile)) {
-            // if proFilePath is like: _path_/projectName/projectName.pro
-            // we simplify it to: _path_/projectName
-            QString proFilePath = proFile;
-            QFileInfo fi(proFile);
-            QFileInfo parentFi(fi.absolutePath());
-            if (parentFi.fileName() == fi.baseName())
-                proFilePath = parentFi.absoluteFilePath();
-            uniqueProFilePaths.append(proFilePath);
-        }
-    }
+    foreach (const QString &proFile, proFilePaths)
+        if (!allFiles.contains(proFile))
+            uniqueProFilePaths.append(simplifyProFilePath(proFile));
 
     QStringList failedFiles;
     changeFiles(ProjectExplorer::ProjectFileType, uniqueProFilePaths, &failedFiles, AddToProFile);
@@ -808,8 +811,17 @@ bool Qt4PriFileNode::addSubProjects(const QStringList &proFilePaths)
 
 bool Qt4PriFileNode::removeSubProjects(const QStringList &proFilePaths)
 {
-    Q_UNUSED(proFilePaths)
-    return false; //changeIncludes(m_includeFile, proFilePaths, RemoveFromProFile);
+    QStringList failedOriginalFiles;
+    changeFiles(ProjectExplorer::ProjectFileType, proFilePaths, &failedOriginalFiles, RemoveFromProFile);
+
+    QStringList simplifiedProFiles;
+    foreach (const QString &proFile, failedOriginalFiles)
+        simplifiedProFiles.append(simplifyProFilePath(proFile));
+
+    QStringList failedSimplifiedFiles;
+    changeFiles(ProjectExplorer::ProjectFileType, simplifiedProFiles, &failedSimplifiedFiles, RemoveFromProFile);
+
+    return failedSimplifiedFiles.isEmpty();
 }
 
 bool Qt4PriFileNode::addFiles(const FileType fileType, const QStringList &filePaths,