diff --git a/Mage.Sets/src/mage/sets/apocalypse/Spiritmonger.java b/Mage.Sets/src/mage/sets/apocalypse/Spiritmonger.java
index 41d8070f2c..0d08b363d4 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/Spiritmonger.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/Spiritmonger.java
@@ -29,27 +29,18 @@ package mage.sets.apocalypse;
 
 import java.util.UUID;
 import mage.MageInt;
-import mage.abilities.Ability;
 import mage.abilities.common.DealsDamageToACreatureTriggeredAbility;
 import mage.abilities.common.SimpleActivatedAbility;
 import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.ContinuousEffect;
-import mage.abilities.effects.OneShotEffect;
 import mage.abilities.effects.common.RegenerateSourceEffect;
-import mage.abilities.effects.common.continuous.BecomesColorTargetEffect;
+import mage.abilities.effects.common.continuous.BecomesColorSourceEffect;
 import mage.abilities.effects.common.counter.AddCountersSourceEffect;
 import mage.cards.CardImpl;
-import mage.choices.ChoiceColor;
 import mage.constants.CardType;
 import mage.constants.Duration;
-import mage.constants.Outcome;
 import mage.constants.Rarity;
 import mage.constants.Zone;
 import mage.counters.CounterType;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.players.Player;
-import mage.target.targetpointer.FixedTarget;
 
 /**
  *
@@ -70,7 +61,7 @@ public class Spiritmonger extends CardImpl {
         // {B}: Regenerate Spiritmonger.
         this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{B}")));
         // {G}: Spiritmonger becomes the color of your choice until end of turn.
-        this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new SpiritmongerChangeColorEffect(), new ManaCostsImpl("{G}")));
+        this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesColorSourceEffect(Duration.EndOfTurn), new ManaCostsImpl("{G}")));
     }
 
     public Spiritmonger(final Spiritmonger card) {
@@ -82,37 +73,3 @@ public class Spiritmonger extends CardImpl {
         return new Spiritmonger(this);
     }
 }
-
-class SpiritmongerChangeColorEffect extends OneShotEffect {
-
-    public SpiritmongerChangeColorEffect() {
-        super(Outcome.Neutral);
-        staticText = "{this} becomes the color of your choice until end of turn";
-    }
-
-    public SpiritmongerChangeColorEffect(final SpiritmongerChangeColorEffect effect) {
-        super(effect);
-    }
-
-    @Override
-    public boolean apply(Game game, Ability source) {
-        Player player = game.getPlayer(source.getControllerId());
-        Permanent wildMongrel = game.getPermanent(source.getSourceId());
-        if (player != null && wildMongrel != null) {
-            ChoiceColor colorChoice = new ChoiceColor();
-            if (player.choose(Outcome.Neutral, colorChoice, game)) {
-                game.informPlayers(wildMongrel.getName() + ": " + player.getLogName() + " has chosen " + colorChoice.getChoice());
-                ContinuousEffect effect = new BecomesColorTargetEffect(colorChoice.getColor(), Duration.EndOfTurn, "is " + colorChoice.getChoice());
-                effect.setTargetPointer(new FixedTarget(source.getSourceId()));
-                game.addEffect(effect, source);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public SpiritmongerChangeColorEffect copy() {
-        return new SpiritmongerChangeColorEffect(this);
-    }
-}
diff --git a/Mage.Sets/src/mage/sets/invasion/AlloyGolem.java b/Mage.Sets/src/mage/sets/invasion/AlloyGolem.java
new file mode 100644
index 0000000000..92799396ef
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/invasion/AlloyGolem.java
@@ -0,0 +1,67 @@
+/*
+ *  Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without modification, are
+ *  permitted provided that the following conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above copyright notice, this list of
+ *        conditions and the following disclaimer.
+ *
+ *     2. Redistributions in binary form must reproduce the above copyright notice, this list
+ *        of conditions and the following disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ *  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ *  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ *  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  The views and conclusions contained in the software and documentation are those of the
+ *  authors and should not be interpreted as representing official policies, either expressed
+ *  or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.invasion;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.effects.common.continuous.BecomesColorSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+
+ */
+public class AlloyGolem extends CardImpl {
+
+    public AlloyGolem(UUID ownerId) {
+        super(ownerId, 297, "Alloy Golem", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{6}");
+        this.expansionSetCode = "INV";
+        this.subtype.add("Golem");
+        this.power = new MageInt(4);
+        this.toughness = new MageInt(4);
+
+        // As Alloy Golem enters the battlefield, choose a color.
+        // Alloy Golem is the chosen color.
+        this.addAbility(new EntersBattlefieldAbility(new BecomesColorSourceEffect(Duration.WhileOnBattlefield),
+            null, true, "As {this} enters the battlefield, choose a color.\n{this} is the chosen color.", ""));
+    }
+
+    public AlloyGolem(final AlloyGolem card) {
+        super(card);
+    }
+
+    @Override
+    public AlloyGolem copy() {
+        return new AlloyGolem(this);
+    }
+}
diff --git a/Mage.Sets/src/mage/sets/invasion/KavuChameleon.java b/Mage.Sets/src/mage/sets/invasion/KavuChameleon.java
new file mode 100644
index 0000000000..3390be985b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/invasion/KavuChameleon.java
@@ -0,0 +1,71 @@
+/*
+ *  Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without modification, are
+ *  permitted provided that the following conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above copyright notice, this list of
+ *        conditions and the following disclaimer.
+ *
+ *     2. Redistributions in binary form must reproduce the above copyright notice, this list
+ *        of conditions and the following disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ *  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ *  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ *  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  The views and conclusions contained in the software and documentation are those of the
+ *  authors and should not be interpreted as representing official policies, either expressed
+ *  or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.invasion;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.CantBeCounteredSourceEffect;
+import mage.abilities.effects.common.continuous.BecomesColorSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+
+ */
+public class KavuChameleon extends CardImpl {
+
+    public KavuChameleon(UUID ownerId) {
+        super(ownerId, 191, "Kavu Chameleon", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}");
+        this.expansionSetCode = "INV";
+        this.subtype.add("Kavu");
+        this.power = new MageInt(4);
+        this.toughness = new MageInt(4);
+
+        // Kavu Chameleon can't be countered.
+        this.addAbility(new SimpleStaticAbility(Zone.STACK, new CantBeCounteredSourceEffect()));
+        // {G}: Kavu Chameleon becomes the color of your choice until end of turn.
+        this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesColorSourceEffect(Duration.EndOfTurn), new ManaCostsImpl("{G}")));
+    }
+
+    public KavuChameleon(final KavuChameleon card) {
+        super(card);
+    }
+
+    @Override
+    public KavuChameleon copy() {
+        return new KavuChameleon(this);
+    }
+}
diff --git a/Mage.Sets/src/mage/sets/invasion/RainbowCrow.java b/Mage.Sets/src/mage/sets/invasion/RainbowCrow.java
new file mode 100644
index 0000000000..eea212e746
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/invasion/RainbowCrow.java
@@ -0,0 +1,71 @@
+/*
+ *  Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without modification, are
+ *  permitted provided that the following conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above copyright notice, this list of
+ *        conditions and the following disclaimer.
+ *
+ *     2. Redistributions in binary form must reproduce the above copyright notice, this list
+ *        of conditions and the following disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ *  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ *  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ *  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  The views and conclusions contained in the software and documentation are those of the
+ *  authors and should not be interpreted as representing official policies, either expressed
+ *  or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.invasion;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BecomesColorSourceEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+
+ */
+public class RainbowCrow extends CardImpl {
+
+    public RainbowCrow(UUID ownerId) {
+        super(ownerId, 69, "Rainbow Crow", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{U}");
+        this.expansionSetCode = "INV";
+        this.subtype.add("Bird");
+        this.power = new MageInt(2);
+        this.toughness = new MageInt(2);
+
+        // Flying
+        this.addAbility(FlyingAbility.getInstance());
+        //
+        // {1}: Rainbow Crow becomes the color of your choice until end of turn.
+        this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesColorSourceEffect(Duration.EndOfTurn), new ManaCostsImpl("{1}")));
+    }
+
+    public RainbowCrow(final RainbowCrow card) {
+        super(card);
+    }
+
+    @Override
+    public RainbowCrow copy() {
+        return new RainbowCrow(this);
+    }
+}
diff --git a/Mage.Sets/src/mage/sets/odyssey/WildMongrel.java b/Mage.Sets/src/mage/sets/odyssey/WildMongrel.java
index 34bef98fed..99fa8ef85f 100644
--- a/Mage.Sets/src/mage/sets/odyssey/WildMongrel.java
+++ b/Mage.Sets/src/mage/sets/odyssey/WildMongrel.java
@@ -32,23 +32,15 @@ import mage.MageInt;
 import mage.abilities.Ability;
 import mage.abilities.common.SimpleActivatedAbility;
 import mage.abilities.costs.common.DiscardTargetCost;
