diff --git a/Mage.Sets/src/mage/cards/q/QuestForUlasTemple.java b/Mage.Sets/src/mage/cards/q/QuestForUlasTemple.java
index 6cf0718166..86e916037b 100644
--- a/Mage.Sets/src/mage/cards/q/QuestForUlasTemple.java
+++ b/Mage.Sets/src/mage/cards/q/QuestForUlasTemple.java
@@ -1,47 +1,59 @@
-
 package mage.cards.q;
 
-import java.util.UUID;
 import mage.abilities.Ability;
-import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
 import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
-import mage.abilities.effects.Effect;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.common.SourceHasCounterCondition;
 import mage.abilities.effects.OneShotEffect;
 import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect;
 import mage.cards.Card;
 import mage.cards.CardImpl;
 import mage.cards.CardSetInfo;
-import mage.cards.Cards;
 import mage.cards.CardsImpl;
 import mage.constants.*;
 import mage.counters.CounterType;
+import mage.filter.FilterCard;
 import mage.filter.common.FilterCreatureCard;
 import mage.filter.predicate.Predicates;
 import mage.game.Game;
-import mage.game.events.GameEvent;
 import mage.game.permanent.Permanent;
 import mage.players.Player;
 
+import java.util.UUID;
+
 /**
- *
  * @author jeffwadsworth
  */
 public final class QuestForUlasTemple extends CardImpl {
 
+    private static final FilterCard filter
+            = new FilterCreatureCard("Kraken, Leviathan, Octopus, or Serpent creature card");
+
+    static {
+        filter.add(Predicates.or(
+                SubType.KRAKEN.getPredicate(),
+                SubType.LEVIATHAN.getPredicate(),
+                SubType.OCTOPUS.getPredicate(),
+                SubType.SERPENT.getPredicate()
+        ));
+    }
+
+    private static final Condition condition = new SourceHasCounterCondition(CounterType.QUEST, 3);
+
     public QuestForUlasTemple(UUID ownerId, CardSetInfo setInfo) {
         super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}");
 
         // At the beginning of your upkeep, you may look at the top card of your library. If it's a creature card, you may reveal it and put a quest counter on Quest for Ula's Temple.
-        this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new QuestForUlasTempleEffect(), TargetController.YOU, true));
+        this.addAbility(new BeginningOfUpkeepTriggeredAbility(
+                new QuestForUlasTempleEffect(), TargetController.YOU, true
+        ));
 
         // At the beginning of each end step, if there are three or more quest counters on Quest for Ula's Temple, you may put a Kraken, Leviathan, Octopus, or Serpent creature card from your hand onto the battlefield.
-        FilterCreatureCard filter = new FilterCreatureCard("Kraken, Leviathan, Octopus, or Serpent creature card");
-        filter.add(Predicates.or(
-                SubType.KRAKEN.getPredicate(),
-                SubType.LEVIATHAN.getPredicate(),
-                SubType.OCTOPUS.getPredicate(),
-                SubType.SERPENT.getPredicate()));
-        this.addAbility(new QuestForUlasTempleTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect(filter)));
+        this.addAbility(new BeginningOfEndStepTriggeredAbility(
+                Zone.BATTLEFIELD, new PutCardFromHandOntoBattlefieldEffect(filter),
+                TargetController.ANY, condition, false
+        ));
     }
 
     private QuestForUlasTemple(final QuestForUlasTemple card) {
@@ -56,12 +68,13 @@ public final class QuestForUlasTemple extends CardImpl {
 
 class QuestForUlasTempleEffect extends OneShotEffect {
 
-    public QuestForUlasTempleEffect() {
+    QuestForUlasTempleEffect() {
         super(Outcome.Benefit);
-        this.staticText = "you may look at the top card of your library. If it's a creature card, you may reveal it and put a quest counter on {this}";
+        this.staticText = "you may look at the top card of your library. " +
+                "If it's a creature card, you may reveal it and put a quest counter on {this}";
     }
 
-    public QuestForUlasTempleEffect(final QuestForUlasTempleEffect effect) {
+    private QuestForUlasTempleEffect(final QuestForUlasTempleEffect effect) {
         super(effect);
     }
 
@@ -73,54 +86,27 @@ class QuestForUlasTempleEffect extends OneShotEffect {
     @Override
     public boolean apply(Game game, Ability source) {
         Player controller = game.getPlayer(source.getControllerId());
-        Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
-        if (sourcePermanent != null && controller != null && controller.getLibrary().hasCards()) {
-            Card card = controller.getLibrary().getFromTop(game);
-            Cards cards = new CardsImpl(card);
-            controller.lookAtCards(sourcePermanent.getName(), cards, game);
-            if (card.isCreature(game)) {
-                if (controller.chooseUse(Outcome.DrawCard, "Reveal the top card of your library?", source, game)) {
-                    controller.revealCards(sourcePermanent.getName(), cards, game);
-                    Permanent questForUlasTemple = game.getPermanent(source.getSourceId());
-                    if (questForUlasTemple != null) {
-                        questForUlasTemple.addCounters(CounterType.QUEST.createInstance(), source.getControllerId(), source, game);
-                        return true;
-                    }
-                }
-            }
+        if (controller == null) {
+            return false;
         }
-        return false;
-    }
-}
-
-class QuestForUlasTempleTriggeredAbility extends TriggeredAbilityImpl {
-
-    public QuestForUlasTempleTriggeredAbility(Effect effect) {
-        super(Zone.BATTLEFIELD, effect, true);
-    }
-
-    public QuestForUlasTempleTriggeredAbility(final QuestForUlasTempleTriggeredAbility ability) {
-        super(ability);
-    }
-
-    @Override
-    public QuestForUlasTempleTriggeredAbility copy() {
-        return new QuestForUlasTempleTriggeredAbility(this);
-    }
-
-    @Override
-    public boolean checkEventType(GameEvent event, Game game) {
-        return event.getType() == GameEvent.EventType.END_TURN_STEP_PRE;
-    }
-
-    @Override
-    public boolean checkTrigger(GameEvent event, Game game) {
-        Permanent quest = game.getPermanent(super.getSourceId());
-        return quest != null && quest.getCounters(game).getCount(CounterType.QUEST) >= 3;
-    }
-
-    @Override
-    public String getTriggerPhrase() {
-        return "At the beginning of each end step, if there are three or more quest counters on {this}, " ;
+        Card card = controller.getLibrary().getFromTop(game);
+        if (card == null) {
+            return false;
+        }
+        controller.lookAtCards("Top of library", card, game);
+        if (!card.isCreature(game) || !controller.chooseUse(
+                Outcome.DrawCard, "Reveal the top card of your library?", source, game
+        )) {
+            return true;
+        }
+        controller.revealCards(source, new CardsImpl(card), game);
+        Permanent permanent = source.getSourcePermanentIfItStillExists(game);
+        if (permanent != null) {
+            permanent.addCounters(
+                    CounterType.QUEST.createInstance(),
+                    source.getControllerId(), source, game
+            );
+        }
+        return true;
     }
 }