Lift and shift vs. refactor vs. replatform vs. rearchitect

by Ned Hallett
As JAM’s primary pair of lungs, I provide the JAM-y take on the ever-evolving worlds of DevOps, SaaS, MACH – and acronyms yet to be coined.
Published on April 2025

In this piece, we’ll be taking a look at these 4 modernisation patterns on 5 dimensions. 

  • Definition: what makes a strategy this pattern and not any other? Where does the name come from?  
  • Scope of change: which components get changed? What’s on the chopping block?
  • Scope of benefit: how can you benefit from this strategy? Performance? Cost? What’re the drivers?
  • Effort, cost and risk: What sort of project are you looking at? Deputising the internal cloud team for a week or uniting multiple departments in a cash-hungry, multi-month walk on the wild side?
  • TTV (time to value): how long till it’s 1) finished 2) recouped its cost and puts you in the black
  • And last but not least, the ideal use case: if the above isn’t enough to give you some idea – we’ll provide an example

Let’s get to it.

Lift and shift migration

Definition of lift and shift

Lift and shift simply means lifting an application (with no changes) from one infrastructure to another. This could mean:

  • Between cloud platforms
  • Between on-premise servers
  • But most commonly it means from an on-premises environment to a cloud environment

Scope of change

Lift and shift really means taking an app as is and plonking it somewhere else with no optimisation for the new infra.

For example:

Moving a database from on-premises to RDS would not be lift and shift as that’s moving it to a higher level of abstraction.

Area ✅ / ❌ Notes
Code No changes made to application code
Architecture From monolith to monolith
Infrastructure Yes – like for like replacement
Data / Storage Data may be copied or rehosted, just not restructured
Deployment Process Deployed the same way, just on new infra
Integrations Usually unchanged unless environment-specific
Config / Environment Connection strings, env vars, service endpoints stay the same

Scope of benefit

As you can imagine, the benefits of lift and shift are limited to the basics. Those moving from on-prem to cloud, replacing components like for like without optimisation, can enjoy:

  • Cloud-based provisioning of basic VMs (EC2 et al) which will be more elastic than on-prem though lack the punch of cloud-native models like serverless etc
  • Improved uptime and availability (depending on previous set-up)
  • Cloud-based savings: pay-as-you-go and/or reserved model
  • A stepping stone on the journey toward modernisation

Effort, risk and cost

Effort

Requires your existing cloud or ops team. Can likely be done by 1-3 engineers, taking less than 4 weeks.

Risk

While cloud migration is not without its risks and challenges, lift and shift is certainly on the lower end.

Cost

Minimal. Migration tooling and usual staff costs in most cases. Plus, new infrastructure. Circa $50,000 USD over 2-6 weeks for an SME.

Time to value

To complete

1-8 weeks for a typical SME use case.

To see ROI

12-52 weeks for the same.

Ideal candidate for a lift and shift cloud migration

These fall into two camps. Stepping stones and endpoints. 

Stepping stones

Companies who’d like a foothold in the cloud with a view to later modernisation – often companies with initial budget and/or time constraints.

Endpoints 

Companies working with applications which aren’t going to be evolved much further, but which, perhaps due to shaky on-prem infra, would benefit from some of the basic QoL upgrades from the cloud.

Replatform migration

Definition of the replatforming migration process

This migration strategy is the next one up. Here you alter ancillary components to move core application processes to managed services. This might include:

  • A database moving from on-prem or EC2 to RDS
  • Using a managed load balancer

To do this, you update configuration values such as connection strings, environment variables and service endpoints to point toward the new infra.

Scope of change

In this migration process, you move functions to their managed cloud-based counterparts.

