diff --git a/Mage.Sets/src/mage/cards/a/AnimarSoulOfElements.java b/Mage.Sets/src/mage/cards/a/AnimarSoulOfElements.java
index 9a65514959..b4f77b1dc4 100644
--- a/Mage.Sets/src/mage/cards/a/AnimarSoulOfElements.java
+++ b/Mage.Sets/src/mage/cards/a/AnimarSoulOfElements.java
@@ -83,9 +83,6 @@ class AnimarCostReductionEffect extends CostModificationEffectImpl {
             if (abilityToModify.isControlledBy(source.getControllerId())) {
                 Card spellCard = ((SpellAbility) abilityToModify).getCharacteristics(game);
                 if (spellCard != null) {
-                    if (((SpellAbility) abilityToModify).getSpellAbilityCastMode() != SpellAbilityCastMode.NORMAL) {
-                        spellCard = ((SpellAbility) abilityToModify).getSpellAbilityCastMode().getTypeModifiedCardObjectCopy(spellCard, game);
-                    }
                     return spellCard.isCreature();
                 }
             }
diff --git a/Mage.Sets/src/mage/cards/e/ElspethConquersDeath.java b/Mage.Sets/src/mage/cards/e/ElspethConquersDeath.java
index 117721c4f4..9ea54575cf 100644
--- a/Mage.Sets/src/mage/cards/e/ElspethConquersDeath.java
+++ b/Mage.Sets/src/mage/cards/e/ElspethConquersDeath.java
@@ -102,9 +102,6 @@ class ElspethConquersDeathCostEffect extends CostModificationEffectImpl {
                 && game.getOpponents(source.getControllerId()).contains(abilityToModify.getControllerId())) {
             Card spellCard = ((SpellAbility) abilityToModify).getCharacteristics(game);
             if (spellCard != null) {
-                if (((SpellAbility) abilityToModify).getSpellAbilityCastMode() != SpellAbilityCastMode.NORMAL) {
-                    spellCard = ((SpellAbility) abilityToModify).getSpellAbilityCastMode().getTypeModifiedCardObjectCopy(spellCard, game);
-                }
                 return !spellCard.isCreature();
             }
         }
diff --git a/Mage.Sets/src/mage/cards/h/HumOfTheRadix.java b/Mage.Sets/src/mage/cards/h/HumOfTheRadix.java
index 8cf5a54708..b462ecff10 100644
--- a/Mage.Sets/src/mage/cards/h/HumOfTheRadix.java
+++ b/Mage.Sets/src/mage/cards/h/HumOfTheRadix.java
@@ -60,9 +60,6 @@ class HumOfTheRadixCostIncreaseEffect extends CostModificationEffectImpl {
         if (abilityToModify instanceof SpellAbility) {
             Card spellCard = ((SpellAbility) abilityToModify).getCharacteristics(game);
             if (spellCard != null) {
-                if (((SpellAbility) abilityToModify).getSpellAbilityCastMode() != SpellAbilityCastMode.NORMAL) {
-                    spellCard = ((SpellAbility) abilityToModify).getSpellAbilityCastMode().getTypeModifiedCardObjectCopy(spellCard, game);
-                }
                 return !spellCard.isArtifact();
             }
         }
diff --git a/Mage.Sets/src/mage/cards/r/RakdosLordOfRiots.java b/Mage.Sets/src/mage/cards/r/RakdosLordOfRiots.java
index 0fdb43f8e3..e47929beac 100644
--- a/Mage.Sets/src/mage/cards/r/RakdosLordOfRiots.java
+++ b/Mage.Sets/src/mage/cards/r/RakdosLordOfRiots.java
@@ -117,9 +117,6 @@ class RakdosLordOfRiotsCostReductionEffect extends CostModificationEffectImpl {
             if (abilityToModify.isControlledBy(source.getControllerId())) {
                 Card spellCard = ((SpellAbility) abilityToModify).getCharacteristics(game);
                 if (spellCard != null) {
-                    if (((SpellAbility) abilityToModify).getSpellAbilityCastMode() != SpellAbilityCastMode.NORMAL) {
-                        spellCard = ((SpellAbility) abilityToModify).getSpellAbilityCastMode().getTypeModifiedCardObjectCopy(spellCard, game);
-                    }
                     return spellCard.isCreature();
                 }
             }
diff --git a/Mage.Sets/src/mage/cards/s/SemblanceAnvil.java b/Mage.Sets/src/mage/cards/s/SemblanceAnvil.java
index 1830867721..7cfdf8817b 100644
--- a/Mage.Sets/src/mage/cards/s/SemblanceAnvil.java
+++ b/Mage.Sets/src/mage/cards/s/SemblanceAnvil.java
@@ -110,9 +110,6 @@ class SemblanceAnvilCostReductionEffect extends CostModificationEffectImpl {
                 && abilityToModify.isControlledBy(source.getControllerId())) {
             Card spellCard = ((SpellAbility) abilityToModify).getCharacteristics(game);
             if (spellCard != null) {
-                if (((SpellAbility) abilityToModify).getSpellAbilityCastMode() != SpellAbilityCastMode.NORMAL) {
-                    spellCard = ((SpellAbility) abilityToModify).getSpellAbilityCastMode().getTypeModifiedCardObjectCopy(spellCard, game);
-                }
                 Permanent permanent = game.getPermanent(source.getSourceId());
                 if (permanent != null) {
                     List<UUID> imprinted = permanent.getImprinted();
diff --git a/Mage/src/main/java/mage/abilities/SpellAbility.java b/Mage/src/main/java/mage/abilities/SpellAbility.java
index 82593588e4..d76b52e478 100644
--- a/Mage/src/main/java/mage/abilities/SpellAbility.java
+++ b/Mage/src/main/java/mage/abilities/SpellAbility.java
@@ -12,11 +12,11 @@ import mage.cards.SplitCard;
 import mage.constants.*;
 import mage.game.Game;
 import mage.game.events.GameEvent;
-import mage.game.stack.Spell;
 import mage.players.Player;
 
 import java.util.Optional;
 import java.util.UUID;
+import javax.naming.directory.InvalidAttributesException;
 
 /**
  * @author BetaSteward_at_googlemail.com
@@ -236,12 +236,25 @@ public class SpellAbility extends ActivatedAbilityImpl {
         return this;
     }
 
+    /**
+     * Returns a card object with the spell characteristics like calor, types,
+     * subtypes etc. E.g. if you cast a Bestow card as enchantment, the
+     * characteristics don't include the creature type.
+     *
+     * @param game
+     * @return card object with the spell characteristics
+     */
     public Card getCharacteristics(Game game) {
-        Spell spell = game.getSpell(this.getId());
-        if (spell != null) {
-            return spell;
+        Card spellCharacteristics = game.getSpell(this.getId());
+        if (spellCharacteristics == null) {
+            spellCharacteristics = game.getCard(this.getSourceId());
         }
-        return game.getCard(this.getSourceId());
+        if (spellCharacteristics != null) {
+            if (getSpellAbilityCastMode() != SpellAbilityCastMode.NORMAL) {
+                spellCharacteristics = getSpellAbilityCastMode().getTypeModifiedCardObjectCopy(spellCharacteristics, game);
+            }
+        }
+        return spellCharacteristics;
     }
 
     public static SpellAbility getSpellAbilityFromEvent(GameEvent event, Game game) {
diff --git a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java
index db88ba0bcb..5bfc2e76a6 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllEffect.java
@@ -3,6 +3,7 @@ package mage.abilities.effects.common.cost;
 import java.util.LinkedHashSet;
 import java.util.Set;
 import java.util.UUID;
+import javax.naming.directory.InvalidAttributesException;
 import mage.Mana;
 import mage.abilities.Ability;
 import mage.abilities.SpellAbility;
@@ -11,7 +12,6 @@ import mage.choices.ChoiceImpl;
 import mage.constants.CostModificationType;
 import mage.constants.Duration;
 import mage.constants.Outcome;
-import mage.constants.SpellAbilityCastMode;
 import mage.filter.FilterCard;
 import mage.game.Game;
 import mage.players.Player;
@@ -124,9 +124,6 @@ public class SpellsCostReductionAllEffect extends CostModificationEffectImpl {
         if (abilityToModify instanceof SpellAbility) {
             Card spellCard = ((SpellAbility) abilityToModify).getCharacteristics(game);
             if (spellCard != null) {
-                if (((SpellAbility) abilityToModify).getSpellAbilityCastMode() != SpellAbilityCastMode.NORMAL) {
-                    spellCard = ((SpellAbility) abilityToModify).getSpellAbilityCastMode().getTypeModifiedCardObjectCopy(spellCard, game);
-                }
                 return this.filter.match(spellCard, game) && selectedByRuntimeData(spellCard, source, game);
             }
         }
diff --git a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionControllerEffect.java
index 2b68bfd19e..8819933e7d 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionControllerEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionControllerEffect.java
@@ -115,9 +115,6 @@ public class SpellsCostReductionControllerEffect extends CostModificationEffectI
             if (abilityToModify.isControlledBy(source.getControllerId())) {
                 Card spellCard = ((SpellAbility) abilityToModify).getCharacteristics(game);;
                 if (spellCard != null) {
-                    if (((SpellAbility) abilityToModify).getSpellAbilityCastMode() != SpellAbilityCastMode.NORMAL) {
-                        spellCard = ((SpellAbility) abilityToModify).getSpellAbilityCastMode().getTypeModifiedCardObjectCopy(spellCard, game);
-                    }
                     return this.filter.match(spellCard, source.getSourceId(), source.getControllerId(), game);
                 }
             }
diff --git a/Mage/src/main/java/mage/game/command/planes/TurriIslandPlane.java b/Mage/src/main/java/mage/game/command/planes/TurriIslandPlane.java
index 3f737edfbb..99b658cde3 100644
--- a/Mage/src/main/java/mage/game/command/planes/TurriIslandPlane.java
+++ b/Mage/src/main/java/mage/game/command/planes/TurriIslandPlane.java
@@ -111,9 +111,6 @@ class TurriIslandEffect extends CostModificationEffectImpl {
             }
             Card spellCard = ((SpellAbility) abilityToModify).getCharacteristics(game);
             if (spellCard != null) {
-                if (((SpellAbility) abilityToModify).getSpellAbilityCastMode() != SpellAbilityCastMode.NORMAL) {
-                    spellCard = ((SpellAbility) abilityToModify).getSpellAbilityCastMode().getTypeModifiedCardObjectCopy(spellCard, game);
-                }
                 return filter.match(spellCard, game) && selectedByRuntimeData(spellCard, source, game);
             }
         }