Platform 2.1.0-alpha Release Notes

Release Date: Friday, March 3, 2017

This version of the OpenMRS Platform is a pre-release and is not ready for production use. Its purpose is to give users an idea of what to expect in the upcoming release and help discover any possible obscure new bugs.

What's New

Some interesting features in the 2.1 line will be:

  • Faster patient searches (using Lucene under the hood)
  • Loosening restrictions on merging patients who have orders
  • Simple approach for developers to add caches programmatically

We expect that 2.1.x will be the first non-LTS release line of the OpenMRS Platform. Read more about this means in the (future) release notes for the beta, or final release.


Get it at

Feedback Welcome!

As always, we look forward to getting your feedback about this release. Share your thoughts on

For example there are a couple of significant features that still need significant work before making it into the final release, such as:

Error rendering macro 'jira' : Unable to locate Jira server for this macro. It may be due to Application Link configuration.

Unable to locate Jira server for this macro. It may be due to Application Link configuration.

Data Model Changes since 2.0.0

  • Add unique_id column to concept_reference_source
  • Dropping foreign key constraint member_patient
  • Dropping foreign key constraint parent_cohort
  • Dropping primary key for cohort_member
  • Adding column cohort_member.cohort_member_id
  • Updating cohort member ids
  • Adding primary key to cohort_member.cohort_member_id
  • Adding auto increment property to cohort_member.cohort_member_id
  • Adding column cohort_member.start_date
  • Updating cohort_start_date with value cohort.date_created
  • Adding column cohort_member.end_date
  • Adding column cohort_member.creator
  • Updating cohort_member.creator value
  • Adding foreign key constraint to cohort_member.creator
  • Adding column cohort_member.date_created
  • Updating cohort_member.date_created with value cohort.date_created
  • Adding column cohort_member.voided
  • Adding defaultValue for cohort_member.voided
  • Adding column cohort_member.voided_by
  • Adding column cohort_member.date_voided
  • Adding column cohort_member.void_reason
  • Adding column cohort_member.uuid
  • Generating UUIDs for all rows in cohort_member table via built in uuid function.
  • Adding unique constraint to cohort_member.uuid
  • Adding foreign key constraint to cohort_member.cohort_id
  • Adding foreign key constraint to cohort_member.patient_id
  • Dropping defaultValue for cohort_member.cohort_id
  • Dropping defaultValue for cohort_member.patient_id
  • Adding "date_changed" column to concept_class table
  • Adding "changed_by" column to concept_class table
  • Adding "date_changed" column to concept_reference_source table
  • Adding "changed_by" column to concept_reference_source table
  • Adding "date_changed" column to concept_name table
  • Adding "changed_by" column to concept_name table
  • Adding "date_changed" column to concept_name_tag table
  • Adding "changed_by" column to concept_name_tag table
  • Adding "date_changed" column to form_resource table
  • Adding "changed_by" column to form_resource table
  • Adding "date_changed" column to global_property table
  • Adding "changed_by" column to global_property table
  • Adding "date_changed" column to patient_identifier_type table
  • Adding "changed_by" column to patient_identifier_type table
  • Adding "date_changed" column to relationship_type table
  • Adding "changed_by" column to relationship_type table

Ticket Statuses at the time of the Alpha release

