diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm
index 615e52f3980..b42eb6cecc4 100644
--- a/code/game/machinery/seed_extractor.dm
+++ b/code/game/machinery/seed_extractor.dm
@@ -1,3 +1,48 @@
+/proc/seedify(var/obj/item/O as obj, var/t_max)
+ var/t_amount = 0
+ if(t_max == -1)
+ t_max = rand(1,4)
+
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/))
+ var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
+ while(t_amount < t_max)
+ var/obj/item/seeds/t_prod = new F.seed(O.loc)
+ t_prod.species = F.species
+ t_prod.lifespan = F.lifespan
+ t_prod.endurance = F.endurance
+ t_prod.maturation = F.maturation
+ t_prod.production = F.production
+ t_prod.yield = F.yield
+ t_prod.potency = F.potency
+ t_amount++
+ del(O)
+ return 1
+
+ else if(istype(O, /obj/item/weapon/grown/))
+ var/obj/item/weapon/grown/F = O
+ while(t_amount < t_max)
+ var/obj/item/seeds/t_prod = new F.seed(O.loc)
+ t_prod.species = F.species
+ t_prod.lifespan = F.lifespan
+ t_prod.endurance = F.endurance
+ t_prod.maturation = F.maturation
+ t_prod.production = F.production
+ t_prod.yield = F.yield
+ t_prod.potency = F.potency
+ t_amount++
+ del(O)
+ return 1
+
+ else if(istype(O, /obj/item/stack/tile/grass))
+ var/obj/item/stack/tile/grass/S = O
+ new /obj/item/seeds/grassseed(O.loc)
+ S.use(1)
+ return 1
+
+ else
+ return 0
+
+
/obj/machinery/seed_extractor
name = "seed extractor"
desc = "Extracts and bags seeds from produce."
@@ -7,48 +52,14 @@
anchored = 1
obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/))
- var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
- user.drop_item()
- user << "You extract some seeds from the [F.name]."
- var/seed = text2path(F.seed)
- var/t_amount = 0
- var/t_max = rand(1,4)
- while(t_amount < t_max)
- var/obj/item/seeds/t_prod = new seed(loc)
- t_prod.species = F.species
- t_prod.lifespan = F.lifespan
- t_prod.endurance = F.endurance
- t_prod.maturation = F.maturation
- t_prod.production = F.production
- t_prod.yield = F.yield
- t_prod.potency = F.potency
- t_amount++
- del(O)
+ if(isrobot(user))
+ return
+ user.drop_item()
+ if(O && O.loc)
+ O.loc = src.loc
+ if(seedify(O,-1))
+ user << "You extract some seeds."
+ else
+ user << "You can't extract any seeds from that!"
- else if(istype(O, /obj/item/weapon/grown/))
- var/obj/item/weapon/grown/F = O
- user.drop_item()
- user << "You extract some seeds from the [F.name]."
- var/seed = text2path(F.seed)
- var/t_amount = 0
- var/t_max = rand(1,4)
- while(t_amount < t_max)
- var/obj/item/seeds/t_prod = new seed(loc)
- t_prod.species = F.species
- t_prod.lifespan = F.lifespan
- t_prod.endurance = F.endurance
- t_prod.maturation = F.maturation
- t_prod.production = F.production
- t_prod.yield = F.yield
- t_prod.potency = F.potency
- t_amount++
- del(O)
- else if(istype(O, /obj/item/stack/tile/grass))
- var/obj/item/stack/tile/grass/S = O
- user << "You extract some seeds from the [S.name]."
- S.use(1)
- new /obj/item/seeds/grassseed(loc)
-
- return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 706102d6145..39b4ba39800 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -97,6 +97,23 @@
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/grown","/obj/item/seeds","/obj/item/weapon/grown")
+/obj/item/weapon/storage/bag/plants/portaseeder
+ name = "Portable Seed Extractor"
+ desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant."
+ icon_state = "portaseeder"
+ origin_tech = "materials=2;biotech=2"
+
+ verb/dissolve_contents()
+ set name = "Activate Seed Extraction"
+ set category = "Object"
+ set desc = "Activate to convert your plants into plantable seeds."
+ for(var/obj/item/O in contents)
+ seedify(O, 1)
+ for(var/mob/M in range(1))
+ if (M.s_active == src)
+ src.close(M)
+
+
// -----------------------------
// Sheet Snatcher
// -----------------------------
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 92c49fca4cf..9deb8a8ab40 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -1454,6 +1454,15 @@ datum/design/flora_gun
materials = list("$metal" = 2000, "$glass" = 500, "$uranium" = 500)
build_path = "/obj/item/weapon/gun/energy/floragun"
+datum/design/portaseed
+ name = "Portaseeder"
+ desc = "An advanced hydroponics tool used for harvesting produce and extracting seeds."
+ id = "portaseed"
+ req_tech = list("materials" = 2, "biotech" = 3, "powerstorage" = 2)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 500, "$glass" = 500)
+ build_path = "/obj/item/weapon/storage/bag/plants/portaseeder"
+
datum/design/large_grenade
name = "Large Grenade"
desc = "A grenade that affects a larger area and use larger containers."
diff --git a/icons/obj/hydroponics.dmi b/icons/obj/hydroponics.dmi
index fa78753cdc8..b55226386de 100644
Binary files a/icons/obj/hydroponics.dmi and b/icons/obj/hydroponics.dmi differ