Executive Summary
Migrating from HL7 v2 to FHIR is one of the most critical modernization challenges facing healthcare IT. With billions of HL7 v2 messages processed daily across hospital EMRs, the transition requires careful planning using proven patterns like Strangler Fig, FHIR Facade, and Dual-Write strategies.
🏥
HEALTHCARE INTEROPERABILITY SERIES
This article is part of a comprehensive series on healthcare data standards and interoperability.
- HL7 v2: The Messaging Standard That Powers Healthcare IT
- Building GDPR-Compliant FHIR APIs: A European Healthcare …
- EMR Modernization: Migrating from Legacy HL7 v2 to FHIR (this article)
- HL7 v3: Understanding RIM and Why v3 Failed to Replace v2
- FHIR Subscriptions: Building Real-Time Event-Driven Healt…
- ePrescribing in EU and Ireland: FHIR-Based Electronic Pre…
- FHIR Integration Best Practices: Lessons from Production
- FHIR API Security Part 1: Foundation & Authentication
- FHIR API Security Part 2: Implementation & Best Prac…
- Real-Time Healthcare Data Pipelines: Kafka + FHIR for Cli…
- Building Interoperable Healthcare Data Systems for AI: A …
- Case Study: Building a Modern FHIR Patient Timeline Explo…
- Legacy EMR challenges (Cerner, Epic, InterSystems)
- Strategic migration patterns (Strangler Fig, Facade, Dual-Write)
- HL7 v2 ADT/ORU to FHIR Patient/Observation mapping
- Production .NET conversion code
- Testing strategies and rollback plans
- Irish HSE modernization context
The Legacy EMR Challenge
Why EMRs Are Stuck on HL7 v2
Technical Debt Accumulation:- 20-30 years of custom HL7 v2 interfaces
- Hundreds of point-to-point integrations
- Vendor-specific message variations
- Tribal knowledge (original developers gone)
- Fear of breaking production systems
Common EMR Vendors in Ireland
| Vendor | Market Share | HL7 v2 Usage | FHIR Support |
|---|---|---|---|
| Cerner Millennium | 35% | Extensive | Partial (2024) |
| Epic | 25% | Core system | Growing |
| InterSystems TrakCare | 20% | All integrations | Limited |
| Allscripts | 10% | Legacy | Minimal |
| Others | 10% | Varies | Varies |
Pain Points
1. Integration ComplexityTypical Hospital Setup:
- Lab System → 50 HL7 v2 interfaces
- Radiology → 40 interfaces
- Pharmacy → 30 interfaces
- Billing → 25 interfaces
= 145+ point-to-point HL7 v2 connections
2. Maintenance Burden
- Each interface needs custom mapping
- Version upgrades break message formats
- Testing requires production-like data
- No API documentation (tribal knowledge)
- Mobile apps can’t consume HL7 v2
- No REST APIs for patient portals
- Cloud integration difficult (MLLP/TCP)
- Real-time sync challenges
Migration Strategy #1: Strangler Fig Pattern
Concept
The Strangler Fig Pattern (named after the tree that grows around another tree) gradually replaces legacy systems by:- Building new FHIR capabilities alongside v2
- Incrementally routing traffic to FHIR
- Eventually "strangling" the old v2 system
Benefits
✅ Low risk (gradual rollout)✅ Easy rollback
✅ Production-proven at each step
✅ Parallel systems reduce downtime
Challenges
❌ Longer timeline (1-3 years)❌ Dual system maintenance
❌ Data synchronization complexity
%%{init: {'theme':'base', 'themeVariables': {'primaryColor':'#E8F4F8','secondaryColor':'#F3E5F5','tertiaryColor':'#E8F5E9','primaryTextColor':'#2C3E50','fontSize':'14px'}}}%%
graph TB
subgraph "Phase 1: Baseline"
A[Legacy EMR
HL7 v2 Only]
B[100% HL7 v2 Traffic]
end
subgraph "Phase 2: FHIR Facade"
C[HL7 v2 Core]
D[FHIR Facade Layer]
E[10% New Apps on FHIR]
end
subgraph "Phase 3: Dual-Write"
F[HL7 v2 System]
G[FHIR System]
H[50% Traffic Each]
end
subgraph "Phase 4: FHIR Primary"
I[FHIR Core]
J[v2 Compatibility Layer]
K[90% FHIR Traffic]
end
subgraph "Phase 5: Complete"
L[FHIR Only]
M[100% FHIR]
end
A --> C
C --> F
F --> I
I --> L
style A fill:#FCE4EC,stroke:#F8BBD0,stroke-width:2px
style C fill:#F3E5F5,stroke:#CE93D8,stroke-width:2px
style F fill:#E8F5E9,stroke:#A5D6A7,stroke-width:2px
style I fill:#E1F5FE,stroke:#81D4FA,stroke-width:2px
style L fill:#B2DFDB,stroke:#4DB6AC,stroke-width:3px
HL7 v2 to FHIR Conversion Code
using NHapi.Base.Parser;
using NHapi.Model.V251.Message;
using Hl7.Fhir.Model;
public class Hl7V2ToFhirConverter
{
private readonly PipeParser _v2Parser;
public Patient ConvertAdtToFhirPatient(string hl7v2Message)
{
var message = (ADT_A01)_v2Parser.Parse(hl7v2Message);
var pid = message.PID;
return new Patient
{
Id = ExtractIHI(pid),
Identifier = new List<Identifier>
{
new Identifier
{
System = "http://www.hse.ie/ihi",
Value = ExtractIHI(pid)
}
},
Name = new List<HumanName>
{
new HumanName
{
Family = pid.GetPatientName(0).FamilyName.Surname.Value,
Given = new[] { pid.GetPatientName(0).GivenName.Value }
}
},
BirthDate = ConvertHL7Date(pid.DateTimeOfBirth.Time.Value),
Gender = ConvertGender(pid.AdministrativeSex.Value)
};
}
}
Standards and References
FHIR Standards
Irish Healthcare
Migration Resources
Related Articles in This Series
Conclusion
EMR modernization from HL7 v2 to FHIR is a multi-year journey requiring strategic planning, proven patterns, and incremental execution. Irish healthcare systems can leverage HSE’s FHIR roadmap and use Strangler Fig or FHIR Facade patterns for low-risk migration.
Discover more from C4: Container, Code, Cloud & Context
Subscribe to get the latest posts sent to your email.