Legacy system modernisation without disrupting the business
A practical guide to legacy system modernisation: the seven options, the strangler-fig pattern, and the risk controls that avoid a big-bang cutover.
On this page
Legacy system modernisation means changing an old, business-critical application without stopping the business that depends on it — which is why the safest route is almost never a single, risky cutover. The options range from leaving a system exactly as it is (retain) to rebuilding it from scratch (rebuild), and the pattern that lets you modernise gradually, running old and new side by side, is the strangler fig. This guide covers the seven modernisation options, how a phased migration actually works, and the controls that keep the business running while you do it.
If you're still deciding whether to build, buy or modernise at all, our custom software development guide is a good starting point before you get this specific.
The seven modernisation options#
Microsoft's Cloud Adoption Framework groups modernisation and migration choices into seven strategies (plus "retire," for workloads you're decommissioning outright), each tied to a different business driver rather than a technical preference alone.
Option | What it means | When it fits | Risk and cost |
|---|---|---|---|
Retain | Leave the system as it is, for now | It's stable, supported and meets business needs, with no near-term driver to change it | Lowest cost today; defers the underlying problem |
Rehost | Move it as-is to new infrastructure ("lift and shift") | You need it off its current infrastructure fast, at low risk, with no modernisation planned for a year or two | Low technical risk and fast, but carries old limitations forward |
Replatform | Move it to a more managed platform with small changes, no rewrite | You want less infrastructure to run yourself (for example a managed database) without a full rebuild | Moderate cost for real reliability and operations gains |
Refactor | Change the code for maintainability or cloud fit, same architecture | Technical debt is slowing delivery, but the overall design still holds up | Moderate cost; pays off in maintainability, not new features |
Rearchitect | Redesign the architecture — for example, break a monolith into services | The current design limits scaling or blocks a capability the business now needs | Higher cost and delivery risk; needs a team used to distributed systems |
Rebuild | Redevelop the application from scratch, discarding the old code | The system is too outdated or inflexible to evolve, and rewriting costs less than continuing to patch it | Highest cost and project risk, and the biggest chance to fix old constraints |
Replace | Retire the custom system and adopt an off-the-shelf or SaaS product | A mature product already does the job well, and your customisation needs are genuinely low | Trades build cost for licence cost, plus migration and integration effort |
None of these is inherently "better" — they're trade-offs between speed, cost, risk and how much of the system's current limitation you actually fix. A system can also be treated differently module by module: it's common to rehost the parts you won't touch soon and rearchitect the one component that's actually holding the business back (see Microsoft's migration strategy guidance and its replatform/refactor/rearchitect guidance).
AWS's cloud migration guidance covers similar ground with slightly different labels: rehost, replatform, repurchase, refactor or re-architect, retire and retain, plus relocate for large infrastructure moves (AWS, "6 Strategies for Migrating Applications to the Cloud"; AWS Prescriptive Guidance, "Migration strategies"). The terms don't map one to one — AWS's "repurchase" is roughly what this article, following Microsoft's naming, calls replace, and AWS treats rearchitecting and rebuilding as points on a single "refactor" spectrum rather than as separate options. Whichever vendor's labels you use, the decision is the same, and where it lands on rebuild or rearchitect, the cost drivers are close to those for any new build; see how much it costs to build a web app for how scope and integrations move that number.
The strangler-fig pattern: modernising without a big-bang cutover#
Rearchitecting or rebuilding a system doesn't have to mean a single cutover weekend. The strangler-fig pattern, named by Martin Fowler after a vine that gradually grows around a host tree until the tree beneath it is gone, replaces a legacy system piece by piece while it keeps running (Fowler, "StranglerFigApplication").
The mechanics are straightforward, per the Azure Architecture Center's description of the pattern:
- Put a façade (a proxy or router) in front of the legacy system. At first, it routes almost all traffic to the legacy system unchanged.
- Build one piece of new functionality at a time, and update the façade to route just that traffic to the new system instead.
- Repeat, module by module, until the façade routes everything to the new system and the legacy system has no remaining dependents.
- Decommission the legacy system, and — usually — remove the façade once it's no longer earning its keep.
This is deliberately slow, and that's the point: each step is small enough to test, validate and roll back on its own, rather than betting the whole migration on one release (Strangler Fig Pattern, Azure Architecture Center). It's not free, though — Microsoft's own guidance notes it doesn't suit every case: if you can't intercept requests to the legacy system, can't modify its source code, or need to fully decommission it quickly, a strangler-fig approach adds coordination overhead you don't need. For a small system that's simple to replace outright, just replace it.
Data migration: moving the system of record without losing it#
Data is usually the part that makes modernisation risky, because unlike code, you can't just redeploy a previous version if something goes wrong. A pattern that works well alongside the strangler fig, drawn from Microsoft's own worked example, looks like this:
- New service, old database. The new service goes live but still reads from and writes to the legacy database for its domain's data. Nothing about the data has moved yet — only the code calling it.
- Introduce the new data store. Extract the relevant tables into an isolated database for the new system, loaded via an initial ETL job and kept in sync afterwards using change-data-capture so both stores agree while the legacy system is still writing.
- Validate before cutover. Compare the two stores for consistency. This is the step it's tempting to skip under time pressure, and the step that actually protects you.
- Cut over, then decommission. Once validated, point reads and writes at the new store, and only then remove the corresponding tables from the legacy database — treated as a deliberate, final step, not a by-product of cutover.
Rollback stays possible right up until you delete the old tables and sync process, which is exactly why that removal should happen last, and on purpose, rather than as clean-up you do without thinking.
Risk controls: parallel run, feature flags, rollback#
Three controls do most of the work of making each migration step safe to attempt and safe to reverse:
- Parallel run. Send the same input to both the old and new systems and compare outputs before the new one takes over for real. This is especially valuable for anything calculation-heavy or compliance-sensitive, where "it looks right" isn't good enough on its own.
- Feature flags. Gate new functionality behind a toggle so it can be switched on for a small slice of traffic, watched, and switched off instantly if something's wrong — without a redeploy. Martin Fowler's feature toggle categories are a useful checklist: release toggles hide unfinished work in production, ops toggles act as a kill switch under load, and permission toggles expose a feature to a chosen group of users before everyone else. Where the strangler-fig façade routes traffic at the level of a whole route or service, feature flags let you control risk at a much finer grain, inside a single service. Our guide to zero-downtime deployments covers the release-side techniques (blue-green, rolling, canary) that pair naturally with flags.
- Rollback. Decide what "safely reversible" means for a change before you ship it, not after something breaks. For data changes, that usually means keeping the old write path alive until the new one is validated, as above. For code changes, it means being able to redeploy the previous version without a pending data migration blocking you from doing so.
A phased roadmap for legacy system modernisation#
Phase | Goal | Typical activities | Exit criteria |
|---|---|---|---|
1. Discovery and risk assessment | Understand what the system does and what's actually risky to change | Map dependencies, data flows and integrations; decide retain/rehost/replatform/refactor/rearchitect/rebuild/replace per component | An agreed, documented decision for each component, not just the system as a whole |
2. Scaffolding | Put the strangler-fig façade and safety nets in place | Introduce a proxy/router in front of the legacy system; set up parallel-run tooling and feature-flag infrastructure | Façade live in production, routing 100% of traffic to the legacy system unchanged |
3. Incremental migration | Move one module or domain at a time | Build the new component, migrate its data, validate with a parallel run, shift the façade's routing for that module | Each migrated module passes validation before its legacy equivalent is switched off |
4. Cutover and decommission | Retire legacy components as their replacements prove out | Remove the legacy code path and data once validated; keep a rollback window before deleting anything | Legacy component fully decommissioned with no remaining dependents |
5. Optimise | Fix what was deliberately deferred to hit the migration timeline | Revisit rehosted or replatformed components that were taken as shortcuts under deadline pressure; refactor or rearchitect where the business case now supports it | Technical debt taken on during migration is tracked and scheduled, not forgotten |
Making the business case#
Modernisation competes for budget against new features, so the case for it needs to answer questions a non-technical stakeholder will actually ask:
- What does it cost to keep patching this system every year, compared with modernising the highest-risk part of it? If part of that comparison is ageing on-premises hardware versus managed cloud servers, current plans and prices make that side of the sum concrete.
- What's the real business exposure if it fails — compliance, revenue, reputation — versus the cost of the work to reduce that exposure?
- Which parts of the system are genuinely specific to how the business operates, and which are commodity functionality a "replace" option (an off-the-shelf product) could cover for less?
- Can this be funded and delivered in phases, each with a visible result, rather than as one large project whose only payoff is at the very end?
The phased approach in this guide is itself part of the business case: it lets you fund and prove out the highest-value, highest-risk piece first, rather than asking for a full budget upfront against a return that only arrives at the end of the project. If you want a second opinion on scoping a specific slice, custom software development covers how we approach a build of this size, from discovery through to delivery.
What to do next#
Legacy system modernisation is rarely a single decision — it's a set of decisions, one per component, backed by controls that let you change your mind safely. If you're weighing options for a system that's becoming a drag on the business, our cloud migration service can help assess which of the seven options fits each part of it before you commit to a roadmap.
Frequently asked questions
What is legacy system modernisation?
It's the process of updating an old, business-critical application so it's cheaper to run, easier to change and less risky to keep, without stopping the business that depends on it. It covers a spectrum of options from small infrastructure changes to a full rewrite, chosen per system rather than applied as one blanket approach.
What's the difference between rehosting and replatforming?
Rehosting moves an application as-is to new infrastructure (a 'lift and shift') with no code changes. Replatforming moves it to a more managed platform, such as a managed database instead of a self-hosted one, with small changes but no full rewrite. Rehosting is faster and lower-risk; replatforming trades a bit more effort for lower ongoing operational work.
What is the strangler-fig pattern?
It's a way to replace a legacy system gradually instead of all at once, named after a vine that slowly grows around a host tree. A façade sits in front of the old system and routes requests to either the legacy system or the new one, shifting more traffic to the new system as each piece is migrated and validated, until the legacy system can be switched off.
How do you migrate data without downtime?
Typically by running both data stores in parallel for a period: the new system writes to a new database while a sync process keeps it updated from the legacy database, then you validate the two match before cutting reads and writes over fully. Keep the old data path available until validation passes, so you can roll back if something doesn't line up.
How long does legacy system modernisation take?
It depends on the system's size and how many integrations depend on it, which is exactly why a phased roadmap works better than a single end date: each phase (discovery, scaffolding, incremental migration, cutover) delivers a usable result on its own, so the timeline is a series of milestones rather than one long project with nothing to show until the end.
Sources
- Select your cloud migration strategies — Cloud Adoption Framework, Microsoft Learn — accessed 18 September 2026
- 6 Strategies for Migrating Applications to the Cloud — AWS Cloud Enterprise Strategy Blog — accessed 18 September 2026
- Migration strategies (the 7 Rs) — AWS Prescriptive Guidance — accessed 18 September 2026
- Modernization guidance to replatform, refactor, rearchitect — Cloud Adoption Framework, Microsoft Learn — accessed 18 September 2026
- Strangler Fig Pattern — Azure Architecture Center, Microsoft Learn — accessed 18 September 2026
- StranglerFigApplication — Martin Fowler — accessed 18 September 2026
- Feature Toggles (aka Feature Flags) — Martin Fowler — accessed 18 September 2026
Facts in this article were last checked on 18 September 2026.
Inventure Engineering Team
Engineers at Inventure Technologies who build, host and run software for clients in Nepal and Australia. We write about what we do every day.
Keep reading
Custom software development: process, cost and choosing a partner (2026 guide)
A 2026 guide to choosing a custom software development company: build vs buy, scoping, engagement models, cost drivers, contracts, security and support.
Read articleChoosing a software development company in Nepal: a guide for Australian companies
A practical guide for Australian businesses evaluating a software development company in Nepal: time zones, talent, cost, contracts and privacy law.
Read articleHow much does it cost to build a web app in 2026?
What the cost to build a web app actually depends on in 2026: a feature-by-effort table, regional developer rates, hidden costs and how to spend less.
Read articleWant engineers who handle this for you?
We build, host and run software for teams in Nepal and Australia — with dedicated support on every plan.