# Upgrading from 3.0.0 to 4.0.0
This guide covers the source and behavioural changes merged after the
`v3.0.0` tag.
## 1. Introduction of PhysicalProtoConverterExtension to the DistributedCodec
Custom `PhysicalExtensionCodec` implementations must use the new
`&dyn PhysicalProtoConverterExtension` argument in both `try_encode` and
`try_decode` when encoding or decoding DataFusion
plans and expressions. See
[Distribute a custom execution plan](../source/user-guide/04-distribute-custom-plan.md)
for the complete signatures.
## 2. `NetworkBoundary::producer_head` now returns `Result`
Custom `NetworkBoundary` implementations may now return errors when
constructing producer heads.
```rust
fn producer_head(&self, consumer_tasks: usize) -> Result<ProducerHead> {
Ok(ProducerHead::BroadcastExec {
output_partitions: self.output_partitions * consumer_tasks,
})
}
```