Legacy application modernization

It still runs the business. Nobody wants to touch it.

The application works. That is precisely the problem. Two decades of business rules are encoded in it, most of them written down nowhere, and the people who remember why are leaving. We modernise it one slice at a time, proving the new code behaves identically before it takes a single real transaction.

Parity run — pricing enginebuild 219
Legacy (PowerBuilder)MatchRebuilt (.NET)
contract_discount · tier 3 · qty 480
14,382.60PASS14,382.60
freight_surcharge · zone 7 · backorder
311.04PASS311.04
tax_rounding · multi-line · legacy half-up
2,904.51DIFF2,904.50
12,418 cases replayed12,415 pass3 diffs · all triaged

Illustrative output. The third row is the useful one: a one-cent rounding difference is a twenty-year-old business decision, not a bug. We find them before your customers do.

200+ engineersISO 27001 & ISO 9001PowerBuilder · Oracle Forms · Java · .NET37+ clientsCharlotte · Chennai · Madurai · Singapore
What we hear on the first call

Six sentences that come up in almost every modernization conversation.

None of them are about technology. All of them are about risk.

“One person understands the pricing module. He retires next year.”

Manufacturer · CIO

“We got a quote for a rewrite. Eighteen months before we see anything.”

Distribution · VP technology

“Every change takes six weeks because nobody trusts the regression testing.”

Insurance services · head of IT

“The vendor's runtime is going end-of-life and we cannot stay on it.”

Logistics · director of applications

“We tried a converter. What came out was unreadable and we still owned it.”

Healthcare services · CTO

“Our auditors keep flagging it and we have run out of compensating controls.”

Financial services · CISO
The honest diagnosis

The language is not what makes this risky. Six other things are.

Rewriting PowerBuilder in .NET is an engineering exercise with known answers. Everything below is what actually causes modernization projects to overrun, stall, or quietly break the business. We look for all six before quoting anything.

R-01

The rules live in the code, not in a document

Two decades of policy exceptions, customer-specific pricing and regulatory edge cases were implemented directly and never written down. The application is the specification. Any approach that starts from a requirements workshop will rebuild a version of the system that nobody recognises.

R-02

Institutional memory is on a retirement schedule

Usually one or two people can explain why a module behaves the way it does. This is the single most time-sensitive factor in the whole project, and it is the one most often left out of the business case.

R-03

There is no test suite to tell you if you broke something

Confidence in the current system comes from the fact that it has run for years, not from coverage. Remove that and you are shipping changes blind. Building the safety net is work that has to happen before the rewrite, not alongside it.

R-04

The data model carries twenty years of exceptions

Overloaded columns, status flags whose meaning changed in 2011, records that only make sense in the context of a process that no longer exists. Clean-slate schemas collide with this on day one of migration testing.

R-05

Integrations you will only discover by turning things off

Scheduled jobs, a reporting database somebody points Excel at, a partner file drop, an interface written by a contractor in 2008. The dependency map is almost never complete at the start of a project.

R-06

The business cannot stop while you rebuild

Regulation changes, customers ask for things, competitors ship. A modernization plan that requires an eighteen-month feature freeze is not a plan the business will actually honour, and the parallel-change problem is what sinks it.

Where modernization programmes go wrong

Four failure patterns, all of them survivable if you plan around them.

The big-bang cutover

Build the whole thing, test it in UAT, switch over one weekend. Every unknown in the system surfaces at the same moment, in production, with no path back. The larger the application, the more certain this outcome becomes.

The automated converter

A tool translates the source and produces code that compiles and nobody can maintain. You have swapped a legacy system you understand for a modern-looking system you do not. The technical debt moved; it did not reduce.

The two-team divergence

One team maintains the old system, another builds the new one. Every fix shipped to production has to be reimplemented in the rebuild, and the gap widens faster than the new team can close it.

The offshore team without context

Engineers who can write the language but cannot tell whether an odd calculation is a bug or a deliberate business rule. They reasonably assume bug, fix it, and a customer's invoice changes for the first time in fifteen years.

How we do it

Behaviour first. Code second. Cutover last.

This is a genuine sequence — each stage depends on the one before it, and we do not skip ahead when a timeline gets uncomfortable. The order is the whole risk strategy.

S-01

Archaeology

Recover the rules from the source

We read the code, the stored procedures, the batch jobs and the schema, and produce a written rule inventory. Interviews with your long-tenured staff confirm and explain what we found rather than being the only source. What comes out of this stage is an asset you keep regardless of what you decide next.

  • Module and dependency map, including the integrations nobody listed
  • Business rule inventory with the source location of each rule
  • Dead code and dead data identified — often a large share of the estate
S-02

Parity harness

Build the safety net before the code

We capture the legacy system's actual behaviour as an executable expectation: real inputs replayed against both systems, outputs compared field by field. This is the artefact that lets everyone stop arguing about whether the rebuild is correct, because the answer becomes a number on a dashboard.

  • Production inputs replayed against legacy and rebuilt modules in parallel
  • Every difference triaged as bug, deliberate change, or twenty-year-old rounding rule
  • The harness stays in place afterwards as your first real regression suite
