return;
 }
 
-static struct thread *__machine__findnew_thread(struct machine *machine, pid_t tid,
+static struct thread *__machine__findnew_thread(struct machine *machine,
+                                               pid_t pid, pid_t tid,
                                                bool create)
 {
        struct rb_node **p = &machine->threads.rb_node;
         * so most of the time we dont have to look up
         * the full rbtree:
         */
-       if (machine->last_match && machine->last_match->tid == tid)
+       if (machine->last_match && machine->last_match->tid == tid) {
+               if (pid && pid != machine->last_match->pid_)
+                       machine->last_match->pid_ = pid;
                return machine->last_match;
+       }
 
        while (*p != NULL) {
                parent = *p;
 
                if (th->tid == tid) {
                        machine->last_match = th;
+                       if (pid && pid != th->pid_)
+                               th->pid_ = pid;
                        return th;
                }
 
        if (!create)
                return NULL;
 
-       th = thread__new(tid);
+       th = thread__new(pid, tid);
        if (th != NULL) {
                rb_link_node(&th->rb_node, parent, p);
                rb_insert_color(&th->rb_node, &machine->threads);
 
 struct thread *machine__findnew_thread(struct machine *machine, pid_t tid)
 {
-       return __machine__findnew_thread(machine, tid, true);
+       return __machine__findnew_thread(machine, 0, tid, true);
 }
 
 struct thread *machine__find_thread(struct machine *machine, pid_t tid)
 {
-       return __machine__findnew_thread(machine, tid, false);
+       return __machine__findnew_thread(machine, 0, tid, false);
 }
 
 int machine__process_comm_event(struct machine *machine, union perf_event *event)
 
                struct list_head node;
        };
        struct map_groups       mg;
+       pid_t                   pid_; /* Not all tools update this */
        pid_t                   tid;
        pid_t                   ppid;
        char                    shortname[3];
 
 struct machine;
 
-struct thread *thread__new(pid_t tid);
+struct thread *thread__new(pid_t pid, pid_t tid);
 void thread__delete(struct thread *self);
 static inline void thread__exited(struct thread *thread)
 {