 (defun ledger-schedule-constrain-day (year-desc month-desc day-desc)
 	(cond ((string= day-desc "*")
 				 t)
+				((string-match "[A-Za-z]" day-desc)  ;; There is something other than digits and commas
+				 (ledger-schedule-parse-complex-date year-desc month-desc day-desc))
 				((/= 0 (string-to-number day-desc))
 				 `(memq (nth 3 (decode-time date)) ',(mapcar 'string-to-number (split-string day-desc ","))))
 				(t
 				 (error "Improperly specified day constraint: %s %s %s" year-desc month-desc day-desc))))
 
-(defun ledger-schedule-parse-date-descriptor (descriptor)
-  "Parse the date descriptor, return the evaluator"
-  (ledger-schedule-compile-constraints descriptor))
+
+
+(defun ledger-schedule-parse-complex-date (year-desc month-desc day-desc)
+	(let ((years (mapcar 'string-to-number (split-string year-desc ",")))
+				(months (mapcar 'string-to-number (split-string month-desc ",")))
+				(day-parts (split-string day-desc "+"))
+				(every-nth (string-match "+" day-desc)))
+		(when every-nth
+			(let ((base-day (string-to-number (car day-parts)))
+						(increment (string-to-number (substring (cadr day-parts) 0
+																										(string-match "[A-Za-z]" (cadr day-parts)))))
+						(day-of-week (ledger-schedule-encode-day-of-week
+													(substring (cadr day-parts) (string-match "[A-Za-z]" (cadr day-parts))))))
+				(ledger-schedule-constrain-every-count-day day-of-week increment (encode-time 0 0 0 base-day (car months) (car years)))
+				))))
 
 (defun ledger-schedule-list-upcoming-xacts (candidate-items early horizon)
   "Search CANDIDATE-ITEMS for xacts that occur within the period today - EARLY  to today + HORIZON"

      xact-list)))

(defun ledger-schedule-read-descriptor-tree (descriptor-string)
	(ledger-schedule-transform-auto-tree (split-string (substring descriptor-string 1 -2) " ")))

(defun ledger-schedule-transform-auto-tree (descriptor-string-list)
  "Takes a lisp list of date descriptor strings, TREE, and returns a string with a lambda function of date."


(defun ledger-schedule-compile-constraints (descriptor-string)
  "Return a list with the year, month and day fields split"
  (let ((fields (split-string descriptor-string "[/\\-]" t)))
		(if (string-match "[A-Za-z]" descriptor-string)
				(ledger-schedule-constrain-day (nth 0 fields) (nth 1 fields) (nth 2 fields))
			(list 'and
						(ledger-schedule-constrain-day (nth 0 fields) (nth 1 fields) (nth 2 fields))
						(ledger-schedule-constrain-year (nth 0 fields) (nth 1 fields) (nth 2 fields))
						(ledger-schedule-constrain-month (nth 0 fields) (nth 1 fields) (nth 2 fields))))))

(defun ledger-schedule-constrain-year (year-desc month-desc day-desc)
	(cond ((string= year-desc "*") t)
				((/= 0 (string-to-number year-desc))
				 `(memq (nth 5 (decode-time date)) ',(mapcar 'string-to-number (split-string year-desc ","))))
				(t
				 (error "Improperly specified year constraint: %s %s %s" year-desc month-desc day-desc))))

(defun ledger-schedule-constrain-month (year-desc month-desc day-desc)
	(cond ((string= month-desc "*")
