application services · legacy modernization

Modernize the system that still runs payroll, one slice at a time.

The system has run for longer than most of the team has worked there, the documentation is the code, and the person who understood the batch schedule has moved on. We modernize systems like that in slices, with old and new running side by side until the numbers match.

platforms
application-services / legacy-modernization 5 platforms
01 · USERS AND CALLERS 02 · ROUTING 03 · OLD AND NEW 04 · DATA Users and integrations: screens · batch · APIs Users andintegrations screens · batch · APIs Strangler facade: API gateway · reverse proxy Strangler facade API gateway · reverseproxy Modern identity: Entra ID · Okta Modern identity Entra ID · Okta Legacy application: .NET Framework · Java · COBOL Legacy application .NET Framework · Java· COBOL New services: modern runtime · cloud New services modern runtime · cloud Legacy database: DB2 · Oracle · SQL Server Legacy database DB2 · Oracle · SQLServer New data store: managed database New data store managed database Output reconciliation: parallel run diffs Outputreconciliation parallel run diffs
Microsoft Entra IDOktaTerraformSalesforce
in short·20-second read

Legacy modernization replaces or restructures aging applications without stopping the business that depends on them.

Cohash assesses the code and its dependencies, extracts business rules, and modernizes in slices using the strangler fig pattern, so old and new systems run in parallel until outputs match. We handle .NET Framework and Java upgrades, mainframe workloads with tools such as AWS Transform for mainframe, and replace shared service accounts with modern identity.

you probably need this if
  • Business rules live only in code that a few people can still read.
  • It's on .NET Framework or an old version of Java, and upgrades keep slipping.
  • A rewrite was tried once and abandoned because the new system never matched the old outputs.
Ask an engineer facts checked 2026-10-20 · 4 sources
how it runs
  1. 01Assess
  2. 02Choose a path per component
  3. 03Modernize in slices
  4. 04Decommission
you keep
  • Application assessment with dependency map
  • Business rule catalog traced to source code
  • Target architecture and slice plan
+ 2 more documents
who does it
Modernization architectJava and .NET application developerMainframe analyst (COBOL)
platforms
the story · legacy modernization

From the first call to a setup your own team can run.

Here's what usually prompts a call about your Legacy Modernization, what we do about it and in which order, and where you end up.

  1. chapter 01 · where it hurts

    Why teams reach out

    • Business rules live only in code that a few people can still read.
    • It's on .NET Framework or an old version of Java, and upgrades keep slipping.
    • A rewrite was tried once and abandoned because the new system never matched the old outputs.
  2. chapter 02 · what we change

    How we solve it

    • Assessment and business rule extraction
    • Strangler fig migration
    • Runtime and framework upgrades
    • Mainframe modernization
    • Data migration and reconciliation
    • Identity cleanup
  3. chapter 03 · how it runs

    Our approach

    • Assess
    • Choose a path per component
    • Modernize in slices
    • Decommission
  4. chapter 04 · where you end up

    What changes

    • The posting rules are written down and traced to code, and what the experts knew now lives in tests.
    • The OS deadline gets met without waiting on the rewrite.
    • Every difference has an explanation and a decision.
    • Application assessment with dependency map
what we do

Where we spend the hours

6 areas of work, each one done by an engineer who has run it in production.

  1. We read the code, map dependencies and talk to the people who still remember why a rule exists. Every rule gets written down with a pointer to where it lives in the code.

  2. Put a routing layer in front and send one function at a time to the new service. Everything else stays on the old system. Keep each slice small enough to roll back.

  3. .NET Framework to .NET 10, older Java to a current LTS release, and app servers off Windows Server 2016 before its extended support ends in January 2027.

  4. AWS Transform for mainframe for dependency analysis, business rule extraction, code generation and test generation. We review its output, write the equivalence tests and run parallel batches against production data.

  5. Data moves and gets reconciled during parallel runs. Before any cutover, reports have to show record counts and totals matching.

  6. Old applications often check passwords against their own tables and call other systems with a shared service account. We move users to SSO over OIDC or SAML and give each service its own identity.

capability 01 / 06in production

Assessment and business rule extraction

We read the code, map dependencies and talk to the people who still remember why a rule exists. Every rule gets written down with a pointer to where it lives in the code.

capability 02 / 06in production

Strangler fig migration

Put a routing layer in front and send one function at a time to the new service. Everything else stays on the old system. Keep each slice small enough to roll back.

capability 03 / 06in production

Runtime and framework upgrades

.NET Framework to .NET 10, older Java to a current LTS release, and app servers off Windows Server 2016 before its extended support ends in January 2027.

capability 04 / 06in production

Mainframe modernization

