diff --git a/.gradle/8.5/executionHistory/executionHistory.bin b/.gradle/8.5/executionHistory/executionHistory.bin
index 746b260a5d3fd53296ea793d499a6bbc9da9517e..dce7b13ef68ffcc4188ef9904663488adaf97728 100644
Binary files a/.gradle/8.5/executionHistory/executionHistory.bin and b/.gradle/8.5/executionHistory/executionHistory.bin differ
diff --git a/.gradle/8.5/executionHistory/executionHistory.lock b/.gradle/8.5/executionHistory/executionHistory.lock
index 64d85103fe16a3a5738c1e67645b28a92df84401..3ee9d16e1044b097aae57904200ac619ef6a9d5a 100644
Binary files a/.gradle/8.5/executionHistory/executionHistory.lock and b/.gradle/8.5/executionHistory/executionHistory.lock differ
diff --git a/.gradle/8.5/fileHashes/fileHashes.bin b/.gradle/8.5/fileHashes/fileHashes.bin
index 8f6f7a896bb1e02150949724b12e6448ea91d2eb..0f3bd98f57324ab1698f63c480aa1795a8878217 100644
Binary files a/.gradle/8.5/fileHashes/fileHashes.bin and b/.gradle/8.5/fileHashes/fileHashes.bin differ
diff --git a/.gradle/8.5/fileHashes/fileHashes.lock b/.gradle/8.5/fileHashes/fileHashes.lock
index 080993a19d3a3a653d068f2659c625ec712d55a2..67ea60ba176b47d0a3e6cb1daf00f1916bb865b2 100644
Binary files a/.gradle/8.5/fileHashes/fileHashes.lock and b/.gradle/8.5/fileHashes/fileHashes.lock differ
diff --git a/.gradle/8.5/fileHashes/resourceHashesCache.bin b/.gradle/8.5/fileHashes/resourceHashesCache.bin
index 971f922c75a975dad2143d41f8f7cc869a333538..410f115731ba8a7edde9b89fa6b8947e61ed37e2 100644
Binary files a/.gradle/8.5/fileHashes/resourceHashesCache.bin and b/.gradle/8.5/fileHashes/resourceHashesCache.bin differ
diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock
index 38847464eeb81c527633ea8ac60711c0d8bffbf8..c0a0d1fadc889152643cfc5483f8ca7103935be7 100644
Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/build/classes/java/main/CropHarvester/CropCollector$1.class b/build/classes/java/main/CropHarvester/CropCollector$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..309d91e8908275ef50c8ed2edbb9652c80907eb8
Binary files /dev/null and b/build/classes/java/main/CropHarvester/CropCollector$1.class differ
diff --git a/build/classes/java/main/CropHarvester/CropCollector.class b/build/classes/java/main/CropHarvester/CropCollector.class
new file mode 100644
index 0000000000000000000000000000000000000000..87803cd521313a088e19fa4fa72995e3d6e0e088
Binary files /dev/null and b/build/classes/java/main/CropHarvester/CropCollector.class differ
diff --git a/build/classes/java/main/CropHarvester/CropHarvester.class b/build/classes/java/main/CropHarvester/CropHarvester.class
index ff85e91168e5b5b70b515f32babb8f58b18f07d0..31eeb07e58f1d5f500a3555b0803aef841979c53 100644
Binary files a/build/classes/java/main/CropHarvester/CropHarvester.class and b/build/classes/java/main/CropHarvester/CropHarvester.class differ
diff --git a/build/classes/java/main/Plots/Plots.class b/build/classes/java/main/Plots/Plots.class
index 39eb1e1cc809c7a63c5133102feef8ad40f1a6b7..5a7553abf3b3a69aa83b6ad3229e0b18b99ecfb0 100644
Binary files a/build/classes/java/main/Plots/Plots.class and b/build/classes/java/main/Plots/Plots.class differ
diff --git a/build/classes/java/main/Timber/Timber.class b/build/classes/java/main/Timber/Timber.class
index 69a8eb3ee202bb623424e19c725718d7d0e76e26..87340a79a66795d038bb393da94b0d560262d456 100644
Binary files a/build/classes/java/main/Timber/Timber.class and b/build/classes/java/main/Timber/Timber.class differ
diff --git a/build/libs/pixelcampusessentials-1.0.jar b/build/libs/pixelcampusessentials-1.0.jar
index 9d491d233a51ab1cf8f2ece025f575072dfe4eda..cfccd3c509a3045dbebdcb3acc56daf21def4db0 100644
Binary files a/build/libs/pixelcampusessentials-1.0.jar and b/build/libs/pixelcampusessentials-1.0.jar differ
diff --git a/build/resources/main/plugin.yml b/build/resources/main/plugin.yml
index 3c96f98da8445f98ea1c75798791db2f107cbc92..e6ee0b825cf50be827e8b0dcd660d15d3382e0c4 100644
--- a/build/resources/main/plugin.yml
+++ b/build/resources/main/plugin.yml
@@ -29,3 +29,6 @@ permissions:
   pixelcampusessentials.chop:
     description: Timber
     default: op
