     gotNegative = false
     gotPositive = false
 
+    handleSourceBranches = (source) =>
+      return unless source.branches and source.branches.length
+      for branch in source.branches
+        choice.sources.push branch if choice.sources.indexOf(branch) is -1
+        branch.destinations.push choice if branch.destinations.indexOf(choice) is -1
+        for path, c of branch.choices
+          @resolve branch.id, path if autoresolve
+        handleSourceBranches branch
+
     source = @nodes[choice.promiseSource]
     source = source.after while source.after
     while source

        # Thenable returned, make subtree
        val.then (c, r) ->
          state.handleResult state.fulfilled, 0, c, r, onResult
          return
        val.else (c, e) ->
          state.handleResult state.rejected, 0, c, e, onResult
          return
        return
      # Straight-up value returned
      log.values "#{@name or @id} #{choice} resulted directly in #{typeof val} %s", val
      choice.set 'data', val if isActive choice
      choice.state = State.FULFILLED if isActive choice

    try
      val = node.callback choice, data
      if val and typeof val.then is 'function' and typeof val.else is 'function'
        log.values "#{@name or @id} #{choice} returned subtree #{val.tree.name or val.tree.id} #{val.id}"
        onResult = (state, value) =>
          return unless state.isComplete()
          if state.countFulfilled() is 1
