anchor.diff:              project.Disconnect()
           | _ -> ()
   
  +    let invalidPathChars = set (Path.GetInvalidPathChars())
  +    let isPathWellFormed (path: string) = not (String.IsNullOrWhiteSpace path) && path |> Seq.forall (fun c -> not (Set.contains c invalidPathChars))
  +
       override this.Initialize() =
           base.Initialize()
   
  
positive.code:             if not(workspaceFiles.Contains(file)) then
                  projectContext.AddSourceFile(file)
                  updated <- true
          for file in workspaceFiles do
              if not(updatedFiles.Contains(file)) then
                  projectContext.RemoveSourceFile(file)
                  updated <- true
          
          let updatedRefs = site.AssemblyReferences() |> hashSetIgnoreCase
          let workspaceRefs = project.GetCurrentMetadataReferences() |> Seq.map(fun ref -> ref.FilePath) |> hashSetIgnoreCase
  
          for ref in updatedRefs do
              if not(workspaceRefs.Contains(ref)) then
                  projectContext.AddMetadataReference(ref, MetadataReferenceProperties.Assembly)
          for ref in workspaceRefs do
              if not(updatedRefs.Contains(ref)) then
                  projectContext.RemoveMetadataReference(ref)
  
negative.code:         
      /// Sync the information for the project 
      member this.SyncProject(project: AbstractProject, projectContext: IWorkspaceProjectContext, site: IProjectSite, workspace, forceUpdate) =
          let wellFormedFilePathSetIgnoreCase (paths: seq<string>) =
              HashSet(paths |> Seq.filter isPathWellFormed, StringComparer.OrdinalIgnoreCase)
  
          let updatedFiles = site.SourceFilesOnDisk() |> wellFormedFilePathSetIgnoreCase
          let workspaceFiles = project.GetCurrentDocuments() |> Seq.map (fun file -> file.FilePath) |> wellFormedFilePathSetIgnoreCase
          
          let mutable updated = forceUpdate
  
  