anchor.diff:      procedure CopyCorners(aLayer: TKMTerrainLayer);
       procedure SwapCorners(aLayer: TKMTerrainLayer);
       procedure SetAllCOrners;
  +
  +    procedure Save(aSaveStream: TKMemoryStream);
     end;
   
   
  
positive.code:     fFinder: TKMTerrainFinder;
  
      fBoundsWC: TKMRect; //WC rebuild bounds used in FlattenTerrain (put outside to fight with recursion SO error in FlattenTerrain EnsureWalkable)
  
      function TileHasParameter(X,Y: Word; aCheckTileFunc: TBooleanWordFunc; aAllow2CornerTiles: Boolean = False;
                                aStrictCheck: Boolean = False): Boolean;
  
negative.code:   FallingTrees.SaveToStream(SaveStream);
    isTxtStream := SaveStream is TKMemoryStreamText;
  
    if isTxtStream then
      for I := 1 to fMapY do
        for K := 1 to fMapX do
        begin
          SaveStream.PlaceMarker(KMPoint(K,I).ToString);
  
          with Land[I,K] do
          begin
            BaseLayer.Save(SaveStream);
            for L := 0 to 2 do
              Layer[L].Save(SaveStream);
            SaveStream.Write(LayersCnt);
            SaveStream.Write(Height);
            SaveStream.Write(Obj);
            SaveStream.Write(IsCustom);
            SaveStream.Write(BlendingLvl);
            SaveStream.Write(TreeAge);
            SaveStream.Write(FieldAge);
            SaveStream.Write(TileLock, SizeOf(TileLock));
            SaveStream.Write(JamMeter);
            SaveStream.Write(TileOverlay, SizeOf(TileOverlay));
            SaveStream.Write(TileOwner, SizeOf(TileOwner));
            SaveStream.Write(TKMUnit(Land[I,K].IsUnit).UID);
            SaveStream.Write(IsVertexUnit, SizeOf(IsVertexUnit));
  
            SaveStream.Write(Passability, SizeOf(Passability));
            SaveStream.Write(WalkConnect, SizeOf(WalkConnect));
            SaveStream.Write(Light);
          end;
        end
    else
    begin
      // Save Unit pointer in temp array
      for I := 1 to fMapY do
        for K := 1 to fMapX do
        begin
          fUnitPointersTemp[I,K] := Land[I,K].IsUnit;
          Land[I,K].IsUnit := Pointer(TKMUnit(Land[I,K].IsUnit).UID);
        end;
  
      for I := 1 to fMapY do
        SaveStream.Write(Land[I,1], SizeOf(Land[I,1]) * fMapX);
  
      // Restore unit pointers
      for I := 1 to fMapY do
        for K := 1 to fMapX do
        begin
          Land[I,K].IsUnit := fUnitPointersTemp[I,K];
        end;
    end;
  end;
  
  
  procedure TKMTerrain.Load(LoadStream: TKMemoryStream);
  var
    I, J: Integer;
  begin
    LoadStream.CheckMarker('Terrain');
    LoadStream.Read(fMapX);
  