S-03

Strangle

One slice at a time, both systems live

A routing layer sits in front of the application and sends a defined slice of traffic to the new implementation while everything else continues to run on the legacy system. The slice widens only when parity holds. If something is wrong, the route flips back in minutes, not in a weekend war room.

  • Users see change gradually, in pieces small enough to absorb
  • Rollback is a routing decision, not a restore from backup
  • The business keeps operating on a system that has not stopped working
S-04

Data

Reconciled, not just copied

Schema modernisation runs behind a compatibility layer with continuous reconciliation between old and new stores, so a data problem is caught by a nightly count difference rather than by a customer. Historical exceptions get explicit handling and documentation instead of a cleanup script.

  • Dual-write or change-data-capture during transition, depending on your constraints
  • Reconciliation reports as a standing control, not a one-off migration check
  • Archive and retention decisions made deliberately, with your compliance team
S-05

Retire

Turn it off only when it has earned it

A legacy module is decommissioned when it has carried zero traffic for an agreed period and parity has held under real load, including month-end and year-end. Licences, servers and support contracts are retired on a schedule you approve, and the archaeology documentation is handed over with the code.

  • Decommissioning checklist covering licences, jobs, interfaces and reporting
  • Month-end and year-end cycles observed before anything is switched off
  • Full handover: rule inventory, tests, runbooks, architecture decision records

Traffic routing during S-03 — three points in the same project

MONTH 1MONTH 5MONTH 11UsersROUTERLegacy100%RebuiltshadowParity harness only. No user traffic.UsersROUTERLegacy70%Rebuilt30%Three modules live. Rollback is a config change.UsersROUTERLegacy0% · retiringRebuilt100%Held through year-end before decommissioning.
Legacy pathRebuilt pathShadow / retiring
The three ways this gets done

Compare them on the questions your board will actually ask.

Automated conversion is fast and cheap and leaves you with code you cannot maintain. A big-bang rewrite gives you a clean system and concentrates all the risk into one weekend. We are arguing for the third column, and this is the honest version of why.

DimensionAutomated conversionBig-bang rewriteParity-tested strangle
What exists at day 90Converted code, untestedA partial system in a dev environmentA rule inventory, a test harness, one module live
Undocumented business logicCarried over, still undocumentedRediscovered during UAT, or afterExtracted and written down in the first stage
When users feel changeAll at onceAll at onceGradually, one module at a time
If you have to stopYou own unmaintainable codeYou own a half-built systemYou keep what is already live and documented
Rolling backRestore and re-planWeekend recovery operationA routing change
Shipping features meanwhileFrozen during conversionFrozen, or built twiceContinues, in whichever system owns the module
What you hold at the endModern syntax, same debtA new system and a knowledge gapCode, tests, documented rules and the team that knows them
What we work on

We still keep engineers who can read the systems most firms have stopped hiring for.

That is not nostalgia. You cannot extract rules from a codebase you cannot read, and a team that only knows the target stack will guess at the source.

PowerBuilder

Classic and .NET targets, PFC and custom frameworks, DataWindow logic, embedded SQL. Our deepest legacy practice. See the PowerBuilder page →

Oracle Forms & Reports

Forms 6i onward, PL/SQL-heavy business logic, report estates.

Legacy Java

Struts, EJB 2.x, applets and Swing clients, WebLogic and WebSphere estates, XML configuration sprawl.

.NET Framework & VB6

WebForms, WinForms, classic ASP remnants, VB6 components still in the call chain.

Database-first applications

Where the logic lives in stored procedures and triggers: Sybase, Oracle, SQL Server, Informix.

Departmental systems

Access and VBA applications that quietly became business-critical, and the spreadsheets attached to them.

Batch & integration estates

Scheduled jobs, flat-file interfaces, FTP drops and the reporting extracts everyone forgot were running.

Reporting layers

Crystal Reports, legacy BI and the shadow Excel estate that depends on the old schema staying exactly as it is.

Where we take it
.NET 8 / C#Java / Spring BootReact / TypeScriptAzurePower PlatformPostgreSQLSQL ServerContainerised on-premREST & event interfaces

Microsoft is our deepest target stack, and several of these programmes land on Azure and the Power Platform.

The objection we get asked about most

“What happens to our roadmap while this is running?”

The honest answer is that a modernization programme costs you some delivery capacity. The dishonest answer is that it costs you nothing. What we can do is make sure the cost is a slowdown rather than a stop, and that nothing gets built twice.

Because modules move one at a time, each change has exactly one owner: it goes into the legacy system if that module has not moved yet, and into the new one if it has. No parallel implementation, no reconciliation backlog.

A regulatory change lands mid-programmeships once
A customer needs a new reportships once
A defect in a module already migratednew system
A defect in a module not yet touchedlegacy system
A large new feature in a module due to migratewe resequence
Month-end and year-end cyclesno cutovers scheduled
How an engagement starts

A paid assessment you own, before anyone signs a modernization contract.

We would rather sell you a small piece of work that tells you the truth than a large one that commits you before either of us knows the shape of the estate.

