Release Notes for JMRI 5.12 release
Date: June 20, 2025
From: Bob Jacobsen
Subject: Production Release 5.12 of JMRI/DecoderPro is available for download.
We are very pleased to announce that the 5.11 series of JMRI test releases has resulted in a
version that's good enough to be recommended for general use, including by new users.
We're therefore making that version, "Production Release 5.10" available for download today.
Notes:
JMRI is now only available under the
GNU General Public License. For more information, please
see our
copyright and licensing page.
This release requires Java 11 to work.
Java 17 is recommended.
(See our page on downloading and installing Java)
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
- OperationsPro. After upgrading, you must reset or terminate all trains before building new ones with this release. Fixed in 5.13.1.
If this affects you, please either
wait for
JMRI 5.13.1, due out shortly,
or pick up a
development build installer
from
Jenkins.
New warnings for this production release:
Older warnings
See the
JMRI 5.10 release note for more warnings predating the 5.11 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
JMRI 5.0
before installing this release, see above.
- Since JMRI 5.7.1
Several systems have had extensive updates to their serial
support. If you have trouble connecting to your layout hardware
after installing this version, please contact us
on the JMRIusers list
for assistance.
- Since JMRI 5.7.7
If you are using a RR-CirKits LocoNet to LCC gateway
with this release, please upgrade its firmware
to version B8g or later. B8f or earlier will
have trouble updating the gateway's configuration.
- 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.11.3
There's been a change to how OpenLCB turnouts are
addressed when using the MTT addressing short cut.
Turnouts 253,254,255, 510, 511, 512, 765, 766 and 767
will be addressed differently. If you're using any of these
via e.g. MTT253, you will need to change the address. If you've
been having trouble getting those addresses to work, this change should
fix that.
- Since JMRI 5.11.5
OperationsPro program file locations were changed in
JMRI 5.11.5. Start up actions
involving operations windows from previous releases no longer work.
You'll need to remove them and
add them back if needed.
Download links:
These files are located in the
JMRI 5.10 GitHub release.
A Docker container can also be obtained from
https://hub.docker.com/r/jsa1987/jmri-docker.
Preliminary build files (not the final released files) can be found
on the
CI project page.
-->
This production version is made from test releases 5.11.1 through 5.11.8 The
full list of changes
in those is
available from our code repository.
Hardware Support
- Added netBiDiB as another BiDiB connection type.
CBUS
- The default CAN ID for new connections is restored to 126
- Node Manager highlights duplicate CAN IDs.
DCC++ and DCC-EX
- Create and update Meters for newer Current messages , , etc.
- Add parsing for JR, jR, JA and jA messages, handle negative current
drM
- Added initial support for the SPC200R Speedo meter. Speed will correctly show. Further support pending.
Lenz XPressNet
- Correct behavior of the ONESENSOR and TWOSENSOR turnout feedback mode.
The turnout's KnownState is set after turnout feedback is received.
In Layout Editor - Entry Exit - Full Interlocking - Signal mast sets the aspect Clear
only after all turnouts are correctly positioned.
LocoNet
- LocoNet Monitor and Reporters now parse LISSY RFID-7 messages as sent by the Arduino-based GCA51
LocoIO 2xRFID board.
- Updated "LocoNet Monitor" to give some detail when the command
station reports that a throttle's attempt to control a train's
speed/direction or functions was ignored by the command station because
the LocoNet "Expanded Slot" is "In-Use" by a different throttle
than the one which attempted to control the slot. Other
operations can also cause this message when the requesting throttle
is not the throttle which "owns" the slot. This message
(an "" message) is only sent by
command stations that support "Expanded Slot" messaging, and
is not used by older Digitrax command stations which do not
support "Expanded Slots".
- Updated LocoNet Monitor to show certain current-generation
Digitrax command stations as "sourcing" certain LocoNet
messages.
- Updated LocoNet Monitor to better decode certain messages.
- Added a Configure LocoIO Modules tool, accessible from the LocoNet menu, that lists all
connected LocoIO (LNSV1) boards and allows opening a matching programmer, akin to the LNCV pane.
- DecoderPro OpsMode LNSV1 programming has been refactored to use the new Lnsv1MessageContents class
instead of locoio.sendRead/.sendWrite it was still using.
- The LocoIO pane that was deprecated since 4.12 has been removed. The LocoIO configuration
documentation is retained under html LocoNet help.
- Added the Digitrax UR90X to the LocoNet Monitor tool and
JMRI's Help.
- Added the BDL716 as a "decoder" in the JMRI Roster. Added
LocoNet Monitor support of some BDL716-related messages.
- Improved the CV configuration mechanism for Digitrax
7th-generation Accessory devices.
- Updated several Digitrax help pages to include
recently introduced products, fix typos.
- The FollowSE*c.py script was broken at some unknown point in the past.
The script is updated in this release to fix that.
Marklin CS2
- Added simulated CS2 Connection
- Added support for TCP (in addition to UDP) connections to the CS2.
NCE
- Fix to the Consist Backup/Restore program. All versions from 5.7.1 to5.11.3
create a backup file including command station memory space beyond the consist tables.
The bigger issue is that the restore does not check that the addresses in the backup file
are within the consist tables. Restoring one of those backup files could corrupt the
memory used for AIU status and RS-232 buffers. This fixes both of those and makes sure the
restore will only restore within the consist tables.
- There's a new LccPro JMRI application that's
targeted at making it easier to understand and
configure an LCC network. See the
help page
for more information.
- The
Event Table
has been improved:
- It now shows event ranges.
- It now automatically shows the names of event IDs that are
defined in the LCC Standards if you haven't given them another name.
- There's now a "Find Name" that searches for any cell in the name columns
containing a particular string.
- The Find Event and Find Name search boxes update the search
as you type.
- The
File menu
now contains a "Read from CSV..." item that lets you load event names
from a comma-separated (CSV) file.
- A graphics issue on Linux in the configuration screens was fixed.
- Improved the Traffic Monitor display:
- Now shows addressed message destinations;
- Better alignment of messages on the screen;
- Improved how event ID names and uses are displayed on event messages.
- Improved
help page.
- Sensors connected via a bridge can now be accessed via a "Snnn"
hardware address, similar to the "Tnnn" address used for Turnouts.
- You can now enter event IDs by name, in addition to by number:
- When adding Turnouts/Sensors/Lights and setting aspect events
for OpenLCB Signal Masts
- When configuring a node using its CDI
When a name has been entered, a tooltip will show the underlying
numeric events.
-
- Fixed a bug in the LccPro search function on large LCC networks.
- Added "Node Groups" to LccPro and the Event Table.
- You can now create an LCC/OpenLCB
StringIO
that's shared across multiple JMRI instances on the same LCC/OpenLCB network.
If you change the StringIO value in one JMRI instance, it will be propagated to the
other ones over the network. You can then use LogixNG or scripts to
use that information to communicate between JMRI instances.
- Added "Restart" and "Clear CDI cache" to the Send Frame developer screen
- Added "Restart" and "Clear CDI cache" to the contextual (popup) menu in LccPro
- Converged on "Restart" terminology; references to "Reboot" have been changed
- Added overwrite mode to EventID-entry fields. This accessed by using the "insert" key, which
changes the cursor to an underline so you know you're in the mode. Mac keyboards do not
support an insert key, so this feature is not available on the Mac.
- Updated the OpenLCB library being used to version 0.8.5
- Improved handling of memory service timeouts, including
variable timeout lengths defined by the datagram responses.
- Made sure that MTT style turnout addressing used the
standard-compliant "linear" form.
- Improved how Event with Payload messages are displayed in the monitor.
- Enabled the Abort button in the Update Firmware window.
- Backup files are now written with dotted-hex event ID values,
whether or not an event name is available. This makes them more reliable
and more portable.
- Update the STL Editor to support "event names".
- When available, event names will be displayed in the IQYZ tables.
- The load from backup process will handle event names in older CDI backups.
If the event name is no longer in the name store, a temporary event id will
be created.
- Existing event names can be entered in the event columns of the IQYZ tables.
Creating new event names is NOT supported.
- Correctly decode events-with-payload
- First implementation of LCC Location Services which will decode analog-carrying
location services reports to drive volt and amp meters.
- Update the STL Editor to support importing a group_logic.csv file
that has been modified by a spreadsheet program.
- Improve how datagram data is represented in the Monitor
- Add sensor events to the event-entry field popup menu
- There's a new storage method for event names.
Previously, these were stored in the IdTag table, which might
be confusing.
Starting with this release, they're separately stored
in an eventnames/eventNames.xml file within the user files
location.
Names that were previously stored in the IdTag table
will be automatically migrated to this new method.
- Added a power manager (which activates e.g. the power control)
for use with LCC command stations<>/li>
RFID
- A new method was added to receive RFID messages as IdTags over LocoNet, for example using the
Arduino-based GCA51 LocoIO 2xRFID board.
SRCP
- Fast-clock TIME commands now use the 00-23 format for
the hour value and do not repeat 01-12 in the afternoon.
New / Updated decoder definitions
AE Model
- Added AEModels.xml to add support for AE Model decoders
DCC Concepts
- DCC_Concepts_Zen_ABC.xml to add definitions for DCC Concepts Zen Blue/Black V12
Decoderwerk
- New decoder definition for the Decoderwerk LokCommander 7090x
Digitrax
- Updated the Digitrax BDL716's "Roster Entry" with better
information on its "Notes" page.
ESU
GCA
-
Added GCA50 (Arduino Nano based LocoIO) and
GCA51 (2x RFID reader + 8 port LocoIO) models
to the DIY HDL_LocoIO decoder definition.
Hattoms
- Added Hattons-Neo.xml to add Hattons Neo decoders
Hornby
- Added HornbyTXS.xml to add Hornby HM7000 sound decoder definitions
and updated HornbyTTS.xml to address error for
Hall Class Sound definition
MD Electronics
- Corrections to the translation into German
Piko decoders
- Support for XP5.1 decoders up to FW 1.16.0
- Add Decoder and Project CVs
Public Domain and DIY decoders
- Added GCA50 and GCA51 models to the HDL_LocoIO
decoder file, showing only valid modes.
Rampino Elektronic
- Added support for the Loco-1 and Loco-2 decoders.
SoundTraxx
- Fixed some sound options in the
SoundTraxx Tsu2 Diesel OEM Genesis decoder definition.
Technologistic (train-O-matic)
- Fix for resetting Train-O-Matic decoders
ZIMO
- New Zimo MX820 definition.
- Updated Zimo_MS_small_v4.xml and Zimo_MN_small_v4.xml
- Added pane and CVs for "Zimo Scripting".
- Added decoder types MS591N18 and MS540E24
Control Panel Editor
- The ability to set signal mast aspects in view mode is controlled by
the Disabled setting for the signal mast icon. When enabled, changing
the aspect by clicking or selecting from the aspect list is blocked.
DecoderPro
- You can now choose how to sort the
Roster Group Table.
- Hornby TXS Sound Decoders use CVs 200 and 201 to identify the specific Sound Profiles Uploaded to the Chip.
Previously the product-id verification process used CV47, 48 and 49 for these decoders.
Those CVs contain firmware update information which is not useful when creating conditional decoder definitions for TXS chips.
The product-id verification process has been modified to interrogate CVs 201 and 200 for Hornby TXS decoders.
(This should have no effect on identification for Hornby TTS decoders.)
- Added DecoderIndexFile access to a decoder definition's
<programming><mode>, allowing a check of supported modes from a DecoderFile using
getProgrammingModes()
- DecoderPro OpsMode LNSV1 programming has been refactored to use the new Lnsv1MessageContents class
instead of locoio.sendRead/.sendWrite it was still using.
Dispatcher
- Provide more information when selecting traininfo file.
- Add the ability to use an AdHoc transit, which is created dynamically between 2 blocks
Dynamic Transits are always run "No Signals". Dynamic Transits are removed at train termination. If
they are not removed for any reason they will not be saved. Currently the route must be clear from end to end
and any flaws in the routing table will cause grief. Avoid having the train stop in them.
- Add Ghost type block. It must have a "not real" sensor, internal is best.
The sensor should not be manipulated by logix or logixNG or scripts. Auto trains will
set and clear these sensors automatically, manual run trains simply ignore them.
They are useful for adding blocks between 2 turnouts where you would normally add a tiny block with the same block
as one of the turnouts which causes errors in the routing tables. With care they can be used for placing turnouts
in their own block.
- Fix errors in loading maxlength and Maxspeed
- Clean up AdHoc Transits after use.
- Fix minor bugs in min speed settings.
- When setting up a new train use detection Entire Train, unless overridden by custom defaults.
- Always check allocation and switch settings before any signaling system.
- Correctly identify and handle changing position of DoubleXOver switch to prevent switch
changing under a train.
- Identify conflicting routes when checking allocations thru DoubleXOvers with four blocks.
DoubleXOvers with less than four blocks require no additional checks.
- When stopping on previous block going unoccupied and speed profile ramping and minimum speed,
use a 75% stopping length factor for the ramp.
- When a train has been stopped with a missing signal mast attempt to restart use BlockAllocation.
- When a missing signal mast has been found use BlockAllocation method to stop if next block not allocated.
- Restore TSA data to the correct place.
- When checking for a hold mast do not assume the section join is at the end of a section.
- For AdHoc trains check to see if a transit can be used.
- Fix TSA edit bugs, when over riding from roster update internal dcc address.
Layout Editor
- Added "Highlight cursor position" option to enable drawing of a
square around finger/mouse press/drag area. Useful for touchscreens.
- Added a TurnoutCircleTransparency.py script to change the
color and transparency of Layout Editor turnout circles
- The ability to set signal mast aspects in view mode is controlled by
the Disabled setting for the signal mast icon. When enabled, changing
the aspect by clicking or selecting from the aspect list is blocked.
- The right click menu for Markers when using Linux has been fixed.
- Fixed editing and rendering issues with Block Contents Icons.
No longer need to have a value in the block to edit the Icon.
Rotated blocks render correctly.
Empty Hidden now works on initial load and after editing the panel
- Fixed deleting of Inline LogixNG's when Layout Panels are deleted
NX - Entry/Exit Tool
- Enable panel updates while the NX route is being created.
- Display a warning dialog when creating a multipoint route fails.
LccPro
- There's a new LccPro JMRI application that's
targeted at making it easier to understand and
configure an LCC network. See the
help page
for more information.
- Fixed a bug in the LccPro search function on large LCC networks.
- Added "Node Groups" to LccPro and the Event Table.
- Fixed a bug in Event Table display if using large fonts.
-
LogixNG
- The expression StringIO as string value
has been added.
- The formula function currentTimeMillis()
has been added to the Clock module. It
returns the current system time in milliseconds and is
useful if you want to measure how long time it takes for
JMRI to do a task.
- The Listen On Beans,
Listen On Beans - Local variable and
Listen On Beans - Table actions
can now listen on Audio beans.
- Occupancy Blocks can now be used in
the For each action.
- Improved some GUI layouts by adding scroll bars
- The LogixNG action Send MERG CBUS event has
been added. It's available in the category Merg Cbus
if there is a Merg Cbus connection.
- The semicolon has been added as field delimiter for CSV files used to create
LogixNG Tables.
- Where Used support has been added to the Formula actions and expressions. This
is a text based search using the item's system and user names. False positive matches are
possible.
- The formula function evaluateReference() has been added
to the NamedBean module.
Meters and MeterFrames
- Add name of meter to display area, helps when stacking multiple windows.
OperationsPro
- Added text coloring to conductor rolling stock movement.
- Added text coloring to Web Manifest and conductor rolling stock movement.
- Made a change to always allow a caboose to be set out at terminal if there are moves available.
- Fixed location table track direction GUI to report single track direction when appropriate.
- When printing switch list details use track blocking order rather than alphabetically by track name.
- Fixed bug in Show Staging and Schedules by Car Type and Load
- Made route path the same for all cars in a kernel
- Added car's "Route Path" to car export
- Added train departure times to Yardmaster and Conductor.
- Fixed internationalization for Web Manifest, UK and other languages.
- Added the option of building train when selecting Conductor and train not built.
- New print option, Manifests and switch lists can now be printed double sided.
- Export Schedules now includes spur name and mode
- New feature, you can now select locomotive pick up and set out text colors.
- Added track move count to "Export Locations".
- Improved "Train logger" to include the number of cars in train,
the number of pick ups and set outs, train length and weight.
- New feature, import routes.
- New feature, print "Cars In Train" AKA train blocking order
- New print option, show locomotive set outs at end of Manifest or switch list.
- New route feature. Now able to control local car moves for each location in a route.
See https://www.jmri.org/help/en/package/jmri/jmrit/operations/Operations.shtml#EditRoute
- New feature, when building a train, the program now warns for set out and pick up
conflicts between trains when using aggressive mode.
- Program file locations were changed in this release. Start up actions involving
operations windows from previous releases no longer work. You'll need to remove them and add
them back if needed.
- New feature, passenger car blocking order for Manifests and switch lists
- Added car's division name to CSV Manifests and switch lists
- Fixed a bug when routing through staging and no last hop C/I track was available
- Improved the route edit window by always showing both departure time and travel time
- Fixed exception error when replacing a car's load using the "All" cars feature
- New feature, ability to show the last train that transported a car
- Improvements to car export, added the car's route path, previous location, track, and train
- The train icon now shows the number of local moves in the train's route.
- New feature, a turn can now drop and pull the same car on a turn. See Quick Load Service under spurs, load options.
- Added local moves enabled to route export and printing.
- Header lines are now optional for Manifests and switch lists. See Edit Manifest Header Text.
- Added track used, number cars and locos to location export
Panel Editor
- The ability to set signal mast aspects in view mode is controlled by
the Disabled setting for the signal mast icon. When enabled, changing
the aspect by clicking or selecting from the aspect list is blocked.
- Fixed deleting of Inline LogixNG's when Panels are deleted
Preferences
- Update Messages details. Describe the option to hide
tabs without active messages.
Roster
- Roster Table - Fixes initial editing of Last Operated date / time values
using 1-12hr values instead of 0-23.
- New Roster Entries hold the decoder's programming mode, if defined,
to use as a filter similar to
e.g. ProductID.
Scripting
- Added a TurnoutCircleTransparency.py script to change the
color and transparency of Layout Editor turnout circles
- The script InitUnknownTurnoutsSensorsExceptInternal.py
has been added.
InitUnknownTurnoutsSensorsExceptInternal.py
sets "Unknown" hardware states to default values for sensors
(Inactive) and turnouts (Closed). This prevents overriding
known states.
The existing script InitAllTurnoutsSensors.py
would override sensor Active and turnout Thrown states.
- Upgrade YetAnotherAutoTrain.py (YAAT) to version 3.3. There are two new statements.
- Wait for memory <memory name> value to change
- If value for memory <memory name> is <eq | ne | lt | gt | le | ge> <value>
Signals
Signal Systems
- The aspect mapping in the Italian FS-1987
signal system has been updated.
Throttle
Turnouts, Lights, Sensors and other elements
- You can now export the contents of a table
to a CSV file from the File menu.
-
StringIOs
are a new type of object within JMRI. They're a way to exchange informational strings
with the layout hardware. Over time, we'll build-out more system connections for these.
- Fixed a bug that was putting the wrong information in
a Turnout's comment when a SignalHead was created using that Turnout.
Virtual Sound Decoder
- Added checks to prevent errors due to not enough AudioBuffers.
- Added the OpenAL EFX reverb effect to tunnel tracks.
Can be activated using "Advanced Location Following"
and a LayoutEditor panel with a TrackSegment decorated as Tunnel.
Warrants
- SCWarrants brought back to life with a few fixes:
- It is once again possible to create SCWarrants.
- Train tracking is now working.
- Opening the edit dialog for an SCWarrant now shows the correct warrant type.
- Starting an SCWarrants with an un-occupied starting block once agin works as it should, i.e. it is delyed until the starting block become occupied.
Web Server
- Added a new "web/idtags_examples" directory with an example
of icons which move to different places on the webpage depending on their most recent report.
The example shows cars being switched in a simple yard.
The principles shown could be used to show locomotives or train movements.
See the included PDF file for more information.
Z21 Server
- Add support for Roco WlanMaus
- Improve UI to show connected clients
- Add UI for mapping of Z21 turnout numbers to JMRI turnouts, routes etc.
- Add help page
Test Infrastructure
- JUnitAppender -
assertNoErrorMessage
and assertMessage(String msg)
functionality updated to match JavaDoc.
- JUnitAppender - Updated JavaDoc.
Miscellaneous
- You can now export the contents of a table
to a CSV file from the File menu.
- Fixed a bug in the XSLT transforms used to make
panel files human-readable: "if" was used when "when" was required.
- Added a
jmri.util.swing.OvertypeTextArea
class
for data entry with overwrite mode, controlled by the insert key.
(Mac keyboards don't support an insert key, so this is not available on them.)
- The pop-up menu in the various Tables now has an entry
for "Copy System Name".
- Bug fix: Add new editor panel to the Editor Manager when doing a CPE/PE switch.
- There's a new "DarkLAF HC" dark-mode setting for the display.
To use it, select Settings then Display, then click the
button for "DarkLAF HC". Save preferences and restart. Note that this
puts a dark background with light text on all JMRI windows.
You may have to rework your panels for them to look good
in this mode. Some parts of the interface may be hard to read.
- The PlantUML library we use for various documentation images
has been updated to the current 1.2025.2 version.
- There is a new Load and store pane in Preferences,
that has options to exclude dynamic content in the tables and
panels file. Without those dynamic contents, it will be much
easier to keep JMRI's XML files in a version control system
(e.g. GitHub) without having un-necessary merge conflicts.