union {
                struct fw_cdev_event_request request;
                struct fw_cdev_event_request2 request2;
+               struct fw_cdev_event_request3 with_tstamp;
        } req;
 };
 
                req->handle     = r->resource.handle;
                req->closure    = handler->closure;
                event_size0     = sizeof(*req);
-       } else {
+       } else if (handler->client->version < FW_CDEV_VERSION_EVENT_ASYNC_TSTAMP) {
                struct fw_cdev_event_request2 *req = &e->req.request2;
 
                req->type       = FW_CDEV_EVENT_REQUEST2;
                req->handle     = r->resource.handle;
                req->closure    = handler->closure;
                event_size0     = sizeof(*req);
+       } else {
+               struct fw_cdev_event_request3 *req = &e->req.with_tstamp;
+
+               req->type       = FW_CDEV_EVENT_REQUEST3;
+               req->tcode      = tcode;
+               req->offset     = offset;
+               req->source_node_id = source;
+               req->destination_node_id = destination;
+               req->card       = card->index;
+               req->generation = generation;
+               req->length     = length;
+               req->handle     = r->resource.handle;
+               req->closure    = handler->closure;
+               req->tstamp     = fw_request_get_timestamp(request);
+               event_size0     = sizeof(*req);
        }
 
        queue_event(handler->client, &e->event,