private void MoveProjectItems(ProjectItems sourceProjectItems, IFolder targetFolder, string sourceName, string targetName)
      {
         // Keep a list of items that have been moved so that we don't modify the sourceProjectItems enumerable.
         var itemsToDeleteFromSource = new List<ProjectItem>();

         foreach (ProjectItem item in sourceProjectItems)
         {
            string itemName = item.Name;
            if (item.IsOpen && item.IsDirty)
            {
               item.Save();
            }

            if (CanBeMigrated(item))
            {
               OutputWindow.WriteLine("Copying item " + itemName + " from project " + sourceName + " into project " + targetName + "...");
               for (short i = 0; i < item.FileCount; i++)
               {
                  if (item.IsPhysicalDirectory())
                  {
                     var directoryName = item.Name;
                     OutputWindow.WriteLine("Copying directory " + directoryName + " from project " + sourceName + " into project " + targetName + "...");
                     var newDirectory = targetFolder.AddFolder(directoryName);
                     MoveProjectItems(item.ProjectItems, newDirectory, sourceName + "/" + directoryName, targetName + "/" + directoryName);
                     OutputWindow.WriteLine("Copied directory " + directoryName + " from project " + sourceName + " into project " + targetName + ".");
                  }
                  else if (item.IsPhysicalFile())
                  {
                     var fileName = item.FileNames[i];
                     OutputWindow.WriteLine("Copying file " + fileName + " from project " + sourceName + " into project " + targetName + "...");
                     targetFolder.AddFromFileCopy(fileName);
                     OutputWindow.WriteLine("Copied file " + fileName + " from project " + sourceName + " into project " + targetName + ".");
                  }
                  else
                  {
                     OutputWindow.WriteLine("Unsupported item Kind " + item.Kind + ". This item won't be moved to the project " + targetName + ".");
                  }
               }
               itemsToDeleteFromSource.Add(item);
               OutputWindow.WriteLine("Copied item " + itemName + " from project " + sourceName + " into project " + targetName);
            }
            else
            {
               OutputWindow.WriteLine("Ignoring special item '" + item.Name + "'. This item cannot be migrated.");
            }
         }

         foreach (var item in itemsToDeleteFromSource)
         {
            var itemName = item.Name;
            OutputWindow.WriteLine("Deleting item '" + itemName + "' from source project...");
            item.Delete();
            OutputWindow.WriteLine("Deleted item '" + itemName + "' from source project.");
         }
      }