         # Skip this one, keep looking for a positive
         source = @nodes[source.promiseSource]
         continue
-
       # Add edge between source and node
       source.destinations.push choice if source.destinations.indexOf(choice) is -1
       choice.sources.push source if choice.sources.indexOf(source) is -1
 
-      if 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 source
 
       for path, c of source.choices
         @resolve source.id, path if autoresolve

    gotNegative = false
    gotPositive = false

    source = @nodes[choice.promiseSource]
    source = source.after while source.after
    while source

    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
