Index: main/org-autofocus.el
===================================================================
--- main/org-autofocus.el	(revision main,5)
+++ main/org-autofocus.el	(revision main,6)
@@ -18,17 +18,64 @@
 
 
+(defvar org-af-marked 'org-af-marked)
+(put 'org-af-marked 'org-af-marked t)
+(put 'org-af-marked 'display "*")
+
+
+(defvar org-af-hidden 'org-af-hidden)
+(put 'org-af-hidden 'org-af-hidden t)
+(put 'org-af-hidden 'invisible t)
+
+
+(defvar org-af-dimmed 'org-af-dimmed)
+(put 'org-af-dimmed 'org-af-dimmed t)
+(put 'org-af-dimmed 'face 'org-agenda-dimmed-todo-face)
+(put 'org-af-dimmed 'evaporate t)
+
+(defun org-af--dim (start end)
+  (let ((o (make-overlay start end)))
+    (overlay-put o 'category org-af-dimmed)))
+
+(defun org-af--undim (start end)
+  (remove-overlays start end 'org-af-dimmed t))
+
+(defun org-af--dimmed-p (point)
+  (get-char-property point 'org-af-dimmed))
+
+
 (defun org-af-mark ()
   "Mark or unmark the current task."
   (interactive)
-  (save-excursion
-    (let ((inhibit-read-only t)
-          (props '(org-af-marked t display "*"))
-          bol)
-      (beginning-of-line)
-      (setq bol (point))
-      (funcall (if (get-text-property bol 'org-af-marked)
-                   'remove-list-of-text-properties
-                 'add-text-properties)
-               bol (1+ bol) props))))
+  (beginning-of-line)
+  (when (get-text-property (point) 'org-af-hidden)
+    (goto-char (next-single-property-change (point) 'org-af-hidden)))
+
+  (let ((inhibit-read-only t)
+        (task-point (point))
+        bol marked)
+    (unless (org-af--dimmed-p task-point)
+      (setq marked (not (get-text-property task-point 'org-af-marked)))
+      (if marked
+          (add-text-properties task-point (1+ task-point)
+                               '(category org-af-marked))
+        (remove-text-properties task-point (1+ task-point)
+                                '(category org-af-marked)))
+
+      (save-excursion
+        ;; Go to previous mark, if any
+        (while (and (= (forward-line -1) 0)
+                    (setq bol (line-beginning-position))
+                    (get-text-property bol 'type)
+                    (not (get-text-property bol 'org-af-marked))))
+
+        (when (get-text-property bol 'org-af-marked)
+          (if marked
+              (org-af--dim bol (line-end-position))
+            (org-af--undim bol (line-end-position))))
+
+        (forward-line)
+        (if marked
+            (add-text-properties bol task-point '(category org-af-hidden))
+          (remove-text-properties bol task-point '(category org-af-hidden)))))))
 
 
