diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm
index 5fb5f0c8bd..5b792451bc 100644
--- a/code/controllers/shuttle_controller.dm
+++ b/code/controllers/shuttle_controller.dm
@@ -13,6 +13,17 @@ var/global/datum/shuttle_controller/shuttle_controller
shuttle.process()
+//This is called by gameticker after all the machines and radio frequencies have been properly initialized
+/datum/shuttle_controller/proc/setup_shuttle_docks()
+ for(var/shuttle_tag in shuttles)
+ var/datum/shuttle/shuttle = shuttles[shuttle_tag]
+ shuttle.init_docking_controllers()
+ shuttle.dock() //makes all shuttles docked to something at round start go into the docked state
+
+ for(var/obj/machinery/embedded_controller/C in machines)
+ if(istype(C.program, /datum/computer/file/embedded_program/docking))
+ C.program.tag = null //clear the tags, 'cause we don't need 'em anymore
+
/datum/shuttle_controller/New()
shuttles = list()
process_shuttles = list()
@@ -235,72 +246,3 @@ var/global/datum/shuttle_controller/shuttle_controller
MS.warmup_time = 0
shuttles["Mercenary"] = MS
-
-//This is called by gameticker after all the machines and radio frequencies have been properly initialized
-/datum/shuttle_controller/proc/setup_shuttle_docks()
- var/datum/shuttle/shuttle
- var/datum/shuttle/ferry/multidock/multidock
- var/list/dock_controller_map = list() //so we only have to iterate once through each list
-
- //multidock shuttles
- var/list/dock_controller_map_station = list()
- var/list/dock_controller_map_offsite = list()
-
- for (var/shuttle_tag in shuttles)
- shuttle = shuttles[shuttle_tag]
- if (shuttle.docking_controller_tag)
- dock_controller_map[shuttle.docking_controller_tag] = shuttle
- if (istype(shuttle, /datum/shuttle/ferry/multidock))
- multidock = shuttle
- dock_controller_map_station[multidock.docking_controller_tag_station] = multidock
- dock_controller_map_offsite[multidock.docking_controller_tag_offsite] = multidock
-
- //escape pod arming controllers
- var/datum/shuttle/ferry/escape_pod/pod
- var/list/pod_controller_map = list()
- for (var/datum/shuttle/ferry/escape_pod/P in emergency_shuttle.escape_pods)
- if (P.dock_target_station)
- pod_controller_map[P.dock_target_station] = P
-
- //search for the controllers, if we have one.
- if (dock_controller_map.len)
- for (var/obj/machinery/embedded_controller/radio/C in machines) //only radio controllers are supported at the moment
- if (istype(C.program, /datum/computer/file/embedded_program/docking))
- if (C.id_tag in dock_controller_map)
- shuttle = dock_controller_map[C.id_tag]
- shuttle.docking_controller = C.program
- dock_controller_map -= C.id_tag
-
- //escape pods
- if(istype(C, /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod) && istype(shuttle, /datum/shuttle/ferry/escape_pod))
- var/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/EPC = C
- EPC.pod = shuttle
-
- if (C.id_tag in dock_controller_map_station)
- multidock = dock_controller_map_station[C.id_tag]
- if (istype(multidock))
- multidock.docking_controller_station = C.program
- dock_controller_map_station -= C.id_tag
- if (C.id_tag in dock_controller_map_offsite)
- multidock = dock_controller_map_offsite[C.id_tag]
- if (istype(multidock))
- multidock.docking_controller_offsite = C.program
- dock_controller_map_offsite -= C.id_tag
-
- //escape pods
- if (C.id_tag in pod_controller_map)
- pod = pod_controller_map[C.id_tag]
- if (istype(C.program, /datum/computer/file/embedded_program/docking/simple/escape_pod/))
- pod.arming_controller = C.program
-
- //sanity check
- if (dock_controller_map.len || dock_controller_map_station.len || dock_controller_map_offsite.len)
- var/dat = ""
- for (var/dock_tag in dock_controller_map + dock_controller_map_station + dock_controller_map_offsite)
- dat += "\"[dock_tag]\", "
- world << "\red \b warning: shuttles with docking tags [dat] could not find their controllers!"
-
- //makes all shuttles docked to something at round start go into the docked state
- for (var/shuttle_tag in shuttles)
- shuttle = shuttles[shuttle_tag]
- shuttle.dock()
diff --git a/code/game/machinery/embedded_controller/docking_program.dm b/code/game/machinery/embedded_controller/docking_program.dm
index 032676f037..987634d02a 100644
--- a/code/game/machinery/embedded_controller/docking_program.dm
+++ b/code/game/machinery/embedded_controller/docking_program.dm
@@ -71,6 +71,15 @@
var/override_enabled = 0 //when enabled, do not open/close doors or cycle airlocks and wait for the player to do it manually
var/received_confirm = 0 //for undocking, whether the server has recieved a confirmation from the client
+/datum/computer/file/embedded_program/docking/New()
+ ..()
+ var/datum/existing = locate(id_tag) //in case a datum already exists with our tag
+ if(existing)
+ existing.tag = null //take it from them
+
+ tag = id_tag //Greatly simplifies shuttle initialization
+
+
/datum/computer/file/embedded_program/docking/receive_signal(datum/signal/signal, receive_method, receive_param)
var/receive_tag = signal.data["tag"] //for docking signals, this is the sender id
var/command = signal.data["command"]
diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm
index 289cf4d7b0..7c0ca83b80 100644
--- a/code/modules/shuttles/escape_pods.dm
+++ b/code/modules/shuttles/escape_pods.dm
@@ -1,6 +1,19 @@
/datum/shuttle/ferry/escape_pod
var/datum/computer/file/embedded_program/docking/simple/escape_pod/arming_controller
+/datum/shuttle/ferry/escape_pod/init_docking_controllers()
+ ..()
+ arming_controller = locate(dock_target_station)
+ if(!istype(arming_controller))
+ world << "warning: escape pod with station dock tag [dock_target_station] could not find it's dock target!"
+
+ if(docking_controller)
+ var/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/controller_master = docking_controller.master
+ if(!istype(controller_master))
+ world << "warning: escape pod with docking tag [docking_controller_tag] could not find it's controller master!"
+ else
+ controller_master.pod = src
+
/datum/shuttle/ferry/escape_pod/can_launch()
if(arming_controller && !arming_controller.armed) //must be armed
return 0
diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm
index c0e8d31546..40661ee2ff 100644
--- a/code/modules/shuttles/shuttle.dm
+++ b/code/modules/shuttles/shuttle.dm
@@ -12,6 +12,12 @@
var/arrive_time = 0 //the time at which the shuttle arrives when long jumping
+/datum/shuttle/proc/init_docking_controllers()
+ if(docking_controller_tag)
+ docking_controller = locate(docking_controller_tag)
+ if(!istype(docking_controller))
+ world << "warning: shuttle with docking tag [docking_controller_tag] could not find it's controller!"
+
/datum/shuttle/proc/short_jump(var/area/origin,var/area/destination)
if(moving_status != SHUTTLE_IDLE) return
diff --git a/code/modules/shuttles/shuttle_specops.dm b/code/modules/shuttles/shuttle_specops.dm
index 8e3fd5fb0b..078d1e9a5a 100644
--- a/code/modules/shuttles/shuttle_specops.dm
+++ b/code/modules/shuttles/shuttle_specops.dm
@@ -14,6 +14,16 @@
var/datum/computer/file/embedded_program/docking/docking_controller_station
var/datum/computer/file/embedded_program/docking/docking_controller_offsite
+/datum/shuttle/ferry/multidock/init_docking_controllers()
+ if(docking_controller_tag_station)
+ docking_controller_station = locate(docking_controller_tag_station)
+ if(!istype(docking_controller_station))
+ world << "warning: shuttle with docking tag [docking_controller_station] could not find it's controller!"
+ if(docking_controller_tag_offsite)
+ docking_controller_offsite = locate(docking_controller_tag_offsite)
+ if(!istype(docking_controller_offsite))
+ world << "warning: shuttle with docking tag [docking_controller_offsite] could not find it's controller!"
+
/datum/shuttle/ferry/multidock/move(var/area/origin,var/area/destination)
..(origin, destination)
if (!location)