diff --git a/Mage.Sets/src/mage/cards/k/KheruLichLord.java b/Mage.Sets/src/mage/cards/k/KheruLichLord.java
index 34086bd9fe..8598e601e0 100644
--- a/Mage.Sets/src/mage/cards/k/KheruLichLord.java
+++ b/Mage.Sets/src/mage/cards/k/KheruLichLord.java
@@ -49,9 +49,9 @@ import mage.cards.CardSetInfo;
 import mage.cards.Cards;
 import mage.cards.CardsImpl;
 import mage.constants.CardType;
-import mage.constants.SubType;
 import mage.constants.Duration;
 import mage.constants.Outcome;
+import mage.constants.SubType;
 import mage.constants.TargetController;
 import mage.constants.Zone;
 import mage.filter.common.FilterCreatureCard;
@@ -69,7 +69,7 @@ import mage.target.targetpointer.FixedTarget;
 public class KheruLichLord extends CardImpl {
 
     public KheruLichLord(UUID ownerId, CardSetInfo setInfo) {
-        super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{G}{U}");
+        super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{G}{U}");
         this.subtype.add(SubType.ZOMBIE);
         this.subtype.add(SubType.WIZARD);
 
@@ -166,14 +166,8 @@ class KheruLichLordReplacementEffect extends ReplacementEffectImpl {
 
     @Override
     public boolean replaceEvent(GameEvent event, Ability source, Game game) {
-        Player controller = game.getPlayer(source.getControllerId());
-        if (controller != null) {
-            Card card = game.getCard(getTargetPointer().getFirst(game, source));
-            if (card != null) {
-                controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, game.getState().getZone(card.getId()), true);
-            }
-        }
-        return true;
+        ((ZoneChangeEvent) event).setToZone(Zone.EXILED);
+        return false;
     }
 
     @Override
diff --git a/Mage.Sets/src/mage/cards/w/WhipOfErebos.java b/Mage.Sets/src/mage/cards/w/WhipOfErebos.java
index 8f7562fd23..33d3c1f070 100644
--- a/Mage.Sets/src/mage/cards/w/WhipOfErebos.java
+++ b/Mage.Sets/src/mage/cards/w/WhipOfErebos.java
@@ -148,12 +148,8 @@ class WhipOfErebosReplacementEffect extends ReplacementEffectImpl {
 
     @Override
     public boolean replaceEvent(GameEvent event, Ability source, Game game) {
-        Permanent permanent = game.getPermanent(source.getFirstTarget());
-        Player controller = game.getPlayer(source.getControllerId());
-        if (permanent != null && controller != null) {
-            controller.moveCardToExileWithInfo(permanent, null, null, source.getSourceId(), game, Zone.BATTLEFIELD, true);
-        }
-        return true;
+        ((ZoneChangeEvent) event).setToZone(Zone.EXILED);
+        return false;
     }
 
     @Override
diff --git a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java
index 5bcd0ff039..6070e4693d 100644
--- a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java
+++ b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java
@@ -111,7 +111,7 @@ public class ContinuousEffects implements Serializable {
 
         costModificationEffects = effect.costModificationEffects.copy();
         spliceCardEffects = effect.spliceCardEffects.copy();
-        for (Map.Entry<ContinuousEffect, Set<Ability>> entry: effect.temporaryEffects.entrySet()) {
+        for (Map.Entry<ContinuousEffect, Set<Ability>> entry : effect.temporaryEffects.entrySet()) {
             temporaryEffects.put(entry.getKey().copy(), entry.getValue());
         }
         collectAllEffects();
@@ -352,9 +352,11 @@ public class ContinuousEffects implements Serializable {
                 continue;
             }
             if (event.getAppliedEffects() != null && event.getAppliedEffects().contains(effect.getId())) {
-                // Effect already applied to this event, ignore it
-                // TODO: Handle also gained effect that are connected to different abilities.
-                continue;
+                if (!(effect instanceof CommanderReplacementEffect)) { // 903.9.
+                    // Effect already applied to this event, ignore it
+                    // TODO: Handle also gained effect that are connected to different abilities.
+                    continue;
+                }
             }
             Set<Ability> abilities = replacementEffects.getAbility(effect.getId());
             Set<Ability> applicableAbilities = new HashSet<>();
@@ -752,7 +754,7 @@ public class ContinuousEffects implements Serializable {
             // Remove all consumed effects (ability dependant)
             for (Iterator<ReplacementEffect> it1 = rEffects.keySet().iterator(); it1.hasNext();) {
                 ReplacementEffect entry = it1.next();
-                if (consumed.containsKey(entry.getId())) {
+                if (consumed.containsKey(entry.getId()) /*&& !(entry instanceof CommanderReplacementEffect) */) { // 903.9. 
                     Set<UUID> consumedAbilitiesIds = consumed.get(entry.getId());
                     if (rEffects.get(entry) == null || consumedAbilitiesIds.size() == rEffects.get(entry).size()) {
                         it1.remove();
diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/CommanderReplacementEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/CommanderReplacementEffect.java
index 486e5ed744..adeb100ccd 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/continuous/CommanderReplacementEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/CommanderReplacementEffect.java
@@ -49,6 +49,9 @@ import mage.players.Player;
 /*
  * 903.11. If a commander would be put into its owner’s graveyard from anywhere, that player may put it into the command zone instead.
  * 903.12. If a commander would be put into the exile zone from anywhere, its owner may put it into the command zone instead.
+ * 903.9. If a commander would be exiled from anywhere or put into its owner’s hand, graveyard, or
+library from anywhere, its owner may put it into the command zone instead. This replacement effect
+may apply more than once to the same event. This is an exception to rule 614.5.
  */
 public class CommanderReplacementEffect extends ReplacementEffectImpl {
 
@@ -138,11 +141,10 @@ public class CommanderReplacementEffect extends ReplacementEffectImpl {
             if (permanent != null) {
                 Player player = game.getPlayer(permanent.getOwnerId());
                 if (player != null && player.chooseUse(Outcome.Benefit, "Move commander to command zone?", source, game)) {
-                    boolean result = permanent.moveToZone(Zone.COMMAND, source.getSourceId(), game, false);
+                    ((ZoneChangeEvent) event).setToZone(Zone.COMMAND);
                     if (!game.isSimulation()) {
                         game.informPlayers(player.getLogName() + " has moved his or her commander to the command zone");
                     }
-                    return result;
                 }
             }
         } else {
@@ -159,11 +161,10 @@ public class CommanderReplacementEffect extends ReplacementEffectImpl {
             if (card != null) {
                 Player player = game.getPlayer(card.getOwnerId());
                 if (player != null && player.chooseUse(Outcome.Benefit, "Move commander to command zone?", source, game)) {
-                    boolean result = card.moveToZone(Zone.COMMAND, source.getSourceId(), game, false);
+                    ((ZoneChangeEvent) event).setToZone(Zone.COMMAND);
                     if (!game.isSimulation()) {
                         game.informPlayers(player.getLogName() + " has moved his or her commander to the command zone");
                     }
-                    return result;
                 }
             }
         }
diff --git a/Mage/src/main/java/mage/abilities/keyword/UnearthAbility.java b/Mage/src/main/java/mage/abilities/keyword/UnearthAbility.java
index deef93c61b..239706abad 100644
--- a/Mage/src/main/java/mage/abilities/keyword/UnearthAbility.java
+++ b/Mage/src/main/java/mage/abilities/keyword/UnearthAbility.java
@@ -44,8 +44,6 @@ import mage.game.Game;
 import mage.game.events.GameEvent;
 import mage.game.events.GameEvent.EventType;
 import mage.game.events.ZoneChangeEvent;
-import mage.game.permanent.Permanent;
-import mage.players.Player;
 
 /**
  *
@@ -158,11 +156,7 @@ class UnearthLeavesBattlefieldEffect extends ReplacementEffectImpl {
 
     @Override
     public boolean replaceEvent(GameEvent event, Ability source, Game game) {
-        Permanent permanent = game.getPermanent(source.getSourceId());
-        Player controller = game.getPlayer(source.getControllerId());
-        if (controller != null && permanent != null) {
-            controller.moveCardToExileWithInfo(permanent, null, "", source.getSourceId(), game, Zone.BATTLEFIELD, true);
-        }
-        return true;
+        ((ZoneChangeEvent) event).setToZone(Zone.EXILED);
+        return false;
     }
 }
diff --git a/Mage/src/main/java/mage/players/Player.java b/Mage/src/main/java/mage/players/Player.java
index b947530716..47c1dba126 100644
--- a/Mage/src/main/java/mage/players/Player.java
+++ b/Mage/src/main/java/mage/players/Player.java
@@ -731,7 +731,8 @@ public interface Player extends MageItem, Copyable<Player> {
 
     /**
      * Uses card.moveToExile and posts a inform message about moving the card to
-     * exile into the game log
+     * exile into the game log. Don't use this in replacement effects, because
+     * list of applied effects is not saved
      *
      * @param card
      * @param exileId exile zone id (optional)
diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java
index da939fea99..fe798732bd 100644
--- a/Mage/src/main/java/mage/players/PlayerImpl.java
+++ b/Mage/src/main/java/mage/players/PlayerImpl.java
@@ -1097,7 +1097,7 @@ public abstract class PlayerImpl implements Player, Serializable {
         if (!ignoreTiming && !playLandAbility.canActivate(this.playerId, game)) {
             return false;
         }
-        
+
         game.fireEvent(GameEvent.getEvent(GameEvent.EventType.PLAY_LAND, card.getId(), card.getId(), playerId));
         //20091005 - 305.1
         if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.PLAY_LAND, card.getId(), card.getId(), playerId))) {
@@ -3602,11 +3602,8 @@ public abstract class PlayerImpl implements Player, Serializable {
     }
 
     @Override
-    public boolean moveCardToExileWithInfo(Card card, UUID exileId,
-            String exileName, UUID sourceId,
-            Game game, Zone fromZone,
-            boolean withName
-    ) {
+    public boolean moveCardToExileWithInfo(Card card, UUID exileId, String exileName, UUID sourceId,
+            Game game, Zone fromZone, boolean withName) {
         if (card == null) {
             return false;
         }