JMRI Defense: Evidence KAM Copied From JMRI

This page shows some examples of how Matt Katzer and KAM Industries copied from JMRI. For the complete story about the legal struggle to enforce our copyright/license, please see the History page. There's also a Recent Events page.

Background

DecoderPro®, a JMRI component, is able to easily configure more than 300 types of devices because hobbyists have contributed more than 100 decoder definition files. These definitions, produced by lots of separate contributors, are what makes the program so useful, since they express a model railroader's view of how best to configure a particular device. DecoderPro first started using this approach in September of 2001. The decoder definitions represent a huge amount of work by a large number of people.

In 2004, Matt Katzer started talking about "his" Decoder Commander product. It was finally released in 2005; on his web site, Katzer used to claim:

In June 2005 at the [NMRA] Cincinnati convention we Introduced Decoder Commander. The first XML based distributed programmer.(sic)
(Untrue, as JMRI predated this by years) Imagine our surprise when we discovered that he had copied the JMRI decoder definitions for distribution on his CDs, and had provided no credit to JMRI!

In fact, he tried to claim that he created and owned the decoder definitions, saying in the KAM Decoder Commander product manual:

All decoders have unique characteristics. KAM has created a set of Decoder Templates that has these characteristics in an (sic) XML configuration file.

KAM created a tool that copies JMRI definitions and stores them in the KAM format, deliberately omitting JMRI copyright notices and authors' names. Katzer then used this to create the decoder definitions that he shipped with version 304 of his product. He even advertises this tool as a feature of "his" product, without crediting or even mentioning JMRI.

The rest of this page summarizes some of the evidence for all this.

JMRI and KAM files

KAM distributed a copy of each of the JMRI files on it's product CD. We discuss in the following two sections the evidence that these were copied. Here, we just point out that every JMRI file has a corresponding file on the KAM product CD, with a corresponding file name. KAM has provided no files of their own!

For example, the QSI_Electric.tpl.xml on the Decoder Commander CD includes the content of the JMRI QSI_Electric.xml file. The names are identical except for the ".tpl" modifier added.

File content: Version, date, author and copyright information

Original JMRI definition files contain the version, the date modified, the author's name, and a copyright notice. These have free-form content, so there are many formats. The version strings and the modification date strings in the KAM files are EXACTLY the same as those in the original JMRI files they were copied from. The author's name, however, was not copied into the KAM file, nor was the JMRI copyright information.

The decoder definitions are stored in XML files. XML files contain 'formatting' information, and 'content'. The formatting says what kind of information is being carried, while the content is the information itself.

For example, an XML 'element' to represent a person's name might be

  <name first="John" last="Doe" />
The content here is the name "John Doe"; the formatting information specifies that this is a name, with specific values for the first and last parts.

That same information, i.e. the same name, could be represented in other formats:

  <person-name first="John" last="Doe" />

  <name>John Doe</name>

  <name familyname="Doe" firstname="John" />
There are very powerful tools available for reformatting information that's been stored in XML format.

All of the JMRI files contain an XML element that shows the file's author, version number, and modification date. As an example, this is contained in the ZTC_B_Stabilized.xml file:

                <version author="Phil Grainger (phil.grainger@ca.com)"
                        version="1" lastUpdated="20030805" />
This XML element contains three pieces of information:
  • The author of this file is "Phil Grainger (phil.grainger@ca.com)"
  • The version of this file is "1"
  • The date that this file was last updated was "20030805", which is August 5, 2003.
The files on the KAM CD contain elements for VERSION and DATE_MODIFIED. For example, this is contained in the ZTC_B_Stabilized.tpl.xml file:
  <DATE_MODIFIED>20030805</DATE_MODIFIED>
      <TPL_VERSION>1</TPL_VERSION>
This XML element contains two pieces of information:
  • The version of this template file is "1"
  • The date that this file was last 'modified' was "20030805", which is August 5, 2003.
Although the format of the JMRI and KAM elements vary, the information they contain is identical.

Every KAM file contains a modification date character string identical to that in the corresponding JMRI file. These dates in the JMRI files span several years, yet each KAM file has the identical date as its corresponding JMRI file. This, it is clear that this was copied from the JMRI file to the KAM file.

Every KAM file contains version string identical to that in the corresponding JMRI file. Note that these version strings contain many different formats: "4", "1.0 beta", "7.1", ".5", "1.00", "1.02", etc. It's highly unlikely that an independent KAM author would choose so many different ways of writing version numbers, yet still have them be the same as those in the corresponding JMRI files. Thus, these must have been copied, too.

The author information from the JMRI files does not appear in the files on the KAM CD. Given all the other information that was copied, this must have been deliberately deleted.

Although not legally required, JMRI includes copyright information at the top of the file, for example:

<!-- Copyright (C) JMRI 2003, 2005 All rights reserved -->
<!-- See the COPYING file for more information on licensing and appropriate use -->
This does not appear in the KAM files (in fact, no copyright statement is present in the KAM files, probably because they understood these files were not their own work).

