anchor.diff:              match parts with
               | name :: operator1 :: version1  :: operator2 :: version2 :: rest
                   when List.exists ((=) operator1) operators && List.exists ((=) operator2) operators -> 
  -                Package(name,operator1 + " " + version1 + " " + operator2 + " " + version2, String.Join(" ",rest) |> removeComment)
  +                Some (Package(name,operator1 + " " + version1 + " " + operator2 + " " + version2, String.Join(" ",rest) |> removeComment))
               | name :: operator :: version  :: rest 
                   when List.exists ((=) operator) operators ->
  -                Package(name,operator + " " + version, String.Join(" ",rest) |> removeComment)
  +                Some (Package(name,operator + " " + version, String.Join(" ",rest) |> removeComment))
               | name :: version :: rest when isVersion version -> 
  -                Package(name,version,String.Join(" ",rest) |> removeComment)
  -            | name :: rest -> Package(name,">= 0", String.Join(" ",rest) |> removeComment)
  -            | [name] -> Package(name,">= 0","")
  +                Some (Package(name,version,String.Join(" ",rest) |> removeComment))
  +            | name :: rest -> Some (Package(name,">= 0", String.Join(" ",rest) |> removeComment))
  +            | [name] -> Some (Package(name,">= 0",""))
               | _ -> failwithf "could not retrieve NuGet package from %s" trimmed
  -        | String.StartsWith "references" trimmed -> ParserOptions(ParserOption.ReferencesMode(trimmed.Replace(":","").Trim() = "strict"))
  +        | _ -> None
  +    
  +    let private (|Empty|_|) (line:string) =
  +        let trimmed = line.Trim() 
  +        match trimmed with
  +        | _ when String.IsNullOrWhiteSpace line -> Some (Empty(line))
  +        | String.StartsWith "version" _ as trimmed -> Some (Empty(trimmed)) // Parsed by the boostrapper, not paket itself
  +        | String.StartsWith "//" _ -> Some (Empty(line))
  +        | String.StartsWith "#" _ -> Some (Empty(line))
  +        | _ -> None
  +        
  +    let private (|ParserOptions|_|) (line:string) =
  +        let trimmed = line.Trim() 
  +        match trimmed with
  +        | String.StartsWith "references" trimmed -> Some (ParserOptions(ParserOption.ReferencesMode(trimmed.Replace(":","").Trim() = "strict")))
           | String.StartsWith "redirects" trimmed ->
               let setting =
                   match trimmed.Replace(":","").Trim().ToLowerInvariant() with
  
positive.code:                 | "min" -> Some ResolverStrategy.Min
                  | _ -> None
  
              ParserOptions(ParserOption.ResolverStrategyForTransitives(setting))
          | String.StartsWith "lowest_matching" trimmed -> 
              let setting =
                  match trimmed.Replace(":","").Trim().ToLowerInvariant() with
  
negative.code:                             let relative = (createRelativePath root fullPath).Replace("\\","/")
                              LocalNuGet(relative,None) :: current.Sources |> List.distinct 
                      lineNo, { current with RemoteFiles = current.RemoteFiles @ [remoteFile]; Sources = sources }::other
                  | _ -> failwithf "Unrecognized token: %s" line
              with
              | exn -> failwithf "Error in paket.dependencies line %d%s  %s" lineNo Environment.NewLine exn.Message
          | [] -> failwithf "Error in paket.dependencies line %d" lineNo
  