diff --git a/code/controllers/Processes/Shuttle.dm b/code/controllers/Processes/Shuttle.dm
new file mode 100644
index 0000000000..a10586d76d
--- /dev/null
+++ b/code/controllers/Processes/Shuttle.dm
@@ -0,0 +1,9 @@
+/datum/controller/process/Shuttle/setup()
+ name = "shuttle controller"
+ schedule_interval = 20 // every 2 seconds
+
+ if(!shuttle_controller)
+ shuttle_controller = new
+
+/datum/controller/process/Shuttle/doWork()
+ shuttle_controller.process()
diff --git a/code/controllers/Processes/air.dm b/code/controllers/Processes/air.dm
new file mode 100644
index 0000000000..d8ca38844a
--- /dev/null
+++ b/code/controllers/Processes/air.dm
@@ -0,0 +1,22 @@
+/datum/controller/process/air/setup()
+ name = "air"
+ schedule_interval = 20 // every 2 seconds
+
+ if(!air_master)
+ air_master = new
+ air_master.Setup()
+
+/datum/controller/process/air/doWork()
+ if(!air_processing_killed)
+ if(!air_master.Tick()) //Runtimed.
+ air_master.failed_ticks++
+
+ if(air_master.failed_ticks > 5)
+ world << "RUNTIMES IN ATMOS TICKER. Killing air simulation!"
+ world.log << "### ZAS SHUTDOWN"
+
+ message_admins("ZASALERT: Shutting down! status: [air_master.tick_progress]")
+ log_admin("ZASALERT: Shutting down! status: [air_master.tick_progress]")
+
+ air_processing_killed = TRUE
+ air_master.failed_ticks = 0
diff --git a/code/controllers/Processes/disease.dm b/code/controllers/Processes/disease.dm
new file mode 100644
index 0000000000..a8d840097e
--- /dev/null
+++ b/code/controllers/Processes/disease.dm
@@ -0,0 +1,11 @@
+/datum/controller/process/disease
+ var/tmp/datum/updateQueue/updateQueueInstance
+
+/datum/controller/process/disease/setup()
+ name = "disease"
+ schedule_interval = 20 // every 2 seconds
+ updateQueueInstance = new
+
+/datum/controller/process/disease/doWork()
+ updateQueueInstance.init(active_diseases, "process")
+ updateQueueInstance.Run()
diff --git a/code/controllers/Processes/emergencyShuttle.dm b/code/controllers/Processes/emergencyShuttle.dm
new file mode 100644
index 0000000000..e7289311b9
--- /dev/null
+++ b/code/controllers/Processes/emergencyShuttle.dm
@@ -0,0 +1,9 @@
+/datum/controller/process/emergencyShuttle/setup()
+ name = "emergency shuttle"
+ schedule_interval = 20 // every 2 seconds
+
+ if(!emergency_shuttle)
+ emergency_shuttle = new
+
+/datum/controller/process/emergencyShuttle/doWork()
+ emergency_shuttle.process()
diff --git a/code/controllers/Processes/event.dm b/code/controllers/Processes/event.dm
new file mode 100644
index 0000000000..72bc01613d
--- /dev/null
+++ b/code/controllers/Processes/event.dm
@@ -0,0 +1,6 @@
+/datum/controller/process/event/setup()
+ name = "event controller"
+ schedule_interval = 20 // every 2 seconds
+
+/datum/controller/process/event/doWork()
+ event_manager.process()
\ No newline at end of file
diff --git a/code/controllers/Processes/inactivity.dm b/code/controllers/Processes/inactivity.dm
new file mode 100644
index 0000000000..b610502d19
--- /dev/null
+++ b/code/controllers/Processes/inactivity.dm
@@ -0,0 +1,16 @@
+/datum/controller/process/inactivity/setup()
+ name = "inactivity"
+ schedule_interval = INACTIVITY_KICK
+
+/datum/controller/process/inactivity/doWork()
+ if(config.kick_inactive)
+ for(var/client/C in clients)
+ if(C.is_afk(INACTIVITY_KICK))
+ if(!istype(C.mob, /mob/dead))
+ log_access("AFK: [key_name(C)]")
+ C << "You have been inactive for more than 10 minutes and have been disconnected."
+ del(C)
+
+ scheck()
+
+#undef INACTIVITY_KICK
diff --git a/code/controllers/Processes/lighting.dm b/code/controllers/Processes/lighting.dm
new file mode 100644
index 0000000000..9399fe0253
--- /dev/null
+++ b/code/controllers/Processes/lighting.dm
@@ -0,0 +1,26 @@
+/datum/controller/process/lighting/setup()
+ name = "lighting"
+ schedule_interval = 5 // every .5 second
+ lighting_controller.initializeLighting()
+
+/datum/controller/process/lighting/doWork()
+ lighting_controller.lights_workload_max = \
+ max(lighting_controller.lights_workload_max, lighting_controller.lights.len)
+
+ for(var/datum/light_source/L in lighting_controller.lights)
+ if(L && L.check())
+ lighting_controller.lights.Remove(L)
+
+ scheck()
+
+ lighting_controller.changed_turfs_workload_max = \
+ max(lighting_controller.changed_turfs_workload_max, lighting_controller.changed_turfs.len)
+
+ for(var/turf/T in lighting_controller.changed_turfs)
+ if(T && T.lighting_changed)
+ T.shift_to_subarea()
+
+ scheck()
+
+ if(lighting_controller.changed_turfs && lighting_controller.changed_turfs.len)
+ lighting_controller.changed_turfs.len = 0 // reset the changed list
diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm
new file mode 100644
index 0000000000..52274a519a
--- /dev/null
+++ b/code/controllers/Processes/machinery.dm
@@ -0,0 +1,34 @@
+/datum/controller/process/machinery/setup()
+ name = "machinery"
+ schedule_interval = 20 // every 2 seconds
+
+/datum/controller/process/machinery/doWork()
+ //#ifdef PROFILE_MACHINES
+ //machine_profiling.len = 0
+ //#endif
+
+ for(var/obj/machinery/M in machines)
+ if(M && !M.gcDestroyed)
+ #ifdef PROFILE_MACHINES
+ var/time_start = world.timeofday
+ #endif
+
+ if(M.process() == PROCESS_KILL)
+ //M.inMachineList = 0 We don't use this debugging function
+ machines.Remove(M)
+ continue
+
+ if(M && M.use_power)
+ M.auto_use_power()
+
+ #ifdef PROFILE_MACHINES
+ var/time_end = world.timeofday
+
+ if(!(M.type in machine_profiling))
+ machine_profiling[M.type] = 0
+
+ machine_profiling[M.type] += (time_end - time_start)
+ #endif
+
+ scheck()
+
diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm
new file mode 100644
index 0000000000..b3765b0cf9
--- /dev/null
+++ b/code/controllers/Processes/mob.dm
@@ -0,0 +1,20 @@
+/datum/controller/process/mob
+ var/tmp/datum/updateQueue/updateQueueInstance
+
+/datum/controller/process/mob/setup()
+ name = "mob"
+ schedule_interval = 20 // every 2 seconds
+ updateQueueInstance = new
+
+/datum/controller/process/mob/started()
+ ..()
+ if(!updateQueueInstance)
+ if(!mob_list)
+ mob_list = list()
+ else if(mob_list.len)
+ updateQueueInstance = new
+
+/datum/controller/process/mob/doWork()
+ if(updateQueueInstance)
+ updateQueueInstance.init(mob_list, "Life")
+ updateQueueInstance.Run()
diff --git a/code/controllers/Processes/nanoui.dm b/code/controllers/Processes/nanoui.dm
new file mode 100644
index 0000000000..c8396bcab8
--- /dev/null
+++ b/code/controllers/Processes/nanoui.dm
@@ -0,0 +1,11 @@
+/datum/controller/process/nanoui
+ var/tmp/datum/updateQueue/updateQueueInstance
+
+/datum/controller/process/nanoui/setup()
+ name = "nanoui"
+ schedule_interval = 20 // every 2 seconds
+ updateQueueInstance = new
+
+/datum/controller/process/nanoui/doWork()
+ updateQueueInstance.init(nanomanager.processing_uis, "process")
+ updateQueueInstance.Run()
diff --git a/code/controllers/Processes/obj.dm b/code/controllers/Processes/obj.dm
new file mode 100644
index 0000000000..15ad98dd3d
--- /dev/null
+++ b/code/controllers/Processes/obj.dm
@@ -0,0 +1,21 @@
+var/global/list/object_profiling = list()
+/datum/controller/process/obj
+ var/tmp/datum/updateQueue/updateQueueInstance
+
+/datum/controller/process/obj/setup()
+ name = "obj"
+ schedule_interval = 20 // every 2 seconds
+ updateQueueInstance = new
+
+/datum/controller/process/obj/started()
+ ..()
+ if(!updateQueueInstance)
+ if(!processing_objects)
+ processing_objects = list()
+ else if(processing_objects.len)
+ updateQueueInstance = new
+
+/datum/controller/process/obj/doWork()
+ if(updateQueueInstance)
+ updateQueueInstance.init(processing_objects, "process")
+ updateQueueInstance.Run()
diff --git a/code/controllers/Processes/pipenet.dm b/code/controllers/Processes/pipenet.dm
new file mode 100644
index 0000000000..56a068f54c
--- /dev/null
+++ b/code/controllers/Processes/pipenet.dm
@@ -0,0 +1,12 @@
+/datum/controller/process/pipenet/setup()
+ name = "pipenet"
+ schedule_interval = 20 // every 2 seconds
+
+/datum/controller/process/pipenet/doWork()
+ for(var/datum/pipe_network/pipeNetwork in pipe_networks)
+ if(istype(pipeNetwork) && !pipeNetwork.disposed)
+ pipeNetwork.process()
+ scheck()
+ continue
+
+ pipe_networks.Remove(pipeNetwork)
diff --git a/code/controllers/Processes/powernet.dm b/code/controllers/Processes/powernet.dm
new file mode 100644
index 0000000000..1edf194915
--- /dev/null
+++ b/code/controllers/Processes/powernet.dm
@@ -0,0 +1,12 @@
+/datum/controller/process/powernet/setup()
+ name = "powernet"
+ schedule_interval = 20 // every 2 seconds
+
+/datum/controller/process/powernet/doWork()
+ for(var/datum/powernet/powerNetwork in powernets)
+ if(istype(powerNetwork) && !powerNetwork.disposed)
+ powerNetwork.reset()
+ scheck()
+ continue
+
+ powernets.Remove(powerNetwork)
diff --git a/code/controllers/Processes/sun.dm b/code/controllers/Processes/sun.dm
new file mode 100644
index 0000000000..f09806cef5
--- /dev/null
+++ b/code/controllers/Processes/sun.dm
@@ -0,0 +1,7 @@
+/datum/controller/process/sun/setup()
+ name = "sun"
+ schedule_interval = 20 // every second
+ sun = new
+
+/datum/controller/process/sun/doWork()
+ sun.calc_position()
diff --git a/code/controllers/Processes/supply.dm b/code/controllers/Processes/supply.dm
new file mode 100644
index 0000000000..891a511ec6
--- /dev/null
+++ b/code/controllers/Processes/supply.dm
@@ -0,0 +1,6 @@
+/datum/controller/process/supply/setup()
+ name = "supply controller"
+ schedule_interval = 300 // every 30 seconds
+
+/datum/controller/process/supply/doWork()
+ supply_controller.process()
\ No newline at end of file
diff --git a/code/controllers/Processes/ticker.dm b/code/controllers/Processes/ticker.dm
new file mode 100644
index 0000000000..b7c45ba91a
--- /dev/null
+++ b/code/controllers/Processes/ticker.dm
@@ -0,0 +1,35 @@
+var/global/datum/controller/process/ticker/tickerProcess
+
+/datum/controller/process/ticker
+ var/lastTickerTimeDuration
+ var/lastTickerTime
+
+/datum/controller/process/ticker/setup()
+ name = "ticker"
+ schedule_interval = 20 // every 2 seconds
+
+ lastTickerTime = world.timeofday
+
+ if(!ticker)
+ ticker = new
+
+ tickerProcess = src
+
+ spawn(0)
+ if(ticker)
+ ticker.pregame()
+
+/datum/controller/process/ticker/doWork()
+ var/currentTime = world.timeofday
+
+ if(currentTime < lastTickerTime) // check for midnight rollover
+ lastTickerTimeDuration = (currentTime - (lastTickerTime - TICKS_IN_DAY)) / TICKS_IN_SECOND
+ else
+ lastTickerTimeDuration = (currentTime - lastTickerTime) / TICKS_IN_SECOND
+
+ lastTickerTime = currentTime
+
+ ticker.process()
+
+/datum/controller/process/ticker/proc/getLastTickerTimeDuration()
+ return lastTickerTimeDuration
diff --git a/code/controllers/Processes/vote.dm b/code/controllers/Processes/vote.dm
new file mode 100644
index 0000000000..5df5ce6979
--- /dev/null
+++ b/code/controllers/Processes/vote.dm
@@ -0,0 +1,6 @@
+/datum/controller/process/vote/setup()
+ name = "vote"
+ schedule_interval = 10 // every second
+
+/datum/controller/process/vote/doWork()
+ vote.process()