+  pixelcampusessentials.harvest:
+    description: Crop Harvester
+    default: op
\ No newline at end of file
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/CropHarvester.class.uniqueId0 b/build/tmp/compileJava/compileTransaction/stash-dir/CropHarvester.class.uniqueId0
index 38173e9f7a6f1d44394c579b4294e5e48d31301c..6e68263a68f75b97886600785bd0ec8b10e1f999 100644
Binary files a/build/tmp/compileJava/compileTransaction/stash-dir/CropHarvester.class.uniqueId0 and b/build/tmp/compileJava/compileTransaction/stash-dir/CropHarvester.class.uniqueId0 differ
diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin
index b425c846d180f8670e01980d6e2ae99d89bfc727..d9178ebccaa1204a80849e52d2b5e24a4341b935 100644
Binary files a/build/tmp/compileJava/previous-compilation-data.bin and b/build/tmp/compileJava/previous-compilation-data.bin differ
diff --git a/src/main/java/CropHarvester/CropCollector.java b/src/main/java/CropHarvester/CropCollector.java
new file mode 100644
index 0000000000000000000000000000000000000000..e792ea1a6ce1f236408f5f880d7b388610744af1
--- /dev/null
+++ b/src/main/java/CropHarvester/CropCollector.java
@@ -0,0 +1,38 @@
+package CropHarvester;
+
+import org.bukkit.block.Block;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.Collection;
+import java.util.function.BiConsumer;
+
+public class CropCollector {
+
+    public static void collectCrops(Block plant, Player player){
+
+        Collection<ItemStack> drops = plant.getDrops();
+        ItemStack[] droppedItems = new ItemStack[drops.size()];
+
+        droppedItems = drops.toArray(droppedItems);
+
+        droppedItems[1].subtract(); //index 1 contains seeds. removes one, because one is needed to be "replanted"
+
+        for (ItemStack droppedItem : droppedItems) {
+
+
+            //puts item in next free slot or sums to existing stack. addItem() returns the Items that couldnt be stored in the Inventory
+            player.getInventory().addItem(droppedItem).forEach(new BiConsumer<Integer, ItemStack>() {
+                @Override
+                public void accept(Integer ignored, ItemStack leftoverItems) { //drops crops that didnt find space in the Inventory
+
+                    plant.getWorld().dropItem(plant.getLocation(), leftoverItems);
+                }
+            });
+        }
+
+
+    }
+    
+    
+}
diff --git a/src/main/java/CropHarvester/CropHarvester.java b/src/main/java/CropHarvester/CropHarvester.java
index 961ed5ccd4f5f5e562fd4729146fecf9413c2cbc..5e93a038e2229a5b57d8bc2255309653d1127875 100644
--- a/src/main/java/CropHarvester/CropHarvester.java
+++ b/src/main/java/CropHarvester/CropHarvester.java
@@ -1,5 +1,7 @@
 package CropHarvester;
 
