diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index b22b813d1c1..613fe2d844c 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -38,6 +38,26 @@
show_to(M)
return
+ if ((istype(over_object, /obj/structure/table) || istype(over_object, /turf/simulated/floor)) \
+ && contents.len && loc == usr && !usr.stat && !usr.restrained() && usr.canmove && over_object.Adjacent(usr) \
+ && !istype(src, /obj/item/weapon/storage/lockbox))
+ var/turf/T = get_turf(over_object)
+ if (istype(over_object, /turf/simulated/floor))
+ if (get_turf(usr) != T)
+ return // Can only empty containers onto the floor under you
+ if("Yes" != alert(usr,"Empty \the [src] onto \the [T]?","Confirm","Yes","No"))
+ return
+ if(!(usr && over_object && contents.len && loc == usr && !usr.stat && !usr.restrained() && usr.canmove && get_turf(usr) == T))
+ return // Something happened while the player was thinking
+ hide_from(usr)
+ usr.face_atom(over_object)
+ usr.visible_message("[usr] empties \the [src] onto \the [over_object].",
+ "You empty \the [src] onto \the [over_object].")
+ for(var/obj/item/I in contents)
+ remove_from_storage(I, T)
+ update_icon() // For content-sensitive icons
+ return
+
if (!( istype(over_object, /obj/screen) ))
return ..()
if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index d1506aa8dbc..5bc8b20a6bb 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -93,22 +93,14 @@
user << "You can't place that item inside the disposal unit."
return
- if(istype(I, /obj/item/weapon/storage/bag/trash))
- var/obj/item/weapon/storage/bag/trash/T = I
- if(T.contents.len)
- user << "\blue You empty the bag."
- for(var/obj/item/O in T.contents)
- T.remove_from_storage(O,src)
- T.update_icon()
- update()
- return
-
- if(istype(I, /obj/item/weapon/storage/part_replacer))
- var/obj/item/weapon/storage/part_replacer/P = I
- if(P.contents.len)
- user << "\blue You empty the RPED's contents."
- for(var/obj/item/O in P.contents)
- P.remove_from_storage(O,src)
+ if(istype(I, /obj/item/weapon/storage))
+ var/obj/item/weapon/storage/S = I
+ if((S.allow_quick_empty || S.allow_quick_gather) && S.contents.len)
+ S.hide_from(user)
+ user.visible_message("[user] empties \the [S] into \the [src].", "You empty \the [S] into \the [src].")
+ for(var/obj/item/O in S.contents)
+ S.remove_from_storage(O, src)
+ S.update_icon() // For content-sensitive icons
update()
return