Skip to content
Zorix Systems — software that powers your business

Services

Legacy modernisation

We replace ageing business-critical systems incrementally: VB6 and Delphi desktop applications, classic ASP and WebForms sites, unsupported .NET Framework services, and the on-premise SQL Server databases with fifteen years of stored procedures behind them.

The system keeps running throughout. Each capability moves behind a routing layer, and each move can be reversed on its own without unwinding the programme.

When you need this

Recognisable symptoms

  • The application runs on a Windows Server build your security team has flagged, and the upgrade path was never tested because nobody will touch it.
  • One person can deploy the system, the deployment involves copying files to a server, and that person is retiring.
  • Business logic lives in 400 stored procedures, some of which call each other, and none of which have tests.
  • You cannot buy hardware or licences for part of the stack any more, and the vendor's support contract now says best endeavours.
  • Every insurance renewal and enterprise customer security questionnaire raises the same unsupported component, and you write the same mitigation paragraph again.

What we build

Deliverables

  • A system inventory: modules, batch jobs, integrations, scheduled tasks and reports, each with an owner, usage evidence and a keep, replace or retire decision.
  • A routing or facade layer in front of the legacy application so traffic can be moved capability by capability.
  • Characterisation tests that capture current behaviour, including the defects the business has come to rely on, before any change is made.
  • Replacement services built on a supported stack, deployed through an automated pipeline with monitoring from the first release.
  • A temporary bidirectional data synchronisation layer with defined table ownership, scheduled reconciliation and divergence alerting.
  • Parallel-run comparison harness for calculation-heavy areas, producing a record-level difference report.
  • Decommissioning plan per module, including data retention, archive format and the date the old component is switched off.

Our approach

How we run this work

Inventory and usage evidence before design

The first question is not how to rebuild a screen but whether anyone still uses it. We instrument the legacy application and its database to establish real usage over several weeks. In most estates, a meaningful share of screens, reports and batch jobs turn out to be unused, and retiring them is the cheapest modernisation available.

Strangler pattern, capability by capability

A routing layer sits in front of the old application. One capability at a time is implemented in the new system and its traffic redirected, starting with an area that is low risk but genuinely used, so the mechanism is proven before it carries anything critical. There is no single cutover weekend, and no point at which the whole business depends on one deployment succeeding.

Characterise before you change

Legacy behaviour is captured as executable tests first — including behaviour that is technically wrong but that downstream processes depend on. Each such case is documented and put to the business as a decision: preserve it, or fix it and change the downstream process deliberately. Discovering these during parallel running is far more expensive.

Data ownership during transition

For every table in scope we state which system owns it at each stage of the programme, how the other side is kept consistent, and how divergence is detected. The synchronisation layer is built as disposable code with a removal date, because a transitional integration left in place for years becomes the next legacy problem.

Decommission deliberately

A module is not finished when the replacement goes live. It is finished when the old code paths are removed, the licences are cancelled, the server is shut down and the archived data is verified as readable. We plan and schedule that work rather than leaving both systems running indefinitely.

Technology

Named stacks, named versions

Legacy estates we work in

VB6DelphiClassic ASP.NET Framework 4.xPL/SQLT-SQL

Target stacks

.NET 8Java 21Python 3.12React 19

Data

SQL ServerPostgreSQLOracleDebeziumKafka

Platform

AzureAWSDockerKubernetesTerraformAzure DevOps

Applied by industry

What this looks like per sector

Healthcare and dental

Replacing locally installed practice tooling and Access databases with supported web systems, while keeping EMIS Web, SystmOne and Dentally integrations live and documenting clinical risk under DCB0160.

Energy and utilities

Modernising settlement and billing engines where Elexon data flow handling sits in decades of stored procedures, using parallel running to prove figures match before switching.

Hospitality

Moving on-premise site servers and overnight polling to centrally hosted services, with EPOS integrations rebuilt as APIs rather than file drops.

Real estate

Replacing desktop lettings and property management applications while retaining Rightmove, Zoopla and Reapit feeds, and migrating tenancy history without losing audit trail.

Manufacturing

Professional services

Retiring bespoke matter and time systems built on unsupported frameworks, preserving billing history and regulatory records with a verified archive.

Financial services

Industries in detail

Typical engagement

Shape, duration and budget

Assessment
3 to 5 weeks: inventory, usage instrumentation, risk register and phase plan.
First capability moved
Usually 10 to 16 weeks after assessment, including the routing layer.
Programme duration
12 to 30 months for a substantial estate, phased and individually funded.
Team shape
Architect and delivery lead in the UK or Germany; 4 to 8 engineers including a data engineer, plus QA focused on parallel-run comparison.
Indicative budget
£350,000 to £1.2m depending on estate size; each phase is separately scoped and approved.

Questions

Frequently asked

Do you rewrite the whole system or replace it in parts?

In parts, in almost every case. We put a routing layer in front of the legacy application and move one capability at a time behind it, so the old and new systems run together and each move is individually reversible. Full rewrites are only reasonable for small systems with a stable, well-understood scope.

Nobody here knows how parts of the old system work. Is that a blocker?

No, it is the normal starting condition. We recover behaviour from the artefacts that survive: database schema and stored procedures, the compiled application's observable behaviour, batch job schedules, and production logs. Where behaviour cannot be recovered, we characterise it with tests against the live system before touching it.

Can we keep releasing changes to the old system during modernisation?

Yes, and you should. A programme that freezes the business for eighteen months loses the business's support. We agree a change protocol at the start: which areas are frozen because they are actively being moved, and which remain open, with the legacy team and our pod working from one backlog.

What happens to the data in the legacy database?

It moves in stages alongside the capabilities that use it. During transition, a synchronisation layer keeps the legacy and new stores consistent with one defined owner per table, and reconciliation runs on a schedule with alerting on divergence. The synchronisation layer is deliberately temporary and is removed as each capability completes.

How do you prove the new system behaves like the old one?

Parallel running with output comparison. For calculation-heavy areas — billing, settlement, pricing, entitlement — we run both systems against the same inputs and compare results record by record until the difference is either zero or an explained, signed-off legacy defect.

Tell us what your systems are doing wrong.

Send the problem, not a brief. We will tell you whether it is a project we should be involved in.

Talk to us