Legacy Application Modernisation

Windows Forms, Web Forms and Classic ASP brought onto a current platform — incrementally, with the business still running on it the whole time.

What this covers

A modernisation project fails in the same way a rewrite does: someone estimates it up front, the estimate is wrong, the old system is frozen while the new one is built, and eighteen months later the business is running neither. We work the opposite way round. The old system keeps running and keeps being fixed. Work is sequenced by risk and value rather than by module size, each piece moved is shippable and reversible on its own, and the parts nobody wants to touch get a test harness before they get a new implementation. It is a less dramatic story than a rewrite, and considerably more likely to finish.

  • Modernised in place, with users still working on it throughout
  • The rules that carry money get tests before anything moves
  • One module at a time, each piece shippable and reversible

Capabilities

The specifics, rather than the adjectives.

Windows Forms and desktop, moved to the web

A management and administration console migrated from .NET Framework Windows Forms to Blazor on .NET Core, module by module, while the original stayed in use. Screens move when they are ready rather than when a big-bang deadline says they must.

Strangled, not rewritten

New code is built alongside the old and traffic moves across a piece at a time, so there is never a weekend where everything has to work for the first time. Slower to start and far faster to finish than a rewrite, and it does not stake the business on an estimate.

Classic ASP and Web Forms forward

Taking over long-lived applications whose original authors have moved on: establishing what the code actually does, documenting it, and moving what matters onto a supported platform without breaking the parts nobody remembers writing.

A test harness before movement

Characterisation tests written against the old system first, capturing the behaviour that carries money or permissions. They are what makes a migration safe, because they fail loudly when the new implementation quietly differs from the one it replaced.

Performance on systems nobody wants to touch

Measured improvement on long-lived applications — query and index work, scheduled jobs, caching where it is safe, and the wasteful round trips that accumulate over a decade. Only worth doing with a measurement taken before and after, which is also how you prove it was worth doing.

Staying secure while still legacy

Out-of-support dependencies identified and either upgraded or isolated, connection strings and secrets moved out of configuration files, and input handling reviewed on the forms that accept data from outside. Newer code arriving elsewhere does not make the old code safe in the meantime.

Documentation and knowledge transfer

Architecture notes, integration contracts, environment and deployment documentation, and a walkthrough for whoever inherits it. On systems like this, documentation is not an appendix to the project — it is how the next change stops being an emergency.

Sequenced by risk, not by size

A modernisation plan ordered by what threatens the business and what the business actually needs next, rather than by which module looks easiest to move. The largest module is frequently not the one that should go first.

What you get

A concrete list of outputs. If something here is not relevant to your project, it comes out of the scope and the price — we would rather agree that in writing now.

  • A read-only assessment: what the system does, where the risk sits, what is tested
  • A modernisation plan ordered by risk and value, with the trade-offs stated
  • Characterisation tests around the rules that carry money or access
  • Migration of the agreed modules to .NET Core or .NET 8
  • Side-by-side running with a defined rollback for each migrated piece
  • Dependency and security review of everything staying behind
  • Performance measurement before and after each significant change
  • Architecture, integration and deployment documentation
  • Knowledge transfer sessions for the team who will own it

How it runs

Five steps. You always know which one you are in.

  1. 01

    Assess

    A read-only review of what the system does, what depends on it, where the security and support risk actually sits, and what would break if it stopped. You get this in writing before committing to a build.

  2. 02

    Harness

    Characterisation tests around the behaviour that carries money or permissions, written against the system as it stands. This is the step that makes every later step safe, and the one most often skipped.

  3. 03

    Sequence

    The order of work agreed with you: what moves first, what waits, what is deliberately left alone because replacing it would be the wrong use of the budget.

  4. 04

    Migrate

    Module by module, new alongside old, with the ability to send traffic back if the new path misbehaves. The old system keeps being maintained throughout rather than being frozen.

  5. 05

    Hand over

    Documentation, the test harness, deployment notes and a walkthrough for the team inheriting it. The measure of success is that the next change does not require us.

Stack

The platforms and frameworks we build, integrate and maintain on. We would rather work in a stack your team can hire for and hand over than pick whatever is interesting this year — and where an existing platform does the job better than custom code, we will say so.

  • .NET Framework
  • .NET 8
  • .NET Core
  • C#
  • Blazor
  • ASP.NET MVC
  • ASP.NET Web Forms
  • Classic ASP
  • Windows Forms
  • Xamarin and .NET MAUI
  • EF Core
  • SQL Server
  • Oracle Database
  • SSIS and ETL
  • IIS

FAQs

Legacy Application Modernisation — frequently asked questions

Should we rewrite or modernise in place?

Modernise in place, in almost every case where the system is still earning. A rewrite is justified when the current system genuinely cannot express what the business needs, or when the platform is being withdrawn on a deadline you cannot negotiate. Otherwise a rewrite means freezing the old system while the new one is built, which is the point at which the business stops getting fixes and starts getting exceptions. If a rewrite really is right, we will say so — but we will say it having read the code, not before.

How long does a migration take?

The first module is the slowest, because it establishes the pattern and the test harness. After that each module is faster. As an indication, a single well-bounded administration module is a matter of weeks rather than months, and a whole console runs into quarters — which is exactly why we sequence it so the early modules deliver value rather than only positioning.

Can you take over code you did not write?

Yes, and that describes most of this work. It starts with reading rather than changing: what it does, how it is structured, where the risk is, what happens if it stops. Nobody who tells you they understand an unfamiliar system of that age in a week is being straight with you, and the assessment stage exists so that the estimate is grounded in something we have actually read.

Will users notice anything during the migration?

They should notice the new screens and the faster parts, and nothing else. Because old and new run side by side, users move across when a piece is ready rather than when the whole project is. That also means an unexpected problem affects one module rather than the system, and it can be sent back while it is fixed.

What if we no longer have the original developers or any documentation?

That is the normal starting condition, not an unusual one. It changes the first stage rather than the approach: more time reading and proving behaviour, characterisation tests extracted from how the system actually behaves rather than from a specification nobody has, and documentation produced as the primary deliverable of the assessment. It is slower to begin and it is the only honest way to begin.

Free consultation

Talk through scope for Legacy Application Modernisation.

Bring the problem and any constraints. You will leave the call with a scope, a timeline and a price — whether you work with us or not.

We reply within one business day. · No obligation