 	    (do (assert-is (= (count (first var-tree)) 2))
 		(lazy-cat (merge-mappings (match-mappings (second (first var-tree)) (first match-tree))
 					  (match-mappings (rest var-tree) (rest match-tree)))
+			  (match-mappings (rest var-tree) match-tree)))
+  	  (and (coll? (first var-tree)) (= (ffirst var-tree) :multiple))
+	    (do (assert-is (= (count (first var-tree)) 2))
+		(lazy-cat (merge-multi-mappings (match-mappings (second (first var-tree)) (first match-tree))
+					  (match-mappings var-tree (rest match-tree)))
 			  (match-mappings (rest var-tree) match-tree)))
 	  (not (coll? match-tree))
             nil




(defn merge-mappings [s1 s2]
  (filter identity 
     (for [m1 s1, m2 s2] (merge-agree m1 m2))))

(declare match-mappings)

(defn match-set [var-tree match-tree]
  (cond (empty? var-tree)
          (when (empty? match-tree) [{}])
	(empty? match-tree)
	  (when (every? #(= (first %) :optional) var-tree) [{}])
        :else
	  (concat-elts
	   (for [clause var-tree]
	     (when-let [dm (match-mappings (if (= (first clause) :optional) (second clause) clause) (first match-tree))]
	       (merge-mappings dm (match-set (remove #(identical? clause %) var-tree) (rest match-tree))))))))

(defn match-mappings "Return a lazy seq of maps of variable bindings for this matching.
                      Binds variables in (unquote x) and (unquote-seq x) - greedy forms, 
                      matches any order for sets, and hangles (:optional ... )"
  [var-tree match-tree]
;  (prn var-tree match-tree)
  (distinct 
    (cond (not (coll? var-tree))
	    (when (= var-tree match-tree)

   '#{[:FOO [unquote x]]
      [:BAR [unquote y]]
      [:optional [:BAZ [unquote z]]]}
   [[:FOO 12] [:BAR 14]])

  (match-mappings
   '#{[:FOO [unquote x]]
      [:BAR [unquote y]]
      [:multiple [:BAZ [unquote z]]]}
   [[:FOO 12] [:BAR 14]])
     

(defn match-mapping "Return a map of variable bindings for this matching, or 