Issue Type Key Summary Status
New FeatureTRUNK-425Use Hibernate Search with Apache Lucene for Patient SearchesClosed
New FeatureTRUNK-1682Add maven module for checkstyleClosed
New FeatureTRUNK-1916Code coverage and Test report for OpenMRSClosed
New FeatureTRUNK-2004Ignore blank person addresses on the patient formsClosed
New FeatureTRUNK-3675Cache results from getSearchLocales()Closed
New FeatureTRUNK-4668When a module is started, all its dependent modules should be startedClosed
New FeatureTRUNK-4696SaveOrder method should throw more meaningful exceptionsIn Progress
New FeatureTRUNK-4928Remove code TODO about interface OpenmrsMetadata should support localized names and descriptionsClosed
New FeatureTRUNK-4930Remove a TODO in the code about AdministrationService.getPresentationLocales() return typeClosed
New FeatureTRUNK-4931Remove a TODO in code about notifying on global property name changesClosed
New FeatureTRUNK-4933Create pull request to remove TODO comments from core codeClosed
New FeatureTRUNK-4935Remove a TODO in code about refactoring ProgramWorkflowService.getPatientPrograms()Closed
New FeatureTRUNK-4936Add ConceptSource.uniqueIdClosed
New FeatureTRUNK-4941Add ModuleUtil.isOpenmrsVersionInVersions()Closed
New FeatureTRUNK-4947Add ConceptService.getConceptSourceByHL7CodeClosed
New FeatureTRUNK-4971Add caches programmaticallyClosed
New FeatureTRUNK-4975Making Family name as OptionalClosed
New FeatureTRUNK-4976Support obs.interpretation and obs.status, aligned with FHIRDesign
New FeatureTRUNK-4980Enable hibernate second level cache for org.openmrs.PrivilegeClosed
New FeatureTRUNK-5008Speed up and simplify Lucene concept searchIn Progress
New FeatureTRUNK-5012Ability to limit lucene patient search by identifier to a particular identifier typeClosed
New FeatureTRUNK-5077AbstractHandler#purgeComplexData(Obs) should return true when file is missing from diskCode Review (Post-Commit)
New FeatureTRUNK-4906Expanded cohort detailsIn Progress
StoryTRUNK-4943Failing to start the server due to CacheManager issueIn Progress
StoryTRUNK-5010In some cases it should be possible to merge patients even if both have active ordersClosed
BugTRUNK-2877Don't set password values in the UI in the installation wizardClosed
BugTRUNK-4018Initial Setup (installer) sits at 100% too long before actually finishingClosed
BugTRUNK-4093Forms should not be required in HL7 ORU^R01 messagesClosed
BugTRUNK-4539Object validation should enforce maximum length based on column length constraints in the DBClosed
BugTRUNK-4678ModuleActivatorTest shouldStopDependantModulesOnStopModule fails randomlyClosed
BugTRUNK-4720Encounter search will not match on id unless it contains digitsClosed
BugTRUNK-4776Incorrect Global Properties for CIELClosed
BugTRUNK-4813SQLException during the initial setup on MySQL 5.7Closed
BugTRUNK-4848NullPointerException at org.openmrs.web.WebUtil#normalizeLocale()Closed
BugTRUNK-4849NullPointerException at org.openmrs.util.Format#format(Date, Locale, Format.FORMAT_TYPE)Closed
BugTRUNK-4850Module.getExtensions() does not call Module.expandExtensionNames() appropriatelyClosed
BugTRUNK-4851Error in unit test of PatientServiceTest classClosed
BugTRUNK-4865Fix TODO in HL7ServiceImpl#resolveUserIdReopened
BugTRUNK-4867Do not allow person/patient to have death date before birth dateClosed
BugTRUNK-4869Should not be able to set birth or death dates later than present dateClosed
BugTRUNK-4875Add unit test for findPossibleValues method of Concept ClassClosed
BugTRUNK-4879NullPointerException at org.openmrs.api.customdatatype.datatype.ConceptDatatype#doGetTextSummaryClosed
BugTRUNK-4902HibernateOrderDAO exception uses wrong message codeClosed
BugTRUNK-4912BaseOpenmrsData creator, dateCreated, uuid should be not updatableClosed
BugTRUNK-4913Concept.hbm.xml not-null on optional changedByClosed
BugTRUNK-4915Concept validator should require datatype and conceptClass fieldsClosed
BugTRUNK-4918Remove unused classes and filesClosed
BugTRUNK-4922ConceptDAO filters concepts only if results were found by fullTextQueryClosed
BugTRUNK-4923Remove TODOs from code about addAttribute() needs validationClosed
BugTRUNK-4925Copy patient specific attributes on Patient() constructorClosed
BugTRUNK-4926Remove a TODO in code about PatientIdentifierType.toString() returning a more "debug-worth" stringClosed
BugTRUNK-4927Remove a TODO in code about config parameter from DatatypeService.getDatatypeClosed
BugTRUNK-4937Saving a visit should not cascade to encounters associated to itClosed
BugTRUNK-4938ConceptService.getConceptSourceByName privilege annotation wrongClosed
BugTRUNK-4939VisitValidator should ensure that the visit start date can't be before the birth date of the patientIn Progress
BugTRUNK-4940Obs validator validates for empty value in parent obs which is to be voidedClosed
BugTRUNK-4945Adding setmember to concept with retired set members either does not get added up or gets added in the wrong positionClosed
BugTRUNK-4949Patient Merge - HibernatePatientDAO - getDuplicatePatientsByAttributes - Not performing on large databaseClosed
BugTRUNK-4957Code cleanup: remove duplication in getApplicationDataDirectoryClosed
BugTRUNK-4959Clean Hibernate session after applying liquibase changesetsClosed
BugTRUNK-4965Encounter with complex obs throws NullPointerException on saveClosed
BugTRUNK-4967NPE in HibernateConceptDAO.isConceptNameDuplicateClosed
BugTRUNK-4968Non empty database should not fail when finishing database setupClosed
BugTRUNK-4970Obs retrieval from the encounter should maintain the same order in which it is addedClosed
BugTRUNK-4973Saving Existing Obs will not update formNamespaceAndPathClosed
BugTRUNK-4977ImageHandler.saveObs(Obs) to close outfileClosed
BugTRUNK-4978Another CacheManager with same name 'apiCache' already exists in the same VMClosed
BugTRUNK-4984TextHandler does not workClosed
BugTRUNK-5005ModuleFactoryTest ErrorClosed
BugTRUNK-5009Set HttpOnly for JSESSIONID cookieClosed
BugTRUNK-5016Weak password message is not translated while the exception is raisedClosed
BugTRUNK-5017Encounter.removeProvider fails if same provider has already been removed once beforeCode Review (Post-Commit)
BugTRUNK-5018defaultLocale property of User is not updated to Context when the user is logged inClosed
BugTRUNK-5019Error Scenario in Obs Save : New child Obs not saving when entire Obs group is updatedClosed
BugTRUNK-5021AllergenType includes some invalid optionsClosed
BugTRUNK-5024Accepting more characters for observation value of type TextClosed
BugTRUNK-5030Collection.isEmpty() should be used to test for emptinessClosed
BugTRUNK-5035Use Boolean.valueOf to test stringsClosed
BugTRUNK-5036HibernateConceptDAO.getConceptByName() method logs incorrect warning messageClosed
BugTRUNK-5038Replace StringBuffer with StringBuilderClosed
BugTRUNK-5044Use platform agnostic newlines in string formattingClosed
BugTRUNK-5056Use apache StringUtils in OrderSetServiceImplCode Review (Initial)
BugTRUNK-5058Extract private method in ObsServiceImpl.saveExistingObsClosed
BugTRUNK-5071Fix performance of get concepts by mappingNeeds Assessment
BugTRUNK-5075EncounterTest random failuresClosed
BugTRUNK-5078Remove velocity.log filesClosed
BugTRUNK-5079Fix HL7UtilTest failure on OpenJDK 7Closed
TaskTRUNK-3638Separate liquibase file into separate files per versionClosed
TaskTRUNK-4730Verify that all relevant domain objects have changed_by and date_changed fieldsClosed
TaskTRUNK-4855Adding more unit test for Person.javaClosed
TaskTRUNK-4856Adding more unit test for ConceptTest and PatientServiceTestClosed
TaskTRUNK-4863Add github pull request templateClosed
TaskTRUNK-4870Add Unit tests for ModuleUtil.expandJar(File, File, String, boolean)Closed
TaskTRUNK-4904Incorrect message code in Order ValidatorClosed
TaskTRUNK-4958Refactor OpenmrsUtil.copyFileClosed
TaskTRUNK-4962Remove outdated UI test codeClosed
TaskTRUNK-4974Create platform for SDKClosed
TaskTRUNK-5070Convert xml spaces into tabs for indentsClosed
TaskTRUNK-5080Reorganize checkstyleCode Review (Post-Commit)
TaskTRUNK-5081Update checkstyle maven pluginClosed
TaskTRUNK-5085Merge checkstyle rules with google'sCode Review (Post-Commit)
Sub-taskTRUNK-4989TRUNK-324 Remove commented code about Throw an exception if there is no location to fall back onClosed
Sub-taskTRUNK-4991TRUNK-324 Remove TODO comments about Check patient has at least one "sufficient" identifierClosed
Sub-taskTRUNK-4992TRUNK-324 Remove code comment about Add changedBy and DateChanged columns to table patient_identifier_typeClosed
Sub-taskTRUNK-4994TRUNK-324 Remove TODO comment and deprecate methodClosed
Sub-taskTRUNK-4997TRUNK-324 Remove code comment about Add a global property that enables different behavior hereClosed
Sub-taskTRUNK-4998TRUNK-324 Remove code comments about Fail if minOccurs is greater than 1Closed
Sub-taskTRUNK-4999TRUNK-324 Remove code TODO about Should take care of the case where the user is using removable mediaClosed
Sub-taskTRUNK-5001TRUNK-324 Remove code comment about Eliminate unnecessary methodsClosed
Sub-taskTRUNK-5002TRUNK-324 Remove commented code about Re-write the hashcode() methodClosed