--- a/net/minecraft/server/BlockOre.java
+++ b/net/minecraft/server/BlockOre.java
@@ -37,6 +37,7 @@
 
     public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) {
         super.dropNaturally(world, blockposition, iblockdata, f, i);
+        /* CraftBukkit start - Delegated to getExpDrop
         if (this.getDropType(iblockdata, world.random, i) != Item.getItemOf(this)) {
             int j = 0;
 
@@ -54,13 +55,42 @@
 
             this.dropExperience(world, blockposition, j);
         }
+        // */
 
     }
 
+    @Override
+    public int getExpDrop(World world, IBlockData iblockdata, int i) {
+        if (this.getDropType(iblockdata, world.random, i) != Item.getItemOf(this)) {
+            int j = 0;
+
+            if (this == Blocks.COAL_ORE) {
+                j = MathHelper.nextInt(world.random, 0, 2);
+            } else if (this == Blocks.DIAMOND_ORE) {
+                j = MathHelper.nextInt(world.random, 3, 7);
+            } else if (this == Blocks.EMERALD_ORE) {
+                j = MathHelper.nextInt(world.random, 3, 7);
+            } else if (this == Blocks.LAPIS_ORE) {
+                j = MathHelper.nextInt(world.random, 2, 5);
+            } else if (this == Blocks.QUARTZ_ORE) {
+                j = MathHelper.nextInt(world.random, 2, 5);
+            }
+
+            return j;
+        }
+
+        return 0;
+        // CraftBukkit end
+    }
+
     public ItemStack a(World world, BlockPosition blockposition, IBlockData iblockdata) {
         return new ItemStack(this);
     }
 
+    public int getDropData(World world, BlockPosition blockposition) {
+        return 0;
+    }
+
     public int getDropData(IBlockData iblockdata) {
         return this == Blocks.LAPIS_ORE ? EnumColor.BLUE.getInvColorIndex() : 0;
     }