 
     func dropCard(card : Card, onTableau i : Int) {
         let cardLayer = cardToLayerDictionary[card]!
-        cardLayer.zPosition = topZPosition++
-        // XXXX NEED TO FIGURE CARD OFFSET HERE
-//        let topCard = solitaire.tableau[i].isEmpty ? nil : solitaire.tableau[i].last
-//        if topCard != nil {
-//            
-//            let cardSize = tableauLayers[i].bounds
-//            let fanOffset = FAN_OFFSET*cardSize.height
-//            targetFrame.origin.y += fanOffset
-//        }
+        let stackCount = solitaire.tableau[i].count
+        let cardHeight = cardLayer.bounds.height
+        let fanOffset = FAN_OFFSET*cardHeight
+        cardLayer.position = CGPointMake(tableauLayers[i].position.x, tableauLayers[i].position.y + CGFloat(stackCount)*fanOffset)
+        cardLayer.zPosition = topZPosition++        
         let cardStack = solitaire.didDropCard(card, onTableau: i)
         
         undoManager?.registerUndoWithTarget(self, handler: {me in

                            let fanOffset = FAN_OFFSET*cardSize.height
                            targetFrame.origin.y += fanOffset
                        }
                        draggingCardLayer!.frame = targetFrame
                        dropCard(dragLayer.card, onTableau: i) // XXXX NEED TO FIGURE CARD IN METHOD
                        draggingCardLayer = nil
                        undoManager?.removeAllActions() // XXX not undoable for now
                        return // done
                    }
                }

        undoManager?.setActionName("collect waste cards")
        
        solitaire.undoCollectWasteCardsIntoStock()
        layoutCards()
    }
    
    
    func dropCard(card : Card, onFoundation i : Int) {
        let cardLayer = cardToLayerDictionary[card]!
