A method comprising: determining, by an ingress packet forwarding engine implemented in processing circuitry, in response to receiving a network packet, an egress packet forwarding engine for outputting the network packet; enqueuing, by the ingress packet forwarding engine, the network packet in a virtual output queue for output to the egress packet forwarding engine, wherein enqueuing the network packet in the virtual output queue comprises enqueuing the network packet in a first portion of a combined buffer for the ingress packet forwarding engine and the egress packet forwarding engine that is assigned to the virtual output queue; outputting, by the egress packet forwarding engine implemented in processing circuitry, in response to a first scheduling event, to the ingress packet forwarding engine, information indicating the network packet in the virtual output queue and that the network packet is to be enqueued at an output queue for an output port of the egress packet forwarding engine, wherein outputting the information comprises outputting metadata comprising the information to the ingress packet forwarding engine; dequeuing, by the ingress packet forwarding engine, in response to receiving the information, the network packet from the virtual output queue and enqueuing, by the ingress packet forwarding engine, the network packet to the output queue, wherein dequeuing the network packet from the virtual output queue comprises dequeuing the network packet from the first portion of the combined buffer, and wherein enqueuing the network packet the network packet to the output queue comprises enqueuing the network packet in a second portion of the combined buffer assigned to the output queue; and dequeuing, by the egress packet forwarding engine, in response to a second scheduling event that is after the first scheduling event, the network packet from the output queue and outputting, by the egress packet forwarding engine, the network packet at the output port. determining, by an ingress packet forwarding engine implemented in processing circuitry, in response to receiving a network packet, an egress packet forwarding engine for outputting the network packet; enqueuing, by the ingress packet forwarding engine, the network packet in a virtual output queue for output to the egress packet forwarding engine, wherein enqueuing the network packet in the virtual output queue comprises enqueuing the network packet in a first portion of a combined buffer for the ingress packet forwarding engine and the egress packet forwarding engine that is assigned to the virtual output queue; outputting, by the egress packet forwarding engine implemented in processing circuitry, in response to a first scheduling event, to the ingress packet forwarding engine, information indicating the network packet in the virtual output queue and that the network packet is to be enqueued at an output queue for an output port of the egress packet forwarding engine, wherein outputting the information comprises outputting metadata comprising the information to the ingress packet forwarding engine; dequeuing, by the ingress packet forwarding engine, in response to receiving the information, the network packet from the virtual output queue and enqueuing, by the ingress packet forwarding engine, the network packet to the output queue, wherein dequeuing the network packet from the virtual output queue comprises dequeuing the network packet from the first portion of the combined buffer, and wherein enqueuing the network packet the network packet to the output queue comprises enqueuing the network packet in a second portion of the combined buffer assigned to the output queue; and dequeuing, by the egress packet forwarding engine, in response to a second scheduling event that is after the first scheduling event, the network packet from the output queue and outputting, by the egress packet forwarding engine, the network packet at the output port.