+import org.bukkit.Material;
+import org.bukkit.Particle;
 import org.bukkit.Sound;
 import org.bukkit.Tag;
 import org.bukkit.block.Block;
@@ -7,8 +9,8 @@ import org.bukkit.block.data.Ageable;
 import org.bukkit.entity.Player;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
-import org.bukkit.event.block.Action;
 import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.inventory.EquipmentSlot;
 
 import java.util.Objects;
 
@@ -17,32 +19,56 @@ public class CropHarvester implements Listener {
     @EventHandler
     public void playerRightClick(PlayerInteractEvent e){
 
-        if(!Objects.requireNonNull(e.getHand()).isHand())return;
-        if(!checkForFullGrownCrop(e))return;
+        if(!isPermitted(e.getPlayer()))return;
+        if(!Objects.equals(e.getHand(), EquipmentSlot.HAND))return;
+        if(!isFullGrownCrop(e.getClickedBlock()))return;
 
+
+        Block plant = e.getClickedBlock();
         Player player = e.getPlayer();
 
-        player.sendMessage(Objects.requireNonNull(e.getClickedBlock()).getType().toString());
 
-        e.getClickedBlock().breakNaturally();
-        player.playSound(e.getClickedBlock().getLocation(), Sound.BLOCK_CROP_BREAK,1,1);
-    }
+        try {
+            CropCollector.collectCrops(plant,player); //Calculates Loot and puts it into Inventory or drops it
 
+            Ageable resetCrop = (Ageable) plant.getBlockData();
+            resetCrop.setAge(0); //sets the Crop back to 0 "growth". Illusion as if the Crop was re-planted. CropCollector handles the loot.
 
-    //returns false on fail
-    private boolean checkForFullGrownCrop(PlayerInteractEvent e){
+            plant.setBlockData(resetCrop);
+        }catch (Exception exception){
+            return;
+        }
+
+        //visual and audio effects
+        plant.getWorld().playSound(plant.getLocation(), Sound.BLOCK_CROP_BREAK,1,0.8f);
+        plant.getWorld().spawnParticle(Particle.BLOCK_CRACK,plant.getLocation().add(0.5,0,0.5),5,0.2,0,0.2,0,Material.COARSE_DIRT.createBlockData());
+        player.swingMainHand();
+    }
 
-        if(!e.getAction().equals(Action.RIGHT_CLICK_BLOCK))return false; //check for right click on a block
 
-        Block clickedBlock = e.getClickedBlock();
+    //returns false on fail
+    private boolean isFullGrownCrop(Block clickedBlock){
 
-        if(!Tag.CROPS.isTagged(Objects.requireNonNull(clickedBlock).getType()))return false; //check if the clicked block is a type of crop
+        try {
+            if (!Tag.CROPS.isTagged(clickedBlock.getType()))
+                return false; //check if the clicked block is a type of crop
+        }catch (NullPointerException e){
+            return false;
+        }
 
         Ageable ageable = (Ageable) clickedBlock.getBlockData();
-        if(ageable.getAge() != ageable.getMaximumAge())return false;
 
+        if(ageable.getMaterial().equals(Material.MELON_STEM) || ageable.getMaterial().equals(Material.PUMPKIN_STEM)) return false; //ignore pumpkins and Melons
 
-        return true;
+        return ageable.getAge() == ageable.getMaximumAge();
     }
 
+
+    private boolean isPermitted(Player p){
+        return
+        (
+                Tag.ITEMS_HOES.isTagged(p.getInventory().getItemInMainHand().getType())
+        )
+                && p.hasPermission("pixelcampusessentials.harvest");
+    }
 }
