anchor.diff:  
   implementation
   uses
  -  SysUtils, Classes;
  +  SysUtils, Classes, KM_CommonUtils;
   
   { TKMSavedReplays }
   constructor TKMSavePointCollection.Create();
   begin
     inherited;
   
  -  fCriticalSection := TCriticalSection.Create;
  +  fSaveCS := TCriticalSection.Create;
  +  fWaitCS := TCriticalSection.Create;
     fSavePoints := TDictionary<Cardinal, TKMSavePoint>.Create();
     fLastTick := 0;
   end;
  
positive.code:   if Self = nil then Exit;
  
    {$IFDEF WDC}
      aWorkerThread.QueueWork(procedure
      var
        localStream: TKMemoryStream;
      begin
        localStream := TKMemoryStreamBinary.Create;
        try
          Save(localStream); // Save has Lock / Unlock inside already
          localStream.SaveToFileCompressed(aFileName, 'SavePointsCompressed');
        finally
          localStream.Free;
        end;
      end, 'SavePointCollection.SaveToFileAsync');
    {$ELSE}
      localStream := TKMemoryStreamBinary.Create;
      try
  
negative.code: 
    TKMSavePointCollection = class
    private
      fAsyncSaveThreadsCnt: Byte; //Number of threads doing save atm. Usually should be not more then 1
      fWaitCS: TCriticalSection;
      fSaveCS: TCriticalSection;
      fSavePoints: TDictionary<Cardinal, TKMSavePoint>;
      //Properties to restore after load saved replay
      fLastTick: Cardinal;
  