Maintainable Java

The generated Java application can be structured to align with modern enterprise development practices and frameworks such as Spring and Spring Boot. Applications can be deployed on-premises or containerized for execution in cloud environments including Microsoft Azure and Amazon Web Services (AWS). By targeting industry-standard Java technologies, organizations gain access to a broad developer ecosystem, modern DevOps pipelines, CI/CD automation, and cloud-native deployment options.


A faster lower cost option is for a straight one for conversion of COBOL to semantically equivalent Java.


DMS ensures that every transformation is repeatable, traceable, and based on well-defined translation rules rather than probabilistic AI output. The result is Java code that faithfully implements the original COBOL business rules while providing a solid foundation for future enhancement, integration with modern services, APIs, and databases, and long-term application evolution in the cloud.

Maintainable Java
THE STATE OF COBOL TO JAVA IN 2026

38% of COBOL to Java migrations miss the budget or the deadline.

That's the data from independent analysis of 127 enterprise migrations. Median project spend lands at $2.3M. Median timeline is 22 months. Six in ten projects make it on time. Four don't.

The gap isn't really about source code or target language. It's how the conversion handles parts of COBOL that don't have clean Java equivalents. Three patterns explain almost every failed project.

The Jobol problem

Java that looks and acts like COBOL. The output compiles. It runs. It also carries every maintenance liability of the original system, written in a language your COBOL team can't read and your Java team won't touch. This is what happens when a tool translates statement-by-statement without restructuring control flow.

AI hallucinations

LLM-based tools generate code that looks idiomatic and passes review. Then a sharp-eyed engineer finds a quietly altered conditional 6 months in, after the bug has shipped to production. On a 200,000-line system, you can't manually verify every output.

Hidden semantics

COMP-3 packed decimals. REDEFINES memory aliasing. OCCURS DEPENDING ON. Level-88 conditions. Tools that don't model these formally will quietly drop precision or corrupt data structures. The errors only surface in production, often during financial reconciliation.

Find out where your codebase falls before you commit a budget.

Send us your COBOL inventory. We deliver a complexity assessment in 5 business days, no fee, NDA in place. We tell you what's automatable, what isn't, and what your real timeline looks like.

HOW WE HANDLE THE PARTS THAT BREAK MOST TOOLS

Specific COBOL constructs.
Specific solutions.

If a translation tool has burned your team before, it was almost certainly inflicted by one of the constructs below.