Weeks 1–4

Assessment

Codebase analysis, dependency and integration map, rule inventory for the highest-risk modules, and a sequenced plan with ranges rather than a single confident number.

Weeks 5–12

First slice

Parity harness built, one module rebuilt and running in shadow, then taking real traffic. This is the gate: if parity does not hold, we say so before you commit further.

Ongoing

Sequenced migration

Modules move on an agreed order that follows business risk, not code convenience. Each one goes through the same shadow, parity, route, hold cycle.

Close-out

Handover and retirement

Legacy decommissioned on your schedule. You receive the rule inventory, the test suite, runbooks and architecture decisions, whether or not we continue with you afterwards.

Before you book a call

Five times we would tell you to keep the old system.

Modernization is expensive and disruptive. Sometimes the right answer is not yet, or not at all.

It works and nothing is forcing your hand

No end-of-life runtime, no audit finding, no hiring problem, no roadmap the application is blocking. A stable system that costs little to run is not automatically a liability. We will help you write down what would change that.

The application is genuinely being replaced by a package

If a commercial product covers most of what the system does, buying it is usually cheaper than rebuilding. We would rather tell you that than take a rewrite you will regret at go-live.

Nobody on your side owns the decision

These programmes need one executive who can arbitrate when a rule is disputed and a business unit disagrees with IT. Without that, the project stalls in month four regardless of who is engineering it.

The people who know the system have already left

It is still possible, but honestly harder and more expensive, and the assessment phase gets longer. We will scope it that way rather than discovering it later.

The real problem is the process, not the software

Sometimes the application is being blamed for a workflow the business changed around it. Rebuilding it faithfully will preserve the problem in a newer language.

You want a fixed price on an unassessed estate

Anyone who quotes a firm number before reading the code is either padding heavily or planning to renegotiate. We do the assessment first, and we tell you the range honestly.

Who you would be working with

Enough engineers to staff a multi-year programme, and enough discipline to keep it small.

200+

Engineers across four offices

37+

Clients delivered for

4

Offices: Charlotte, Chennai, Madurai, Singapore

ISO

27001 and 9001 certified

Trusted by leading enterprises and healthcare teams

Chargeback
Datanuum
Dedalus
Facely
Harris Healthcare
Firetree
ForwardLane
IBM
M2P
Marque
Medworks
Merchantrade
Parthenon
Qodex
Shift
SmartBiz
Sojern
UFG
UrbanSDK
Zero Gravity
FAQ

Cost, control, source code and what happens if it goes wrong.

Can you give us a fixed price?
For the assessment, yes. For the migration itself, only after the assessment, and then per slice rather than for the whole programme. Anyone offering a firm number for an unread codebase is guessing, and you will pay for that guess either in padding or in change orders.
Do we have to send you our source code?
We can work inside your environment on your infrastructure if that is your policy — several clients require it. Where code does move, it moves under NDA into a segregated environment with access logging, under ISO 27001 certified processes.
Who owns what you build?
You do, including the rule inventory, the parity harness and the documentation. The handover is written into the agreement rather than being something you negotiate at the end.
What if we want to stop halfway?
You keep the modules that are already live, the documentation, and the test suite. That is a structural property of doing it slice by slice, and it is one of the main reasons we work this way. A half-finished big-bang rewrite has no equivalent.
Will our internal team be involved?
Yes, and we plan for it explicitly. Your long-tenured people are the highest-value input in the archaeology stage, and your maintenance developers should be able to own the result. We agree a knowledge-transfer plan at the start rather than treating it as a closing activity.
How long does a typical programme take?
It depends on the size of the estate and how much of it is genuinely in use — dead modules are common and finding them early changes the number substantially. What we can commit to is that the first module is live in production within the first engagement quarter.
Do you also maintain the legacy system during the migration?
Often, yes. Some clients hand us support of the legacy application alongside the rebuild, which removes the two-team divergence problem entirely. Others keep support in-house and we coordinate on sequencing.
Is AI involved in this?
In the archaeology and test-generation stages, usefully so — reading a large codebase and drafting rule documentation and test cases is work it accelerates. We do not let it decide what the system should do, and every extracted rule is confirmed against the source and with your people before it becomes a specification.
Talk to our CTO

Start with a thirty-minute conversation.

No 50-page proposals. We'll tell you which level fits your situation, what a realistic engagement looks like, and what it would cost — in one direct meeting.

Who you'll talk to
Thomas, CTO at 10decoders

Thomas

Chief Technology Officer

Connect on LinkedIn

Thomas leads 10decoders' AI engineering practice and sits in on the scoping call himself — so the person mapping your engagement is the one who has shipped it before. His teams build and deploy agents for mid-market healthcare and fintech companies, with enterprise grade build experience for clients like IBM, Dedalus and Harris Healthcare. He'll be straight with you about what's worth doing and what isn't.

200+
Engineers
37+
Global Clients
ISO
27001 / 9001
Partner Program

Love what we're doing? Want to partner and sell our products or services?

Explore partner programs →

Send us an inquiry

Three fields. We'll reply within one business day.