Put together, this pattern shows that the files were copied. But that's not all....

File content: Details of descriptions

Many details of the content of the original JMRI files were copied exactly: Misspellings, odd capitalizations, technical errors, even the order in which options are described were all copied over exactly. As an example, the JMRI QSI_Electric.xml file contains an element that's intended to describe the "7th output" of the decoder and what it can do:
    <ivariable label="Outout 7 - Forward/Reverse Only" CVname="53.7.0" CV="53" PI="7" SI="0"
     default="5" comment="QSI" item="CV53.7.0">
      <ienumVal>
        <ienumChoice choice="Dynamic Brakes" value="5"/>
        <ienumChoice choice="Long Air Let-off" value="9"/>
        <ienumChoice choice="Short Air Let-off"/>
        <ienumChoice choice="Mute" value="64"/>
        <ienumChoice choice="Doppler Shift"/>
        <ienumChoice choice="Headlight" value="98"/>
        <ienumChoice choice="Dim Headlight"/>
        <ienumChoice choice="Reverse Light"/>
        <ienumChoice choice="Automatic Cab Lights"/>
        <ienumChoice choice="Directional Mars Light"/>
        <ienumChoice choice="Mars Light"/>
        <ienumChoice choice="Strobe Mars Light"/>
        <ienumChoice choice="Number Board Lights"/>
        <ienumChoice choice="Directional Headlight + Directional Mars Light" value="107"/>
        <ienumChoice choice="Directional Headlight + Directional Ditch Lights"/>
        <ienumChoice choice="Directional Ditch Lights"/>
        <ienumChoice choice="Ditch Lights"/>
        <ienumChoice choice="Stobe Ditch Lights"/>
        <ienumChoice choice="Cruise Control" value="177"/>
        <ienumChoice choice="Scale mph Report and Status Report"/>
        <ienumChoice choice="Coupler Effect" value="211"/>
        <ienumChoice choice="Squealing Brakes" value="215"/>
        <ienumChoice choice="Squealing Brakes + Air Brakes"/>
      </ienumVal>
    </ivariable>
The content of the JMRI file element is a definition of a variable called "Outout 7 - Forward/Reverse Only" (sic; note misspelling of "Output") with default value of "5" and possible meanings:
  • Dynamic Brakes
  • Long Air Let-off
  • Short Air Let-off
  • Mute
  • Doppler Shift
  • Headlight
  • Dim Headlight
  • Reverse Light
  • Automatic Cab Lights
  • Directional Mars Light
  • Mars Light
  • Strobe Mars Light
  • Number Board Lights
  • Directional Headlight + Directional Mars Light
  • Directional Headlight + Directional Ditch Lights
  • Directional Ditch Lights
  • Ditch Lights
  • Stobe Ditch Lights
  • Cruise Control
  • Scale mph Report and Status Report
  • Coupler Effect
  • Squealing Brakes
  • Squealing Brakes + Air Brakes
Note misspelling of "Stobe" instead of "Strobe", the odd capitalization of "mph", and how "+" is used in some places, but "and" is used elsewhere.

The corresponding KAM file contains the element:

    <CV INDEX="53">
      <DEFAULT>5</DEFAULT>
      <MIN>0</MIN>
      <MAX>255</MAX>
      <NAME>Outout 7 - Forward/Reverse Only</NAME>
      <BITS BITS_DEFINED="NO" />
      <BIT_DEFINITION>
        <BIT_0 />
        <BIT_1 />
        <BIT_2 />
        <BIT_3 />
        <BIT_4 />
        <BIT_5 />
        <BIT_6 />
        <BIT_7 />
      </BIT_DEFINITION>
      <DATE_MODIFIED />
      <BitMask />
      <stringList>
        <BitName>Dynamic Brakes</BitName>
        <BitName>Long Air Let-off</BitName>
        <BitName>Short Air Let-off</BitName>
        <BitName>Mute</BitName>
        <BitName>Doppler Shift</BitName>
        <BitName>Headlight</BitName>
        <BitName>Dim Headlight</BitName>
        <BitName>Reverse Light</BitName>
        <BitName>Automatic Cab Lights</BitName>
        <BitName>Directional Mars Light</BitName>
        <BitName>Mars Light</BitName>
        <BitName>Strobe Mars Light</BitName>
        <BitName>Number Board Lights</BitName>
        <BitName>Directional Headlight + Directional Mars Light</BitName>
        <BitName>Directional Headlight + Directional Ditch Lights</BitName>
        <BitName>Directional Ditch Lights</BitName>
        <BitName>Ditch Lights</BitName>
        <BitName>Stobe Ditch Lights</BitName>
        <BitName>Cruise Control</BitName>
        <BitName>Scale mph Report and Status Report</BitName>
        <BitName>Coupler Effect</BitName>
        <BitName>Squealing Brakes</BitName>
        <BitName>Squealing Brakes + Air Brakes</BitName>
      </stringList>
    </CV>

