From 299cb2edf69c30ac4861f617752b4c56d8dbbb2a Mon Sep 17 00:00:00 2001
From: David Al-Kanani <david.al-kanani@regnosys.com>
Date: Mon, 6 Jan 2025 17:16:21 +0000
Subject: [PATCH] Story/1045/cdm serialization (#446)

* Added baseline tests for serialization

* add basic types

* add records

* add data types

* fix namespace name

* add enums

* add choice types

* correct choice wrapper attr name

* add extension tests

* add extended concrete type test

* rename test

* add meta scheme

* add meta key

* meta address

* fix address structure

* add extra element to structure

* fix formatting

* fix list test for scheme

* add first error handling test

* add number fraction test

* fix string length

* add illegal string tests

* too many elements test

* fix namespace

* rename serializer methods

* add extra field for polymorphic test

* make error handling test individual tests

* rename round trip test

* rename serializer

* revert changes

* fix reference attribute name

* remove generated code

* rename serializer implementation

* add object mapper initial

* add json handling code

* create a dynamic classloader for the in memory compile

* use correct rune annotations

* fix test

* fix group names

* fix metascheme test structures

* fix enumtypes test structures

* fix choicetype test structures

* fix address structure

* add licenses to code

* override RosettaModelConfiguration

* refactor injector

* add SerializationFeature.FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS to fix wrapped subtype handling

* fix meta tests

* bring in property ignorals code

* refactor ignorals so it doesn't override legacy method

* inject object mapper

* add top level meta

* add property ordering attempt which doesn't work atm

* reorder test properties

* add all ordered prop names

* fix location tests

* override ObjectWriter to add header fields

* put meta headers at top of json output

* rename mapper classes

* add javadoc

* remove dead code

* add javadoc and outline difficulty with property ordering

* rename package

* rename test package names

* clean up javadoc

* add license

* add javadoc

* remove redundant comment

* rename caps json

* rename mapper and writer

* remove top level serializer abstraction

* remove alphabetic ordering

* update dsl version

---------

Co-authored-by: Minesh Patel <minesh.patel@regnosys.com>
---
 common/pom.xml                                | 185 +++++++++++++++
 .../parser/InputValidationReport.java         |   0
 .../projector/ProjectionEnvironment.java      |   0
 .../granite/projector/ProjectionReport.java   |   0
 .../granite/projector/ProjectionService.java  |   0
 .../com/regnosys/rosetta/common/RegPaths.java |   0
 .../common/compile/CancelIndicator.java       |   0
 .../CompilationCancellationException.java     |   0
 .../compile/CompilationCompletionState.java   |   0
 .../CompilationTargetDeletionException.java   |   0
 .../JavaCSourceCancellableCompiler.java       |   0
 .../compile/JavaCancellableCompiler.java      |   0
 .../common/compile/JavaCompilationResult.java |   0
 .../compile/JavaCompileReleaseFlag.java       |   0
 .../common/hashing/GlobalKeyProcessStep.java  |   0
 .../common/hashing/IntegerHashGenerator.java  |   0
 .../rosetta/common/hashing/IntegerReport.java |   0
 .../common/hashing/NonNullHashCollector.java  |   0
 .../common/hashing/ReKeyProcessStep.java      |   0
 .../common/hashing/ReferenceConfig.java       |   0
 .../hashing/ReferenceResolverProcessStep.java |   0
 .../RosettaBasicTypesHashGenerator.java       |   0
 .../common/hashing/ScopeReferenceHelper.java  |   0
 .../merging/MergeTemplateProcessStep.java     |   0
 .../rosetta/common/merging/SimpleMerger.java  |   0
 .../common/merging/SimpleSplitter.java        |   0
 .../model/CachingMethodInterceptor.java       |   0
 .../common/model/FunctionMemoisingModule.java |   0
 .../model/FunctionMemoisingModuleBuilder.java |   0
 .../rosetta/common/model/MemoiseCacheKey.java |   0
 .../postprocess/WorkflowPostProcessor.java    |   0
 .../EmptyQualificationHandlerProvider.java    |   0
 .../qualify/QualificationHandler.java         |   0
 .../qualify/QualificationHandlerProvider.java |   0
 .../qualify/QualificationReport.java          |   0
 .../qualify/QualificationResult.java          |   0
 .../qualify/QualifyProcessorStep.java         |   0
 .../ProjectionDataItemExpectation.java        |   0
 .../ProjectionDataSetExpectation.java         |   0
 .../common/projection/RegProjectionPaths.java |   0
 .../common/reports/RegReportPaths.java        |   0
 .../reports/ReportDataItemExpectation.java    |   0
 .../reports/ReportDataSetExpectation.java     |   0
 .../rosetta/common/reports/ReportField.java   |   0
 .../serialisation/AbstractJsonDataLoader.java |   0
 ...wardsCompatibleAnnotationIntrospector.java |   0
 .../common/serialisation/BeanUtil.java        |   0
 .../ConstantAttributePropertyWriter.java      |   0
 .../common/serialisation/DataLoader.java      |   0
 .../rosetta/common/serialisation/DataSet.java |   0
 .../common/serialisation/InputDataLoader.java |   0
 .../serialisation/JsonDataLoaderUtil.java     |   0
 .../serialisation/ObjectMapperCreator.java    |   0
 .../RosettaDataValueObjectToString.java       |   0
 .../serialisation/RosettaObjectMapper.java    |   0
 .../RosettaObjectMapperCreator.java           |   0
 .../RosettaSerialiserException.java           |   0
 .../lookup/JsonLookupDataLoader.java          |   0
 .../serialisation/lookup/LookupDataItem.java  |   0
 .../serialisation/lookup/LookupDataSet.java   |   0
 .../serialisation/mixin/DateExtended.java     |   0
 .../EnumAsStringBuilderIntrospector.java      |   0
 .../serialisation/mixin/ReferenceFilter.java  |   0
 .../mixin/ReferenceWithMetaMixIn.java         |   0
 .../mixin/RosettaDateModule.java              |   0
 .../mixin/RosettaEnumBuilderIntrospector.java |   0
 .../RosettaJSONAnnotationIntrospector.java    |   0
 .../mixin/RosettaJSONModule.java              |   0
 .../legacy/LegacyGlobalKeyFieldsMixIn.java    |   0
 .../mixin/legacy/LegacyKeyMixIn.java          |   0
 .../mixin/legacy/LegacyReferenceMixIn.java    |   0
 .../LegacyRosettaBuilderIntrospector.java     |   0
 .../JsonProjectionDataLoader.java             |   0
 .../projectiondata/ProjectionDataSet.java     |   0
 .../reportdata/ExpectedResult.java            |   0
 .../reportdata/ExpectedResultField.java       |   0
 .../reportdata/JsonExpectedResultLoader.java  |   0
 .../reportdata/JsonReportDataLoader.java      |   0
 .../reportdata/ReportDataItem.java            |   0
 .../reportdata/ReportDataSet.java             |   0
 .../reportdata/ReportIdentifierDataSet.java   |   0
 .../xml/RosettaBeanDeserializerModifier.java  |   0
 .../xml/RosettaBeanSerializer.java            |   0
 .../xml/RosettaBeanSerializerModifier.java    |   0
 .../xml/RosettaSerialiserFactory.java         |   0
 .../xml/RosettaXMLAnnotationIntrospector.java |   0
 .../serialisation/xml/RosettaXMLModule.java   |   0
 .../xml/SubstitutedMethodProperty.java        |   0
 .../xml/SubstitutingBeanPropertyWriter.java   |   0
 .../serialisation/xml/SubstitutionMap.java    |   0
 .../xml/SubstitutionMapLoader.java            |   0
 .../xml/UnwrappableIndexedListSerializer.java |   0
 .../xml/UnwrappingAsArraySerializerBase.java  |   0
 .../xml/UnwrappingIndexedListSerializer.java  |   0
 .../xml/VirtualXMLAttribute.java              |   0
 .../common/testing/CoverageFraction.java      |   0
 .../common/testing/ExecutableFunction.java    |   0
 .../common/testing/ExecutionDescriptor.java   |   0
 .../common/testing/FunctionRunner.java        |   0
 .../common/testing/MappingCoverage.java       |   0
 .../common/transform/PipelineInfo.java        |   0
 .../common/transform/PipelineModel.java       |   0
 .../common/transform/TestPackModel.java       |   0
 .../common/transform/TestPackUtils.java       |   0
 .../common/transform/TransformType.java       |   0
 .../rosetta/common/translation/Mapping.java   |   0
 .../common/translation/MappingContext.java    |   0
 .../common/translation/MappingDelegate.java   |   0
 .../common/translation/MappingProcessor.java  |   0
 .../translation/MappingProcessorStep.java     |   0
 .../translation/MappingProcessorUtils.java    |   0
 .../rosetta/common/translation/Path.java      |   0
 .../common/translation/SynonymToEnumMap.java  |   0
 .../common/translation/flat/Capture.java      |   0
 .../flat/FlatFileMappingProcessor.java        |   0
 .../translation/flat/IndexCapturePath.java    |   0
 .../util/AbstractHierarchicalPathMatcher.java |   0
 .../rosetta/common/util/ClassPathUtils.java   |   0
 .../rosetta/common/util/CollectionUtils.java  |   0
 .../common/util/HierarchicalPathMatcher.java  |   0
 .../rosetta/common/util/MutablePair.java      |   0
 .../regnosys/rosetta/common/util/Pair.java    |   0
 .../util/PathCollectorBuilderProcessor.java   |   0
 .../rosetta/common/util/PathException.java    |   0
 .../rosetta/common/util/PathLoader.java       |   0
 .../rosetta/common/util/PathUtils.java        |   0
 .../rosetta/common/util/PathValue.java        |   0
 .../regnosys/rosetta/common/util/Report.java  |   0
 .../util/RosettaModelObjectSupplier.java      |   0
 .../RosettaObjectCollectorProcessStep.java    |   0
 .../common/util/SimpleBuilderProcessor.java   |   0
 .../rosetta/common/util/SimpleProcessor.java  |   0
 .../rosetta/common/util/StreamUtils.java      |   0
 .../rosetta/common/util/StringExtensions.java |   0
 .../rosetta/common/util/TeeReader.java        |   0
 .../rosetta/common/util/UrlUtils.java         |   0
 .../validation/RosettaTypeValidator.java      |   0
 .../common/validation/ValidationFailure.java  |   0
 .../common/validation/ValidationReport.java   |   0
 .../JavaCSourceCancellableCompilerTest.java   |   0
 .../rosetta/common/merger/BarBuilder.java     |   0
 .../rosetta/common/merger/FooBuilder.java     |   0
 .../common/merger/SplitterMergerTest.java     |   0
 .../FunctionMemoisingKeyEqualityTest.java     |   0
 .../model/FunctionMemoisingModuleTest.java    |   0
 .../json/JsonLookupDataLoaderTest.java        |   0
 .../json/RosettaObjectMapperTest.java         |   0
 .../json/RosettaSerialisationTest.java        |   0
 .../PreAnnotatedPojoSerialisationTest.java    |   0
 .../json/preannotation/testpojo/Price.java    |   0
 .../preannotation/testpojo/PriceQuantity.java |   0
 .../testpojo/ResolvablePriceQuantity.java     |   0
 .../metafields/FieldWithMetaPrice.java        |   0
 .../testpojo/metafields/MetaFields.java       |   0
 .../metafields/ReferenceWithMetaPrice.java    |   0
 .../JsonProjectionDataLoaderTest.java         |   0
 .../JsonExpectedResultLoaderTest.java         |   3 +-
 .../reportdata/JsonReportDataLoaderTest.java  |   0
 .../xml/XmlSerialisationTest.java             |   0
 .../rosetta/common/test/CommonAssertions.java |   0
 .../common/testing/FunctionRunnerTest.java    |   0
 .../transform/PipelineSerialisationTest.java  |   0
 .../transform/TestPackSerialisationTest.java  |   0
 .../translation/MappingProcessorStepTest.java |   0
 .../rosetta/common/translation/PathTest.java  |   0
 .../flat/IndexCapturePathTest.java            |   0
 .../common/util/ClassPathUtilsTest.java       |   0
 .../rosetta/common/util/PairTest.java         |   0
 .../rosetta/common/util/PathUtilsTest.java    |   0
 .../rosetta/common/util/TestStreamUtils.java  |   0
 .../rosetta/common/util/TestTeeReader.java    |   0
 .../compile-test/BrokenHelloWorld.java        |   0
 .../resources/compile-test/HelloWorld.java    |   0
 .../execution-descriptor-1.json               |   0
 .../expected-output-test-1.json               |   0
 .../function-runner-test/input-test-1.json    |   0
 .../src}/test/resources/logback-test.xml      |   0
 .../resources/path-files/META-INF/MANIFEST.MF |   0
 .../resources/path-files/test-class-path.jar  | Bin
 .../resources/path-files/test-path-2.rosetta  |   0
 .../resources/path-files/test-path.rosetta    |   0
 .../projection-data-descriptor.json           |   0
 .../projection-data-descriptor.json           |   0
 .../projection/test-use-case-load/test1.json  |   0
 .../549300GUAMON5OX2OO54.json                 |   0
 ...egulatory-reporting-lookup-descriptor.json |   0
 .../regulatory-reporting-data-descriptor.json |   0
 .../regs/test-use-case-load-error/test1.json  |   0
 .../expected/test1-expected.json              |   0
 .../regulatory-reporting-data-descriptor.json |   0
 .../test1.json                                |   0
 .../regulatory-reporting-data-descriptor.json |   0
 .../input/test-set-1/test1.json               |   0
 .../test-set-1/test1-key-value.json           |   0
 .../test-set-1/test1-key-value.json           |   0
 .../regulatory-reporting-data-descriptor.json |   0
 .../test-use-case-load-one-error/test1.json   |   0
 .../regulatory-reporting-data-descriptor.json |   0
 .../regs/test-use-case-load/test1.json        |   0
 .../pipeline-projection-emir-trade.json       |   0
 .../pipeline-report-emir-trade.json           |   0
 .../pipeline-translate-fpml.json              |   0
 ...-pack-projection-emir-trade-commodity.json |   0
 ...test-pack-report-emir-trade-commodity.json |   0
 .../test-pack-translate-fpml-commodity.json   |   0
 .../src}/test/resources/test-private-key.der  | Bin
 .../src}/test/resources/test-public-key.der   | Bin
 .../xml-serialisation/expected/document.xml   |   0
 .../expected/license-header.xml               |   0
 .../expected/multicardinality-container.xml   |   0
 .../expected/nested-container.xml             |   0
 .../expected/substitution-group-multi.xml     |   0
 .../expected/substitution-group.xml           |   0
 .../schema/import-config.yml                  |   0
 .../xml-serialisation/schema/schema.xsd       |   0
 pom.xml                                       | 214 +++---------------
 serialization/pom.xml                         |  74 ++++++
 .../rune/mapper/RuneJsonObjectMapper.java     | 106 +++++++++
 .../rune/mapper/RuneJsonObjectWriter.java     | 103 +++++++++
 .../finos/rune/mapper/date/DateExtended.java  |  36 +++
 .../rune/mapper/date/RuneDateModule.java      |  52 +++++
 .../rune/mapper/filters/SubTypeFilter.java    |  45 ++++
 .../mapper/introspector/RuneBeanUtil.java     |  62 +++++
 .../RuneJsonAnnotationIntrospector.java       | 165 ++++++++++++++
 .../mapper/introspector/RuneJsonModule.java   |  52 +++++
 .../RuneStdTypeResolverBuilder.java           |  50 ++++
 .../mixins/RosettaModelObjectMixin.java       |  32 +++
 .../DynamicCompiledClassLoader.java           |  36 +++
 .../RuneJsonSerializerErrorHandlingTest.java  | 164 ++++++++++++++
 .../RuneJsonSerializerRoundTripTest.java      | 104 +++++++++
 .../RuneSerializerTestHelper.java             | 117 ++++++++++
 .../cardinality/cardinality.rosetta           |   7 +
 .../cardinality/too-many-elements.json        |   6 +
 .../number-fraction-too-large.json            |   6 +
 .../parameterised/number-too-large.json       |   6 +
 .../parameterised/parameterised.rosetta       |  15 ++
 .../parameterised/string-illegal-pattern.json |   6 +
 .../parameterised/string-too-large.json       |   6 +
 .../basic/basic-types-list.json               |  13 ++
 .../basic/basic-types-single.json             |  13 ++
 .../basic/basic.rosetta                       |  31 +++
 .../choicetype/choice-basic.json              |   8 +
 .../choicetype/choice-data.json               |  10 +
 .../choicetype/choice-mixed-1.json            |  10 +
 .../choicetype/choice-mixed-2.json            |   8 +
 .../choicetype/choice.rosetta                 |  28 +++
 .../data/data-types.json                      |  16 ++
 .../data/data.rosetta                         |  16 ++
 .../enumtypes/enum-types-list.json            |   8 +
 .../enumtypes/enum-types-single.json          |   8 +
 .../enumtypes/enum.rosetta                    |  19 ++
 .../extension/base-type.json                  |   8 +
 .../extension/extended-type-concrete.json     |   9 +
 .../extension/extended-type-polymorphic.json  |  10 +
 .../extension/extension.rosetta               |  16 ++
 .../metakey/attribute-ref.json                |  16 ++
 .../metakey/dangling-attribute-ref.json       |  11 +
 .../metakey/dangling-node-ref.json            |  11 +
 .../metakey/meta-key.rosetta                  |  23 ++
 .../metakey/node-ref.json                     |  16 ++
 .../metalocation/address.json                 |  14 ++
 .../metalocation/dangling-address.json        |   8 +
 .../metalocation/meta-location.rosetta        |  16 ++
 .../metascheme/enum-list.json                 |  15 ++
 .../metascheme/enum-single.json               |   9 +
 .../metascheme/meta-scheme.rosetta            |  23 ++
 .../metascheme/node-list.json                 |  24 ++
 .../metascheme/node-single.json               |  12 +
 .../record/record-types-list.json             |  10 +
 .../record/record-types-single.json           |  10 +
 .../record/record.rosetta                     |  18 ++
 271 files changed, 1938 insertions(+), 181 deletions(-)
 create mode 100644 common/pom.xml
 rename {src => common/src}/main/java/com/regnosys/granite/ingestor/parser/InputValidationReport.java (100%)
 rename {src => common/src}/main/java/com/regnosys/granite/projector/ProjectionEnvironment.java (100%)
 rename {src => common/src}/main/java/com/regnosys/granite/projector/ProjectionReport.java (100%)
 rename {src => common/src}/main/java/com/regnosys/granite/projector/ProjectionService.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/RegPaths.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/compile/CancelIndicator.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/compile/CompilationCancellationException.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/compile/CompilationCompletionState.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/compile/CompilationTargetDeletionException.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/compile/JavaCSourceCancellableCompiler.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/compile/JavaCancellableCompiler.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/compile/JavaCompilationResult.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/compile/JavaCompileReleaseFlag.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/hashing/GlobalKeyProcessStep.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/hashing/IntegerHashGenerator.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/hashing/IntegerReport.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/hashing/NonNullHashCollector.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/hashing/ReKeyProcessStep.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/hashing/ReferenceConfig.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/hashing/ReferenceResolverProcessStep.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/hashing/RosettaBasicTypesHashGenerator.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/hashing/ScopeReferenceHelper.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/merging/MergeTemplateProcessStep.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/merging/SimpleMerger.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/merging/SimpleSplitter.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/model/CachingMethodInterceptor.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/model/FunctionMemoisingModule.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/model/FunctionMemoisingModuleBuilder.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/model/MemoiseCacheKey.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/postprocess/WorkflowPostProcessor.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/postprocess/qualify/EmptyQualificationHandlerProvider.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationHandler.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationHandlerProvider.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationReport.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationResult.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualifyProcessorStep.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/projection/ProjectionDataItemExpectation.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/projection/ProjectionDataSetExpectation.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/projection/RegProjectionPaths.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/reports/RegReportPaths.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/reports/ReportDataItemExpectation.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/reports/ReportDataSetExpectation.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/reports/ReportField.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/AbstractJsonDataLoader.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/BackwardsCompatibleAnnotationIntrospector.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/BeanUtil.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/ConstantAttributePropertyWriter.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/DataLoader.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/DataSet.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/InputDataLoader.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/JsonDataLoaderUtil.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/ObjectMapperCreator.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/RosettaDataValueObjectToString.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/RosettaObjectMapper.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/RosettaObjectMapperCreator.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/RosettaSerialiserException.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/lookup/JsonLookupDataLoader.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/lookup/LookupDataItem.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/lookup/LookupDataSet.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/mixin/DateExtended.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/mixin/EnumAsStringBuilderIntrospector.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/mixin/ReferenceFilter.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/mixin/ReferenceWithMetaMixIn.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaDateModule.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaEnumBuilderIntrospector.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaJSONAnnotationIntrospector.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaJSONModule.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyGlobalKeyFieldsMixIn.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyKeyMixIn.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyReferenceMixIn.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyRosettaBuilderIntrospector.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/projectiondata/JsonProjectionDataLoader.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/projectiondata/ProjectionDataSet.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ExpectedResult.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ExpectedResultField.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/reportdata/JsonExpectedResultLoader.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/reportdata/JsonReportDataLoader.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportDataItem.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportDataSet.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportIdentifierDataSet.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanDeserializerModifier.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanSerializer.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanSerializerModifier.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaSerialiserFactory.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaXMLAnnotationIntrospector.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaXMLModule.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutedMethodProperty.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutingBeanPropertyWriter.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutionMap.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutionMapLoader.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappableIndexedListSerializer.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappingAsArraySerializerBase.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappingIndexedListSerializer.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/serialisation/xml/VirtualXMLAttribute.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/testing/CoverageFraction.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/testing/ExecutableFunction.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/testing/ExecutionDescriptor.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/testing/FunctionRunner.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/testing/MappingCoverage.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/transform/PipelineInfo.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/transform/PipelineModel.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/transform/TestPackModel.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/transform/TestPackUtils.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/transform/TransformType.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/translation/Mapping.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/translation/MappingContext.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/translation/MappingDelegate.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/translation/MappingProcessor.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/translation/MappingProcessorStep.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/translation/MappingProcessorUtils.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/translation/Path.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/translation/SynonymToEnumMap.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/translation/flat/Capture.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/translation/flat/FlatFileMappingProcessor.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/translation/flat/IndexCapturePath.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/AbstractHierarchicalPathMatcher.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/ClassPathUtils.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/CollectionUtils.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/HierarchicalPathMatcher.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/MutablePair.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/Pair.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/PathCollectorBuilderProcessor.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/PathException.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/PathLoader.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/PathUtils.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/PathValue.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/Report.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/RosettaModelObjectSupplier.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/RosettaObjectCollectorProcessStep.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/SimpleBuilderProcessor.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/SimpleProcessor.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/StreamUtils.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/StringExtensions.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/TeeReader.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/util/UrlUtils.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/validation/RosettaTypeValidator.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/validation/ValidationFailure.java (100%)
 rename {src => common/src}/main/java/com/regnosys/rosetta/common/validation/ValidationReport.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/compile/JavaCSourceCancellableCompilerTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/merger/BarBuilder.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/merger/FooBuilder.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/merger/SplitterMergerTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/model/FunctionMemoisingKeyEqualityTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/model/FunctionMemoisingModuleTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/serialisation/json/JsonLookupDataLoaderTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/serialisation/json/RosettaObjectMapperTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/serialisation/json/RosettaSerialisationTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/PreAnnotatedPojoSerialisationTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/Price.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/PriceQuantity.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/ResolvablePriceQuantity.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/FieldWithMetaPrice.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/MetaFields.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/ReferenceWithMetaPrice.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/serialisation/json/projection/JsonProjectionDataLoaderTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/serialisation/json/reportdata/JsonExpectedResultLoaderTest.java (98%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/serialisation/json/reportdata/JsonReportDataLoaderTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/serialisation/xml/XmlSerialisationTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/test/CommonAssertions.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/testing/FunctionRunnerTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/transform/PipelineSerialisationTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/transform/TestPackSerialisationTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/translation/MappingProcessorStepTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/translation/PathTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/translation/flat/IndexCapturePathTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/util/ClassPathUtilsTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/util/PairTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/util/PathUtilsTest.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/util/TestStreamUtils.java (100%)
 rename {src => common/src}/test/java/com/regnosys/rosetta/common/util/TestTeeReader.java (100%)
 rename {src => common/src}/test/resources/compile-test/BrokenHelloWorld.java (100%)
 rename {src => common/src}/test/resources/compile-test/HelloWorld.java (100%)
 rename {src => common/src}/test/resources/function-runner-test/execution-descriptor-1.json (100%)
 rename {src => common/src}/test/resources/function-runner-test/expected-output-test-1.json (100%)
 rename {src => common/src}/test/resources/function-runner-test/input-test-1.json (100%)
 rename {src => common/src}/test/resources/logback-test.xml (100%)
 rename {src => common/src}/test/resources/path-files/META-INF/MANIFEST.MF (100%)
 rename {src => common/src}/test/resources/path-files/test-class-path.jar (100%)
 rename {src => common/src}/test/resources/path-files/test-path-2.rosetta (100%)
 rename {src => common/src}/test/resources/path-files/test-path.rosetta (100%)
 rename {src => common/src}/test/resources/projection/null-applicable-projections/projection-data-descriptor.json (100%)
 rename {src => common/src}/test/resources/projection/test-use-case-load/projection-data-descriptor.json (100%)
 rename {src => common/src}/test/resources/projection/test-use-case-load/test1.json (100%)
 rename {src => common/src}/test/resources/regs/test-reg-lookups/549300GUAMON5OX2OO54.json (100%)
 rename {src => common/src}/test/resources/regs/test-reg-lookups/regulatory-reporting-lookup-descriptor.json (100%)
 rename {src => common/src}/test/resources/regs/test-use-case-load-error/regulatory-reporting-data-descriptor.json (100%)
 rename {src => common/src}/test/resources/regs/test-use-case-load-error/test1.json (100%)
 rename {src => common/src}/test/resources/regs/test-use-case-load-expected-legacy/expected/test1-expected.json (100%)
 rename {src => common/src}/test/resources/regs/test-use-case-load-expected-legacy/regulatory-reporting-data-descriptor.json (100%)
 rename {src => common/src}/test/resources/regs/test-use-case-load-expected-legacy/test1.json (100%)
 rename {src => common/src}/test/resources/regs/test-use-case-load-expected/config/regulatory-reporting-data-descriptor.json (100%)
 rename {src => common/src}/test/resources/regs/test-use-case-load-expected/input/test-set-1/test1.json (100%)
 rename {src => common/src}/test/resources/regs/test-use-case-load-expected/output/body-corpus1/test-set-1/test1-key-value.json (100%)
 rename {src => common/src}/test/resources/regs/test-use-case-load-expected/output/body-corpus2/test-set-1/test1-key-value.json (100%)
 rename {src => common/src}/test/resources/regs/test-use-case-load-one-error/regulatory-reporting-data-descriptor.json (100%)
 rename {src => common/src}/test/resources/regs/test-use-case-load-one-error/test1.json (100%)
 rename {src => common/src}/test/resources/regs/test-use-case-load/regulatory-reporting-data-descriptor.json (100%)
 rename {src => common/src}/test/resources/regs/test-use-case-load/test1.json (100%)
 rename {src => common/src}/test/resources/test-pack-serialisation-test/pipeline-projection-emir-trade.json (100%)
 rename {src => common/src}/test/resources/test-pack-serialisation-test/pipeline-report-emir-trade.json (100%)
 rename {src => common/src}/test/resources/test-pack-serialisation-test/pipeline-translate-fpml.json (100%)
 rename {src => common/src}/test/resources/test-pack-serialisation-test/test-pack-projection-emir-trade-commodity.json (100%)
 rename {src => common/src}/test/resources/test-pack-serialisation-test/test-pack-report-emir-trade-commodity.json (100%)
 rename {src => common/src}/test/resources/test-pack-serialisation-test/test-pack-translate-fpml-commodity.json (100%)
 rename {src => common/src}/test/resources/test-private-key.der (100%)
 rename {src => common/src}/test/resources/test-public-key.der (100%)
 rename {src => common/src}/test/resources/xml-serialisation/expected/document.xml (100%)
 rename {src => common/src}/test/resources/xml-serialisation/expected/license-header.xml (100%)
 rename {src => common/src}/test/resources/xml-serialisation/expected/multicardinality-container.xml (100%)
 rename {src => common/src}/test/resources/xml-serialisation/expected/nested-container.xml (100%)
 rename {src => common/src}/test/resources/xml-serialisation/expected/substitution-group-multi.xml (100%)
 rename {src => common/src}/test/resources/xml-serialisation/expected/substitution-group.xml (100%)
 rename {src => common/src}/test/resources/xml-serialisation/schema/import-config.yml (100%)
 rename {src => common/src}/test/resources/xml-serialisation/schema/schema.xsd (100%)
 create mode 100644 serialization/pom.xml
 create mode 100644 serialization/src/main/java/org/finos/rune/mapper/RuneJsonObjectMapper.java
 create mode 100644 serialization/src/main/java/org/finos/rune/mapper/RuneJsonObjectWriter.java
 create mode 100644 serialization/src/main/java/org/finos/rune/mapper/date/DateExtended.java
 create mode 100644 serialization/src/main/java/org/finos/rune/mapper/date/RuneDateModule.java
 create mode 100644 serialization/src/main/java/org/finos/rune/mapper/filters/SubTypeFilter.java
 create mode 100644 serialization/src/main/java/org/finos/rune/mapper/introspector/RuneBeanUtil.java
 create mode 100644 serialization/src/main/java/org/finos/rune/mapper/introspector/RuneJsonAnnotationIntrospector.java
 create mode 100644 serialization/src/main/java/org/finos/rune/mapper/introspector/RuneJsonModule.java
 create mode 100644 serialization/src/main/java/org/finos/rune/mapper/introspector/RuneStdTypeResolverBuilder.java
 create mode 100644 serialization/src/main/java/org/finos/rune/mapper/mixins/RosettaModelObjectMixin.java
 create mode 100644 serialization/src/test/java/org/finos/rune/serialization/DynamicCompiledClassLoader.java
 create mode 100644 serialization/src/test/java/org/finos/rune/serialization/RuneJsonSerializerErrorHandlingTest.java
 create mode 100644 serialization/src/test/java/org/finos/rune/serialization/RuneJsonSerializerRoundTripTest.java
 create mode 100644 serialization/src/test/java/org/finos/rune/serialization/RuneSerializerTestHelper.java
 create mode 100644 serialization/src/test/resources/rune-serializer-error-handling-test/cardinality/cardinality.rosetta
 create mode 100644 serialization/src/test/resources/rune-serializer-error-handling-test/cardinality/too-many-elements.json
 create mode 100644 serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/number-fraction-too-large.json
 create mode 100644 serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/number-too-large.json
 create mode 100644 serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/parameterised.rosetta
 create mode 100644 serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/string-illegal-pattern.json
 create mode 100644 serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/string-too-large.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/basic/basic-types-list.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/basic/basic-types-single.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/basic/basic.rosetta
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-basic.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-data.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-mixed-1.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-mixed-2.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice.rosetta
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/data/data-types.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/data/data.rosetta
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/enumtypes/enum-types-list.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/enumtypes/enum-types-single.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/enumtypes/enum.rosetta
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/extension/base-type.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/extension/extended-type-concrete.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/extension/extended-type-polymorphic.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/extension/extension.rosetta
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/metakey/attribute-ref.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/metakey/dangling-attribute-ref.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/metakey/dangling-node-ref.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/metakey/meta-key.rosetta
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/metakey/node-ref.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/metalocation/address.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/metalocation/dangling-address.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/metalocation/meta-location.rosetta
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/enum-list.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/enum-single.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/meta-scheme.rosetta
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/node-list.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/node-single.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/record/record-types-list.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/record/record-types-single.json
 create mode 100644 serialization/src/test/resources/rune-serializer-round-trip-test/record/record.rosetta

diff --git a/common/pom.xml b/common/pom.xml
new file mode 100644
index 00000000..0376112e
--- /dev/null
+++ b/common/pom.xml
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.regnosys</groupId>
+        <artifactId>rune-common-parent</artifactId>
+        <version>0.0.0.main-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>rosetta-common</artifactId>
+
+    <properties>
+        <maven.compiler.source>21</maven.compiler.source>
+        <maven.compiler.target>21</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.regnosys.rosetta</groupId>
+            <artifactId>com.regnosys.rosetta.lib</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.module</groupId>
+            <artifactId>jackson-module-parameter-names</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.module</groupId>
+            <artifactId>jackson-module-blackbird</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jdk8</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jsr310</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-joda</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-yaml</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-xml</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.inject</groupId>
+            <artifactId>guice</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>exec-maven-plugin</artifactId>
+                <version>${exec-maven-plugin.version}</version>
+                <executions>
+                    <execution>
+                        <id>import-test-xsd-schema</id>
+                        <phase>generate-test-sources</phase>
+                        <goals>
+                            <goal>java</goal>
+                        </goals>
+                        <configuration>
+                            <mainClass>com.regnosys.rosetta.tools.modelimport.XsdImportMain</mainClass>
+                            <cleanupDaemonThreads>false</cleanupDaemonThreads>
+                            <arguments>
+                                <argument>-config-path</argument>
+                                <argument>
+                                    ${project.basedir}/src/test/resources/xml-serialisation/schema/import-config.yml
+                                </argument>
+                                <argument>-rosetta-output-path</argument>
+                                <argument>${project.build.testOutputDirectory}/xml-serialisation/rosetta</argument>
+                                <argument>-xml-config-output-path</argument>
+                                <argument>${project.build.testOutputDirectory}/xml-serialisation/xml-config.json
+                                </argument>
+                            </arguments>
+                            <includePluginDependencies>true</includePluginDependencies>
+                        </configuration>
+                    </execution>
+                </executions>
+                <dependencies>
+                    <dependency>
+                        <groupId>com.regnosys.rosetta</groupId>
+                        <artifactId>com.regnosys.rosetta.tools</artifactId>
+                        <version>${rosetta.dsl.version}</version>
+                        <exclusions>
+                            <exclusion>
+                                <groupId>com.regnosys.rosetta</groupId>
+                                <artifactId>com.regnosys.rosetta.ide</artifactId>
+                            </exclusion>
+                        </exclusions>
+                    </dependency>
+                    <dependency>
+                        <groupId>com.regnosys.rosetta</groupId>
+                        <artifactId>com.regnosys.rosetta.xcore</artifactId>
+                        <version>${rosetta.dsl.version}</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+            <plugin>
+                <groupId>com.regnosys.rosetta</groupId>
+                <artifactId>rosetta-maven-plugin</artifactId>
+                <version>${rosetta.dsl.version}</version>
+                <executions>
+                    <execution>
+                        <id>generate-xsd-based-sources</id>
+                        <phase>generate-test-sources</phase>
+                        <goals>
+                            <goal>testGenerate</goal>
+                        </goals>
+                        <configuration>
+                            <addOutputDirectoriesToCompileSourceRoots>false</addOutputDirectoriesToCompileSourceRoots>
+                            <sourceRoots>
+                                <sourceRoot>${project.build.testOutputDirectory}/xml-serialisation/rosetta</sourceRoot>
+                            </sourceRoots>
+                            <classPathLookupFilter>.*com\.regnosys\.rosetta.*</classPathLookupFilter>
+                            <languages>
+                                <language>
+                                    <setup>com.regnosys.rosetta.RosettaStandaloneSetup</setup>
+                                    <outputConfigurations>
+                                        <outputConfiguration>
+                                            <outputDirectory>${project.build.testOutputDirectory}/xml-serialisation/java</outputDirectory>
+                                        </outputConfiguration>
+                                    </outputConfigurations>
+                                </language>
+                            </languages>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <version>${build-helper-maven-plugin.version}</version>
+                <executions>
+                    <execution>
+                        <id>add-generated-test-sources</id>
+                        <phase>generate-test-sources</phase>
+                        <goals>
+                            <goal>add-test-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>${project.build.testOutputDirectory}/xml-serialisation/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/src/main/java/com/regnosys/granite/ingestor/parser/InputValidationReport.java b/common/src/main/java/com/regnosys/granite/ingestor/parser/InputValidationReport.java
similarity index 100%
rename from src/main/java/com/regnosys/granite/ingestor/parser/InputValidationReport.java
rename to common/src/main/java/com/regnosys/granite/ingestor/parser/InputValidationReport.java
diff --git a/src/main/java/com/regnosys/granite/projector/ProjectionEnvironment.java b/common/src/main/java/com/regnosys/granite/projector/ProjectionEnvironment.java
similarity index 100%
rename from src/main/java/com/regnosys/granite/projector/ProjectionEnvironment.java
rename to common/src/main/java/com/regnosys/granite/projector/ProjectionEnvironment.java
diff --git a/src/main/java/com/regnosys/granite/projector/ProjectionReport.java b/common/src/main/java/com/regnosys/granite/projector/ProjectionReport.java
similarity index 100%
rename from src/main/java/com/regnosys/granite/projector/ProjectionReport.java
rename to common/src/main/java/com/regnosys/granite/projector/ProjectionReport.java
diff --git a/src/main/java/com/regnosys/granite/projector/ProjectionService.java b/common/src/main/java/com/regnosys/granite/projector/ProjectionService.java
similarity index 100%
rename from src/main/java/com/regnosys/granite/projector/ProjectionService.java
rename to common/src/main/java/com/regnosys/granite/projector/ProjectionService.java
diff --git a/src/main/java/com/regnosys/rosetta/common/RegPaths.java b/common/src/main/java/com/regnosys/rosetta/common/RegPaths.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/RegPaths.java
rename to common/src/main/java/com/regnosys/rosetta/common/RegPaths.java
diff --git a/src/main/java/com/regnosys/rosetta/common/compile/CancelIndicator.java b/common/src/main/java/com/regnosys/rosetta/common/compile/CancelIndicator.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/compile/CancelIndicator.java
rename to common/src/main/java/com/regnosys/rosetta/common/compile/CancelIndicator.java
diff --git a/src/main/java/com/regnosys/rosetta/common/compile/CompilationCancellationException.java b/common/src/main/java/com/regnosys/rosetta/common/compile/CompilationCancellationException.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/compile/CompilationCancellationException.java
rename to common/src/main/java/com/regnosys/rosetta/common/compile/CompilationCancellationException.java
diff --git a/src/main/java/com/regnosys/rosetta/common/compile/CompilationCompletionState.java b/common/src/main/java/com/regnosys/rosetta/common/compile/CompilationCompletionState.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/compile/CompilationCompletionState.java
rename to common/src/main/java/com/regnosys/rosetta/common/compile/CompilationCompletionState.java
diff --git a/src/main/java/com/regnosys/rosetta/common/compile/CompilationTargetDeletionException.java b/common/src/main/java/com/regnosys/rosetta/common/compile/CompilationTargetDeletionException.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/compile/CompilationTargetDeletionException.java
rename to common/src/main/java/com/regnosys/rosetta/common/compile/CompilationTargetDeletionException.java
diff --git a/src/main/java/com/regnosys/rosetta/common/compile/JavaCSourceCancellableCompiler.java b/common/src/main/java/com/regnosys/rosetta/common/compile/JavaCSourceCancellableCompiler.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/compile/JavaCSourceCancellableCompiler.java
rename to common/src/main/java/com/regnosys/rosetta/common/compile/JavaCSourceCancellableCompiler.java
diff --git a/src/main/java/com/regnosys/rosetta/common/compile/JavaCancellableCompiler.java b/common/src/main/java/com/regnosys/rosetta/common/compile/JavaCancellableCompiler.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/compile/JavaCancellableCompiler.java
rename to common/src/main/java/com/regnosys/rosetta/common/compile/JavaCancellableCompiler.java
diff --git a/src/main/java/com/regnosys/rosetta/common/compile/JavaCompilationResult.java b/common/src/main/java/com/regnosys/rosetta/common/compile/JavaCompilationResult.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/compile/JavaCompilationResult.java
rename to common/src/main/java/com/regnosys/rosetta/common/compile/JavaCompilationResult.java
diff --git a/src/main/java/com/regnosys/rosetta/common/compile/JavaCompileReleaseFlag.java b/common/src/main/java/com/regnosys/rosetta/common/compile/JavaCompileReleaseFlag.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/compile/JavaCompileReleaseFlag.java
rename to common/src/main/java/com/regnosys/rosetta/common/compile/JavaCompileReleaseFlag.java
diff --git a/src/main/java/com/regnosys/rosetta/common/hashing/GlobalKeyProcessStep.java b/common/src/main/java/com/regnosys/rosetta/common/hashing/GlobalKeyProcessStep.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/hashing/GlobalKeyProcessStep.java
rename to common/src/main/java/com/regnosys/rosetta/common/hashing/GlobalKeyProcessStep.java
diff --git a/src/main/java/com/regnosys/rosetta/common/hashing/IntegerHashGenerator.java b/common/src/main/java/com/regnosys/rosetta/common/hashing/IntegerHashGenerator.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/hashing/IntegerHashGenerator.java
rename to common/src/main/java/com/regnosys/rosetta/common/hashing/IntegerHashGenerator.java
diff --git a/src/main/java/com/regnosys/rosetta/common/hashing/IntegerReport.java b/common/src/main/java/com/regnosys/rosetta/common/hashing/IntegerReport.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/hashing/IntegerReport.java
rename to common/src/main/java/com/regnosys/rosetta/common/hashing/IntegerReport.java
diff --git a/src/main/java/com/regnosys/rosetta/common/hashing/NonNullHashCollector.java b/common/src/main/java/com/regnosys/rosetta/common/hashing/NonNullHashCollector.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/hashing/NonNullHashCollector.java
rename to common/src/main/java/com/regnosys/rosetta/common/hashing/NonNullHashCollector.java
diff --git a/src/main/java/com/regnosys/rosetta/common/hashing/ReKeyProcessStep.java b/common/src/main/java/com/regnosys/rosetta/common/hashing/ReKeyProcessStep.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/hashing/ReKeyProcessStep.java
rename to common/src/main/java/com/regnosys/rosetta/common/hashing/ReKeyProcessStep.java
diff --git a/src/main/java/com/regnosys/rosetta/common/hashing/ReferenceConfig.java b/common/src/main/java/com/regnosys/rosetta/common/hashing/ReferenceConfig.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/hashing/ReferenceConfig.java
rename to common/src/main/java/com/regnosys/rosetta/common/hashing/ReferenceConfig.java
diff --git a/src/main/java/com/regnosys/rosetta/common/hashing/ReferenceResolverProcessStep.java b/common/src/main/java/com/regnosys/rosetta/common/hashing/ReferenceResolverProcessStep.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/hashing/ReferenceResolverProcessStep.java
rename to common/src/main/java/com/regnosys/rosetta/common/hashing/ReferenceResolverProcessStep.java
diff --git a/src/main/java/com/regnosys/rosetta/common/hashing/RosettaBasicTypesHashGenerator.java b/common/src/main/java/com/regnosys/rosetta/common/hashing/RosettaBasicTypesHashGenerator.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/hashing/RosettaBasicTypesHashGenerator.java
rename to common/src/main/java/com/regnosys/rosetta/common/hashing/RosettaBasicTypesHashGenerator.java
diff --git a/src/main/java/com/regnosys/rosetta/common/hashing/ScopeReferenceHelper.java b/common/src/main/java/com/regnosys/rosetta/common/hashing/ScopeReferenceHelper.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/hashing/ScopeReferenceHelper.java
rename to common/src/main/java/com/regnosys/rosetta/common/hashing/ScopeReferenceHelper.java
diff --git a/src/main/java/com/regnosys/rosetta/common/merging/MergeTemplateProcessStep.java b/common/src/main/java/com/regnosys/rosetta/common/merging/MergeTemplateProcessStep.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/merging/MergeTemplateProcessStep.java
rename to common/src/main/java/com/regnosys/rosetta/common/merging/MergeTemplateProcessStep.java
diff --git a/src/main/java/com/regnosys/rosetta/common/merging/SimpleMerger.java b/common/src/main/java/com/regnosys/rosetta/common/merging/SimpleMerger.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/merging/SimpleMerger.java
rename to common/src/main/java/com/regnosys/rosetta/common/merging/SimpleMerger.java
diff --git a/src/main/java/com/regnosys/rosetta/common/merging/SimpleSplitter.java b/common/src/main/java/com/regnosys/rosetta/common/merging/SimpleSplitter.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/merging/SimpleSplitter.java
rename to common/src/main/java/com/regnosys/rosetta/common/merging/SimpleSplitter.java
diff --git a/src/main/java/com/regnosys/rosetta/common/model/CachingMethodInterceptor.java b/common/src/main/java/com/regnosys/rosetta/common/model/CachingMethodInterceptor.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/model/CachingMethodInterceptor.java
rename to common/src/main/java/com/regnosys/rosetta/common/model/CachingMethodInterceptor.java
diff --git a/src/main/java/com/regnosys/rosetta/common/model/FunctionMemoisingModule.java b/common/src/main/java/com/regnosys/rosetta/common/model/FunctionMemoisingModule.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/model/FunctionMemoisingModule.java
rename to common/src/main/java/com/regnosys/rosetta/common/model/FunctionMemoisingModule.java
diff --git a/src/main/java/com/regnosys/rosetta/common/model/FunctionMemoisingModuleBuilder.java b/common/src/main/java/com/regnosys/rosetta/common/model/FunctionMemoisingModuleBuilder.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/model/FunctionMemoisingModuleBuilder.java
rename to common/src/main/java/com/regnosys/rosetta/common/model/FunctionMemoisingModuleBuilder.java
diff --git a/src/main/java/com/regnosys/rosetta/common/model/MemoiseCacheKey.java b/common/src/main/java/com/regnosys/rosetta/common/model/MemoiseCacheKey.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/model/MemoiseCacheKey.java
rename to common/src/main/java/com/regnosys/rosetta/common/model/MemoiseCacheKey.java
diff --git a/src/main/java/com/regnosys/rosetta/common/postprocess/WorkflowPostProcessor.java b/common/src/main/java/com/regnosys/rosetta/common/postprocess/WorkflowPostProcessor.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/postprocess/WorkflowPostProcessor.java
rename to common/src/main/java/com/regnosys/rosetta/common/postprocess/WorkflowPostProcessor.java
diff --git a/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/EmptyQualificationHandlerProvider.java b/common/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/EmptyQualificationHandlerProvider.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/postprocess/qualify/EmptyQualificationHandlerProvider.java
rename to common/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/EmptyQualificationHandlerProvider.java
diff --git a/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationHandler.java b/common/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationHandler.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationHandler.java
rename to common/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationHandler.java
diff --git a/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationHandlerProvider.java b/common/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationHandlerProvider.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationHandlerProvider.java
rename to common/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationHandlerProvider.java
diff --git a/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationReport.java b/common/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationReport.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationReport.java
rename to common/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationReport.java
diff --git a/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationResult.java b/common/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationResult.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationResult.java
rename to common/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualificationResult.java
diff --git a/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualifyProcessorStep.java b/common/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualifyProcessorStep.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualifyProcessorStep.java
rename to common/src/main/java/com/regnosys/rosetta/common/postprocess/qualify/QualifyProcessorStep.java
diff --git a/src/main/java/com/regnosys/rosetta/common/projection/ProjectionDataItemExpectation.java b/common/src/main/java/com/regnosys/rosetta/common/projection/ProjectionDataItemExpectation.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/projection/ProjectionDataItemExpectation.java
rename to common/src/main/java/com/regnosys/rosetta/common/projection/ProjectionDataItemExpectation.java
diff --git a/src/main/java/com/regnosys/rosetta/common/projection/ProjectionDataSetExpectation.java b/common/src/main/java/com/regnosys/rosetta/common/projection/ProjectionDataSetExpectation.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/projection/ProjectionDataSetExpectation.java
rename to common/src/main/java/com/regnosys/rosetta/common/projection/ProjectionDataSetExpectation.java
diff --git a/src/main/java/com/regnosys/rosetta/common/projection/RegProjectionPaths.java b/common/src/main/java/com/regnosys/rosetta/common/projection/RegProjectionPaths.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/projection/RegProjectionPaths.java
rename to common/src/main/java/com/regnosys/rosetta/common/projection/RegProjectionPaths.java
diff --git a/src/main/java/com/regnosys/rosetta/common/reports/RegReportPaths.java b/common/src/main/java/com/regnosys/rosetta/common/reports/RegReportPaths.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/reports/RegReportPaths.java
rename to common/src/main/java/com/regnosys/rosetta/common/reports/RegReportPaths.java
diff --git a/src/main/java/com/regnosys/rosetta/common/reports/ReportDataItemExpectation.java b/common/src/main/java/com/regnosys/rosetta/common/reports/ReportDataItemExpectation.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/reports/ReportDataItemExpectation.java
rename to common/src/main/java/com/regnosys/rosetta/common/reports/ReportDataItemExpectation.java
diff --git a/src/main/java/com/regnosys/rosetta/common/reports/ReportDataSetExpectation.java b/common/src/main/java/com/regnosys/rosetta/common/reports/ReportDataSetExpectation.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/reports/ReportDataSetExpectation.java
rename to common/src/main/java/com/regnosys/rosetta/common/reports/ReportDataSetExpectation.java
diff --git a/src/main/java/com/regnosys/rosetta/common/reports/ReportField.java b/common/src/main/java/com/regnosys/rosetta/common/reports/ReportField.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/reports/ReportField.java
rename to common/src/main/java/com/regnosys/rosetta/common/reports/ReportField.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/AbstractJsonDataLoader.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/AbstractJsonDataLoader.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/AbstractJsonDataLoader.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/AbstractJsonDataLoader.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/BackwardsCompatibleAnnotationIntrospector.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/BackwardsCompatibleAnnotationIntrospector.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/BackwardsCompatibleAnnotationIntrospector.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/BackwardsCompatibleAnnotationIntrospector.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/BeanUtil.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/BeanUtil.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/BeanUtil.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/BeanUtil.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/ConstantAttributePropertyWriter.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/ConstantAttributePropertyWriter.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/ConstantAttributePropertyWriter.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/ConstantAttributePropertyWriter.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/DataLoader.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/DataLoader.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/DataLoader.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/DataLoader.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/DataSet.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/DataSet.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/DataSet.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/DataSet.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/InputDataLoader.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/InputDataLoader.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/InputDataLoader.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/InputDataLoader.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/JsonDataLoaderUtil.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/JsonDataLoaderUtil.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/JsonDataLoaderUtil.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/JsonDataLoaderUtil.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/ObjectMapperCreator.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/ObjectMapperCreator.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/ObjectMapperCreator.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/ObjectMapperCreator.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/RosettaDataValueObjectToString.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/RosettaDataValueObjectToString.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/RosettaDataValueObjectToString.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/RosettaDataValueObjectToString.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/RosettaObjectMapper.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/RosettaObjectMapper.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/RosettaObjectMapper.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/RosettaObjectMapper.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/RosettaObjectMapperCreator.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/RosettaObjectMapperCreator.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/RosettaObjectMapperCreator.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/RosettaObjectMapperCreator.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/RosettaSerialiserException.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/RosettaSerialiserException.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/RosettaSerialiserException.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/RosettaSerialiserException.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/lookup/JsonLookupDataLoader.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/lookup/JsonLookupDataLoader.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/lookup/JsonLookupDataLoader.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/lookup/JsonLookupDataLoader.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/lookup/LookupDataItem.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/lookup/LookupDataItem.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/lookup/LookupDataItem.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/lookup/LookupDataItem.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/lookup/LookupDataSet.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/lookup/LookupDataSet.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/lookup/LookupDataSet.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/lookup/LookupDataSet.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/DateExtended.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/DateExtended.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/mixin/DateExtended.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/DateExtended.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/EnumAsStringBuilderIntrospector.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/EnumAsStringBuilderIntrospector.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/mixin/EnumAsStringBuilderIntrospector.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/EnumAsStringBuilderIntrospector.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/ReferenceFilter.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/ReferenceFilter.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/mixin/ReferenceFilter.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/ReferenceFilter.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/ReferenceWithMetaMixIn.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/ReferenceWithMetaMixIn.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/mixin/ReferenceWithMetaMixIn.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/ReferenceWithMetaMixIn.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaDateModule.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaDateModule.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaDateModule.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaDateModule.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaEnumBuilderIntrospector.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaEnumBuilderIntrospector.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaEnumBuilderIntrospector.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaEnumBuilderIntrospector.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaJSONAnnotationIntrospector.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaJSONAnnotationIntrospector.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaJSONAnnotationIntrospector.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaJSONAnnotationIntrospector.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaJSONModule.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaJSONModule.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaJSONModule.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/RosettaJSONModule.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyGlobalKeyFieldsMixIn.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyGlobalKeyFieldsMixIn.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyGlobalKeyFieldsMixIn.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyGlobalKeyFieldsMixIn.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyKeyMixIn.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyKeyMixIn.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyKeyMixIn.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyKeyMixIn.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyReferenceMixIn.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyReferenceMixIn.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyReferenceMixIn.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyReferenceMixIn.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyRosettaBuilderIntrospector.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyRosettaBuilderIntrospector.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyRosettaBuilderIntrospector.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/mixin/legacy/LegacyRosettaBuilderIntrospector.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/projectiondata/JsonProjectionDataLoader.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/projectiondata/JsonProjectionDataLoader.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/projectiondata/JsonProjectionDataLoader.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/projectiondata/JsonProjectionDataLoader.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/projectiondata/ProjectionDataSet.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/projectiondata/ProjectionDataSet.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/projectiondata/ProjectionDataSet.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/projectiondata/ProjectionDataSet.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ExpectedResult.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ExpectedResult.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ExpectedResult.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ExpectedResult.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ExpectedResultField.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ExpectedResultField.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ExpectedResultField.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ExpectedResultField.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/JsonExpectedResultLoader.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/JsonExpectedResultLoader.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/JsonExpectedResultLoader.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/JsonExpectedResultLoader.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/JsonReportDataLoader.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/JsonReportDataLoader.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/JsonReportDataLoader.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/JsonReportDataLoader.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportDataItem.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportDataItem.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportDataItem.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportDataItem.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportDataSet.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportDataSet.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportDataSet.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportDataSet.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportIdentifierDataSet.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportIdentifierDataSet.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportIdentifierDataSet.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/reportdata/ReportIdentifierDataSet.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanDeserializerModifier.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanDeserializerModifier.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanDeserializerModifier.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanDeserializerModifier.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanSerializer.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanSerializer.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanSerializer.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanSerializer.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanSerializerModifier.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanSerializerModifier.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanSerializerModifier.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaBeanSerializerModifier.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaSerialiserFactory.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaSerialiserFactory.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaSerialiserFactory.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaSerialiserFactory.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaXMLAnnotationIntrospector.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaXMLAnnotationIntrospector.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaXMLAnnotationIntrospector.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaXMLAnnotationIntrospector.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaXMLModule.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaXMLModule.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaXMLModule.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/RosettaXMLModule.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutedMethodProperty.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutedMethodProperty.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutedMethodProperty.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutedMethodProperty.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutingBeanPropertyWriter.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutingBeanPropertyWriter.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutingBeanPropertyWriter.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutingBeanPropertyWriter.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutionMap.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutionMap.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutionMap.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutionMap.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutionMapLoader.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutionMapLoader.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutionMapLoader.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/SubstitutionMapLoader.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappableIndexedListSerializer.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappableIndexedListSerializer.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappableIndexedListSerializer.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappableIndexedListSerializer.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappingAsArraySerializerBase.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappingAsArraySerializerBase.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappingAsArraySerializerBase.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappingAsArraySerializerBase.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappingIndexedListSerializer.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappingIndexedListSerializer.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappingIndexedListSerializer.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/UnwrappingIndexedListSerializer.java
diff --git a/src/main/java/com/regnosys/rosetta/common/serialisation/xml/VirtualXMLAttribute.java b/common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/VirtualXMLAttribute.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/serialisation/xml/VirtualXMLAttribute.java
rename to common/src/main/java/com/regnosys/rosetta/common/serialisation/xml/VirtualXMLAttribute.java
diff --git a/src/main/java/com/regnosys/rosetta/common/testing/CoverageFraction.java b/common/src/main/java/com/regnosys/rosetta/common/testing/CoverageFraction.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/testing/CoverageFraction.java
rename to common/src/main/java/com/regnosys/rosetta/common/testing/CoverageFraction.java
diff --git a/src/main/java/com/regnosys/rosetta/common/testing/ExecutableFunction.java b/common/src/main/java/com/regnosys/rosetta/common/testing/ExecutableFunction.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/testing/ExecutableFunction.java
rename to common/src/main/java/com/regnosys/rosetta/common/testing/ExecutableFunction.java
diff --git a/src/main/java/com/regnosys/rosetta/common/testing/ExecutionDescriptor.java b/common/src/main/java/com/regnosys/rosetta/common/testing/ExecutionDescriptor.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/testing/ExecutionDescriptor.java
rename to common/src/main/java/com/regnosys/rosetta/common/testing/ExecutionDescriptor.java
diff --git a/src/main/java/com/regnosys/rosetta/common/testing/FunctionRunner.java b/common/src/main/java/com/regnosys/rosetta/common/testing/FunctionRunner.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/testing/FunctionRunner.java
rename to common/src/main/java/com/regnosys/rosetta/common/testing/FunctionRunner.java
diff --git a/src/main/java/com/regnosys/rosetta/common/testing/MappingCoverage.java b/common/src/main/java/com/regnosys/rosetta/common/testing/MappingCoverage.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/testing/MappingCoverage.java
rename to common/src/main/java/com/regnosys/rosetta/common/testing/MappingCoverage.java
diff --git a/src/main/java/com/regnosys/rosetta/common/transform/PipelineInfo.java b/common/src/main/java/com/regnosys/rosetta/common/transform/PipelineInfo.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/transform/PipelineInfo.java
rename to common/src/main/java/com/regnosys/rosetta/common/transform/PipelineInfo.java
diff --git a/src/main/java/com/regnosys/rosetta/common/transform/PipelineModel.java b/common/src/main/java/com/regnosys/rosetta/common/transform/PipelineModel.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/transform/PipelineModel.java
rename to common/src/main/java/com/regnosys/rosetta/common/transform/PipelineModel.java
diff --git a/src/main/java/com/regnosys/rosetta/common/transform/TestPackModel.java b/common/src/main/java/com/regnosys/rosetta/common/transform/TestPackModel.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/transform/TestPackModel.java
rename to common/src/main/java/com/regnosys/rosetta/common/transform/TestPackModel.java
diff --git a/src/main/java/com/regnosys/rosetta/common/transform/TestPackUtils.java b/common/src/main/java/com/regnosys/rosetta/common/transform/TestPackUtils.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/transform/TestPackUtils.java
rename to common/src/main/java/com/regnosys/rosetta/common/transform/TestPackUtils.java
diff --git a/src/main/java/com/regnosys/rosetta/common/transform/TransformType.java b/common/src/main/java/com/regnosys/rosetta/common/transform/TransformType.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/transform/TransformType.java
rename to common/src/main/java/com/regnosys/rosetta/common/transform/TransformType.java
diff --git a/src/main/java/com/regnosys/rosetta/common/translation/Mapping.java b/common/src/main/java/com/regnosys/rosetta/common/translation/Mapping.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/translation/Mapping.java
rename to common/src/main/java/com/regnosys/rosetta/common/translation/Mapping.java
diff --git a/src/main/java/com/regnosys/rosetta/common/translation/MappingContext.java b/common/src/main/java/com/regnosys/rosetta/common/translation/MappingContext.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/translation/MappingContext.java
rename to common/src/main/java/com/regnosys/rosetta/common/translation/MappingContext.java
diff --git a/src/main/java/com/regnosys/rosetta/common/translation/MappingDelegate.java b/common/src/main/java/com/regnosys/rosetta/common/translation/MappingDelegate.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/translation/MappingDelegate.java
rename to common/src/main/java/com/regnosys/rosetta/common/translation/MappingDelegate.java
diff --git a/src/main/java/com/regnosys/rosetta/common/translation/MappingProcessor.java b/common/src/main/java/com/regnosys/rosetta/common/translation/MappingProcessor.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/translation/MappingProcessor.java
rename to common/src/main/java/com/regnosys/rosetta/common/translation/MappingProcessor.java
diff --git a/src/main/java/com/regnosys/rosetta/common/translation/MappingProcessorStep.java b/common/src/main/java/com/regnosys/rosetta/common/translation/MappingProcessorStep.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/translation/MappingProcessorStep.java
rename to common/src/main/java/com/regnosys/rosetta/common/translation/MappingProcessorStep.java
diff --git a/src/main/java/com/regnosys/rosetta/common/translation/MappingProcessorUtils.java b/common/src/main/java/com/regnosys/rosetta/common/translation/MappingProcessorUtils.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/translation/MappingProcessorUtils.java
rename to common/src/main/java/com/regnosys/rosetta/common/translation/MappingProcessorUtils.java
diff --git a/src/main/java/com/regnosys/rosetta/common/translation/Path.java b/common/src/main/java/com/regnosys/rosetta/common/translation/Path.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/translation/Path.java
rename to common/src/main/java/com/regnosys/rosetta/common/translation/Path.java
diff --git a/src/main/java/com/regnosys/rosetta/common/translation/SynonymToEnumMap.java b/common/src/main/java/com/regnosys/rosetta/common/translation/SynonymToEnumMap.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/translation/SynonymToEnumMap.java
rename to common/src/main/java/com/regnosys/rosetta/common/translation/SynonymToEnumMap.java
diff --git a/src/main/java/com/regnosys/rosetta/common/translation/flat/Capture.java b/common/src/main/java/com/regnosys/rosetta/common/translation/flat/Capture.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/translation/flat/Capture.java
rename to common/src/main/java/com/regnosys/rosetta/common/translation/flat/Capture.java
diff --git a/src/main/java/com/regnosys/rosetta/common/translation/flat/FlatFileMappingProcessor.java b/common/src/main/java/com/regnosys/rosetta/common/translation/flat/FlatFileMappingProcessor.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/translation/flat/FlatFileMappingProcessor.java
rename to common/src/main/java/com/regnosys/rosetta/common/translation/flat/FlatFileMappingProcessor.java
diff --git a/src/main/java/com/regnosys/rosetta/common/translation/flat/IndexCapturePath.java b/common/src/main/java/com/regnosys/rosetta/common/translation/flat/IndexCapturePath.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/translation/flat/IndexCapturePath.java
rename to common/src/main/java/com/regnosys/rosetta/common/translation/flat/IndexCapturePath.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/AbstractHierarchicalPathMatcher.java b/common/src/main/java/com/regnosys/rosetta/common/util/AbstractHierarchicalPathMatcher.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/AbstractHierarchicalPathMatcher.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/AbstractHierarchicalPathMatcher.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/ClassPathUtils.java b/common/src/main/java/com/regnosys/rosetta/common/util/ClassPathUtils.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/ClassPathUtils.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/ClassPathUtils.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/CollectionUtils.java b/common/src/main/java/com/regnosys/rosetta/common/util/CollectionUtils.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/CollectionUtils.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/CollectionUtils.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/HierarchicalPathMatcher.java b/common/src/main/java/com/regnosys/rosetta/common/util/HierarchicalPathMatcher.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/HierarchicalPathMatcher.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/HierarchicalPathMatcher.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/MutablePair.java b/common/src/main/java/com/regnosys/rosetta/common/util/MutablePair.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/MutablePair.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/MutablePair.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/Pair.java b/common/src/main/java/com/regnosys/rosetta/common/util/Pair.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/Pair.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/Pair.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/PathCollectorBuilderProcessor.java b/common/src/main/java/com/regnosys/rosetta/common/util/PathCollectorBuilderProcessor.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/PathCollectorBuilderProcessor.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/PathCollectorBuilderProcessor.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/PathException.java b/common/src/main/java/com/regnosys/rosetta/common/util/PathException.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/PathException.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/PathException.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/PathLoader.java b/common/src/main/java/com/regnosys/rosetta/common/util/PathLoader.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/PathLoader.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/PathLoader.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/PathUtils.java b/common/src/main/java/com/regnosys/rosetta/common/util/PathUtils.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/PathUtils.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/PathUtils.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/PathValue.java b/common/src/main/java/com/regnosys/rosetta/common/util/PathValue.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/PathValue.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/PathValue.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/Report.java b/common/src/main/java/com/regnosys/rosetta/common/util/Report.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/Report.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/Report.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/RosettaModelObjectSupplier.java b/common/src/main/java/com/regnosys/rosetta/common/util/RosettaModelObjectSupplier.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/RosettaModelObjectSupplier.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/RosettaModelObjectSupplier.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/RosettaObjectCollectorProcessStep.java b/common/src/main/java/com/regnosys/rosetta/common/util/RosettaObjectCollectorProcessStep.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/RosettaObjectCollectorProcessStep.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/RosettaObjectCollectorProcessStep.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/SimpleBuilderProcessor.java b/common/src/main/java/com/regnosys/rosetta/common/util/SimpleBuilderProcessor.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/SimpleBuilderProcessor.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/SimpleBuilderProcessor.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/SimpleProcessor.java b/common/src/main/java/com/regnosys/rosetta/common/util/SimpleProcessor.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/SimpleProcessor.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/SimpleProcessor.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/StreamUtils.java b/common/src/main/java/com/regnosys/rosetta/common/util/StreamUtils.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/StreamUtils.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/StreamUtils.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/StringExtensions.java b/common/src/main/java/com/regnosys/rosetta/common/util/StringExtensions.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/StringExtensions.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/StringExtensions.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/TeeReader.java b/common/src/main/java/com/regnosys/rosetta/common/util/TeeReader.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/TeeReader.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/TeeReader.java
diff --git a/src/main/java/com/regnosys/rosetta/common/util/UrlUtils.java b/common/src/main/java/com/regnosys/rosetta/common/util/UrlUtils.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/util/UrlUtils.java
rename to common/src/main/java/com/regnosys/rosetta/common/util/UrlUtils.java
diff --git a/src/main/java/com/regnosys/rosetta/common/validation/RosettaTypeValidator.java b/common/src/main/java/com/regnosys/rosetta/common/validation/RosettaTypeValidator.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/validation/RosettaTypeValidator.java
rename to common/src/main/java/com/regnosys/rosetta/common/validation/RosettaTypeValidator.java
diff --git a/src/main/java/com/regnosys/rosetta/common/validation/ValidationFailure.java b/common/src/main/java/com/regnosys/rosetta/common/validation/ValidationFailure.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/validation/ValidationFailure.java
rename to common/src/main/java/com/regnosys/rosetta/common/validation/ValidationFailure.java
diff --git a/src/main/java/com/regnosys/rosetta/common/validation/ValidationReport.java b/common/src/main/java/com/regnosys/rosetta/common/validation/ValidationReport.java
similarity index 100%
rename from src/main/java/com/regnosys/rosetta/common/validation/ValidationReport.java
rename to common/src/main/java/com/regnosys/rosetta/common/validation/ValidationReport.java
diff --git a/src/test/java/com/regnosys/rosetta/common/compile/JavaCSourceCancellableCompilerTest.java b/common/src/test/java/com/regnosys/rosetta/common/compile/JavaCSourceCancellableCompilerTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/compile/JavaCSourceCancellableCompilerTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/compile/JavaCSourceCancellableCompilerTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/merger/BarBuilder.java b/common/src/test/java/com/regnosys/rosetta/common/merger/BarBuilder.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/merger/BarBuilder.java
rename to common/src/test/java/com/regnosys/rosetta/common/merger/BarBuilder.java
diff --git a/src/test/java/com/regnosys/rosetta/common/merger/FooBuilder.java b/common/src/test/java/com/regnosys/rosetta/common/merger/FooBuilder.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/merger/FooBuilder.java
rename to common/src/test/java/com/regnosys/rosetta/common/merger/FooBuilder.java
diff --git a/src/test/java/com/regnosys/rosetta/common/merger/SplitterMergerTest.java b/common/src/test/java/com/regnosys/rosetta/common/merger/SplitterMergerTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/merger/SplitterMergerTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/merger/SplitterMergerTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/model/FunctionMemoisingKeyEqualityTest.java b/common/src/test/java/com/regnosys/rosetta/common/model/FunctionMemoisingKeyEqualityTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/model/FunctionMemoisingKeyEqualityTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/model/FunctionMemoisingKeyEqualityTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/model/FunctionMemoisingModuleTest.java b/common/src/test/java/com/regnosys/rosetta/common/model/FunctionMemoisingModuleTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/model/FunctionMemoisingModuleTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/model/FunctionMemoisingModuleTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/serialisation/json/JsonLookupDataLoaderTest.java b/common/src/test/java/com/regnosys/rosetta/common/serialisation/json/JsonLookupDataLoaderTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/serialisation/json/JsonLookupDataLoaderTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/serialisation/json/JsonLookupDataLoaderTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/serialisation/json/RosettaObjectMapperTest.java b/common/src/test/java/com/regnosys/rosetta/common/serialisation/json/RosettaObjectMapperTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/serialisation/json/RosettaObjectMapperTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/serialisation/json/RosettaObjectMapperTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/serialisation/json/RosettaSerialisationTest.java b/common/src/test/java/com/regnosys/rosetta/common/serialisation/json/RosettaSerialisationTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/serialisation/json/RosettaSerialisationTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/serialisation/json/RosettaSerialisationTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/PreAnnotatedPojoSerialisationTest.java b/common/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/PreAnnotatedPojoSerialisationTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/PreAnnotatedPojoSerialisationTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/PreAnnotatedPojoSerialisationTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/Price.java b/common/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/Price.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/Price.java
rename to common/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/Price.java
diff --git a/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/PriceQuantity.java b/common/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/PriceQuantity.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/PriceQuantity.java
rename to common/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/PriceQuantity.java
diff --git a/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/ResolvablePriceQuantity.java b/common/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/ResolvablePriceQuantity.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/ResolvablePriceQuantity.java
rename to common/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/ResolvablePriceQuantity.java
diff --git a/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/FieldWithMetaPrice.java b/common/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/FieldWithMetaPrice.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/FieldWithMetaPrice.java
rename to common/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/FieldWithMetaPrice.java
diff --git a/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/MetaFields.java b/common/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/MetaFields.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/MetaFields.java
rename to common/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/MetaFields.java
diff --git a/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/ReferenceWithMetaPrice.java b/common/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/ReferenceWithMetaPrice.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/ReferenceWithMetaPrice.java
rename to common/src/test/java/com/regnosys/rosetta/common/serialisation/json/preannotation/testpojo/metafields/ReferenceWithMetaPrice.java
diff --git a/src/test/java/com/regnosys/rosetta/common/serialisation/json/projection/JsonProjectionDataLoaderTest.java b/common/src/test/java/com/regnosys/rosetta/common/serialisation/json/projection/JsonProjectionDataLoaderTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/serialisation/json/projection/JsonProjectionDataLoaderTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/serialisation/json/projection/JsonProjectionDataLoaderTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/serialisation/json/reportdata/JsonExpectedResultLoaderTest.java b/common/src/test/java/com/regnosys/rosetta/common/serialisation/json/reportdata/JsonExpectedResultLoaderTest.java
similarity index 98%
rename from src/test/java/com/regnosys/rosetta/common/serialisation/json/reportdata/JsonExpectedResultLoaderTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/serialisation/json/reportdata/JsonExpectedResultLoaderTest.java
index 42ffcc14..c6b998b7 100644
--- a/src/test/java/com/regnosys/rosetta/common/serialisation/json/reportdata/JsonExpectedResultLoaderTest.java
+++ b/common/src/test/java/com/regnosys/rosetta/common/serialisation/json/reportdata/JsonExpectedResultLoaderTest.java
@@ -1,4 +1,4 @@
-package com.regnosys.rosetta.common.serialisation.reportdata;
+package com.regnosys.rosetta.common.serialisation.json.reportdata;
 
 /*-
  * ==============
@@ -24,6 +24,7 @@
 import com.fasterxml.jackson.databind.type.CollectionType;
 import com.google.common.io.Resources;
 import com.regnosys.rosetta.common.serialisation.RosettaObjectMapper;
+import com.regnosys.rosetta.common.serialisation.reportdata.*;
 import com.rosetta.model.lib.ModelReportId;
 import org.junit.jupiter.api.Test;
 
diff --git a/src/test/java/com/regnosys/rosetta/common/serialisation/json/reportdata/JsonReportDataLoaderTest.java b/common/src/test/java/com/regnosys/rosetta/common/serialisation/json/reportdata/JsonReportDataLoaderTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/serialisation/json/reportdata/JsonReportDataLoaderTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/serialisation/json/reportdata/JsonReportDataLoaderTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/serialisation/xml/XmlSerialisationTest.java b/common/src/test/java/com/regnosys/rosetta/common/serialisation/xml/XmlSerialisationTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/serialisation/xml/XmlSerialisationTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/serialisation/xml/XmlSerialisationTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/test/CommonAssertions.java b/common/src/test/java/com/regnosys/rosetta/common/test/CommonAssertions.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/test/CommonAssertions.java
rename to common/src/test/java/com/regnosys/rosetta/common/test/CommonAssertions.java
diff --git a/src/test/java/com/regnosys/rosetta/common/testing/FunctionRunnerTest.java b/common/src/test/java/com/regnosys/rosetta/common/testing/FunctionRunnerTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/testing/FunctionRunnerTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/testing/FunctionRunnerTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/transform/PipelineSerialisationTest.java b/common/src/test/java/com/regnosys/rosetta/common/transform/PipelineSerialisationTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/transform/PipelineSerialisationTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/transform/PipelineSerialisationTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/transform/TestPackSerialisationTest.java b/common/src/test/java/com/regnosys/rosetta/common/transform/TestPackSerialisationTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/transform/TestPackSerialisationTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/transform/TestPackSerialisationTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/translation/MappingProcessorStepTest.java b/common/src/test/java/com/regnosys/rosetta/common/translation/MappingProcessorStepTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/translation/MappingProcessorStepTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/translation/MappingProcessorStepTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/translation/PathTest.java b/common/src/test/java/com/regnosys/rosetta/common/translation/PathTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/translation/PathTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/translation/PathTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/translation/flat/IndexCapturePathTest.java b/common/src/test/java/com/regnosys/rosetta/common/translation/flat/IndexCapturePathTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/translation/flat/IndexCapturePathTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/translation/flat/IndexCapturePathTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/util/ClassPathUtilsTest.java b/common/src/test/java/com/regnosys/rosetta/common/util/ClassPathUtilsTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/util/ClassPathUtilsTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/util/ClassPathUtilsTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/util/PairTest.java b/common/src/test/java/com/regnosys/rosetta/common/util/PairTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/util/PairTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/util/PairTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/util/PathUtilsTest.java b/common/src/test/java/com/regnosys/rosetta/common/util/PathUtilsTest.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/util/PathUtilsTest.java
rename to common/src/test/java/com/regnosys/rosetta/common/util/PathUtilsTest.java
diff --git a/src/test/java/com/regnosys/rosetta/common/util/TestStreamUtils.java b/common/src/test/java/com/regnosys/rosetta/common/util/TestStreamUtils.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/util/TestStreamUtils.java
rename to common/src/test/java/com/regnosys/rosetta/common/util/TestStreamUtils.java
diff --git a/src/test/java/com/regnosys/rosetta/common/util/TestTeeReader.java b/common/src/test/java/com/regnosys/rosetta/common/util/TestTeeReader.java
similarity index 100%
rename from src/test/java/com/regnosys/rosetta/common/util/TestTeeReader.java
rename to common/src/test/java/com/regnosys/rosetta/common/util/TestTeeReader.java
diff --git a/src/test/resources/compile-test/BrokenHelloWorld.java b/common/src/test/resources/compile-test/BrokenHelloWorld.java
similarity index 100%
rename from src/test/resources/compile-test/BrokenHelloWorld.java
rename to common/src/test/resources/compile-test/BrokenHelloWorld.java
diff --git a/src/test/resources/compile-test/HelloWorld.java b/common/src/test/resources/compile-test/HelloWorld.java
similarity index 100%
rename from src/test/resources/compile-test/HelloWorld.java
rename to common/src/test/resources/compile-test/HelloWorld.java
diff --git a/src/test/resources/function-runner-test/execution-descriptor-1.json b/common/src/test/resources/function-runner-test/execution-descriptor-1.json
similarity index 100%
rename from src/test/resources/function-runner-test/execution-descriptor-1.json
rename to common/src/test/resources/function-runner-test/execution-descriptor-1.json
diff --git a/src/test/resources/function-runner-test/expected-output-test-1.json b/common/src/test/resources/function-runner-test/expected-output-test-1.json
similarity index 100%
rename from src/test/resources/function-runner-test/expected-output-test-1.json
rename to common/src/test/resources/function-runner-test/expected-output-test-1.json
diff --git a/src/test/resources/function-runner-test/input-test-1.json b/common/src/test/resources/function-runner-test/input-test-1.json
similarity index 100%
rename from src/test/resources/function-runner-test/input-test-1.json
rename to common/src/test/resources/function-runner-test/input-test-1.json
diff --git a/src/test/resources/logback-test.xml b/common/src/test/resources/logback-test.xml
similarity index 100%
rename from src/test/resources/logback-test.xml
rename to common/src/test/resources/logback-test.xml
diff --git a/src/test/resources/path-files/META-INF/MANIFEST.MF b/common/src/test/resources/path-files/META-INF/MANIFEST.MF
similarity index 100%
rename from src/test/resources/path-files/META-INF/MANIFEST.MF
rename to common/src/test/resources/path-files/META-INF/MANIFEST.MF
diff --git a/src/test/resources/path-files/test-class-path.jar b/common/src/test/resources/path-files/test-class-path.jar
similarity index 100%
rename from src/test/resources/path-files/test-class-path.jar
rename to common/src/test/resources/path-files/test-class-path.jar
diff --git a/src/test/resources/path-files/test-path-2.rosetta b/common/src/test/resources/path-files/test-path-2.rosetta
similarity index 100%
rename from src/test/resources/path-files/test-path-2.rosetta
rename to common/src/test/resources/path-files/test-path-2.rosetta
diff --git a/src/test/resources/path-files/test-path.rosetta b/common/src/test/resources/path-files/test-path.rosetta
similarity index 100%
rename from src/test/resources/path-files/test-path.rosetta
rename to common/src/test/resources/path-files/test-path.rosetta
diff --git a/src/test/resources/projection/null-applicable-projections/projection-data-descriptor.json b/common/src/test/resources/projection/null-applicable-projections/projection-data-descriptor.json
similarity index 100%
rename from src/test/resources/projection/null-applicable-projections/projection-data-descriptor.json
rename to common/src/test/resources/projection/null-applicable-projections/projection-data-descriptor.json
diff --git a/src/test/resources/projection/test-use-case-load/projection-data-descriptor.json b/common/src/test/resources/projection/test-use-case-load/projection-data-descriptor.json
similarity index 100%
rename from src/test/resources/projection/test-use-case-load/projection-data-descriptor.json
rename to common/src/test/resources/projection/test-use-case-load/projection-data-descriptor.json
diff --git a/src/test/resources/projection/test-use-case-load/test1.json b/common/src/test/resources/projection/test-use-case-load/test1.json
similarity index 100%
rename from src/test/resources/projection/test-use-case-load/test1.json
rename to common/src/test/resources/projection/test-use-case-load/test1.json
diff --git a/src/test/resources/regs/test-reg-lookups/549300GUAMON5OX2OO54.json b/common/src/test/resources/regs/test-reg-lookups/549300GUAMON5OX2OO54.json
similarity index 100%
rename from src/test/resources/regs/test-reg-lookups/549300GUAMON5OX2OO54.json
rename to common/src/test/resources/regs/test-reg-lookups/549300GUAMON5OX2OO54.json
diff --git a/src/test/resources/regs/test-reg-lookups/regulatory-reporting-lookup-descriptor.json b/common/src/test/resources/regs/test-reg-lookups/regulatory-reporting-lookup-descriptor.json
similarity index 100%
rename from src/test/resources/regs/test-reg-lookups/regulatory-reporting-lookup-descriptor.json
rename to common/src/test/resources/regs/test-reg-lookups/regulatory-reporting-lookup-descriptor.json
diff --git a/src/test/resources/regs/test-use-case-load-error/regulatory-reporting-data-descriptor.json b/common/src/test/resources/regs/test-use-case-load-error/regulatory-reporting-data-descriptor.json
similarity index 100%
rename from src/test/resources/regs/test-use-case-load-error/regulatory-reporting-data-descriptor.json
rename to common/src/test/resources/regs/test-use-case-load-error/regulatory-reporting-data-descriptor.json
diff --git a/src/test/resources/regs/test-use-case-load-error/test1.json b/common/src/test/resources/regs/test-use-case-load-error/test1.json
similarity index 100%
rename from src/test/resources/regs/test-use-case-load-error/test1.json
rename to common/src/test/resources/regs/test-use-case-load-error/test1.json
diff --git a/src/test/resources/regs/test-use-case-load-expected-legacy/expected/test1-expected.json b/common/src/test/resources/regs/test-use-case-load-expected-legacy/expected/test1-expected.json
similarity index 100%
rename from src/test/resources/regs/test-use-case-load-expected-legacy/expected/test1-expected.json
rename to common/src/test/resources/regs/test-use-case-load-expected-legacy/expected/test1-expected.json
diff --git a/src/test/resources/regs/test-use-case-load-expected-legacy/regulatory-reporting-data-descriptor.json b/common/src/test/resources/regs/test-use-case-load-expected-legacy/regulatory-reporting-data-descriptor.json
similarity index 100%
rename from src/test/resources/regs/test-use-case-load-expected-legacy/regulatory-reporting-data-descriptor.json
rename to common/src/test/resources/regs/test-use-case-load-expected-legacy/regulatory-reporting-data-descriptor.json
diff --git a/src/test/resources/regs/test-use-case-load-expected-legacy/test1.json b/common/src/test/resources/regs/test-use-case-load-expected-legacy/test1.json
similarity index 100%
rename from src/test/resources/regs/test-use-case-load-expected-legacy/test1.json
rename to common/src/test/resources/regs/test-use-case-load-expected-legacy/test1.json
diff --git a/src/test/resources/regs/test-use-case-load-expected/config/regulatory-reporting-data-descriptor.json b/common/src/test/resources/regs/test-use-case-load-expected/config/regulatory-reporting-data-descriptor.json
similarity index 100%
rename from src/test/resources/regs/test-use-case-load-expected/config/regulatory-reporting-data-descriptor.json
rename to common/src/test/resources/regs/test-use-case-load-expected/config/regulatory-reporting-data-descriptor.json
diff --git a/src/test/resources/regs/test-use-case-load-expected/input/test-set-1/test1.json b/common/src/test/resources/regs/test-use-case-load-expected/input/test-set-1/test1.json
similarity index 100%
rename from src/test/resources/regs/test-use-case-load-expected/input/test-set-1/test1.json
rename to common/src/test/resources/regs/test-use-case-load-expected/input/test-set-1/test1.json
diff --git a/src/test/resources/regs/test-use-case-load-expected/output/body-corpus1/test-set-1/test1-key-value.json b/common/src/test/resources/regs/test-use-case-load-expected/output/body-corpus1/test-set-1/test1-key-value.json
similarity index 100%
rename from src/test/resources/regs/test-use-case-load-expected/output/body-corpus1/test-set-1/test1-key-value.json
rename to common/src/test/resources/regs/test-use-case-load-expected/output/body-corpus1/test-set-1/test1-key-value.json
diff --git a/src/test/resources/regs/test-use-case-load-expected/output/body-corpus2/test-set-1/test1-key-value.json b/common/src/test/resources/regs/test-use-case-load-expected/output/body-corpus2/test-set-1/test1-key-value.json
similarity index 100%
rename from src/test/resources/regs/test-use-case-load-expected/output/body-corpus2/test-set-1/test1-key-value.json
rename to common/src/test/resources/regs/test-use-case-load-expected/output/body-corpus2/test-set-1/test1-key-value.json
diff --git a/src/test/resources/regs/test-use-case-load-one-error/regulatory-reporting-data-descriptor.json b/common/src/test/resources/regs/test-use-case-load-one-error/regulatory-reporting-data-descriptor.json
similarity index 100%
rename from src/test/resources/regs/test-use-case-load-one-error/regulatory-reporting-data-descriptor.json
rename to common/src/test/resources/regs/test-use-case-load-one-error/regulatory-reporting-data-descriptor.json
diff --git a/src/test/resources/regs/test-use-case-load-one-error/test1.json b/common/src/test/resources/regs/test-use-case-load-one-error/test1.json
similarity index 100%
rename from src/test/resources/regs/test-use-case-load-one-error/test1.json
rename to common/src/test/resources/regs/test-use-case-load-one-error/test1.json
diff --git a/src/test/resources/regs/test-use-case-load/regulatory-reporting-data-descriptor.json b/common/src/test/resources/regs/test-use-case-load/regulatory-reporting-data-descriptor.json
similarity index 100%
rename from src/test/resources/regs/test-use-case-load/regulatory-reporting-data-descriptor.json
rename to common/src/test/resources/regs/test-use-case-load/regulatory-reporting-data-descriptor.json
diff --git a/src/test/resources/regs/test-use-case-load/test1.json b/common/src/test/resources/regs/test-use-case-load/test1.json
similarity index 100%
rename from src/test/resources/regs/test-use-case-load/test1.json
rename to common/src/test/resources/regs/test-use-case-load/test1.json
diff --git a/src/test/resources/test-pack-serialisation-test/pipeline-projection-emir-trade.json b/common/src/test/resources/test-pack-serialisation-test/pipeline-projection-emir-trade.json
similarity index 100%
rename from src/test/resources/test-pack-serialisation-test/pipeline-projection-emir-trade.json
rename to common/src/test/resources/test-pack-serialisation-test/pipeline-projection-emir-trade.json
diff --git a/src/test/resources/test-pack-serialisation-test/pipeline-report-emir-trade.json b/common/src/test/resources/test-pack-serialisation-test/pipeline-report-emir-trade.json
similarity index 100%
rename from src/test/resources/test-pack-serialisation-test/pipeline-report-emir-trade.json
rename to common/src/test/resources/test-pack-serialisation-test/pipeline-report-emir-trade.json
diff --git a/src/test/resources/test-pack-serialisation-test/pipeline-translate-fpml.json b/common/src/test/resources/test-pack-serialisation-test/pipeline-translate-fpml.json
similarity index 100%
rename from src/test/resources/test-pack-serialisation-test/pipeline-translate-fpml.json
rename to common/src/test/resources/test-pack-serialisation-test/pipeline-translate-fpml.json
diff --git a/src/test/resources/test-pack-serialisation-test/test-pack-projection-emir-trade-commodity.json b/common/src/test/resources/test-pack-serialisation-test/test-pack-projection-emir-trade-commodity.json
similarity index 100%
rename from src/test/resources/test-pack-serialisation-test/test-pack-projection-emir-trade-commodity.json
rename to common/src/test/resources/test-pack-serialisation-test/test-pack-projection-emir-trade-commodity.json
diff --git a/src/test/resources/test-pack-serialisation-test/test-pack-report-emir-trade-commodity.json b/common/src/test/resources/test-pack-serialisation-test/test-pack-report-emir-trade-commodity.json
similarity index 100%
rename from src/test/resources/test-pack-serialisation-test/test-pack-report-emir-trade-commodity.json
rename to common/src/test/resources/test-pack-serialisation-test/test-pack-report-emir-trade-commodity.json
diff --git a/src/test/resources/test-pack-serialisation-test/test-pack-translate-fpml-commodity.json b/common/src/test/resources/test-pack-serialisation-test/test-pack-translate-fpml-commodity.json
similarity index 100%
rename from src/test/resources/test-pack-serialisation-test/test-pack-translate-fpml-commodity.json
rename to common/src/test/resources/test-pack-serialisation-test/test-pack-translate-fpml-commodity.json
diff --git a/src/test/resources/test-private-key.der b/common/src/test/resources/test-private-key.der
similarity index 100%
rename from src/test/resources/test-private-key.der
rename to common/src/test/resources/test-private-key.der
diff --git a/src/test/resources/test-public-key.der b/common/src/test/resources/test-public-key.der
similarity index 100%
rename from src/test/resources/test-public-key.der
rename to common/src/test/resources/test-public-key.der
diff --git a/src/test/resources/xml-serialisation/expected/document.xml b/common/src/test/resources/xml-serialisation/expected/document.xml
similarity index 100%
rename from src/test/resources/xml-serialisation/expected/document.xml
rename to common/src/test/resources/xml-serialisation/expected/document.xml
diff --git a/src/test/resources/xml-serialisation/expected/license-header.xml b/common/src/test/resources/xml-serialisation/expected/license-header.xml
similarity index 100%
rename from src/test/resources/xml-serialisation/expected/license-header.xml
rename to common/src/test/resources/xml-serialisation/expected/license-header.xml
diff --git a/src/test/resources/xml-serialisation/expected/multicardinality-container.xml b/common/src/test/resources/xml-serialisation/expected/multicardinality-container.xml
similarity index 100%
rename from src/test/resources/xml-serialisation/expected/multicardinality-container.xml
rename to common/src/test/resources/xml-serialisation/expected/multicardinality-container.xml
diff --git a/src/test/resources/xml-serialisation/expected/nested-container.xml b/common/src/test/resources/xml-serialisation/expected/nested-container.xml
similarity index 100%
rename from src/test/resources/xml-serialisation/expected/nested-container.xml
rename to common/src/test/resources/xml-serialisation/expected/nested-container.xml
diff --git a/src/test/resources/xml-serialisation/expected/substitution-group-multi.xml b/common/src/test/resources/xml-serialisation/expected/substitution-group-multi.xml
similarity index 100%
rename from src/test/resources/xml-serialisation/expected/substitution-group-multi.xml
rename to common/src/test/resources/xml-serialisation/expected/substitution-group-multi.xml
diff --git a/src/test/resources/xml-serialisation/expected/substitution-group.xml b/common/src/test/resources/xml-serialisation/expected/substitution-group.xml
similarity index 100%
rename from src/test/resources/xml-serialisation/expected/substitution-group.xml
rename to common/src/test/resources/xml-serialisation/expected/substitution-group.xml
diff --git a/src/test/resources/xml-serialisation/schema/import-config.yml b/common/src/test/resources/xml-serialisation/schema/import-config.yml
similarity index 100%
rename from src/test/resources/xml-serialisation/schema/import-config.yml
rename to common/src/test/resources/xml-serialisation/schema/import-config.yml
diff --git a/src/test/resources/xml-serialisation/schema/schema.xsd b/common/src/test/resources/xml-serialisation/schema/schema.xsd
similarity index 100%
rename from src/test/resources/xml-serialisation/schema/schema.xsd
rename to common/src/test/resources/xml-serialisation/schema/schema.xsd
diff --git a/pom.xml b/pom.xml
index 5fd0b8cb..31dc64ca 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,21 +25,25 @@
         <version>5</version>
     </parent>
 
-    <name>Rosetta Common</name>
+    <name>Rune Common Parent</name>
+    <modules>
+        <module>common</module>
+        <module>serialization</module>
+    </modules>
     <groupId>com.regnosys</groupId>
-    <artifactId>rosetta-common</artifactId>
-    <packaging>jar</packaging>
+    <artifactId>rune-common-parent</artifactId>
+    <packaging>pom</packaging>
     <version>0.0.0.main-SNAPSHOT</version>
-    <url>https://github.com/REGnosys/rosetta-common</url>
+    <url>https://github.com/finos/rune-common</url>
 
     <scm>
-        <developerConnection>scm:git:https://github.com/REGnosys/rosetta-common</developerConnection>
-        <connection>scm:git:git://github.com/REGnosys/rosetta-common.git</connection>
+        <developerConnection>scm:git:https://github.com/finos/rune-common</developerConnection>
+        <connection>scm:git:git://github.com/finos/rune-common.git</connection>
         <tag>HEAD</tag>
-        <url>https://github.com/REGnosys/rosetta-common</url>
+        <url>https://github.com/finos/rune-common</url>
     </scm>
 
-    <description>Rune Common is a java library that is utilised by Rosetta Code Generators and models expressed in the Rosetta DSL.</description>
+    <description>Rune Common is a java library that is utilised by Rune Code Generators and models expressed in the Rune DSL.</description>
 
     <organization>
         <name>REGnosys</name>
@@ -87,14 +91,13 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <java.enforced.version>[17,18)</java.enforced.version>
         <maven.compiler.release>8</maven.compiler.release>
-        <rosetta.dsl.version>9.25.0</rosetta.dsl.version>
+        <rosetta.dsl.version>9.26.0</rosetta.dsl.version>
 
         <!-- Release -->
         <gpg.keyname>configured-by-release-profile</gpg.keyname>
         <repoServerHost>s01.oss.sonatype.org</repoServerHost>
         <stagingTimeoutInMinutes>10</stagingTimeoutInMinutes>
 
-        <!-- Also to be changed in rosetta-products->persistence -->
         <jackson.version>2.17.1</jackson.version>
         <guice.version>5.0.1</guice.version>
         <guava.version>32.0.1-jre</guava.version>
@@ -272,6 +275,13 @@
                 <artifactId>slf4j-api</artifactId>
                 <version>${slf4j-api.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.junit</groupId>
+                <artifactId>junit-bom</artifactId>
+                <version>${junit.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
             <dependency>
                 <groupId>org.eclipse.xtext</groupId>
                 <artifactId>xtext-dev-bom</artifactId>
@@ -293,13 +303,6 @@
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
-            <dependency>
-                <groupId>org.junit</groupId>
-                <artifactId>junit-bom</artifactId>
-                <version>${junit.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
             <dependency>
                 <groupId>ch.qos.logback</groupId>
                 <artifactId>logback-classic</artifactId>
@@ -312,74 +315,27 @@
                 <version>${logback.version}</version>
                 <scope>test</scope>
             </dependency>
+            <dependency>
+                <groupId>com.regnosys.rosetta</groupId>
+                <artifactId>com.regnosys.rosetta.tests</artifactId>
+                <version>${rosetta.dsl.version}</version>
+                <scope>test</scope>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.eclipse.jdt</groupId>
+                        <artifactId>org.eclipse.jdt.core</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            
         </dependencies>
     </dependencyManagement>
 
     <dependencies>
-        <dependency>
-            <groupId>com.regnosys.rosetta</groupId>
-            <artifactId>com.regnosys.rosetta.lib</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-annotations</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.module</groupId>
-            <artifactId>jackson-module-parameter-names</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.module</groupId>
-            <artifactId>jackson-module-blackbird</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.datatype</groupId>
-            <artifactId>jackson-datatype-jdk8</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.datatype</groupId>
-            <artifactId>jackson-datatype-jsr310</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.datatype</groupId>
-            <artifactId>jackson-datatype-guava</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.datatype</groupId>
-            <artifactId>jackson-datatype-joda</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.dataformat</groupId>
-            <artifactId>jackson-dataformat-yaml</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.dataformat</groupId>
-            <artifactId>jackson-dataformat-xml</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.google.inject</groupId>
-            <artifactId>guice</artifactId>
-        </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-        </dependency>
         <!-- test -->
         <dependency>
             <groupId>org.junit.jupiter</groupId>
@@ -409,17 +365,10 @@
         <dependency>
             <groupId>com.regnosys.rosetta</groupId>
             <artifactId>com.regnosys.rosetta.tests</artifactId>
-            <version>${rosetta.dsl.version}</version>
             <scope>test</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.eclipse.jdt</groupId>
-                    <artifactId>org.eclipse.jdt.core</artifactId>
-                </exclusion>
-            </exclusions>
         </dependency>
     </dependencies>
-
+    
     <build>
         <plugins>
             <plugin>
@@ -492,101 +441,6 @@
                     <release>${maven.compiler.release}</release>
                 </configuration>
             </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>exec-maven-plugin</artifactId>
-                <version>${exec-maven-plugin.version}</version>
-                <executions>
-                    <execution>
-                        <id>import-test-xsd-schema</id>
-                        <phase>generate-test-sources</phase>
-                        <goals>
-                            <goal>java</goal>
-                        </goals>
-                        <configuration>
-                            <mainClass>com.regnosys.rosetta.tools.modelimport.XsdImportMain</mainClass>
-                            <cleanupDaemonThreads>false</cleanupDaemonThreads>
-                            <arguments>
-                                <argument>-config-path</argument>
-                                <argument>${project.basedir}/src/test/resources/xml-serialisation/schema/import-config.yml</argument>
-                                <argument>-rosetta-output-path</argument>
-                                <argument>${project.build.testOutputDirectory}/xml-serialisation/rosetta</argument>
-                                <argument>-xml-config-output-path</argument>
-                                <argument>${project.build.testOutputDirectory}/xml-serialisation/xml-config.json</argument>
-                            </arguments>
-                            <includePluginDependencies>true</includePluginDependencies>
-                        </configuration>
-                    </execution>
-                </executions>
-                <dependencies>
-                    <dependency>
-                        <groupId>com.regnosys.rosetta</groupId>
-                        <artifactId>com.regnosys.rosetta.tools</artifactId>
-                        <version>${rosetta.dsl.version}</version>
-                        <exclusions>
-                            <exclusion>
-                                <groupId>com.regnosys.rosetta</groupId>
-                                <artifactId>com.regnosys.rosetta.ide</artifactId>
-                            </exclusion>
-                        </exclusions>
-                    </dependency>
-                    <dependency>
-                        <groupId>com.regnosys.rosetta</groupId>
-                        <artifactId>com.regnosys.rosetta.xcore</artifactId>
-                        <version>${rosetta.dsl.version}</version>
-                    </dependency>
-                </dependencies>
-            </plugin>
-            <plugin>
-                <groupId>com.regnosys.rosetta</groupId>
-                <artifactId>rosetta-maven-plugin</artifactId>
-                <version>${rosetta.dsl.version}</version>
-                <executions>
-                    <execution>
-                        <id>generate-xsd-based-sources</id>
-                        <phase>generate-test-sources</phase>
-                        <goals>
-                            <goal>testGenerate</goal>
-                        </goals>
-                        <configuration>
-                            <addOutputDirectoriesToCompileSourceRoots>false</addOutputDirectoriesToCompileSourceRoots>
-                            <sourceRoots>
-                                <sourceRoot>${project.build.testOutputDirectory}/xml-serialisation/rosetta</sourceRoot>
-                            </sourceRoots>
-                            <classPathLookupFilter>.*com\.regnosys\.rosetta.*</classPathLookupFilter>
-                            <languages>
-                                <language>
-                                    <setup>com.regnosys.rosetta.RosettaStandaloneSetup</setup>
-                                    <outputConfigurations>
-                                        <outputConfiguration>
-                                            <outputDirectory>${project.build.testOutputDirectory}/xml-serialisation/java</outputDirectory>
-                                        </outputConfiguration>
-                                    </outputConfigurations>
-                                </language>
-                            </languages>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <version>${build-helper-maven-plugin.version}</version>
-                <executions>
-                    <execution>
-                        <id>add-generated-test-sources</id>
-                        <phase>generate-test-sources</phase>
-                        <goals>
-                            <goal>add-test-source</goal>
-                        </goals>
-                        <configuration>
-                            <sources>
-                                <source>${project.build.testOutputDirectory}/xml-serialisation/java</source>
-                            </sources>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>license-maven-plugin</artifactId>
diff --git a/serialization/pom.xml b/serialization/pom.xml
new file mode 100644
index 00000000..573d1f2c
--- /dev/null
+++ b/serialization/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.regnosys</groupId>
+        <artifactId>rune-common-parent</artifactId>
+        <version>0.0.0.main-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>serialization</artifactId>
+
+    <properties>
+        <maven.compiler.source>21</maven.compiler.source>
+        <maven.compiler.target>21</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.regnosys.rosetta</groupId>
+            <artifactId>com.regnosys.rosetta.lib</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.module</groupId>
+            <artifactId>jackson-module-parameter-names</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.module</groupId>
+            <artifactId>jackson-module-blackbird</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jdk8</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jsr310</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-joda</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-yaml</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-xml</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/serialization/src/main/java/org/finos/rune/mapper/RuneJsonObjectMapper.java b/serialization/src/main/java/org/finos/rune/mapper/RuneJsonObjectMapper.java
new file mode 100644
index 00000000..a8574bda
--- /dev/null
+++ b/serialization/src/main/java/org/finos/rune/mapper/RuneJsonObjectMapper.java
@@ -0,0 +1,106 @@
+package org.finos.rune.mapper;
+
+/*-
+ * ==============
+ * Rune Common
+ * ==============
+ * Copyright (C) 2018 - 2024 REGnosys
+ * ==============
+ * Licensed 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.
+ * ==============
+ */
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.core.FormatSchema;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.PrettyPrinter;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
+import com.fasterxml.jackson.datatype.guava.GuavaModule;
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
+import com.fasterxml.jackson.datatype.joda.JodaModule;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
+import com.rosetta.model.lib.RosettaModelObject;
+import org.finos.rune.mapper.date.RuneDateModule;
+import org.finos.rune.mapper.filters.SubTypeFilter;
+import org.finos.rune.mapper.introspector.RuneJsonModule;
+import org.finos.rune.mapper.mixins.RosettaModelObjectMixin;
+
+/**
+ * A custom {@link ObjectMapper} designed for the Rune DSL.
+ * <p>
+ * This class provides JSON serialization and deserialization that closely
+ * aligns with the structure of the Rune DSL, ensuring that the serialized
+ * output is both human-readable and faithful to the DSL's design.
+ * </p>
+ *
+ * <p>
+ * By tailoring the serialization format, this mapper makes the JSON output
+ * intuitive for developers and domain experts working with the Rune DSL,
+ * while maintaining compatibility with standard JSON processing tools.
+ * </p>
+ *
+ * <h2>Usage:</h2>
+ * <pre>
+ * RuneJacksonJsonObjectMapper objectMapper = new RuneJacksonJsonObjectMapper();
+ * String json = objectMapper.writeValueAsString(runeObject);
+ * </pre>
+ *
+ * @see ObjectMapper
+ */
+public class RuneJsonObjectMapper extends ObjectMapper {
+    public RuneJsonObjectMapper() {
+        super(create());
+    }
+
+    @Override
+    protected ObjectWriter _newWriter(SerializationConfig config) {
+        return new RuneJsonObjectWriter(this, config);
+    }
+
+    @Override
+    protected ObjectWriter _newWriter(SerializationConfig config, FormatSchema schema) {
+        return new RuneJsonObjectWriter(this, config, schema);
+    }
+
+    @Override
+    protected ObjectWriter _newWriter(SerializationConfig config, JavaType rootType, PrettyPrinter pp) {
+        return new RuneJsonObjectWriter(this, config, rootType, pp);
+    }
+
+    private static ObjectMapper create() {
+        return new ObjectMapper()
+                .registerModule(new GuavaModule())
+                .registerModule(new JodaModule())
+                .registerModule(new ParameterNamesModule())
+                .registerModule(new Jdk8Module())
+                .registerModule(new JavaTimeModule())
+                .registerModule(new RuneDateModule())
+                .registerModule(new RuneJsonModule())
+                .setSerializationInclusion(JsonInclude.Include.NON_ABSENT)
+                .setSerializationInclusion(JsonInclude.Include.NON_EMPTY)
+                .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
+                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
+                .configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true)
+                .configure(SerializationFeature.WRITE_DATES_WITH_CONTEXT_TIME_ZONE, false)
+                .configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false)
+                .configure(SerializationFeature.FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS, false)
+                .setFilterProvider(new SimpleFilterProvider().addFilter("SubTypeFilter", new SubTypeFilter()))
+                .addMixIn(RosettaModelObject.class, RosettaModelObjectMixin.class)
+                .enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN)
+                .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.PUBLIC_ONLY);
+    }
+}
diff --git a/serialization/src/main/java/org/finos/rune/mapper/RuneJsonObjectWriter.java b/serialization/src/main/java/org/finos/rune/mapper/RuneJsonObjectWriter.java
new file mode 100644
index 00000000..9ff3a1a9
--- /dev/null
+++ b/serialization/src/main/java/org/finos/rune/mapper/RuneJsonObjectWriter.java
@@ -0,0 +1,103 @@
+package org.finos.rune.mapper;
+
+/*-
+ * ==============
+ * Rune Common
+ * ==============
+ * Copyright (C) 2018 - 2025 REGnosys
+ * ==============
+ * Licensed 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.
+ * ==============
+ */
+
+import com.fasterxml.jackson.core.FormatSchema;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.PrettyPrinter;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.fasterxml.jackson.databind.SerializationConfig;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.rosetta.model.lib.RosettaModelObject;
+import com.rosetta.model.lib.annotations.RuneDataType;
+
+import java.util.Arrays;
+
+/**
+ * A custom {@link ObjectWriter} implementation for the Rune DSL.
+ * <p>
+ * This writer extends Jackson's {@link ObjectWriter} to provide JSON serialization
+ * tailored to the Rune DSL. It ensures that serialized objects include metadata
+ * at the top level and maintain a structure that is easy to read and closely aligned
+ * with the DSL's format.
+ * </p>
+ *
+ * <h2>Usage:</h2>
+ * This writer is used internally by the {@link RuneJsonObjectMapper} and
+ * is not typically instantiated directly. Instead, it is accessed through the
+ * configured {@link ObjectMapper}.
+ * <pre>
+ * RuneJacksonJsonObjectMapper objectMapper = new RuneJacksonJsonObjectMapper();
+ * String json = objectMapper.writeValueAsString(runeObject);
+ * </pre>
+ *
+ * @see ObjectWriter
+ * @see RuneJsonObjectMapper
+ */
+public class RuneJsonObjectWriter extends ObjectWriter {
+    private final ObjectMapper mapper;
+
+
+    protected RuneJsonObjectWriter(ObjectMapper mapper, SerializationConfig config, FormatSchema s) {
+        super(mapper, config, s);
+        this.mapper = mapper;
+    }
+
+    public RuneJsonObjectWriter(ObjectMapper mapper, SerializationConfig config) {
+        super(mapper, config);
+        this.mapper = mapper;
+    }
+
+    protected RuneJsonObjectWriter(ObjectMapper mapper, SerializationConfig config, JavaType rootType, PrettyPrinter pp) {
+        super(mapper, config, rootType, pp);
+        this.mapper = mapper;
+    }
+
+    @Override
+    public String writeValueAsString(Object value) throws JsonProcessingException {
+        if (value instanceof RosettaModelObject) {
+            RosettaModelObject rosettaModelObject = (RosettaModelObject) value;
+            ObjectNode objectNode = addTopLevelMeta(rosettaModelObject);
+            return super.writeValueAsString(objectNode);
+        }
+
+        return super.writeValueAsString(value);
+    }
+
+    private <T extends RosettaModelObject> ObjectNode addTopLevelMeta(T runeObject) {
+        Class<? extends RosettaModelObject> runeType = runeObject.getType();
+        return Arrays.stream(runeType.getAnnotations())
+                .filter(allAnnotations -> allAnnotations.annotationType().equals(RuneDataType.class)).findFirst().map(a -> {
+                    RuneDataType runeDataType = (RuneDataType) a;
+                    ObjectNode modifiedNode = mapper.createObjectNode();
+                    modifiedNode = modifiedNode.put("@model", runeDataType.model())
+                            .put("@type", runeType.getCanonicalName())
+                            .put("@version", runeDataType.version());
+
+                    ObjectNode originalNode = mapper.valueToTree(runeObject);
+                    modifiedNode.setAll(originalNode);
+                    return modifiedNode;
+
+                }).orElse(mapper.valueToTree(runeObject));
+    }
+}
diff --git a/serialization/src/main/java/org/finos/rune/mapper/date/DateExtended.java b/serialization/src/main/java/org/finos/rune/mapper/date/DateExtended.java
new file mode 100644
index 00000000..ca135343
--- /dev/null
+++ b/serialization/src/main/java/org/finos/rune/mapper/date/DateExtended.java
@@ -0,0 +1,36 @@
+package org.finos.rune.mapper.date;
+
+/*-
+ * ==============
+ * Rune Common
+ * ==============
+ * Copyright (C) 2018 - 2024 REGnosys
+ * ==============
+ * Licensed 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.
+ * ==============
+ */
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.rosetta.model.lib.records.DateImpl;
+
+import java.time.LocalDate;
+
+public class DateExtended extends DateImpl {
+    public DateExtended(@JsonProperty("year") int year, @JsonProperty("month") int month, @JsonProperty("day") int day) {
+        super(year, month, day);
+    }
+
+    public DateExtended(String date) {
+        super(LocalDate.parse(date));
+    }
+}
diff --git a/serialization/src/main/java/org/finos/rune/mapper/date/RuneDateModule.java b/serialization/src/main/java/org/finos/rune/mapper/date/RuneDateModule.java
new file mode 100644
index 00000000..f02a0136
--- /dev/null
+++ b/serialization/src/main/java/org/finos/rune/mapper/date/RuneDateModule.java
@@ -0,0 +1,52 @@
+package org.finos.rune.mapper.date;
+
+/*-
+ * ==============
+ * Rune Common
+ * ==============
+ * Copyright (C) 2018 - 2024 REGnosys
+ * ==============
+ * Licensed 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.
+ * ==============
+ */
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import com.rosetta.model.lib.records.Date;
+
+import java.io.IOException;
+
+public class RuneDateModule extends SimpleModule {
+    private static final long serialVersionUID = 1L;
+
+    {
+        addDeserializer(Date.class, new StdDeserializer<Date>(Date.class) {
+            @Override
+            public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+                return Date.of(p.readValueAs(DateExtended.class).toLocalDate());
+            }
+        });
+        addSerializer(Date.class, new StdSerializer<Date>(Date.class) {
+            @Override
+            public void serialize(Date value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+                gen.writeString(value.toString());
+            }
+        });
+    }
+}
diff --git a/serialization/src/main/java/org/finos/rune/mapper/filters/SubTypeFilter.java b/serialization/src/main/java/org/finos/rune/mapper/filters/SubTypeFilter.java
new file mode 100644
index 00000000..d61d6b7b
--- /dev/null
+++ b/serialization/src/main/java/org/finos/rune/mapper/filters/SubTypeFilter.java
@@ -0,0 +1,45 @@
+package org.finos.rune.mapper.filters;
+
+/*-
+ * ==============
+ * Rune Common
+ * ==============
+ * Copyright (C) 2018 - 2024 REGnosys
+ * ==============
+ * Licensed 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.
+ * ==============
+ */
+
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.PropertyWriter;
+import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
+
+public class SubTypeFilter extends SimpleBeanPropertyFilter {
+
+    @Override
+    public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider provider, PropertyWriter writer) throws Exception {
+        String name = writer.getName();
+        if (name.equals("@type")) {
+            if (!pojo.getClass().getSuperclass().getCanonicalName().equals(Object.class.getCanonicalName())) {
+                writer.serializeAsField(pojo, jgen, provider);
+            }
+
+            return;
+        }
+        super.serializeAsField(pojo, jgen, provider, writer);
+    }
+
+
+}
diff --git a/serialization/src/main/java/org/finos/rune/mapper/introspector/RuneBeanUtil.java b/serialization/src/main/java/org/finos/rune/mapper/introspector/RuneBeanUtil.java
new file mode 100644
index 00000000..0bffcd49
--- /dev/null
+++ b/serialization/src/main/java/org/finos/rune/mapper/introspector/RuneBeanUtil.java
@@ -0,0 +1,62 @@
+package org.finos.rune.mapper.introspector;
+
+/*-
+ * ==============
+ * Rune Common
+ * ==============
+ * Copyright (C) 2018 - 2024 REGnosys
+ * ==============
+ * Licensed 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.
+ * ==============
+ */
+
+import java.lang.reflect.Method;
+
+public class RuneBeanUtil {
+
+    public static String getPropertyName(Method method) {
+        String methodName = method.getName();
+        String rawPropertyName = getSubstringIfPrefixMatches(methodName, "get");
+        if (rawPropertyName == null) {
+            rawPropertyName = getSubstringIfPrefixMatches(methodName, "set");
+        }
+
+        if (rawPropertyName == null) {
+            rawPropertyName = getSubstringIfPrefixMatches(methodName, "is");
+        }
+
+        if (rawPropertyName == null) {
+            rawPropertyName = getSubstringIfPrefixMatches(methodName, "add");
+        }
+
+        return toLowerCamelCase(rawPropertyName);
+    }
+
+    public static String toLowerCamelCase(String string) {
+        if (string == null) {
+            return null;
+        } else if (string.isEmpty()) {
+            return string;
+        } else if (string.length() > 1 && Character.isUpperCase(string.charAt(1)) && Character.isUpperCase(string.charAt(0))) {
+            return string;
+        } else {
+            char[] chars = string.toCharArray();
+            chars[0] = Character.toLowerCase(chars[0]);
+            return new String(chars);
+        }
+    }
+
+    private static String getSubstringIfPrefixMatches(String wholeString, String prefix) {
+        return wholeString.startsWith(prefix) ? wholeString.substring(prefix.length()) : null;
+    }
+}
diff --git a/serialization/src/main/java/org/finos/rune/mapper/introspector/RuneJsonAnnotationIntrospector.java b/serialization/src/main/java/org/finos/rune/mapper/introspector/RuneJsonAnnotationIntrospector.java
new file mode 100644
index 00000000..1815f10c
--- /dev/null
+++ b/serialization/src/main/java/org/finos/rune/mapper/introspector/RuneJsonAnnotationIntrospector.java
@@ -0,0 +1,165 @@
+package org.finos.rune.mapper.introspector;
+
+/*-
+ * ==============
+ * Rune Common
+ * ==============
+ * Copyright (C) 2018 - 2024 REGnosys
+ * ==============
+ * Licensed 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.
+ * ==============
+ */
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.core.Version;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.PropertyName;
+import com.fasterxml.jackson.databind.cfg.MapperConfig;
+import com.fasterxml.jackson.databind.introspect.*;
+import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder;
+import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
+import com.fasterxml.jackson.databind.util.NameTransformer;
+import com.rosetta.model.lib.annotations.RuneAttribute;
+import com.rosetta.model.lib.annotations.RuneDataType;
+import com.rosetta.model.lib.annotations.RuneMetaType;
+
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+/**
+ * Custom Jackson annotation introspector for handling serialization and deserialization
+ * of classes annotated with {@link RuneDataType}, {@link RuneAttribute}, and {@link RuneMetaType}.
+ *
+ * <p>This introspector modifies Jackson's default behavior to:
+ * <ul>
+ *   <li>Enable alphabetic property sorting for {@link RuneDataType} annotated classes.</li>
+ *   <li>Support custom polymorphic type resolution for {@link RuneDataType} annotations.</li>
+ *   <li>Provide custom name mapping for serialization and deserialization based on {@link RuneAttribute}.</li>
+ *   <li>Handle property unwrapping for {@link RuneMetaType} annotations.</li>
+ *   <li>Define property inclusion/exclusion rules for {@link RuneDataType} classes.</li>
+ * </ul>
+ *
+ * <p>This class overrides several key methods in {@link JacksonAnnotationIntrospector}
+ * to integrate these custom behaviors.
+ *
+ * <p>Key functionality includes:
+ * <ul>
+ *   <li>Polymorphic type resolution for {@link RuneDataType} using custom {@link StdTypeResolverBuilder}.</li>
+ *   <li>Explicit handling of property ordering limitations documented in
+ *       <a href="https://github.com/FasterXML/jackson-databind/issues/1670">jackson-databind issue 1670</a>.</li>
+ *   <li>Integration with {@link RuneAttribute} to control property name mapping for
+ *       serialization and deserialization.</li>
+ *   <li>Support for unwrapping of properties with {@link RuneMetaType} using a no-operation
+ *       {@link NameTransformer}.</li>
+ * </ul>
+ *
+ * @see JacksonAnnotationIntrospector
+ * @see StdTypeResolverBuilder
+ * @see RuneDataType
+ * @see RuneAttribute
+ * @see RuneMetaType
+ */
+public class RuneJsonAnnotationIntrospector extends JacksonAnnotationIntrospector {
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    protected StdTypeResolverBuilder _constructStdTypeResolverBuilder() {
+        return new RuneStdTypeResolverBuilder();
+    }
+
+    @Override
+    protected TypeResolverBuilder<?> _constructStdTypeResolverBuilder(MapperConfig<?> config,
+                                                                      JsonTypeInfo.Value typeInfo, JavaType baseType) {
+        return new RuneStdTypeResolverBuilder(typeInfo);
+    }
+
+    @Override
+    public JsonTypeInfo.Value findPolymorphicTypeInfo(MapperConfig<?> config, Annotated ann) {
+        RuneDataType t = _findAnnotation(ann, RuneDataType.class);
+        if (t != null) {
+            return JsonTypeInfo.Value.construct(JsonTypeInfo.Id.CLASS,
+                    JsonTypeInfo.As.EXISTING_PROPERTY,
+                    "@type",
+                    JsonTypeInfo.class,
+                    true,
+                    false);
+        }
+        return super.findPolymorphicTypeInfo(config, ann);
+    }
+
+    @Override
+    public Class<?> findPOJOBuilder(AnnotatedClass ac) {
+        if (ac.hasAnnotation(RuneDataType.class)) {
+            return ac.getAnnotation(RuneDataType.class).builder();
+        }
+        return super.findPOJOBuilder(ac);
+    }
+
+    @Override
+    public PropertyName findNameForSerialization(Annotated a) {
+        if (a.hasAnnotation(RuneAttribute.class)) {
+            return new PropertyName(a.getAnnotation(RuneAttribute.class).value());
+        }
+        return super.findNameForSerialization(a);
+    }
+
+    @Override
+    public PropertyName findNameForDeserialization(Annotated a) {
+        if (a.hasAnnotation(RuneAttribute.class)) {
+            return new PropertyName(a.getAnnotation(RuneAttribute.class).value());
+        }
+        return super.findNameForDeserialization(a);
+    }
+
+    @Override
+    public NameTransformer findUnwrappingNameTransformer(AnnotatedMember member) {
+        RuneMetaType ann = _findAnnotation(member, RuneMetaType.class);
+        // if not enabled, just means annotation is not enabled; not necessarily
+        // that unwrapping should not be done (relevant when using chained introspectors)
+        if (ann == null) {
+            return super.findUnwrappingNameTransformer(member);
+        }
+        return  NameTransformer.NOP;
+    }
+
+    @Override
+    public JsonIgnoreProperties.Value findPropertyIgnoralByName(MapperConfig<?> config, Annotated a) {
+        if (a instanceof AnnotatedClass && a.hasAnnotation(RuneDataType.class)) {
+            AnnotatedClass acc = (AnnotatedClass) a;
+            Set<String> includes = getPropertyNames(acc, x -> x.hasAnnotation(RuneAttribute.class));
+            Set<String> ignored = getPropertyNames(acc, x -> !x.hasAnnotation(RuneAttribute.class));
+            ignored.removeAll(includes);
+            return JsonIgnoreProperties.Value.forIgnoredProperties(ignored).withAllowSetters();
+        }
+
+        return super.findPropertyIgnoralByName(config, a);
+    }
+
+    private static Set<String> getPropertyNames(AnnotatedClass acc, Predicate<AnnotatedMethod> filter) {
+        return StreamSupport.stream(acc.memberMethods().spliterator(), false)
+                .filter(filter)
+                .map(m -> RuneBeanUtil.getPropertyName(m.getAnnotated()))
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+    }
+
+    @Override
+    public Version version() {
+        return Version.unknownVersion();
+    }
+
+}
diff --git a/serialization/src/main/java/org/finos/rune/mapper/introspector/RuneJsonModule.java b/serialization/src/main/java/org/finos/rune/mapper/introspector/RuneJsonModule.java
new file mode 100644
index 00000000..65b7a0ed
--- /dev/null
+++ b/serialization/src/main/java/org/finos/rune/mapper/introspector/RuneJsonModule.java
@@ -0,0 +1,52 @@
+package org.finos.rune.mapper.introspector;
+
+/*-
+ * ==============
+ * Rune Common
+ * ==============
+ * Copyright (C) 2018 - 2024 REGnosys
+ * ==============
+ * Licensed 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.
+ * ==============
+ */
+
+import com.fasterxml.jackson.core.json.PackageVersion;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+/**
+ * Using a module class to append our annotation introspector with a minimal fuss
+ */
+public class RuneJsonModule extends SimpleModule {
+
+    private static final long serialVersionUID = 1L;
+
+    public RuneJsonModule() {
+        super(PackageVersion.VERSION);
+    }
+
+    @Override
+    public void setupModule(SetupContext context) {
+        super.setupModule(context);
+        context.insertAnnotationIntrospector(new RuneJsonAnnotationIntrospector());
+    }
+
+    @Override
+    public int hashCode() {
+        return getClass().hashCode();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        return this == o;
+    }
+}
diff --git a/serialization/src/main/java/org/finos/rune/mapper/introspector/RuneStdTypeResolverBuilder.java b/serialization/src/main/java/org/finos/rune/mapper/introspector/RuneStdTypeResolverBuilder.java
new file mode 100644
index 00000000..44bd646f
--- /dev/null
+++ b/serialization/src/main/java/org/finos/rune/mapper/introspector/RuneStdTypeResolverBuilder.java
@@ -0,0 +1,50 @@
+package org.finos.rune.mapper.introspector;
+
+/*-
+ * ==============
+ * Rune Common
+ * ==============
+ * Copyright (C) 2018 - 2024 REGnosys
+ * ==============
+ * Licensed 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.
+ * ==============
+ */
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.databind.DeserializationConfig;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.introspect.AnnotatedClass;
+import com.fasterxml.jackson.databind.introspect.AnnotatedClassResolver;
+import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
+import com.rosetta.model.lib.annotations.RuneDataType;
+
+public class RuneStdTypeResolverBuilder extends StdTypeResolverBuilder {
+
+    public RuneStdTypeResolverBuilder(JsonTypeInfo.Value typeInfo) {
+        super(typeInfo);
+    }
+
+    public RuneStdTypeResolverBuilder() {
+        super();
+    }
+
+    @Override
+    public boolean _strictTypeIdHandling(DeserializationConfig config, JavaType baseType) {
+        AnnotatedClass annotatedClass = AnnotatedClassResolver.resolve(config, baseType, config);
+        if (annotatedClass.hasAnnotation(RuneDataType.class)) {
+            return _requireTypeIdForSubtypes;
+        }
+
+        return super._strictTypeIdHandling(config, baseType);
+    }
+}
diff --git a/serialization/src/main/java/org/finos/rune/mapper/mixins/RosettaModelObjectMixin.java b/serialization/src/main/java/org/finos/rune/mapper/mixins/RosettaModelObjectMixin.java
new file mode 100644
index 00000000..64cc3f4d
--- /dev/null
+++ b/serialization/src/main/java/org/finos/rune/mapper/mixins/RosettaModelObjectMixin.java
@@ -0,0 +1,32 @@
+package org.finos.rune.mapper.mixins;
+
+/*-
+ * ==============
+ * Rune Common
+ * ==============
+ * Copyright (C) 2018 - 2024 REGnosys
+ * ==============
+ * Licensed 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.
+ * ==============
+ */
+
+import com.fasterxml.jackson.annotation.JsonFilter;
+import com.rosetta.model.lib.RosettaModelObject;
+import com.rosetta.model.lib.annotations.RuneAttribute;
+
+@JsonFilter("SubTypeFilter")
+public @interface RosettaModelObjectMixin {
+
+    @RuneAttribute("@type")
+    Class<? extends RosettaModelObject> getType();
+}
diff --git a/serialization/src/test/java/org/finos/rune/serialization/DynamicCompiledClassLoader.java b/serialization/src/test/java/org/finos/rune/serialization/DynamicCompiledClassLoader.java
new file mode 100644
index 00000000..fff68b78
--- /dev/null
+++ b/serialization/src/test/java/org/finos/rune/serialization/DynamicCompiledClassLoader.java
@@ -0,0 +1,36 @@
+package org.finos.rune.serialization;
+
+/*-
+ * ==============
+ * Rune Common
+ * ==============
+ * Copyright (C) 2018 - 2024 REGnosys
+ * ==============
+ * Licensed 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.
+ * ==============
+ */
+
+import java.util.Map;
+
+public class DynamicCompiledClassLoader extends ClassLoader {
+    private Map<String, Class<?>> compiledCode;
+
+    @Override
+    protected Class<?> findClass(String name) throws ClassNotFoundException {
+        return compiledCode.containsKey(name) ? compiledCode.get(name) : super.findClass(name);
+    }
+
+    public void setCompiledCode(Map<String, Class<?>> compiledCode) {
+        this.compiledCode = compiledCode;
+    }
+}
diff --git a/serialization/src/test/java/org/finos/rune/serialization/RuneJsonSerializerErrorHandlingTest.java b/serialization/src/test/java/org/finos/rune/serialization/RuneJsonSerializerErrorHandlingTest.java
new file mode 100644
index 00000000..3abc7a0b
--- /dev/null
+++ b/serialization/src/test/java/org/finos/rune/serialization/RuneJsonSerializerErrorHandlingTest.java
@@ -0,0 +1,164 @@
+package org.finos.rune.serialization;
+
+/*-
+ * ==============
+ * Rune Common
+ * ==============
+ * Copyright (C) 2018 - 2024 REGnosys
+ * ==============
+ * Licensed 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.
+ * ==============
+ */
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Injector;
+import com.regnosys.rosetta.RosettaStandaloneSetup;
+import com.regnosys.rosetta.tests.util.CodeGeneratorTestHelper;
+import com.rosetta.model.lib.RosettaModelObject;
+import org.finos.rune.mapper.RuneJsonObjectMapper;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Collections;
+
+import static org.finos.rune.serialization.RuneSerializerTestHelper.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@Disabled
+public class RuneJsonSerializerErrorHandlingTest {
+    public static final String TEST_TYPE = "rune-serializer-error-handling-test";
+    private ObjectMapper objectMapper;
+
+    private static CodeGeneratorTestHelper helper;
+
+    @BeforeAll
+    static void beforeAll() {
+        RosettaStandaloneSetup rosettaStandaloneSetup = new RosettaStandaloneSetup();
+        Injector injector = rosettaStandaloneSetup.createInjectorAndDoEMFRegistration();
+        helper = injector.getInstance(CodeGeneratorTestHelper.class);
+    }
+
+    @BeforeEach
+    void setUp() {
+        objectMapper = new RuneJsonObjectMapper();
+    }
+
+
+    @Test
+    public void testCardinalityTooManyElementsThrowsException() {
+        Path groupPath = getGroupPath("cardinality");
+        Class<RosettaModelObject> rootDataType = getRootRosettaModelObjectClass(groupPath, "cardinality.rosetta");
+        String json = readAsString(getFile(groupPath, "too-many-elements.json"));
+
+        RosettaModelObject deserializedObject = fromJson(json, rootDataType);
+
+        RuntimeException runtimeException = assertThrows(RuntimeException.class, () -> {
+            toJson(deserializedObject);
+        });
+
+        assertEquals("Attribute contained more than the allowed number of elements", runtimeException.getMessage());
+    }
+
+    @Test
+    public void testNumberFractionTooLargeThrowsException() {
+        Path groupPath = getGroupPath("parameterised");
+        Class<RosettaModelObject> rootDataType = getRootRosettaModelObjectClass(groupPath, "parameterised.rosetta");
+        String json = readAsString(getFile(groupPath, "number-fraction-too-large.json"));
+
+        RosettaModelObject deserializedObject = fromJson(json, rootDataType);
+
+        RuntimeException runtimeException = assertThrows(RuntimeException.class, () -> {
+            toJson(deserializedObject);
+        });
+
+        assertEquals("Number contained more than the allowed number of digits", runtimeException.getMessage());
+    }
+
+    @Test
+    public void testNumberTooLargeThrowsException() {
+        Path groupPath = getGroupPath("parameterised");
+        Class<RosettaModelObject> rootDataType = getRootRosettaModelObjectClass(groupPath, "parameterised.rosetta");
+        String json = readAsString(getFile(groupPath, "number-too-large.json"));
+
+        RosettaModelObject deserializedObject = fromJson(json, rootDataType);
+
+        RuntimeException runtimeException = assertThrows(RuntimeException.class, () -> {
+            toJson(deserializedObject);
+        });
+
+        assertEquals("Number contained more than the allowed number of digits", runtimeException.getMessage());
+    }
+
+    @Test
+    public void testStringIllegalPatternThrowsException() {
+        Path groupPath = getGroupPath("parameterised");
+        Class<RosettaModelObject> rootDataType = getRootRosettaModelObjectClass(groupPath, "parameterised.rosetta");
+        String json = readAsString(getFile(groupPath, "string-illegal-pattern.json"));
+
+        RosettaModelObject deserializedObject = fromJson(json, rootDataType);
+
+        RuntimeException runtimeException = assertThrows(RuntimeException.class, () -> {
+            toJson(deserializedObject);
+        });
+
+        assertEquals("String does not match the required pattern", runtimeException.getMessage());
+    }
+
+    @Test
+    public void testStringTooLargeThrowsException() {
+        Path groupPath = getGroupPath("parameterised");
+        Class<RosettaModelObject> rootDataType = getRootRosettaModelObjectClass(groupPath, "parameterised.rosetta");
+        String json = readAsString(getFile(groupPath, "string-too-large.json"));
+
+        RosettaModelObject deserializedObject = fromJson(json, rootDataType);
+
+        RuntimeException runtimeException = assertThrows(RuntimeException.class, () -> {
+            toJson(deserializedObject);
+        });
+
+        assertEquals("String exceeds the maximum length", runtimeException.getMessage());
+    }
+
+    private static Path getGroupPath(String groupName) {
+        return  Paths.get("src/test/resources").resolve(TEST_TYPE).resolve(groupName);
+    }
+
+    private Class<RosettaModelObject> getRootRosettaModelObjectClass(Path groupPath, String fileName) {
+        Path rosetta = getFile(groupPath, fileName);
+        String groupName = groupPath.getFileName().toString();
+        return generateCompileAndGetRootDataType(groupName, Collections.singletonList(rosetta), helper, new DynamicCompiledClassLoader());
+    }
+
+    private <T extends RosettaModelObject> T fromJson(String runeJson, Class<T> type) {
+        try {
+            return objectMapper.readValue(runeJson, type);
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private <T extends RosettaModelObject> String toJson(T runeObject) {
+        try {
+            return objectMapper.writerWithDefaultPrettyPrinter()
+                    .writeValueAsString(runeObject);
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/serialization/src/test/java/org/finos/rune/serialization/RuneJsonSerializerRoundTripTest.java b/serialization/src/test/java/org/finos/rune/serialization/RuneJsonSerializerRoundTripTest.java
new file mode 100644
index 00000000..3d755dc1
--- /dev/null
+++ b/serialization/src/test/java/org/finos/rune/serialization/RuneJsonSerializerRoundTripTest.java
@@ -0,0 +1,104 @@
+package org.finos.rune.serialization;
+
+/*-
+ * ==============
+ * Rune Common
+ * ==============
+ * Copyright (C) 2018 - 2024 REGnosys
+ * ==============
+ * Licensed 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.
+ * ==============
+ */
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Injector;
+import com.regnosys.rosetta.tests.util.CodeGeneratorTestHelper;
+import com.rosetta.model.lib.RosettaModelObject;
+import org.finos.rune.mapper.RuneJsonObjectMapper;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import java.nio.file.Path;
+import java.util.List;
+import java.util.stream.Stream;
+
+import static org.finos.rune.serialization.RuneSerializerTestHelper.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class RuneJsonSerializerRoundTripTest {
+    public static final String TEST_TYPE = "rune-serializer-round-trip-test";
+    private static DynamicCompiledClassLoader dynamicCompiledClassLoader;
+
+    private static CodeGeneratorTestHelper helper;
+    private ObjectMapper objectMapper;
+
+    @BeforeAll
+    static void beforeAll() {
+        Injector injector = setupInjector();
+        helper = injector.getInstance(CodeGeneratorTestHelper.class);
+        dynamicCompiledClassLoader = new DynamicCompiledClassLoader();
+    }
+
+    @BeforeEach
+    void setUp() {
+        objectMapper = new RuneJsonObjectMapper();
+        objectMapper.setTypeFactory(objectMapper.getTypeFactory().withClassLoader(dynamicCompiledClassLoader));
+    }
+
+    @ParameterizedTest(name = "{0} - {1}")
+    @MethodSource("testCases")
+    public void testSerializationRoundTrip(String group, String testCaseName, Class<? extends RosettaModelObject> rosettaRootType, String jsonString) {
+        RosettaModelObject deserializedObject = fromJson(jsonString, rosettaRootType);
+        String serializedjsonString = toJson(deserializedObject);
+        assertEquals(jsonString, serializedjsonString, testCaseName + ": Serialization round trip failed");
+    }
+
+    public static Stream<Arguments> testCases() {
+        return groups(TEST_TYPE).stream()
+                .flatMap(groupPath -> {
+                            List<Path> rosettas = listFiles(groupPath, ".rosetta");
+                            String groupName = groupPath.getFileName().toString();
+                    Class<RosettaModelObject> rootDataType = generateCompileAndGetRootDataType(groupName, rosettas, helper, dynamicCompiledClassLoader);
+
+                            return listFiles(groupPath, ".json").stream()
+                                    .map(jsonPath -> Arguments.of(
+                                            groupName,
+                                            jsonPath.getFileName().toString(),
+                                            rootDataType,
+                                            readAsString(jsonPath)
+                                    ));
+                        }
+                );
+    }
+
+    private <T extends RosettaModelObject> T fromJson(String runeJson, Class<T> type) {
+        try {
+            return objectMapper.readValue(runeJson, type);
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private <T extends RosettaModelObject> String toJson(T runeObject) {
+        try {
+            return objectMapper.writerWithDefaultPrettyPrinter()
+                    .writeValueAsString(runeObject);
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/serialization/src/test/java/org/finos/rune/serialization/RuneSerializerTestHelper.java b/serialization/src/test/java/org/finos/rune/serialization/RuneSerializerTestHelper.java
new file mode 100644
index 00000000..9f9ca7f0
--- /dev/null
+++ b/serialization/src/test/java/org/finos/rune/serialization/RuneSerializerTestHelper.java
@@ -0,0 +1,117 @@
+package org.finos.rune.serialization;
+
+/*-
+ * ==============
+ * Rune Common
+ * ==============
+ * Copyright (C) 2018 - 2024 REGnosys
+ * ==============
+ * Licensed 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.
+ * ==============
+ */
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import com.google.inject.util.Modules;
+import com.regnosys.rosetta.RosettaRuntimeModule;
+import com.regnosys.rosetta.RosettaStandaloneSetup;
+import com.regnosys.rosetta.config.RosettaConfiguration;
+import com.regnosys.rosetta.config.RosettaGeneratorsConfiguration;
+import com.regnosys.rosetta.config.RosettaModelConfiguration;
+import com.regnosys.rosetta.tests.util.CodeGeneratorTestHelper;
+import com.rosetta.model.lib.RosettaModelObject;
+import org.eclipse.xtext.common.TerminalsStandaloneSetup;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class RuneSerializerTestHelper {
+
+    public static final String TEST_MODEL_NAME = "serialization";
+
+    @SuppressWarnings("unchecked")
+    public static <T extends RosettaModelObject> Class<T> generateCompileAndGetRootDataType(String groupName,
+                                                                                            List<Path> rosettaPaths,
+                                                                                            CodeGeneratorTestHelper helper, DynamicCompiledClassLoader dynamicCompiledClassLoader) {
+        String[] rosettaFileContents = rosettaPaths.stream().map(RuneSerializerTestHelper::readAsString).toArray(String[]::new);
+        HashMap<String, String> generatedCode = helper.generateCode(rosettaFileContents);
+        Map<String, Class<?>> compiledCode = helper.compileToClasses(generatedCode);
+        dynamicCompiledClassLoader.setCompiledCode(compiledCode);
+        Class<?> aClass = compiledCode.get(TEST_MODEL_NAME + ".test." + groupName + ".Root");
+        return (Class<T>) aClass;
+    }
+
+    public static String readAsString(Path jsonPath) {
+        try {
+            return new String(Files.readAllBytes(jsonPath));
+        } catch (IOException e) {
+            throw new UncheckedIOException(e);
+        }
+    }
+
+    public static List<Path> groups(String testType) {
+        try (Stream<Path> files = Files.list(Paths.get("src/test/resources/" + testType))) {
+            return files.filter(Files::isDirectory).collect(Collectors.toList());
+        } catch (IOException e) {
+            throw new UncheckedIOException(e);
+        }
+    }
+
+    public static Path getFile(Path groupPath, String fileName) {
+        try (Stream<Path> files = Files.list(groupPath)) {
+            return files.filter(x -> x.getFileName().toString().equals(fileName)).collect(Collectors.toList())
+                    .stream().findFirst()
+                    .orElseThrow(() -> new RuntimeException("File not found: " + fileName));
+        } catch (IOException e) {
+            throw new UncheckedIOException(e);
+        }
+    }
+
+    public static List<Path> listFiles(Path groupPath, String suffix) {
+        try (Stream<Path> files = Files.list(groupPath)) {
+            return files.filter(x -> x.getFileName().toString().endsWith(suffix)).collect(Collectors.toList());
+        } catch (IOException e) {
+            throw new UncheckedIOException(e);
+        }
+    }
+
+    public static Injector setupInjector() {
+        RosettaStandaloneSetup rosettaStandaloneSetup = new RosettaStandaloneSetup();
+        TerminalsStandaloneSetup.doSetup();
+
+        Module module = Modules.override(new RosettaRuntimeModule()).with(new AbstractModule() {
+            @Override
+            protected void configure() {
+                bind(RosettaConfiguration.class).toInstance(new RosettaConfiguration(
+                        new RosettaModelConfiguration(TEST_MODEL_NAME),
+                        new ArrayList<>(),
+                        new RosettaGeneratorsConfiguration()
+                ));
+            }
+        });
+        Injector injector = Guice.createInjector(module);
+        rosettaStandaloneSetup.register(injector);
+        return injector;
+    }
+}
diff --git a/serialization/src/test/resources/rune-serializer-error-handling-test/cardinality/cardinality.rosetta b/serialization/src/test/resources/rune-serializer-error-handling-test/cardinality/cardinality.rosetta
new file mode 100644
index 00000000..8b8378b0
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-error-handling-test/cardinality/cardinality.rosetta
@@ -0,0 +1,7 @@
+namespace cardinality
+
+annotation rootType: <"Mark a type as a root of the rosetta model">
+
+type Root:
+  [rootType]
+  stringList string (0..2)
diff --git a/serialization/src/test/resources/rune-serializer-error-handling-test/cardinality/too-many-elements.json b/serialization/src/test/resources/rune-serializer-error-handling-test/cardinality/too-many-elements.json
new file mode 100644
index 00000000..b2919192
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-error-handling-test/cardinality/too-many-elements.json
@@ -0,0 +1,6 @@
+{
+  "@model": "test.cardinality",
+  "@type": "test.cardinality.Root",
+  "@version": "0.0.0",
+  "stringList": ["foo", "bar", "baz"]
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/number-fraction-too-large.json b/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/number-fraction-too-large.json
new file mode 100644
index 00000000..78a65eb5
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/number-fraction-too-large.json
@@ -0,0 +1,6 @@
+{
+  "@model": "test.parameterised",
+  "@type": "test.parameterised.Root",
+  "@version": "0.0.0",
+  "parameterisedNumber": 1.23456789
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/number-too-large.json b/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/number-too-large.json
new file mode 100644
index 00000000..01ef2321
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/number-too-large.json
@@ -0,0 +1,6 @@
+{
+  "@model": "test.parameterised",
+  "@type": "test.parameterised.Root",
+  "@version": "0.0.0",
+  "parameterisedNumber": 123456789
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/parameterised.rosetta b/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/parameterised.rosetta
new file mode 100644
index 00000000..eac8a252
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/parameterised.rosetta
@@ -0,0 +1,15 @@
+namespace parameterised
+
+annotation rootType: <"Mark a type as a root of the rosetta model">
+
+typeAlias ParameterisedNumberType:
+	number(digits: 3, fractionalDigits: 2)
+
+typeAlias ParameterisedStringType:
+    string(minLength: 1, maxLength: 2, pattern: "[a-zA-Z]")
+
+type Root:
+  [rootType]
+  parameterisedNumber ParameterisedNumberType (0..1)
+  parameterisedString ParameterisedStringType (0..1)
+    
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/string-illegal-pattern.json b/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/string-illegal-pattern.json
new file mode 100644
index 00000000..26b4020e
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/string-illegal-pattern.json
@@ -0,0 +1,6 @@
+{
+  "@model": "test.parameterised",
+  "@type": "test.parameterised.Root",
+  "@version": "0.0.0",
+  "parameterisedString": "$$"
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/string-too-large.json b/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/string-too-large.json
new file mode 100644
index 00000000..c432c53e
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-error-handling-test/parameterised/string-too-large.json
@@ -0,0 +1,6 @@
+{
+  "@model": "test.parameterised",
+  "@type": "test.parameterised.Root",
+  "@version": "0.0.0",
+  "parameterisedString": "abcdefg"
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/basic/basic-types-list.json b/serialization/src/test/resources/rune-serializer-round-trip-test/basic/basic-types-list.json
new file mode 100644
index 00000000..a209b36d
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/basic/basic-types-list.json
@@ -0,0 +1,13 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.basic.Root",
+  "@version" : "0.0.0",
+  "basicList" : {
+    "booleanTypes" : [ true, false, true ],
+    "numberTypes" : [ 123.456, 789, 345.123 ],
+    "parameterisedNumberTypes" : [ 123.99, 456, 99.12 ],
+    "parameterisedStringTypes" : [ "abcDEF", "foo", "foo" ],
+    "stringTypes" : [ "foo", "bar", "Baz123" ],
+    "timeTypes" : [ "12:00:00" ]
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/basic/basic-types-single.json b/serialization/src/test/resources/rune-serializer-round-trip-test/basic/basic-types-single.json
new file mode 100644
index 00000000..8edd3fe6
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/basic/basic-types-single.json
@@ -0,0 +1,13 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.basic.Root",
+  "@version" : "0.0.0",
+  "basicSingle" : {
+    "booleanType" : true,
+    "numberType" : 123.456,
+    "parameterisedNumberType" : 123.99,
+    "parameterisedStringType" : "abcDEF",
+    "stringType" : "foo",
+    "timeType" : "12:00:00"
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/basic/basic.rosetta b/serialization/src/test/resources/rune-serializer-round-trip-test/basic/basic.rosetta
new file mode 100644
index 00000000..ce1c47c9
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/basic/basic.rosetta
@@ -0,0 +1,31 @@
+namespace serialization.test.basic
+
+annotation rootType: <"Mark a type as a root of the rosetta model">
+
+typeAlias ParameterisedNumberType:
+	number(digits: 18, fractionalDigits: 2)
+
+typeAlias ParameterisedStringType:
+    string(minLength: 1, maxLength: 20, pattern: "[a-zA-Z]")
+
+type BasicSingle:
+  booleanType boolean (1..1)
+  numberType number (1..1)
+  parameterisedNumberType ParameterisedNumberType (1..1)
+  parameterisedStringType ParameterisedStringType (1..1)
+  stringType string (1..1)
+  timeType time (1..1)
+
+type BasicList:
+  booleanTypes boolean (1..*)
+  numberTypes number (1..*)
+  parameterisedNumberTypes ParameterisedNumberType (1..*)
+  parameterisedStringTypes ParameterisedStringType (1..*)
+  stringTypes string (1..*)
+  timeTypes time (1..*)
+
+type Root:
+  [rootType]
+  basicSingle BasicSingle (0..1)
+  basicList BasicList (0..1)
+    
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-basic.json b/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-basic.json
new file mode 100644
index 00000000..629720b4
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-basic.json
@@ -0,0 +1,8 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.choicetype.Root",
+  "@version" : "0.0.0",
+  "choiceBasic" : {
+    "string" : "foo"
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-data.json b/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-data.json
new file mode 100644
index 00000000..63c32f17
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-data.json
@@ -0,0 +1,10 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.choicetype.Root",
+  "@version" : "0.0.0",
+  "choiceData" : {
+    "A" : {
+      "fieldA" : "foo"
+    }
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-mixed-1.json b/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-mixed-1.json
new file mode 100644
index 00000000..9447c2f7
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-mixed-1.json
@@ -0,0 +1,10 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.choicetype.Root",
+  "@version" : "0.0.0",
+  "choiceMixed" : {
+    "B" : {
+      "fieldB" : "foo"
+    }
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-mixed-2.json b/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-mixed-2.json
new file mode 100644
index 00000000..972ed019
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice-mixed-2.json
@@ -0,0 +1,8 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.choicetype.Root",
+  "@version" : "0.0.0",
+  "choiceMixed" : {
+    "string" : "foo"
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice.rosetta b/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice.rosetta
new file mode 100644
index 00000000..6c3ceb81
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/choicetype/choice.rosetta
@@ -0,0 +1,28 @@
+namespace serialization.test.choicetype
+
+annotation rootType: <"Mark a type as a root of the rosetta model">
+
+choice ChoiceBasic:
+  string
+  number
+
+type A:
+  fieldA string (1..1)
+
+type B:
+  fieldB string (1..1)
+
+choice ChoiceData:
+  A
+  B
+
+choice ChoiceMixed:
+  A
+  B
+  string
+
+type Root:
+  [rootType]
+  choiceBasic ChoiceBasic (0..1)
+  choiceData ChoiceData (0..1)
+  choiceMixed ChoiceMixed (0..1)
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/data/data-types.json b/serialization/src/test/resources/rune-serializer-round-trip-test/data/data-types.json
new file mode 100644
index 00000000..2885f02c
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/data/data-types.json
@@ -0,0 +1,16 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.data.Root",
+  "@version" : "0.0.0",
+  "a" : {
+    "b" : [ { }, {
+      "c" : {
+        "field" : "foo"
+      }
+    }, {
+      "c" : {
+        "field" : "bar"
+      }
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/data/data.rosetta b/serialization/src/test/resources/rune-serializer-round-trip-test/data/data.rosetta
new file mode 100644
index 00000000..5dbdac8a
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/data/data.rosetta
@@ -0,0 +1,16 @@
+namespace serialization.test.data
+
+annotation rootType: <"Mark a type as a root of the rosetta model">
+
+type A:
+  b B (1..*)
+
+type B:
+  c C (0..1)
+
+type C:
+  field string (1..1)
+
+type Root:
+  [rootType]
+  a A (1..1)
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/enumtypes/enum-types-list.json b/serialization/src/test/resources/rune-serializer-round-trip-test/enumtypes/enum-types-list.json
new file mode 100644
index 00000000..4138fccc
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/enumtypes/enum-types-list.json
@@ -0,0 +1,8 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.enumtypes.Root",
+  "@version" : "0.0.0",
+  "enumList" : {
+    "enumType" : [ "A", "B", "C", "B" ]
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/enumtypes/enum-types-single.json b/serialization/src/test/resources/rune-serializer-round-trip-test/enumtypes/enum-types-single.json
new file mode 100644
index 00000000..62c4da7f
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/enumtypes/enum-types-single.json
@@ -0,0 +1,8 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.enumtypes.Root",
+  "@version" : "0.0.0",
+  "enumSingle" : {
+    "enumType" : "A"
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/enumtypes/enum.rosetta b/serialization/src/test/resources/rune-serializer-round-trip-test/enumtypes/enum.rosetta
new file mode 100644
index 00000000..d6e35fc9
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/enumtypes/enum.rosetta
@@ -0,0 +1,19 @@
+namespace serialization.test.enumtypes
+
+annotation rootType: <"Mark a type as a root of the rosetta model">
+
+enum EnumType:
+  A
+  B
+  C
+
+type EnumSingle:
+  enumType EnumType (1..1)
+
+type EnumList:
+  enumType EnumType (1..*)
+
+type Root:
+  [rootType]
+  enumSingle EnumSingle (0..1)
+  enumList EnumList (0..1)
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/extension/base-type.json b/serialization/src/test/resources/rune-serializer-round-trip-test/extension/base-type.json
new file mode 100644
index 00000000..1cf7cf1f
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/extension/base-type.json
@@ -0,0 +1,8 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.extension.Root",
+  "@version" : "0.0.0",
+  "typeA" : {
+    "fieldA" : "foo"
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/extension/extended-type-concrete.json b/serialization/src/test/resources/rune-serializer-round-trip-test/extension/extended-type-concrete.json
new file mode 100644
index 00000000..bc84b3b4
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/extension/extended-type-concrete.json
@@ -0,0 +1,9 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.extension.Root",
+  "@version" : "0.0.0",
+  "typeB" : {
+    "fieldB" : "foo",
+    "@type" : "serialization.test.extension.B"
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/extension/extended-type-polymorphic.json b/serialization/src/test/resources/rune-serializer-round-trip-test/extension/extended-type-polymorphic.json
new file mode 100644
index 00000000..9a26157d
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/extension/extended-type-polymorphic.json
@@ -0,0 +1,10 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.extension.Root",
+  "@version" : "0.0.0",
+  "typeA" : {
+    "fieldA" : "bar",
+    "fieldB" : "foo",
+    "@type" : "serialization.test.extension.B"
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/extension/extension.rosetta b/serialization/src/test/resources/rune-serializer-round-trip-test/extension/extension.rosetta
new file mode 100644
index 00000000..17b875b5
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/extension/extension.rosetta
@@ -0,0 +1,16 @@
+namespace serialization.test.extension
+
+annotation rootType: <"Mark a type as a root of the rosetta model">
+
+
+type A:
+  fieldA string (1..1)
+
+type B extends A:
+  fieldB string (1..1)
+
+type Root:
+  [rootType]
+  typeA A (0..1)
+  typeB B (0..1)
+
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/attribute-ref.json b/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/attribute-ref.json
new file mode 100644
index 00000000..9a53ad09
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/attribute-ref.json
@@ -0,0 +1,16 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.metakey.Root",
+  "@version" : "0.0.0",
+  "attributeRef" : {
+    "dateField" : {
+      "@data" : "2024-12-12",
+      "@key" : "someKey",
+      "@key:external" : "someExternalKey"
+    },
+    "dateReference" : {
+      "@ref" : "someKey",
+      "@ref:external" : "someExternalKey"
+    }
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/dangling-attribute-ref.json b/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/dangling-attribute-ref.json
new file mode 100644
index 00000000..4cfa7b38
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/dangling-attribute-ref.json
@@ -0,0 +1,11 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.metakey.Root",
+  "@version" : "0.0.0",
+  "attributeRef" : {
+    "dateReference" : {
+      "@ref" : "someKey",
+      "@ref:external" : "someExternalKey"
+    }
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/dangling-node-ref.json b/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/dangling-node-ref.json
new file mode 100644
index 00000000..724faa75
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/dangling-node-ref.json
@@ -0,0 +1,11 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.metakey.Root",
+  "@version" : "0.0.0",
+  "nodeRef" : {
+    "aReference" : {
+      "@ref" : "someKey",
+      "@ref:external" : "someExternalKey"
+    }
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/meta-key.rosetta b/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/meta-key.rosetta
new file mode 100644
index 00000000..b2a223f8
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/meta-key.rosetta
@@ -0,0 +1,23 @@
+namespace serialization.test.metakey
+
+annotation rootType: <"Mark a type as a root of the rosetta model">
+
+type A:
+  [metadata key]
+  fieldA string (1..1)
+
+type NodeRef:
+  typeA A (0..1)
+  aReference A (0..1)
+    [metadata reference]
+
+type AttributeRef:
+  dateField date (0..1)
+    [metadata id]
+  dateReference date (0..1)
+    [metadata reference]
+
+type Root:
+  [rootType]
+  nodeRef NodeRef (0..1)
+  attributeRef AttributeRef (0..1)
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/node-ref.json b/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/node-ref.json
new file mode 100644
index 00000000..7b7fcd63
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/metakey/node-ref.json
@@ -0,0 +1,16 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.metakey.Root",
+  "@version" : "0.0.0",
+  "nodeRef" : {
+    "typeA" : {
+      "fieldA" : "foo",
+      "@key" : "someKey",
+      "@key:external" : "someExternalKey"
+    },
+    "aReference" : {
+      "@ref" : "someKey",
+      "@ref:external" : "someExternalKey"
+    }
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/metalocation/address.json b/serialization/src/test/resources/rune-serializer-round-trip-test/metalocation/address.json
new file mode 100644
index 00000000..a0de0b86
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/metalocation/address.json
@@ -0,0 +1,14 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.metalocation.Root",
+  "@version" : "0.0.0",
+  "typeA" : {
+    "b" : {
+      "fieldB" : "foo",
+      "@key:scoped" : "someLocation"
+    }
+  },
+  "bAddress" : {
+    "@ref:scoped" : "someLocation"
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/metalocation/dangling-address.json b/serialization/src/test/resources/rune-serializer-round-trip-test/metalocation/dangling-address.json
new file mode 100644
index 00000000..c86a090a
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/metalocation/dangling-address.json
@@ -0,0 +1,8 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.metalocation.Root",
+  "@version" : "0.0.0",
+  "bAddress" : {
+    "@ref:scoped" : "someLocation"
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/metalocation/meta-location.rosetta b/serialization/src/test/resources/rune-serializer-round-trip-test/metalocation/meta-location.rosetta
new file mode 100644
index 00000000..323d199e
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/metalocation/meta-location.rosetta
@@ -0,0 +1,16 @@
+namespace serialization.test.metalocation
+
+annotation rootType: <"Mark a type as a root of the rosetta model">
+
+type A:
+  b B (1..1)
+    [metadata location]
+
+type B:
+  fieldB string (1..1)
+
+type Root:
+  [rootType]
+  typeA A (0..1)
+  bAddress B (0..1)
+    [metadata address "pointsTo"=A->b]
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/enum-list.json b/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/enum-list.json
new file mode 100644
index 00000000..0ae28a02
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/enum-list.json
@@ -0,0 +1,15 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.metascheme.Root",
+  "@version" : "0.0.0",
+  "enumTypeList" : [ {
+    "@data" : "A",
+    "@scheme" : "https://www.example.com/scheme1"
+  }, {
+    "@data" : "B",
+    "@scheme" : "https://www.example.com/scheme2"
+  }, {
+    "@data" : "C",
+    "@scheme" : "https://www.example.com/scheme3"
+  } ]
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/enum-single.json b/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/enum-single.json
new file mode 100644
index 00000000..83ffb1cb
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/enum-single.json
@@ -0,0 +1,9 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.metascheme.Root",
+  "@version" : "0.0.0",
+  "enumType" : {
+    "@data" : "A",
+    "@scheme" : "https://www.example.com/scheme"
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/meta-scheme.rosetta b/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/meta-scheme.rosetta
new file mode 100644
index 00000000..18728dfe
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/meta-scheme.rosetta
@@ -0,0 +1,23 @@
+namespace serialization.test.metascheme
+
+annotation rootType: <"Mark a type as a root of the rosetta model">
+
+enum EnumType:
+  A
+  B
+  C
+
+type A:
+  fieldA string (1..1)
+    [metadata scheme]
+
+type Root:
+  [rootType]
+  enumType EnumType (0..1)
+    [metadata scheme]
+  typeA A (0..1)
+    [metadata scheme]
+  enumTypeList EnumType (0..*)
+    [metadata scheme]
+  typeAList A (0..*)
+    [metadata scheme]
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/node-list.json b/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/node-list.json
new file mode 100644
index 00000000..63af4247
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/node-list.json
@@ -0,0 +1,24 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.metascheme.Root",
+  "@version" : "0.0.0",
+  "typeAList" : [ {
+    "fieldA" : {
+      "@data" : "foo",
+      "@scheme" : "https://www.example.com/scheme1"
+    },
+    "@scheme" : "https://www.example.com/scheme-outer1"
+  }, {
+    "fieldA" : {
+      "@data" : "bar",
+      "@scheme" : "https://www.example.com/scheme2"
+    },
+    "@scheme" : "https://www.example.com/scheme-outer2"
+  }, {
+    "fieldA" : {
+      "@data" : "baz",
+      "@scheme" : "https://www.example.com/scheme3"
+    },
+    "@scheme" : "https://www.example.com/scheme-outer3"
+  } ]
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/node-single.json b/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/node-single.json
new file mode 100644
index 00000000..64c45ea1
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/metascheme/node-single.json
@@ -0,0 +1,12 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.metascheme.Root",
+  "@version" : "0.0.0",
+  "typeA" : {
+    "fieldA" : {
+      "@data" : "foo",
+      "@scheme" : "https://www.example.com/scheme1"
+    },
+    "@scheme" : "https://www.example.com/scheme2"
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/record/record-types-list.json b/serialization/src/test/resources/rune-serializer-round-trip-test/record/record-types-list.json
new file mode 100644
index 00000000..195be6ff
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/record/record-types-list.json
@@ -0,0 +1,10 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.record.Root",
+  "@version" : "0.0.0",
+  "recordList" : {
+    "dateType" : [ "2024-12-10", "2024-11-10", "2024-10-20" ],
+    "dateTimeType" : [ "2024-12-12T11:18:58", "2024-12-12T11:18:58", "2024-12-12T11:18:58" ],
+    "zonedDateTimeType" : [ "2024-12-12T11:18:57Z", "2024-12-12T11:18:57Z", "2024-12-12T11:18:57Z" ]
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/record/record-types-single.json b/serialization/src/test/resources/rune-serializer-round-trip-test/record/record-types-single.json
new file mode 100644
index 00000000..d348ba57
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/record/record-types-single.json
@@ -0,0 +1,10 @@
+{
+  "@model" : "serialization",
+  "@type" : "serialization.test.record.Root",
+  "@version" : "0.0.0",
+  "recordSingle" : {
+    "dateType" : "2024-12-10",
+    "dateTimeType" : "2024-12-12T11:18:58",
+    "zonedDateTimeType" : "2024-12-12T11:18:57Z"
+  }
+}
\ No newline at end of file
diff --git a/serialization/src/test/resources/rune-serializer-round-trip-test/record/record.rosetta b/serialization/src/test/resources/rune-serializer-round-trip-test/record/record.rosetta
new file mode 100644
index 00000000..f3c437f4
--- /dev/null
+++ b/serialization/src/test/resources/rune-serializer-round-trip-test/record/record.rosetta
@@ -0,0 +1,18 @@
+namespace serialization.test.record
+
+annotation rootType: <"Mark a type as a root of the rosetta model">
+
+type RecordSingle:
+  dateType date (1..1)
+  dateTimeType dateTime (1..1)
+  zonedDateTimeType zonedDateTime (1..1)
+
+type RecordList:
+  dateType date (1..*)
+  dateTimeType dateTime (1..*)
+  zonedDateTimeType zonedDateTime (1..*)
+
+type Root:
+  [rootType]
+  recordSingle RecordSingle (0..1)
+  recordList RecordList (0..1)
\ No newline at end of file