       p2 = @pattern2.check(node, descend)
       if @pattern2 + "" is "c-idp9392+"
         console.log "tick"
-      if p1 instanceof NotAllowed and p2 instanceof NotAllowed
-        failed = new Choice(p1, p2)
-        return new NotAllowed("choice failed: #{failed}", failed, node)
+      if p1 instanceof NotAllowed and @pattern1.require() instanceof Empty
+        return new Choice(@pattern1, p2)
+      if p2 instanceof NotAllowed and @pattern2.require() instanceof Empty
+        return new Choice(p1, @pattern2)
       if p2.require() instanceof Empty and p1.require() instanceof Empty
         if p1 instanceof Empty
           return p2
         if p2 instanceof Empty
           return p1
         return new Choice(p1, p2)
-      if p1 instanceof NotAllowed and @pattern1.require() instanceof Empty
-        return new Choice(@pattern1, p2)
-      if p2 instanceof NotAllowed and @pattern2.require() instanceof Empty
-        return new Choice(p1, @pattern2)
+      if p1 instanceof NotAllowed and p2 instanceof NotAllowed
+        failed = new Choice(p1, p2)
+        return new NotAllowed("choice failed: #{failed}", failed, node)
       return new Choice(p1, p2)
     attrCheck: (node) =>
       if @pattern1 instanceof NotAllowed or @pattern1 instanceof Empty

      p1 = @pattern.attrCheck(node)
      return (new Choice(new Empty("oneOrMore satisfied"), this))

  class List extends Pattern
    constructor: (pattern) ->
      @pattern = getPattern pattern

        return p2
      return (new Choice(p1, p2)).attrCheck(node)

  ###*
   * A pattern requiring both of its subpatterns to be valid, in any order
  ###
  class Interleave extends Pattern
    constructor: (pattern1, pattern2) ->
      @pattern1 = getPattern pattern1
