You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2020/02/04 12:11:13 UTC

[camel-quarkus] branch master updated: camel-fhir record FHIR context instead of creating it at runtime. Only one FHIR context per specification is permitted in native mode

This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git


The following commit(s) were added to refs/heads/master by this push:
     new 5a2c395  camel-fhir record FHIR context instead of creating it at runtime. Only one FHIR context per specification is permitted in native mode
     new 29ca6b0  Merge pull request #678 from johnpoth/fhir-context-recorder
5a2c395 is described below

commit 5a2c395e6271455ef266bf8a397e969dae165380
Author: John Poth <po...@gmail.com>
AuthorDate: Fri Jan 31 18:14:25 2020 +0100

    camel-fhir record FHIR context instead of creating it at runtime. Only one FHIR context per specification is permitted in native mode
---
 extensions/fhir/deployment/pom.xml                 |   2 +-
 .../component/fhir/deployment/FhirProcessor.java   | 306 +---------------
 .../component/fhir/deployment/FhirUtil.java        |  75 ++++
 .../deployment/dstu2/Dstu2PropertiesBuildItem.java |  34 ++
 .../fhir/deployment/dstu2/FhirDstu2Processor.java  | 400 +++++++++++++++++++++
 .../deployment/dstu3/Dstu3PropertiesBuildItem.java |  34 ++
 .../fhir/deployment/dstu3/FhirDstu3Processor.java  |  75 ++++
 .../fhir/deployment/r4/FhirR4Processor.java        |  70 ++++
 .../fhir/deployment/r4/R4PropertiesBuildItem.java  |  34 ++
 .../fhir/deployment/r5/FhirR5Processor.java        |  70 ++++
 .../fhir/deployment/r5/R5PropertiesBuildItem.java  |  34 ++
 extensions/fhir/runtime/pom.xml                    |  10 +-
 .../component/fhir/FhirContextProducers.java       |  76 ++++
 .../component/fhir/FhirContextRecorder.java        |  64 ++++
 .../component/fhir/it/FhirDstu2RouteBuilder.java   |  20 +-
 .../component/fhir/it/FhirDstu3RouteBuilder.java   |  19 +-
 .../component/fhir/it/FhirR4RouteBuilder.java      |  20 +-
 .../component/fhir/it/FhirR5RouteBuilder.java      |  20 +-
 .../fhir/src/main/resources/application.properties |   1 +
 19 files changed, 1038 insertions(+), 326 deletions(-)

diff --git a/extensions/fhir/deployment/pom.xml b/extensions/fhir/deployment/pom.xml
index 2167106..b6bbf52 100644
--- a/extensions/fhir/deployment/pom.xml
+++ b/extensions/fhir/deployment/pom.xml
@@ -48,7 +48,7 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-core-xml-deployment</artifactId>
+        <artifactId>camel-quarkus-support-xml-deployment</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
diff --git a/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/FhirProcessor.java b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/FhirProcessor.java
index 29bad17..70b976d 100644
--- a/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/FhirProcessor.java
+++ b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/FhirProcessor.java
@@ -16,23 +16,15 @@
  */
 package org.apache.camel.quarkus.component.fhir.deployment;
 
-import java.io.InputStream;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Properties;
-import java.util.Set;
-
-import ca.uhn.fhir.model.dstu2.FhirDstu2;
-import ca.uhn.fhir.model.dstu2.resource.BaseResource;
-import ca.uhn.fhir.model.dstu2.valueset.*;
 import ca.uhn.fhir.rest.client.apache.ApacheRestfulClientFactory;
 import ca.uhn.fhir.util.jar.DependencyLogImpl;
 import ca.uhn.fhir.validation.schematron.SchematronBaseValidator;
+import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
 import io.quarkus.deployment.annotations.BuildProducer;
 import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.builditem.AdditionalApplicationArchiveMarkerBuildItem;
 import io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBundleBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
 import org.apache.camel.component.fhir.FhirCapabilitiesEndpointConfiguration;
@@ -49,18 +41,9 @@ import org.apache.camel.component.fhir.FhirSearchEndpointConfiguration;
 import org.apache.camel.component.fhir.FhirTransactionEndpointConfiguration;
 import org.apache.camel.component.fhir.FhirUpdateEndpointConfiguration;
 import org.apache.camel.component.fhir.FhirValidateEndpointConfiguration;
-import org.apache.camel.quarkus.component.fhir.FhirFlags;
-import org.hl7.fhir.dstu3.hapi.ctx.FhirDstu3;
-import org.hl7.fhir.dstu3.model.Base;
-import org.hl7.fhir.dstu3.model.DomainResource;
-import org.hl7.fhir.dstu3.model.Enumerations;
-import org.hl7.fhir.dstu3.model.Meta;
-import org.hl7.fhir.dstu3.model.MetadataResource;
-import org.hl7.fhir.dstu3.model.Resource;
-import org.hl7.fhir.r4.hapi.ctx.FhirR4;
-import org.hl7.fhir.r5.hapi.ctx.FhirR5;
+import org.apache.camel.quarkus.component.fhir.FhirContextProducers;
 
-class FhirProcessor {
+final class FhirProcessor {
     private static final String FEATURE = "camel-fhir";
 
     @BuildStep
@@ -97,278 +80,25 @@ class FhirProcessor {
         return new NativeImageResourceBundleBuildItem("ca.uhn.fhir.i18n.hapi-messages");
     }
 
-    @BuildStep(applicationArchiveMarkers = { "org/hl7/fhir", "ca/uhn/fhir" })
-    void processFhir(BuildProducer<ReflectiveClassBuildItem> reflectiveClass) {
-        reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, true, SchematronBaseValidator.class));
-        reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, true, DependencyLogImpl.class));
-        reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, true, ApacheRestfulClientFactory.class));
-    }
-
-    @BuildStep(onlyIf = FhirFlags.Dstu2Enabled.class, applicationArchiveMarkers = { "org/hl7/fhir", "ca/uhn/fhir" })
-    void processDstu2(BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
-            BuildProducer<NativeImageResourceBuildItem> resource) {
-        Set<String> classes = new HashSet<>();
-        classes.add(FhirDstu2.class.getCanonicalName());
-        classes.add(BaseResource.class.getCanonicalName());
-        classes.addAll(getModelClasses("/ca/uhn/fhir/model/dstu2/fhirversion.properties"));
-
-        reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, true, classes.toArray(new String[0])));
-        reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, true, getDstu2Enums()));
-        resource.produce(new NativeImageResourceBuildItem("ca/uhn/fhir/model/dstu2/fhirversion.properties"));
-    }
-
-    @BuildStep(onlyIf = FhirFlags.Dstu3Enabled.class, applicationArchiveMarkers = { "org/hl7/fhir", "ca/uhn/fhir" })
-    void processDstu3(BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
-            BuildProducer<NativeImageResourceBuildItem> resource) {
-        Set<String> classes = new HashSet<>();
-        classes.add(FhirDstu3.class.getCanonicalName());
-        classes.add(DomainResource.class.getCanonicalName());
-        classes.add(Resource.class.getCanonicalName());
-        classes.add(org.hl7.fhir.dstu3.model.BaseResource.class.getCanonicalName());
-        classes.add(Base.class.getCanonicalName());
-        classes.addAll(getModelClasses("/org/hl7/fhir/dstu3/model/fhirversion.properties"));
-        classes.addAll(getInnerClasses(Enumerations.class.getCanonicalName()));
-
-        reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, true, Meta.class.getCanonicalName()));
-        reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, true, MetadataResource.class.getCanonicalName()));
-        reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, true, classes.toArray(new String[0])));
-        resource.produce(new NativeImageResourceBuildItem("org/hl7/fhir/dstu3/model/fhirversion.properties"));
-    }
-
-    @BuildStep(onlyIf = FhirFlags.R4Enabled.class, applicationArchiveMarkers = { "org/hl7/fhir", "ca/uhn/fhir" })
-    void processR4(BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
-            BuildProducer<NativeImageResourceBuildItem> resource) {
-        Set<String> classes = new HashSet<>();
-        classes.add(FhirR4.class.getCanonicalName());
-        classes.add(org.hl7.fhir.r4.model.DomainResource.class.getCanonicalName());
-        classes.add(org.hl7.fhir.r4.model.Resource.class.getCanonicalName());
-        classes.add(org.hl7.fhir.r4.model.BaseResource.class.getCanonicalName());
-        classes.add(org.hl7.fhir.r4.model.Base.class.getCanonicalName());
-        classes.addAll(getModelClasses("/org/hl7/fhir/r4/model/fhirversion.properties"));
-        classes.addAll(getInnerClasses(org.hl7.fhir.r4.model.Enumerations.class.getCanonicalName()));
-
-        reflectiveClass
-                .produce(new ReflectiveClassBuildItem(true, true, true, org.hl7.fhir.r4.model.Meta.class.getCanonicalName()));
-        reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, true,
-                org.hl7.fhir.r4.model.MetadataResource.class.getCanonicalName()));
-        reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, true, classes.toArray(new String[0])));
-        resource.produce(new NativeImageResourceBuildItem("org/hl7/fhir/r4/model/fhirversion.properties"));
-    }
-
-    @BuildStep(onlyIf = FhirFlags.R5Enabled.class, applicationArchiveMarkers = { "org/hl7/fhir", "ca/uhn/fhir" })
-    void processR5(BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
-            BuildProducer<NativeImageResourceBuildItem> resource) {
-        Set<String> classes = new HashSet<>();
-        classes.add(FhirR5.class.getCanonicalName());
-        classes.add(org.hl7.fhir.r5.model.DomainResource.class.getCanonicalName());
-        classes.add(org.hl7.fhir.r5.model.Resource.class.getCanonicalName());
-        classes.add(org.hl7.fhir.r5.model.BaseResource.class.getCanonicalName());
-        classes.add(org.hl7.fhir.r5.model.Base.class.getCanonicalName());
-        classes.addAll(getModelClasses("/org/hl7/fhir/r5/model/fhirversion.properties"));
-        classes.addAll(getInnerClasses(org.hl7.fhir.r5.model.Enumerations.class.getCanonicalName()));
-        reflectiveClass
-                .produce(new ReflectiveClassBuildItem(true, true, true, org.hl7.fhir.r5.model.Meta.class.getCanonicalName()));
-        reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, true,
-                org.hl7.fhir.r5.model.MetadataResource.class.getCanonicalName()));
-        reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, true, classes.toArray(new String[0])));
-        resource.produce(new NativeImageResourceBuildItem("org/hl7/fhir/r5/model/fhirversion.properties"));
+    @BuildStep
+    AdditionalApplicationArchiveMarkerBuildItem hl7ArchiveMarker() {
+        return new AdditionalApplicationArchiveMarkerBuildItem("org/hl7/fhir");
     }
 