Area ✅ / ❌ Notes
Code Application code remains unchanged (aside from minor config handling, if needed)
Architecture Same structure — e.g., monolith stays monolith
Infrastructure Yes are more so than in the previous example, allows movement between basic VM to higher level abstractions
Data / Storage Yes, replaces self-hosted DBs or file systems with managed services like RDS or S3 for example
Deployment Process ⚠️ May require updates to support new service integrations or platforms
Integrations ⚠️ May need to update endpoints or credentials for external services
Config / Environment Connection strings, environment variables, and IAM roles updated to point to new services

Scope of benefit

Replatforming allows you to access the next rung of cloud benefits, though without code and/or architecture changes, the true benefits of cloud native (serverless, event-driven architectures/auto scaling) remain out of reach.

  • Access to managed services means significantly reduced operational costs and risk
  • Access to basic cloud QoL improvements as above
  • A further step toward full modernisation

Effort, risk and cost

Effort

This requires input from the infra and dev teams. You’ll need to provision managed services, update configs, and run integration tests. Typical timeline: 4–8 weeks for an SME workload.

Risk

Again, quite low. Main risk is in behavioral differences between self-managed and managed services, which is not a terribly steep learning curve.

Cost

Circa 75,000-150,000 USD depending on how much is done in-house, size and application, etc. Cost range for typical SME use case.

Time to value

To complete

4-8 weeks for a typical SME use case. Slightly longer minimum time vs. lift and shift as more is changing.

To see ROI

12-36 weeks for the same. Slightly quicker time to ROI as you’re unlocking more tangible operational improvements vs. just having the same problems in the cloud.

Ideal use case for a replatforming cloud migration strategy

Again, I will give the case for a stepping stone and an endpoint.

Stepping stone

A team with limited time or resources to refactor now, but a clear plan to modernise in phases and start reducing infrastructure overhead immediately.

 Endpoint

This migration approach would suit a company whose application is essentially sound but difficult to upkeep.

Its performance and cost are fine for the job, and there’s no need to evolve it, but the team are being held up patching, maintaining and generally babysitting it.

Deploying it to a managed cloud environment means no more worries.

The refactoring migration approach

Definition of the refactoring approach

This really means the other elements already covered plus code. But, crucially, it does not cover architecture changes.

This means we might enhance our deployment to cloud infrastructure by making code changes allowing:

  • Externalised config for cloud portability
  • Statelessness for scaling compatibility
  • Structured logging for cloud monitoring tools

Scope of change

Here, we’re changing everything except the core architecture.

Area ✅ / ❌ Notes
Code Logic, structure, and dependencies are updated, but core behaviour stays the same
Architecture App remains a monolith or keeps its original structure
Infrastructure App may be containerised or moved to a cloud runtime, but not restructured
Data / Storage Switch to cloud storage or managed DBs
Deployment Process Updated to support containers, CI/CD, or cloud-based deployment flows
Integrations May point to cloud-hosted services (e.g., S3, email, auth) via updated endpoints
Config / Environment Config externalised into env vars or secrets for portability and automation

Scope of benefit

Here we start to get into more serious ‘you have a new app’ territory.

  • Enabling horizontal scaling (running the app on any instance) via refactoring stateful logic such as file uploads, session handling, or temporary storage to use external, cloud-based services instead of local resources
  • You can now integrate your app with CI/CD pipelines by restructuring code for testability, introducing automated test coverage, and separating build-time and runtime configuration
  • You can enable modern dependency management by replacing legacy libraries or tightly coupled modules with supported, cloud-compatible packages that follow current standards
  • Clearer separation of concerns – although you’re not ready to adopt a microservice-based architecture (that would mean re-architecting), you can still logically boundary your code for modularity, isolating responsibilities into cleaner components within the existing structure

Effort, risk, cost

Effort

This is a more serious undertaking with significant dev involvement, QA and compliance testing. This might involve 5-10 members of staff for 5-10 weeks at an SME or 20+ members of staff 12-36+ weeks at an enterprise.

Risk

Moderate to high. Code changes are inherently more complex and risky than merely deploying the same functions to managed services/the cloud. In the case of enterprises with more dependencies the risk is greater.

