73fd705a1dcf87c327bf64c0739ba5eaa8bb341a
diff --git a/aisleriot/rules/athena.scm b/aisleriot/rules/athena.scm
index ca7921c..db3a5df 100644
--- a/aisleriot/rules/athena.scm
+++ b/aisleriot/rules/athena.scm
@@ -82,4 +82,4 @@
 (define (apply-options options)
   (set! deal-three (cadar options)))
 
-(set-lambda new-game button-pressed button-released button-clicked button-double-clicked game-over game-won get-hint get-options apply-options timeout droppable?)
+(set-lambda new-game button-pressed button-released button-clicked button-double-clicked game-over game-won get-hint get-options apply-options timeout droppable? dealable?)
diff --git a/aisleriot/rules/gold_mine.scm b/aisleriot/rules/gold_mine.scm
index b4adec1..d30c0af 100644
--- a/aisleriot/rules/gold_mine.scm
+++ b/aisleriot/rules/gold_mine.scm
@@ -66,4 +66,4 @@
 
 (define (apply-options options) #f)
 
-(set-lambda new-game button-pressed button-released button-clicked button-double-clicked game-over game-won get-hint get-options apply-options timeout droppable?)
+(set-lambda new-game button-pressed button-released button-clicked button-double-clicked game-over game-won get-hint get-options apply-options timeout droppable? dealable)
diff --git a/aisleriot/rules/klondike.scm b/aisleriot/rules/klondike.scm
index 9ef4676..425c99b 100644
--- a/aisleriot/rules/klondike.scm
+++ b/aisleriot/rules/klondike.scm
@@ -127,6 +127,12 @@
 			 (= (get-value (get-top-card end-slot)) 
 			    (- (get-value (car card-list)) 1))))))))
 
+(define (dealable?)
+  (flippable? stock max-redeal))
+
+(define (do-deal-next-cards)
+  (flip-stock stock waste max-redeal (if deal-three 3 1)))
+
 (define (button-clicked start-slot)
   (and (= start-slot stock)
        (flip-stock stock waste max-redeal 
@@ -279,6 +285,6 @@
 
 (define (timeout) #f)
 
-(set-features droppable-feature)
+(set-features droppable-feature dealable-feature)
 
-(set-lambda new-game button-pressed button-released button-clicked button-double-clicked game-over game-won get-hint get-options apply-options timeout droppable?)
+(set-lambda new-game button-pressed button-released button-clicked button-double-clicked game-over game-won get-hint get-options apply-options timeout droppable? dealable?)
diff --git a/aisleriot/rules/saratoga.scm b/aisleriot/rules/saratoga.scm
index f36bcac..d5eebf1 100644
--- a/aisleriot/rules/saratoga.scm
+++ b/aisleriot/rules/saratoga.scm
@@ -82,4 +82,4 @@
 (define (apply-options options)
   (set! deal-three (cadar options)))
 
-(set-lambda new-game button-pressed button-released button-clicked button-double-clicked game-over game-won get-hint get-options apply-options timeout droppable?)
+(set-lambda new-game button-pressed button-released button-clicked button-double-clicked game-over game-won get-hint get-options apply-options timeout droppable? dealable?)
diff --git a/aisleriot/sol.scm b/aisleriot/sol.scm
index 925f172..60e30a2 100644
--- a/aisleriot/sol.scm
+++ b/aisleriot/sol.scm
@@ -230,6 +230,11 @@
 
 ;; Utilities
 
+(define (flippable? stock-slot flip-limit)
+  (or (not (empty-slot? stock-slot))
+      (< flip-limit 0)
+      (< FLIP-COUNTER flip-limit)))
+
 ; deal a card from the stock-slot to the waste-slot.
 ; when the stock slot is empty than the waste slot will be flipped back
 ; onto the stock unless the flip limit has been reached.
