diff --git a/code/__PATH_COMPATIBILITY/path_compatibility.dm b/code/__PATH_COMPATIBILITY/path_compatibility.dm
new file mode 100644
index 00000000000..f3ff37e2bbc
--- /dev/null
+++ b/code/__PATH_COMPATIBILITY/path_compatibility.dm
@@ -0,0 +1,28 @@
+/*
+
+ This is a smart+stupid method of maintaining paths during refactors.
+ At this point in time we have more maps than ever, and our tools just aren't that great.
+ So instead of repathing all the maps...
+
+ Keep the old path defined, just as an empty type with that path, and then define it's
+ parent_type as the new path, effectively maintaining the object/mob w/e without having
+ to touch all the maps, avoiding all those nasty conflicts!
+
+ Ideally the old paths would be cleaned out as mappers go about their usual routine of
+ updating old maps.
+
+ tl;dr TYPEFUCKERY, because fuck updating all these maps
+
+*/
+
+
+
+//Vehicle Refactor - 2015
+/obj/structure/bed/chair/janicart/secway
+ parent_type = /obj/vehicle/secway
+
+/obj/structure/bed/chair/janicart
+ parent_type = /obj/vehicle/janicart
+
+/obj/structure/bed/chair/janicart/atv
+ parent_type = /obj/vehicle/atv
\ No newline at end of file
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index d9333d6e123..521d01bfbec 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -157,217 +157,3 @@
if(signs)
overlays += "cart_sign[signs]"
-
-//old style PIMP-CART
-/obj/structure/bed/chair/janicart
- name = "janicart"
- desc = "A brave janitor cyborg gave its life to produce such an amazing combination of speed and utility."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "pussywagon"
- anchored = 0
- density = 1
- var/obj/item/weapon/storage/bag/trash/mybag = null
- var/callme = "pimpin' ride" //how do people refer to it?
- var/move_delay = 0
- var/floorbuffer = 0
- var/keytype = /obj/item/key/janitor
-
-/obj/structure/bed/chair/janicart/New()
- handle_rotation()
-
-/obj/structure/bed/chair/janicart/Move(a, b, flag)
- ..()
- if(floorbuffer)
- var/turf/tile = loc
- if(isturf(tile))
- tile.clean_blood()
- for(var/A in tile)
- if(istype(A, /obj/effect))
- if(is_cleanable(A))
- qdel(A)
-
-/obj/structure/bed/chair/janicart/examine(mob/user)
- ..()
- if(floorbuffer)
- user << "It has been upgraded with a floor buffer."
-
-
-/obj/structure/bed/chair/janicart/attackby(obj/item/I, mob/user, params)
- if(istype(I, keytype))
- user << "Hold [I] in one of your hands while you drive this [callme]."
- else if(istype(I, /obj/item/weapon/storage/bag/trash))
- if(keytype == /obj/item/key/janitor)
- if(!user.drop_item())
- return
- user << "You hook the trashbag onto the [callme]."
- I.loc = src
- mybag = I
- else if(istype(I, /obj/item/janiupgrade))
- if(keytype == /obj/item/key/janitor)
- floorbuffer = 1
- qdel(I)
- user << "You upgrade the [callme] with the floor buffer."
- update_icon()
-
-/obj/structure/bed/chair/janicart/update_icon()
- overlays.Cut()
- if(mybag)
- overlays += "cart_garbage"
- if(floorbuffer)
- overlays += "cart_buffer"
-
-/obj/structure/bed/chair/janicart/attack_hand(mob/user)
- if(..())
- return 1
- else if(mybag)
- mybag.loc = get_turf(user)
- user.put_in_hands(mybag)
- mybag = null
- update_icon()
-
-
-/obj/structure/bed/chair/janicart/relaymove(mob/user, direction)
- if(user.stat || user.stunned || user.weakened || user.paralysis)
- unbuckle_mob()
- if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype))
- if(!Process_Spacemove(direction) || !has_gravity(src.loc) || move_delay || !isturf(loc))
- return
- step(src, direction)
- update_mob()
- handle_rotation()
- move_delay = 1
- spawn(2)
- move_delay = 0
- else
- user << "You'll need the keys in one of your hands to drive this [callme]."
-
-/obj/structure/bed/chair/janicart/user_buckle_mob(mob/living/M, mob/user)
- if(user.incapacitated()) //user can't move the mob on the janicart's turf if incapacitated
- return
- for(var/atom/movable/A in get_turf(src)) //we check for obstacles on the turf.
- if(A.density)
- if(A != src && A != M)
- return
- M.loc = loc //we move the mob on the janicart's turf before checking if we can buckle.
- ..()
- update_mob()
-
-/obj/structure/bed/chair/janicart/unbuckle_mob(force = 0)
- if(buckled_mob)
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = 0
- . = ..()
-
-/obj/structure/bed/chair/janicart/handle_rotation()
- if((dir == SOUTH) || (dir == WEST) || (dir == EAST))
- layer = FLY_LAYER
- else
- layer = OBJ_LAYER
-
- if(buckled_mob)
- if(buckled_mob.loc != loc)
- buckled_mob.buckled = null //Temporary, so Move() succeeds.
- buckled_mob.buckled = src //Restoring
-
- update_mob()
-
-/obj/structure/bed/chair/janicart/Bump(atom/movable/M)
- . = ..()
- if(istype(M, /obj/machinery/door) && buckled_mob)
- M.Bumped(buckled_mob)
-
-/obj/structure/bed/chair/janicart/proc/update_mob()
- if(buckled_mob)
- buckled_mob.dir = dir
- switch(dir)
- if(SOUTH)
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = 7
- if(WEST)
- buckled_mob.pixel_x = 12
- buckled_mob.pixel_y = 7
- if(NORTH)
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = 4
- if(EAST)
- buckled_mob.pixel_x = -12
- buckled_mob.pixel_y = 7
-
-//keys+attachables//
-
-/obj/item/key
- name = "key"
- desc = "A small grey key."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "key"
- w_class = 1
-
-/obj/item/key/janitor
- desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"."
- icon_state = "keyjanitor"
-
-/obj/item/key/security
- desc = "A keyring with a small steel key, and a rubber stun baton accessory."
- icon_state = "keysec"
-
-/obj/item/janiupgrade
- name = "floor buffer upgrade"
- desc = "An upgrade for mobile janicarts."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "upgrade"
-
-//secway//
-
-/obj/structure/bed/chair/janicart/secway
- name = "secway"
- desc = "A brave security cyborg gave its life to help you look like a complete tool."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "secway"
- callme = "secway"
- keytype = /obj/item/key/security
-
-/obj/structure/bed/chair/janicart/secway/update_mob()
- if(buckled_mob)
- buckled_mob.dir = dir
- buckled_mob.pixel_y = 4
-
-//atv//
-
-/obj/structure/bed/chair/janicart/atv
- name = "atv"
- desc = "An all-terrain vehicle built for traversing rough terrain with ease. One of the few old-earth technologies that are still relevant on most planet-bound outposts."
- icon = 'icons/obj/vehicles.dmi'
- icon_state = "atv"
- callme = "All-terrain vehicle"
- keytype = /obj/item/key
- var/image/atvcover = null
-
-/obj/structure/bed/chair/janicart/atv/New()
- atvcover = image("icons/obj/vehicles.dmi", "atvcover")
- atvcover.layer = MOB_LAYER + 0.1
- return ..()
-
-obj/structure/bed/chair/janicart/atv/post_buckle_mob(mob/living/M)
- if(buckled_mob)
- overlays += atvcover
- else
- overlays -= atvcover
-
-/obj/structure/bed/chair/janicart/atv/update_mob()
- if(buckled_mob)
- buckled_mob.dir = dir
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = 4
-
-/obj/structure/bed/chair/janicart/atv/handle_rotation()
- if(dir == SOUTH)
- layer = FLY_LAYER
- else
- layer = OBJ_LAYER
-
- if(buckled_mob)
- if(buckled_mob.loc != loc)
- buckled_mob.buckled = null //Temporary, so Move() succeeds.
- buckled_mob.buckled = src //Restoring
-
- update_mob()
diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm
new file mode 100644
index 00000000000..6d9d94747dd
--- /dev/null
+++ b/code/modules/vehicles/atv.dm
@@ -0,0 +1,82 @@
+
+/obj/vehicle/atv
+ name = "all-terrain vehicle"
+ desc = "An all-terrain vehicle built for traversing rough terrain with ease. One of the few old-earth technologies that are still relevant on most planet-bound outposts."
+ icon_state = "atv"
+ keytype = /obj/item/key
+ generic_pixel_x = 0
+ generic_pixel_y = 4
+ vehicle_move_delay = 1
+ var/static/image/atvcover = null
+
+
+/obj/vehicle/atv/New()
+ ..()
+ if(!atvcover)
+ atvcover = image("icons/obj/vehicles.dmi", "atvcover")
+ atvcover.layer = MOB_LAYER + 0.1
+
+
+obj/vehicle/atv/post_buckle_mob(mob/living/M)
+ if(buckled_mob)
+ overlays += atvcover
+ else
+ overlays -= atvcover
+
+
+/obj/vehicle/atv/handle_vehicle_layer()
+ if(dir == SOUTH)
+ layer = MOB_LAYER+0.1
+ else
+ layer = OBJ_LAYER
+
+
+//TURRETS!
+/obj/vehicle/atv/turret
+ var/obj/machinery/porta_turret/syndicate/vehicle_turret/turret = null
+
+
+/obj/machinery/porta_turret/syndicate/vehicle_turret
+ name = "mounted turret"
+ scan_range = 7
+ emp_vunerable = 1
+ density = 0
+
+
+/obj/vehicle/atv/turret/New()
+ ..()
+ turret = new(loc)
+ turret.base = src
+
+
+/obj/vehicle/atv/turret/handle_vehicle_layer()
+ if(dir == SOUTH)
+ layer = MOB_LAYER+0.1
+ else
+ layer = OBJ_LAYER
+
+ if(turret)
+ if(dir == NORTH)
+ turret.layer = MOB_LAYER+0.1
+ else
+ turret.layer = OBJ_LAYER
+
+
+/obj/vehicle/atv/turret/handle_vehicle_offsets()
+ ..()
+ if(turret)
+ turret.loc = loc
+ switch(dir)
+ if(NORTH)
+ turret.pixel_x = 0
+ turret.pixel_y = 4
+ if(EAST)
+ turret.pixel_x = -12
+ turret.pixel_y = 4
+ if(SOUTH)
+ turret.pixel_x = 0
+ turret.pixel_y = 4
+ if(WEST)
+ turret.pixel_x = 12
+ turret.pixel_y = 4
+
diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm
new file mode 100644
index 00000000000..c74b66caee1
--- /dev/null
+++ b/code/modules/vehicles/pimpin_ride.dm
@@ -0,0 +1,93 @@
+
+
+//PIMP-CART
+/obj/vehicle/janicart
+ name = "janicart (pimpin' ride)"
+ desc = "A brave janitor cyborg gave its life to produce such an amazing combination of speed and utility."
+ icon_state = "pussywagon"
+ keytype = /obj/item/key/janitor
+ var/obj/item/weapon/storage/bag/trash/mybag = null
+ var/floorbuffer = 0
+
+
+/obj/vehicle/janicart/handle_vehicle_offsets()
+ ..()
+ if(buckled_mob)
+ switch(buckled_mob.dir)
+ if(NORTH)
+ buckled_mob.pixel_x = 0
+ buckled_mob.pixel_y = 4
+ if(EAST)
+ buckled_mob.pixel_x = -12
+ buckled_mob.pixel_y = 7
+ if(SOUTH)
+ buckled_mob.pixel_x = 0
+ buckled_mob.pixel_y = 7
+ if(WEST)
+ buckled_mob.pixel_x = 12
+ buckled_mob.pixel_y = 7
+
+
+/obj/item/key/janitor
+ desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"."
+ icon_state = "keyjanitor"
+
+
+/obj/item/janiupgrade
+ name = "floor buffer upgrade"
+ desc = "An upgrade for mobile janicarts."
+ icon = 'icons/obj/vehicles.dmi'
+ icon_state = "upgrade"
+
+
+/obj/vehicle/janicart/Moved(atom/OldLoc, Dir)
+ if(floorbuffer)
+ var/turf/tile = loc
+ if(isturf(tile))
+ tile.clean_blood()
+ for(var/A in tile)
+ if(is_cleanable(A))
+ qdel(A)
+
+
+/obj/vehicle/janicart/examine(mob/user)
+ ..()
+ if(floorbuffer)
+ user << "It has been upgraded with a floor buffer."
+
+
+/obj/vehicle/janicart/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/storage/bag/trash))
+ if(keytype == /obj/item/key/janitor)
+ if(!user.drop_item())
+ return
+ user << "You hook the trashbag onto \the [name]."
+ I.loc = src
+ mybag = I
+ else if(istype(I, /obj/item/janiupgrade))
+ if(keytype == /obj/item/key/janitor)
+ floorbuffer = 1
+ qdel(I)
+ user << "You upgrade \the [name] with the floor buffer."
+ update_icon()
+
+ ..()
+
+
+/obj/vehicle/janicart/update_icon()
+ overlays.Cut()
+ if(mybag)
+ overlays += "cart_garbage"
+ if(floorbuffer)
+ overlays += "cart_buffer"
+
+
+/obj/vehicle/janicart/attack_hand(mob/user)
+ if(..())
+ return 1
+ else if(mybag)
+ mybag.loc = get_turf(user)
+ user.put_in_hands(mybag)
+ mybag = null
+ update_icon()
+
diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm
new file mode 100644
index 00000000000..0a440eb370c
--- /dev/null
+++ b/code/modules/vehicles/secway.dm
@@ -0,0 +1,13 @@
+
+/obj/vehicle/secway
+ name = "secway"
+ desc = "A brave security cyborg gave its life to help you look like a complete tool."
+ icon_state = "secway"
+ keytype = /obj/item/key/security
+ generic_pixel_x = 0
+ generic_pixel_y = 4
+
+
+/obj/item/key/security
+ desc = "A keyring with a small steel key, and a rubber stun baton accessory."
+ icon_state = "keysec"
\ No newline at end of file
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
new file mode 100644
index 00000000000..6c6c8dbf6a1
--- /dev/null
+++ b/code/modules/vehicles/vehicle.dm
@@ -0,0 +1,125 @@
+
+/obj/vehicle
+ name = "vehicle"
+ desc = "A basic vehicle, vroom"
+ icon = 'icons/obj/vehicles.dmi'
+ icon_state = "fuckyou"
+ density = 1
+ anchored = 0
+ can_buckle = 1
+ buckle_lying = 0
+ var/keytype = null //item typepath, if non-null an item of this type is needed in your hands to drive this vehicle
+ var/next_vehicle_move = 0 //used for move delays
+ var/vehicle_move_delay = 2 //tick delay between movements, lower = faster, higher = slower
+ var/auto_door_open = TRUE
+
+ //Pixels
+ var/generic_pixel_x = 0 //All dirs show this pixel_x for the driver
+ var/generic_pixel_y = 0 //All dirs shwo this pixel_y for the driver
+
+
+/obj/vehicle/New()
+ ..()
+ handle_vehicle_layer()
+
+
+//APPEARANCE
+/obj/vehicle/proc/handle_vehicle_layer()
+ if(dir != NORTH)
+ layer = MOB_LAYER+0.1
+ else
+ layer = OBJ_LAYER
+
+
+//Override this to set your vehicle's various pixel offsets
+//if they differ between directions, otherwise use the
+//generic variables
+/obj/vehicle/proc/handle_vehicle_offsets()
+ if(buckled_mob)
+ buckled_mob.dir = dir
+ buckled_mob.pixel_x = generic_pixel_x
+ buckled_mob.pixel_y = generic_pixel_y
+
+
+/obj/vehicle/update_icon()
+ return
+
+
+
+//KEYS
+/obj/vehicle/proc/keycheck(mob/user)
+ if(keytype)
+ if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype))
+ return 1
+ else
+ return 1
+ return 0
+
+/obj/item/key
+ name = "key"
+ desc = "A small grey key."
+ icon = 'icons/obj/vehicles.dmi'
+ icon_state = "key"
+ w_class = 1
+
+
+//BUCKLE HOOKS
+/obj/vehicle/unbuckle_mob(force = 0)
+ if(buckled_mob)
+ buckled_mob.pixel_x = 0
+ buckled_mob.pixel_y = 0
+ . = ..()
+
+
+/obj/vehicle/user_buckle_mob(mob/living/M, mob/user)
+ if(user.incapacitated())
+ return
+ for(var/atom/movable/A in get_turf(src))
+ if(A.density)
+ if(A != src && A != M)
+ return
+ M.loc = get_turf(src)
+ ..()
+ handle_vehicle_offsets()
+
+
+//MOVEMENT
+/obj/vehicle/relaymove(mob/user, direction)
+ if(user.incapacitated())
+ unbuckle_mob()
+
+ if(keycheck(user))
+ if(!Process_Spacemove(direction) || !has_gravity(src.loc) || world.time < next_vehicle_move || !isturf(loc))
+ return
+ next_vehicle_move = world.time + vehicle_move_delay
+
+ step(src, direction)
+
+ if(buckled_mob)
+ if(buckled_mob.loc != loc)
+ buckled_mob.buckled = null //Temporary, so Move() succeeds.
+ buckled_mob.buckled = src //Restoring
+
+ handle_vehicle_layer()
+ handle_vehicle_offsets()
+ else
+ user << "You'll need the keys in one of your hands to drive \the [name]."
+
+
+/obj/vehicle/Move(NewLoc,Dir=0,step_x=0,step_y=0)
+ ..()
+ handle_vehicle_layer()
+ handle_vehicle_offsets()
+
+
+/obj/vehicle/attackby(obj/item/I, mob/user, params)
+ if(keytype && istype(I, keytype))
+ user << "Hold [I] in one of your hands while you drive \the [name]."
+
+
+/obj/vehicle/Bump(atom/movable/M)
+ . = ..()
+ if(auto_door_open)
+ if(istype(M, /obj/machinery/door) && buckled_mob)
+ M.Bumped(buckled_mob)
+
diff --git a/tgstation.dme b/tgstation.dme
index 1a059e0cf95..6dbe424bbcc 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -67,6 +67,7 @@
#include "code\__HELPERS\sorts\InsertSort.dm"
#include "code\__HELPERS\sorts\MergeSort.dm"
#include "code\__HELPERS\sorts\TimSort.dm"
+#include "code\__PATH_COMPATIBILITY\path_compatibility.dm"
#include "code\_globalvars\configuration.dm"
#include "code\_globalvars\database.dm"
#include "code\_globalvars\game_modes.dm"
@@ -1598,6 +1599,10 @@
#include "code\modules\telesci\telepad.dm"
#include "code\modules\telesci\telesci_computer.dm"
#include "code\modules\tooltip\tooltip.dm"
+#include "code\modules\vehicles\atv.dm"
+#include "code\modules\vehicles\pimpin_ride.dm"
+#include "code\modules\vehicles\secway.dm"
+#include "code\modules\vehicles\vehicle.dm"
#include "code\orphaned procs\AStar.dm"
#include "code\orphaned procs\dbcore.dm"
#include "code\orphaned procs\priority_announce.dm"