diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm
index 20747361d3..d14c760d85 100644
--- a/code/ZAS/Airflow.dm
+++ b/code/ZAS/Airflow.dm
@@ -11,6 +11,9 @@ mob/proc/airflow_stun()
if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN))
src << "You stay upright as the air rushes past you."
return 0
+ if(buckled)
+ src << "Air suddenly rushes past you!"
+ return 0
if(!lying)
src << "The sudden rush of air knocks you over!"
Weaken(5)
diff --git a/code/modules/mob/animations.dm b/code/modules/mob/animations.dm
index 9bff0fbbe9..b21c88245a 100644
--- a/code/modules/mob/animations.dm
+++ b/code/modules/mob/animations.dm
@@ -108,7 +108,10 @@ note dizziness decrements automatically in the mob's Life() proc.
return
/mob/proc/make_floating(var/n)
-
+ if(buckled)
+ if(is_floating)
+ stop_floating()
+ return
floatiness = n
if(floatiness && !is_floating)
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 9e89abf4ca..837a0f93fc 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -457,7 +457,7 @@
return 0
//Check to see if we slipped
- if(prob(Process_Spaceslipping(5)))
+ if(prob(Process_Spaceslipping(5)) && !buckled)
src << "\blue You slipped!"
src.inertia_dir = src.last_move
step(src, src.inertia_dir)
diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm
new file mode 100644
index 0000000000..8136b06353
--- /dev/null
+++ b/code/modules/vehicles/bike.dm
@@ -0,0 +1,142 @@
+/obj/vehicle/bike/
+ name = "space-bike"
+ desc = "Space wheelies! Woo! "
+ icon = 'icons/obj/bike.dmi'
+ icon_state = "bike_off"
+ dir = SOUTH
+
+ load_item_visible = 1
+ mob_offset_y = 5
+ health = 100
+ maxhealth = 100
+
+ fire_dam_coeff = 0.6
+ brute_dam_coeff = 0.5
+ var/protection_percent = 60
+
+ var/land_speed = 10 //if 0 it can't go on turf
+ var/space_speed = 1
+ var/bike_icon = "bike"
+
+ var/datum/effect/effect/system/ion_trail_follow/ion
+ var/kickstand = 1
+
+/obj/vehicle/bike/New()
+ ..()
+ ion = new /datum/effect/effect/system/ion_trail_follow()
+ ion.set_up(src)
+ turn_off()
+ overlays += image('icons/obj/bike.dmi', "[icon_state]_off_overlay", MOB_LAYER + 1)
+ icon_state = "[bike_icon]_off"
+
+/obj/vehicle/bike/verb/toggle()
+ set name = "Toggle Engine"
+ set category = "Vehicle"
+ set src in view(0)
+
+ if(usr.incapacitated()) return
+
+ if(!on)
+ turn_on()
+ src.visible_message("\The [src] rumbles to life.", "You hear something rumble deeply.")
+ else
+ turn_off()
+ src.visible_message("\The [src] putters before turning off.", "You hear something putter slowly.")
+
+/obj/vehicle/bike/verb/kickstand()
+ set name = "Toggle Kickstand"
+ set category = "Vehicle"
+ set src in view(0)
+
+ if(usr.incapacitated()) return
+
+ if(kickstand)
+ src.visible_message("You put up \the [src]'s kickstand.")
+ else
+ if(istype(src.loc,/turf/space))
+ usr << " You don't think kickstands work in space..."
+ return
+ src.visible_message("You put down \the [src]'s kickstand.")
+ if(pulledby)
+ pulledby.stop_pulling()
+
+ kickstand = !kickstand
+ anchored = (kickstand || on)
+
+/obj/vehicle/bike/load(var/atom/movable/C)
+ var/mob/living/M = C
+ if(!istype(C)) return 0
+ if(M.buckled || M.restrained() || !Adjacent(M) || !M.Adjacent(src))
+ return 0
+ return ..(M)
+
+/obj/vehicle/bike/MouseDrop_T(var/atom/movable/C, mob/user as mob)
+ if(!load(C))
+ user << " You were unable to load \the [C] onto \the [src]."
+ return
+
+/obj/vehicle/bike/attack_hand(var/mob/user as mob)
+ if(user == load)
+ unload(load)
+ user << "You unbuckle yourself from \the [src]"
+
+/obj/vehicle/bike/relaymove(mob/user, direction)
+ if(user != load || !on)
+ return
+ return Move(get_step(src, direction))
+
+/obj/vehicle/bike/Move(var/turf/destination)
+ if(kickstand) return
+
+
+ //these things like space, not turf. Dragging shouldn't weigh you down.
+ if(istype(destination,/turf/space) || pulledby)
+ if(!space_speed)
+ return 0
+ move_delay = space_speed
+ else
+ if(!land_speed)
+ return 0
+ move_delay = land_speed
+ return ..()
+
+/obj/vehicle/bike/turn_on()
+ ion.start()
+ anchored = 1
+
+ update_icon()
+
+ if(pulledby)
+ pulledby.stop_pulling()
+ ..()
+/obj/vehicle/bike/turn_off()
+ ion.stop()
+ anchored = kickstand
+
+ update_icon()
+
+ ..()
+
+/obj/vehicle/bike/bullet_act(var/obj/item/projectile/Proj)
+ if(buckled_mob && prob(protection_percent))
+ buckled_mob.bullet_act(Proj)
+ return
+ ..()
+
+/obj/vehicle/bike/update_icon()
+ overlays.Cut()
+
+ if(on)
+ overlays += image('icons/obj/bike.dmi', "[bike_icon]_on_overlay", MOB_LAYER + 1)
+ icon_state = "[bike_icon]_on"
+ else
+ overlays += image('icons/obj/bike.dmi', "[bike_icon]_off_overlay", MOB_LAYER + 1)
+ icon_state = "[bike_icon]_off"
+
+ ..()
+
+
+/obj/vehicle/bike/Destroy()
+ qdel(ion)
+
+ ..()
\ No newline at end of file
diff --git a/icons/obj/bike.dmi b/icons/obj/bike.dmi
new file mode 100644
index 0000000000..69aa0ccb4e
Binary files /dev/null and b/icons/obj/bike.dmi differ