diff --git a/Mage.Sets/src/mage/cards/a/AyeshaTanaka.java b/Mage.Sets/src/mage/cards/a/AyeshaTanaka.java
index d16fa76af3..f6e44e5283 100644
--- a/Mage.Sets/src/mage/cards/a/AyeshaTanaka.java
+++ b/Mage.Sets/src/mage/cards/a/AyeshaTanaka.java
@@ -37,16 +37,13 @@ import mage.abilities.effects.common.CounterUnlessPaysEffect;
 import mage.abilities.keyword.BandingAbility;
 import mage.cards.CardImpl;
 import mage.cards.CardSetInfo;
-import mage.constants.AbilityType;
 import mage.constants.CardType;
 import mage.constants.SubType;
 import mage.constants.SuperType;
 import mage.constants.Zone;
-import mage.filter.FilterStackObject;
-import mage.filter.predicate.Predicate;
-import mage.game.Game;
-import mage.game.stack.StackAbility;
-import mage.target.common.TargetActivatedOrTriggeredAbility;
+import mage.filter.FilterAbility;
+import mage.filter.predicate.ability.ArtifactSourcePredicate;
+import mage.target.common.TargetActivatedAbility;
 
 /**
  *
@@ -54,26 +51,26 @@ import mage.target.common.TargetActivatedOrTriggeredAbility;
  */
 public class AyeshaTanaka extends CardImpl {
 
-    private final static FilterStackObject filter = new FilterStackObject("activated ability from an artifact source");
+    private final static FilterAbility filter = new FilterAbility("activated ability from an artifact source");
 
     static {
         filter.add(new ArtifactSourcePredicate());
     }
 
     public AyeshaTanaka(UUID ownerId, CardSetInfo setInfo) {
-        super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}{W}{U}{U}");
+        super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{W}{U}{U}");
         addSuperType(SuperType.LEGENDARY);
         this.subtype.add(SubType.HUMAN);
         this.subtype.add(SubType.ARTIFICER);
         this.power = new MageInt(2);
         this.toughness = new MageInt(2);
-        
+
         // Banding
         this.addAbility(BandingAbility.getInstance());
 
         // {T}: Counter target activated ability from an artifact source unless that ability's controller pays {W}.
         Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(new ManaCostsImpl("{W}")), new TapSourceCost());
-        ability.addTarget(new TargetActivatedOrTriggeredAbility(filter));
+        ability.addTarget(new TargetActivatedAbility(filter));
         this.addAbility(ability);
     }
 
@@ -86,22 +83,3 @@ public class AyeshaTanaka extends CardImpl {
         return new AyeshaTanaka(this);
     }
 }
