Case Study: Modernizing 15 Year Old Medical Software Without Stopping Operations

Sandor Farkas
Founder & Lead Developer
Expert in software development and legacy code optimization
LinkedInA hospital network's patient management system had been running since before smartphones existed. Fifteen years of patches, three generations of developers who never talked to each other, and a PHP version so old that most of the original documentation had gone offline. The system handled scheduling, billing, and parts of the clinical record for several hundred staff across multiple sites, and it could not go down for a weekend, let alone a month. This is what legacy medical software modernization actually looks like when the patient isn't a line item in a slide deck but a real facility that has to keep seeing patients while the work happens.
The details below are anonymized at the client's request, but the sequence, the mistakes we almost made, and the timeline are accurate. If you're staring down a system of similar age in a healthcare or life sciences setting, the shape of this project will probably look familiar.
Why this system was still running after 15 years
Nobody sets out to keep software this old in production. It happens because every attempt to replace it got shelved. The vendor who built the original system had been acquired twice and no longer supported the version in use. Two previous modernization attempts had stalled, one after a year of planning when the scope ballooned past what the budget could cover, another after a contractor delivered a partial rewrite that didn't handle the billing edge cases the old system had quietly accumulated over a decade.
By the time we got involved, the attitude among staff was resigned rather than hopeful. The system was slow, the UI dated back to an era of different screen resolutions, and everyone had a workaround for at least one bug. But it worked, in the sense that claims got filed and patients got scheduled, and in healthcare "it works" tends to beat "it's elegant" every time. The real risk wasn't that the software was old. It was that the handful of people who understood it were approaching retirement, and the knowledge of why certain modules behaved the way they did existed only in their heads.
Legacy medical software modernization starts with reading the system, not rewriting it
We didn't start by writing code. We started by reading it, and by watching the people who used it every day.
The initial assessment took about five weeks and produced a map of the system that didn't previously exist anywhere, not even in the original vendor's documentation. We traced every module that touched patient data, billing codes, or scheduling logic, and flagged which ones were safe to touch and which ones had silent dependencies elsewhere in the codebase. A scheduling change that looked isolated turned out to feed a nightly batch job that generated compliance reports for a regulator. Nobody currently on staff had written that integration, and nobody would have known to test for it without tracing the data flow directly.
We also sat with the billing team for a week, watching how they actually used the software rather than how the manual said they were supposed to use it. Three of their daily workarounds turned out to be compensating for bugs that had existed since an early version of the system, bugs that had never been reported because the staff who'd found them had long since left and the workaround had just become part of onboarding for new hires.
This phase mattered more than any line of code we wrote later. Rebuilding or refactoring a system you don't fully understand is how modernization projects turn into year-long overruns. The first findings we handed back to the client weren't a technical architecture document. They were a short list of what the system actually did, who depended on each part, and where the real risk sat if something broke.
What changed in the first few months
Once the map existed, the work followed a straightforward principle: nothing that touches active patient care gets replaced wholesale. Everything gets strangled out gradually, with the old and new systems running in parallel until the new path has proven itself under real load.
We started with the parts least likely to cause harm if something went wrong: internal reporting, then the scheduling interface, then billing. Each piece was rebuilt on a current, supported stack and run alongside the legacy module for several weeks before the old code was retired. This is slower than a clean rewrite, and it is also the only approach that doesn't ask a hospital to bet its operations on a cutover weekend.
By month four, the scheduling interface had been replaced entirely, staff were onboarding faster because the new interface matched patterns they already knew from other software, and the nightly compliance batch job we'd found in the first month had been rewritten with proper logging, so a failure would now be visible immediately instead of surfacing three weeks later as a missing regulator filing. Billing migration took longer, closer to seven months, because of exactly the edge cases the previous contractor's rewrite had missed. We kept the old billing module running in a read-only capacity for an additional two months after the new one went live, purely so the finance team could reconcile numbers against a trusted source before fully cutting over.
At no point did the hospital stop seeing patients, stop billing, or lose a day of scheduling capacity because of the migration itself. That was the actual success metric from day one, not a specific technology swapped for another.
What this kind of project usually requires from the client side
The client's own staff made this project work as much as we did. A modernization like this fails or succeeds on access to institutional memory, and the people who've been running the old system are the only ones who have it. We relied heavily on two long-tenured staff members who could answer "why does it do that" questions we would otherwise have had to reverse-engineer from the code itself, and that cost real time from their regular workload. Any organization considering a similar project should plan for that time commitment up front rather than assuming the technical team can discover everything independently.
The other requirement is patience with a timeline that looks conservative compared to what a vendor pitch deck promises. A full rewrite is often sold as faster because it skips the step of reconciling the legacy system's quirks. In practice, the quirks don't disappear. They surface after launch, usually in production, usually at the worst time. The gradual approach costs more calendar time up front and considerably less risk and cost later.
Where this applies beyond healthcare
Old patient management systems share a lot with other regulated, high-stakes legacy software: insurance claims platforms, manufacturing control systems, anything handling compliance obligations that predate the current engineering team. If your organization serves the German healthcare market specifically, the regulatory layer around DiGA and gematik adds another dimension worth planning for separately from the technical migration itself, something we've written about in more detail in our guide to healthtech software development for the German market.
The pattern that mattered most in this project, and the one we'd recommend to anyone in a similar position, is resisting the urge to rebuild everything at once. Map the system first. Find the people who remember why it was built the way it was. Replace the lowest-risk pieces first and prove the new path before retiring the old one. It is a less exciting pitch than "we'll rebuild your entire platform in six months," and it is also the version that doesn't risk a hospital's ability to see patients on a Tuesday.
If you're responsible for a system this old and this critical, we'd be glad to talk through what an assessment like this would look like for your specific setup. Reach out at hello@wolf-tech.io, or find more about how we approach legacy code optimization at wolf-tech.io.
