diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index 7a0a2c41cb181c0d0a4d6626767bddc8d66bd40f..24c876167080b4e902cf8d5139bd2f8aa6c27276 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -168,19 +168,16 @@ static QStringList readLines(const QString &absoluteFileName)
     return lines;
 }
 
-bool GenericProject::addFiles(const QStringList &filePaths)
+bool GenericProject::setFiles(const QStringList &filePaths)
 {
     // Make sure we can open the file for writing
     QFile file(filesFileName());
     if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
         return false;
 
-    QStringList newFileList = m_files;
-    newFileList.append(filePaths);
-
     QTextStream stream(&file);
     QDir baseDir(QFileInfo(m_fileName).dir());
-    foreach (const QString &filePath, newFileList)
+    foreach (const QString &filePath, filePaths)
         stream << baseDir.relativeFilePath(filePath) << QLatin1Char('\n');
 
     file.close();
@@ -188,6 +185,24 @@ bool GenericProject::addFiles(const QStringList &filePaths)
     return true;
 }
 
+bool GenericProject::addFiles(const QStringList &filePaths)
+{
+    QStringList newFileList = m_files;
+    newFileList.append(filePaths);
+
+    return setFiles(newFileList);
+}
+
+bool GenericProject::removeFiles(const QStringList &filePaths)
+{
+    // Removing using set allows O(n.log(n)) behavior
+    QSet<QString> newFileSet = m_files.toSet();
+    newFileSet.subtract(filePaths.toSet());
+    QStringList newFileList = newFileSet.toList();
+
+    return setFiles(newFileList);
+}
+
 void GenericProject::parseProject(RefreshOptions options)
 {
     if (options & Files)
diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h
index a22f2abda0ad1419a73f9e6c3a2d96d4f6c2fc36..cf9565644ac9d61bd7ccb177d0765067c8c62f6b 100644
--- a/src/plugins/genericprojectmanager/genericproject.h
+++ b/src/plugins/genericprojectmanager/genericproject.h
@@ -94,7 +94,9 @@ public:
     QString buildParser(const QString &buildConfiguration) const;
     ProjectExplorer::ToolChain *toolChain() const;
 
+    bool setFiles(const QStringList &filePaths);
     bool addFiles(const QStringList &filePaths);
+    bool removeFiles(const QStringList &filePaths);
 
     enum RefreshOptions {
         Files         = 0x01,
diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.cpp b/src/plugins/genericprojectmanager/genericprojectnodes.cpp
index 26e1eb812564f7ed0467da18dd18d05ad686ead4..e8668a0d7c1d362fc93c127799c72de6d37609e0 100644
--- a/src/plugins/genericprojectmanager/genericprojectnodes.cpp
+++ b/src/plugins/genericprojectmanager/genericprojectnodes.cpp
@@ -167,7 +167,8 @@ bool GenericProjectNode::hasTargets() const
 QList<ProjectExplorer::ProjectNode::ProjectAction> GenericProjectNode::supportedActions() const
 {
     return QList<ProjectAction>()
-        << AddFile;
+        << AddFile
+        << RemoveFile;
 }
 
 bool GenericProjectNode::addSubProjects(const QStringList &proFilePaths)
@@ -195,9 +196,9 @@ bool GenericProjectNode::removeFiles(const ProjectExplorer::FileType fileType,
                                      const QStringList &filePaths, QStringList *notRemoved)
 {
     Q_UNUSED(fileType);
-    Q_UNUSED(filePaths);
     Q_UNUSED(notRemoved);
-    return false;
+
+    return m_project->removeFiles(filePaths);
 }
 
 bool GenericProjectNode::renameFile(const ProjectExplorer::FileType fileType,