COBOL constructs
The Problem
How DMS handles it
COMP-3 packed decimals
The ProblemCOMP-3 is signed packed binary-coded decimal often used to represent "money" values. Java and C# doubles are IEEE 754 floating point. Mapping decimal "money" values to doubles loses precision and produces incorrect results for any kind of financial code, often not discovered until months after cutover.
How DMS handles itEvery COMP-3 field maps to a target language native type (Java: "BigDecimal" or C# "decimal"), or ScaleLongs (customer choice) that preserve scale, precision, and rounding exactly as COBOL semantics require. Our ScaleLongs implementation is an order of magnitude faster than the native types, and even exceed mainframe decimal math speeds.
REDEFINES and memory aliasing
The ProblemCOBOL data semantics are technically based on a "byte memory image" of data. REDEFINES lets the same byte memory be aliased/interpreted as different types depending whether a data access is made to a REDEFINED variable or to the data declaration that has been aliased by the REDEFINE.

Most tools either drop the aliasing, generate broken code (requiring manual intervention to fix), or generate extremely inefficient and hard to maintain code that continually converts between natural target language data types and the byte memory representation at high runtime cost.
How DMS handles itW All data declarations, whether REDEFINED or not, have an appropriate native target data type (int, string, ...) chosen to represent it.

For data declarations that are not REDEFINED, DMS generates an appropriate target data declaration directly, as one would desire.

For REDEFINED data, DMS generates a class representing the chosen target type with set/get data accessors for that type.

To preserve COBOL semantics, sometimes the target native type of the REDEFINED declaration must be converted to/from underlying byte arrays; this would be expensive if every access did this. For most (repeated) accesses, the byte representation isn't needed; a cached value in the data class is updated/returned with very little overhead.

Together these translator actions ensure that the translated program code is very readable because it always operates on target native types, regardless of REDEFINES, and that data accesses are extremely fast.
GO TO and unstructured control flow
The Problem770s and 80s COBOL code often leans on GO TO. AI tools translate them as Java labels and jumps, except Java doesn't have a GOTO at all. Output is broken or worse, looks like it works.
How DMS handles itA formal control-flow restructuring pass identifies the loops and conditionals the unstructured code is expressing. Generated Java and C# have no labels and no jumps.
EVALUATE TRUE is not a switch statement
The ProblemEVALUATE TRUE with multiple WHEN clauses is not a switch on a value. Each WHEN is an independent boolean. Almost every AI tool we've tested fails this.
How DMS handles itThe pattern generates if-else if-else chains. Order of evaluation is preserved. Fall-through semantics are preserved. Java behaves like the COBOL on every edge case.
Hierarchical indexed files based on VSAM, IMS, Enscribe
The ProblemStandard COBOL offers indexed files which implicit schemas defined partly COBOL record data declarations, and partly by vendor-specific data schemas. None of these maps directly to a modern relational target.
How DMS handles itWe build custom translations of the vendor databases schemas into relation schemas. We analyze how every program reads and writes the data, and convert accesses to JPA, ODBC, JDBC or Hibernate. JSON columns or polymorphic mappings preserve information where REDEFINES blocks have a clean fit.
Large monolithic COBOL programs and COPY lib preservation
The ProblemA naïve conversion converts a COBOL program into a giant target language class with COPY libs expanded in place. The sheer scale makes maintenance hard. Especially hard is needing to modify the shared record that most COPY libs represent, because the record has been cloned into the many COBOL programs that use it.
How DMS handles itDMS translates each program P into a main class P containing main program scalar variables and methods representing sets of code paragraphs as determined by PERFORM A TO Z statements. The main class is supported by a set of additional classes each representing records declared in the main program and/or COPY libs used. Duplicate COPY classes across translation units are merged. The result is a much more structured translation with COPY libs objectified.
Very long COBOL identifiers / access paths
The ProblemCOBOL programs tend to be written using long identifiers for paragraph/section names, and all identifiers defined in data records. Often these identifiers share long prefixes that match the name of the containing program. Preserving these names completely produces rather long source lines.
How DMS handles itThe client can provide DMS with a list of "renames" to replace arbitrary names with shorter, more meaningful names. DMS will accordingly revise those names as it translates.

Special shared-prefix shortening can be enabled; this tends to provide much shorter access paths in the code.
CICS to Spring transactions
The ProblemEXEC CICS commands handle transactions, security, and concurrency on the mainframe. Tools that work file-by-file lose the transactional boundaries.
How DMS handles itEXEC CICS READ, WRITE, REWRITE translate to Spring Data calls with @Transactional annotations. Locking semantics are preserved. Pseudo-conversational patterns become Spring controllers.
JCL to Spring Batch
The ProblemJCL defines batch dependencies, restart logic, error handling, and dataset routing. Nobody talks about it until they're 6 months in and the batch window won't close.
How DMS handles itJob streams convert to Spring Batch with the same step dependencies, restartability, and conditional flow. You get a maintainable Spring Batch project, not shell scripts.

And dozens more:

OCCURS DEPENDING ON, level-88 condition names, PERFORM THRU and VARYING, COPY REPLACING, EBCDIC sort orders, numeric edited PIC clauses. All handled by named rules in the configuration we build for your engagement.

Our 2026 capacity is half-booked.

Talent is shrinking 8% a year. Contractor rates are climbing 12 to 18% annually. Every quarter you wait, the project gets harder and more expensive. Lock your slot.

Four ways to begin.

1
Free codebase assessment

Send us your inventory under NDA. We deliver a complexity report, automation estimate, and rough effort and timeline in 5 business days. No fee. No sales pitch. You walk away with the data whether or not you engage us.

2
Pilot translation

Pick 50,000 lines of your COBOL. We translate it to Java in 2 weeks. You see the output side-by-side with the original. If we don't hit 95% automation, the pilot is free.

3
Talk to our compiler engineers

Not a salesperson. The same engineers who configured DMS for the B-2 bomber, for Dow Chemical, and for the Net.COBOL to C# financial services migration. 30 minutes, no slides, your hardest technical question.

4
Reserve your 2026 slot

We take 6 enterprise engagements per year. 2026 capacity is half-booked as of this quarter. Holding a slot doesn't lock you in. It locks the pricing and the start date.

FAQ

The questions our engineers get
asked the most

General questions

Through parallel-run regression testing. The original COBOL system and the new Java application are executed against the same input data, and outputs are compared at the byte level, including calculations, logs, file generation, database updates, and downstream side effects. If there is any difference, it is treated as a defect, traced back to the exact translation rule or logic path, and corrected before sign-off. The same regression suite is rerun on every iteration, so fixes do not introduce new inconsistencies elsewhere in the system. For environments without reliable historical test data, synthetic datasets are generated from the data dictionary, copybooks, and field relationships, then processed through both systems to validate behavior across different scenarios. By the final handover, all critical business logic has been tested end-to-end. The translation engine itself is continuously validated through 5,000+ automated translator tests covering COBOL dialect differences, embedded SQL, batch processing, file handling, numeric precision, and edge-case logic paths. AI-generated test scenarios further expand regression coverage by identifying additional execution paths and business conditions from the source code automatically.

No. The DMS toolkit can be deployed directly on your infrastructure, allowing the entire COBOL-to-Java translation process to run within your own network on standard Linux or Windows servers. Source code, datasets, generated Java output, regression results, and documentation remain fully inside your environment, which is critical for regulated and security-sensitive organizations. The on-premise deployment includes the translator, dialect-specific rewrite rules, regression testing framework, and documentation generator. Your security team can audit the full toolchain, while your engineers can run migrations and future translation cycles internally after training, without repeatedly transferring code to an external vendor.

This is where the GenAI layer earns its place. Before code translation begins, we run a business rule extraction pass that produces human-readable documentation of what each program does: calculations, decision points, data dependencies, and the conditions under which different branches execute. Your team validates the documentation, corrects anything that doesn't match institutional knowledge, and signs off. That validated rule set becomes the test oracle for the translation. Bottom line: when the Java output matches the documented behavior across regression, you have proof your business logic survived intact, with paperwork your auditors will accept.

They're the most important people on the project, both during and after. During migration, they're the source of business knowledge nobody else has. They review the extracted rules, validate the test data, and catch edge cases the toolkit can't infer from code alone. After cutover, they typically transition to maintaining the new Java system. The output is structured Java that follows modern conventions, so the learning curve is mostly Java syntax and Spring patterns rather than re-architecting from scratch. Most clients keep the COBOL team intact through the transition and find the deep system knowledge is what makes the post-migration phase smooth. The team also receives code training from our experts, for sustained system continuity.

Yes, and we usually do on systems above 2 million lines. Strangler-pattern migration works well: pick a bounded subsystem, migrate it, run it side-by-side with the legacy COBOL via APIs, then move the next subsystem. Each phase pays off on its own. Common starting points: customer-facing modules where modern UI and integration matter most, or high-cost batch processing that drives the bulk of MIPS spend. We help you pick the wedge that delivers the highest ROI in the first 6 months, then keep going from there.

Spring Boot is our default, including Spring Data for persistence and Spring Batch for job orchestration. We've also delivered Quarkus targets for clients running Kubernetes-heavy stacks, and Java EE targets where the customer environment required them. The framework choice is a configuration of the translator, not a separate engagement, so switching targets after the assessment phase is possible without restarting the project. Where your team has strong opinions about coding standards, package structure, or dependency injection patterns, we tune the code generator to match before Phase 3 starts. The output should look like code your team would have written.

As a single coordinated workstream. The same codebase analysis that drives the code translation also drives the schema design for the relational target. We generate the migration scripts (VSAM unload, normalization, load) as part of the deliverable. Source databases we've migrated from: VSAM, IMS, DB2, Adabas, DataCom, Model 204. Target databases: Oracle, SQL Server, PostgreSQL, Aurora. Cutover happens only after both code and data have passed regression on real production volumes.

AWS Transform is an agentic AI. It's good at scale, fast on simple code, and integrates well with AWS infrastructure. It's also probabilistic at the core, which means functional equivalence is validated by testing rather than guaranteed by transformation rules. For systems where AI errors are recoverable, that's a fine choice and we'd recommend it for some workloads. For financial, defense, or regulated systems where errors aren't an option, deterministic translation has a different risk profile. We have customers who use AWS Transform for parts of their portfolio and us for the parts that can't tolerate uncertainty.

Around 250,000 lines of code is our typical floor. Below that, the per-line economics get hard because the configuration work in Phase 2 is similar regardless of codebase size. For smaller projects: we sometimes recommend a tooling-led engagement where we configure the translator and your team runs it under our advisory, at a much lower price point. If your project is under 100,000 lines, we'd usually point you to one of the AI-led tools instead. The economics there favor probabilistic translation.

No. Once the modernization project is completed, the customer owns the translated application code and deliverables outright. There are no recurring runtime royalties, platform lock-ins, or mandatory ongoing license fees tied to the generated Java application. Clients receive full rights to the modernized codebase, along with the supporting documentation, regression assets, and deployment artifacts created during the engagement. Future maintenance, enhancements, and hosting can be managed internally or by any partner of your choice.

start

Dont let your last COBOL developer retire before your migration is planned.

Industry data: COBOL programmer headcount falling 8% per year. Contractor rates rising 12 to 18% annually. Start with a free assessment. Decide afterward.