diff --git a/aisleriot/TODO b/aisleriot/TODO
index 1d56e90..f17ebd1 100644
--- a/aisleriot/TODO
+++ b/aisleriot/TODO
@@ -84,9 +84,9 @@ scorpion
 scuffle
 seahaven                    NOT NEEDED
 sir_tommy
-spider
-spiderette
-spider_three_decks
+spider                      DONE
+spiderette                  DONE
+spider_three_decks          DONE
 straight_up
 streets_and_alleys          NOT NEEDED
 template
@@ -101,7 +101,7 @@ union_square
 valentine
 westhaven
 whitehead                   DONE
-will_o_the_wisp             
+will_o_the_wisp             DONE
 yield
 yukon                       NOT NEEDED
 zebra                       NOT NEEDED
diff --git a/aisleriot/rules/spider.scm b/aisleriot/rules/spider.scm
index 1160e71..0faf642 100644
--- a/aisleriot/rules/spider.scm
+++ b/aisleriot/rules/spider.scm
@@ -173,6 +173,17 @@
        (not (empty-slot? stock))
        (< (count-cards tableau 0) (length tableau))))
 
+(define (dealable?)
+  (and (not (empty-slot? stock))
+       (not (and (not allow-empty-slots)
+                 (any-slot-empty? tableau)))))
+
+(define (do-deal-next-cards)
+  (begin
+    (deal-new-cards tableau)
+    (give-status-message)
+    #t))
+
 (define (button-clicked slot)
   (and (= stock slot)
        (not (empty-slot? stock))
@@ -275,7 +286,7 @@
 	  (list 0 (_"Place something on empty slot"))
 	  (open-slots? (cdr slots)))))
 
-(define (dealable?)
+(define (can-deal?)
   (if (not (empty-slot? stock))
       (list 0 (_"Deal another round"))
       #f))
@@ -294,7 +305,7 @@
       (same-suit-check tableau)
       (not-same-suit-check tableau)
       (open-slots? tableau)
-      (dealable?)
+      (can-deal?)
 ; this isn't great, but it will get around the premature end-of-game call
       (list 0 (_"Try moving card piles around"))))
 
@@ -312,6 +323,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/spider_three_decks.scm b/aisleriot/rules/spider_three_decks.scm
index adfec92..0bc2bbb 100644
--- a/aisleriot/rules/spider_three_decks.scm
+++ b/aisleriot/rules/spider_three_decks.scm
@@ -85,4 +85,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/spiderette.scm b/aisleriot/rules/spiderette.scm
index 0a16638..dbf5454 100644
--- a/aisleriot/rules/spiderette.scm
+++ b/aisleriot/rules/spiderette.scm
@@ -61,4 +61,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/will_o_the_wisp.scm b/aisleriot/rules/will_o_the_wisp.scm
index 4d00a36..f2cc061 100644
--- a/aisleriot/rules/will_o_the_wisp.scm
+++ b/aisleriot/rules/will_o_the_wisp.scm
@@ -61,4 +61,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?)
