This is a major release which comes with quite a number of changes. Some of those are breaking changes, either in the usual API-breaking sense or in the sense that default layouts might look different. Those issues and pull requests are now labeled with “breaking” to make such changes easier to spot.

Here’s a list of the most noteworthy changes. Head over to GitHub for the full list.

New Features and Enhancements

  • #362, #613: Most importantly, we finally have a new logo which appears on all of our websites. Joy!
  • #105, #598: Configuring spacings properly is one of the most complex things to get right. We thus added a utility class to help ease the pain a little.
  • #533, #535: ELK Box and ELK Rectangle Packing now support content alignment.
  • #593: ELK Rectangle Packing now supports a configurable target width that the algorithm will try to achieve.
  • #344: ELK’s JSON support nur supports a more relaxed JSON style.
  • #608 ELK Layered can be configured to consider the model order to order the nodes and edges as in the model if this does not cause additional crossings.


  • #500: The Xtext version ELK uses was upgraded to 2.20.
  • #626, #634: We changed the way port label placement is configured. Previously, there was a choice between inside and outside port labels, with other details configured in other options. We have now made the option an EnumSet to move port label options out of the SizeOptions enumeration and the nextToPortIfPossible option.
  • #646, #647: ELK Layered’s layout options layering.layerID and crossingMinimization.positionID were renamed to layering.layerId and crossingMinimization.positionId, respectively. This also impacts the associated layout option constants.
  • #605, #619: Since ELK Layered’s northOrSouthPort option caused some confusion with vertical layout directions, it was renamed to allowNonFlowPortsToSwitchSides, which incidentally also does a better job of describing what the option actually does.
  • #402: We changed the way how developers can contribute to the layout meta data service. Previously, this was done through extension points, which only worked in an Eclipse context and required manual registrations otherwise. We have now switched to Java service loaders, which should always work. Magic!
  • #516: Our ELKServicePlugin class had its super class changed from AbstractUIPlugin to Plugin.


  • #577, #581: We finally removed the legacy IDs of a whole number of layout options that were renamed over the years. If you relied on those exact IDs, it’s high time to transition to their new IDs.
  • #536, #571: We removed the Graphiti layout connector, which was buggy and did not seem to be used a lot.
  • #523: ELK Layered does not provide special handling for particularly wide nodes anymore. In particular, the wideNodesOnMultipleLayers option is not supported anymore.


  • #530, #546, #596, #597, #595, #610: We fixed quite a few problems ELK Layered had with hierarchical graphs.
  • #515, #569: Under certain conditions, ELK Layered’s polyline edge router could end up routing edges through nodes.
  • #552, #561: ELK Layered would not always place self loop ports of hierarchical nodes properly.
  • #528: ELK Layered’s semi-interactive crossing minimisation could end up yielding wrong node orders.
  • #525, #623, #655: ELK Layered’s support for layer constraints tended to produce strange results with FIRST_SEPARATE and LAST_SEPARATE nodes (which are usually generated internally by the algorithm to represent external ports).
  • #143, #318, #653: Under certain conditions, ELK Layered could allow edges to come really close to or even overlap each other.
  • #583, #584: ELK Rectangle Packing sometimes left compound nodes larger than necessary.
  • #559, #567, #568, #633: The JSON exporter has seen some love in the form of several smaller bug fixes.
  • #518 #519: Fixes to our unit testing framework allow us to better test our algorithms!