Separate downstream and upstream bridge definitions
Summary
We should look into refactoring the bridge implementation by separating the downstream and upstream bridge implementations.
This could be through inheritance, but there might be a better way available.