AWS Transform for mainframe for dependency analysis, business rule extraction, code generation and test generation. We review its output, write the equivalence tests and run parallel batches against production data.

capability 05 / 06in production

Data migration and reconciliation

Data moves and gets reconciled during parallel runs. Before any cutover, reports have to show record counts and totals matching.

capability 06 / 06in production

Identity cleanup

Old applications often check passwords against their own tables and call other systems with a shared service account. We move users to SSO over OIDC or SAML and give each service its own identity.

typical situations

Situations we walk into

We pieced these together from Legacy Modernization situations that come up a lot. They're patterns. You won't find a specific client in them.

case file 01

COBOL batch posting to the general ledger, two experts near retirement

composite · not a client story
  1. Beforethe situation

    A nightly COBOL batch on z/OS posts journal entries to the general ledger. The JCL has grown for decades, copybooks are shared across programs, and the two people who understand the posting rules retire within the year.

  2. What we dothe work

    Inventory JCL, programs and copybooks, and run AWS Transform for mainframe for dependency analysis and rule extraction. Review the extracted rules with both experts while they're still here, build equivalence tests from production batch inputs, and run old and new in parallel until ledger postings match.

  3. Afterwhere you end up

    The posting rules are written down and traced to code, and what the experts knew now lives in tests. Cutover waits for matching parallel runs, not for a calendar date.

case file 02

Web Forms on .NET Framework, Windows Server 2016 and one shared SQL login

composite · not a client story
  1. Beforethe situation

    It's an ASP.NET Web Forms app on .NET Framework 4.x, on Windows Server 2016 VMs. Pricing comes from a service over WCF, and everything hits SQL Server through one shared SQL login. The OS loses extended support in January 2027.

  2. What we dothe work

    Move the VMs to a supported Windows Server first, so the OS date stops driving the design. Then put a routing layer in front, rebuild the pricing calls as a .NET 10 API and move pages off Web Forms one area at a time. Give each new service its own database identity.

  3. Afterwhere you end up

    The OS deadline gets met without waiting on the rewrite. New slices ship on a supported runtime, and the database can now tell which service ran each query.

case file 03

A rating engine rewrite shelved because premiums never matched

composite · not a client story
  1. Beforethe situation

    A previous team spent two years rewriting a rating engine in Java. The new engine priced a small share of policies differently, nobody could explain why, and the project was shelved.

  2. What we dothe work

    Collect the old mismatch cases and replay them through both engines with full input capture. Trace each difference to a rule, decide with underwriting which engine is right, and add the case to the equivalence suite. Route one product line at a time to the new engine.

  3. Afterwhere you end up

    Every difference has an explanation and a decision. The new engine takes over product lines as they match, and the old one shrinks instead of running beside it forever.

case studies

Legacy Modernization case studies

All case studies
upgrade Industry platforms

Nasdaq Calypso upgrade to V19

Upgrading Nasdaq Calypso to V19, with server consolidation, properties moved to the database, the WebUI and deployment changes tested on your own trades.

read the case study
migration Cloud and infrastructure

Data center exit to AWS or Azure

Leaving a colocation or owned data center for AWS or Azure in planned waves, with dependencies mapped, licences checked and every server given an owner.

read the case study
modernization Applications

.NET Framework and .NET 8 to .NET 10

Both .NET 8 and .NET 9 hit end of support on 10 November 2026. Moving them, and older .NET Framework apps, to .NET 10 LTS one project at a time.

read the case study
modernization Applications

Legacy web apps to containers on Kubernetes or OpenShift

Moving Java, .NET and PHP web apps off hand-patched VMs and into containers on Kubernetes or OpenShift, with config, secrets, sessions and logs sorted out.

read the case study
modernization Applications

Mainframe COBOL and CICS to APIs, then cloud in slices

Putting REST APIs in front of CICS and IMS transactions first, then moving bounded COBOL functions to cloud services one slice at a time with parallel runs.

read the case study
migration Identity and access

Oracle Access Manager and OIG to a modern identity provider and IGA

Replacing Oracle Access Manager and Oracle Identity Governance 12c with a cloud identity provider and SailPoint or Saviynt before support runs out.

read the case study
architecture

How a legacy system is replaced in slices without a big-bang cutover

Put a routing layer in front. Send each request to the legacy system or the new service, one capability at a time. Run both in parallel while outputs are reconciled, and move data with change data capture until the old path can be switched off.

