/* If a delay is expected, orphan the skb. (orphaning usually takes
         * place at TX completion time, so _before_ the link transit delay)
         */
-       if (q->latency || q->jitter)
+       if (q->latency || q->jitter || q->rate)
                skb_orphan_partial(skb);
 
        /*
                now = psched_get_time();
 
                if (q->rate) {
-                       struct sk_buff *last;
+                       struct netem_skb_cb *last = NULL;
+
+                       if (sch->q.tail)
+                               last = netem_skb_cb(sch->q.tail);
+                       if (q->t_root.rb_node) {
+                               struct sk_buff *t_skb;
+                               struct netem_skb_cb *t_last;
+
+                               t_skb = netem_rb_to_skb(rb_last(&q->t_root));
+                               t_last = netem_skb_cb(t_skb);
+                               if (!last ||
+                                   t_last->time_to_send > last->time_to_send) {
+                                       last = t_last;
+                               }
+                       }
 
-                       if (sch->q.qlen)
-                               last = sch->q.tail;
-                       else
-                               last = netem_rb_to_skb(rb_last(&q->t_root));
                        if (last) {
                                /*
                                 * Last packet in queue is reference point (now),
                                 * calculate this time bonus and subtract
                                 * from delay.
                                 */
-                               delay -= netem_skb_cb(last)->time_to_send - now;
+                               delay -= last->time_to_send - now;
                                delay = max_t(psched_tdiff_t, 0, delay);
-                               now = netem_skb_cb(last)->time_to_send;
+                               now = last->time_to_send;
                        }
 
                        delay += packet_len_2_sched_time(qdisc_pkt_len(skb), q);