-import mage.abilities.effects.ContinuousEffect;
 import mage.abilities.effects.Effect;
-import mage.abilities.effects.OneShotEffect;
 import mage.abilities.effects.common.continuous.BoostSourceEffect;
-import mage.abilities.effects.common.continuous.BecomesColorTargetEffect;
+import mage.abilities.effects.common.continuous.BecomesColorSourceEffect;
 import mage.cards.CardImpl;
-import mage.choices.ChoiceColor;
 import mage.constants.CardType;
 import mage.constants.Duration;
-import mage.constants.Outcome;
 import mage.constants.Rarity;
 import mage.constants.Zone;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.players.Player;
 import mage.target.common.TargetCardInHand;
-import mage.target.targetpointer.FixedTarget;
 
 /**
  * @author magenoxx_at_gmail.com
@@ -67,7 +59,9 @@ public class WildMongrel extends CardImpl {
         Effect effect = new BoostSourceEffect(1, 1, Duration.EndOfTurn);
         effect.setText("{this} gets +1/+1");
         Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new DiscardTargetCost(new TargetCardInHand()));
-        ability.addEffect(new ChangeColorEffect());
+        effect = new BecomesColorSourceEffect(Duration.EndOfTurn);
+        effect.setText("and becomes the color of your choice until end of turn.");
+        ability.addEffect(effect);
         this.addAbility(ability);
     }
 
@@ -80,37 +74,3 @@ public class WildMongrel extends CardImpl {
         return new WildMongrel(this);
     }
 }
-
-class ChangeColorEffect extends OneShotEffect {
-
-    public ChangeColorEffect() {
-        super(Outcome.Neutral);
-        staticText = "and becomes the color of your choice until end of turn";
-    }
-
-    public ChangeColorEffect(final ChangeColorEffect effect) {
-        super(effect);
-    }
-
-    @Override
-    public boolean apply(Game game, Ability source) {
-        Player player = game.getPlayer(source.getControllerId());
-        Permanent wildMongrel = game.getPermanent(source.getSourceId());
-        if (player != null && wildMongrel != null) {
-            ChoiceColor colorChoice = new ChoiceColor();
-            if (player.choose(Outcome.Neutral, colorChoice, game)) {
-                game.informPlayers(wildMongrel.getName() + ": " + player.getLogName() + " has chosen " + colorChoice.getChoice());
-                ContinuousEffect effect = new BecomesColorTargetEffect(colorChoice.getColor(), Duration.EndOfTurn, "is " + colorChoice.getChoice());
-                effect.setTargetPointer(new FixedTarget(source.getSourceId()));
-                game.addEffect(effect, source);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public ChangeColorEffect copy() {
-        return new ChangeColorEffect(this);
-    }
-}
diff --git a/Mage.Sets/src/mage/sets/planeshift/CalderaKavu.java b/Mage.Sets/src/mage/sets/planeshift/CalderaKavu.java
new file mode 100644
index 0000000000..3ef6d7a9f1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/planeshift/CalderaKavu.java
@@ -0,0 +1,70 @@
+/*
+ *  Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without modification, are
+ *  permitted provided that the following conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above copyright notice, this list of
+ *        conditions and the following disclaimer.
+ *
+ *     2. Redistributions in binary form must reproduce the above copyright notice, this list
+ *        of conditions and the following disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ *  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ *  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ *  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  The views and conclusions contained in the software and documentation are those of the
+ *  authors and should not be interpreted as representing official policies, either expressed
+ *  or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.planeshift;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BecomesColorSourceEffect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+
+ */
+public class CalderaKavu extends CardImpl {
+
+    public CalderaKavu(UUID ownerId) {
+        super(ownerId, 58, "Caldera Kavu", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}");
+        this.expansionSetCode = "PLS";
+        this.subtype.add("Kavu");
+        this.power = new MageInt(2);
+        this.toughness = new MageInt(2);
+
+        // {1}{B}: Caldera Kavu gets +1/+1 until end of turn.
+        this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{1}{B}")));
+        // {G}: Caldera Kavu becomes the color of your choice until end of turn.
+        this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesColorSourceEffect(Duration.EndOfTurn), new ManaCostsImpl("{G}")));
+    }
+
+    public CalderaKavu(final CalderaKavu card) {
+        super(card);
+    }
+
+    @Override
+    public CalderaKavu copy() {
+        return new CalderaKavu(this);
+    }
+}
diff --git a/Mage/src/mage/abilities/effects/common/continuous/BecomesColorSourceEffect.java b/Mage/src/mage/abilities/effects/common/continuous/BecomesColorSourceEffect.java
new file mode 100644
index 0000000000..e7205a7b5b
--- /dev/null
+++ b/Mage/src/mage/abilities/effects/common/continuous/BecomesColorSourceEffect.java
@@ -0,0 +1,128 @@
+/*
+ *
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above copyright notice, this list of
+ *        conditions and the following disclaimer.
+ *
+ *     2. Redistributions in binary form must reproduce the above copyright notice, this list
+ *        of conditions and the following disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ *  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com
+ OR
+ *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ *  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ *  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  The views and conclusions contained in the software and documentation are those of the
+ *  authors and should not be interpreted as representing official policies, either expressed
+ *  or implied, of BetaSteward_at_googlemail.com.
+ *
+ */
+package mage.abilities.effects.common.continuous;
+
+import java.util.UUID;
+import mage.MageObject;
+import mage.ObjectColor;
+import mage.abilities.Ability;
+import mage.abilities.Mode;
+import mage.abilities.effects.ContinuousEffectImpl;
+import mage.choices.ChoiceColor;
+import mage.constants.Duration;
+import mage.constants.Layer;
+import mage.constants.Outcome;
+import mage.constants.SubLayer;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ * @author LoneFox
+ */
+public class BecomesColorSourceEffect extends ContinuousEffectImpl {
+
+    private ObjectColor setColor;
+
+    public BecomesColorSourceEffect(Duration duration) {
+        this(null, duration);
+    }
+
+    public BecomesColorSourceEffect(ObjectColor setColor, Duration duration) {
+        super(duration, Layer.ColorChangingEffects_5, SubLayer.NA, Outcome.Benefit);
+        this.setColor = setColor;
+    }
+
+    public BecomesColorSourceEffect(final BecomesColorSourceEffect effect) {
+        super(effect);
+        this.setColor = effect.setColor;
+    }
+
+    @Override
+    public BecomesColorSourceEffect copy() {
+        return new BecomesColorSourceEffect(this);
+    }
+
+    @Override
+    public void init(Ability source, Game game) {
+        Player controller = game.getPlayer(source.getControllerId());
+        if(controller == null) {
+            return;
+        }
+        if(setColor == null) {
+            ChoiceColor choice = new ChoiceColor();
+            while(!choice.isChosen()) {
+                controller.choose(Outcome.PutManaInPool, choice, game);
+                if(!controller.isInGame()) {
+                    return;
+                }
+            }
+            if(choice.getColor() != null) {
+                setColor = choice.getColor();
+            }
+            else {
+                return;
+            }
+            if(!game.isSimulation()) {
+                game.informPlayers(controller.getLogName() + " has chosen the color: " + setColor.toString());
+            }
+        }
+        super.init(source, game);
+    }
+
+    @Override
+    public boolean apply(Game game, Ability source) {
+        Player controller = game.getPlayer(source.getControllerId());
+        if (controller == null) {
+            return false;
+        }
+        if(setColor != null) {
+            MageObject sourceObject = game.getObject(source.getSourceId());
+            if(sourceObject != null) {
+                sourceObject.getColor(game).setColor(setColor);
+            }
+            else {
+                this.discard();
+            }
+            return true;
+        } else {
+            throw new UnsupportedOperationException("No color set");
+        }
+    }
+
+    @Override
+    public String getText(Mode mode) {
+        if(staticText != null && !staticText.isEmpty()) {
+            return staticText;
+        }
+        return "{this} becomes " + (setColor == null ? "the color of your choice" : setColor.getDescription())
+            + " " + duration.toString();
+    }
+}