diff --git a/Mage.Sets/src/mage/cards/o/OKagachiVengefulKami.java b/Mage.Sets/src/mage/cards/o/OKagachiVengefulKami.java
index 6333d5a3f3..cddf6d4749 100644
--- a/Mage.Sets/src/mage/cards/o/OKagachiVengefulKami.java
+++ b/Mage.Sets/src/mage/cards/o/OKagachiVengefulKami.java
@@ -1,36 +1,29 @@
-
 package mage.cards.o;
 
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
 import mage.MageInt;
-import mage.abilities.Ability;
 import mage.abilities.TriggeredAbilityImpl;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.Effect;
 import mage.abilities.effects.common.ExileTargetEffect;
 import mage.abilities.keyword.FlyingAbility;
 import mage.abilities.keyword.TrampleAbility;
 import mage.cards.CardImpl;
 import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.Outcome;
-import mage.constants.SuperType;
-import mage.constants.Zone;
+import mage.constants.*;
+import mage.filter.FilterPermanent;
 import mage.filter.common.FilterNonlandPermanent;
 import mage.filter.predicate.permanent.ControllerIdPredicate;
 import mage.game.Game;
 import mage.game.events.DamagedPlayerEvent;
 import mage.game.events.GameEvent;
 import mage.game.events.GameEvent.EventType;
-import mage.game.permanent.Permanent;
+import mage.players.Player;
 import mage.target.TargetPermanent;