This KAM element is a definition of a variable called "Outout 7 - Forward/Reverse Only" (sic; note same misspelling of "Output") with default value of "5" and possible meanings:

  • Dynamic Brakes
  • Long Air Let-off
  • Short Air Let-off
  • Mute
  • Doppler Shift
  • Headlight
  • Dim Headlight
  • Reverse Light
  • Automatic Cab Lights
  • Directional Mars Light
  • Mars Light
  • Strobe Mars Light
  • Number Board Lights
  • Directional Headlight + Directional Mars Light
  • Directional Headlight + Directional Ditch Lights
  • Directional Ditch Lights
  • Ditch Lights
  • Stobe Ditch Lights
  • Cruise Control
  • Scale mph Report and Status Report
  • Coupler Effect
  • Squealing Brakes
  • Squealing Brakes + Air Brakes
The exact, character-for-character values appear in both the JMRI and KAM CD files, after removing the enclosing format information. There are a number of things that indicate that this exact match must come from copying of the contents of the JMRI files:
  • These are the words of the author, in this case Howard Penny, not the manufacturer of the decoder. The manufacturer of the decoder has different names for several of these options.
  • The "+" sign is used for "and" in three places, but the word "and" is used in a fourth.
  • The initial letter of each word is capitalized except for "mph" (which one might write as "MPH"), and "and"
  • "Stobe" in the 18th line should be "Strobe"

As an example of another type of match, the JMRI ZTC_B_Stabilized.xml file contains the element:

<variable label="Directional Headlights" CV="61" mask="XXXXXXXV">
   <enumVal>
      <enumChoice choice="Headlights are directional and operate automatically"/>
      <enumChoice choice="Headlights are independently controlled (F0-Front, F4-Rear)"/>
   </enumVal>
</variable>
This JMRI element defines a variable named "Directional Headlights" that can be turned on or off. When off, the feature operates as "Headlights are directional and operate automatically", versus operating as "Headlights are independently controlled (F0-Front, F4-Rear)" when the feature is on. The feature has to either be on or off, so you can only pick one of these at a time.

Graphically, this will be represented on the computer screen by the JMRI program as:

   Directional Headlights
   o  Headlights are directional and operate automatically
   o  Headlights are independently controlled (F0-Front, F4-Rear)
with two selection buttons at the left that let you pick either the 1st or 2nd values.

The ZTC_B_Stabilized.tpl.xml file from the KAM CD contains:

    <CV INDEX="61">
       <DEFAULT>3</DEFAULT>
       <MIN>0</MIN>
       <MAX>255</MAX>
       <NAME>Directional Headlights</NAME>
       <BITS BITS_DEFINED="YES" />
       <BIT_DEFINITION>
         <BIT_0>Directional Headlights Headlights are independently controlled (F0-Front, F4-Rear)</BIT_0>
        <BIT_1 />
        <BIT_2 />
        <BIT_3 />
        <BIT_4 />
        <BIT_5 />
        <BIT_6 />
        <BIT_7 />
        </BIT_DEFINITION>
        <DATE_MODIFIED />
        <BitMask>00000001</BitMask>
        <stringList />
    </CV>
Much of this is excess formatting information which is not being used. For example, the DATE_MODIFIED element doesn't carry any information in this element (It's present at the top of the file in another element, as previously mentioned.) But the KAM element does carry the information that there is an option called "Directional Headlights Headlights are independently controlled (F0-Front, F4-Rear)" that is turned on when selected.

Graphically, this will be represented on the computer screen by the KAM program as a single line with a checkbox that can be selected to turn on the option:

o  Directional Headlights Headlights are independently controlled (F0-Front, F4-Rear)
If the checkbox is left unchecked, the feature is left unselected, as described in the JMRI file.

Note the repetition of the word "Headlights" in the label. The information in the KAM file is just a copy of the two pieces of information in the JMRI file, combined into a single phrase. Again, we see evidence that the KAM files were made by an automated translation tool.

There are numerous examples like this. Every time we look at another file on the KAM CD, we find more examples. No reasonable person could argue that Katzer and KAM didn't copy the files from JMRI. This is a violation of the JMRI license, and since Katzer and KAM therefore didn't have permission, of copyright law.

What We're Trying to Do About This

Given that Katzer is actively trying to infringing JMRI intellectual property and attacking JMRI members, we have to do something about his misuse of our software. We therefore added copyright claims to our court case by filing an amended complaint in September 2006 and asked for a preliminary injunction to stop Katzer's misuse of our work. In a motion to dismiss and his reply to the injunction request, Katzer has argued that we can't use our copyrights to hold him responsible that his violations of the JMRI open-source license. We replied to show that open-source licenses are valid and enforceable. In August 2007, the Court ruled that Katzer was right, and that we were not likely to succeed on the merits of our copyright claim. We disagree emphatically with this, for multiple reasons, and are appealing the ruling. Our first brief, presenting our side of the issue, has been filed.

For more information on that, please keep an eye on our Recent Events page or subscribe to the jmri-legal-announce mailing list at SourceForge.net to get a brief note when things happen.