Release Notes for JMRI 5.15.7 release
Date: May 8, 2026
From: Bob Jacobsen
Subject: Test Release 5.15.7 of JMRI/DecoderPro is available for download.
Notes:
This is a test release. Please
post a note
if you encounter any new or old bugs!
And please back up your JMRI files before installing this, in case you want to go
back to an earlier version.
This is the next in a series of 5.15.* test releases.
It requires at least Java 11 to work.
We recommend that you use Java 21 if possible.
(See our page on downloading Java)
We expect this series to result in the next JMRI production release in July 2026.
(See the tentative release schedule)
JMRI is now only available under the
GNU General Public License. For more information, please
see our
copyright and licensing page.
Update From Older JMRI Versions
If you are currently using a version older than JMRI 5.0, please follow these instructions carefully:
- Is your current version older than JMRI 4.12?
If so, then update to JMRI 4.12 first, and ensure everything works correctly: check
start-up, check things you need to be working, and check the JMRI log as well) before doing anything else.
Store your configuration and panel files under a new name and use those from now on.
Then continue with step 2.
If you are currently using JMRI 4.7.3 or earlier on Linux or macOS (Windows doesn't need this),
then it's very important
that you update to JMRI 4.12 and
carrying out the migration process described in the JMRI 4.12 release note
before updating to any later release.
- Is your current version older than JMRI 4.20?
Then update to JMRI 4.20 first, and ensure that works correctly (check
start-up, check things you need to be working, and check the JMRI log as well) before doing anything else.
Save your preferences again.
Store your configuration and panel files under a new name, use those from now on, and go on to step 3.
- Is your current version older than JMRI 4.24?
Then update to JMRI 4.24 first, and ensure that works correctly (check
start-up, check things you need to be working, and check the JMRI log as well) before doing anything else.
Save your preferences again.
Store your configuration and panel files under a new name and use those from now on.
- Is your current version older than JMRI 5.0?
Then update to JMRI 5.0 first, and ensure that works correctly (check
start-up, check things you need to be working, and check the JMRI log as well) before doing anything else.
Save your preferences again.
Store your configuration and panel files under a new name and use those from now on.
- You can then install this release.
Following this multi-step order of updating via stable major releases safeguards you against possible migration issues
that can arise from skipping these versions.
New problems with this release
New warnings for this release:
-
Raspberry Pi GPIO pin numbering has changed.
The Pi4J library has been updated from version 1.2 to 2.8.0.
Pi4J 2.x uses BCM (Broadcom) GPIO numbers instead of the WiringPi numbers
used by Pi4J 1.x.
Any panel files or scripts that define Raspberry Pi sensors or turnouts
must have their GPIO address numbers updated to the equivalent BCM pin
numbers before they will work correctly with this release.
-
Raspberry Pi: the libgpiod2 library is required for GpioD GPIO support.
This release adds support for the Pi4J GpioD plugin, which uses the modern Linux
GPIO character-device interface preferred on kernel 5.10 and later.
To enable it, install the native library before starting JMRI:
sudo apt install libgpiod2
(Raspberry Pi OS / Raspbian) or the equivalent for your distribution.
If libgpiod2 is absent, Pi4J will fall back to the LinuxFS provider
for digital I/O; all sensors and turnouts will still function.
- Due to the refactoring the JMRI Swing Throttle code, some scripts may be broken, particularly :
- ThrottleFrame was moved to package jmri.jmrit.throttle.implementation (was jmri.jmrit.throttle previously)
- jmri.jmrit.throttle.ThrottleFrameManager.createThrottleFrame() now returns a jmri.jmrit.throttle.interfaces.ThrottleControllerUI
which is an interface implemented by (among other) jmri.jmrit.throttle.implementation.ThrottleFrame (same class name as previously but moved to a new package)
- if you need a small throttle, see ThrottleFrameManager.createSimpleThrottleFrame(RosterEntry) or ThrottleFrameManager.createSimpleThrottleFrame(DccLocoAddress)
Older warnings
See the
JMRI 5.14 release note for more warnings predating the 5.15 development series,
including pointers to various migration issues.
These may be relevant to you if you're updating from an earlier version;
we strongly recommend you update to at least
JMRI 5.0
before installing this test release.
See
instructions above.
- Since JMRI 4.99.1
This test release, and all subsequent ones, require the use of
Java 11 or later.
We recommend that you use Java 21.
Java 8 is explicitly not supported.
There's more information on this migration on the
JMRI Tech Road Map and
JVM Capabilities pages.
- If you're using a Firefox web browser and opening JMRI
help files locally (not over the web), a Firefox bug
can sometimes cause it to enter a loop. There's a
workaround in
this JMRIusers post.
- Since JMRI 5.15.1
The serial communications library that JMRI uses has been updated.
If your JMRI installation is having trouble communicating with your
model railroad hardware, please contact us on
the JMRI users group.
- Since JMRI 5.15.4
The way mouse clicks are handled has been updated.
Although this has been tested with mice and trackpads,
it's possible that this will cause problems with other hardware,
e.g. touch panels. If you do encounter new problems with clicking
on panels, please contact us on the
JMRI users list.
- Since JMRI 5.15.4
The RailCom handling has been updated to current standards. In particular, the enum
representing the orientation has been changed from ORIENTA and ORIENTB to
EAST and WEST respectively and some of the text strings have changed.
These may affect any scripts you have that reference
the direction of a RailCom report (tag) or parse the status messages.
- Since JMRI 5.15.5
The web server folder app has been removed. It
might cause third party applications to fail. If this happens to
you, please contact us on
the JMRI users group.
Download links:
These files are located in the
JMRI 5.15.6 GitHub release.
The
full list of included changes is available from our
GitHub code repository.
Hardware Support
C/MRI
- The node configuration is now preserved if the
connection type is changed. For example, if you
change the connection from serial to simulator,
the node configuration is kept.
DCC++ and DCC-EX
- DCC++ Ethernet connections now automatically attempt to reconnect when
the connection is lost, retrying indefinitely until the command station comes
back online. This behavior can be disabled by unchecking
"Reconnect automatically if connection is lost" in Additional Connection
Settings.
- (Internal) The load and store process for the Event Table
now permits multiple "names" elements. This makes it easier
to merge Event Table information from several profiles.
- Improved how mouse clicks are handled with showing/hiding
sections of the configuration screens.
- Resolved an issue where reading a memory space from a CS-105
would timeout and fail.
Raspberry Pi
- The Pi4J library used for Raspberry Pi GPIO support has been updated
from version 1.2 to version 2.8.0 (the current 2.x release).
Pi4J 2.x uses a new API and a plugin-based architecture replacing
the older
GpioFactory / GpioController model.
- Pin numbering has changed.
Pi4J 1.x addressed GPIO pins using WiringPi numbers.
Pi4J 2.x uses BCM (Broadcom) numbers directly.
Existing panel files and scripts that reference Raspberry Pi sensors
or turnouts will need their GPIO address numbers updated to use
the corresponding BCM pin numbers.
For example, WiringPi GPIO 0 (BCM 17) becomes address 17 in the
new numbering scheme.
- Support has been added for the Pi4J GpioD plugin
(
pi4j-plugin-gpiod), which uses the modern Linux GPIO
character-device interface (/dev/gpiochip*) introduced
in kernel 5.10.
This is the preferred GPIO interface on Raspberry Pi OS with kernel
5.10 or later (including the 6.x kernels shipped with current
Raspberry Pi OS releases).
It requires the libgpiod2 package:
sudo apt install libgpiod2
The plugin is discovered and activated automatically alongside the
existing LinuxFS and PiGpio plugins via Java ServiceLoader; no
configuration change is required.
- Hardware GPIO plugins (
pi4j-plugin-raspberrypi,
pi4j-plugin-linuxfs, pi4j-plugin-gpiod)
are now loaded at runtime via Java ServiceLoader on Raspberry Pi
hardware and are no longer bundled as compile-time dependencies.
SPROG
- Fixed spurious command station slot thread timeouts that could
shut down track power when the GUI was busy. Reply notifications
from the traffic controller to the command station are now
delivered synchronously instead of being queued on the Swing EDT,
so the slot thread is woken immediately when the hardware replies.
- Added a consecutive-timeout retry counter to the command station
slot thread. A single missed reply now triggers a retry with an
idle packet instead of immediately removing track power.
Track power is only removed after three consecutive timeouts.
Dispatcher
- Save dispatcher usestrict option correctly.
- Continue tracking blocks thru stopping at end.
Layout Editor
- Added a new "Make Layout Editor XML output more reproducible" option
to the Load and Store preference pane. The default is off. When
on, this option will result in positions of Layout Editor objects
being stored in a form that's more reproducible. This will result
in fewer spurious changes if you're e.g. storing panel files in a
tracking system like Git.
- Fixed a problem when storing and loading the new Output Indicator icons
- When changing icon images for turnouts, sensors and signal heads, the
resource files are now listed in alpha order by name.
- The LayoutTurnout and LayoutTraverser require manual changes when the
Use Dispatcher with Signal Masts feature is enabled. To
prevent JMRI errors and Java exceptions, these changes have to be removed
before deletion or some modifications. When needed, a dialog is displayed
with a list of the items to be removed.
LccPro
- Improved performance of Active display in lower right
on high-bandwidth links.
LogixNG
- Fix the Dispatcher Expression. Active train status changes were being missed.
OperationsPro
- Fixed a bug where the RWL or RWE ship address wasn't used when spotted at a spur with a schedule that didn't have a ship address.
- Added the "Random" column to the tool "Show Schedules by Car Type and Load".
- Fixed a bug with the "Edit Car Loads" from the "Show Schedules by Car Type and Load" tools menu.
- Added 2.25" by 11" paper size.
- Made some improvements with line wrapping when printing Manifests and switch lists.
Roster
- If the configured roster location is on a network share or removable
device that is not available when JMRI starts, a dialog now gives you
the choice to Continue (start with an empty roster)
or Quit JMRI to reconnect the device before
restarting. Previously JMRI would silently start with an empty roster,
risking the real roster being overwritten on shutdown.
Scripting
- There's a new "WiThrottleMonitorTableSpeedRed.py" script that opens a window displaying
connected WiThrottle devices and locomotives (address, speed)
- Due to the refactoring the JMRI Swing Throttle code, some scripts may be broken, particularly :
- ThrottleFrame was moved to package jmri.jmrit.throttle.implementation (was jmri.jmrit.throttle previously)
- jmri.jmrit.throttle.ThrottleFrameManager.createThrottleFrame() now returns a jmri.jmrit.throttle.interfaces.ThrottleControllerUI
which is an interface implemented by (among other) jmri.jmrit.throttle.implementation.ThrottleFrame (same class name as previously but moved to a new package)
- if you need a small throttle, see ThrottleFrameManager.createSimpleThrottleFrame(RosterEntry) or ThrottleFrameManager.createSimpleThrottleFrame(DccLocoAddress)
Throttle
- Throttle code was refactored in order to have a clean seperation between JInternalFrame implementation of JMRI throttles and inner JPanel, some interfaces were introduced, inner classes moved to subpackages
- Jython code was updated accordingly
- A new SimpleThrottleWindow was introduced, it's leveraging the existing throttle panels in order to diplay a much simpler window, it's accessible through the contextual menu of a selected roster entry (It may be relevant to use in other JMRI screens where a simple throttle GUI is required)
- The throttle list window allows drag'n drop from one kind of throttle window to another (hence moving from simple GUI to more complex one)
- UI acquired throttles are actually released on throttle last window close (bug fix)
- New throttle inner components are introduced, particularly a consist function panel allowing to independantly control functions of each locomotive in a consist
Web Server
- The JSON WebSocket power and throttle endpoints now support an optional
prefix field, allowing clients to specify which connection
the command should be sent to. WebSocket clients now also receive
state-change notifications only for the connection they subscribed to,
rather than all configured connections.
Miscellaneous