What each legacy application modernization option really involves, the risk it carries, and how to pick one application at a time.

Reviewed by the DESSS engineering team
Choosing rehost vs replatform vs refactor is a question of how much of the problem sits in your infrastructure and how much sits in the code itself. Rehosting moves the software unchanged, replatforming adjusts a few parts to use better services, and refactoring reshapes the code while keeping its behavior. Getting this right matters more than the choice of cloud vendor. For the wider decision about what to build or keep, see our application development consulting overview. Here, we focus on how to choose between the options, one application at a time.
Modernization projects go wrong when "the system is old" is treated as the problem. Age alone costs nothing. Ask what is actually hurting.
Each of these points to a different route, and many applications have more than one of them. Write down the top two before comparing options, because they become your test for whether the money was well spent.
Rehosting, often called lift and shift, moves the application to new infrastructure with little or no code change. Virtual machines in a data center become virtual machines in a cloud, for instance.
It is the least disruptive move and suits deadlines driven by a lease or hardware failure. You gain better recovery options and can stop running physical servers. You do not fix slow code, tight coupling or an unsupported runtime, and cloud bills can disappoint when servers sized for peak load keep running around the clock.
Replatforming makes targeted changes so the application can use better underlying services without changing its overall design. Typical examples include moving a self-managed database to a managed service, moving a runtime to a supported version or packaging the application in containers.
This route often gives the best return for applications that work well but sit on tired foundations. Expect some code changes and a full regression test, because a new database engine or runtime version can change behavior in small, surprising ways.
Refactoring restructures code while preserving what it does. You might separate a business rule into its own module, add automated tests or split one part of a large application into a service.
It suits software whose rules are valuable but whose code has become difficult to change. Refactoring rarely impresses users in the short term, and it can be hard to fund for that reason. Tie it to something visible, such as the backlog item that keeps being delayed because nobody dares touch that module.
Two more options sit beyond these. Rebuilding writes the application again on a new foundation, and it is justified when the data model or technology genuinely blocks where the business is heading. Replacing retires the software in favor of a product. Keep both on your comparison, since they are sometimes the honest answer, but test them against the same problem statement.
| Route | What changes | What stays | Main risk | Best first test |
|---|---|---|---|---|
| Rehost | Infrastructure | Code, design, runtime | Old problems move too, and hosting costs surprise you | Restore and run a copy in the target environment |
| Replatform | Database, runtime or packaging | Business logic and most code | Subtle behavior changes | Full regression on the new platform |
| Refactor | Internal code structure | Behavior users see | Scope grows with no visible payoff | Add tests around one painful module |
| Rebuild | Almost everything | Business rules, if you can find them | Hidden rules get lost | Document rules from the existing code |
| Replace | The product itself | Your data and your process needs | Fit gaps and migration effort | Run your hardest process in a trial |
Treat a portfolio as a collection of separate decisions. Your payroll interface and your customer portal do not need the same answer.
Plot each application on two simple scales: how much the business depends on it and how healthy it is technically. High value with poor health deserves investment. Low value with poor health may simply be retired. High value with good health should mostly be left alone.
Applications rarely stand alone. Trace what reads from each database, which reports rely on it and which file drops other systems expect. Moving one application without its neighbors can introduce latency or break a nightly job nobody remembered.
A route that depends on behavior staying the same requires a way to prove that it did. If no tests exist, capture how the current system behaves before changing anything: sample outputs, reports and calculations you can compare later. This step feels slow, yet it prevents the arguments that come later about whether a difference is a bug.
The strangler pattern replaces parts of a system gradually, routing selected functions to new components while the old system keeps handling everything else. It reduces the risk of a single big cutover, although running two systems side by side adds work for a while. Combining routes is common too: rehost now to meet a deadline, then replatform the database, then refactor the worst module.
End-of-support dates often trigger these projects, and they deserve a calm reading. Paid extended support programs may exist, and isolating a system can reduce exposure, but neither one fixes the underlying issue. Treat the date as a planning input, then check your vendor's lifecycle page directly instead of relying on a secondhand summary.
Complete this for each application before approving a route.
If you want help carrying out the plan once it is settled, our application modernization services page describes how we deliver this work.
Rehosting moves an application to new infrastructure with essentially no code changes. Replatforming goes one step further by changing a specific layer, such as adopting a managed database or a newer runtime, while leaving the overall design alone. Rehosting is usually quicker to carry out. Replatforming requires more testing, though it tends to deliver more operational benefit afterward.
No. It is often the sensible answer when a deadline, such as a lease or failing hardware, drives the move. Problems arise when people expect it to solve slow code or high running costs. Treat it as a first stage, size servers based on actual use, and plan what you will improve once the application is safely running in its new home.
Refactoring pays when a valuable application changes often and each change is slow or risky. If the software rarely needs updates, the benefit is small. Start with the module causing the most trouble, add tests around it and measure whether changes become easier. That evidence makes the next round much easier to justify to people holding the budget.
Yes. Modernization describes improving an application, and the cloud is only one possible destination. You can upgrade runtimes, refactor code and add APIs while staying on your own servers, which may suit data rules or plant-floor systems. Decide based on your problem, then choose hosting. Cloud should follow from those needs instead of being the goal in itself.
Contact DESSS with the application's name, what it runs on and what is hurting. We can review the code and dependencies and give you a written recommendation you can use with or without us.