anchor.diff:  var
     H : LongInt;
     Look : TAbArchiveItem;
  -  Last : Pointer;
  +  Last : ^TAbArchiveItem;
     FN : string;
   begin
     if FOwnsItems then begin
       FN := TAbArchiveItem(FList[Index]).FileName;
       Last := @HashTable[GenerateHash(FN)];
  -    Look := TAbArchiveItem(Last^);
  +    Look := Last^;
       { Delete old index }
       while Look <> nil do begin
         if CompareText(Look.FileName, FN) = 0 then begin
  -        Move(Look.NextItem, Last^, 4);
  +        Last^ := Look.NextItem;
           Break;
         end;
         Last := @Look.NextItem;
  -      Look := TAbArchiveItem(Last^);
  +      Look := Last^;
       end;
       { Free old instance }
       TObject(FList[Index]).Free;
       { Add new index }
  -    H := GenerateHash(TAbArchiveItem(Item).FileName);
  -    TAbArchiveItem(Item).NextItem := HashTable[H];
  -    HashTable[H] := TAbArchiveItem(Item);
  +    H := GenerateHash(Item.FileName);
  +    Item.NextItem := HashTable[H];
  +    HashTable[H] := Item;
     end;
     { Replace pointer }
     FList[Index] := Item;
  +end;
  +{ -------------------------------------------------------------------------- }
  +procedure TAbArchiveList.UpdateHash(aItem: TAbArchiveItem;
  +  const aOldFileName: string);
  +var
  +  H : LongInt;
  +  Last : ^TAbArchiveItem;
  +  Look : TAbArchiveItem;
  +begin
  +  if FOwnsItems then begin
  +    { Remove from old hash position }
  +    Last := @HashTable[GenerateHash(aOldFileName)];
  +    Look := Last^;
  +    while Look <> nil do begin
  +      if Look = aItem then begin
  +        Last^ := Look.NextItem;
  +        Break
  +      end;
  +      Last := @Look.NextItem;
  +      Look := Last^
  +    end;
  +    { Add to new hash position }
  +    H := GenerateHash(aItem.FileName);
  +    aItem.NextItem := HashTable[H];
  +    HashTable[H] := aItem
  +  end;
   end;
   
   
  
positive.code: procedure TAbArchiveList.Delete(Index: Integer);
  var
    Look : TAbArchiveItem;
    Last : Pointer;
    FN : string;
  begin
    if FOwnsItems then begin
      FN := TAbArchiveItem(FList[Index]).FileName;
      Last := @HashTable[GenerateHash(FN)];
      Look := TAbArchiveItem(Last^);
      while Look <> nil do begin
        if CompareText(Look.FileName, FN) = 0 then begin
          Move(Look.NextItem, Last^, 4);
          Break;
        end;
        Last := @Look.NextItem;
        Look := TAbArchiveItem(Last^);
      end;
      TObject(FList[Index]).Free;
    end;
  
negative.code:   Confirm : Boolean;
    Found : Boolean;
    i : Integer;
    FixedPath, OldFileName: string;
  begin
    CheckValid;
    FixedPath := FixName(NewStoredPath);
  