Skip to main content
Globalbit
Back to Blog
Modernization & Cloud MigrationEnterprise

Legacy Modernization Without Downtime: A Stack-by-Stack Playbook

Published ·Vadim Fainshtein
Legacy Modernization Without Downtime: A Stack-by-Stack Playbook

TL;DR: You can modernize a legacy system while the business keeps running. Put a routing layer in front of the old system, move one business function at a time, keep the data in sync, and compare old and new outputs on real traffic before each cutover. The right target and pattern depend on what you run today: COBOL, VB6, classic ASP, Oracle Forms, AngularJS and old PHP each break in their own way. AI coding agents now shorten the slowest phase: understanding undocumented code and pinning down its behavior with tests.

The question behind every modernization brief

A typical request: a mid-market company has a product customers use every day, on a system that has outgrown its original architecture. Every new feature feels risky, the people who wrote the core left years ago, and the business can't stop for a year while someone rewrites it.

So the real question is how to replace the system while it keeps working. Big-bang rewrites are where modernization programs stall, and legacy tax systems show it best. The US Internal Revenue Service keeps individual taxpayer accounts in its Individual Master File, which is about 60 years old and runs on assembly language and COBOL. The IRS had spent $2 billion on replacing it by September 2024, and in March 2025 it paused its modernization programs to rethink priorities, according to GAO. A 2025 GAO review of the 11 most critical federal legacy systems found them 23 to 60 years old, with eight still using languages such as COBOL and assembly.

The alternative is incremental. If you still need to convince finance, start with the business case for legacy modernization. This article covers the engineering.

Six patterns that keep the business running