How a legacy system is replaced in slices without a big-bang cutover Put a routing layer in front. Send each request to the legacy system or the new service, one capability at a time. Run both in parallel while outputs are reconciled, and move data with change data capture until the old path can be switched off. 01 · USERS AND CALLERS 02 · ROUTING 03 · OLD AND NEW 04 · DATA requests OIDC token not yet moved migrated slice CDC old output new output read and write Users and integrations screens · batch · APIs Strangler facade API gateway · reverseproxy Ex Modern identity Entra ID · Okta Legacy application .NET Framework · Java ·COBOL New services modern runtime · cloud Legacy database DB2 · Oracle · SQL Server New data store managed database Output reconciliation parallel run diffs
Read the diagram as text
  1. Users and integrations → Strangler facade: requests
  2. Modern identity → Strangler facade: OIDC token
  3. Strangler facade → Legacy application: not yet moved
  4. Strangler facade → New services: migrated slice
  5. Legacy database → New data store: CDC
  6. Legacy application → Output reconciliation: old output
  7. New services → Output reconciliation: new output
  8. New services → New data store: read and write
how it runs

A typical engagement

We don't start a step until the last one has produced something you can check.

  1. step 01

    Assess

    Code, data, integrations, runtime support dates and the people who still know the system, ranked by business risk.

  2. step 02

    Choose a path per component

    Retain, rehost, refactor, rebuild or replace with a SaaS product, decided component by component.

  3. step 03

    Modernize in slices

    We build each slice, test it for equivalence and run it in parallel, then switch it over behind the routing layer.

  4. step 04

    Decommission

    Old components switched off, data archived to retention rules, licenses and servers released.

you keep

What you're left with

We write these for your Legacy Modernization setup, and they're working documents. Your team should be able to keep things running from them long after we've gone.

  • report01

    Application assessment with dependency map

    yours to keep
  • inventory02

    Business rule catalog traced to source code

    yours to keep
  • plan03

    Target architecture and slice plan

    yours to keep
  • tests04

    Equivalence test suite and parallel-run reports

    yours to keep
  • plan05

    Decommissioning checklist and data retention plan

    yours to keep
talent and delivery · legacy modernization

Certified engineers, wherever you need them.

Some clients want a project team, some want a couple of engineers on theirs. Either works. Onsite, nearshore or offshore, with handovers across time zones that keep things moving.

Onsite

Engineers at your sites in the US

Nearshore

Overlapping hours with US teams

Offshore

Overnight progress on your backlog

All time zones

Coverage handed over across time zones

24-hour coverage · US Central time
OnsiteUS business hours
Nearshoreoverlapping US hours
Offshoreovernight progress
Combinedhandover, not hand-off
roles we staff
  • Modernization architect
  • Java and .NET application developer
  • Mainframe analyst (COBOL)
  • Cloud engineer
  • Data migration engineer
  • QA automation engineer
01Should we rewrite the application or refactor it?

Full rewrites tend to run long, mostly because nobody documented how the old system behaves. Refactoring in slices is slower to get going but much safer. We only recommend a rewrite when the code can't be changed safely and the business rules are well understood.

02Can AI convert our COBOL automatically?

Tools such as AWS Transform for mainframe can analyze code, pull out business rules, and generate modern code and tests. You'll still need equivalence testing, people who know the business, and parallel runs. Treat whatever it generates as a first draft.

03How long does modernization take?

That depends on the size of the code, the integrations and how much business logic nobody wrote down. Slice-based plans ship working pieces early, so value shows up before the whole program is done.

04We still run .NET 8 or Windows Server 2016. What should we do first?

.NET 8 support ends on 10 November 2026, so plan the move to .NET 10 now. Windows Server 2016 extended support ends in January 2027. Both are usually upgrades, not rewrites, if dependencies are current.

05Can we keep the mainframe and modernize around it?

Yes, and it's often the right place to start. Wrap mainframe transactions in APIs, move reporting off the platform, and risk drops while the core keeps running. We plan what comes next once we know which parts are expensive and which are fragile.

related

Often paired with

Projects on Legacy Modernization usually end up touching one of these, so they're worth a look.

sources 4 sources linked last checked 2026-10-20 content fingerprint 6acd095c
  1. 01AWS Transform for mainframeaws.amazon.com ↗
  2. 02.NET Blog: .NET 8 and .NET 9 end of supportdevblogs.microsoft.com ↗
  3. 03Microsoft Lifecycle: Windows Server 2016learn.microsoft.com ↗
  4. 04Martin Fowler: Strangler Fig Applicationmartinfowler.com ↗
Reviewed by the Cohash team Product names are trademarks of their owners. how we handle facts and data →
next step

Tell us what you're running. We'll tell you what we'd do first.

A 30-minute working session with a senior engineer. No slides.

useful to bring
  • The platform and the version you're on
  • Where you need to get to, and by when
  • What's custom: rules, plugins, integrations
  • Any audit finding or deadline driving it