diff --git a/baystation12.dme b/baystation12.dme
index b0f8c143381f5..ad1f0695cad8c 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -3367,6 +3367,8 @@
#include "mods\_master_files\code\modules\culture_descriptor\religion\religions_vox.dm"
#include "mods\_master_files\code\modules\events\gravity.dm"
#include "mods\_master_files\code\modules\mob\new_player\new_player.dm"
+#include "mods\_master_files\code\modules\overmap\distress.dm"
+#include "mods\_master_files\code\modules\overmap\panicbutton.dm"
#include "mods\_master_files\code\modules\power\gravitygenerator.dm"
#include "mods\_master_files\code\modules\projectiles\projectile\bullets.dm"
#include "mods\_master_files\code\modules\species\station\adherent.dm"
diff --git a/mods/_master_files/code/modules/overmap/distress.dm b/mods/_master_files/code/modules/overmap/distress.dm
new file mode 100644
index 0000000000000..3a0e220a3f885
--- /dev/null
+++ b/mods/_master_files/code/modules/overmap/distress.dm
@@ -0,0 +1,84 @@
+/obj/overmap/radio/distress/panic_distress
+ name = "panic distress"
+ icon = 'packs/infinity/icons/obj/distress.dmi'
+ icon_state = "distress"
+
+/obj/overmap/radio/distress/panic_distress/get_scan_data(mob/user)
+ return list("A unilateral, broadband data broadcast originating at \the [source] carrying only an emergency code sequence.")
+
+/obj/overmap/radio/distress/panic_distress/set_origin(obj/overmap/origin)
+ GLOB.moved_event.register(origin, src, TYPE_PROC_REF(/obj/overmap/radio, follow))
+ GLOB.destroyed_event.register(origin, src, TYPE_PROC_REF(/datum, qdel_self))
+ forceMove(origin.loc)
+ source = origin
+ pixel_x = 0
+ pixel_y = 0
+
+/obj/overmap/visitable/proc/distress(mob/user)
+
+ log_and_message_admins(message ="Overmap panic button hit on z[z] ([name]) by '[user?.ckey || "Unknown"]'")
+
+ var/distress_message = "Это автоматический сигнал бедствия от радиомаяка, соответствующего стандарту MIL-DTL-93352, передаваемого на частоте [PUB_FREQ*0.1]кГц. \
+ Этот маяк был запущен с '[initial(name)]'. Местоположение передающего устройства: [get_distress_info()]. \
+ Согласно Межпланетной конвенции о космической спасательной деятельности, лица, получившие это сообщение, должны попытаться предпринять попытку спасения, \
+ или передать сообщение тем, кто может это сделать. Это сообщение повторится еще раз через 5 минут. Спасибо за вашу помощь."
+
+ //sends to a single z-level of every /obj/overmap/visitable
+ var/list/sent_to_z = list()
+ for(var/zlevel in map_sectors)
+ var/obj/overmap/visitable/O = map_sectors[zlevel]
+ if(!isnull(O))
+ var/should_send = TRUE
+ var/list/overmap_z_list = O.map_z
+ for(var/z_map in overmap_z_list)
+ if(z_map in sent_to_z)
+ should_send = FALSE
+ else
+ sent_to_z.Add(z_map)
+ if(should_send && length(overmap_z_list))
+ priority_announcement.Announce(distress_message, "Automated Distress Signal", new_sound = sound('packs/infinity/sound/AI/sos.ogg'), zlevels = overmap_z_list)
+
+ //sends to a single random z-level (original)
+ //priority_announcement.Announce(distress_message, "Automated Distress Signal", new_sound = sound('packs/infinity/sound/AI/sos.ogg'), zlevels = GLOB.using_map.player_levels)
+
+ var/obj/overmap/radio/distress/panic_distress/emergency_signal = new /obj/overmap/radio/distress/panic_distress()
+
+ emergency_signal.set_origin(src)
+
+ addtimer(new Callback(src, PROC_REF(distress_update)), 5 MINUTES)
+ return TRUE
+
+/obj/overmap/visitable/proc/get_distress_info()
+ return "\[X:[x], Y:[y]\]"
+
+// Get heading in degrees (like a compass heading)
+/obj/overmap/visitable/ship/proc/get_heading_degrees()
+ return (Atan2(speed[2], speed[1]) + 360) % 360 // Yes ATAN2(y, x) is correct to get clockwise degrees
+
+/obj/overmap/visitable/ship/get_distress_info()
+ var/turf/T = get_turf(src) // Usually we're on the turf, but sometimes we might be landed or something.
+ var/x_to_use = T?.x || "UNK"
+ var/y_to_use = T?.y || "UNK"
+ return "\[X:[x_to_use], Y:[y_to_use], VEL:[get_speed() * 1000], HDG:[get_heading_degrees()]\]"
+
+/obj/overmap/visitable/proc/distress_update()
+ var/message = "Это последнее сообщение с маяка бедствия, запущенного '[initial(name)]'. Местоположение передающего устройства: [get_distress_info()]. \
+ Пожалуйста, окажите помощь в соответствии с вашими обязательствами по Межпланетной конвенции о космической спасательной деятельности, или передайте это сообщение той стороне, которая может это сделать."
+
+ //sends to a single z-level of every /obj/overmap/visitable
+ var/list/sent_to_z = list()
+ for(var/zlevel in map_sectors)
+ var/obj/overmap/visitable/O = map_sectors[zlevel]
+ if(!isnull(O))
+ var/should_send = TRUE
+ var/list/overmap_z_list = O.map_z
+ for(var/z_map in overmap_z_list)
+ if(z_map in sent_to_z)
+ should_send = FALSE
+ else
+ sent_to_z.Add(z_map)
+ if(should_send && length(overmap_z_list))
+ priority_announcement.Announce(message, "Automated Distress Signal", new_sound = sound('packs/infinity/sound/AI/sos.ogg'), zlevels = overmap_z_list)
+
+ //sends to a single random z-level (original)
+ //priority_announcement.Announce(message, "Automated Distress Signal", new_sound = sound('packs/infinity/sound/AI/sos.ogg'), zlevels = GLOB.using_map.player_levels)
\ No newline at end of file
diff --git a/mods/_master_files/code/modules/overmap/panicbutton.dm b/mods/_master_files/code/modules/overmap/panicbutton.dm
new file mode 100644
index 0000000000000..2c0862c1ec0eb
--- /dev/null
+++ b/mods/_master_files/code/modules/overmap/panicbutton.dm
@@ -0,0 +1,64 @@
+/obj/structure/panic_button
+ name = "distress beacon trigger"
+ desc = "WARNING: Will deploy ship's distress beacon and request help. Misuse may result in fines and jail time."
+ icon = 'packs/infinity/icons/obj/panicbutton.dmi'
+ icon_state = "panicbutton"
+ anchored = TRUE
+
+ var/glass = TRUE
+ var/launched = FALSE
+
+
+/obj/structure/panic_button/on_update_icon()
+ if(launched)
+ icon_state = "[initial(icon_state)]_launched"
+ else if(!glass)
+ icon_state = "[initial(icon_state)]_open"
+ else
+ icon_state = "[initial(icon_state)]"
+
+/obj/structure/panic_button/attack_hand(mob/living/user)
+ if(!istype(user))
+ return ..()
+
+ if(user.incapacitated())
+ return
+
+ // Already launched
+ if(launched)
+ to_chat(user, "The button is already depressed; the beacon has been launched already.")
+ // Glass present
+ else if(glass)
+ if(user.a_intent == I_HURT)
+ user.custom_emote(VISIBLE_MESSAGE, "smashes the glass on [src]!")
+ glass = FALSE
+ playsound(src, 'sound/effects/hit_on_shattered_glass.ogg')
+ update_icon()
+ else
+ user.custom_emote(VISIBLE_MESSAGE, "pats [src] in a friendly manner.")
+ to_chat(user, "If you're trying to break the glass, you'll have to hit it harder than that...")
+ // Must be !glass and !launched
+ else if(!glass && !launched)
+ user.custom_emote(VISIBLE_MESSAGE, "pushes the button on [src]!")
+ playsound(src, get_sfx("button"))
+ update_icon()
+ launch(usr)
+
+/obj/structure/panic_button/proc/launch(mob/living/user)
+ var/sound/SND = sound('packs/infinity/sound/misc/emergency_beacon_launched.ogg') // Inside the loop because playsound_local modifies it for each person, so, need separate instances
+
+ if(launched)
+ return
+ launched = TRUE
+
+ var/overmap_sector
+
+ if(GLOB.using_map.use_overmap)
+ overmap_sector = map_sectors["[z]"]
+
+ var/obj/overmap/visitable/S = overmap_sector
+ if(!S)
+ error("Distress button hit on z[z] but that's not an overmap sector...")
+ return
+ S.distress(user)
+ playsound(src, SND, 25)
diff --git a/mods/global_modpacks.dm b/mods/global_modpacks.dm
index 2b0238f4439e2..dfed27be92162 100644
--- a/mods/global_modpacks.dm
+++ b/mods/global_modpacks.dm
@@ -36,5 +36,6 @@
#include "anomaly/_anomaly.dme"
#include "integrated_circuits/_integrated_circuits.dme"
#include "playable_away_yacht/_yacht.dme"
+#include "overmap/_overmap.dme"
#include "../packs/sierra-tweaks/_pack.dm"
diff --git a/mods/overmap/README.md b/mods/overmap/README.md
new file mode 100644
index 0000000000000..ff36e483161d1
--- /dev/null
+++ b/mods/overmap/README.md
@@ -0,0 +1,83 @@
+
+#### Список PRов:
+
+- https://github.com/SierraBay/SierraBay12/pull/2667
+
+
+
+## Overmap
+
+ID мода: OVERMAP
+
+
+### Описание мода
+
+Портирует отображение для скана контактов и экстренную кнопку бедствия. В идеале может содержать любые изменения по овермапу.
+
+
+### Изменения *кор кода*
+
+- Отсутствуют
+
+
+### Оверрайды
+
+- Отсутствуют
+
+
+### Дефайны
+
+- Отсутствуют
+
+
+### Используемые файлы, не содержащиеся в модпаке
+
+- `mods/_master_files/code/modules/overmap/distress.dm`
+- `mods/_master_files/code/modules/overmap/panicbutton.dm`
+- `packs/infinity/icons/obj/distress.dmi`
+- `packs/infinity/sound/AI/sos.ogg`
+- `packs/infinity/icons/obj/panicbutton.dmi`
+- `packs/infinity/sound/misc/emergency_beacon_launched.ogg`
+
+
+### Авторы:
+
+Портировал:Builder13
+Оригинальный ПР: https://github.com/ss220-space/Baystation12/pull/350 (ImJustKisik)
+
diff --git a/mods/overmap/_overmap.dm b/mods/overmap/_overmap.dm
new file mode 100644
index 0000000000000..18a9eda318a3f
--- /dev/null
+++ b/mods/overmap/_overmap.dm
@@ -0,0 +1,4 @@
+/singleton/modpack/overmap
+ name = "Overmap"
+ desc = "Дополнения и изменения, связанные с овермапом."
+ author = "Builder13(портировал), ImJustKisik(автор)"
\ No newline at end of file
diff --git a/mods/overmap/_overmap.dme b/mods/overmap/_overmap.dme
new file mode 100644
index 0000000000000..6858eaeb40448
--- /dev/null
+++ b/mods/overmap/_overmap.dme
@@ -0,0 +1,15 @@
+#ifndef MODPACK_OVERMAP
+#define MODPACK_OVERMAP
+
+#include "_overmap.dm"
+
+#include "code/contacts/contact_class.dm"
+#include "code/contacts/special_contact_class.dm"
+
+#include "code/overmap_object.dm"
+#include "code/ship.dm"
+
+#include "code/overmap_objects/stationary.dm"
+#include "code/overmap_objects/ships.dm"
+
+#endif
diff --git a/mods/overmap/code/contacts/contact_class.dm b/mods/overmap/code/contacts/contact_class.dm
new file mode 100644
index 0000000000000..d08bf95ab9ebe
--- /dev/null
+++ b/mods/overmap/code/contacts/contact_class.dm
@@ -0,0 +1,38 @@
+/decl/ship_contact_class
+ var/class_short = "Ship"
+ var/class_long = "Unknown Ship Class"
+ var/min_ship_mass = 0
+ var/max_ship_mass = INFINITY
+
+/decl/ship_contact_class/ship
+ class_short = "SH"
+ class_long = "Ship"
+ max_ship_mass = 10000
+
+/decl/ship_contact_class/shuttle
+ class_short = "SHUTTLE"
+ class_long = "Shuttle"
+ max_ship_mass = 10000
+
+/decl/ship_contact_class/destroyer_escort
+ class_short = "DE"
+ class_long = "Destroyer Escort"
+ min_ship_mass = 10000
+ max_ship_mass = 50000
+
+/decl/ship_contact_class/destroyer
+ class_short = "DD"
+ class_long = "Destroyer"
+ min_ship_mass = 50000
+ max_ship_mass = 100000
+
+/decl/ship_contact_class/cruiser
+ class_short = "CA"
+ class_long = "Cruiser"
+ min_ship_mass = 100000
+ max_ship_mass = 250000
+
+/decl/ship_contact_class/capital_ship
+ class_short = "CAP"
+ class_long = "Capital Ship"
+ min_ship_mass = 250000
diff --git a/mods/overmap/code/contacts/special_contact_class.dm b/mods/overmap/code/contacts/special_contact_class.dm
new file mode 100644
index 0000000000000..0826be0b86f42
--- /dev/null
+++ b/mods/overmap/code/contacts/special_contact_class.dm
@@ -0,0 +1,34 @@
+/decl/ship_contact_class/srv
+ class_short = "SRV"
+ class_long = "Sol Research Vessel"
+ max_ship_mass = 12000
+
+/decl/ship_contact_class/srv_shuttle
+ class_short = "SRV"
+ class_long = "Research Shuttle"
+ max_ship_mass = 6000
+
+/decl/ship_contact_class/gagarin
+ class_short = "GRC"
+ class_long = "Gagarin-Class recon craft"
+ max_ship_mass = 55000
+
+/decl/ship_contact_class/merchant
+ class_short = "FTU"
+ class_long = "Free Trader Union Ship"
+ max_ship_mass = 7000
+
+/decl/ship_contact_class/nagashino
+ class_short = "NAG"
+ class_long = "Nagashino-Class patrol craft"
+ max_ship_mass = 5000
+
+/decl/ship_contact_class/dagon
+ class_short = "MAKO"
+ class_long = "Mako-Class Frigate"
+ max_ship_mass = 70000
+
+/decl/ship_contact_class/nt_sshuttle
+ class_short = "NSS"
+ class_long = "Nanotrasen Small Shuttle"
+ max_ship_mass = 70000
\ No newline at end of file
diff --git a/mods/overmap/code/overmap_object.dm b/mods/overmap/code/overmap_object.dm
new file mode 100644
index 0000000000000..628c23a77ab25
--- /dev/null
+++ b/mods/overmap/code/overmap_object.dm
@@ -0,0 +1,13 @@
+/obj/overmap
+ var/scanner_desc = ""
+
+/obj/overmap/get_scan_data(mob/user)
+ var/temp_data = list({"Scan conducted at:
[stationtime2text()] [stationdate2text()] Grid coordinates:
[x],[y]\n\n[scanner_desc]"})
+ for(var/id in scans)
+ var/datum/sector_scan/scan = scans[id]
+ if (!scan.required_skill || user.skill_check(scan.required_skill, scan.required_skill_level))
+ temp_data += scan.description
+ else if (scan.low_skill_description)
+ temp_data += scan.low_skill_description
+
+ return temp_data
\ No newline at end of file
diff --git a/mods/overmap/code/overmap_objects/ships.dm b/mods/overmap/code/overmap_objects/ships.dm
new file mode 100644
index 0000000000000..2c77c6e77df3b
--- /dev/null
+++ b/mods/overmap/code/overmap_objects/ships.dm
@@ -0,0 +1,111 @@
+/obj/overmap/visitable/ship
+ name = "spacecraft"
+ scanner_desc = "Unknown spacefaring vessel."
+ var/class = "spacefaring vessel"
+ var/decl/ship_contact_class/contact_class = /decl/ship_contact_class
+
+/obj/overmap/visitable/ship/sierra
+ scanner_desc = @{"
+