diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index b5e91c53c1f..6949588863a 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -270,6 +270,44 @@
materials = list(MAT_METAL=1500)
amount_per_transfer_from_this = 10
volume = 100
+ var/shaking = FALSE
+
+/obj/item/reagent_containers/food/drinks/shaker/Initialize(mapload)
+ . = ..()
+ reagents.set_reacting(FALSE)
+
+/obj/item/reagent_containers/food/drinks/shaker/attack_self(mob/user)
+ if(!reagents.total_volume)
+ to_chat(user, "You won't shake an empty shaker now, will you?")
+ return
+
+ if(shaking)
+ return
+
+ shaking = TRUE
+ var/adjective = pick("furiously", "passionately", "with vigor", "with determination", "like a devil", "with care and love", "like there is no tomorrow")
+ user.visible_message("\The [user] shakes \the [src] [adjective]!", "You shake \the [src] [adjective]!")
+ icon_state = "shaker-shake"
+ if(iscarbon(loc))
+ var/mob/living/carbon/M = loc
+ M.update_inv_r_hand()
+ M.update_inv_l_hand()
+ playsound(user, 'sound/items/boston_shaker.ogg', 80, 1)
+ if(do_after(user, 3 SECONDS, target = src))
+ reagents.set_reacting(TRUE)
+ reagents.handle_reactions()
+ icon_state = "shaker"
+ if(iscarbon(loc))
+ var/mob/living/carbon/M = loc
+ M.update_inv_r_hand()
+ M.update_inv_l_hand()
+
+ shaking = FALSE
+ reagents.set_reacting(FALSE)
+
+/obj/item/reagent_containers/food/drinks/shaker/dropped(mob/user)
+ . = ..()
+ icon_state = "shaker"
/obj/item/reagent_containers/food/drinks/flask
name = "flask"
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 8753580dee6..196b266990c 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 4b3b7556bd7..372a5dbfd18 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 02b2cff8a8d..f079c4eaf15 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/sound/items/boston_shaker.ogg b/sound/items/boston_shaker.ogg
new file mode 100644
index 00000000000..04d4624810b
Binary files /dev/null and b/sound/items/boston_shaker.ogg differ