--- ../src-base/minecraft/net/minecraft/world/biome/BiomeGenBase.java
+++ ../src-work/minecraft/net/minecraft/world/biome/BiomeGenBase.java
@@ -50,6 +50,9 @@
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
+import net.minecraftforge.common.*;
+import net.minecraftforge.event.terraingen.*;
+
 public abstract class BiomeGenBase
 {
     private static final Logger field_150586_aC = LogManager.getLogger();
@@ -139,6 +142,10 @@
 
     public BiomeGenBase(int p_i1971_1_)
     {
+        this(p_i1971_1_, true);
+    }
+    public BiomeGenBase(int p_i1971_1_, boolean register)
+    {
         this.field_76752_A = Blocks.field_150349_c.func_176223_P();
         this.field_76753_B = Blocks.field_150346_d.func_176223_P();
         this.field_76754_C = 5169201;
@@ -156,6 +163,7 @@
         this.field_76758_O = new WorldGenBigTree(false);
         this.field_76763_Q = new WorldGenSwamp();
         this.field_76756_M = p_i1971_1_;
+        if (register)
         field_76773_a[p_i1971_1_] = this;
         this.field_76760_I = this.func_76729_a();
         this.field_76762_K.add(new BiomeGenBase.SpawnListEntry(EntitySheep.class, 12, 4, 4));
@@ -172,11 +180,12 @@
         this.field_76761_J.add(new BiomeGenBase.SpawnListEntry(EntityWitch.class, 5, 1, 1));
         this.field_76755_L.add(new BiomeGenBase.SpawnListEntry(EntitySquid.class, 10, 4, 4));
         this.field_82914_M.add(new BiomeGenBase.SpawnListEntry(EntityBat.class, 10, 8, 8));
+        this.addDefaultFlowers();
     }
 
     public BiomeDecorator func_76729_a()
     {
-        return new BiomeDecorator();
+        return getModdedBiomeDecorator(new BiomeDecorator());
     }
 
     public BiomeGenBase func_76732_a(float p_76732_1_, float p_76732_2_)
@@ -346,7 +355,7 @@
     {
         double d0 = (double)MathHelper.func_76131_a(this.func_180626_a(p_180627_1_), 0.0F, 1.0F);
         double d1 = (double)MathHelper.func_76131_a(this.func_76727_i(), 0.0F, 1.0F);
-        return ColorizerGrass.func_77480_a(d0, d1);
+        return getModdedBiomeGrassColor(ColorizerGrass.func_77480_a(d0, d1));
     }
 
     @SideOnly(Side.CLIENT)
@@ -354,7 +363,7 @@
     {
         double d0 = (double)MathHelper.func_76131_a(this.func_180626_a(p_180625_1_), 0.0F, 1.0F);
         double d1 = (double)MathHelper.func_76131_a(this.func_76727_i(), 0.0F, 1.0F);
-        return ColorizerFoliage.func_77470_a(d0, d1);
+        return getModdedBiomeFoliageColor(ColorizerFoliage.func_77470_a(d0, d1));
     }
 
     public boolean func_150559_j()
@@ -500,6 +509,84 @@
         }
     }
 
+    /* ========================================= FORGE START ======================================*/
+    protected List<FlowerEntry> flowers = new java.util.ArrayList<FlowerEntry>();
+
+    public BiomeDecorator getModdedBiomeDecorator(BiomeDecorator original)
+    {
+        return new DeferredBiomeDecorator(original);
+    }
+
+    public int getWaterColorMultiplier()
+    {
+        BiomeEvent.GetWaterColor event = new BiomeEvent.GetWaterColor(this, field_76759_H);
+        MinecraftForge.EVENT_BUS.post(event);
+        return event.newColor;
+    }
+
+    public int getModdedBiomeGrassColor(int original)
+    {
+        BiomeEvent.GetGrassColor event = new BiomeEvent.GetGrassColor(this, original);
+        MinecraftForge.EVENT_BUS.post(event);
+        return event.newColor;
+    }
+
+    public int getModdedBiomeFoliageColor(int original)
+    {
+        BiomeEvent.GetFoliageColor event = new BiomeEvent.GetFoliageColor(this, original);
+        MinecraftForge.EVENT_BUS.post(event);
+        return event.newColor;
+    }
+
+    /**
+     * Weighted random holder class used to hold possible flowers
+     * that can spawn in this biome when bonemeal is used on grass.
+     */
+    public static class FlowerEntry extends WeightedRandom.Item
+    {
+        public final net.minecraft.block.state.IBlockState state;
+        public FlowerEntry(net.minecraft.block.state.IBlockState state, int weight)
+        {
+            super(weight);
+            this.state = state;
+        }
+    }
+
+    /**
+     * Adds the default flowers, as of 1.7, it is 2 yellow, and 1 red. I chose 10 to allow some wiggle room in the numbers.
+     */
+    public void addDefaultFlowers()
+    {
+        addFlower(Blocks.field_150327_N.func_176223_P().func_177226_a(Blocks.field_150327_N.func_176494_l(), BlockFlower.EnumFlowerType.DANDELION), 20);
+        addFlower(Blocks.field_150328_O.func_176223_P().func_177226_a(Blocks.field_150328_O.func_176494_l(), BlockFlower.EnumFlowerType.POPPY), 20);
+    }
+
+    /** Register a new plant to be planted when bonemeal is used on grass.
+     * @param state The block to place.
+     * @param weight The weight of the plant, where red flowers are
+     *               10 and yellow flowers are 20.
+     */
+    public void addFlower(IBlockState state, int weight)
+    {
+        this.flowers.add(new FlowerEntry(state, weight));
+    }
+
+    public void plantFlower(World world, Random rand, BlockPos pos)
+    {
+        FlowerEntry flower = (FlowerEntry)WeightedRandom.func_76271_a(rand, flowers);
+        if (flower == null || flower.state == null ||
+            (flower.state.func_177230_c() instanceof net.minecraft.block.BlockBush &&
+              !((net.minecraft.block.BlockBush)flower.state.func_177230_c()).func_180671_f(world, pos, flower.state)))
+        {
+            return;
+        }
+
+        world.func_180501_a(pos, flower.state, 3);
+    }
+
+
+    /* ========================================= FORGE END ======================================*/
+
     static
     {
         field_76772_c.func_150566_k();
