diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java
index 7f3cf02de8..0c43c1abf8 100644
--- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java
+++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java
@@ -36,7 +36,6 @@ import mage.abilities.effects.OneShotEffect;
 import mage.abilities.effects.common.DestroyTargetEffect;
 import mage.abilities.keyword.AnnihilatorAbility;
 import mage.abilities.keyword.IndestructibleAbility;
-import mage.cards.Card;
 import mage.cards.CardImpl;
 import mage.constants.CardType;
 import mage.constants.Outcome;
@@ -45,7 +44,6 @@ import mage.constants.Zone;
 import mage.game.Game;
 import mage.game.events.GameEvent;
 import mage.game.events.GameEvent.EventType;
-import mage.game.permanent.Permanent;
 import mage.game.stack.Spell;
 import mage.players.Player;
 import mage.target.TargetPermanent;
@@ -131,23 +129,10 @@ class UlamogTheInfiniteGyreEnterGraveyardEffect extends OneShotEffect {
 
     @Override
     public boolean apply(Game game, Ability source) {
-        UUID ownerId = null;
-        Card card = game.getCard(source.getSourceId());
-        if (card != null) {
-            ownerId = card.getOwnerId();
-        }
-        if (ownerId == null) {
-            Permanent permanent = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD);
-            if (permanent != null) {
-                ownerId = permanent.getOwnerId();
-            }
-        }
-        Player player = game.getPlayer(ownerId);
-        if (player != null) {
-            for (Card cardToMove : player.getGraveyard().getCards(game)) {
-                cardToMove.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
-            }
-            player.shuffleLibrary(game);
+        Player owner = game.getPlayer(game.getOwnerId(source.getSourceId()));
+        if (owner != null) {
+            owner.moveCards(owner.getGraveyard(), null, Zone.LIBRARY, source, game);
+            owner.shuffleLibrary(game);
             return true;
         }
         return false;
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ReturnToHandEffectsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ReturnToHandEffectsTest.java
index 9159d14fd9..63fff00ea5 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ReturnToHandEffectsTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ReturnToHandEffectsTest.java
@@ -36,7 +36,6 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
  *
  * @author LevelX2
  */
-
 public class ReturnToHandEffectsTest extends CardTestPlayerBase {
 
     /**
@@ -49,24 +48,59 @@ public class ReturnToHandEffectsTest extends CardTestPlayerBase {
         addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2);
         // Play with your hand revealed.
         // If you would draw a card, reveal the top card of your library instead. If it's a creature card, put it into your graveyard. Otherwise, draw a card.
-        // Whenever a creature is put into your graveyard from the battlefield, return it to your hand.        
+        // Whenever a creature is put into your graveyard from the battlefield, return it to your hand.
         addCard(Zone.BATTLEFIELD, playerA, "Enduring Renewal");
 
         // {T}, Sacrifice an artifact: Target player puts the top three cards of his or her library into his or her graveyard.
-        // Whenever an artifact enters the battlefield, you may untap Grinding Station.        
+        // Whenever an artifact enters the battlefield, you may untap Grinding Station.
         addCard(Zone.BATTLEFIELD, playerA, "Grinding Station", 1);
         addCard(Zone.BATTLEFIELD, playerA, "Ornithopter", 1);
 
         activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}, Sacrifice an artifact", playerB);
-       // addTarget(playerA, "Ornithopter");
+        // addTarget(playerA, "Ornithopter");
         setChoice(playerA, "Ornithopter");
 
         setStopAt(1, PhaseStep.BEGIN_COMBAT);
         execute();
 
-        assertGraveyardCount(playerB, 3);       
+        assertGraveyardCount(playerB, 3);
         assertHandCount(playerA, "Ornithopter", 1);
-        
+
     }
-   
+
+    @Test
+    public void testStormfrontRidersTriggerForToken() {
+        addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 2);
+        addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5);
+        addCard(Zone.BATTLEFIELD, playerA, "Plains", 1);
+        // Flying
+        // When Stormfront Riders enters the battlefield, return two creatures you control to their owner's hand.
+        // Whenever Stormfront Riders or another creature is returned to your hand from the battlefield, put a 1/1 white Soldier creature token onto the battlefield.
+        addCard(Zone.HAND, playerA, "Stormfront Riders"); // {4}{W}
+        // Buyback {4} (You may pay an additional {4} as you cast this spell. If you do, put this card into your hand as it resolves.)
+        // Put a 1/1 black Rat creature token onto the battlefield.
+        addCard(Zone.HAND, playerA, "Lab Rats"); // {B}
+
+        addCard(Zone.BATTLEFIELD, playerB, "Island", 2);
+        addCard(Zone.HAND, playerB, "Boomerang", 1);
+
+        castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Stormfront Riders");
+        castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lab Rats");
+        setChoice(playerA, "No");
+
+        castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Boomerang", "Rat");
+
+        setStopAt(1, PhaseStep.END_TURN);
+        execute();
+
+        assertPermanentCount(playerA, "Stormfront Riders", 1);
+        assertPermanentCount(playerA, "Rat", 0);
+        assertHandCount(playerA, "Silvercoat Lion", 2);
+        assertGraveyardCount(playerA, "Lab Rats", 1);
+        assertGraveyardCount(playerB, "Boomerang", 1);
+
+        assertPermanentCount(playerA, "Soldier", 3);
+
+    }
+
 }
diff --git a/Mage/src/mage/game/Game.java b/Mage/src/mage/game/Game.java
index e558dc02ad..1b19e9d30c 100644
--- a/Mage/src/mage/game/Game.java
+++ b/Mage/src/mage/game/Game.java
@@ -107,6 +107,10 @@ public interface Game extends MageItem, Serializable {
 
     UUID getControllerId(UUID objectId);
 
+    UUID getOwnerId(UUID objectId);
+
+    UUID getOwnerId(MageObject object);
+
     Permanent getPermanent(UUID permanentId);
 
     Permanent getPermanentOrLKIBattlefield(UUID permanentId);
diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java
index a4b11aa88b..65f39f5be5 100644
--- a/Mage/src/mage/game/GameImpl.java
+++ b/Mage/src/mage/game/GameImpl.java
@@ -347,12 +347,12 @@ public abstract class GameImpl implements Game, Serializable {
         MageObject object;
         if (state.getBattlefield().containsPermanent(objectId)) {
             object = state.getBattlefield().getPermanent(objectId);
-            state.setZone(objectId, Zone.BATTLEFIELD);
+            state.setZone(objectId, Zone.BATTLEFIELD); // why is this neccessary?
             return object;
         }
         for (StackObject item : state.getStack()) {
             if (item.getId().equals(objectId)) {
-                state.setZone(objectId, Zone.STACK);
+                state.setZone(objectId, Zone.STACK); // why is this neccessary?
                 return item;
             }
             if (item.getSourceId().equals(objectId) && item instanceof Spell) {
@@ -361,7 +361,7 @@ public abstract class GameImpl implements Game, Serializable {
         }
 
         for (CommandObject commandObject : state.getCommand()) {
-            if (commandObject instanceof Commander && commandObject.getId().equals(objectId)) {
+            if (commandObject.getId().equals(objectId)) {
                 return commandObject;
             }
         }
@@ -369,11 +369,11 @@ public abstract class GameImpl implements Game, Serializable {
         object = getCard(objectId);
 
         if (object == null) {
-            for (CommandObject commandObject : state.getCommand()) {
-                if (commandObject.getId().equals(objectId)) {
-                    return commandObject;
-                }
-            }
+//            for (CommandObject commandObject : state.getCommand()) {
+//                if (commandObject.getId().equals(objectId)) {
+//                    return commandObject;
+//                }
+//            }
             // can be an ability of a sacrificed Token trying to get it's source object
             object = getLastKnownInformation(objectId, Zone.BATTLEFIELD);
         }
@@ -431,6 +431,29 @@ public abstract class GameImpl implements Game, Serializable {
         return null;
     }
 
+    @Override
+    public UUID getOwnerId(UUID objectId) {
+        return getOwnerId(getObject(objectId));
+    }
+
+    @Override
+    public UUID getOwnerId(MageObject object) {
+        if (object instanceof Card) {
+            return ((Card) object).getOwnerId();
+        }
+        if (object instanceof Spell) {
+            return ((Spell) object).getOwnerId();
+        }
+        if (object instanceof StackObject) {
+            // maybe this is not correct in all cases?
+            return ((StackObject) object).getControllerId();
+        }
+        if (object instanceof CommandObject) {
+            return ((CommandObject) object).getControllerId();
+        }
+        return null;
+    }
+
     @Override
     public UUID getControllerId(UUID objectId) {
         if (objectId == null) {