-    private Collection<String> getModelClasses(String model) {
-        try (InputStream str = FhirDstu3.class.getResourceAsStream(model)) {
-            Properties prop = new Properties();
-            prop.load(str);
-            return getInnerClasses(prop.values().toArray(new String[0]));
-        } catch (Exception e) {
-            throw new RuntimeException("Please ensure FHIR is on the classpath", e);
-        }
+    @BuildStep
+    AdditionalApplicationArchiveMarkerBuildItem hapiArchiveMarker() {
+        return new AdditionalApplicationArchiveMarkerBuildItem("ca/uhn/fhir");
     }
 
-    private Collection<String> getInnerClasses(String... classList) {
-        try {
-            Set<String> classes = new HashSet<>();
-            for (Object value : classList) {
-                String clazz = (String) value;
-                final Class[] parent = Class.forName(clazz).getClasses();
-                for (Class aClass : parent) {
-                    String name = aClass.getName();
-                    classes.add(name);
-                }
-                classes.add(clazz);
-            }
-            return classes;
-        } catch (ClassNotFoundException e) {
-            throw new RuntimeException("Please ensure FHIR is on the classpath", e);
-        }
+    @BuildStep()
+    void processFhir(BuildProducer<ReflectiveClassBuildItem> reflectiveClass) {
+        reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, true, SchematronBaseValidator.class));
+        reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, true, DependencyLogImpl.class));
+        reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, true, ApacheRestfulClientFactory.class));
     }
 
-    private String[] getDstu2Enums() {
-        return new String[] {
-                AccountStatusEnum.class.getCanonicalName(),
-                ActionListEnum.class.getCanonicalName(),
-                AddressTypeEnum.class.getCanonicalName(),
-                AddressUseEnum.class.getCanonicalName(),
-                AdjudicationCodesEnum.class.getCanonicalName(),
-                AdjudicationErrorCodesEnum.class.getCanonicalName(),
-                AdjustmentReasonCodesEnum.class.getCanonicalName(),
-                AdministrativeGenderEnum.class.getCanonicalName(),
-                AdmitSourceEnum.class.getCanonicalName(),
-                AggregationModeEnum.class.getCanonicalName(),
-                AllergyIntoleranceCategoryEnum.class.getCanonicalName(),
-                AllergyIntoleranceCertaintyEnum.class.getCanonicalName(),
-                AllergyIntoleranceCriticalityEnum.class.getCanonicalName(),
-                AllergyIntoleranceSeverityEnum.class.getCanonicalName(),
-                AllergyIntoleranceStatusEnum.class.getCanonicalName(),
-                AllergyIntoleranceTypeEnum.class.getCanonicalName(),
-                AnswerFormatEnum.class.getCanonicalName(),
-                AppointmentStatusEnum.class.getCanonicalName(),
-                AssertionDirectionTypeEnum.class.getCanonicalName(),
-                AssertionOperatorTypeEnum.class.getCanonicalName(),
-                AssertionResponseTypesEnum.class.getCanonicalName(),
-                AuditEventActionEnum.class.getCanonicalName(),
-                AuditEventObjectLifecycleEnum.class.getCanonicalName(),
-                AuditEventObjectRoleEnum.class.getCanonicalName(),
-                AuditEventObjectTypeEnum.class.getCanonicalName(),
-                AuditEventOutcomeEnum.class.getCanonicalName(),
-                AuditEventParticipantNetworkTypeEnum.class.getCanonicalName(),
-                AuditEventSourceTypeEnum.class.getCanonicalName(),
-                BindingStrengthEnum.class.getCanonicalName(),
-                BundleTypeEnum.class.getCanonicalName(),
-                CarePlanActivityStatusEnum.class.getCanonicalName(),
-                CarePlanRelationshipEnum.class.getCanonicalName(),
-                CarePlanStatusEnum.class.getCanonicalName(),
-                ClaimTypeEnum.class.getCanonicalName(),
-                ClinicalImpressionStatusEnum.class.getCanonicalName(),
-                CommunicationRequestStatusEnum.class.getCanonicalName(),
-                CommunicationStatusEnum.class.getCanonicalName(),
-                CompositionAttestationModeEnum.class.getCanonicalName(),
-                CompositionStatusEnum.class.getCanonicalName(),
-                ConceptMapEquivalenceEnum.class.getCanonicalName(),
-                ConditionalDeleteStatusEnum.class.getCanonicalName(),
-                ConditionCategoryCodesEnum.class.getCanonicalName(),
-                ConditionClinicalStatusCodesEnum.class.getCanonicalName(),
-                ConditionVerificationStatusEnum.class.getCanonicalName(),
-                ConformanceEventModeEnum.class.getCanonicalName(),
-                ConformanceResourceStatusEnum.class.getCanonicalName(),
-                ConformanceStatementKindEnum.class.getCanonicalName(),
-                ConstraintSeverityEnum.class.getCanonicalName(),
-                ContactPointSystemEnum.class.getCanonicalName(),
-                ContactPointUseEnum.class.getCanonicalName(),
-                ContentTypeEnum.class.getCanonicalName(),
-                DataElementStringencyEnum.class.getCanonicalName(),
-                DaysOfWeekEnum.class.getCanonicalName(),
-                DetectedIssueSeverityEnum.class.getCanonicalName(),
-                DeviceMetricCalibrationStateEnum.class.getCanonicalName(),
-                DeviceMetricCalibrationTypeEnum.class.getCanonicalName(),
-                DeviceMetricCategoryEnum.class.getCanonicalName(),
-                DeviceMetricColorEnum.class.getCanonicalName(),
-                DeviceMetricOperationalStatusEnum.class.getCanonicalName(),
-                DeviceStatusEnum.class.getCanonicalName(),
-                DeviceUseRequestPriorityEnum.class.getCanonicalName(),
-                DeviceUseRequestStatusEnum.class.getCanonicalName(),
-                DiagnosticOrderPriorityEnum.class.getCanonicalName(),
-                DiagnosticOrderStatusEnum.class.getCanonicalName(),
-                DiagnosticReportStatusEnum.class.getCanonicalName(),
-                DigitalMediaTypeEnum.class.getCanonicalName(),
-                DocumentModeEnum.class.getCanonicalName(),
-                DocumentReferenceStatusEnum.class.getCanonicalName(),
-                DocumentRelationshipTypeEnum.class.getCanonicalName(),
-                EncounterClassEnum.class.getCanonicalName(),
-                EncounterLocationStatusEnum.class.getCanonicalName(),
-                EncounterStateEnum.class.getCanonicalName(),
-                EpisodeOfCareStatusEnum.class.getCanonicalName(),
-                EventTimingEnum.class.getCanonicalName(),
-                ExtensionContextEnum.class.getCanonicalName(),
-                FamilyHistoryStatusEnum.class.getCanonicalName(),
-                FilterOperatorEnum.class.getCanonicalName(),
-                FlagStatusEnum.class.getCanonicalName(),
-                GoalPriorityEnum.class.getCanonicalName(),
-                GoalStatusEnum.class.getCanonicalName(),
-                GroupTypeEnum.class.getCanonicalName(),
-                GuideDependencyTypeEnum.class.getCanonicalName(),
-                GuidePageKindEnum.class.getCanonicalName(),
-                GuideResourcePurposeEnum.class.getCanonicalName(),
-                HTTPVerbEnum.class.getCanonicalName(),
-                IdentifierTypeCodesEnum.class.getCanonicalName(),
-                IdentifierUseEnum.class.getCanonicalName(),
-                IdentityAssuranceLevelEnum.class.getCanonicalName(),
-                InstanceAvailabilityEnum.class.getCanonicalName(),
-                IssueSeverityEnum.class.getCanonicalName(),
-                IssueTypeEnum.class.getCanonicalName(),
-                KOStitleEnum.class.getCanonicalName(),
-                LinkTypeEnum.class.getCanonicalName(),
-                ListModeEnum.class.getCanonicalName(),
-                ListOrderCodesEnum.class.getCanonicalName(),
-                ListStatusEnum.class.getCanonicalName(),
-                LocationModeEnum.class.getCanonicalName(),
-                LocationStatusEnum.class.getCanonicalName(),
-                LocationTypeEnum.class.getCanonicalName(),
-                MaritalStatusCodesEnum.class.getCanonicalName(),
-                MeasmntPrincipleEnum.class.getCanonicalName(),
-                MedicationAdministrationStatusEnum.class.getCanonicalName(),
-                MedicationDispenseStatusEnum.class.getCanonicalName(),
-                MedicationOrderStatusEnum.class.getCanonicalName(),
-                MedicationStatementStatusEnum.class.getCanonicalName(),
-                MessageEventEnum.class.getCanonicalName(),
-                MessageSignificanceCategoryEnum.class.getCanonicalName(),
-                MessageTransportEnum.class.getCanonicalName(),
-                NameUseEnum.class.getCanonicalName(),
-                NamingSystemIdentifierTypeEnum.class.getCanonicalName(),
-                NamingSystemTypeEnum.class.getCanonicalName(),
-                NarrativeStatusEnum.class.getCanonicalName(),
-                NoteTypeEnum.class.getCanonicalName(),
-                NutritionOrderStatusEnum.class.getCanonicalName(),
-                ObservationRelationshipTypeEnum.class.getCanonicalName(),
-                ObservationStatusEnum.class.getCanonicalName(),
-                OperationKindEnum.class.getCanonicalName(),
-                OperationParameterUseEnum.class.getCanonicalName(),
-                OrderStatusEnum.class.getCanonicalName(),
-                ParticipantRequiredEnum.class.getCanonicalName(),
-                ParticipantStatusEnum.class.getCanonicalName(),
-                ParticipantTypeEnum.class.getCanonicalName(),
-                ParticipationStatusEnum.class.getCanonicalName(),
-                PayeeTypeCodesEnum.class.getCanonicalName(),
-                ProcedureRequestPriorityEnum.class.getCanonicalName(),
-                ProcedureRequestStatusEnum.class.getCanonicalName(),
-                ProcedureStatusEnum.class.getCanonicalName(),
-                PropertyRepresentationEnum.class.getCanonicalName(),
-                ProvenanceEntityRoleEnum.class.getCanonicalName(),
-                QuantityComparatorEnum.class.getCanonicalName(),
-                QuestionnaireResponseStatusEnum.class.getCanonicalName(),
-                QuestionnaireStatusEnum.class.getCanonicalName(),
-                ReferralMethodEnum.class.getCanonicalName(),
-                ReferralStatusEnum.class.getCanonicalName(),
-                RemittanceOutcomeEnum.class.getCanonicalName(),
-                ResourceTypeEnum.class.getCanonicalName(),
-                ResourceVersionPolicyEnum.class.getCanonicalName(),
-                ResponseTypeEnum.class.getCanonicalName(),
-                RestfulConformanceModeEnum.class.getCanonicalName(),
-                RestfulSecurityServiceEnum.class.getCanonicalName(),
-                RulesetCodesEnum.class.getCanonicalName(),
-                SearchEntryModeEnum.class.getCanonicalName(),
-                SearchModifierCodeEnum.class.getCanonicalName(),
-                SearchParamTypeEnum.class.getCanonicalName(),
-                ServiceProvisionConditionsEnum.class.getCanonicalName(),
-                SignatureTypeCodesEnum.class.getCanonicalName(),
-                SlicingRulesEnum.class.getCanonicalName(),
-                SlotStatusEnum.class.getCanonicalName(),
-                SpecimenStatusEnum.class.getCanonicalName(),
-                StructureDefinitionKindEnum.class.getCanonicalName(),
-                SubscriptionChannelTypeEnum.class.getCanonicalName(),
-                SubscriptionStatusEnum.class.getCanonicalName(),
-                SubstanceCategoryCodesEnum.class.getCanonicalName(),
-                SupplyDeliveryStatusEnum.class.getCanonicalName(),
-                SupplyRequestStatusEnum.class.getCanonicalName(),
-                SystemRestfulInteractionEnum.class.getCanonicalName(),
-                TimingAbbreviationEnum.class.getCanonicalName(),
-                TransactionModeEnum.class.getCanonicalName(),
-                TypeRestfulInteractionEnum.class.getCanonicalName(),
-                UnitsOfTimeEnum.class.getCanonicalName(),
-                UnknownContentCodeEnum.class.getCanonicalName(),
-                UseEnum.class.getCanonicalName(),
-                VisionBaseEnum.class.getCanonicalName(),
-                VisionEyesEnum.class.getCanonicalName(),
-                XPathUsageTypeEnum.class.getCanonicalName()
-        };
+    @BuildStep
+    void beans(BuildProducer<AdditionalBeanBuildItem> beanProducer) {
+        beanProducer.produce(AdditionalBeanBuildItem.unremovableOf(FhirContextProducers.class));
     }
 }
