if (buf->bytesused == video->queue.buf_used) {
                video->queue.buf_used = 0;
                buf->state = UVC_BUF_STATE_DONE;
+               list_del(&buf->queue);
                uvcg_complete_buffer(&video->queue, buf);
                video->fid ^= UVC_STREAM_FID;
 
                video->queue.buf_used = 0;
                buf->state = UVC_BUF_STATE_DONE;
                buf->offset = 0;
-               uvcg_complete_buffer(&video->queue, buf);
+               list_del(&buf->queue);
                video->fid ^= UVC_STREAM_FID;
+               ureq->last_buf = buf;
        }
 }
 
        if (buf->bytesused == video->queue.buf_used) {
                video->queue.buf_used = 0;
                buf->state = UVC_BUF_STATE_DONE;
+               list_del(&buf->queue);
                uvcg_complete_buffer(&video->queue, buf);
                video->fid ^= UVC_STREAM_FID;
        }
                uvcg_queue_cancel(queue, 0);
        }
 
+       if (ureq->last_buf) {
+               uvcg_complete_buffer(&video->queue, ureq->last_buf);
+               ureq->last_buf = NULL;
+       }
+
        spin_lock_irqsave(&video->req_lock, flags);
        list_add_tail(&req->list, &video->req_free);
        spin_unlock_irqrestore(&video->req_lock, flags);
                video->ureq[i].req->complete = uvc_video_complete;
                video->ureq[i].req->context = &video->ureq[i];
                video->ureq[i].video = video;
+               video->ureq[i].last_buf = NULL;
 
                list_add_tail(&video->ureq[i].req->list, &video->req_free);
                /* req_size/PAGE_SIZE + 1 for overruns and + 1 for header */