diff --git a/src/main/java/FunAndElse/KeepOutOfFlying.java b/src/main/java/FunAndElse/KeepOutOfFlying.java
new file mode 100644
index 0000000000000000000000000000000000000000..05e4e646cc24ff84a175a32936534d1adfb36bfa
--- /dev/null
+++ b/src/main/java/FunAndElse/KeepOutOfFlying.java
@@ -0,0 +1,15 @@
+package FunAndElse;
+
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+
+public class KeepOutOfFlying implements Listener {
+
+    @EventHandler
+    public void playerJoin(PlayerJoinEvent e){
+
+
+        
+    }
+}
diff --git a/src/main/java/Plots/Plots.java b/src/main/java/Plots/Plots.java
index 01c0f7ef90b9cdc65c7ee1c1d1d827282a193331..c3170247c0a03099203e5d0a761078e5208d9442 100644
--- a/src/main/java/Plots/Plots.java
+++ b/src/main/java/Plots/Plots.java
@@ -65,7 +65,7 @@ public class Plots implements CommandExecutor, Listener {
         }
 
         if(!sender.hasPermission("suwupremeEssentials.plot")){
-            sender.sendMessage("§cYou dont have the nessecary Permissions to use Plots");
+            sender.sendMessage("§cYou dont have the necessary Permissions to use Plots");
             return true;
         }
 
@@ -184,7 +184,7 @@ public class Plots implements CommandExecutor, Listener {
         }
 
         if(getRegionSize(newRegion) > MAX_PLOT_SIZE){
-            p.sendMessage("§cYour Plot cannot exeed " + MAX_PLOT_SIZE + " Blocks in Size");
+            p.sendMessage("§cYour Plot cannot exceed " + MAX_PLOT_SIZE + " Blocks in Size");
             return;
         }
 
diff --git a/src/main/java/Timber/Timber.java b/src/main/java/Timber/Timber.java
index 8118ce4675a8744ba652ffff3a48c3d68d2b2761..b5ca243c631d8742d7aab364621707e84957cb36 100644
--- a/src/main/java/Timber/Timber.java
+++ b/src/main/java/Timber/Timber.java
@@ -24,7 +24,7 @@ public class Timber implements Listener {
 
         if(
                 p.isSneaking() &&
-                e.getPlayer().isSneaking() && e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.NETHERITE_AXE) &&
+                Tag.ITEMS_AXES.isTagged(p.getInventory().getItemInMainHand().getType()) &&
                 isLogAt(e.getBlock().getLocation())
         ){
 
diff --git a/src/main/java/org/fsi/pixelcampusessentials/Pixelcampusessentials.java b/src/main/java/org/fsi/pixelcampusessentials/Pixelcampusessentials.java
index 925552b1c2d8e54ee647b4cae845b5d3a62b4500..858cf2982ac51cc5e36685f5ebba2cbf5cfc1dd7 100644
--- a/src/main/java/org/fsi/pixelcampusessentials/Pixelcampusessentials.java
+++ b/src/main/java/org/fsi/pixelcampusessentials/Pixelcampusessentials.java
@@ -1,10 +1,7 @@
 package org.fsi.pixelcampusessentials;
 
 import CropHarvester.CropHarvester;
-import FunAndElse.FreezePlayer;
-import FunAndElse.Fullbright;
-import FunAndElse.PlayerStats;
-import FunAndElse.SpeedLadder;
+import FunAndElse.*;
 import Plots.PlayerSelection;
 import Plots.Plots;
 import Plots.PlotsTabComplete;
@@ -27,6 +24,7 @@ public final class Pixelcampusessentials extends JavaPlugin {
         getServer().getPluginManager().registerEvents(new SpeedLadder(),this);
         getServer().getPluginManager().registerEvents(new FreezePlayer(),this);
         getServer().getPluginManager().registerEvents(new CropHarvester(),this);
+        getServer().getPluginManager().registerEvents(new KeepOutOfFlying(),this);
 
         try {
             getCommand("plot").setExecutor(new Plots());
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 14ea60aadd58e5edce4c3910a1dd4e3b45e6d0e5..7e183c965cfd53900e10fd4f8ea88cc847b555d7 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -29,3 +29,6 @@ permissions:
   pixelcampusessentials.chop:
     description: Timber
     default: op
+  pixelcampusessentials.harvest:
+    description: Crop Harvester
+    default: op
\ No newline at end of file