anchor.diff:  
   procedure TKeyboardProjectTemplate.Generate;
   begin
  -  if not ForceDirectories(FBasePath + FKeyboardID + '\source') then
  +  if not ForceDirectories(FBasePath + FKeyboardID + '\' + SFolder_Source) then
       raise EKeyboardProjectTemplate.Create('Could not create destination path '+FBasePath+FKeyboardID);
   
     WriteDocumentation;
  
positive.code:   if Base = '' then
      Result := ''
    else if ExtractFileExt(Base) = Base then
      Result := FBasePath + FKeyboardID + '\source\' + FKeyboardID + Base
    else
      Result := FBasePath + FKeyboardID + '\source\' + Base;
  end;
  
  function TKeyboardProjectTemplate.GetIconFilename: string;
  
negative.code: begin
    kpj := TProject.Create(GetProjectFilename);
    try
      kpj.Options.BuildPath := '$PROJECTPATH\' + SFolder_Build;
      kpj.Options.WarnDeprecatedCode := True;
      kpj.Options.CompilerWarningsAsErrors := True;
  
      // Add keyboard and package to project
      kpj.Files.Add(TkmnProjectFile.Create(kpj, GetKeyboardFilename, nil));
      kpj.Files.Add(TkpsProjectFile.Create(kpj, GetPackageFilename, nil));
  
      // Add metadata files to project
      kpj.Files.Add(TOpenableProjectFile.Create(kpj, FBasePath + FKeyboardID + '\' + SFile_HistoryMD, nil));
      kpj.Files.Add(TOpenableProjectFile.Create(kpj, FBasePath + FKeyboardID + '\' + SFile_LicenseMD, nil));
      kpj.Files.Add(TOpenableProjectFile.Create(kpj, FBasePath + FKeyboardID + '\' + SFile_ReadmeMD, nil));
      kpj.Files.Add(TOpenableProjectFile.Create(kpj, FBasePath + FKeyboardID + '\' + Format(SFileTemplate_KeyboardInfo, [FKeyboardID]), nil));
  
      kpj.Save;
    finally
  