Quite old issue, but has anyone tried to just add the gap[xx] to the implementation contracts to keep using the storage slots at the right location and then just use the new proxy contracts with their individual storage slots which are anywhere somewhere (pseudo) randomly located? I am inclined to try, since a lot of functionality is only available in oz 5 contracts (e.g. EIP712 utils), and porting them around is a mess.