-import mage.watchers.common.PlayersAttackedLastTurnWatcher;
+import mage.watchers.Watcher;
+
+import java.util.*;
 
 /**
- *
- * @author spjspj
+ * @author TheElk801
  */
 public final class OKagachiVengefulKami extends CardImpl {
 
@@ -50,12 +43,10 @@ public final class OKagachiVengefulKami extends CardImpl {
         this.addAbility(TrampleAbility.getInstance());
 
         // Whenever O-Kagachi, Vengeful Kami deals combat damage to a player, if that player attacked you during their last turn, exile target nonland permanent that player controls
-        OKagachiVengefulKamiTriggeredAbility ability = new OKagachiVengefulKamiTriggeredAbility();
-        ability.addWatcher(new PlayersAttackedLastTurnWatcher());
-        this.addAbility(ability);
+        this.addAbility(new OKagachiVengefulKamiTriggeredAbility());
     }
 
-    public OKagachiVengefulKami(final OKagachiVengefulKami card) {
+    private OKagachiVengefulKami(final OKagachiVengefulKami card) {
         super(card);
     }
 
@@ -67,18 +58,13 @@ public final class OKagachiVengefulKami extends CardImpl {
 
 class OKagachiVengefulKamiTriggeredAbility extends TriggeredAbilityImpl {
 
-    private boolean madeDamge = false;
-    private Set<UUID> damagedPlayers = new HashSet<>();
-
-    public OKagachiVengefulKamiTriggeredAbility() {
-        super(Zone.BATTLEFIELD, new OKagachiVengefulKamiEffect(), false);
+    OKagachiVengefulKamiTriggeredAbility() {
+        super(Zone.BATTLEFIELD, new ExileTargetEffect(), false);
+        this.addWatcher(new OKagachiVengefulKamiWatcher());
     }
 
-    public OKagachiVengefulKamiTriggeredAbility(final OKagachiVengefulKamiTriggeredAbility ability) {
+    private OKagachiVengefulKamiTriggeredAbility(final OKagachiVengefulKamiTriggeredAbility ability) {
         super(ability);
-        this.madeDamge = ability.madeDamge;
-        this.damagedPlayers = new HashSet<>();
-        this.damagedPlayers.addAll(ability.damagedPlayers);
     }
 
     @Override
@@ -93,55 +79,68 @@ class OKagachiVengefulKamiTriggeredAbility extends TriggeredAbilityImpl {
 
     @Override
     public boolean checkTrigger(GameEvent event, Game game) {
-        if (event.getType() == EventType.DAMAGED_PLAYER) {
-            DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event;
-            UUID damagedPlayerId = game.getCombat().getDefenderId(sourceId);
-            UUID you = this.getControllerId();
-            Permanent p = game.getPermanent(event.getSourceId());
-            if (damageEvent.isCombatDamage() && p != null && p.getId().equals(this.getSourceId())) {
-                PlayersAttackedLastTurnWatcher watcher = game.getState().getWatcher(PlayersAttackedLastTurnWatcher.class);
-                if (watcher != null && watcher.attackedLastTurn(damagedPlayerId, you)) {
-                    FilterNonlandPermanent filter = new FilterNonlandPermanent("nonland permanent defending player controls");
-                    filter.add(new ControllerIdPredicate(damagedPlayerId));
-                    this.getTargets().clear();
-                    TargetPermanent target = new TargetPermanent(filter);
-                    this.addTarget(target);
+        Player player = game.getPlayer(event.getTargetId());
+        if (player == null
+                || !((DamagedPlayerEvent) event).isCombatDamage()
+                || !event.getSourceId().equals(getSourceId())) {
+            return false;
+        }
+        this.getEffects().setValue("damagedPlayer", event.getTargetId());
+        FilterPermanent filter = new FilterNonlandPermanent("nonland permanent controlled by " + player.getName());
+        filter.add(new ControllerIdPredicate(event.getTargetId()));
+        this.getTargets().clear();
+        this.addTarget(new TargetPermanent(filter));
+        return true;
+    }
 
-                    return true;
-                }
+    @Override
+    public boolean checkInterveningIfClause(Game game) {
+        OKagachiVengefulKamiWatcher watcher = game.getState().getWatcher(OKagachiVengefulKamiWatcher.class);
+        if (watcher == null) {
+            return false;
+        }
+        UUID playerId = null;
+        for (Effect effect : this.getEffects()) {
+            Object obj = effect.getValue("damagedPlayer");
+            if (obj instanceof UUID) {
+                playerId = (UUID) obj;
+                break;
             }
         }
-        return false;
+        return watcher.checkPlayer(getControllerId(), playerId);
     }
 
     @Override
     public String getRule() {
-        return "Whenever {this} deals combat damage to a player, if that player attacked you during their last turn, exile target nonland permanent that player controls";
+        return "Whenever {this} deals combat damage to a player, " +
+                "if that player attacked you during their last turn, " +
+                "exile target nonland permanent that player controls";
     }
 }
 
-class OKagachiVengefulKamiEffect extends OneShotEffect {
+class OKagachiVengefulKamiWatcher extends Watcher {
 
-    public OKagachiVengefulKamiEffect() {
-        super(Outcome.Benefit);
-        this.staticText = "if that player attacked you during their last turn, exile target nonland permanent that player controls";
-    }
+    private final Map<UUID, Set<UUID>> playerMap = new HashMap<>();
 
-    public OKagachiVengefulKamiEffect(final OKagachiVengefulKamiEffect effect) {
-        super(effect);
+    OKagachiVengefulKamiWatcher() {
+        super(WatcherScope.GAME);
     }
 
     @Override
-    public OKagachiVengefulKamiEffect copy() {
-        return new OKagachiVengefulKamiEffect(this);
-    }
-
-    @Override
-    public boolean apply(Game game, Ability source) {
-        Permanent permanent = game.getPermanent(source.getSourceId());
-        if (permanent != null) {
-            return new ExileTargetEffect().apply(game, source);
+    public void watch(GameEvent event, Game game) {
+        switch (event.getType()) {
+            case BEGINNING_PHASE_PRE:
+                playerMap.remove(game.getActivePlayerId());
+                return;
+            case ATTACKER_DECLARED:
+                playerMap.computeIfAbsent(event.getPlayerId(), x -> new HashSet<>()).add(event.getTargetId());
+                return;
         }
-        return false;
+    }
+
+    boolean checkPlayer(UUID attackerId, UUID defenderId) {
+        return attackerId != null
+                && defenderId != null
+                && playerMap.computeIfAbsent(attackerId, x -> new HashSet<>()).contains(defenderId);
     }
 }
diff --git a/Mage/src/main/java/mage/watchers/common/PlayersAttackedLastTurnWatcher.java b/Mage/src/main/java/mage/watchers/common/PlayersAttackedLastTurnWatcher.java
deleted file mode 100644
index 2b5f73c08a..0000000000
--- a/Mage/src/main/java/mage/watchers/common/PlayersAttackedLastTurnWatcher.java
+++ /dev/null
@@ -1,51 +0,0 @@
-
-package mage.watchers.common;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-
-import mage.constants.WatcherScope;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.watchers.Watcher;
-import mage.players.PlayerList;
-
-/**
- * @author spjspj
- */
-public class PlayersAttackedLastTurnWatcher extends Watcher {
-
-    // Store how many players each player attacked in their last turn 
-    private final Map<UUID, PlayerList> playersAttackedInLastTurn = new HashMap<>();
-
-    public PlayersAttackedLastTurnWatcher() {
-        super(WatcherScope.GAME);
-    }
-
-    @Override
-    public void watch(GameEvent event, Game game) {
-        if (event.getType() == GameEvent.EventType.BEGINNING_PHASE_PRE) {
-            playersAttackedInLastTurn.remove(event.getPlayerId());
-        }
-
-        if (event.getType() == GameEvent.EventType.ATTACKER_DECLARED) {
-            PlayerList playersAttacked = playersAttackedInLastTurn.get(event.getPlayerId());
-            if (playersAttacked == null) {
-                playersAttacked = new PlayerList();
-            }
-            UUID defender = game.getCombat().getDefendingPlayerId(event.getSourceId(), game);
-            if (defender != null) {
-                playersAttacked.add(defender);
-            }
-            playersAttackedInLastTurn.put(event.getPlayerId(), playersAttacked);
-        }
-    }
-
-    public boolean attackedLastTurn(UUID playerId, UUID otherPlayerId) {
-        if (playersAttackedInLastTurn.get(playerId) != null) {
-            return playersAttackedInLastTurn.get(playerId).contains(otherPlayerId);
-        }
-        return false;
-    }
-}