diff --git a/pysollib/game.py b/pysollib/game.py
index d308bf87..b9a91dd6 100644
--- a/pysollib/game.py
+++ b/pysollib/game.py
@@ -997,14 +997,14 @@ class Game:
         while i < frames:
             mx, my = int(round(dx * i)) - tx, int(round(dy * i)) - ty
             tx, ty = tx + mx, ty + my
-            for s in shadows:
-                s.move(mx, my)
-            for card in cards:
-                card.moveBy(mx, my)
             if i == 1 and shadow and from_stack:
                 # create shadows in the first frame
                 sx, sy = self.app.images.SHADOW_XOFFSET, self.app.images.SHADOW_YOFFSET
                 shadows = from_stack.createShadows(cards, sx, sy)
+            for s in shadows:
+                s.move(mx, my)
+            for card in cards:
+                card.moveBy(mx, my)
             self.canvas.update_idletasks()
             step = 1
             if clock:
diff --git a/pysollib/move.py b/pysollib/move.py
index 82088cec..ad8f56f7 100644
--- a/pysollib/move.py
+++ b/pysollib/move.py
@@ -82,14 +82,13 @@ class AMoveMove(AtomicMove):
     def __doMove(self, game, ncards, from_stack, to_stack):
         if game.moves.state == game.S_PLAY:
             assert to_stack.acceptsCards(from_stack, from_stack.cards[-ncards:])
-        cards = []
-        for i in range(ncards):
-            card = from_stack.removeCard()
-            cards.append(card)
-        cards.reverse()
+        cards = from_stack.cards[-ncards:]
         if self.frames != 0:
-            x, y = to_stack.getPositionFor(cards[0])
-            game.animatedMoveTo(from_stack, to_stack, cards, x, y, frames=self.frames, shadow=self.shadow)
+            x, y = to_stack.getPositionForNextCard()
+            game.animatedMoveTo(from_stack, to_stack, cards, x, y,
+                                frames=self.frames, shadow=self.shadow)
+        for i in range(ncards):
+            from_stack.removeCard()
         for c in cards:
             to_stack.addCard(c)
 
diff --git a/pysollib/stack.py b/pysollib/stack.py
index 33c9743c..13216c0c 100644
--- a/pysollib/stack.py
+++ b/pysollib/stack.py
@@ -702,14 +702,14 @@ class Stack:
 
     def getPositionFor(self, card):
         model, view = self, self
-        if view.can_hide_cards:
-            return view.x, view.y
         x, y = view.x, view.y
+        if view.can_hide_cards:
+            return x, y
         ix, iy, lx, ly = 0, 0, len(view.CARD_XOFFSET), len(view.CARD_YOFFSET)
+        d = self.shrink_face_down
         for c in model.cards:
             if c is card:
                 break
-            d = self.shrink_face_down
             if c.face_up:
                 x += self.CARD_XOFFSET[ix]
                 y += self.CARD_YOFFSET[iy]
@@ -718,7 +718,26 @@ class Stack:
                 y += int(self.CARD_YOFFSET[iy]/d)
             ix = (ix + 1) % lx
             iy = (iy + 1) % ly
+        return (x, y)
 
+    def getPositionForNextCard(self):
+        model, view = self, self
+        x, y = view.x, view.y
+        if view.can_hide_cards:
+            return x, y
+        if not self.cards:
+            return x, y
+        ix, iy, lx, ly = 0, 0, len(view.CARD_XOFFSET), len(view.CARD_YOFFSET)
+        d = self.shrink_face_down
+        for c in model.cards:
+            if c.face_up:
+                x += self.CARD_XOFFSET[ix]
+                y += self.CARD_YOFFSET[iy]
+            else:
+                x += int(self.CARD_XOFFSET[ix]/d)
+                y += int(self.CARD_YOFFSET[iy]/d)
+            ix = (ix + 1) % lx
+            iy = (iy + 1) % ly
         return (x, y)
 
     def getOffsetFor(self, card):