Cost

Between 200,000 and 1 million USD for small to mid-sized organisations. For enterprise-level refactoring efforts, the ceiling is often significantly higher.

Ideal use case for refactoring

Stepping stone

Refactoring is a good stepping stone or pause point when the next phase of modernisation is undermined by worries about the code base. If it’s very tightly coupled and poorly understood, it makes sense to refactor before re-architecting.

Endpoint

Refactoring can be an endpoint when an application doesn’t need to hit the extreme scalability or modularity needs of a cloud-native architecture, but it does need change, run, and keep alive.

The re-architecting migration

Definition of re-architecting

This is the big one. Essentially, it means we’re now also changing the application’s architecture. Or we’re re-architecting it. Who would have thought?

Architecture means

  • The application’s structural pattern (e.g. monolith, microservices, event-driven)
  • How its components communicate (e.g. HTTP, message queues, event streams)
  • How services are deployed and scaled (e.g. containers, serverless, multi-region)
  • How state is managed (shared vs. isolated)

A re-architecting means changing one or more of these systems as well as any other previously covered transformations.

Scope of change

Greens all the way down.

Area ✅ / ❌ Notes
Code Major rewrites needed to support new structure, services, and patterns
Architecture Core shift — e.g., from monolith to microservices or event-driven architecture
Infrastructure Typically involves containers, orchestrators (Kubernetes), or serverless
Data / Storage Data models may be split, refactored, or moved to new types of storage
Deployment Process New pipelines, service coordination, versioning, and automation
Integrations Often redefined to support new APIs, async messaging, or event handling
Config / Environment Each service or component manages its own config; centralised config becomes essential

Scope of benefit

Re-architecting opens the door to all true cloud-native benefits:

Monolith to microservices

  • Unlocks independent deployability, reducing the need for coordinated releases
  • Improves fault isolation — one failing service doesn’t take down the entire system
  • Makes it easier to test, maintain, and scale services independently
  • Aligns system structure with team boundaries, increasing long-term delivery speed

Synchronous to asynchronous/event-driven

  • Enables horizontal scaling through non-blocking, distributed workflows
  • Supports better resilience and load handling under unpredictable traffic
  • Decouples systems, making them easier to evolve in parallel

VM-based to serverless or container-native

  • Allows use of cloud-native infrastructure like AWS Lambda or Kubernetes
  • Reduces operational overhead through autoscaling, managed runtimes, and reduced idle cost
  • Enables smaller, safer, and more frequent deployments

Effort, risk and cost

Effort

High. This is a complex, long-term programme, not a project. For SMEs, it may involve 12–24 weeks of work across 5–10 engineers. In enterprises, 20+ people may be involved across multiple teams, over 26–78 weeks.

Although it’s not uncommon for projects to run on far longer if they’re poorly planned.

Risk

High. You’re rebuilding the plane while it’s flying. Changes at this scale introduce risk across functionality, performance, team alignment, and delivery timelines, especially when dependencies aren’t clearly defined.

Cost

These might start at the 500,000 USD mark, but large-scale modernisation projects can get into the tens and even hundreds of millions of dollars territory.

Time to value

To complete

26–78 weeks, depending on team size, risk appetite, and scope.

To see ROI

78–104 weeks, depending on how quickly the benefits of modularity, scaling, and engineering speed compound.

Ideal use case for re-architecting

Since we can’t reimagine an app more thoroughly than this, there’s no stepping stone option.

Endpoint

Re-architecting is typically undertaken when you have scalability, velocity or compliance requirements beyond last-gen architecture. It’s the last one on the list. All depart here.

How we can help

At Just After Midnight, we’ve run the gamut of modernisations, from tentative lift and shifts to full-throttle re-architectings. We’ve helped global businesses like Grab take advantage of cloud-native technologies and many more move toward the next phase of their modernisation journey.

To find out how we could help you, just get in touch.

SHARE