diff --git a/Genshtab/ggc/karta_ggc_250m.zmp/GetUrlScript.txt b/Genshtab/ggc/karta_ggc_250m.zmp/GetUrlScript.txt
index 1acc47c6..f350c3f4 100644
--- a/Genshtab/ggc/karta_ggc_250m.zmp/GetUrlScript.txt
+++ b/Genshtab/ggc/karta_ggc_250m.zmp/GetUrlScript.txt
@@ -1,3 +1,52 @@
+function GetCode(const url: AnsiString): Cardinal;
+var
+  VResponseCode: Cardinal;
+  VResponseHeader, VResponseData: AnsiString;
 begin
-  ResultURL:=GetURLBase+'z'+inttostr(getz)+'/'+inttostr(getx div 1024)+'/x'+inttostr(getx)+'/'+inttostr(gety div 1024)+'/y'+inttostr(gety)+'.jpg';
+  Result := 1;
+  if Assigned(Downloader) then begin
+    VResponseHeader := '';
+    VResponseData := '';
+    VResponseCode := Downloader.DoHttpRequest(url, '', '', VResponseHeader, VResponseData);
+    Result := VResponseCode;
+  end;
+end;
+
+var
+  BaseUrl: string;
+  code: Cardinal;
+  z_ok, z_no: integer;
+  r: integer;
+begin
+  ResultURL := '';
+  z_ok := StrToIntDef(GetBefore(';', ScriptBuffer), 1); // Максимальный масштаб, который точно есть
+  z_no := StrToIntDef(GetAfter(';', ScriptBuffer), 25); // Минимальный масштаб, которого точно нет
+
+  // Масштаба нет - говорить не о чем
+  if getz >= z_no then exit;
+
+  // Выбор зеркала
+  r := random(2);
+  case r of
+    0: BaseUrl := GetURLBase;
+    1: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088/pub/ggc', 't.caucasia.ru:80');
+  end;
+
+  // Проверяем наличие масштаба
+  if getz > z_ok then begin
+    code := GetCode(BaseUrl+'z'+inttostr(getz)+'/');
+
+    // Внимание! Если сервер вернёт 403 - code почему-то будет 0. Так что выбор "404 или что-то иное"
+    // Если дело дошло до проверки наличия масштаба - значит какая-то граница (z_ok / z_no) точно подвинется.
+    if code = 404 then z_no := getz else z_ok := getz;
+
+    // Сохраняем актуализированные границы для последующих вызовов
+    ScriptBuffer := inttostr(z_ok) + ';' + inttostr(z_no);
+
+    // Масштаба нет (о чём могли только что при проверке узнать) - говорить не о чем
+    if getz >= z_no then exit;
+  end;
+
+  // Ок, качаем тайлик
+  ResultURL:= BaseUrl+'z'+inttostr(getz)+'/'+inttostr(getx div 1024)+'/x'+inttostr(getx)+'/'+inttostr(gety div 1024)+'/y'+inttostr(gety)+'.jpg';
 end.
diff --git a/Genshtab/karta_gsh_10km.zmp/GetUrlScript.txt b/Genshtab/karta_gsh_10km.zmp/GetUrlScript.txt
index 4f971180..3589bd7c 100644
--- a/Genshtab/karta_gsh_10km.zmp/GetUrlScript.txt
+++ b/Genshtab/karta_gsh_10km.zmp/GetUrlScript.txt
@@ -26,10 +26,11 @@ begin
   if getz >= z_no then exit;
 
   // Выбор зеркала
-  r := random(2);
+  r := random(3);
   case r of
     0: BaseUrl := GetURLBase;
     1: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088', 'maps.melda.ru');
+    2: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088/pub/genshtab', 't.caucasia.ru:80');
   end;
 
   // Проверяем наличие масштаба
diff --git a/Genshtab/karta_gsh_1km.zmp/GetUrlScript.txt b/Genshtab/karta_gsh_1km.zmp/GetUrlScript.txt
index 4f971180..3589bd7c 100644
--- a/Genshtab/karta_gsh_1km.zmp/GetUrlScript.txt
+++ b/Genshtab/karta_gsh_1km.zmp/GetUrlScript.txt
@@ -26,10 +26,11 @@ begin
   if getz >= z_no then exit;
 
   // Выбор зеркала
-  r := random(2);
+  r := random(3);
   case r of
     0: BaseUrl := GetURLBase;
     1: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088', 'maps.melda.ru');
+    2: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088/pub/genshtab', 't.caucasia.ru:80');
   end;
 
   // Проверяем наличие масштаба
diff --git a/Genshtab/karta_gsh_250m.zmp/GetUrlScript.txt b/Genshtab/karta_gsh_250m.zmp/GetUrlScript.txt
index 4f971180..dba2ec48 100644
--- a/Genshtab/karta_gsh_250m.zmp/GetUrlScript.txt
+++ b/Genshtab/karta_gsh_250m.zmp/GetUrlScript.txt
@@ -26,10 +26,11 @@ begin
   if getz >= z_no then exit;
 
   // Выбор зеркала
-  r := random(2);
+  r := random(3);
   case r of
     0: BaseUrl := GetURLBase;
     1: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088', 'maps.melda.ru');
+    2: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088', 't.caucasia.ru');
   end;
 
   // Проверяем наличие масштаба
diff --git a/Genshtab/karta_gsh_2km.zmp/GetUrlScript.txt b/Genshtab/karta_gsh_2km.zmp/GetUrlScript.txt
index 4f971180..3589bd7c 100644
--- a/Genshtab/karta_gsh_2km.zmp/GetUrlScript.txt
+++ b/Genshtab/karta_gsh_2km.zmp/GetUrlScript.txt
@@ -26,10 +26,11 @@ begin
   if getz >= z_no then exit;
 
   // Выбор зеркала
-  r := random(2);
+  r := random(3);
   case r of
     0: BaseUrl := GetURLBase;
     1: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088', 'maps.melda.ru');
+    2: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088/pub/genshtab', 't.caucasia.ru:80');
   end;
 
   // Проверяем наличие масштаба
diff --git a/Genshtab/karta_gsh_500m.zmp/GetUrlScript.txt b/Genshtab/karta_gsh_500m.zmp/GetUrlScript.txt
index 4f971180..3589bd7c 100644
--- a/Genshtab/karta_gsh_500m.zmp/GetUrlScript.txt
+++ b/Genshtab/karta_gsh_500m.zmp/GetUrlScript.txt
@@ -26,10 +26,11 @@ begin
   if getz >= z_no then exit;
 
   // Выбор зеркала
-  r := random(2);
+  r := random(3);
   case r of
     0: BaseUrl := GetURLBase;
     1: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088', 'maps.melda.ru');
+    2: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088/pub/genshtab', 't.caucasia.ru:80');
   end;
 
   // Проверяем наличие масштаба
diff --git a/Genshtab/karta_gsh_5km.zmp/GetUrlScript.txt b/Genshtab/karta_gsh_5km.zmp/GetUrlScript.txt
index 4f971180..3589bd7c 100644
--- a/Genshtab/karta_gsh_5km.zmp/GetUrlScript.txt
+++ b/Genshtab/karta_gsh_5km.zmp/GetUrlScript.txt
@@ -26,10 +26,11 @@ begin
   if getz >= z_no then exit;
 
   // Выбор зеркала
-  r := random(2);
+  r := random(3);
   case r of
     0: BaseUrl := GetURLBase;
     1: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088', 'maps.melda.ru');
+    2: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088/pub/genshtab', 't.caucasia.ru:80');
   end;
 
   // Проверяем наличие масштаба