diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin
index 6f3e6a1971..76aed7b736 100644
--- a/AddIns/ICSharpCode.SharpDevelop.addin
+++ b/AddIns/ICSharpCode.SharpDevelop.addin
@@ -2043,7 +2043,9 @@
 		<Class id="EqualsCodeGenerator"
 		       class="ICSharpCode.SharpDevelop.DefaultEditor.Commands.EqualsCodeGenerator"/>
 	</Path>
-	<!--
+	
 	<Path name = "/SharpDevelop/Workbench/DependentFileExtensions">
-	</Path>-->
+		<String id = "FormsDesignerGeneratedCode" text=".Designer${Extension}"/>
+		<String id = "FormsDesignerResources"     text=".resx"/>
+	</Path>
 </AddIn>
diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/DefaultFileNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/DefaultFileNodeCommands.cs
index 123308c3a8..b716d42e96 100644
--- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/DefaultFileNodeCommands.cs
+++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/DefaultFileNodeCommands.cs
@@ -52,6 +52,14 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
 	{
 		void ExcludeFileNode(FileNode fileNode)
 		{
+			List<FileNode> dependentNodes = new List<FileNode>();
+			foreach (TreeNode subNode in fileNode.Nodes) {
+				// exclude dependent files
+				if (subNode is FileNode)
+					dependentNodes.Add((FileNode)subNode);
+			}
+			dependentNodes.ForEach(ExcludeFileNode);
+			
 			ProjectService.RemoveProjectItem(fileNode.Project, fileNode.ProjectItem);
 			fileNode.ProjectItem = null;
 			fileNode.FileNodeStatus = FileNodeStatus.None;
diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs
index 975a16030e..dad10bffe3 100644
--- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs
+++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs
@@ -121,6 +121,18 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
 			return null;
 		}
 		
+		public static IEnumerable<string> FindAdditionalFiles(string fileName)
+		{
+			List<string> list = new List<string>();
+			StringParser.Properties["Extension"] = Path.GetExtension(fileName);
+			string prefix = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName));
+			foreach (string ext in AddInTree.BuildItems("/SharpDevelop/Workbench/DependentFileExtensions", null, true)) {
+				if (File.Exists(prefix + ext))
+					list.Add(prefix + ext);
+			}
+			return list;
+		}
+		
 		public override void Run()
 		{
 			TreeNode selectedNode = ProjectBrowserPad.Instance.ProjectBrowserControl.SelectedNode;
@@ -145,35 +157,63 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
 				fdiag.Title = StringParser.Parse("${res:ProjectComponent.ContextMenu.AddExistingFiles}");
 				
 				if (fdiag.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) {
-					string copiedFileName = Path.Combine(node.Directory, Path.GetFileName(fdiag.FileNames[0]));
-					if (!FileUtility.IsEqualFileName(fdiag.FileNames[0], copiedFileName)) {
+					List<KeyValuePair<string, string>> fileNames = new List<KeyValuePair<string, string>>(fdiag.FileNames.Length);
+					foreach (string fileName in fdiag.FileNames) {
+						fileNames.Add(new KeyValuePair<string, string>(fileName, ""));
+					}
+					bool addedDependentFiles = false;
+					foreach (string fileName in fdiag.FileNames) {
+						foreach (string additionalFile in FindAdditionalFiles(fileName)) {
+							if (!fileNames.Exists(delegate(KeyValuePair<string, string> pair) {
+							                      	return FileUtility.IsEqualFileName(pair.Key, additionalFile);
+							                      }))
+							{
+								addedDependentFiles = true;
+								fileNames.Add(new KeyValuePair<string, string>(additionalFile, Path.GetFileName(fileName)));
+							}
+						}
+					}
+					
+					
+					
+					string copiedFileName = Path.Combine(node.Directory, Path.GetFileName(fileNames[0].Key));
+					if (!FileUtility.IsEqualFileName(fileNames[0].Key, copiedFileName)) {
 						int res = MessageService.ShowCustomDialog(fdiag.Title, "${res:ProjectComponent.ContextMenu.AddExistingFiles.Question}",
 						                                          0, 2,
 						                                          "${res:ProjectComponent.ContextMenu.AddExistingFiles.Copy}",
 						                                          "${res:ProjectComponent.ContextMenu.AddExistingFiles.Link}",
 						                                          "${res:Global.CancelButtonText}");
 						if (res == 1) {
-							foreach (string fileName in fdiag.FileNames) {
+							foreach (KeyValuePair<string, string> pair in fileNames) {
+								string fileName = pair.Key;
 								string relFileName = FileUtility.GetRelativePath(node.Project.Directory, fileName);
 								FileNode fileNode = new FileNode(fileName, FileNodeStatus.InProject);
 								FileProjectItem fileProjectItem = new FileProjectItem(node.Project, IncludeFileInProject.GetDefaultItemType(node.Project, fileName));
 								fileProjectItem.Include = relFileName;
 								fileProjectItem.Properties.Set("Link", Path.Combine(node.RelativePath, Path.GetFileName(fileName)));
+								fileProjectItem.DependentUpon = pair.Value;
 								fileNode.ProjectItem = fileProjectItem;
 								fileNode.AddTo(node);
 								ProjectService.AddProjectItem(node.Project, fileProjectItem);
 							}
 							node.Project.Save();
+							if (addedDependentFiles)
+								node.RecreateSubNodes();
 							return;
 						}
 						if (res == 2) {
 							return;
 						}
 					}
-					foreach (string fileName in fdiag.FileNames) {
-						CopyFile(fileName, node, true);
+					foreach (KeyValuePair<string, string> pair in fileNames) {
+						FileProjectItem item = CopyFile(pair.Key, node, true);
+						if (item != null) {
+							item.DependentUpon = pair.Value;
+						}
 					}
 					node.Project.Save();
+					if (addedDependentFiles)
+						node.RecreateSubNodes();
 				}
 			}
 		}
diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs
index 7764cf5cdf..20533abafb 100644
--- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs
+++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs
@@ -494,7 +494,7 @@ namespace ICSharpCode.SharpDevelop.Project
 				}
 				
 				this.directory = newPath;
-				ProjectService.SaveSolution();
+				Project.Save();
 			}
 		}
 		public override object AcceptVisitor(ProjectBrowserTreeNodeVisitor visitor, object data)
diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs
index 778193c9be..e86c19dac5 100644
--- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs
+++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs
@@ -199,18 +199,17 @@ namespace ICSharpCode.SharpDevelop.Project
 		{
 			if (FileNodeStatus == FileNodeStatus.Missing) {
 				FileService.RemoveFile(FileName, false);
-				ProjectService.SaveSolution();
+				Project.Save();
 			} else {
 				if (Nodes.Count > 0) {
 					if (MessageService.AskQuestion(GetQuestionText("${res:ProjectComponent.ContextMenu.DeleteWithDependentFiles.Question}"))) {
 						DeleteChildNodes();
 						FileService.RemoveFile(FileName, false);
-						ProjectService.SaveSolution();
+						Project.Save();
 					}
-				}
-				else if (MessageService.AskQuestion(GetQuestionText("${res:ProjectComponent.ContextMenu.Delete.Question}"))) {
+				} else if (MessageService.AskQuestion(GetQuestionText("${res:ProjectComponent.ContextMenu.Delete.Question}"))) {
 					FileService.RemoveFile(FileName, false);
-					ProjectService.SaveSolution();
+					Project.Save();
 				}
 			}
 		}
diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs
index b43b88a3c9..c691ccf2af 100644
--- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs
+++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs
@@ -80,7 +80,7 @@ namespace ICSharpCode.SharpDevelop.Project
 				return;
 			}
 			Text = folder.Location = folder.Name = newName;
-			ProjectService.SaveSolution();
+			solution.Save();
 		}
 		
 		public void AddItem(string fileName)
@@ -123,7 +123,7 @@ namespace ICSharpCode.SharpDevelop.Project
 		public override void Delete()
 		{
 			ProjectService.RemoveSolutionFolder(folder.IdGuid);
-			ProjectService.SaveSolution();
+			solution.Save();
 		}
 		
 		public override bool EnableCopy {
diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs
index 1aca72e91b..c1ea4f88f1 100644
--- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs
+++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs
@@ -128,7 +128,7 @@ namespace ICSharpCode.SharpDevelop.Project
 			
 			string newFileName = Path.Combine(Path.GetDirectoryName(this.FileName), newName);
 			FileService.RenameFile(this.FileName, newFileName, false);
-			ProjectService.SaveSolution();
+			solution.Save();
 		}
 		public override object AcceptVisitor(ProjectBrowserTreeNodeVisitor visitor, object data)
 		{