Change Log

All notable changes to this project will be documented in this file.



  • [snomed] fix NPE when expanding owlExpressions() on inactive concept (3b79cbb6c308e33cb020410350cd1f8b8be8005d)

  • [cis] decrease default bulk request size to 10.000 ids (797af884b22bcb61ea3c06dbe142cb049acd8e8a)

  • [cis] remove status check from CisClient Register call (25f48375ca80aed95f62d02e95ac58e012be04c0)



  • Support definitionStatusId in POST /concepts endpoint (8552b99)

  • Set definitionStatus to primitive automatically when inactivating a concept (8552b99)


  • [cis] allow ID registration of already published IDs (ccc225d)

  • [cis] do not report unauthorized and forbidden errors in the log (28ac77a)

  • [cis] add CIS SCTID status update bash script (96776cc, f78ea65)



  • Support filtering refset members by mapPriority (a0bff3d)


  • [index] Log the number of pending cluster tasks (959a088)

  • [index] fix query boosting issue (2de4841)

  • [core] Allow customization of component adjustment during publication (a0e6820)

  • [history] Ignore many-valued features altogether in HistoryInfoProvider (526d3e7)

  • [snomed] Fix incorrectly categorized query refset evaluation changes (#467)

  • [snomed] Fix incorrect parentage values when reactivating concept's relationships first then the concept in two different commits (5298252)

  • [cis] accept all SNOMED CT ID statuses when publishing them (c914c05)

  • [mrcm] Handle ECL expressions in attributes' concept set definitions in MRCM validation rules (0cc7b61)

  • [export] Create general ExportResult class (filename, UUID pair) (8265617)



  • Support OWL Axiom (owlRelationships()) expansion on OWL Reference Set Members


  • Support OWL Axiom Members in certain SNOMED CT Validation Rules (#455)


  • [reasoner] multiple changes to SNOMED to OWL conversion (28f6615)

  • [reasoner] fix group numbering issue in classification (8678901)

  • [validation] handle no result when evaluating query based validation rules (1cedb3b)



  • [api] add filter by mapGroup member property (76560db)

  • [api] Add proper throws declarations for attachments api methods (adc2ed7)

  • [ecl] support BooleanValueEquals and NotEquals data comparisons in concrete domain member refinements (3399d33)

  • [validation] duplicate reference set member validation rule (#420)

  • [classification] cancel classification task properly after cancelling the corresponding remote job (05bf99b)

  • [jobs] Fix NPE for canceled but scheduled jobs (173fcb6)



  • Support filtering refset members by OWL expression (#407)


  • Add new concept set definition type (#408)


  • Improve job filtering API (#411)

  • Add auto cleanup option to job schedule (#406)


  • Rename common validation rules (#410)


  • Fix refset member duplication issue (#412)

  • Allow adding inactive query refset members (#414)



  • Expose special member property based filtering over REST API (5fde911)


  • Add data synchronization script and migration guide to CIS product (d645ce1, 5f01750)


  • New auto RF2 import script to automatically import RF2 files via REST API (#398)


  • Supporting deletion of validation issues by tooling and branch (db9b492)

  • Add published/unpublished filtering to validation issues (#391)

  • Properly filter unpublished members in rule snomed-common-4 (#394)

  • Add new description character length validation rule (#400)

  • Handle reference sets properly in validation issue detail expansion (#402)


  • Revert fix [api] inactivate all language members when inactivating a SNOMED CT Description

  • Allow duplicate relationships in DSV export (#393)

  • Handle descriptions during equivalent concept merging during classification (#392)



  • [api] allow description reactivation with RETIRED (aka empty) inactivation indicator

  • [api] inactivate all language members when inactivating a SNOMED CT Description

  • [api] allow creating inactive concepts and descriptions

  • [export] avoid issues due to duplicate data during DSV export

  • [export] compare source and target effective dates of latest module dependencies when calculating effective time for RF2 export

  • [validation] update snomed common rule 4's description

  • [classification] track redundant relationships as well in hasInferredChanges flag



  • New CIS product and module is now available (#379)

    • It partially supports the official CIS API

    • Specifically the single and bulk ID operations, retrieval and authentication endpoints

    • See the new /snowowl/cis Swagger API documentation page

    • Configure it under the new cis root configuration node


  • Support filtering of validation white list entries by created_at and affectedComponentLabel (#376, #381)

  • New common validation rule to check duplicate preferred FSNs and Synonyms in any language reference set (#382)


  • Disable TCP transport when setting repository.port to 0 (740c904)

  • Configuration key snomed.ids has been replaced with the new cis root configuration node (#379)


  • Create SNOMED CT Extension aware module and namespace assignment algorithm (#380)


  • [reindex] Recreate index document of branches that were created after the very last commit (#375)

  • Fix SNOMED CT OWL Toolkit and Axiom conversion issue (c381c07)

  • Exclude inactive query members from query refset evaluation (#383)



  • Allow querying owl expressions by either type or destination ids (9ab1048, 958ee81)

  • Allow setting pending move inactivation indicator on SNOMED CT Descriptions of new SNOMED CT Concepts (63f4b1f)

  • Remove logic that disallowed reactivating a concept while adding an inactivation indicator and/or association target(s) (86ed3c7)

  • Support defaultModuleId for all enum based member updates (#368)

  • Remove minimum number of required SNOMED CT Relationships validation from SNOMED CT Concept create request (9ac5c99)


  • New user adduser command has been added to the available OSGi commands (#374)


  • Support id exclusion list (#372)

    • Read and use all ID exclusion files under /configuration/reservations folder

    • Format: SNOMED CT Identifiers separated by new line character(s)


  • Support whitelist entry labels (#369)


  • Let the axiom conversion service create 'SubObjectPropertyOf' and 'SubDataPropertyOf' axioms (e9b9c34)


  • [api] Fix refset member search request parameter (a76c0d7)

  • [api] lookup moduleId when creating refset member (41adfc5)

  • [api] fix potential race condition when building bulk request from multiple threads (9d1b64e)

  • [console] fix rf2_refset import OSGi command (054da61)

  • [import] Fix error when importing SNAPSHOT without any valid data (69b9bda)

  • [reasoner] Add missing concept IDs to the relationship module and namespace collector in the equivalent concept merging phase (a042274)

  • [reasoner] Skip axiom relationships where either the source or the destination is inactive (96c4494)

  • [reasoner] Fix initial state of SCHEDULED classification task (733e4b8)

  • [validation] Remove stated MRCM rule (2657abd)


  • Bump SNOMED OWL Toolkit to 2.6.0


REST API changes

  • New HTTP POST /search endpoints have been added for /:path/concepts, /:path/descriptions, /:path/relationships, /:path/members

  • Add sort query parameter to all search endpoints that have internal support for field-based sorting (/concepts, /descriptions, /relationships, /refsets, /members, /classifications, /branches)

  • Add term based sorting to concepts endpoint (sort=term[:asc|desc])

  • Add parent, ancestor, statedParent, statedAncestor based filtering directly to /:path/concepts endpoints

  • Add id filter to all component search endpoints

  • Expose refsetIds filter to the RF2 Export REST API and make branch, modules and refsets configurable in the auto RF2 export script

  • Expose /reasoners endpoint to get available reasoner from the REST API

  • Add owlExpression.conceptId and owlExpression.gci filters to /:path/members endpoints


  • Make classification excludedModuleIds property configurable via snowowl_config.yml


  • Support term highlighting in Validation Framework


  • [search] increase query column length to 8192 characters in MySQL Database schema


  • [api] fix missing JSON/CSV Validation issues endpoints in Swagger UI

  • [api] allow encoded slash in GET request URLs

  • [docs] fix styling of client and server errors section

  • [search] fix nested SNOMED CT Query evaluations

  • [search] fix ascending flag bug for script-based sorts

  • [reasoner] fix missing ontology list OSGi command

  • [reasoner] fix classification issues after applying OWL changes from 20190731 alpha release

  • [export] replace tab/newline chars in owlExpression to spaces



  • New com.b2international.snowowl.snomed.icons module with default SNOMED CT Concept images (0d444fa, ac0123e)

  • New MRCM based type validation rule and stated version for all MRCM rule (#344)

  • SNOMED CT API improvements:

    • New semanticTag filter on GET /:path/concepts endpoint (0f304ec)

    • New semanticTag filter on GET /:path/descriptions endpoint (0f304ec)

    • New caseSignificance filter on GET /:path/descriptions endpoint (0f304ec)

    • characteristicTypeId and modifierId have been added to SnomedRelationship JSON representation (66bf620, 763e1ee)

    • Changed type of array values of parentIds, ancestorIds, statedParentIds, statedAncestorIds to String from long (81f7628)


  • Updated OWLAPI to support more recent reasoner versions (#342)


  • defaults directory support (6468aa1)

  • .xtend files from all modules except com.b2international.snowowl.snomed.ecl.tests (#345)


  • Fixed definition status calculation issue (1dbb3c5)

  • Excluded whitelisted response items in GET /validations/:id/issues endpoint (#347)

  • Fixed incorrect Location URL returned in POST /validations endpoint (#347)

  • Fixed incorrect (non-null) effective time value after changing targetComponentId/valueId on active reference set members (5959e88)

  • Fixed missing ECL cardinality conversion service in SNOMED CT Query Language infrastructure (706ba1c)

  • Fixed incorrect wrapping of IdRequest in SNOMED CT transactions (#349)




  • Change moduleId of updated relationship or concrete domain member using the currently set module assigner algorithm (#341)

  • Redirect Elasticsearch log messages to SLF4J logger instead of logging to stdout (86fdc02)


  • Fix incorrect parent/ancestor array values on inactive SNOMED CT Concepts (#343)

  • Fix random code system allocation bug in e2e SNOMED CT test cases (03b6001)



  • Fix issue with SNOMED CT RF2 Snapshot file imports (c2a5bcd)



  • OWL Axiom support

    • Compute stated tree form based on OWL Axiom SubClassOf definitions

    • Query OWL Axioms when evaluating ECL expressions on stated form

    • Hybrid mode on definition status updates (either updates an existing OWL Expression member or the Concept's definitionStatusId property)

  • Effective time restore functionality for SNOMED CT Reference Set Members

  • Support for relationship group updates in classification

  • Evaluation of ECL expressions on stated form

  • New generic validation rule to report relationships with incorrect characteristic types


  • Report only active relationships with inactive reference as conflicts upon merge/rebase

  • Severity change in MRCM range validation rule


  • Fix repeated header in Validation DSV Export API

  • Fix various issues with Simple/Map type DSV Exports

  • Fix incorrect update of concrete domain MRCM predicates

  • Fix session disconnect command bug

  • Properly disconnect user after failed login attempt to prevent Already logged in exceptions


  • Improve performance of SNOMED CT Bulk updates with lots of Reference Set Member updates

  • Improve performance of restore effective time functionality


  • Add SNOMED CT OWL Toolkit 2.3.2

  • Upgrade Spring to 4.3.22

  • Replace Swaggermvc 0.9.3 with Springfox 2.8.0

  • Upgrade rest-assured library to 3.2.0

  • Upgrade mapdb library to 3.0.7

  • Upgrade SLF4J to 1.7.25

  • Upgrade Logback to 1.2.3

  • Upgrade Fastutil to 8.2.2

  • Upgrade Tycho to 1.2.0



  • New MRCM attribute range validation rule (#319)


  • Numerous improvements to classification time equivalent concept merging functionality (#318)


  • Acceptability merge conflict rule (#321)


  • Fix incorrect update of members when more than 50 members were present for a concept (b224370)

  • Fix occasional startup failure due to incorrect initialization phase used in the reasoner module (#325)

  • Fix DSV export group occurence bug (c494229)


  • Normal form generation performance improvements (#318)



  • SNOMED CT Validation API (#307)

    • Validate the content of SNOMED CT with custom queries and scripts

  • Support sorting of validation issues by label (8b59181)

  • SNOMED CT Query Language improvements (#306)

    • Support active, moduleId filters on Concept and Description components

    • Support languageCode, typeId, caseSignificanceId, preferredIn, acceptableIn and languageRefSetId filters on SNOMED CT Descriptions

    • Support regular expressions and exact term matching in term filter

    • Add {{...}} syntax to match the official SNOMED CT Query Language draft syntax


  • Ignore property chain hierarchies collection if no type IDs make use of this functionality, to speed up normal form computation (a31ce0c)


  • Replace line break and tab characters with empty spaces when exporting query and term fields in RF2 (#304, 920a0e2)

  • Fix issues with Simple type Reference Set DSV export (#309)

  • Fix invalid validation errors when trying to import SNAPSHOT RF2 with Unpublished effective times (#308)

  • Fix errors when trying to classify relationships with inactive source/destination concepts (fa540a8)

  • Fix errors when trying to expand inactive ancestors or descendants in SNOMED CT Concept API (86f0aa0)

  • Fix UUID validation in SNOMED CT RF2 import validator (#315)



  • Make classification requests more customizable/configurable (#305)


  • Fix RF2 import lock timeout issue (#303)



  • SNOMED CT Query Language feature (#298)

    • The initial version of the language supports the full ECL v1.3 and description term filters

    • filterByQuery method has been added to SNOMED CT Concept Java API

    • query parameter has been added to GET /:path/concepts API

  • Customizable SNOMED CT RF2 export bash script has been added to automate RF2 export tasks (#299)

  • Support RF2 packages where the OWLExpression files names are using the new file naming convention (c3de2d0)

  • Environment variable substitution is now supported in snowowl_config.yml configuration file via ${...} expressions

  • Support ECL expression in filterBy languageRefSet, preferredIn and acceptableIn description filters. (7709d5a)

  • locales parameter to history API (04cb537)


  • Apply classification changes from 7.x (#300)


  • snomed.language configuration key has been removed. APIs, commands now accept a list of locales in preference order to compute display names/labels/etc. (2ef2a4a)

  • Deprecated Export RefSet to Excel functionality has been removed (ac9927d)

  • Deprecated RF1 and RF2 exporter implementations (46d22e1)


  • Fixed hot backup file path bug (23f896a, 2fff0f6)

  • Fix relationship affected component label bug in SNOMED CT validation (d69b56f)

  • Fix a few bugs in SNOMED CT Reference Set DSV export (94ccf64)

  • Improve performance of RF2 import by reducing the amount of loaded available components during init (2772cb2)


Breaking changes

This section discusses the changes that you need to be aware of when migrating your application to Snow Owl 6.11.0.

Concrete Domain Reference Set Member changes (#288)

Property groups now can contain concrete domain properties as well, not just relationships (new column relationshipGroup). Also, the attributeName property has been renamed to typeId and all concrete domain labels (attribute names) must be converted to valid, existing SNOMED CT Concepts in order to support new concrete domain schema. In case you did not had any concrete domain members and you are not planning to use this feature, you can safely use your existing dataset without issues. In other cases, feel free to contact B2i to support your migration to Snow Owl 6.11.0.


  • Add repository.index.clusterName configuration key to customize the clusterName of the embedded ES instance (#281)

  • Add system property to enforce usage of HTTP connection to the embedded ES instance (#281)

  • Support for TCP based connection to remote Elasticsearch clusters (clusterUrl configuration key now supports both tcp:// and http://) (#281)

    • NOTE: TCP connection to a cluster does not yet support authentication

  • Java API methods to simplify synchronous execution of requests (8d0e15d)

  • Support for childOf HierarchyInclusionType in MRCM rules (#287)

  • Support for dependencies between two code system. A Code System now declare another as a dependency (#286)

  • New Concept and Description inactivation indicators (102b127)


  • Make SNOMED CT Description term field mutable (#284)

  • Allow non-SNOMED CT identifier in mapCategoryId column (8b325be)

  • Export FSN in description term columns when exporting Mapping Reference Sets to DSV (#283)


  • Elasticsearch has been bumped to the latest 6.5 version (#281)


  • Set write.wait_for_active_shards setting to all to fix inconsistencies in the underlying index when using replicas

  • Fix serialization issue when using the class SctId (8284600)

  • Fix missing clause for referencedComponentType filters (b98308a)

  • Report a conflict when an inbound relationship references detached destination concept. Fixes object not found and versioning errors (a8ce29e)

  • Fix script arguments unrecognized by Elasticsearch (#289)



  • Bump Jackson modules to 2.8.11 and Jackson Databind module to (fixes security vulnerability issues reported by GitHub)


  • Simplify and improve SNOMED CT Description term fuzzy matching functionality (9d7bce4)


  • Delete all types of referring members when component is deleted (130d938)

  • Fix de/serialization of module dependency member fields (a5f4369)

  • Validate versionId before creating Code System Version entry (39efad0)

  • Fix reference set DSV import related issues (bb3efa0, bc8ec3b)

  • Fix potentional validation issue duplication (7956697)

  • Fix error when trying to revert effective time of an RF2 component without any released versions (7f16873)

  • Use single-node discovery in embedded mode by default (38075a3)



  • Support for unpublished component only validation (#271)

  • Inbound relationship expand for SNOMED CT Concept search and get requests (#267)

  • Configuration option for Elasticsearch cluster health request timeout (2819c8c)


  • Consider additional relationship types as well when computing MRCM rules for a concept (110f2e3)

  • sourceEffectiveTime and targetEffectiveTime reference set member properties serialized as effective time instead of dates (8e0e830)


  • Merged com.b2international.snowowl.index.api, and bundles into a single com.b2international.snowowl.index module (#269)


  • Improve evaluation of ECL queries targeting large set of focus concepts (c73fd72, 35e1380)

  • Improve execution of Concept search requests with both ECL and TERM filters (530eb15)


  • Fix FUZZY + TERM filter bug when the term consist only of escaped characters (0cc2c4c)

  • Fix NSEE when attempting to export an RF2 package with no SNOMED CT versions yet in the system (c79dc21)

  • Fix server startup issue due to a bug in startup script (2530f67)

  • Ignore 404 responses thrown by Elasticsearch REST client (c6be1d2)



  • Support SNOMED CT component effective time filter in Validation Issues Search API (#260)

  • Support affectedComponent label filter in Validation Issues Search API (20962f2)

  • Complete searchAfter paging API support for REST API endpoints (#261)

  • A new Other Validation Rule severity type (#263)

  • Support basic authentication configuration values in Elasticsearch configuration in case of connecting to a remote cluster (#264)


  • Use serialized String values for searchAfter parameters in search Java APIs (#261)

  • RF2 export archive and file effective times are now calculated based on module dependency refset entries of the selected module IDs (dc959e1)


  • Fix attribute group cardinality bug in ECL evaluation (#259)

  • Use socket timeout as retry timeout in Elasticsearch HTTP REST client (34a6eb4)

  • Fix SSH connection to OSGi console (5e9cdff)



  • A new deploymentId configuration key to specify both DB and Index name prefix to support multi-tenant deployments (#256)

  • Support MRCM reference set member properties in SnomedRefSetMemberSearchRequest (a14b9d9)


  • Use the high-level Elasticsearch REST Client to communicate with either an embedded note or remote cluster (#251)

  • Check all potential reference set member properties where a component ID might be referenced during module dependency updates (17b3a2a)


  • Bump Virgo package version from 3.7.0.M3 to 3.7.2 (#253)

  • Bump Elasticsearch version from 6.0.1 to 6.3.2 (#251)


  • Improve SNOMED CT RF2 export performance (#249)

  • Reduce number of documents to load when using snomed-query based validation rules (4f980a1)


  • Fix cache cleanup (memory leak) in SnomedEditingContext/SnomedRefSetEditingContext (d97bf3e)

  • Fix occasionally failing unit tests due to index refresh bug in EsDocumentSearcher (2d3cd7f)

  • Fix incorrect RF2 archive effective date when using endEffectiveDate filter in RF2 Delta exports (cd54af3)



  • Configuration options for validation thread pool sizes and parallel execution of rules (#246, 09c971e)

  • Support field selection in low-level aggregations API (b429a46, a59cb7e)


  • Support delimiter parameter in DSV exports (7ad7d6f)

  • Support latest specification changes in OWL Axiom and Ontology Reference Sets (#248, 72994dc)

  • Increase number of default shards for revision indexes to 6 (11ca54d)


  • Use Groovy Eclipse release update site instead of snapshot (0e15090)

  • Fix missing FSNs, PTs in RefSet DSV exports, change default file names to PT of the Reference Set (1bb3fe3, 3f7cd3e, af6d9d1)


  • Reduce memory consumption and execution time of large scale validation jobs (#246, 9e35a24)


Breaking changes

This section discusses the changes that you need to be aware of when migrating your application to Snow Owl 6.5.0.

Datasets created before 6.5.0

All datasets created before 6.5.0 require a full reindex due to changes in the MRCM document schema.



  • Improved donated content detection and resolution during SNOMED CT Extension upgrade (and merge) (

  • Redesigned MRCM constraint document schema (

    • Add support for source-only object mappings

    • Add concept set definitions, predicates and attribute constraints from the MRCM Ecore model as document snippets

    • Add domain-level representation for all parts as well

    • Support the interpretation of the extended domain models in clients



  • Over 80% reduction in time for large scale changes (e.g. for updating batches of content using templates). (, f958f53, 6b58d0a, e0d041a)

  • It now takes under 30 seconds to 1) create and save 10,000 new concepts with descriptions and an IS A relationship to SNOMED CT 2) Update all 10,000 concepts, changing their module and 3) Update all 10,000 concepts again, inactivating the relationship to SNOMED CT and adding a new one to Clinical finding. (see test case)

  • Decrease execution time of scroll requests, especially when ECL evaluation is involved (39e78a5)

  • Decrease execution time of branch merge operations (243509d)

  • Reduce memory requirement of large scale validation requests (2abae78)

  • Reduce execution time of e2e tests (b3c824c)


Breaking changes

This section discusses the changes that you need to be aware of when migrating your application to Snow Owl 6.4.0.

Datasets created before 6.4.0

All datasets created before 6.4.0 require a full reindex due to changes in all codesystem schemas.


  • Add inferred and stated parent ID arrays to the SNOMED CT Concept representations (a5f1f1f)

  • Support revision expression values in search requests path parameters (6e5ab16)


  • Reintroduce revision hashing to support proper calculation of change sets between two branch points (#219)

  • Allow locally running applications to access embedded ES instance (adbf017)

  • Allow SNOMED CT Descriptions as simple map referenced component types (52b6ca9)


  • Fix ID Filter bug in search requests (773b241)

  • Reduce amount of memory allocated when deserializing SNOMED CT index documents (98c4f2f, 2d4d749)

  • Fix incorrect scroll state checks when scrolling documents (597f36b)

  • Skip logging of script arguments to prevent possible memory leak (3c0c578)

  • Properly prevent deletion of released components (#217)

  • Fix line duplication issue of RF2 export (c7c802e)

  • Fix ECL evaluation issues in RF2 export process (5fcec36)


  • Improve index search request execution significantly (5f6d4fe)

  • Improve performance of bulk member create requests (#216)

  • Remove classification results from memory when saving changes (8d2456f)


Breaking changes

This section discusses the changes that you need to be aware of when migrating your application to Snow Owl 6.3.0.

Datasets created before 6.3.0

All datasets created before 6.3.0 require a full reindex due to changes in SNOMED CT index schema.


  • Support multiple language code files in RF2 import (#194)

  • Support locale specific term based sorting in SNOMED CT Concept API (#199)

  • Support running a selection of validation rules instead of all of them (#196, #212)

  • Include Additional relationship types when exporting Reference Sets to DSV (#208)

  • Support expansion of preferredDescriptions() in SNOMED CT Concept API

  • Support HEAD requests on /snowowl/admin/info endpoint (d8e90e5)

  • Track inactive memberships of SNOMED CT core components in memberOf index field


  • Improve SNOMED CT RF2 Export API (#210)

  • Allow SNOMED CT Relationships with inactive source/destination to be imported (#205)

  • Reference Set identifier concept inactivation automatically inactivates members (e445053)

  • Changed default CDO's soft reference based revision cache to time/size eviction based Guava Cache (#199)

  • Field selection now uses indexed docValues instead of _source to improve response time of search requests (2895245)


  • Deprecated filteredrefset API (998368f)


  • Fix conceptToKeep selection logic from equivalent concept sets (#200)

  • Fix singleton module/namespace assigner bug in SNOMED CT Classification (#202)

  • Fix branch timestamp update when importing RF2 with unpublished content (#203)

  • Fix and simplify module dependency member collection logic (#191, #214)

  • Reduce memory usage of revision compare (9d5b355)

  • Reduce memory usage of RF2 import (a3642e9)

  • Improve Validation Whitelist API performance (#206)

  • Improve performance of Validation API (#209)

  • Add 60s timeout to EventBus address synchronization (3cfb315)

  • Fix CDORemoveFeatureDelta bug (0929669)

  • Fix occasionally failing bulk updates in index commits (cba7e18)



  • Set status of stale remote jobs to FAILED during startup (580d3e3)


  • Fix missing searchAfter argument from revision index searches (56a5e03)

  • Serialize ECL expressions in a synchronized block (5d05844)



  • New, generic scripting API module (com.b2international.scripting.api)

    • Groovy implementation of the new scripting API module (com.b2international.scripting.groovy)

  • SNOMED CT Validation API

    • Add Groovy based validation rule implementation and execution

    • Add white list support (#189)

  • isActiveMemberOf filter now supports ECL expressions in SNOMED CT Component search requests

  • Add module and namespace assigner feature from 4.x branch ()

  • Deleted branches can be reused by creating a branch with the same path (parent + name) (dc53ade)


  • Dependencies:

    • Kotlin OSGI 1.1.51 has been added

    • Groovy from 2.0.7 to 2.4.13

    • Jackson from 2.8.6 to 2.8.10

    • EMF JSON Serializer library has been removed


  • Bunch of deprecated, unused API and functionality, related commits:

    • 1de52b0

    • 268bc5d

    • 7a23851

    • 94db418

    • 2145d55

    • 7b63998

    • bbacfb5

    • 5d104f8

    • e8a3323

    • 6db7221

    • 4a790d8

    • a67de24

    • e274766

    • 56c9636

    • 613dd59

    • b39ffd2

    • c733563

    • 3f92263

  • Modules:

    • com.b2international.commons.groovy

    • com.b2international.snowowl.scripting.core


    • com.b2international.snowowl.scripting.server.feature


  • Fix DSV import bugs (02180b4)

  • Fix component not found exception thrown when trying to look up new components from transaction (97918c5)

  • Fix HTTP method type when communicating with external identifier service (CIS) (32e9e85)


Breaking changes

This section discusses the changes that you need to be aware of when migrating your application to Snow Owl 6.0.0.

Datasets created before 6.0.0

Snow Owl v6.0.0 does not support Lucene based indexes anymore. We've decided to remove that module completely in favor of the now fully supported and stable Elasticsearch based module. All datasets (including the ones created with the experimental Elasticsearch module) need a full reindex. See Admin Console Reference Guide for details.

API changes

Removed offset properties from all collection resource representation classes. Offset+Limit based paging is resource-intensive, therefore it has been completely removed. Your queries should either search for the topN hits or if you need to scroll a large result set, then use the scrollId returned in the collection resource (alternatively you can scroll a live result set using the searchAfter parameter). Read more about scrolling here:

@Analyzed annotations

Replaced @Analyzed with @Text and @Keyword to better reflect Elasticsearch field types text and keyword.


  • Generic Terminology Validation API (750806e, ed64eae, 6102b86)

  • SNOMED CT Request API based Validation Rule Support (f67aee5)

  • A new, improved, but experimental SNOMED CT RF2 importer implementation


    • Support filtering SNOMED CT Descriptions by their semantic tag (659234e)

    • Support filtering SNOMED CT Components by multiple namespace IDs (7a7a5c1)

    • Support filtering SNOMED CT Components by module ECL query and by module ID set (416d1a9)

    • Support filtering SNOMED CT Descriptions by case significance (ECL or ID set) (416d1a9)

    • Support filtering by term regex in description search (e47ae40)

    • Support multiple SNOMED CT Reference Set IDs in isActiveMemberOf filter

    • Support language refset, acceptableIn and preferredIn filtering in description search (59e7b57)


    • ECL implementation now compatible with latest v1.3 spec (

    • Support nested expressions in memberOf rules (v1.2 spec change)

    • Support nested expressions in attribute part of dotted expressions (v1.3 spec change)

    • Support nested expressions in attribute part of refinement expressions (v1.3 spec change)

  • Low-level index API:

    • Support regular expression queries (0cb1c1c786c0fd7bcbc4c7b1e7d54c64a5c0baad)

    • Support terms aggregations with tophits (50fd7338831dea7c4f84efc7aaefb4ee38e8ecd7)

    • Support Map and String[] return types in index search API (33c3bd9)

    • Scroll support to Index API (de439e9)

    • SearchAfter based paging support to Index API (ee36a25)


  • Java API changes:

    • Type of Remote Job properties parameters and result changed to String (contains a JSON serialized object)

    • Also added getParameterAs and getReturnAs methods to convert them to Java Objects easily

    • Void return types have been changed to Boolean (fixes unanswered client side requests)

    • Empty-ish values are accepted in filterBy* methods (empty Collections and empty String values)

  • SNOMED CT RF2 import console command now accepts a single Code System short name instead of a descriptor file (bd7aea3d56822b405feb4adbf039cd4ce4599729)

  • SNOMED CT Identifier Generation:

    • Improve Sequential ID generation by skipping exponentially growing chunks of reserved/assigned IDs in order to find the next available ID faster (#180)

  • SNOMED CT Classification changes:

    • Enabled classification of concepts with the UK Clinical extension module

    • Improved performance of SNOMED CT Classification by keeping the initially computed taxonomy in memory until normal form generation and change (

    • Generate inferred relationship IDs in bulk [5.x] (#176)

  • File Attachment API now accepts any kind of file not just zip files (3b814b2)

  • Low-level Index API changes:

  • Dependencies:

    • Bump Lucene to 7.0.1

    • Bump Elasticsearch to 6.0.0

    • Bump Jackson to 2.8.6

    • Bump Netty to 4.1.13

    • Bump SnakeYAML to 1.17.0

    • Add Jackson CBOR dataformat 2.8.6

    • Remove Compression LZF


  • ESCG support (it was deprecated since the introduction of ECL queries, v5.4)

  • Bunch of deprecated, unused API and functionality, related commits:

    • 1c5fe51

    • 3d6d189

    • 6ac0954

    • 895a792

    • 6d4cf50

    • 5c10b7c

    • f40d41e

    • 16748d7

    • 5bea2d3

    • dcefb54

  • Modules (completely removed or merged into a corresponding core module)

    • com.b2international.snowowl.index.lucene

    • com.b2international.snowowl.index.diff

    • com.b2international.snowowl.importer

    • com.b2international.snowowl.snomed.mrcm.core

    • com.b2international.snowowl.snomed.mrcm.core.server

    • com.b2international.snowowl.snomed.mrcm.core.server.tests

    • com.b2international.snowowl.authorization.server

    • com.b2international.snowowl.terminologyregistry.core.server


  • Retry update-by-query requests in case of version conflicts (4a4ecf1)

  • Fix partial field loading issue in SNOMED CT Reference Set Member API (2302aa0)

  • Fix bootstrap initialization order issue by moving ClientPreferences init to Environment constructor (1a882e0)



  • Use ECL when creating/evaluating query type refsets (b433de3ff7af35ef8654b806e6fb774cf628c779)


  • Fix TaxonomyDefect serialization issue (b44b90ab3d8f13bd9c33b6eef12dd1c697730552)



  • Disable classification of UK module entirely (81987250976baa11e4eff21d1310438c4c2bde90)


  • Fix concept effective time issue when updating concept's components via concept update request (5ea826daf38c9cedd8a59110403e2e23ca9f0610)



  • Support filter members by mapTargetDescription field (774bc0bf9463840db08f539b5d2e88b54032f2ce)


  • module


  • Fixed missing remote job documents issue (00ca848f624b0879bbeba27995be98116506d0b0)

  • Fixed IOOBE issues when sending bulk delete requests (9a9b166d5b86c110d6a0bc86d63d0e630305ebe7)

  • Remote jobs now properly track progress via the monitor available in the given context (8524e0e0d179e6bba331919c69bd616029282fb7, 83debbec4f1e86e35910d910d9f1a3fb299ae4d7)


  • Improve rebase/merge performance significantly by disabling unnecessary taxonomy check rule (9cd76b9342cf014346aa3e6d125bb6d314cf99f1)







  • Fixed CDO versions (builds now contain 4.1.10.b2i version of CDO bundles)




  • Snow Owl JAAS file has been removed in favor of the new YAML based identity provider configuration (see the updated documentation/src/main/asciidoc/configuration_reference.adoc)

  • com.b2international.snowowl.authentication module has been removed

  • com.b2international.snowowl.authentication.file module has been removed

  • com.b2international.snowowl.authentication.ldap module has been removed

  • com.b2international.snowowl.authorization.server module has been removed




  • com.b2international.snowowl.authorization module has been removed


  • Invalid Lucene startup script after reverting back to 5.9.x GC settings

  • Initialization issue in authorization module (32d3e11a313b1f060601693c7df05d0e343c2192, a00d40c255635e4ba258d04b74a2f69655165bc7)



  • includeInactiveMembers flag to include inactive reference set members in DSV exports

  • GC logging configuration to Windows and Linux startup scripts


  • Revert back to 5.9.x JVM GC configuration (default GC performs better than CMS in most of our use cases)




  • Deleted obsolete task context API




  • Fix zip decompression issue in FileUtils.decompressZipArchive method when there are no folder entries (8d144f4010e8a5c4a1735d0577a862065fe63a9b)

  • Fix Java serialization issue when using DSV export via the Java API (bd96aa60993e2fbef15a12a307d0a0db51adb874)

  • Fix JSON serialization of ClassificationSettings, fixes missing remote job entries (df8c4e545d8b6b5af6d3ada90b97347a71069c58)



  • Fixed issue with MRCM constraint indexing (782a6ad9bc63b003bb94e5fb23b18f548d901d3a)

  • Fix missing terminology component extension point for MRCM rules (a00a7f0f492d2eacb9d63b3d0f6dbe6517072f71)

  • Fix issues with language reference set export (c423bb741a5e3b78d0b7f04ee7eff294ce7c21fa, c877c9cda07200a1fa831be2df4e90974962af08)



  • Support inactivation indicator and association target updates on active SNOMED CT concepts

  • Support postRun application bootstrap phase (ea64e8b9fe8b172fa95fd409ca61a3fdc207c8dd)


  • Fixed SNOMED CT Mapping Reference Set DSV export (dc1300e54cea6c6756d0898b62eca0bb26ff5b87)



  • Normalize description scores into buckets using the following order:

      1. Exact

      1. All terms present

      1. All term prefixes present


  • Fixed ordering of hits returned by /:path/concepts and /:path/descriptions endpoints when filtering them by term

  • Include a unique tiebreaker sort field (_id) in search requests (both Lucene and Elasticsearch index modules)

  • Fixed stated/inferred expansion in TerminologyTree (d5f8b0fc19d754a5d2602b5d1a4607e928f620fd)

  • Fixed score computation issue in index.lucene module (735551e372acd528123ec8c57f8a39fafed81ef0)

  • Fixed doiFactor script to properly compute the final score of a doc (88a0d116f6eb5667f8f9b8e7bd39ec82d5241afb)



  • New SNOMED CT DSV export Java API is available (see SnomedRequests.dsv().prepareExport())

  • Support for SNOMED CT Reference Set Member filtering by mapTarget values (48e5179f7c70a54747177d5559bcd91c1c74bf5c)

  • Support for SNOMED CT Relationship filtering by modifier values (1dcc314707286dbe650346d26724d1160668a804)


  • Fixed issue with pt() and fsn() expansion in /:path/concepts endpoint (26ce744a7f8d0948831135d84da729c42e285f86)

  • Fixed CDO object deletion bug by backporting changes from eclipse/cdo commit (d7e9aa038ef50b296540620f7158f9b9b516f8d4)

  • Fixed NPE thrown by Protegé module on shutdown (2e591d3148a3c81eb84d8756831d42dc5f94b093)

  • Delete temp RF2 file after export finishes (reduces allocated disk space) (901750d3c1b1adf0565a8d6518f93bade3d56305)



  • Fixed MRCM rendering issue (29ed90711b75462b277c72ce5d6b7c0e03367c57)

  • Fixed version creation failure if complex map uses invalid map category ids



  • Add versioning parameters to job params object (7ac489c6f715bb7fec791deb78bd83b681440613)

  • Exclude UK products by their module ID from classifications (12164c8116701f9a21bce822810c2cfb9851b310)

  • SNOMED CT Identifier service now properly moves all ASSIGNED ids to PUBLISHED and reports errors after the changes



  • Default JVM settings have been changed to recommended default elasticsearch settings (835cbc700022abdc68bf8f764d92794cf8a42254)


  • Exact term matching should use match query instead of term query (11ffb349d2e2b778d36f0673217e0446990dc795)

  • Fixed invalid parsed text predicate -> ES query mapping (72043fb0d9c9b53a31b666643e5bce270beb9241)



  • SNOMED CT Description API now supports exact term matching via new option EXACT_TERM (3e33b974fd67671b5d8f616c2d6eeefca46ad885)

  • SNOMED CT Reference Set Member API now supports user supplied UUID parameters


  • Fixed serialization issue of SyntaxException (20dbbea9eb13acb14237864d9be69258ccd7bf1b)

  • Fixed RemoteJobEntry result field mapping (3bc8b16febe593a6692873100ae32cb6f633ac40)

  • Fixed invalid BoostExpression -> ES Query mapping (00c57a81a0bf4c18f0796eb7583b361af70a9fe6)



  • Elasticsearch module now properly configures dynamic mapping on Object/Map field types


  • Searching for SNOMED CT Concept with termFilter throws score evaluation exception


Breaking changes

  • _id document fields now indexed with doc_values enabled

  • EMBEDDED identifier service now operates on its own index, named snomedids

  • SNOMED CT Description index mapping now uses more precise analyzers to provide the best possible text matches when search for description terms

    • Exact term searches now possible via the new term.exact index field

    • Prefix searches now return better results (via the new term.prefix field), because the mapping now uses the edgengram tokenfilter to generate 1..20 length prefixes for each SNOMED CT Description term

  • NOTE: Due to the above mentioned changes, datasets created before 5.10.0 require a full reindex


  • Full (but still experimental) Elasticsearch support (

    • Supported elasticsearch version is 2.3.3

    • Snow Owl starts a local-only Elasticsearch node by default, but it is possible to configure the node to connect to a cluster of others

    • Configure the Elasticsearch node with the configuration/elasticsearch.yml ES configuration file

    • This index API implementation does not support the SHA-1 _hash field on revision documents thus it cannot skip them from a revision compare result and will return them. Clients should query the base and head of the branch and remove the false positive hits manually.

  • Configuration options

    • Added numberOfShards configuration option to repository.index node in snowowl_config.yml

    • Added commitConcurrencyLevel configuration option to repository.index node in snowowl_config.yml


  • Low-level Index API chanages (see for details)

  • API changes:

    • JSON representations now include non-null values instead of non-empty

    • SNOMED CT Concept inactivation properties are no longer auto-expanded. The new inactivationProperties() expand parameter need to be added to the expand parameter list in order to retrieve them.


  • Fixed memory leak when using gzip compression on the in-JVM Net4j connection

  • Fixed invalid SNOMED CT Identifier state when supplying the identifiers instead of generating them (1e4488e35884cfa6f458471e73c7fd6943239722)


  • Greatly improved performance of index queries by using filter clauses in boolean queries instead of must clauses (eac279977bf2b0c49da949701136ba19260b5aef)


Breaking changes

  • Datasets created before 5.9.0 require a full reindex in case you would like to use the new branch compare API (or you are using the old review-based compare feature).



  • Classification Java API now returns only SNOMED CT concept identifiers

  • Include component type in commit notification's new/changed/deleted buckets (470f4e99e42d7c2c1c2e4159ea2003bc51c7aa08)

  • Include version and codesystem changes in commit notification events

  • Enable gzip compression by default on all Net4j protocols (


  • compression configuration option from RPC




  • Description preferred acceptability update no longer update acceptabilities of other description (5f012c30a8346bc4905bafa92d9920ce9525dc3a)


  • Fix concept document indexing when changing destination of a relationship in place (4a0ab3a5bcb9b5108785b799f86a1258f88c65e9)



  • Allow editing immutable properties on unreleased SNOMED CT components (0e1444b9bac543c1cf5c22e90823c4ea42edd077)

    • typeId, destinationId on SNOMED CT Relationships

    • typeId, term, languageCode on SNOMED CT Descriptions


  • Always create commit info document when processing a CDO commit (03e85d11b12c236ada328f8cce6e289558573bfc)



  • Fix serialization issue of SortField when using it in SearchRequests (e733dbec3edb831d6fba4974ff9ea8a04832f50f)



  • Initialize repositories only in GREEN health state (3bb706585d92ecc90336f62b6fc4530392486464)

  • Fix expansion of statedDescendants when persisting classification results (b9de8620ca59f728adaeb82c3100b09f40737304)

  • Fix missing backpressure exception when using Notifications event stream (ce022786e59c1ad14c8dc5877c076158c053fae6)



  • Field selection now supports single fields as well (049578f483150fb566ec2c92b9e2b1659e40dccb)


  • Fix missing SNOMED CT icons after importing RF2 files (388c13b34f4194f759239506c2e8f09a1d4cfb5e)



  • Fixed missing internal SNOMED CT ECL package export entry (required by ide and ui plugins)

  • Fixed duplicate repository ID shown in diagnostic messages

  • Fixed existing db index detection when ensuring index on CDO_CREATED columns



  • Health Status has been added to Repository instances (

    • Repositories check their health status during the bootstrap process

    • RED state: administrative action is required (restoring content from backup or initiating reindex on the repository). Accessing content is disallowed.

    • YELLOW state: administrative operation (eg. reindex) is in progress, accessing content is allowed, but the content can be incomplete

    • GREEN state: terminology content is consistent

  • Server Info and Repository API (

    • GET /snowowl/admin/info endpoint to retrieve version and diagnostic information of the running server

    • GET /snowowl/admin/repositories endpoint to retrieve all available repositories with their health statuses

    • GET /snowowl/admin/repositories/:id endpoint to retrieve a single repository and its health status

  • Console

    • --version command parameter has been added to snowowl command to retrieve the server's version

    • snowowl repositories [id] subcommand has been added to retrieve repository information and health status

  • Low-level API changes

    • Support custom repository content initialization for empty repositories during the bootstrap process (usually primary code system entries are created here)


  • SNOMED CT RF2 importer changes

    • Importer is no longer able to create codeSystem as part of the import process, how ever they require that the codeSystem exists before starting the import.

  • SNOMED CT ECL grammar improvements (

    • Optional WS before and after the PIPE terminals

    • Case insensitive keyword support

    • Fixed parser error when parsing empty ECL expression

  • Branching API improvements (

    • Pagination support has been added to GET /snowowl/snomed-ct/v2/branches endpoint

    • Filter by parent property has been added to GET /snowowl/snomed-ct/v2/branches endpoint

    • Filter by name property has been addSed to GET /snowowl/snomed-ct/v2/branches endpoint

  • SnomedConcept expansions

    • Removed form parameter when expanding ancestors/descendants of SNOMED CT concepts

    • Added statedAncestors/statedDescendants expand parameters to expand concepts referenced via stated IS_A relationships

    • ancestors/descendants expansion expands concepts referenced via inferred IS_A relationships


  • GET /snowowl/admin/repositories/:id/versions obsolete endpoint has been removed in favor of GET /snowowl/admin/codesystem/:id/versions

  • snowowl listrepositories subcommand has been replaced with snowowl repositories



  • Validate SNOMED CT Text Definition files (if present) when import RF2 content

  • Validate branchPath input parameter with given codeSystemShortName when running SNOMED CT RF2. It should be either full path or relative to the codesystem's main branch.

  • Fixed issue where files could not be opened after downloading them using the api (c1088e217e1954952b57e70aec9f0d28f09083af)

  • Skip cdo repository initializer commits when reindexing a repository (b6d1e4f9e2cd170a8516bc2bcf1cda4f6ce6888c)



  • Support UUID as return value of a RemoteJob (bee443409401b0ece88a520c009e07130b924357)


  • Fixed invalid MRCM domain expression calculation in case of CompositeConceptSetDefinition (1600d9e1821b9d403ab3365e15f05a96f238eba1)



  • Fixed serialization of IdGenerationStrategy (555c3a585b8ea721c396de18d18c3fad4ac9568d)



  • Support reference set filtering in SNOMED CT RF2 export Java API


  • Improved repository request log output


  • Fixed serialization of ValidationException (62d3d0516b87c62e4841a6d9b0eba6e262e18410)

  • Fixed class loading issue when using BulkRequests

  • Fixed Highlighting.getMatchRegions() bug (e7d449df9843c188700c11591ca7e70755f9f140)



  • Fixed node initialization issue when connecting to a master node (client-server mode)

  • Fixed serialization of GetResourceRequest classes


Breaking changes

  • SNOMED CT Complex Map Members properties, mapGroup and mapPriority are changed to integer type instead of byte. This requires migration of the SNOMED CT database (TODO ref to sql script).



  • SNOMED CT RF2 export API

    • startEffectiveTime and endEffectiveTime export filters can be used for all RF2 export types

    • codeSystemShortName and extensionOnly properties to select the right content for your RF2 package

    • Export now always creates empty description, text definition and language refset files

    • Export now creates description/text definition/lang refset files per language code

  • Index API

    • Support java.util.Date types in document mapping

  • Refactored SNOMED CT API test cases (part of


  • The obsolete rpc-based quick search API (use SearchResourceRequests instead)


  • Properly dispose ReviewManager instance when disposing the Repository



  • GET /{path}/relationships endpoint to search SNOMED CT Relationship components

  • Namespace filter support to

    • GET /{path}/descriptions

    • GET /{path}/relationships

  • EffectiveTime filter support to

    • GET /{path}/concepts

    • GET /{path}/descriptions

    • GET /{path}/relationships

  • ECL expression support to GET /{path}/descriptions endpoint's concept and type filter

  • subclassDefinitionStatus property to SnomedConceptSearchRequest

  • referenceSet expand option to GET /{path}/concepts


  • Fixed NPE when using only delimiter characters in termFilter query parameter

  • Server now fails to start if multiple terminology repositories have the same storageKey namespace ID assigned

  • Source and target effective time values are now indexed on module dependency reference set member index documents



  • Support for inactive component creation. See endpoints:

    • POST /{path}/concepts

    • POST /{path}/descriptions

    • POST /{path}/relationships

    • POST /{path}/members

  • Support the complete SNOMED CT Identifier functionality via a dedicated Java API (SnomedRequests.identifiers())


  • SnomedDescription REST representation changes

    • Changed acceptabilityMap to acceptability

    • Changed descriptionInactivationIndicator to inactivationIndicator

  • SnomedRelationship REST representation changes

    • Changed sourceConcept to source

    • Changed typeConcept to type

    • Changed destinationConcept to destination

    • Removed refinability property

  • POST /{path}/concepts

    • Added support for relationship creation as part of concept creation

    • Added support for member creation as part of concept creation

  • POST /{path}/concepts/{id}/updates

    • Added support for description updates

    • Added support for relationship updates

    • Added support for member updates

  • Swagger API

    • Replaced ISnomed types with the corresponding Snomed type


  • The following endpoints have been completely removed from the REST API (equivalent requests can be initiated via expansion parameters, see GET /{path}/concepts endpoint)

    • GET /{path}/concepts/ancestors

    • GET /{path}/concepts/descriptions

    • GET /{path}/concepts/descendants

    • GET /{path}/concepts/outbound-relationships

    • GET /{path}/concepts/inbound-relationships

    • GET /{path}/concepts/pt

    • GET /{path}/concepts/fsn

  • Removed defaultModule configuration option (requests should specify the desired module via moduleId parameter)

  • Removed defaultNamespace configuration option (requests should specify the desired namespace via namespaceId parameter)

  • Removed enforceNamespace configuration option



  • Support for Expression Constraint Language v1.1.1 has been added, see for details

  • Support BigDecimal property mapping in index API


  • GET /{path}/concepts now supports filtering by ECL expressions via ecl query parameter

  • Deprecated escg filter on GET /concepts endpoint. Use the ecl query parameter instead

  • Snow Owl now uses sequential SNOMED CT identifier generation instead of random




  • SNOMED CT Concept, Description and Relationship index schema changes

    • Added referringRefSets field to all three main SNOMED CT component documents

    • Added referringMappingRefSets field to all three main SNOMED CT component documents

    • Non-mapping reference set identifiers that reference a given component will be indexed in the referringRefSets

    • Mapping reference set identifiers that reference a given component will be indexed in the referringMappingRefSets

    • NOTE: to be able to use these fields reindex snomedStore repository using the snowowl reindex snomedStore command after dropping the index directory of it


  • Fixed review change calculation bug, deleted components will mark their container component changed by default

  • Fixed bug with new/dirty reference set (re)indexing without concept changes

  • Handle unordered list index calculations properly during CDO revision compare



  • New Java API to get/search commit information in a repository. See class com.b2international.snowowl.datastore.request.CommitInfoRequests. To make the new API work, you have to reindex your dataset using the snowowl reindex console command


  • SNOMED CT RF2 importer now uses the same change processing/indexing as regular commits

  • Support DOI score indexing during change processing (aka when committing changes)


  • Fixed incorrect calculation of stated/inferred parent/ancestor information on SNOMED CT Concept documents in case of status change


Java 8 support

Snow Owl is now using Java 8 both compile time and runtime. Make sure your execution (and development, if you are developing custom plug-ins for Snow Owl) environment supports and uses Java 8. From 5.1.0, the minimum required Java version is 1.8.0 update 102.


Breaking changes

This section discusses the changes that you need to be aware of when migrating your application to Snow Owl 5.0.0.

Datasets created before 5.0.0

Snow Owl v5.0.0 no longer supports nested index directory format. The new format is flat, branches do not have their own directories under the corresponding terminology repository's root index folder. Branching and revision information are coded into each document and each terminology component has multiple documents in the index, which is called revision index and the documents are revisions. Additionally with the new index format, Snow Owl moved from Lucene v4.9.0 to v5.5.0. Indexes, that still use the old index API, but depend on the new Lucene version, should be accessible and readable by Lucene v5.5.0.

To support migration of incompatible datasets, Snow Owl v5.0.0 comes with a reindex command, which can be used to create the new index for any dataset based on the contents of the relational database. See updated Admin Console Reference Guide for details.

Java API changes

Due to index format changes, public APIs (generic and/or SNOMED CT terminology related) - that used the old format - become obsolete, and either marked with deprecated annotation or have been completely removed. See the affected public APIs in the Removed section.

Review API changes

In general the Review API still works the same way as in the 4.x versions, but the new, changed, deleted concept ID sets might contain non-Concept identifiers when a member of a Relationship/Description changes, but the corresponding Relationship/Description does not. It is recommended to fetch the container SNOMED CT Concept identifier by querying the source branch for the new or changed Relationship/Descriptions, and extracting the SNOMED CT Concept identifier from either the conceptId or sourceId properties. Querying deleted revisions from the tip of a branch is currently not supported, see next section.

With this change and limited capabilities, Snow Owl will no longer support the current version of the Review API starting from the next release (5.1.0), and it will replace it with a more generic Branch Compare API. This new API will return the new/changed/deleted document identifiers directly without trying to be smart and replace the document identifier with the corresponding container (root resource, like the SNOMED CT Concept) component identifier. API consumers will be responsible for fetching and computing the final compare result based on the actual changes between the branches, if they would like to still show the review in the scope of a SNOMED CT Concept. This enables Snow Owl to use the same Branch Compare API for different terminology implementations and the API will provide access points to query the proper revision of new/changed/deleted components (currently it only supports the latest revision, which returns HTTP 404 Not Found for deleted components).


  • Maintenance commands:

    • snowowl reindex <repositoryId> <failedCommitTimestamp> - Reindexes the currently available database content from scratch, or from the specified commitTimestamp (if a previously initiated reindex process has failed at some point)

    • snowowl optimize <repositoryId> <maxSegments> - Optimizes the underlying index for the repository to have the supplied maximum number of segments (default number is 1)

    • snowowl purge <repositoryId> <branchPath> <purgeStrategy> - optimizes the underlying index by deleting unnecessary documents from the given branch using the given purge strategy (default strategy is LATEST, available strategies are ALL, LATEST, HISTORY)

  • New search options for SNOMED CT Reference Set Members:

    • acceptabilityId

    • characteristicTypeId

    • correlationId

    • descriptionFormat

    • mapCategoryId

    • operatorId

    • targetComponent

    • unitId

    • valueId

  • New revisionCache configuration option in repository section. Enables/Disables CDO revision cache based on its value (default value is true).

  • New index configuration options under repository section:

    • commitInterval - the interval in milliseconds, which specifies how often flush and sync index changes to disk (default is 15000, 15 seconds, minimum allowed value is 1000, 1 second)

    • translogSyncInterval - the interval in milliseconds, which specifies how often the transaction log flushes its changes to disk (default is 5000, 5 seconds, minimum allowed value is 1000, 1 second)

    • queryWarnThreshold - threshold in milliseconds, which specifies when to log a WARN level message in the log file about a slow query (default value is 400)

    • queryInfoThreshold - threshold in milliseconds, which specifies when to log an INFO level message in the log file about a slow query (default value is 300)

    • queryDebugThreshold - threshold in milliseconds, which specifies when to log a DEBUG level message in the log file about a slow query (default value is 100)

    • queryTraceThreshold - threshold in milliseconds, which specifies when to log a TRACE level message in the log file about a slow query (default value is 50)

    • fetchWarnThreshold - threshold in milliseconds, which specifies when to log a WARN level message in the log file about a slow fetch (default value is 200)

    • fetchInfoThreshold - threshold in milliseconds, which specifies when to log an INFO level message in the log file about a slow fetch (default value is 100)

    • fetchDebugThreshold - threshold in milliseconds, which specifies when to log a DEBUG level message in the log file about a slow fetch (default value is 50)

    • fetchTraceThreshold - threshold in milliseconds, which specifies when to log a TRACE level message in the log file about a slow fetch (default value is 10)

  • New modules:

    • com.b2international.index.api - Generic Index API module

    • com.b2international.index.lucene - Lucene based implementation of Generic Index API module

    • com.b2international.index.api.tests - Generic test cases to verify implementation modules of the Index API module

    • - Useful utility classes when writing Index API based test cases

    • com.b2international.collections.jackson - Jackson ser/deser module for com.b2international.collections.api module


  • Improved change processing performance by loading only the relevant revisions from the index

  • Log entry format of requests has changed to the following

    • The logged entry is now a valid JSON object

    • Format: {"repositoryId":"string", "type":"string", "metrics": {...}, ...request specific properties}

  • Metrics

    • All values are measured in milliseconds

    • Read operations measure their execution time (responseTime)

    • Commit operations measure their execution time (responseTime) and commit subtask execution times (preCommit, preRequest, traceability, indexing, commit)


  • Deprecated public SNOMED CT APIs that have been replaced by the new Request based APIs

    • SnomedTerminologyBrowser

    • SnomedStatementBrowser

    • SnomedPredicateBrowser

    • SnomedComponentService

    • SnomedTaxonomyService

  • Configuration options:

    • indexTimeout configuration has been removed, because the new index API uses a single index and it does not require disposal of branch specific Index Readers/Writers



  • New feature, SNOMED CT Extension support, see snomed_extension_management.adoc for details.

    • POST /codesystems - creates a new codesystem

    • PUT /codesystems - updates an existing codesystem

  • Representations

    • New branchPath property on CodeSystems (currently active path of a CodeSystem)

    • New repositoryUuid property on CodeSystems (the current repository of the CodeSystem )

    • New extensionOf property on CodeSystems (the base code system of the CodeSystem)

    • New parentBranchPath property on CodeSystemVersions (the parent branch path where the version branch is forked off)

  • effectiveTime based filtering for all components (currently members only, other components will be support on release of 4.7)

  • New module for support full javadoc of Snow Owl public APIs (com.b2international.snowowl.javadoc). The new module is part of the site Maven profile.


  • SNOMED CT Extension support

    • GET /codesystems - returns all currently known codesystems (in SNOMED CT, all releases, including extensions)

    • GET /codesystems/:id - returns a codesystem by its unique identifier, which can be its short name or its oid (both should be unique)

    • POST /codesystems/:id/versions - create a new version in a codesystem (or release in SNOMED CT)

  • SNOMED CT RF2 import

    • POST /imports - new optional property codeSystemShortName, identifies the target code system of the import, the default value is the short name of the SNOMED CT International Release

  • Revise handling of structural reference set members (language, inactivation and association members)

    • Try to reuse members where possible (reactivate if necessary)

    • Keep only one active language reference set member per description and do not create new ones when acceptability changes


  • Replaced custom 3.2.2 version of org.semanticweb.owl.owlapi module with a dependency to the 3.4.4 version of it.

    • Makes it possible to use ELK v0.4.2 runtime and during tests

  • Upgrade custom Protegé libraries from 4.1 to 4.3

  • Replaced the unsupported pcj library with FastUtil and also added a nice primitive collection API on top of it to support replacement of the primitive collection library underneath (and/or support multiple libraries with different capabilities, performance at the same time)

  • Migration from old terminology registry model to updated model, migration scripts are in /documentation/src/main/asciidoc/scripts/migration_4.6_to_4.7/

New modules

  • com.b2international.collections.api - primitive collections API

  • com.b2international.collections.fastutil - FastUtil implementation of primitive collections API


  • Reduces thread usage of SNOMED CT change processing

  • Index initialization during SNOMED CT RF2 import now filters content based on the current latest system effective time, resulting in much more reliable imports and content when the import completes

Known issues

  • No RF2 import config validation when the branchPath is unrelated with the given codeSystemShortName property



  • All references set member properties are supported (using RF2 property names)

  • Support for rebase queueing

    • GET /merges - returns all merges happened since the start of the server ()

    • GET /merges/:id - return a merge by its identifier

    • POST /merges - creates and starts a new merge between two branch points

    • DELETE /merges/:id - deletes a merge object by its identifier

  • Expansion support improvements

    • Expand targetComponent on association reference set members

    • Expand members of any SNOMED CT core component (Concept, Description, Relationship) (eq. expand=members())

    • Support stated and inferred expansion of descendants and ancestors (both Java and REST API)

  • Representations (Java and REST API)

    • New iconId property on SNOMED CT model components (not available in JSON representations)

    • New, expandable typeConcept object property on SNOMED CT Relationships (by default only id is available on the object)

    • New, expandable sourceConcept object property on SNOMED CT Relationships (by default only id is available on the object)

    • New, expandable destinationConcept object property on SNOMED CT Relationships (by default only id is available on the object)

    • New, expandable type object property on SNOMED CT Relationships (by default only id is available on the object)


  • REST API property changes

    • targetComponentId changed to targetComponent (became nested object, expandable)

  • Search improvements (Java API only, no REST support yet)

    • Support for fuzzy matching

    • Support for parsed terms

    • Support for DOI based scoring (using a default DOI file, not configurable yet)

    • Support for search profiles

  • The type of the group property changed from byte to int to support greater than 127 values

  • Using time based rolling policy with 90 days worth of history instead of fixed window with size restriction



  • Support for simple and query type reference sets and members in RESTful API

    • GET /:path/refsets

    • GET /:path/refsets/:id

    • GET /:path/refsets/:id/history

    • POST /:path/refsets

    • POST /:path/refsets/:id/actions

    • GET /:path/members

    • GET /:path/members/:id

    • POST /:path/members

    • PUT /:path/members/:id

    • DELETE /:path/members/:id

    • POST /:path/members/:id/actions

  • Integration with Component Identifier Service (CIS), see configuration_guide.adoc for details on how to configure it

  • Indexing term, language code and acceptability values on SNOMED CT Description documents

  • Initial version of the resource expansion API is currently available (expand fsn, pt, descriptions and other nested resources within a single request)

  • numberOfWorkers configuration parameter to tweak worker threads per repository (by default it will be set to 3 x number of cores)


  • Fixed bug in Accept-Language header by introducing Extended Locales, they do support language reference set IDs properly (the original header spec. restricts the number of extension characters to 8)

  • Increased asyncTimeout in Tomcat to 60 seconds

  • Performance improvements on some endpoints by utilizing the new resource expansion API

  • Marked a bunch of old APIs as deprecated, they will be removed in upcoming releases


  • Removed label indexing from SNOMED CT component indexing (using Description term index field to find a label)

Merged pull requests

Known issues

  • CIS is currently unsupported in SNOMED CT RF2 imports (manual synchronization is required)

  • Simple type mapping reference set membership is not tracked properly if there are multiple mappings for a single referenced component



  • Support of MRCM rules import before/after SNOMED CT import (previously was part of the SNOMED CT import)

  • Few missing SNOMED CT Inactivation Indicators have been added


  • RF2 validation in SNOMED CT import validates content based on effective times (fixes invalid errors/warnings)

  • Concept inactivation rewires immediate children to immediate parent (keeping all STATED ISA relationships and inactivating all inferred relationships)

  • Hot backup script copies entire index folder of a repository instead of just the version indexes

  • IndexService inactivity default timeout value changed to 30 minutes


  • PostProcessing support has been completely removed

  • Stopwords in index services have been completely removed


  • Fixed stored mapTargetDescription values in SNOMED CT Simple Map Reference Set Members

  • Fixed invalid setting of released flag to false in case of already published component import (set only the effective time)

  • Removed tokenization of source field in IndexStore

  • Keep dirty indexes alive when running service inactivity checker

Merged pull requests



  • GET /:path/descriptions - support for association targets in SNOMED CT Description representations

  • POST /:path/descriptions/:id/updates - support for inactivation indicators in SNOMED CT Description updates

  • POST /:path/descriptions/:id/updates - support for association targets in SNOMED CT Description updates


  • Renamed descriptionInactivationIndicator to inactivationIndicator in SNOMED CT Description representations

  • Changed commit notification logging to be more readable and traceable

  • Rebase across deep branches is now supported




  • Support for relationships with stated characteristic type