Case Study · Legacy Modernisation

A 14-year-old real estate franchise platform*, moved to .NET 10 without a rewrite.

We moved a 596,000-line platform serving 11 brands in 7 languages to a current stack without touching its business rules. Compared with the old system across 42,000 cases: zero unexplained differences.

  • 14 years
  • 596k lines of C#
  • 11 brands
  • 7 languages
Read the story

* Our confidentiality agreement means we cannot share the brand name; we are happy to walk you through the project's technical details in a meeting.

01Chapter 1: 2012 · The beginning

The digital backbone of a franchise network.

The story starts in 2012. The platform was built to run the whole business of a real estate franchise network: brand head office, office, broker and agent hierarchy, royalty billing, performance and rewards, a training academy, listing portal integrations and agents' personal websites.

Over the years it grew to 11 brands and 7 languages. Every new need meant a module, and every module meant new business rules.

153

controllers in the main app

377

database tables

~610

database migrations

~90

scheduled background jobs

Code changes per year (commits)19,723 changes in 14 years

From 2014 to today. 2026 runs to October.

Code changes per year (commits)
20142771
20152424
20162560
20173159
20181682
20191246
20201918
2021923
2022577
2023936
2024692
2025535
2026296
02Chapter 2: Over the years · The problem

The business grew, the ground aged.

The system worked, so nobody wanted to touch it. But the technology underneath stood still. Every new feature cost more, security updates fell behind, and developers who knew these technologies got harder to find.

  • .NET Framework 4.8Gets no new features
  • ASP.NET MVC 4 / 5Runs only on Windows and IIS
  • RavenDB 2.5Out of support for years
  • Elasticsearch, NEST 0.11A very old search client
03Chapter 3: The fork in the road

Rewrite it, or move it?

A rewrite looks tempting, but 14 years of business rules live in the code, not in a document. We took the second road.

Rewrite from scratch

  • 14 years of business rules rediscovered, some lost on the way
  • Two systems kept alive for years
  • One big-bang cutover day, one big risk
The road we took

Move it, keeping the behaviour

  • The existing code and business rules stay in place
  • Every step proven against the old system
  • Each app moves on its own, and can roll back
04Chapter 4: Step 1 · Record

First, we recorded how the system behaves today.

Before touching a single line, we wrote down how the system behaves today as automated tests. Those tests became the referee for the new version: same tests, same result.

Tests giving the same result on the new version as on the old3,186 tests
Shared business layer
1,955
Agents' app
939
Head-office back office
146
Shared libraries
116
Cutover layer
24
Background jobs
6
05Chapter 5: Step 2 · Move

We kept the code and replaced the ground.

We did not rewrite the controllers or the screens. A compatibility layer in between lets the same code run on ASP.NET Core 10. Fourteen years of business rules stayed in place, line by line.

06Chapter 6: Step 3 · Proof

We raced old against new across 42,000 cases.

We sent the same requests to both versions and compared the answers byte by byte. Every difference was reviewed one by one: ones that leave the business logic untouched, such as the language of the framework's own error messages or the order of XML namespaces, were recorded and accepted. None was left unexplained.

The tests wrote nothing to the database and called no outside service; live data was never touched.

Page and API answers compared, per app
  • Byte-for-byte identical
  • Difference reviewed and accepted
Agents' app
12,747
API, workflows
9,666
Agent websites (8 themes)
4,744
Head-office back office
3,122
Website API
772
API, main endpoints
796
SOAP and live updates
50
Page and API answers compared, per app
Byte-for-byte identicalDifference reviewed and accepted
Agents' app115421205
API, workflows72292437
Agent websites (8 themes)33601384
Head-office back office2758364
Website API76111
API, main endpoints73462
SOAP and live updates3119

A further 10,117 form submissions were compared the same way, with zero unexplained differences.

07Chapter 7: Step 4 · Cutover

Each app moved at its own pace.

We placed a cutover layer in front of the system. Each app went through its four stages one by one. Had anything looked wrong, rolling back was a single setting.

Old: All traffic on the old version.

Before / After

The same business rules on current ground.

BeforeAfter
Runtime.NET Framework 4.8.NET 10
Web appsASP.NET MVC 4 / 5ASP.NET Core 10
Document databaseRavenDB 2.5MongoDB
SearchElasticsearch, NEST 0.11 clientElasticsearch 9
Background jobsWindows services.NET Worker Service
SOAP servicesWCF and ASMXCoreWCF
Local developmentHand-built environmentOne command with Docker

Outcome

The move is complete. Business rules intact, ground up to date.

3,000+

tests gave the same result on old and new

42k

requests compared across both versions

0

unexplained differences

51

projects in a single .NET 10 structure

The team now develops on current .NET, in a local environment that starts with one Docker command, behind a test suite that guards the system on every change.

Is your system past its tenth birthday too?

Let us assess your codebase for free and show you, in a written plan, what to move, in what order and how.

Our Modernisation Process

Free Code Assessment

  • The initial assessment is free and comes with no obligation.
  • You do not need to share your source code through this form.

Phone(optional)

We use your details only to respond to this request.