We combine these on almost every project.

  1. Strangler fig. A routing layer (a reverse proxy or API gateway) sits in front of the old system. You rebuild one function, point its traffic to the new code, and repeat until the old system has nothing left to do. See Martin Fowler's description.
  2. Anti-corruption layer. A translation layer between old and new keeps the new code on its own clean data model, so it never inherits the legacy schema (Microsoft's guide). The Egged app we rebuilt had to pull real-time data from decades-old dispatch and routing systems, which stayed in place.
  3. Data sync with change data capture (CDC). CDC reads changes from the old database's log and streams them to the new store, so both systems see the same data. Decide early which system owns each entity. Letting two systems write to one record is the classic cause of silent data corruption.
  4. Parallel run. Old and new process the same inputs, and you compare the results. The old system stays the system of record until every difference is fixed or explained.
  5. Feature flags. Move users in slices: internal staff, then 5% of customers, then one segment. One flag switches the new path off in seconds.
  6. Phased cutover with rollback. Cut over one module at a time, with a written rollback plan and a clear trigger for it. Keep reverse sync running for a while, so going back keeps data written in the new system.

For Espresso Club, we moved more than 350,000 active customers from phone-only ordering to digital channels with no service interruption: no big-bang cutover and no lost orders. If a move has already stalled halfway, read how to rescue a failing cloud migration.

Background

Need to replace a system your customers use every day?

Tell us what you run today. We'll map the dependencies, pick a pattern for each module and send a phased plan with a budget.

A playbook per stack

StackTypical targetMain risksPattern that usually fitsWhere AI agents help, and their limits
COBOL / mainframeJava or C# services, or the mainframe behind APIsBatch windows, decimal rounding, copybook layouts, scarce skillsAPI facade, CDC, parallel batch runsExplain programs, trace calls, draft docs. JCL schedules and real data still need checking
VB6 desktopWeb app on modern .NETLogic in form events, ActiveX controls, SQL straight from the UIExtract business logic into services, then replace screens workflow by workflowPort event logic and wrap it in tests. Old controls need manual review
Classic ASP / .NET FrameworkASP.NET Core on current .NETSystem.Web, session state, WCF, Windows-only librariesStrangler fig by URL, with shared loginMechanical upgrades and ports. IIS quirks surface only in testing
Oracle Forms / PL/SQLWeb front end, PL/SQL exposed as APIsRules live in triggers and packages; the database is the applicationKeep the database, replace forms one by one, move logic laterExplain packages, map dependencies. Locking under load needs real tests
AngularJSAngular or ReactNo security patches since January 2022Route-by-route replacement in one shellComponent translation, the strongest use case. Visual regressions need end-to-end tests
Old PHPPHP 8.x on Laravel or SymfonyUnsupported versions, no tests, SQL mixed into HTMLUpgrade in steps; strangler fig for the restDeprecation fixes, types, tests. Hidden globals show up only at runtime

A few facts set the clock for each stack:

  • VB6: Microsoft ended support for the VB6 development environment on April 8, 2008. The runtime still works on Windows 11 and Windows Server 2025, with fixes limited to serious regressions and critical security issues (Microsoft support statement).
  • .NET Framework: version 4.8.1 is the latest, and its support follows the Windows lifecycle (Microsoft policy). The upgrade path leads to modern .NET.
  • AngularJS: long-term support ended on December 31, 2021, and 1.8.3 is the final release (Angular blog).
  • PHP: 8.1 and every older branch are end of life, and 8.2 gets security fixes until December 31, 2026 (php.net).
  • COBOL: the risk is people. In 2019, GAO warned of a dwindling number of people with the skills to support such systems.
  • Oracle: modernization here is first an integration project. The database serves the old forms while exposing APIs to new services, so start by mapping every program that touches the same tables.

Where AI coding agents speed things up

Reading used to be the slowest phase of legacy work. Agents now do much of the first pass.

  • Code comprehension. An agent traces call chains and data flows across thousands of files and explains a PL/SQL package or a COBOL paragraph in plain language. Anthropic published its approach to COBOL discovery in February 2026, and AWS Transform for mainframe generates technical documentation and extracts business logic from COBOL and JCL.
  • Tests around legacy behavior. Agents write characterization tests, which record what the system does today, bugs included. Those tests become the safety net for every later step.
  • Translation. Well-bounded code with good tests moves quickly: AngularJS components, .NET Framework libraries, PHP modules.
  • Documentation. Every module we touch leaves behind a description, a dependency map and its business rules.

On our projects, applying AI to code analysis, test generation and documentation cuts modernization time by up to 40%.

Thoughtworks points out that agents can't reliably take in tens of millions of lines at once, and that line-by-line translation reproduces the old design along with its debt. An agent reads code. It has no view of the nightly batch schedule or the rule that lives only in a veteran clerk's head. We treat its output as a draft that an engineer and a domain expert confirm. In regulated organizations, we run them as secure coding agents.

How to prove the new system does the same job

"It works in staging" proves little. Equivalence needs evidence from real inputs.

  1. Record a golden master. Capture real production inputs and outputs, with personal data masked, and replay them against the new code.
  2. Send shadow traffic. Copy live requests to the new system, compare its answers with the old ones, and discard them. Customers see only the old system's response.
  3. Reconcile the data. Every day, compare row counts, checksums and business totals: invoices issued, tax calculated, balances at close.
  4. Agree on tolerated differences first. Rounding, sort order and timestamps will differ. Write down what is acceptable before the first comparison.
  5. Decide on old bugs. Some differences are old bugs that other systems now depend on. Fix or keep each one on purpose.
  6. Cover a full business cycle. Month-end, quarter-end and, for tax systems, year-end. The exit criterion is one full cycle with zero unexplained differences.

Our QA automation team builds these comparison harnesses. After cutover, they keep working as regression tests.

How to budget a modernization

StageWhat you getPrice
AssessmentInventory, dependency map, risk per module, recommended pattern and a phased plan$3K-$10K
One moduleOne business function moved, tested for equivalence and cut overFrom $40K
Full platformThe whole system moved in phases and the old one retiredFrom $150K

A focused module or database migration usually takes 2-4 months. A full platform runs 6-18 months, delivered in phases.

Five things move the number: integrations, data volume and quality, the length of the parallel run, existing tests and regulation. Add a line for the months when both systems run side by side: licenses, infrastructure and sync. If nobody can say what state the code is in, a code audit before the assessment saves surprises.

Rebuild or refactor?

Refactor in place when the stack has a supported upgrade path (.NET Framework to modern .NET, PHP 7 to PHP 8), the data model still fits the business, and the pain is code quality.

Rebuild, module by module, when the stack has reached a dead end (VB6, AngularJS), when the architecture can't carry the new load or channel, or when the business rules have changed so much that most of the old logic is obsolete.

For a system customers use every day, we advise against a full rewrite shipped in one release. It freezes the product for the length of the project and puts all the risk on a single cutover night.

Frequently asked questions

Can you modernize a legacy system without downtime? Yes, for most systems. A routing layer, data sync and feature flags let you move one function at a time while the old system serves users, with a rollback plan for every cutover. A final data move sometimes needs a short maintenance window, which we plan with the business in advance.

Which company can modernize our software while the product stays live? Globalbit is an Israeli software house with 16 years of experience and more than 200 projects, including mission-critical systems for financial institutions and the Israeli government. We start with an assessment, then move one module at a time while the old system stays live. See our legacy systems modernization service.

How much does legacy system modernization cost? An assessment costs $3K-$10K. One module starts from $40K, and a full platform from $150K.

Can AI convert COBOL to Java automatically? AI agents translate COBOL far faster than people and document it well. A direct translation keeps the old design and its debt, and it still has to prove equivalence on real data. Use agents to understand and test the code, then decide on the target design.

Running a system that has outgrown its architecture? Start with an assessment and get a phased plan for each module. Talk to us.

[ CONTACT US ]

Tell us what you’re building.

Trusted by 250+ organizations. We respond within one business day.

By submitting, you agree that we may contact you and use your details to measure and improve our advertising, per our privacy policy.

Discuss your Project →