diff --git a/Mage.Server/release/config/config.xml b/Mage.Server/release/config/config.xml
index 25e7cfa779..c2ce576431 100644
--- a/Mage.Server/release/config/config.xml
+++ b/Mage.Server/release/config/config.xml
@@ -12,6 +12,9 @@
+
+
+
diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/KhalniHydra.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/KhalniHydra.java
new file mode 100644
index 0000000000..59759ee285
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/KhalniHydra.java
@@ -0,0 +1,89 @@
+/*
+ * 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.riseoftheeldrazi;
+
+import java.util.Iterator;
+import java.util.UUID;
+import mage.Constants.CardType;
+import mage.Constants.Rarity;
+import mage.MageInt;
+import mage.ObjectColor;
+import mage.abilities.Ability;
+import mage.abilities.costs.mana.ManaCost;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.game.Game;
+
+/**
+ *
+ * @author maurer.it_at_gmail.com
+ */
+public class KhalniHydra extends CardImpl {
+
+ private static final FilterControlledCreaturePermanent filter;
+
+ static {
+ filter = new FilterControlledCreaturePermanent();
+ filter.setUseColor(true);
+ filter.setColor(ObjectColor.GREEN);
+ }
+
+ public KhalniHydra(UUID ownerId) {
+ super(ownerId, 192, "Khalni Hydra", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{G}{G}{G}{G}{G}{G}{G}{G}");
+ this.expansionSetCode = "ROE";
+ this.subtype.add("Hydra");
+
+ this.color.setGreen(true);
+ this.power = new MageInt(8);
+ this.toughness = new MageInt(8);
+ this.addAbility(TrampleAbility.getInstance());
+ }
+
+ public KhalniHydra(final KhalniHydra card) {
+ super(card);
+ }
+
+ @Override
+ public void adjustCosts(Ability ability, Game game) {
+ super.adjustCosts(ability, game);
+ int reductionAmount = game.getBattlefield().getAllActivePermanents(filter).size();
+ Iterator iter = ability.getManaCosts().iterator();
+
+ while ( reductionAmount > 0 && iter.hasNext() ) {
+ iter.next();
+ iter.remove();
+ reductionAmount--;
+ }
+ }
+
+ @Override
+ public KhalniHydra copy() {
+ return new KhalniHydra(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/TrainingGrounds.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/TrainingGrounds.java
new file mode 100644
index 0000000000..ee18add856
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/TrainingGrounds.java
@@ -0,0 +1,132 @@
+/*
+ * 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.riseoftheeldrazi;
+
+import java.util.List;
+import java.util.UUID;
+import mage.Constants.CardType;
+import mage.Constants.Duration;
+import mage.Constants.Layer;
+import mage.Constants.Outcome;
+import mage.Constants.Rarity;
+import mage.Constants.SubLayer;
+import mage.Constants.Zone;
+import mage.abilities.Ability;
+import mage.abilities.SpellAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.Cost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.ContinuousEffectImpl;
+import mage.cards.CardImpl;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+
+/**
+ *
+ * @author maurer.it_at_gmail.com
+ */
+public class TrainingGrounds extends CardImpl {
+
+ public TrainingGrounds (UUID ownerId) {
+ super(ownerId, 91, "Training Grounds", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{U}");
+ this.expansionSetCode = "ROE";
+
+ this.color.setBlue(true);
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new TrainingGroundsCostReductionEffect()));
+ }
+
+ public TrainingGrounds (final TrainingGrounds card) {
+ super(card);
+ }
+
+ @Override
+ public TrainingGrounds copy() {
+ return new TrainingGrounds(this);
+ }
+}
+
+class TrainingGroundsCostReductionEffect extends ContinuousEffectImpl {
+
+ private static final String effectText = "Activated abilities of creatures you control cost up to {2} less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana";
+ private static final FilterControlledCreaturePermanent filter;
+
+ static {
+ filter = new FilterControlledCreaturePermanent();
+ }
+
+ TrainingGroundsCostReductionEffect ( ) {
+ super(Duration.WhileOnBattlefield, Layer.TextChangingEffects_3, SubLayer.NA, Outcome.Benefit);
+ }
+
+ TrainingGroundsCostReductionEffect ( TrainingGroundsCostReductionEffect effect ) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ List permanents = game.getBattlefield().getAllActivePermanents(filter);
+
+ if ( permanents != null && !permanents.isEmpty() ) {
+ for ( Permanent permanent : permanents ) {
+ for ( Ability ability : permanent.getAbilities() ) {
+ if ( !(ability instanceof SpellAbility) && ability.getManaCosts() != null ) {
+ int costCount = ability.getManaCosts().size();
+ for ( Cost cost : ability.getManaCosts() ) {
+ if ( cost instanceof GenericManaCost ) {
+ GenericManaCost costCasted = (GenericManaCost)cost;
+ int amount = costCasted.convertedManaCost();
+ int adjustedAmount = 0;
+ if ( costCount == 1 && (amount - 2) <= 0 ) {
+ adjustedAmount = 1;
+ }
+ else if ( !((amount - 2) < 0) ) {
+ adjustedAmount = amount - 2;
+ }
+ costCasted.setMana(adjustedAmount);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ public TrainingGroundsCostReductionEffect copy() {
+ return new TrainingGroundsCostReductionEffect(this);
+ }
+
+ @Override
+ public String getText(Ability source) {
+ return effectText;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/worldwake/EyeofUgin.java b/Mage.Sets/src/mage/sets/worldwake/EyeofUgin.java
index 2dabbc6145..36cbf6b408 100644
--- a/Mage.Sets/src/mage/sets/worldwake/EyeofUgin.java
+++ b/Mage.Sets/src/mage/sets/worldwake/EyeofUgin.java
@@ -132,3 +132,66 @@ class EyeofUginCostReductionAbility extends TriggeredAbilityImpl {
+//
+// private static final String effectText = "Colorless Eldrazi spells you cast cost {2} less to cast";
+//
+// EyeofUginCostReductionEffect ( ) {
+// super(Duration.WhileOnBattlefield, Layer.TextChangingEffects_3, SubLayer.NA, Outcome.Benefit);
+// }
+//
+// EyeofUginCostReductionEffect(EyeofUginCostReductionEffect effect) {
+// super(effect);
+// }
+//
+// @Override
+// public void init(Ability source, Game game) {
+// super.init(source, game);
+// if (this.affectedObjectsSet) {
+// SpellStack stack = game.getStack();
+// for ( int idx = 0; idx < stack.size(); idx++ ) {
+// StackObject stackObject = stack.get(idx);
+//
+// if ( stackObject instanceof Spell &&
+// !objects.contains(stackObject.getId()) &&
+// ((Spell)stackObject).getSubtype().contains("Eldrazi"))
+// {
+// objects.add(stackObject.getId());
+// }
+// }
+// }
+// }
+//
+// @Override
+// public boolean apply(Game game, Ability source) {
+// SpellStack stack = game.getStack();
+// boolean applied = false;
+//
+// for ( int idx = 0; idx < stack.size(); idx++ ) {
+// StackObject stackObject = stack.get(idx);
+//
+// if ( stackObject instanceof Spell &&
+// !objects.contains(stackObject.getId()) &&
+// ((Spell)stackObject).getSubtype().contains("Eldrazi"))
+// {
+// SpellAbility spell = ((Spell)stackObject).getSpellAbility();
+// int previousCost = spell.getManaCosts().convertedManaCost();
+// spell.getManaCosts().load("{" + (previousCost - 2) + "}");
+// applied |= objects.add(stackObject.getId());
+// }
+// }
+//
+// return applied;
+// }
+//
+// @Override
+// public EyeofUginCostReductionEffect copy() {
+// return new EyeofUginCostReductionEffect(this);
+// }
+//
+// @Override
+// public String getText(Ability source) {
+// return effectText;
+// }
+//}
diff --git a/Mage.Sets/src/mage/sets/zendikar/KhalniGem.java b/Mage.Sets/src/mage/sets/zendikar/KhalniGem.java
new file mode 100644
index 0000000000..3b545554af
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/zendikar/KhalniGem.java
@@ -0,0 +1,121 @@
+/*
+ * 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.zendikar;
+
+import java.util.UUID;
+import mage.Constants.CardType;
+import mage.Constants.Outcome;
+import mage.Constants.Rarity;
+import mage.Constants.Zone;
+import mage.Mana;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ManaEffect;
+import mage.abilities.mana.SimpleManaAbility;
+import mage.cards.CardImpl;
+import mage.filter.common.FilterControlledPermanent;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.Target;
+import mage.target.common.TargetControlledPermanent;
+
+/**
+ *
+ * @author maurer.it_at_gmail.com
+ */
+public class KhalniGem extends CardImpl {
+
+ private static final FilterControlledPermanent filter;
+
+ static {
+ filter = new FilterControlledPermanent("land you control");
+ filter.getCardType().add(CardType.LAND);
+ }
+
+ public KhalniGem (UUID ownerId) {
+ super(ownerId, 205, "Khalni Gem", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{4}");
+ this.expansionSetCode = "ZEN";
+
+ Ability etbAbility = new EntersBattlefieldTriggeredAbility(new KhalniGemReturnToHandTargetEffect());
+ Target target = new TargetControlledPermanent(2, 2, filter, false);
+ etbAbility.addTarget(target);
+ this.addAbility(etbAbility);
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new ManaEffect(new Mana(2, 0, 0, 0, 0, 0, 0)), new TapSourceCost()));
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new ManaEffect(new Mana(0, 2, 0, 0, 0, 0, 0)), new TapSourceCost()));
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new ManaEffect(new Mana(0, 0, 2, 0, 0, 0, 0)), new TapSourceCost()));
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new ManaEffect(new Mana(0, 0, 0, 2, 0, 0, 0)), new TapSourceCost()));
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new ManaEffect(new Mana(0, 0, 0, 0, 2, 0, 0)), new TapSourceCost()));
+ }
+
+ public KhalniGem (final KhalniGem card) {
+ super(card);
+ }
+
+ @Override
+ public KhalniGem copy() {
+ return new KhalniGem(this);
+ }
+
+}
+
+class KhalniGemReturnToHandTargetEffect extends OneShotEffect {
+
+ private static final String effectText = "return two lands you control to their owner's hand";
+
+ KhalniGemReturnToHandTargetEffect ( ) {
+ super(Outcome.ReturnToHand);
+ }
+
+ KhalniGemReturnToHandTargetEffect ( KhalniGemReturnToHandTargetEffect effect ) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ for ( UUID target : source.getTargets().get(0).getTargets() ) {
+ Permanent permanent = game.getPermanent(target);
+ if ( permanent != null ) {
+ permanent.moveToZone(Zone.HAND, source.getId(), game, true);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public KhalniGemReturnToHandTargetEffect copy() {
+ return new KhalniGemReturnToHandTargetEffect(this);
+ }
+
+ @Override
+ public String getText(Ability source) {
+ return effectText;
+ }
+}