diff --git a/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/FhirUtil.java b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/FhirUtil.java
new file mode 100644
index 0000000..afce4a2
--- /dev/null
+++ b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/FhirUtil.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.fhir.deployment;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+
+import ca.uhn.fhir.context.FhirContext;
+
+public final class FhirUtil {
+
+    private FhirUtil() {
+    }
+
+    public static Properties loadProperties(String path) {
+        try (InputStream str = FhirContext.class.getResourceAsStream(path)) {
+            Properties prop = new Properties();
+            prop.load(str);
+            return prop;
+        } catch (Exception e) {
+            throw new RuntimeException("Please ensure FHIR is on the classpath", e);
+        }
+    }
+
+    public static Collection<String> getModelClasses(Properties properties) {
+        return getInnerClasses(properties.values().toArray(new String[0]));
+    }
+
+    public static Collection<String> getResourceDefinitions(Properties properties) {
+        List<String> resources = new ArrayList<>();
+        for (String stringPropertyName : properties.stringPropertyNames()) {
+            if (stringPropertyName.contains("resource.")) {
+                resources.add(stringPropertyName.replace("resource.", ""));
+            }
+        }
+        return resources;
+    }
+
+    public static Collection<String> getInnerClasses(String... classList) {
+        try {
+            Set<String> classes = new HashSet<>();
+            for (Object value : classList) {
+                String clazz = (String) value;
+                final Class[] parent = Class.forName(clazz).getClasses();
+                for (Class aClass : parent) {
+                    String name = aClass.getName();
+                    classes.add(name);
+                }
+                classes.add(clazz);
+            }
+            return classes;
+        } catch (ClassNotFoundException e) {
+            throw new RuntimeException("Please ensure FHIR is on the classpath", e);
+        }
+    }
+}
diff --git a/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/dstu2/Dstu2PropertiesBuildItem.java b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/dstu2/Dstu2PropertiesBuildItem.java
new file mode 100644
index 0000000..7ba20a5
--- /dev/null
+++ b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/dstu2/Dstu2PropertiesBuildItem.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.fhir.deployment.dstu2;
+
+import java.util.Properties;
+
+import io.quarkus.builder.item.SimpleBuildItem;
+
+public final class Dstu2PropertiesBuildItem extends SimpleBuildItem {
+
+    private final Properties properties;
+
+    public Dstu2PropertiesBuildItem(Properties properties) {
+        this.properties = properties;
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+}
diff --git a/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/dstu2/FhirDstu2Processor.java b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/dstu2/FhirDstu2Processor.java
new file mode 100644
index 0000000..978bfa7
--- /dev/null
+++ b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/dstu2/FhirDstu2Processor.java
@@ -0,0 +1,400 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.fhir.deployment.dstu2;
+
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.Set;
+
+import ca.uhn.fhir.model.dstu2.resource.*;
+import ca.uhn.fhir.model.dstu2.valueset.AccountStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ActionListEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AddressTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AddressUseEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AdjudicationCodesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AdjudicationErrorCodesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AdjustmentReasonCodesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AdministrativeGenderEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AdmitSourceEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AggregationModeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AllergyIntoleranceCategoryEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AllergyIntoleranceCertaintyEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AllergyIntoleranceCriticalityEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AllergyIntoleranceSeverityEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AllergyIntoleranceStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AllergyIntoleranceTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AnswerFormatEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AppointmentStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AssertionDirectionTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AssertionOperatorTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AssertionResponseTypesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AuditEventActionEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AuditEventObjectLifecycleEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AuditEventObjectRoleEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AuditEventObjectTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AuditEventOutcomeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AuditEventParticipantNetworkTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.AuditEventSourceTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.BindingStrengthEnum;
+import ca.uhn.fhir.model.dstu2.valueset.BundleTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.CarePlanActivityStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.CarePlanRelationshipEnum;
+import ca.uhn.fhir.model.dstu2.valueset.CarePlanStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ClaimTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ClinicalImpressionStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.CommunicationRequestStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.CommunicationStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.CompositionAttestationModeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.CompositionStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ConceptMapEquivalenceEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ConditionCategoryCodesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ConditionClinicalStatusCodesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ConditionVerificationStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ConditionalDeleteStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ConformanceEventModeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ConformanceResourceStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ConformanceStatementKindEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ConstraintSeverityEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ContactPointSystemEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ContactPointUseEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ContentTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DataElementStringencyEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DaysOfWeekEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DetectedIssueSeverityEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DeviceMetricCalibrationStateEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DeviceMetricCalibrationTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DeviceMetricCategoryEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DeviceMetricColorEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DeviceMetricOperationalStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DeviceStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DeviceUseRequestPriorityEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DeviceUseRequestStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DiagnosticOrderPriorityEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DiagnosticOrderStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DiagnosticReportStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DigitalMediaTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DocumentModeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DocumentReferenceStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.DocumentRelationshipTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.EncounterClassEnum;
+import ca.uhn.fhir.model.dstu2.valueset.EncounterLocationStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.EncounterStateEnum;
+import ca.uhn.fhir.model.dstu2.valueset.EpisodeOfCareStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.EventTimingEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ExtensionContextEnum;
+import ca.uhn.fhir.model.dstu2.valueset.FamilyHistoryStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.FilterOperatorEnum;
+import ca.uhn.fhir.model.dstu2.valueset.FlagStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.GoalPriorityEnum;
+import ca.uhn.fhir.model.dstu2.valueset.GoalStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.GroupTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.GuideDependencyTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.GuidePageKindEnum;
+import ca.uhn.fhir.model.dstu2.valueset.GuideResourcePurposeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.HTTPVerbEnum;
+import ca.uhn.fhir.model.dstu2.valueset.IdentifierTypeCodesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.IdentifierUseEnum;
+import ca.uhn.fhir.model.dstu2.valueset.IdentityAssuranceLevelEnum;
+import ca.uhn.fhir.model.dstu2.valueset.InstanceAvailabilityEnum;
+import ca.uhn.fhir.model.dstu2.valueset.IssueSeverityEnum;
+import ca.uhn.fhir.model.dstu2.valueset.IssueTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.KOStitleEnum;
+import ca.uhn.fhir.model.dstu2.valueset.LinkTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ListModeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ListOrderCodesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ListStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.LocationModeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.LocationStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.LocationTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.MaritalStatusCodesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.MeasmntPrincipleEnum;
+import ca.uhn.fhir.model.dstu2.valueset.MedicationAdministrationStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.MedicationDispenseStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.MedicationOrderStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.MedicationStatementStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.MessageEventEnum;
+import ca.uhn.fhir.model.dstu2.valueset.MessageSignificanceCategoryEnum;
+import ca.uhn.fhir.model.dstu2.valueset.MessageTransportEnum;
+import ca.uhn.fhir.model.dstu2.valueset.NameUseEnum;
+import ca.uhn.fhir.model.dstu2.valueset.NamingSystemIdentifierTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.NamingSystemTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.NarrativeStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.NoteTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.NutritionOrderStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ObservationRelationshipTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ObservationStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.OperationKindEnum;
+import ca.uhn.fhir.model.dstu2.valueset.OperationParameterUseEnum;
+import ca.uhn.fhir.model.dstu2.valueset.OrderStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ParticipantRequiredEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ParticipantStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ParticipantTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ParticipationStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.PayeeTypeCodesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ProcedureRequestPriorityEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ProcedureRequestStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ProcedureStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.PropertyRepresentationEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ProvenanceEntityRoleEnum;
+import ca.uhn.fhir.model.dstu2.valueset.QuantityComparatorEnum;
+import ca.uhn.fhir.model.dstu2.valueset.QuestionnaireResponseStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.QuestionnaireStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ReferralMethodEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ReferralStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.RemittanceOutcomeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ResourceTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ResourceVersionPolicyEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ResponseTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.RestfulConformanceModeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.RestfulSecurityServiceEnum;
+import ca.uhn.fhir.model.dstu2.valueset.RulesetCodesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.SearchEntryModeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.SearchModifierCodeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.SearchParamTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.ServiceProvisionConditionsEnum;
+import ca.uhn.fhir.model.dstu2.valueset.SignatureTypeCodesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.SlicingRulesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.SlotStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.SpecimenStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.StructureDefinitionKindEnum;
+import ca.uhn.fhir.model.dstu2.valueset.SubscriptionChannelTypeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.SubscriptionStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.SubstanceCategoryCodesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.SupplyDeliveryStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.SupplyRequestStatusEnum;
+import ca.uhn.fhir.model.dstu2.valueset.SystemRestfulInteractionEnum;
+import ca.uhn.fhir.model.dstu2.valueset.TimingAbbreviationEnum;
+import ca.uhn.fhir.model.dstu2.valueset.TransactionModeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.TypeRestfulInteractionEnum;
+import ca.uhn.fhir.model.dstu2.valueset.UnitsOfTimeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.UnknownContentCodeEnum;
+import ca.uhn.fhir.model.dstu2.valueset.UseEnum;
+import ca.uhn.fhir.model.dstu2.valueset.VisionBaseEnum;
+import ca.uhn.fhir.model.dstu2.valueset.VisionEyesEnum;
+import ca.uhn.fhir.model.dstu2.valueset.XPathUsageTypeEnum;
+import io.quarkus.arc.deployment.BeanContainerBuildItem;
+import io.quarkus.deployment.annotations.BuildProducer;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
+import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import org.apache.camel.quarkus.component.fhir.FhirContextRecorder;
+import org.apache.camel.quarkus.component.fhir.FhirFlags;
+
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.getModelClasses;
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.getResourceDefinitions;
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.loadProperties;
+
+public class FhirDstu2Processor {
+
+    @BuildStep(onlyIf = FhirFlags.Dstu2Enabled.class)
+    Dstu2PropertiesBuildItem properties(BuildProducer<NativeImageResourceBuildItem> resource) {
+        Properties properties = loadProperties("/ca/uhn/fhir/model/dstu2/fhirversion.properties");
+        resource.produce(new NativeImageResourceBuildItem("ca/uhn/fhir/model/dstu2/fhirversion.properties"));
+        return new Dstu2PropertiesBuildItem(properties);
+    }
+
+    @BuildStep(onlyIf = FhirFlags.Dstu2Enabled.class)
+    @Record(ExecutionTime.STATIC_INIT)
+    void recordContext(FhirContextRecorder fhirContextRecorder, BeanContainerBuildItem beanContainer,
+            Dstu2PropertiesBuildItem propertiesBuildItem) {
+        fhirContextRecorder.createDstu2FhirContext(beanContainer.getValue(),
+                getResourceDefinitions(propertiesBuildItem.getProperties()));
+    }
+
+    @BuildStep(onlyIf = FhirFlags.Dstu2Enabled.class)
+    void enableReflection(BuildProducer<ReflectiveClassBuildItem> reflectiveClass, Dstu2PropertiesBuildItem buildItem) {
+        Set<String> classes = new HashSet<>();
+        classes.add(BaseResource.class.getCanonicalName());
+        classes.addAll(getModelClasses(buildItem.getProperties()));
+
+        reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, classes.toArray(new String[0])));
+        reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, getDstu2Enums()));
+    }
+
+    private String[] getDstu2Enums() {
+        return new String[] {
+                AccountStatusEnum.class.getCanonicalName(),
+                ActionListEnum.class.getCanonicalName(),
+                AddressTypeEnum.class.getCanonicalName(),
+                AddressUseEnum.class.getCanonicalName(),
+                AdjudicationCodesEnum.class.getCanonicalName(),
+                AdjudicationErrorCodesEnum.class.getCanonicalName(),
+                AdjustmentReasonCodesEnum.class.getCanonicalName(),
+                AdministrativeGenderEnum.class.getCanonicalName(),
+                AdmitSourceEnum.class.getCanonicalName(),
+                AggregationModeEnum.class.getCanonicalName(),
+                AllergyIntoleranceCategoryEnum.class.getCanonicalName(),
+                AllergyIntoleranceCertaintyEnum.class.getCanonicalName(),
+                AllergyIntoleranceCriticalityEnum.class.getCanonicalName(),
+                AllergyIntoleranceSeverityEnum.class.getCanonicalName(),
+                AllergyIntoleranceStatusEnum.class.getCanonicalName(),
+                AllergyIntoleranceTypeEnum.class.getCanonicalName(),
+                AnswerFormatEnum.class.getCanonicalName(),
+                AppointmentStatusEnum.class.getCanonicalName(),
+                AssertionDirectionTypeEnum.class.getCanonicalName(),
+                AssertionOperatorTypeEnum.class.getCanonicalName(),
+                AssertionResponseTypesEnum.class.getCanonicalName(),
+                AuditEventActionEnum.class.getCanonicalName(),
+                AuditEventObjectLifecycleEnum.class.getCanonicalName(),
+                AuditEventObjectRoleEnum.class.getCanonicalName(),
+                AuditEventObjectTypeEnum.class.getCanonicalName(),
+                AuditEventOutcomeEnum.class.getCanonicalName(),
+                AuditEventParticipantNetworkTypeEnum.class.getCanonicalName(),
+                AuditEventSourceTypeEnum.class.getCanonicalName(),
+                BindingStrengthEnum.class.getCanonicalName(),
+                BundleTypeEnum.class.getCanonicalName(),
+                CarePlanActivityStatusEnum.class.getCanonicalName(),
+                CarePlanRelationshipEnum.class.getCanonicalName(),
+                CarePlanStatusEnum.class.getCanonicalName(),
+                ClaimTypeEnum.class.getCanonicalName(),
+                ClinicalImpressionStatusEnum.class.getCanonicalName(),
+                CommunicationRequestStatusEnum.class.getCanonicalName(),
+                CommunicationStatusEnum.class.getCanonicalName(),
+                CompositionAttestationModeEnum.class.getCanonicalName(),
+                CompositionStatusEnum.class.getCanonicalName(),
+                ConceptMapEquivalenceEnum.class.getCanonicalName(),
+                ConditionalDeleteStatusEnum.class.getCanonicalName(),
+                ConditionCategoryCodesEnum.class.getCanonicalName(),
+                ConditionClinicalStatusCodesEnum.class.getCanonicalName(),
+                ConditionVerificationStatusEnum.class.getCanonicalName(),
+                ConformanceEventModeEnum.class.getCanonicalName(),
+                ConformanceResourceStatusEnum.class.getCanonicalName(),
+                ConformanceStatementKindEnum.class.getCanonicalName(),
+                ConstraintSeverityEnum.class.getCanonicalName(),
+                ContactPointSystemEnum.class.getCanonicalName(),
+                ContactPointUseEnum.class.getCanonicalName(),
+                ContentTypeEnum.class.getCanonicalName(),
+                DataElementStringencyEnum.class.getCanonicalName(),
+                DaysOfWeekEnum.class.getCanonicalName(),
+                DetectedIssueSeverityEnum.class.getCanonicalName(),
+                DeviceMetricCalibrationStateEnum.class.getCanonicalName(),
+                DeviceMetricCalibrationTypeEnum.class.getCanonicalName(),
+                DeviceMetricCategoryEnum.class.getCanonicalName(),
+                DeviceMetricColorEnum.class.getCanonicalName(),
+                DeviceMetricOperationalStatusEnum.class.getCanonicalName(),
+                DeviceStatusEnum.class.getCanonicalName(),
+                DeviceUseRequestPriorityEnum.class.getCanonicalName(),
+                DeviceUseRequestStatusEnum.class.getCanonicalName(),
+                DiagnosticOrderPriorityEnum.class.getCanonicalName(),
+                DiagnosticOrderStatusEnum.class.getCanonicalName(),
+                DiagnosticReportStatusEnum.class.getCanonicalName(),
+                DigitalMediaTypeEnum.class.getCanonicalName(),
+                DocumentModeEnum.class.getCanonicalName(),
+                DocumentReferenceStatusEnum.class.getCanonicalName(),
+                DocumentRelationshipTypeEnum.class.getCanonicalName(),
+                EncounterClassEnum.class.getCanonicalName(),
+                EncounterLocationStatusEnum.class.getCanonicalName(),
+                EncounterStateEnum.class.getCanonicalName(),
+                EpisodeOfCareStatusEnum.class.getCanonicalName(),
+                EventTimingEnum.class.getCanonicalName(),
+                ExtensionContextEnum.class.getCanonicalName(),
+                FamilyHistoryStatusEnum.class.getCanonicalName(),
+                FilterOperatorEnum.class.getCanonicalName(),
+                FlagStatusEnum.class.getCanonicalName(),
+                GoalPriorityEnum.class.getCanonicalName(),
+                GoalStatusEnum.class.getCanonicalName(),
+                GroupTypeEnum.class.getCanonicalName(),
+                GuideDependencyTypeEnum.class.getCanonicalName(),
+                GuidePageKindEnum.class.getCanonicalName(),
+                GuideResourcePurposeEnum.class.getCanonicalName(),
+                HTTPVerbEnum.class.getCanonicalName(),
+                IdentifierTypeCodesEnum.class.getCanonicalName(),
+                IdentifierUseEnum.class.getCanonicalName(),
+                IdentityAssuranceLevelEnum.class.getCanonicalName(),
+                InstanceAvailabilityEnum.class.getCanonicalName(),
+                IssueSeverityEnum.class.getCanonicalName(),
+                IssueTypeEnum.class.getCanonicalName(),
+                KOStitleEnum.class.getCanonicalName(),
+                LinkTypeEnum.class.getCanonicalName(),
+                ListModeEnum.class.getCanonicalName(),
+                ListOrderCodesEnum.class.getCanonicalName(),
+                ListStatusEnum.class.getCanonicalName(),
+                LocationModeEnum.class.getCanonicalName(),
+                LocationStatusEnum.class.getCanonicalName(),
+                LocationTypeEnum.class.getCanonicalName(),
+                MaritalStatusCodesEnum.class.getCanonicalName(),
+                MeasmntPrincipleEnum.class.getCanonicalName(),
+                MedicationAdministrationStatusEnum.class.getCanonicalName(),
+                MedicationDispenseStatusEnum.class.getCanonicalName(),
+                MedicationOrderStatusEnum.class.getCanonicalName(),
+                MedicationStatementStatusEnum.class.getCanonicalName(),
+                MessageEventEnum.class.getCanonicalName(),
+                MessageSignificanceCategoryEnum.class.getCanonicalName(),
+                MessageTransportEnum.class.getCanonicalName(),
+                NameUseEnum.class.getCanonicalName(),
+                NamingSystemIdentifierTypeEnum.class.getCanonicalName(),
+                NamingSystemTypeEnum.class.getCanonicalName(),
+                NarrativeStatusEnum.class.getCanonicalName(),
+                NoteTypeEnum.class.getCanonicalName(),
+                NutritionOrderStatusEnum.class.getCanonicalName(),
+                ObservationRelationshipTypeEnum.class.getCanonicalName(),
+                ObservationStatusEnum.class.getCanonicalName(),
+                OperationKindEnum.class.getCanonicalName(),
+                OperationParameterUseEnum.class.getCanonicalName(),
+                OrderStatusEnum.class.getCanonicalName(),
+                ParticipantRequiredEnum.class.getCanonicalName(),
+                ParticipantStatusEnum.class.getCanonicalName(),
+                ParticipantTypeEnum.class.getCanonicalName(),
+                ParticipationStatusEnum.class.getCanonicalName(),
+                PayeeTypeCodesEnum.class.getCanonicalName(),
+                ProcedureRequestPriorityEnum.class.getCanonicalName(),
+                ProcedureRequestStatusEnum.class.getCanonicalName(),
+                ProcedureStatusEnum.class.getCanonicalName(),
+                PropertyRepresentationEnum.class.getCanonicalName(),
+                ProvenanceEntityRoleEnum.class.getCanonicalName(),
+                QuantityComparatorEnum.class.getCanonicalName(),
+                QuestionnaireResponseStatusEnum.class.getCanonicalName(),
+                QuestionnaireStatusEnum.class.getCanonicalName(),
+                ReferralMethodEnum.class.getCanonicalName(),
+                ReferralStatusEnum.class.getCanonicalName(),
+                RemittanceOutcomeEnum.class.getCanonicalName(),
+                ResourceTypeEnum.class.getCanonicalName(),
+                ResourceVersionPolicyEnum.class.getCanonicalName(),
+                ResponseTypeEnum.class.getCanonicalName(),
+                RestfulConformanceModeEnum.class.getCanonicalName(),
+                RestfulSecurityServiceEnum.class.getCanonicalName(),
+                RulesetCodesEnum.class.getCanonicalName(),
+                SearchEntryModeEnum.class.getCanonicalName(),
+                SearchModifierCodeEnum.class.getCanonicalName(),
+                SearchParamTypeEnum.class.getCanonicalName(),
+                ServiceProvisionConditionsEnum.class.getCanonicalName(),
+                SignatureTypeCodesEnum.class.getCanonicalName(),
+                SlicingRulesEnum.class.getCanonicalName(),
+                SlotStatusEnum.class.getCanonicalName(),
+                SpecimenStatusEnum.class.getCanonicalName(),
+                StructureDefinitionKindEnum.class.getCanonicalName(),
+                SubscriptionChannelTypeEnum.class.getCanonicalName(),
+                SubscriptionStatusEnum.class.getCanonicalName(),
+                SubstanceCategoryCodesEnum.class.getCanonicalName(),
+                SupplyDeliveryStatusEnum.class.getCanonicalName(),
+                SupplyRequestStatusEnum.class.getCanonicalName(),
+                SystemRestfulInteractionEnum.class.getCanonicalName(),
+                TimingAbbreviationEnum.class.getCanonicalName(),
+                TransactionModeEnum.class.getCanonicalName(),
+                TypeRestfulInteractionEnum.class.getCanonicalName(),
+                UnitsOfTimeEnum.class.getCanonicalName(),
+                UnknownContentCodeEnum.class.getCanonicalName(),
+                UseEnum.class.getCanonicalName(),
+                VisionBaseEnum.class.getCanonicalName(),
+                VisionEyesEnum.class.getCanonicalName(),
+                XPathUsageTypeEnum.class.getCanonicalName()
+        };
+    }
+
+}
diff --git a/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/dstu3/Dstu3PropertiesBuildItem.java b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/dstu3/Dstu3PropertiesBuildItem.java
new file mode 100644
index 0000000..0b0b1e6
--- /dev/null
+++ b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/dstu3/Dstu3PropertiesBuildItem.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.fhir.deployment.dstu3;
+
+import java.util.Properties;
+
+import io.quarkus.builder.item.SimpleBuildItem;
+
+public final class Dstu3PropertiesBuildItem extends SimpleBuildItem {
+
+    private final Properties properties;
+
+    public Dstu3PropertiesBuildItem(Properties properties) {
+        this.properties = properties;
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+}
diff --git a/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/dstu3/FhirDstu3Processor.java b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/dstu3/FhirDstu3Processor.java
new file mode 100644
index 0000000..c47e704
--- /dev/null
+++ b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/dstu3/FhirDstu3Processor.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.fhir.deployment.dstu3;
+
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.Set;
+
+import io.quarkus.arc.deployment.BeanContainerBuildItem;
+import io.quarkus.deployment.annotations.BuildProducer;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
+import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import org.apache.camel.quarkus.component.fhir.FhirContextRecorder;
+import org.apache.camel.quarkus.component.fhir.FhirFlags;
+import org.hl7.fhir.dstu3.model.Base;
+import org.hl7.fhir.dstu3.model.DomainResource;
+import org.hl7.fhir.dstu3.model.Enumerations;
+import org.hl7.fhir.dstu3.model.Meta;
+import org.hl7.fhir.dstu3.model.MetadataResource;
+import org.hl7.fhir.dstu3.model.Resource;
+
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.getInnerClasses;
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.getModelClasses;
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.getResourceDefinitions;
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.loadProperties;
+
+public class FhirDstu3Processor {
+
+    @BuildStep(onlyIf = FhirFlags.Dstu3Enabled.class)
+    Dstu3PropertiesBuildItem properties(BuildProducer<NativeImageResourceBuildItem> resource) {
+        Properties properties = loadProperties("/org/hl7/fhir/dstu3/model/fhirversion.properties");
+        resource.produce(new NativeImageResourceBuildItem("org/hl7/fhir/dstu3/model/fhirversion.properties"));
+        return new Dstu3PropertiesBuildItem(properties);
+    }
+
+    @BuildStep(onlyIf = FhirFlags.Dstu3Enabled.class)
+    @Record(ExecutionTime.STATIC_INIT)
+    void recordContext(FhirContextRecorder fhirContextRecorder, BeanContainerBuildItem beanContainer,
+            Dstu3PropertiesBuildItem propertiesBuildItem) {
+        fhirContextRecorder.createDstu3FhirContext(beanContainer.getValue(),
+                getResourceDefinitions(propertiesBuildItem.getProperties()));
+    }
+
+    @BuildStep(onlyIf = FhirFlags.Dstu3Enabled.class)
+    void enableReflection(BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
+            Dstu3PropertiesBuildItem propertiesBuildItem) {
+        Set<String> classes = new HashSet<>();
+        classes.add(DomainResource.class.getCanonicalName());
+        classes.add(Resource.class.getCanonicalName());
+        classes.add(org.hl7.fhir.dstu3.model.BaseResource.class.getCanonicalName());
+        classes.add(Base.class.getCanonicalName());
+        classes.addAll(getModelClasses(propertiesBuildItem.getProperties()));
+        classes.addAll(getInnerClasses(Enumerations.class.getCanonicalName()));
+        reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, true, Meta.class.getCanonicalName()));
+        reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, true, MetadataResource.class.getCanonicalName()));
+        reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, classes.toArray(new String[0])));
+    }
+}
diff --git a/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/r4/FhirR4Processor.java b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/r4/FhirR4Processor.java
new file mode 100644
index 0000000..2e331da
--- /dev/null
+++ b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/r4/FhirR4Processor.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.fhir.deployment.r4;
+
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.Set;
+
+import io.quarkus.arc.deployment.BeanContainerBuildItem;
+import io.quarkus.deployment.annotations.BuildProducer;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
+import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import org.apache.camel.quarkus.component.fhir.FhirContextRecorder;
+import org.apache.camel.quarkus.component.fhir.FhirFlags;
+
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.getInnerClasses;
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.getModelClasses;
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.getResourceDefinitions;
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.loadProperties;
+
+public class FhirR4Processor {
+
+    @BuildStep(onlyIf = FhirFlags.R4Enabled.class)
+    R4PropertiesBuildItem properties(BuildProducer<NativeImageResourceBuildItem> resource) {
+        resource.produce(new NativeImageResourceBuildItem("org/hl7/fhir/r4/model/fhirversion.properties"));
+        Properties properties = loadProperties("/org/hl7/fhir/r4/model/fhirversion.properties");
+        return new R4PropertiesBuildItem(properties);
+    }
+
+    @BuildStep(onlyIf = FhirFlags.R4Enabled.class)
+    @Record(ExecutionTime.STATIC_INIT)
+    void recordContext(FhirContextRecorder fhirContextRecorder, BeanContainerBuildItem beanContainer,
+            R4PropertiesBuildItem propertiesBuildItem) {
+        fhirContextRecorder.createR4FhirContext(beanContainer.getValue(),
+                getResourceDefinitions(propertiesBuildItem.getProperties()));
+    }
+
+    @BuildStep(onlyIf = FhirFlags.R4Enabled.class)
+    void enableReflection(BuildProducer<ReflectiveClassBuildItem> reflectiveClass, R4PropertiesBuildItem buildItem) {
+        Set<String> classes = new HashSet<>();
+        classes.add(org.hl7.fhir.r4.model.DomainResource.class.getCanonicalName());
+        classes.add(org.hl7.fhir.r4.model.Resource.class.getCanonicalName());
+        classes.add(org.hl7.fhir.r4.model.BaseResource.class.getCanonicalName());
+        classes.add(org.hl7.fhir.r4.model.Base.class.getCanonicalName());
+        classes.addAll(getModelClasses(buildItem.getProperties()));
+        classes.addAll(getInnerClasses(org.hl7.fhir.r4.model.Enumerations.class.getCanonicalName()));
+        reflectiveClass
+                .produce(new ReflectiveClassBuildItem(true, true, true, org.hl7.fhir.r4.model.Meta.class.getCanonicalName()));
+        reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, true,
+                org.hl7.fhir.r4.model.MetadataResource.class.getCanonicalName()));
+        reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, classes.toArray(new String[0])));
+    }
+}
diff --git a/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/r4/R4PropertiesBuildItem.java b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/r4/R4PropertiesBuildItem.java
new file mode 100644
index 0000000..691cc50
--- /dev/null
+++ b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/r4/R4PropertiesBuildItem.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.fhir.deployment.r4;
+
+import java.util.Properties;
+
+import io.quarkus.builder.item.SimpleBuildItem;
+
+public final class R4PropertiesBuildItem extends SimpleBuildItem {
+
+    private final Properties properties;
+
+    public R4PropertiesBuildItem(Properties properties) {
+        this.properties = properties;
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+}
diff --git a/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/r5/FhirR5Processor.java b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/r5/FhirR5Processor.java
new file mode 100644
index 0000000..6e2b062
--- /dev/null
+++ b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/r5/FhirR5Processor.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.fhir.deployment.r5;
+
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.Set;
+
+import io.quarkus.arc.deployment.BeanContainerBuildItem;
+import io.quarkus.deployment.annotations.BuildProducer;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
+import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import org.apache.camel.quarkus.component.fhir.FhirContextRecorder;
+import org.apache.camel.quarkus.component.fhir.FhirFlags;
+
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.getInnerClasses;
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.getModelClasses;
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.getResourceDefinitions;
+import static org.apache.camel.quarkus.component.fhir.deployment.FhirUtil.loadProperties;
+
+public class FhirR5Processor {
+
+    @BuildStep(onlyIf = FhirFlags.R5Enabled.class)
+    R5PropertiesBuildItem properties(BuildProducer<NativeImageResourceBuildItem> resource) {
+        resource.produce(new NativeImageResourceBuildItem("org/hl7/fhir/r5/model/fhirversion.properties"));
+        Properties properties = loadProperties("/org/hl7/fhir/r5/model/fhirversion.properties");
+        return new R5PropertiesBuildItem(properties);
+    }
+
+    @BuildStep(onlyIf = FhirFlags.R5Enabled.class)
+    @Record(ExecutionTime.STATIC_INIT)
+    void recordContext(FhirContextRecorder fhirContextRecorder, BeanContainerBuildItem beanContainer,
+            R5PropertiesBuildItem propertiesBuildItem) {
+        fhirContextRecorder.createR5FhirContext(beanContainer.getValue(),
+                getResourceDefinitions(propertiesBuildItem.getProperties()));
+    }
+
+    @BuildStep(onlyIf = FhirFlags.R5Enabled.class)
+    void enableReflection(BuildProducer<ReflectiveClassBuildItem> reflectiveClass, R5PropertiesBuildItem buildItem) {
+        Set<String> classes = new HashSet<>();
+        classes.add(org.hl7.fhir.r5.model.DomainResource.class.getCanonicalName());
+        classes.add(org.hl7.fhir.r5.model.Resource.class.getCanonicalName());
+        classes.add(org.hl7.fhir.r5.model.BaseResource.class.getCanonicalName());
+        classes.add(org.hl7.fhir.r5.model.Base.class.getCanonicalName());
+        classes.addAll(getModelClasses(buildItem.getProperties()));
+        classes.addAll(getInnerClasses(org.hl7.fhir.r5.model.Enumerations.class.getCanonicalName()));
+        reflectiveClass
+                .produce(new ReflectiveClassBuildItem(true, true, true, org.hl7.fhir.r5.model.Meta.class.getCanonicalName()));
+        reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, true,
+                org.hl7.fhir.r5.model.MetadataResource.class.getCanonicalName()));
+        reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, classes.toArray(new String[0])));
+    }
+}
diff --git a/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/r5/R5PropertiesBuildItem.java b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/r5/R5PropertiesBuildItem.java
new file mode 100644
index 0000000..4a2242c
--- /dev/null
+++ b/extensions/fhir/deployment/src/main/java/org/apache/camel/quarkus/component/fhir/deployment/r5/R5PropertiesBuildItem.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.fhir.deployment.r5;
+
+import java.util.Properties;
+
+import io.quarkus.builder.item.SimpleBuildItem;
+
+public final class R5PropertiesBuildItem extends SimpleBuildItem {
+
+    private final Properties properties;
+
+    public R5PropertiesBuildItem(Properties properties) {
+        this.properties = properties;
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+}
diff --git a/extensions/fhir/runtime/pom.xml b/extensions/fhir/runtime/pom.xml
index a531379..4733e57 100644
--- a/extensions/fhir/runtime/pom.xml
+++ b/extensions/fhir/runtime/pom.xml
@@ -52,17 +52,13 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-core-xml</artifactId>
+            <artifactId>camel-quarkus-support-xml</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-support-commons-logging</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-fhir</artifactId>
-        </dependency>
-        <dependency>
             <groupId>org.jboss.spec.javax.xml.bind</groupId>
             <artifactId>jboss-jaxb-api_2.3_spec</artifactId>
         </dependency>
@@ -71,6 +67,10 @@
             <artifactId>svm</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-fhir</artifactId>
+        </dependency>
+        <dependency>
             <groupId>ca.uhn.hapi.fhir</groupId>
             <artifactId>hapi-fhir-server</artifactId>
             <exclusions>
diff --git a/extensions/fhir/runtime/src/main/java/org/apache/camel/quarkus/component/fhir/FhirContextProducers.java b/extensions/fhir/runtime/src/main/java/org/apache/camel/quarkus/component/fhir/FhirContextProducers.java
new file mode 100644
index 0000000..69d133b
--- /dev/null
+++ b/extensions/fhir/runtime/src/main/java/org/apache/camel/quarkus/component/fhir/FhirContextProducers.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.fhir;
+
+import javax.enterprise.inject.Produces;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import ca.uhn.fhir.context.FhirContext;
+
+@Singleton
+public class FhirContextProducers {
+
+    private volatile FhirContext dstu2;
+    private volatile FhirContext dstu3;
+    private volatile FhirContext r4;
+    private volatile FhirContext r5;
+
+    public void setDstu2(FhirContext dstu2) {
+        this.dstu2 = dstu2;
+    }
+
+    public void setDstu3(FhirContext dstu3) {
+        this.dstu3 = dstu3;
+    }
+
+    public void setR4(FhirContext r4) {
+        this.r4 = r4;
+    }
+
+    public void setR5(FhirContext r5) {
+        this.r5 = r5;
+    }
+
+    @Singleton
+    @Produces
+    @Named("DSTU2")
+    FhirContext dstu2() {
+        return this.dstu2;
+    }
+
+    @Singleton
+    @Produces
+    @Named("DSTU3")
+    FhirContext dstu3() {
+        return this.dstu3;
+    }
+
+    @Singleton
+    @Produces
+    @Named("R4")
+    FhirContext r4() {
+        return this.r4;
+    }
+
+    @Singleton
+    @Produces
+    @Named("R5")
+    FhirContext r5() {
+        return this.r5;
+    }
+}
diff --git a/extensions/fhir/runtime/src/main/java/org/apache/camel/quarkus/component/fhir/FhirContextRecorder.java b/extensions/fhir/runtime/src/main/java/org/apache/camel/quarkus/component/fhir/FhirContextRecorder.java
new file mode 100644
index 0000000..93b9d5e
--- /dev/null
+++ b/extensions/fhir/runtime/src/main/java/org/apache/camel/quarkus/component/fhir/FhirContextRecorder.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.fhir;
+
+import java.util.Collection;
+
+import ca.uhn.fhir.context.FhirContext;
+import io.quarkus.arc.runtime.BeanContainer;
+import io.quarkus.runtime.RuntimeValue;
+import io.quarkus.runtime.annotations.Recorder;
+
+@Recorder
+public class FhirContextRecorder {
+
+    public RuntimeValue<FhirContext> createDstu2FhirContext(BeanContainer container, Collection<String> resourceDefinitions) {
+        FhirContext fhirContext = FhirContext.forDstu2();
+        initContext(resourceDefinitions, fhirContext);
+        container.instance(FhirContextProducers.class).setDstu2(fhirContext);
+        return new RuntimeValue<>(fhirContext);
+    }
+
+    public RuntimeValue<FhirContext> createDstu3FhirContext(BeanContainer container, Collection<String> resourceDefinitions) {
+        FhirContext fhirContext = FhirContext.forDstu3();
+        initContext(resourceDefinitions, fhirContext);
+        container.instance(FhirContextProducers.class).setDstu3(fhirContext);
+        return new RuntimeValue<>(fhirContext);
+    }
+
+    public RuntimeValue<FhirContext> createR4FhirContext(BeanContainer container, Collection<String> resourceDefinitions) {
+        FhirContext fhirContext = FhirContext.forR4();
+        initContext(resourceDefinitions, fhirContext);
+        container.instance(FhirContextProducers.class).setR4(fhirContext);
+        return new RuntimeValue<>(fhirContext);
+    }
+
+    public RuntimeValue<FhirContext> createR5FhirContext(BeanContainer container, Collection<String> resourceDefinitions) {
+        FhirContext fhirContext = FhirContext.forR5();
+        initContext(resourceDefinitions, fhirContext);
+        container.instance(FhirContextProducers.class).setR5(fhirContext);
+        return new RuntimeValue<>(fhirContext);
+    }
+
+    private void initContext(Collection<String> resourceDefinitions, FhirContext fhirContext) {
+        // force init
+        fhirContext.getElementDefinitions();
+        for (String resourceDefinition : resourceDefinitions) {
+            fhirContext.getResourceDefinition(resourceDefinition);
+        }
+    }
+}
diff --git a/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirDstu2RouteBuilder.java b/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirDstu2RouteBuilder.java
index 089b3bd..6793907 100644
--- a/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirDstu2RouteBuilder.java
+++ b/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirDstu2RouteBuilder.java
@@ -16,33 +16,37 @@
  */
 package org.apache.camel.quarkus.component.fhir.it;
 
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+
 import ca.uhn.fhir.context.FhirContext;
-import ca.uhn.fhir.context.FhirVersionEnum;
 import ca.uhn.fhir.parser.StrictErrorHandler;
-import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.fhir.FhirJsonDataFormat;
 import org.apache.camel.component.fhir.FhirXmlDataFormat;
 import org.apache.camel.quarkus.component.fhir.FhirFlags;
 
+@ApplicationScoped
 public class FhirDstu2RouteBuilder extends RouteBuilder {
 
     private static final Boolean ENABLED = new FhirFlags.Dstu2Enabled().getAsBoolean();
 
+    @Inject
+    @Named("DSTU2")
+    FhirContext fhirContext;
+
     @Override
     public void configure() {
         if (ENABLED) {
-            CamelContext context = getContext();
-            FhirContext fhirContext = FhirContext.forDstu2();
             fhirContext.setParserErrorHandler(new StrictErrorHandler());
-            context.getRegistry().bind("fhirContext", fhirContext);
 
             FhirJsonDataFormat fhirJsonDataFormat = new FhirJsonDataFormat();
-            fhirJsonDataFormat.setFhirVersion(FhirVersionEnum.DSTU2.name());
+            fhirJsonDataFormat.setFhirContext(fhirContext);
             fhirJsonDataFormat.setParserErrorHandler(new StrictErrorHandler());
 
             FhirXmlDataFormat fhirXmlDataFormat = new FhirXmlDataFormat();
-            fhirXmlDataFormat.setFhirVersion(FhirVersionEnum.DSTU2.name());
+            fhirXmlDataFormat.setFhirContext(fhirContext);
             fhirXmlDataFormat.setParserErrorHandler(new StrictErrorHandler());
 
             from("direct:json-to-dstu2")
@@ -54,7 +58,7 @@ public class FhirDstu2RouteBuilder extends RouteBuilder {
                     .marshal(fhirXmlDataFormat);
 
             from("direct:create-dstu2")
-                    .to("fhir://create/resource?inBody=resourceAsString&fhirVersion=DSTU2&fhirContext=#fhirContext");
+                    .to("fhir://create/resource?inBody=resourceAsString&fhirContext=#DSTU2");
         }
     }
 }
diff --git a/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirDstu3RouteBuilder.java b/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirDstu3RouteBuilder.java
index a6496ef..9ec816c 100644
--- a/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirDstu3RouteBuilder.java
+++ b/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirDstu3RouteBuilder.java
@@ -16,33 +16,36 @@
  */
 package org.apache.camel.quarkus.component.fhir.it;
 
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+
 import ca.uhn.fhir.context.FhirContext;
-import ca.uhn.fhir.context.FhirVersionEnum;
 import ca.uhn.fhir.parser.StrictErrorHandler;
-import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.fhir.FhirJsonDataFormat;
 import org.apache.camel.component.fhir.FhirXmlDataFormat;
 import org.apache.camel.quarkus.component.fhir.FhirFlags;
 
+@ApplicationScoped
 public class FhirDstu3RouteBuilder extends RouteBuilder {
 
     private static final Boolean ENABLED = new FhirFlags.Dstu3Enabled().getAsBoolean();
+    @Inject
+    @Named("DSTU3")
+    FhirContext fhirContext;
 
     @Override
     public void configure() {
         if (ENABLED) {
-            CamelContext context = getContext();
-            FhirContext fhirContext = FhirContext.forDstu3();
             fhirContext.setParserErrorHandler(new StrictErrorHandler());
-            context.getRegistry().bind("fhirContext", fhirContext);
 
             FhirJsonDataFormat fhirJsonDataFormat = new FhirJsonDataFormat();
-            fhirJsonDataFormat.setFhirVersion(FhirVersionEnum.DSTU3.name());
+            fhirJsonDataFormat.setFhirContext(fhirContext);
             fhirJsonDataFormat.setParserErrorHandler(new StrictErrorHandler());
 
             FhirXmlDataFormat fhirXmlDataFormat = new FhirXmlDataFormat();
-            fhirXmlDataFormat.setFhirVersion(FhirVersionEnum.DSTU3.name());
+            fhirXmlDataFormat.setFhirContext(fhirContext);
             fhirXmlDataFormat.setParserErrorHandler(new StrictErrorHandler());
 
             from("direct:json-to-dstu3")
@@ -54,7 +57,7 @@ public class FhirDstu3RouteBuilder extends RouteBuilder {
                     .marshal(fhirXmlDataFormat);
 
             from("direct:create-dstu3")
-                    .to("fhir://create/resource?inBody=resourceAsString&fhirVersion=DSTU3&fhirContext=#fhirContext");
+                    .to("fhir://create/resource?inBody=resourceAsString&fhirContext=#DSTU3");
         }
     }
 }
diff --git a/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirR4RouteBuilder.java b/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirR4RouteBuilder.java
index 422f551..adf728e 100644
--- a/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirR4RouteBuilder.java
+++ b/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirR4RouteBuilder.java
@@ -16,33 +16,37 @@
  */
 package org.apache.camel.quarkus.component.fhir.it;
 
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+
 import ca.uhn.fhir.context.FhirContext;
-import ca.uhn.fhir.context.FhirVersionEnum;
 import ca.uhn.fhir.parser.StrictErrorHandler;
-import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.fhir.FhirJsonDataFormat;
 import org.apache.camel.component.fhir.FhirXmlDataFormat;
 import org.apache.camel.quarkus.component.fhir.FhirFlags;
 
+@ApplicationScoped
 public class FhirR4RouteBuilder extends RouteBuilder {
 
     private static final Boolean ENABLED = new FhirFlags.R4Enabled().getAsBoolean();
 
+    @Inject
+    @Named("R4")
+    FhirContext fhirContext;
+
     @Override
     public void configure() {
         if (ENABLED) {
-            CamelContext context = getContext();
-            FhirContext fhirContext = FhirContext.forR4();
             fhirContext.setParserErrorHandler(new StrictErrorHandler());
-            context.getRegistry().bind("fhirContext", fhirContext);
 
             FhirJsonDataFormat fhirJsonDataFormat = new FhirJsonDataFormat();
-            fhirJsonDataFormat.setFhirVersion(FhirVersionEnum.R4.name());
+            fhirJsonDataFormat.setFhirContext(fhirContext);
             fhirJsonDataFormat.setParserErrorHandler(new StrictErrorHandler());
 
             FhirXmlDataFormat fhirXmlDataFormat = new FhirXmlDataFormat();
-            fhirXmlDataFormat.setFhirVersion(FhirVersionEnum.R4.name());
+            fhirXmlDataFormat.setFhirContext(fhirContext);
             fhirXmlDataFormat.setParserErrorHandler(new StrictErrorHandler());
 
             from("direct:json-to-r4")
@@ -54,7 +58,7 @@ public class FhirR4RouteBuilder extends RouteBuilder {
                     .marshal(fhirXmlDataFormat);
 
             from("direct:create-r4")
-                    .to("fhir://create/resource?inBody=resourceAsString&fhirVersion=R4&fhirContext=#fhirContext");
+                    .to("fhir://create/resource?inBody=resourceAsString&fhirContext=#R4");
         }
     }
 }
diff --git a/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirR5RouteBuilder.java b/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirR5RouteBuilder.java
index 4ffdab2..e8b44d4 100644
--- a/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirR5RouteBuilder.java
+++ b/integration-tests/fhir/src/main/java/org/apache/camel/quarkus/component/fhir/it/FhirR5RouteBuilder.java
@@ -16,33 +16,37 @@
  */
 package org.apache.camel.quarkus.component.fhir.it;
 
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+
 import ca.uhn.fhir.context.FhirContext;
-import ca.uhn.fhir.context.FhirVersionEnum;
 import ca.uhn.fhir.parser.StrictErrorHandler;
-import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.fhir.FhirJsonDataFormat;
 import org.apache.camel.component.fhir.FhirXmlDataFormat;
 import org.apache.camel.quarkus.component.fhir.FhirFlags;
 
+@ApplicationScoped
 public class FhirR5RouteBuilder extends RouteBuilder {
 
     private static final Boolean ENABLED = new FhirFlags.R5Enabled().getAsBoolean();
 
+    @Inject
+    @Named("R5")
+    FhirContext fhirContext;
+
     @Override
     public void configure() {
         if (ENABLED) {
-            CamelContext context = getContext();
-            FhirContext fhirContext = FhirContext.forR5();
             fhirContext.setParserErrorHandler(new StrictErrorHandler());
-            context.getRegistry().bind("fhirContext", fhirContext);
 
             FhirJsonDataFormat fhirJsonDataFormat = new FhirJsonDataFormat();
-            fhirJsonDataFormat.setFhirVersion(FhirVersionEnum.R5.name());
+            fhirJsonDataFormat.setFhirContext(fhirContext);
             fhirJsonDataFormat.setParserErrorHandler(new StrictErrorHandler());
 
             FhirXmlDataFormat fhirXmlDataFormat = new FhirXmlDataFormat();
-            fhirXmlDataFormat.setFhirVersion(FhirVersionEnum.R5.name());
+            fhirXmlDataFormat.setFhirContext(fhirContext);
             fhirXmlDataFormat.setParserErrorHandler(new StrictErrorHandler());
 
             from("direct:json-to-r5")
@@ -54,7 +58,7 @@ public class FhirR5RouteBuilder extends RouteBuilder {
                     .marshal(fhirXmlDataFormat);
 
             from("direct:create-r5")
-                    .to("fhir://create/resource?inBody=resourceAsString&fhirVersion=R5&fhirContext=#fhirContext");
+                    .to("fhir://create/resource?inBody=resourceAsString&fhirContext=#R5");
         }
     }
 }
diff --git a/integration-tests/fhir/src/main/resources/application.properties b/integration-tests/fhir/src/main/resources/application.properties
index 60b1243..6e39edb 100644
--- a/integration-tests/fhir/src/main/resources/application.properties
+++ b/integration-tests/fhir/src/main/resources/application.properties
@@ -37,3 +37,4 @@ quarkus.camel.fhir.enable-r5=false
 camel.component.fhir.configuration = #class:org.apache.camel.component.fhir.FhirConfiguration
 camel.component.fhir.configuration.log = false
 camel.component.fhir.configuration.server-url = {{camel.fhir.test-url}}
+camel.component.fhir.configuration.fhir-context = #bean:DSTU3