-
-class ArtifactSourcePredicate implements Predicate<Ability> {
-
-    public ArtifactSourcePredicate() {
-    }
-
-    @Override
-    public boolean apply(Ability input, Game game) {
-        if (input instanceof StackAbility) {
-            return input.getSourceObject(game).isArtifact() && input.getAbilityType() == AbilityType.ACTIVATED;
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return "Source(Artifact)";
-    }
-}
diff --git a/Mage.Sets/src/mage/cards/b/BrownOuphe.java b/Mage.Sets/src/mage/cards/b/BrownOuphe.java
index 1810831dd0..06bc31afbf 100644
--- a/Mage.Sets/src/mage/cards/b/BrownOuphe.java
+++ b/Mage.Sets/src/mage/cards/b/BrownOuphe.java
@@ -27,6 +27,7 @@
  */
 package mage.cards.b;
 
+import java.util.UUID;
 import mage.MageInt;
 import mage.abilities.Ability;
 import mage.abilities.common.SimpleActivatedAbility;
@@ -35,17 +36,12 @@ import mage.abilities.costs.mana.ManaCostsImpl;
 import mage.abilities.effects.common.CounterTargetEffect;
 import mage.cards.CardImpl;
 import mage.cards.CardSetInfo;
-import mage.constants.AbilityType;
 import mage.constants.CardType;
 import mage.constants.SubType;
 import mage.constants.Zone;
-import mage.filter.FilterStackObject;
-import mage.filter.predicate.Predicate;
-import mage.game.Game;
-import mage.game.stack.StackAbility;
-import mage.target.common.TargetActivatedOrTriggeredAbility;
-
-import java.util.UUID;
+import mage.filter.FilterAbility;
+import mage.filter.predicate.ability.ArtifactSourcePredicate;
+import mage.target.common.TargetActivatedAbility;
 
 /**
  *
@@ -53,7 +49,7 @@ import java.util.UUID;
  */
 public class BrownOuphe extends CardImpl {
 
-    private final static FilterStackObject filter = new FilterStackObject("activated ability from an artifact source");
+    private final static FilterAbility filter = new FilterAbility("activated ability from an artifact source");
 
     static {
         filter.add(new ArtifactSourcePredicate());
@@ -69,7 +65,7 @@ public class BrownOuphe extends CardImpl {
         // {1}{G}, {tap}: Counter target activated ability from an artifact source.
         Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterTargetEffect(), new ManaCostsImpl<>("{1}{G}"));
         ability.addCost(new TapSourceCost());
-        ability.addTarget(new TargetActivatedOrTriggeredAbility(filter));
+        ability.addTarget(new TargetActivatedAbility(filter));
         this.addAbility(ability);
     }
 
@@ -82,22 +78,3 @@ public class BrownOuphe extends CardImpl {
         return new BrownOuphe(this);
     }
 }
-
-class ArtifactSourcePredicate implements Predicate<Ability> {
-
-    public ArtifactSourcePredicate() {
-    }
-
-    @Override
-    public boolean apply(Ability input, Game game) {
-        if (input instanceof StackAbility) {
-            return input.getSourceObject(game).isArtifact() && input.getAbilityType() == AbilityType.ACTIVATED;
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return "Source(Artifact)";
-    }
-}
diff --git a/Mage.Sets/src/mage/cards/i/Interdict.java b/Mage.Sets/src/mage/cards/i/Interdict.java
index 5fcc1c5244..4ae659f513 100644
--- a/Mage.Sets/src/mage/cards/i/Interdict.java
+++ b/Mage.Sets/src/mage/cards/i/Interdict.java
@@ -28,6 +28,7 @@
 package mage.cards.i;
 
 import java.util.UUID;
+import mage.MageObject;
 import mage.abilities.Ability;
 import mage.abilities.effects.OneShotEffect;
 import mage.abilities.effects.RestrictionEffect;
@@ -88,7 +89,7 @@ class InterdictPredicate implements Predicate<Ability> {
     @Override
     public boolean apply(Ability input, Game game) {
         if (input instanceof StackAbility && input.getAbilityType() == AbilityType.ACTIVATED) {
-            Permanent sourceObject = game.getPermanentOrLKIBattlefield(input.getSourceId());
+            MageObject sourceObject = input.getSourceObject(game);
             if (sourceObject != null) {
                 return (sourceObject.isArtifact()
                         || sourceObject.isEnchantment()
@@ -120,9 +121,12 @@ class InterdictCounterEffect extends OneShotEffect {
     public boolean apply(Game game, Ability source) {
         StackObject stackObject = game.getStack().getStackObject(source.getFirstTarget());
         if (stackObject != null && game.getStack().counter(source.getFirstTarget(), source.getSourceId(), game)) {
-            InterdictCantActivateEffect effect = new InterdictCantActivateEffect();
-            effect.setTargetPointer(new FixedTarget(stackObject.getSourceId()));
-            game.getContinuousEffects().addEffect(effect, source);
+            Permanent sourcePermanent = stackObject.getStackAbility().getSourcePermanentIfItStillExists(game);
+            if (sourcePermanent != null) {
+                InterdictCantActivateEffect effect = new InterdictCantActivateEffect();
+                effect.setTargetPointer(new FixedTarget(sourcePermanent, game));
+                game.getContinuousEffects().addEffect(effect, source);
+            }
             return true;
         }
         return false;
@@ -143,7 +147,7 @@ class InterdictCantActivateEffect extends RestrictionEffect {
 
     @Override
     public boolean applies(Permanent permanent, Ability source, Game game) {
-        return getTargetPointer().getFirst(game, source).equals(permanent.getId());
+        return permanent.getId().equals(getTargetPointer().getFirst(game, source));
     }
 
     @Override
diff --git a/Mage.Sets/src/mage/cards/r/Rust.java b/Mage.Sets/src/mage/cards/r/Rust.java
index 21dd121bf9..9bf2bac561 100644
--- a/Mage.Sets/src/mage/cards/r/Rust.java
+++ b/Mage.Sets/src/mage/cards/r/Rust.java
@@ -28,17 +28,13 @@
 package mage.cards.r;
 
 import java.util.UUID;
-import mage.abilities.Ability;
 import mage.abilities.effects.common.CounterTargetEffect;
 import mage.cards.CardImpl;
 import mage.cards.CardSetInfo;
-import mage.constants.AbilityType;
 import mage.constants.CardType;
-import mage.filter.FilterStackObject;
-import mage.filter.predicate.Predicate;
-import mage.game.Game;
-import mage.game.stack.StackAbility;
-import mage.target.common.TargetActivatedOrTriggeredAbility;
+import mage.filter.FilterAbility;
+import mage.filter.predicate.ability.ArtifactSourcePredicate;
+import mage.target.common.TargetActivatedAbility;
 
 /**
  *
@@ -46,7 +42,7 @@ import mage.target.common.TargetActivatedOrTriggeredAbility;
  */
 public class Rust extends CardImpl {
 
-    private final static FilterStackObject filter = new FilterStackObject("activated ability from an artifact source");
+    private final static FilterAbility filter = new FilterAbility("activated ability from an artifact source");
 
     static {
         filter.add(new ArtifactSourcePredicate());
@@ -57,7 +53,7 @@ public class Rust extends CardImpl {
 
         // Counter target activated ability from an artifact source.
         this.getSpellAbility().addEffect(new CounterTargetEffect());
-        this.getSpellAbility().addTarget(new TargetActivatedOrTriggeredAbility(filter));
+        this.getSpellAbility().addTarget(new TargetActivatedAbility(filter));
     }
 
     public Rust(final Rust card) {
@@ -69,22 +65,3 @@ public class Rust extends CardImpl {
         return new Rust(this);
     }
 }
-
-class ArtifactSourcePredicate implements Predicate<Ability> {
-
-    public ArtifactSourcePredicate() {
-    }
-
-    @Override
-    public boolean apply(Ability input, Game game) {
-        if (input instanceof StackAbility) {
-            return input.getSourceObject(game).isArtifact() && input.getAbilityType() == AbilityType.ACTIVATED;
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return "Source(Artifact)";
-    }
-}
diff --git a/Mage/src/main/java/mage/filter/predicate/ability/ArtifactSourcePredicate.java b/Mage/src/main/java/mage/filter/predicate/ability/ArtifactSourcePredicate.java
new file mode 100644
index 0000000000..36ff6b0032
--- /dev/null
+++ b/Mage/src/main/java/mage/filter/predicate/ability/ArtifactSourcePredicate.java
@@ -0,0 +1,51 @@
+/*
+ * 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.filter.predicate.ability;
+
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.filter.predicate.Predicate;
+import mage.game.Game;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ArtifactSourcePredicate implements Predicate<Ability> {
+
+    @Override
+    public boolean apply(Ability input, Game game) {
+        MageObject sourceObject = input.getSourceObject(game);
+        return sourceObject != null && sourceObject.isArtifact();
+    }
+
+    @Override
+    public String toString() {
+        return "Source(Artifact)";
+    }
+}
diff --git a/Mage/src/main/java/mage/target/common/TargetActivatedAbility.java b/Mage/src/main/java/mage/target/common/TargetActivatedAbility.java
index 00e65d3b11..b107528f6e 100644
--- a/Mage/src/main/java/mage/target/common/TargetActivatedAbility.java
+++ b/Mage/src/main/java/mage/target/common/TargetActivatedAbility.java
@@ -57,7 +57,7 @@ public class TargetActivatedAbility extends TargetObject {
         this.minNumberOfTargets = 1;
         this.maxNumberOfTargets = 1;
         this.zone = Zone.STACK;
-        this.targetName = "activated ability";
+        this.targetName = filter.getMessage();
         this.filter = filter;
     }
 
diff --git a/Mage/src/main/java/mage/target/common/TargetActivatedOrTriggeredAbility.java b/Mage/src/main/java/mage/target/common/TargetActivatedOrTriggeredAbility.java
index 8c9df2be20..3e3eeff5c2 100644
--- a/Mage/src/main/java/mage/target/common/TargetActivatedOrTriggeredAbility.java
+++ b/Mage/src/main/java/mage/target/common/TargetActivatedOrTriggeredAbility.java
@@ -44,7 +44,7 @@ public class TargetActivatedOrTriggeredAbility extends TargetObject {
     protected final FilterStackObject filter;
 
     public TargetActivatedOrTriggeredAbility() {
-        this(new FilterStackObject());
+        this(new FilterStackObject("activated or triggered ability"));
     }
 
     public TargetActivatedOrTriggeredAbility(FilterStackObject filter) {