The brief
The 523i had been acting up, odd warning lights, false fault codes, electrics behaving erratically, and slow cranking. The owner brought it in. On a modern BMW that pattern usually traces straight back to the battery. These cars run on a network of control modules and sensors that all need stable voltage to talk to each other properly. When the battery gets weak, the voltage sags and those modules get fed unstable power, so they misread signals, miscommunicate, and throw fault codes for problems that aren't really there, on top of the obvious slow starts. And on a BMW it's not just drop a battery in and go: the new one has to be registered in the IBS, the battery management system, so the charging system knows it's fresh and charges it correctly. A failed battery doesn't recover, so it needs replacing and coding in.
The diagnosis
A battery and charging test confirmed it, the battery was down, failing the load test and unable to hold voltage, which is what was feeding the modules unstable power and generating the false codes. The alternator was charging fine, it was the battery at the end of its life. So it was a battery replacement, the correct type, fitted and then registered in the IBS so the charging system would manage it properly, and the false codes cleared once the voltage was stable.
The work
The old battery was removed and a new genuine BMW battery of the correct type and rating fitted, the terminals cleaned and the clamp torqued properly. Then the new battery was registered in the IBS so the charging system recognised it as fresh, and the stored fault codes were cleared with the voltage now stable. A quick run confirmed a strong crank, steady voltage, the warning lights gone, and the electrics behaving normally.
The outcome
Strong starts, steady voltage, no false fault codes, the electrics back to normal, and the new battery registered so the charging system looks after it. The 523i went home sorted. A weak battery on a BMW doesn't just risk a no-start, it throws the whole electronic system into confusion, so changing it and coding it in properly fixed the real problem instead of chasing phantom faults.