             pnode.children ?= [] # Initialize if first child
             pnode.children.push node # Add to parent's children
           else # We're an orphan (broken data or from previous merge)
+            console.log "Deleting orphan: ", keyed[id], node
             delete keyed[id] # No mercy for orphans!
         else if node.name is "workspace" # Mebbe root node?
           root = node # Point at it
         else # Invalid root node!
+          console.log "Deleting invalid root: ", id, node
           delete keyed[id] # Pew Pew!
 
       pin keyed if pin? # Update pin with keyed

        status: "unknown"
      , {}, ko.mapping.fromJS @node, mapping

    @updateNodes = (url, keys, pin) =>
      @getData url, (data) =>
        @mapData @parseNodes(data, keys), pin, mapping

    @wsTemp = ko.observableArray()
    @wsItems = ko.computed =>
      @wsTemp()?[0]?.children ? []

    @wsPlans = ko.observableArray()
    @wsKeys = ko.observable()

    @poll = (url, cb, timeout=@config?.timeout?.long) =>
      $.ajax
        url: url
        success: (data) ->
          cb data
        dataType: "json"
        complete: (=> @poll url, cb, timeout)
        timeout: timeout ? 30000

    # Get config and grab initial set of nodes

    @parseNodes = (data, pin, keyed={}) ->
      root = {}

      console.log "Keyed: ", keyed

      # Index node list by ID, merging/updating if keyed was provided
      for node in data.nodes
        console.log "Node: ", node
        keyed[node.id] = node

      # Step through IDs
      for id of keyed
        console.log "Id: ", id
        node = keyed[id]
        pid = node.facts?.parent_id
        if pid? # Has parent ID?
