diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index 53d6594..e9e1617 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -435,6 +435,9 @@ void cmVisualStudio10TargetGenerator::WriteGroups()
       none.push_back(sf);
       }
     }
+
+  AddMissingSourceGroups(groupsUsed, sourceGroups);
+
   // Write out group file
   std::string path =  this->Makefile->GetStartOutputDirectory();
   path += "/";
@@ -492,6 +495,44 @@ void cmVisualStudio10TargetGenerator::WriteGroups()
     }
 }
 
+// adds the source groups to groupsUsed that have no source
+//files in them, but do have children which do
+void cmVisualStudio10TargetGenerator::AddMissingSourceGroups(
+  std::set<cmSourceGroup*>& groupsUsed,
+  const std::vector<cmSourceGroup>& allGroups)
+{
+  for(std::vector<cmSourceGroup>::const_iterator current = allGroups.begin(); 
+      current != allGroups.end(); current++) 
+    {
+    const std::vector<cmSourceGroup>& children = current->GetGroupChildren();
+
+    if(children.size() == 0) 
+        continue; // the group is really empty
+    
+    AddMissingSourceGroups(groupsUsed, children); // traverse children recursively
+
+    cmSourceGroup* current_ptr = const_cast<cmSourceGroup*>(&(*current));
+    if(groupsUsed.find(current_ptr) != groupsUsed.end())
+      continue; // group has already been added to set
+
+    // check if it least one of the group's descendants is not empty
+    // (at least one child must already have been added)
+    std::vector<cmSourceGroup>::const_iterator child_it = children.begin();
+    while(child_it != children.end())
+      {
+      cmSourceGroup* child_ptr = const_cast<cmSourceGroup*>(&(*child_it));
+      if(groupsUsed.find(child_ptr) != groupsUsed.end()) 
+          break; // found a child that was already added => add current group too
+      child_it++;
+      }
+    
+    if(child_it == children.end()) 
+        continue; // no descendants have source files => ignore this group
+
+    groupsUsed.insert(current_ptr);
+    }
+}
+
 void
 cmVisualStudio10TargetGenerator::
 WriteGroupSources(const char* name,
diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h
index 989db71..b3922c6 100644
--- a/Source/cmVisualStudio10TargetGenerator.h
+++ b/Source/cmVisualStudio10TargetGenerator.h
@@ -74,6 +74,8 @@ private:
   void WriteEvent(const char* name, std::vector<cmCustomCommand> & commands,
                   std::string const& configName);
   void ComputeObjectNames();
+  void AddMissingSourceGroups(std::set<cmSourceGroup*>& groupsUsed,
+                              const std::vector<cmSourceGroup>& allGroups);
   void WriteGroupSources(const char* name,
                          std::vector<cmSourceFile*> const& sources,
                          std::vector<cmSourceGroup>& );
