You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@daffodil.apache.org by ji...@apache.org on 2021/03/10 15:31:55 UTC

[daffodil] branch runtime2-2202 updated: Support booleans, arrays of complex types, fixed values, fill bytes

This is an automated email from the ASF dual-hosted git repository.

jinterrante pushed a commit to branch runtime2-2202
in repository https://gitbox.apache.org/repos/asf/daffodil.git


The following commit(s) were added to refs/heads/runtime2-2202 by this push:
     new 6f01c57  Support booleans, arrays of complex types, fixed values, fill bytes
6f01c57 is described below

commit 6f01c578fa71428fbcbd88d8723a3b05483ee657
Author: John Interrante <in...@research.ge.com>
AuthorDate: Tue Feb 16 12:30:15 2021 -0500

    Support booleans, arrays of complex types, fixed values, fill bytes
    
    In order to handle more collaborators' schemas, add support for
    boolean fields, empty sequences, arrays of complex types, validation
    of fixed values, and padding of explicit length complex elements with
    fill bytes.  Add new collaborator schemas, test cases, and data files
    to daffodil-test and update existing tests to improve code coverage.
    
    Changelog:
    
    In ElementBase.scala, give hasFixedLengthOf explicit Boolean type to
    make its type clearer (IDE didn't infer type when I once called it).
    
    In daffodil_main.c, initialize new PState/UState position field.
    
    In xml_reader.c, add strtobool function to convert an XML element's
    text to a boolean.  Sort strtobool, strtodnum, strtofnum, strtonum,
    and strtounum functions and PRIMITIVE_* cases in xmlNumberElem into
    alphabetical order.  Use assert macro to check strtonum's
    pre-condition invariant (minval < maxval).  Use UNUSED macro instead
    of (void) in xmlEndComplex to suppress unused variable compiler
    warnings.  Rename xmlNumberElem's third parameter from numLocation to
    number.  Add PRIMITIVE_BOOLEAN case to xmlNumberElem.
    
    In xml_writer.c, drop (void) and use assert macro to suppress unused
    variable warning in xmlEndComplex.  Rename xmlNumberElem's third
    parameter from numLocation to number.  Sort PRIMITIVE_* cases in
    xmlNumberElem into alphabetical order.  Add PRIMITIVE_BOOLEAN case to
    xmlNumberElem.
    
    In infoset.c, rename walkInfosetNode local variable from numLocation
    to number.  Sort typeCode cases in walkInfosetNode into alphabetical
    order.  Add PRIMITIVE_BOOLEAN case to walkInfosetNode.  Clarify
    eof_or_error_msg error messages to say "Found [eof or error] indicator
    in stream, stopping now" instead of "after reading stream".
    
    In infoset.h, rename VisitNumberElem's third parameter from
    numLocation to number.  Sort TypeCode enumerations into alphabetical
    order.  Add PRIMITIVE_BOOLEAN to TypeCode enumerations.  Add "size_t
    position" fields to both PState and UState structs.  Define UNUSED
    macro to suppress compiler warnings about unused variables.
    
    In parsers.[ch], refactor common C code to read stream, update
    position, and check for errors into a read_stream_update_position
    helper macro.  Add big-endian and little-endian 8, 16, and 32-bit
    parse_<endian>_bool<length> functions to parse binary booleans with
    true_rep and false_rep as additional arguments.  Since DFDL spec says
    true_rep value must fit in uint32_t but we need to know whether
    true_rep is defined or not, pass true_rep as int64_t instead of
    uint32_t, ignore true_rep if negative, and cast true_rep to uint32_t
    before using it.  Swap boolean bytes for endianness after parsing and
    before comparing with true_rep and false_rep.  Use same comparison
    logic as in runtime1's BinaryBooleanParserBase.parse method to conform
    to DFDL spec 13.10 on parsing boolean with binary representation.  Add
    parse_validate_fixed function to validate number is same as fixed
    value after parse.  Make all parser functions update PState's position
    field.  Add parse_fill_bytes function to skip fill bytes until end
    position is reached (like runtime1, does not perform strict check that
    skipped bytes have same value as fill byte).  Reorder parser functions
    into alphabetical order.
    
    In unparsers.[ch], refactor common C code to write stream, update
    position, and check for errors into a write_stream_update_position
    helper macro.  Add big-endian and little-endian 8, 16, and 32-bit
    unparse_<endian>_bool<length> functions to unparse binary booleans
    with true_rep and false_rep as additional arguments.  Use same
    comparison logic as in runtime1's BinaryBooleanUnparserBase.unparse
    method to conform to DFDL spec 13.10 on unparsing boolean with binary
    representation.  Swap boolean bytes for endianness before writing
    their values.  Add unparse_validate_fixed function to validate number
    is same as fixed value during unparse.  Make all unparser functions
    update UState's position field.  Add unparse_fill_bytes function to
    unparse fill bytes until end position is reached.  Reorder unparser
    functions into alphabetical order.
    
    In NestedUnion.h, replace with freshly generated code.
    
    In ex_nums.[ch], replace with newly generated code showing that
    runtime2 will pass true_rep and false_rep values to all parse and
    unparse boolean calls and these values will differ depending on how
    schema defines binaryBooleanFalseRep and binaryBooleanTrueRep for each
    element.  Also show fixed attribute checks for boolean, float, and
    integer elements.
    
    In CodeGenerator.scala, append any code generator warnings to
    CodeGenerator's diagnostics.
    
    In Runtime2CodeGenerator.scala, add BinaryBoolean case to generateCode
    method and extend BinaryBooleanCodeGenerator in order to call
    binaryBooleanGenerateCode method.  Reorder extends/with clauses and
    case expressions into alphabetical order.
    
    In BinaryBooleanCodeGenerator.scala, add binaryBooleanGenerateCode
    method to generate C code to handle 8, 16, and 32-bit
    big-endian/little-endian binary boolean fields.  Run invariant checks
    on binaryBooleanFalseRep and binaryBooleanTrueRep, define trueRep as
    -1 if binaryBooleanTrueRep is not defined and pass both it and
    falseRep to parse_<endian>_bit<bits> calls.  Meanwhile, define
    unparseTrueRep as either trueRep or ~falseRep and pass both it and
    falseRep to unparse_<endian>_bool<bits> calls.  Also add validation of
    boolean fixed values and make code more similar in preparation for
    refactoring duplicated common code from Binary*CodeGenerator traits
    later.
    
    In BinaryFloatCodeGenerator.scala, add validation of floating point
    fixed values and make code more similar for refactoring later.
    
    In BinaryIntegerKnownLengthCodeGenerator.scala, generate code to check
    that the corresponding C struct member has the same value as the value
    of the 'fixed' attribute during parse and unparse if there is any
    'fixed' attribute.  Make code more similar for refactoring later.
    
    In CodeGeneratorState.scala, modify addImplementation to emit UNUSED
    macro calls to avoid compiler warnings for empty sequences which
    produce empty C structs with no members to parse or unparse.  Make
    addBeforeSwitchStatements and addAfterSwitchStatements support padding
    complex elements to explicit lengths with fill bytes in addition to
    supporting choice groups.  Modify addSimpleTypeStatements to ignore
    empty string arguments.  Modify addComplexTypeStatements to handle
    arrays of complex types.  Because schema authors don't always get base
    types right, add private methods getLengthInBits and getPrimType and
    use them to return what types schema authors actually want if simple
    elemnts' explicit lengths don't match their base types' implicit
    lengths.  Make getPrimType generate a schema definition warning if it
    returns a different primType than an element's original primType
    definition.  Call getPrimType in addSimpleTypeERD and
    addFieldDeclaration to select correct ERD type codes and C types for
    simple elements.  Add PrimType.Boolean case to addSimpleTypeERD and
    addFieldDeclaration and sort their cases into alphabetical order.  Add
    stdbool.h header to generateCodeHeader.
    
    In ElementParseAndUnspecifiedLengthCodeGenerator.scala, need to pass
    element to addAfterSwitchStatements to let it get element's explicit
    length and fill byte.
    
    In ex_nums.dfdl.xsd, test both binaryBooleanTrueRep="" and
    binaryBooleanTrueRep="1".  Add array, bigEndian, and littleEndian
    boolean elements to ensure all variations of 8, 16, and 32-bit boolean
    elements are tested.  Also add integer & nonNegativeInteger elements
    with explicit lengths to test these types of integer elements work
    too.  Sort all elements in alphabetical order by their names.  Add new
    elements to validate fixed values for boolean, float, and integer
    numbers.
    
    In ex_nums.tdml, add unparse_errors test and corresponding
    ex_nums_unparse_errors.xml data file to verify error message when
    unparsing incorrect fixed values.
    
    In ex_nums_parse* and ex_nums_unparse*, add data for all new elements.
    
    In Runtime2TDMLDFDLProcessor.scala, pass generator diagnostics to
    Runtime2TDMLDFDLProcessor so we don't lose them (sadly, TDMLRunner
    never checks diagnostics in "Right" tuples containing both diagnostics
    and processor).  Ensure these diagnostics will be passed to
    Runtime2TDMLParseResult and Runtime2TDMLUnparseResult as well,
    However, TDMLRunner won't check any error or warning diagnostics in
    runtime2's TDML tests because it considers them cross tests.  I had to
    set defaultShouldDoWarningComparisonOnCrossTests true in RunnerFactory
    while running runtime2's ex_nums.tdml tests to verify that I could get
    `<tdml:warnings>` in them checked appropriately; otherwise the
    warnings are never checked.  Still, we will see generator warnings
    when we run "daffodil generate c -s ex_nums.dfdl.xsd" now:
    
        [warning] Schema Definition Warning: Ignoring PrimType integer, using short
        Schema context: be_integer16 Location line 81 column 30 in file:/home/interran/apache/daffodil-runtime2/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.dfdl.xsd
        [warning] Schema Definition Warning: Ignoring PrimType nonNegativeInteger, using unsignedInt
        Schema context: be_nonNegativeInteger32 Location line 88 column 30 in file:/home/interran/apache/daffodil-runtime2/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.dfdl.xsd
        [warning] Schema Definition Warning: Ignoring PrimType integer, using long
        Schema context: le_integer64 Location line 124 column 30 in file:/home/interran/apache/daffodil-runtime2/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.dfdl.xsd
        [warning] Schema Definition Warning: Ignoring PrimType nonNegativeInteger, using unsignedByte
        Schema context: le_nonNegativeInteger8 Location line 136 column 30 in file:/home/interran/apache/daffodil-runtime2/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.dfdl.xsd
    
    Add the following new collaborator schemas, test cases, and data files
    to daffodil-test:
     - ISRM_green_to_orange_60000*
     - ISRM_orange_to_green_60002*
     - MPU_green_to_orange_60004*
     - MPU_orange_to_green_60006*
     - TestIsrmGreenToOrange60000.scala
     - TestIsrmOrangeToGreen60002.scala
     - TestMpuGreenToOrange60004.scala
     - TestMpuOrangeToGreen60006.scala
    
    In aptina_settings_* and limits_*, add new binary data and unparse XML
    files for new elements added to orion-command.dfdl.xsd.
    
    In camera_state_unparse.xml, command_unparse.xml, and
    video_settings_unparse.xml, append "Decl" to root element names to
    accommodate renamed element names in orion-command.dfdl.xsd.
    
    In orion-command.dfdl.xsd, update to latest version from collaborator
    with new messages AptinaSettings and Limits and all root elements
    renamed to end with "Decl" instead of having types end with "Type".
    
    In orion-command.tdml, append "Decl" to all root element names, add
    test cases for new messages AptinaSettings and Limits, and reorder
    test cases to follow same order as orion-command.dfdl.xsd.
    
    In TestExNums.scala, add new unparse_errors test.
    
    In TestOrionCommand.scala, add test cases for new messages
    AptinaSettings and Limits and reorder test cases to follow same order
    as orion-command.tdml.
    
    In Rat.scala, ignore the newly added binary data files.
---
 .../org/apache/daffodil/dsom/ElementBase.scala     |   2 +-
 .../src/main/resources/c/libcli/daffodil_main.c    |   4 +-
 .../src/main/resources/c/libcli/xml_reader.c       | 180 +++---
 .../src/main/resources/c/libcli/xml_writer.c       |  75 +--
 .../src/main/resources/c/libruntime/infoset.c      |  43 +-
 .../src/main/resources/c/libruntime/infoset.h      |  29 +-
 .../src/main/resources/c/libruntime/parsers.c      | 143 +++--
 .../src/main/resources/c/libruntime/parsers.h      |  50 +-
 .../src/main/resources/c/libruntime/unparsers.c    | 122 ++--
 .../src/main/resources/c/libruntime/unparsers.h    |  51 +-
 .../src/main/resources/examples/NestedUnion.h      |   1 +
 .../src/main/resources/examples/ex_nums.c          | 620 ++++++++++++++++-----
 .../src/main/resources/examples/ex_nums.h          |  54 +-
 .../apache/daffodil/runtime2/CodeGenerator.scala   |   3 +-
 .../daffodil/runtime2/Runtime2CodeGenerator.scala  |  16 +-
 ...ator.scala => BinaryBooleanCodeGenerator.scala} |  64 ++-
 .../generators/BinaryFloatCodeGenerator.scala      |  24 +-
 .../BinaryIntegerKnownLengthCodeGenerator.scala    |  23 +-
 .../runtime2/generators/CodeGeneratorState.scala   | 201 +++++--
 ...entParseAndUnspecifiedLengthCodeGenerator.scala |   2 +-
 .../org/apache/daffodil/runtime2/ex_nums.dfdl.xsd  | 154 +++--
 .../org/apache/daffodil/runtime2/ex_nums.tdml      |  15 +
 .../org/apache/daffodil/runtime2/ex_nums_parse.dat | Bin 102 -> 159 bytes
 ...rse_runtime1.xml => ex_nums_unparse_errors.xml} |  54 +-
 .../daffodil/runtime2/ex_nums_unparse_runtime1.xml |  54 +-
 .../daffodil/runtime2/ex_nums_unparse_runtime2.xml |  54 +-
 .../tdml/processor/Runtime2TDMLDFDLProcessor.scala |  16 +-
 .../runtime2/ISRM_green_to_orange_60000.dfdl.xsd   | 107 ++++
 .../runtime2/ISRM_green_to_orange_60000.tdml       |  44 +-
 .../ISRM_green_to_orange_60000_parse_0.dat         | Bin 0 -> 212 bytes
 .../ISRM_green_to_orange_60000_parse_1.dat         | Bin 0 -> 212 bytes
 .../ISRM_green_to_orange_60000_unparse_0.xml       | 195 +++++++
 ...ml => ISRM_green_to_orange_60000_unparse_1.xml} |  16 +-
 .../runtime2/ISRM_orange_to_green_60002.dfdl.xsd   |  73 +++
 .../runtime2/ISRM_orange_to_green_60002.tdml       |  48 +-
 .../runtime2/ISRM_orange_to_green_60002_parse.dat  | Bin 0 -> 80 bytes
 .../ISRM_orange_to_green_60002_unparse.xml         | 102 ++++
 .../runtime2/MPU_green_to_orange_60004.dfdl.xsd    |  74 +++
 .../runtime2/MPU_green_to_orange_60004.tdml        |  48 +-
 .../runtime2/MPU_green_to_orange_60004_parse.dat   | Bin 0 -> 81 bytes
 .../runtime2/MPU_green_to_orange_60004_unparse.xml | 103 ++++
 .../runtime2/MPU_orange_to_green_60006.dfdl.xsd    | 163 ++++++
 .../runtime2/MPU_orange_to_green_60006.tdml        |  44 +-
 .../runtime2/MPU_orange_to_green_60006_parse_0.dat | Bin 0 -> 240 bytes
 .../runtime2/MPU_orange_to_green_60006_parse_1.dat | Bin 0 -> 240 bytes
 .../MPU_orange_to_green_60006_unparse_0.xml        | 219 ++++++++
 ...xml => MPU_orange_to_green_60006_unparse_1.xml} |  16 +-
 .../daffodil/runtime2/aptina_settings_parse.dat    | Bin 0 -> 21 bytes
 ...ate_unparse.xml => aptina_settings_unparse.xml} |  22 +-
 .../daffodil/runtime2/camera_state_unparse.xml     |   4 +-
 .../apache/daffodil/runtime2/command_unparse.xml   |   4 +-
 .../org/apache/daffodil/runtime2/limits_parse.dat  | Bin 0 -> 6 bytes
 ...camera_state_unparse.xml => limits_unparse.xml} |  13 +-
 .../daffodil/runtime2/orion-command.dfdl.xsd       |  43 +-
 .../apache/daffodil/runtime2/orion-command.tdml    |  91 ++-
 .../daffodil/runtime2/video_settings_unparse.xml   |   4 +-
 .../org/apache/daffodil/runtime2/TestExNums.scala  |   1 +
 ...mand.scala => TestIsrmGreenToOrange60000.scala} |  22 +-
 ...Nums.scala => TestIsrmOrangeToGreen60002.scala} |  18 +-
 ...xNums.scala => TestMpuGreenToOrange60004.scala} |  18 +-
 ...xNums.scala => TestMpuOrangeToGreen60006.scala} |  20 +-
 .../daffodil/runtime2/TestOrionCommand.scala       |   8 +-
 project/Rat.scala                                  |   8 +
 63 files changed, 2753 insertions(+), 829 deletions(-)

diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ElementBase.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ElementBase.scala
index 965dfd9..58d2b46 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ElementBase.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ElementBase.scala
@@ -608,7 +608,7 @@ trait ElementBase
     }
   }
 
-  final def hasFixedLengthOf(n: Int) = {
+  final def hasFixedLengthOf(n: Int): Boolean = {
     // FIXME: needs to work in lengthUnits. If length units is bytes/bits
     // and encoding is variable-width charset, what should this return?
     // (Perhaps should be usage error?)
diff --git a/daffodil-runtime2/src/main/resources/c/libcli/daffodil_main.c b/daffodil-runtime2/src/main/resources/c/libcli/daffodil_main.c
index 56320ff..fa53b57 100644
--- a/daffodil-runtime2/src/main/resources/c/libcli/daffodil_main.c
+++ b/daffodil-runtime2/src/main/resources/c/libcli/daffodil_main.c
@@ -85,7 +85,7 @@ main(int argc, char *argv[])
             output = fopen_or_exit(output, daffodil_parse.outfile, "w");
 
             // Parse the input file into our infoset.
-            PState pstate = {input, NULL};
+            PState pstate = {input, 0, NULL};
             root->erd->parseSelf(root, &pstate);
             continue_or_exit(pstate.error_msg);
 
@@ -126,7 +126,7 @@ main(int argc, char *argv[])
             }
 
             // Unparse our infoset to the output file.
-            UState ustate = {output, NULL};
+            UState ustate = {output, 0, NULL};
             root->erd->unparseSelf(root, &ustate);
             continue_or_exit(ustate.error_msg);
         }
diff --git a/daffodil-runtime2/src/main/resources/c/libcli/xml_reader.c b/daffodil-runtime2/src/main/resources/c/libcli/xml_reader.c
index 226b015..3688933 100644
--- a/daffodil-runtime2/src/main/resources/c/libcli/xml_reader.c
+++ b/daffodil-runtime2/src/main/resources/c/libcli/xml_reader.c
@@ -16,30 +16,66 @@
  */
 
 #include "xml_reader.h"
+#include <assert.h>    // for assert
 #include <errno.h>     // for errno
 #include <inttypes.h>  // for strtoimax, strtoumax
 #include <mxml.h>      // for mxmlWalkNext, mxmlGetType, mxmlGetElement, MXML_DESCEND, MXML_OPAQUE, mxmlDelete, mxmlGetOpaque, mxmlLoadFile, MXML_OPAQUE_CALLBACK
+#include <stdbool.h>   // for bool, false, true
 #include <stdint.h>    // for intmax_t, uintmax_t, int16_t, int32_t, int64_t, int8_t, uint16_t, uint32_t, uint64_t, uint8_t, INT16_MAX, INT16_MIN, INT32_MAX, INT32_MIN, INT64_MAX, INT64_MIN, INT8_MAX, INT8_MIN, UINT16_MAX, UINT32_MAX, UINT64_MAX, UINT8_MAX
 #include <stdlib.h>    // for strtod, strtof
 #include <string.h>    // for strcmp, strlen, strncmp
 
-// Convert an XML element's text to a signed integer (BSD function not
-// widely available, so call strtoimax with our own error checking)
+// Convert an XML element's text to a boolean with error checking
 
-static intmax_t
-strtonum(const char *numptr, intmax_t minval, intmax_t maxval,
-         const char **errstrp)
+static bool
+strtobool(const char *numptr, const char **errstrp)
+{
+    // The lexical space of xs:boolean accepts true, false, 1, and 0
+    bool        value = false;
+    const char *error_msg = NULL;
+
+    // Report any issues converting the string to a boolean
+    if (strcmp(numptr, "true") == 0)
+    {
+        value = true;
+    }
+    else if (strcmp(numptr, "false") == 0)
+    {
+        value = false;
+    }
+    else if (strcmp(numptr, "1") == 0)
+    {
+        value = true;
+    }
+    else if (strcmp(numptr, "0") == 0)
+    {
+        value = false;
+    }
+    else
+    {
+        error_msg = "Error converting XML data to boolean";
+    }
+
+    *errstrp = error_msg;
+    return value;
+}
+
+// Convert an XML element's text to a double (call strtod with our own
+// error checking)
+
+static double
+strtodnum(const char *numptr, const char **errstrp)
 {
     char *endptr = NULL;
 
-    // Clear errno to detect error after calling strtoimax
+    // Clear errno to detect error after calling strtod
     errno = 0;
-    const intmax_t value = strtoimax(numptr, &endptr, 10);
+    const double value = strtod(numptr, &endptr);
 
     // Report any issues converting the string to a number
     if (errno != 0)
     {
-        *errstrp = "Error converting XML data to integer";
+        *errstrp = "Error converting XML data to number";
     }
     else if (endptr == numptr)
     {
@@ -49,10 +85,6 @@ strtonum(const char *numptr, intmax_t minval, intmax_t maxval,
     {
         *errstrp = "Found non-number characters in XML data";
     }
-    else if (value < minval || value > maxval || maxval < minval)
-    {
-        *errstrp = "Number in XML data out of range";
-    }
     else
     {
         *errstrp = NULL;
@@ -61,22 +93,22 @@ strtonum(const char *numptr, intmax_t minval, intmax_t maxval,
     return value;
 }
 
-// Convert an XML element's text to an unsigned integer (call strtoumax
-// with our own error checking)
+// Convert an XML element's text to a float (call strtof with our own
+// error checking)
 
-static uintmax_t
-strtounum(const char *numptr, uintmax_t maxval, const char **errstrp)
+static float
+strtofnum(const char *numptr, const char **errstrp)
 {
     char *endptr = NULL;
 
-    // Clear errno to detect error after calling strtoumax
+    // Clear errno to detect error after calling strtof
     errno = 0;
-    const uintmax_t value = strtoumax(numptr, &endptr, 10);
+    const float value = strtof(numptr, &endptr);
 
     // Report any issues converting the string to a number
     if (errno != 0)
     {
-        *errstrp = "Error converting XML data to integer";
+        *errstrp = "Error converting XML data to number";
     }
     else if (endptr == numptr)
     {
@@ -86,10 +118,6 @@ strtounum(const char *numptr, uintmax_t maxval, const char **errstrp)
     {
         *errstrp = "Found non-number characters in XML data";
     }
-    else if (value > maxval)
-    {
-        *errstrp = "Number in XML data out of range";
-    }
     else
     {
         *errstrp = NULL;
@@ -98,22 +126,24 @@ strtounum(const char *numptr, uintmax_t maxval, const char **errstrp)
     return value;
 }
 
-// Convert an XML element's text to a float (call strtof with our own
-// error checking)
+// Convert an XML element's text to a signed integer (BSD function not
+// widely available, so call strtoimax with our own error checking)
 
-static float
-strtofnum(const char *numptr, const char **errstrp)
+static intmax_t
+strtonum(const char *numptr, intmax_t minval, intmax_t maxval,
+         const char **errstrp)
 {
     char *endptr = NULL;
+    assert(minval < maxval);
 
-    // Clear errno to detect error after calling strtof
+    // Clear errno to detect error after calling strtoimax
     errno = 0;
-    const float value = strtof(numptr, &endptr);
+    const intmax_t value = strtoimax(numptr, &endptr, 10);
 
     // Report any issues converting the string to a number
     if (errno != 0)
     {
-        *errstrp = "Error converting XML data to number";
+        *errstrp = "Error converting XML data to integer";
     }
     else if (endptr == numptr)
     {
@@ -123,6 +153,10 @@ strtofnum(const char *numptr, const char **errstrp)
     {
         *errstrp = "Found non-number characters in XML data";
     }
+    else if (value < minval || value > maxval)
+    {
+        *errstrp = "Number in XML data out of range";
+    }
     else
     {
         *errstrp = NULL;
@@ -131,22 +165,22 @@ strtofnum(const char *numptr, const char **errstrp)
     return value;
 }
 
-// Convert an XML element's text to a double (call strtod with our own
-// error checking)
+// Convert an XML element's text to an unsigned integer (call strtoumax
+// with our own error checking)
 
-static double
-strtodnum(const char *numptr, const char **errstrp)
+static uintmax_t
+strtounum(const char *numptr, uintmax_t maxval, const char **errstrp)
 {
     char *endptr = NULL;
 
-    // Clear errno to detect error after calling strtod
+    // Clear errno to detect error after calling strtoumax
     errno = 0;
-    const double value = strtod(numptr, &endptr);
+    const uintmax_t value = strtoumax(numptr, &endptr, 10);
 
     // Report any issues converting the string to a number
     if (errno != 0)
     {
-        *errstrp = "Error converting XML data to number";
+        *errstrp = "Error converting XML data to integer";
     }
     else if (endptr == numptr)
     {
@@ -156,6 +190,10 @@ strtodnum(const char *numptr, const char **errstrp)
     {
         *errstrp = "Found non-number characters in XML data";
     }
+    else if (value > maxval)
+    {
+        *errstrp = "Number in XML data out of range";
+    }
     else
     {
         *errstrp = NULL;
@@ -261,16 +299,16 @@ xmlStartComplex(XMLReader *reader, const InfosetBase *base)
 static const char *
 xmlEndComplex(XMLReader *reader, const InfosetBase *base)
 {
-    (void)reader;
-    (void)base;
+    UNUSED(reader); // because nothing to read
+    UNUSED(base); // because nothing to check
     return NULL;
 }
 
-// Read 8, 16, 32, or 64-bit signed/unsigned integer number or floating point
-// number from XML data
+// Read a boolean, 32-bit or 64-bit real number, or 8, 16, 32, or
+// 64-bit signed or unsigned integer from XML data
 
 static const char *
-xmlNumberElem(XMLReader *reader, const ERD *erd, void *numLocation)
+xmlNumberElem(XMLReader *reader, const ERD *erd, void *number)
 {
     // Consume any newlines or whitespace before the element
     while (mxmlGetType(reader->node) == MXML_OPAQUE)
@@ -292,48 +330,50 @@ xmlNumberElem(XMLReader *reader, const ERD *erd, void *numLocation)
             // Check for any errors getting the number
             const char *errstr = NULL;
 
-            // Handle varying bit lengths of both signed & unsigned integers and
-            // floating point numbers
+            // Handle varying bit lengths of both signed & unsigned numbers
             const enum TypeCode typeCode = erd->typeCode;
             switch (typeCode)
             {
-            case PRIMITIVE_UINT64:
-                *(uint64_t *)numLocation =
-                    (uint64_t)strtounum(number_from_xml, UINT64_MAX, &errstr);
-                break;
-            case PRIMITIVE_UINT32:
-                *(uint32_t *)numLocation =
-                    (uint32_t)strtounum(number_from_xml, UINT32_MAX, &errstr);
+            case PRIMITIVE_BOOLEAN:
+                *(bool *)number = strtobool(number_from_xml, &errstr);
                 break;
-            case PRIMITIVE_UINT16:
-                *(uint16_t *)numLocation =
-                    (uint16_t)strtounum(number_from_xml, UINT16_MAX, &errstr);
+            case PRIMITIVE_FLOAT:
+                *(float *)number = strtofnum(number_from_xml, &errstr);
                 break;
-            case PRIMITIVE_UINT8:
-                *(uint8_t *)numLocation =
-                    (uint8_t)strtounum(number_from_xml, UINT8_MAX, &errstr);
+            case PRIMITIVE_DOUBLE:
+                *(double *)number = strtodnum(number_from_xml, &errstr);
                 break;
-            case PRIMITIVE_INT64:
-                *(int64_t *)numLocation = (int64_t)strtonum(
-                    number_from_xml, INT64_MIN, INT64_MAX, &errstr);
+            case PRIMITIVE_INT16:
+                *(int16_t *)number = (int16_t)strtonum(
+                    number_from_xml, INT16_MIN, INT16_MAX, &errstr);
                 break;
             case PRIMITIVE_INT32:
-                *(int32_t *)numLocation = (int32_t)strtonum(
+                *(int32_t *)number = (int32_t)strtonum(
                     number_from_xml, INT32_MIN, INT32_MAX, &errstr);
                 break;
-            case PRIMITIVE_INT16:
-                *(int16_t *)numLocation = (int16_t)strtonum(
-                    number_from_xml, INT16_MIN, INT16_MAX, &errstr);
+            case PRIMITIVE_INT64:
+                *(int64_t *)number = (int64_t)strtonum(
+                    number_from_xml, INT64_MIN, INT64_MAX, &errstr);
                 break;
             case PRIMITIVE_INT8:
-                *(int8_t *)numLocation = (int8_t)strtonum(
-                    number_from_xml, INT8_MIN, INT8_MAX, &errstr);
+                *(int8_t *)number = (int8_t)strtonum(number_from_xml, INT8_MIN,
+                                                     INT8_MAX, &errstr);
                 break;
-            case PRIMITIVE_FLOAT:
-                *(float *)numLocation = strtofnum(number_from_xml, &errstr);
+            case PRIMITIVE_UINT16:
+                *(uint16_t *)number =
+                    (uint16_t)strtounum(number_from_xml, UINT16_MAX, &errstr);
                 break;
-            case PRIMITIVE_DOUBLE:
-                *(double *)numLocation = strtodnum(number_from_xml, &errstr);
+            case PRIMITIVE_UINT32:
+                *(uint32_t *)number =
+                    (uint32_t)strtounum(number_from_xml, UINT32_MAX, &errstr);
+                break;
+            case PRIMITIVE_UINT64:
+                *(uint64_t *)number =
+                    (uint64_t)strtounum(number_from_xml, UINT64_MAX, &errstr);
+                break;
+            case PRIMITIVE_UINT8:
+                *(uint8_t *)number =
+                    (uint8_t)strtounum(number_from_xml, UINT8_MAX, &errstr);
                 break;
             default:
                 errstr = "Unexpected ERD typeCode while reading number from "
diff --git a/daffodil-runtime2/src/main/resources/c/libcli/xml_writer.c b/daffodil-runtime2/src/main/resources/c/libcli/xml_writer.c
index 073423e..4f609ce 100644
--- a/daffodil-runtime2/src/main/resources/c/libcli/xml_writer.c
+++ b/daffodil-runtime2/src/main/resources/c/libcli/xml_writer.c
@@ -16,11 +16,13 @@
  */
 
 #include "xml_writer.h"
-#include "stack.h"   // for stack_is_empty, stack_pop, stack_push, stack_top, stack_init, stack_is_full
-#include <assert.h>  // for assert
-#include <mxml.h>    // for mxmlNewOpaquef, mxml_node_t, mxmlElementSetAttr, mxmlNewElement, mxmlDelete, mxmlNewXML, mxmlSaveFile, MXML_NO_CALLBACK
-#include <stdint.h>  // for int16_t, int32_t, int64_t, int8_t, uint16_t, uint32_t, uint64_t, uint8_t
-#include <stdio.h>   // for NULL, fflush
+#include "stack.h"    // for stack_is_empty, stack_pop, stack_push, stack_top, stack_init, stack_is_full
+#include <assert.h>   // for assert
+#include <mxml.h>     // for mxmlNewOpaquef, mxml_node_t, mxmlElementSetAttr, mxmlNewElement, mxmlDelete, mxmlNewXML, mxmlSaveFile, MXML_NO_CALLBACK
+#include <stdbool.h>  // for bool
+#include <stdint.h>   // for int16_t, int32_t, int64_t, int8_t, uint16_t, uint32_t, uint64_t, uint8_t
+#include <stdio.h>    // for NULL, fflush
+#include <string.h>   // for strcmp
 
 // Push new XML document on stack.  This function is not
 // thread-safe since it uses static storage.
@@ -85,12 +87,15 @@ xmlEndComplex(XMLWriter *writer, const InfosetBase *base)
     if (!stack_is_empty(&writer->stack))
     {
         complex = stack_pop(&writer->stack);
-        (void)base;
+
+        const char *name_from_xml = mxmlGetElement(complex);
+        const char *name_from_erd = get_erd_name(base->erd);
+        assert(strcmp(name_from_xml, name_from_erd) == 0);
     }
     return complex ? NULL : "Underflowed the XML stack";
 }
 
-// Fix a floating point number to conform to xsd:float syntax if needed
+// Fix a real number to conform to xsd:float syntax if needed
 
 static void
 fixNumberIfNeeded(const char *text)
@@ -106,11 +111,11 @@ fixNumberIfNeeded(const char *text)
     //  - Add .0 to 1 to get 1.0 (not worth it)
 }
 
-// Write 8, 16, 32, or 64-bit signed/unsigned Number or floating point number as
-// element
+// Write a boolean, 32-bit or 64-bit real number, or 8, 16, 32, or
+// 64-bit signed or unsigned integer as an XML element's value
 
 static const char *
-xmlNumberElem(XMLWriter *writer, const ERD *erd, const void *numLocation)
+xmlNumberElem(XMLWriter *writer, const ERD *erd, const void *number)
 {
     mxml_node_t *parent = stack_top(&writer->stack);
     const char * name = get_erd_name(erd);
@@ -129,39 +134,43 @@ xmlNumberElem(XMLWriter *writer, const ERD *erd, const void *numLocation)
     mxml_node_t *       text = NULL;
     switch (typeCode)
     {
-    case PRIMITIVE_UINT64:
-        text = mxmlNewOpaquef(simple, "%lu", *(const uint64_t *)numLocation);
-        break;
-    case PRIMITIVE_UINT32:
-        text = mxmlNewOpaquef(simple, "%u", *(const uint32_t *)numLocation);
+    case PRIMITIVE_BOOLEAN:
+        text = mxmlNewOpaquef(simple, "%s",
+                              *(const bool *)number ? "true" : "false");
         break;
-    case PRIMITIVE_UINT16:
-        text = mxmlNewOpaquef(simple, "%hu", *(const uint16_t *)numLocation);
+    case PRIMITIVE_FLOAT:
+        // Round-trippable float, shortest possible
+        text = mxmlNewOpaquef(simple, "%.9G", *(const float *)number);
+        fixNumberIfNeeded(mxmlGetOpaque(text));
         break;
-    case PRIMITIVE_UINT8:
-        text = mxmlNewOpaquef(simple, "%hhu", *(const uint8_t *)numLocation);
+    case PRIMITIVE_DOUBLE:
+        // Round-trippable double, shortest possible
+        text = mxmlNewOpaquef(simple, "%.17lG", *(const double *)number);
+        fixNumberIfNeeded(mxmlGetOpaque(text));
         break;
-    case PRIMITIVE_INT64:
-        text = mxmlNewOpaquef(simple, "%li", *(const int64_t *)numLocation);
+    case PRIMITIVE_INT16:
+        text = mxmlNewOpaquef(simple, "%hi", *(const int16_t *)number);
         break;
     case PRIMITIVE_INT32:
-        text = mxmlNewOpaquef(simple, "%i", *(const int32_t *)numLocation);
+        text = mxmlNewOpaquef(simple, "%i", *(const int32_t *)number);
         break;
-    case PRIMITIVE_INT16:
-        text = mxmlNewOpaquef(simple, "%hi", *(const int16_t *)numLocation);
+    case PRIMITIVE_INT64:
+        text = mxmlNewOpaquef(simple, "%li", *(const int64_t *)number);
         break;
     case PRIMITIVE_INT8:
-        text = mxmlNewOpaquef(simple, "%hhi", *(const int8_t *)numLocation);
+        text = mxmlNewOpaquef(simple, "%hhi", *(const int8_t *)number);
         break;
-    case PRIMITIVE_FLOAT:
-        // Round-trippable float, shortest possible
-        text = mxmlNewOpaquef(simple, "%.9G", *(const float *)numLocation);
-        fixNumberIfNeeded(mxmlGetOpaque(text));
+    case PRIMITIVE_UINT16:
+        text = mxmlNewOpaquef(simple, "%hu", *(const uint16_t *)number);
         break;
-    case PRIMITIVE_DOUBLE:
-        // Round-trippable double, shortest possible
-        text = mxmlNewOpaquef(simple, "%.17lG", *(const double *)numLocation);
-        fixNumberIfNeeded(mxmlGetOpaque(text));
+    case PRIMITIVE_UINT32:
+        text = mxmlNewOpaquef(simple, "%u", *(const uint32_t *)number);
+        break;
+    case PRIMITIVE_UINT64:
+        text = mxmlNewOpaquef(simple, "%lu", *(const uint64_t *)number);
+        break;
+    case PRIMITIVE_UINT8:
+        text = mxmlNewOpaquef(simple, "%hhu", *(const uint8_t *)number);
         break;
     default:
         // Let text remain NULL and report error below
diff --git a/daffodil-runtime2/src/main/resources/c/libruntime/infoset.c b/daffodil-runtime2/src/main/resources/c/libruntime/infoset.c
index 9377b87..4f102f1 100644
--- a/daffodil-runtime2/src/main/resources/c/libruntime/infoset.c
+++ b/daffodil-runtime2/src/main/resources/c/libruntime/infoset.c
@@ -136,37 +136,36 @@ walkInfosetNode(const VisitEventHandler *handler, const InfosetBase *infoNode)
         // We use only one of these variables below depending on typeCode
         const InfosetBase *childNode =
             (const InfosetBase *)((const char *)infoNode + offset);
-        const void *numLocation =
-            (const void *)((const char *)infoNode + offset);
+        const void *number = (const void *)((const char *)infoNode + offset);
 
         // Will need to handle more element types
         const enum TypeCode typeCode = childERD->typeCode;
         switch (typeCode)
         {
-        case COMPLEX:
-            error_msg = walkInfosetNode(handler, childNode);
-            break;
-        case PRIMITIVE_UINT64:
-        case PRIMITIVE_UINT32:
-        case PRIMITIVE_UINT16:
-        case PRIMITIVE_UINT8:
-        case PRIMITIVE_INT64:
-        case PRIMITIVE_INT32:
-        case PRIMITIVE_INT16:
-        case PRIMITIVE_INT8:
-        case PRIMITIVE_FLOAT:
-        case PRIMITIVE_DOUBLE:
-            error_msg =
-                handler->visitNumberElem(handler, childERD, numLocation);
-            break;
         case CHOICE:
             // Point next ERD to choice of alternative elements' ERDs
             if (!infoNode->erd->initChoice(infoNode, rootElement()))
             {
-                error_msg =
-                    "Walk error: no match between choice dispatch key and any branch key";
+                error_msg = "Walk error: no match between choice dispatch key "
+                            "and any branch key";
             }
             break;
+        case COMPLEX:
+            error_msg = walkInfosetNode(handler, childNode);
+            break;
+        case PRIMITIVE_BOOLEAN:
+        case PRIMITIVE_DOUBLE:
+        case PRIMITIVE_FLOAT:
+        case PRIMITIVE_INT16:
+        case PRIMITIVE_INT32:
+        case PRIMITIVE_INT64:
+        case PRIMITIVE_INT8:
+        case PRIMITIVE_UINT16:
+        case PRIMITIVE_UINT32:
+        case PRIMITIVE_UINT64:
+        case PRIMITIVE_UINT8:
+            error_msg = handler->visitNumberElem(handler, childERD, number);
+            break;
         }
     }
 
@@ -209,11 +208,11 @@ eof_or_error_msg(FILE *stream)
 {
     if (feof(stream))
     {
-        return "Found eof indicator after reading stream";
+        return "Found eof indicator in stream, stopping now";
     }
     else if (ferror(stream))
     {
-        return "Found error indicator after reading stream";
+        return "Found error indicator in stream, stopping now";
     }
     else
     {
diff --git a/daffodil-runtime2/src/main/resources/c/libruntime/infoset.h b/daffodil-runtime2/src/main/resources/c/libruntime/infoset.h
index 404bf6d..bc4315e 100644
--- a/daffodil-runtime2/src/main/resources/c/libruntime/infoset.h
+++ b/daffodil-runtime2/src/main/resources/c/libruntime/infoset.h
@@ -43,7 +43,7 @@ typedef const char *(*VisitStartComplex)(const VisitEventHandler *handler,
 typedef const char *(*VisitEndComplex)(const VisitEventHandler *handler,
                                        const InfosetBase *      base);
 typedef const char *(*VisitNumberElem)(const VisitEventHandler *handler,
-                                       const ERD *erd, const void *numLocation);
+                                       const ERD *erd, const void *number);
 
 // NamedQName - name of an infoset element
 
@@ -58,18 +58,19 @@ typedef struct NamedQName
 
 enum TypeCode
 {
+    CHOICE,
     COMPLEX,
-    PRIMITIVE_UINT64,
-    PRIMITIVE_UINT32,
-    PRIMITIVE_UINT16,
-    PRIMITIVE_UINT8,
-    PRIMITIVE_INT64,
-    PRIMITIVE_INT32,
+    PRIMITIVE_BOOLEAN,
+    PRIMITIVE_DOUBLE,
+    PRIMITIVE_FLOAT,
     PRIMITIVE_INT16,
+    PRIMITIVE_INT32,
+    PRIMITIVE_INT64,
     PRIMITIVE_INT8,
-    PRIMITIVE_FLOAT,
-    PRIMITIVE_DOUBLE,
-    CHOICE
+    PRIMITIVE_UINT16,
+    PRIMITIVE_UINT32,
+    PRIMITIVE_UINT64,
+    PRIMITIVE_UINT8
 };
 
 // ERD - element runtime data needed to parse/unparse objects
@@ -100,6 +101,7 @@ typedef struct InfosetBase
 typedef struct PState
 {
     FILE *      stream;    // input to read data from
+    size_t      position;  // 0-based position in stream
     const char *error_msg; // to stop if an error happens
 } PState;
 
@@ -108,6 +110,7 @@ typedef struct PState
 typedef struct UState
 {
     FILE *      stream;    // output to write data to
+    size_t      position;  // 0-based position in stream
     const char *error_msg; // to stop if an error happens
 } UState;
 
@@ -144,8 +147,12 @@ extern const char *walkInfoset(const VisitEventHandler *handler,
 
 extern const char *eof_or_error_msg(FILE *stream);
 
-// NO_CHOICE - value stored in an uninitialized _choice field
+// NO_CHOICE - define value stored in uninitialized _choice field
 
 static const size_t NO_CHOICE = (size_t)-1;
 
+// UNUSED - suppress compiler warning about unused variable
+
+#define UNUSED(x) (void)(x)
+
 #endif // INFOSET_H
diff --git a/daffodil-runtime2/src/main/resources/c/libruntime/parsers.c b/daffodil-runtime2/src/main/resources/c/libruntime/parsers.c
index 8d97b99..db3a783 100644
--- a/daffodil-runtime2/src/main/resources/c/libruntime/parsers.c
+++ b/daffodil-runtime2/src/main/resources/c/libruntime/parsers.c
@@ -16,8 +16,9 @@
  */
 
 #include "parsers.h"
-#include <endian.h>  // for be32toh, be64toh, le32toh, le64toh, be16toh, le16toh
-#include <stdio.h>   // for fread, size_t
+#include <endian.h>   // for be32toh, be64toh, le32toh, le64toh, be16toh, le16toh
+#include <stdbool.h>  // for bool
+#include <stdio.h>    // for fread, size_t
 
 // Macros that are not defined by <endian.h>
 
@@ -25,8 +26,52 @@
 
 #define le8toh(var) var
 
+// Helper macro to reduce duplication of C code reading stream,
+// updating position, and checking for errors
+
+#define read_stream_update_position                                            \
+    size_t count = fread(&buffer.c_val, 1, sizeof(buffer), pstate->stream);    \
+    pstate->position += count;                                                 \
+    if (count < sizeof(buffer))                                                \
+    {                                                                          \
+        pstate->error_msg = eof_or_error_msg(pstate->stream);                  \
+    }
+
 // Macros to define parse_<endian>_<type> functions
 
+#define define_parse_endian_bool(endian, bits)                                 \
+    void parse_##endian##_bool##bits(bool *number, int64_t true_rep,           \
+                                     uint32_t false_rep, PState *pstate)       \
+    {                                                                          \
+        if (!pstate->error_msg)                                                \
+        {                                                                      \
+            union                                                              \
+            {                                                                  \
+                char           c_val[sizeof(uint##bits##_t)];                  \
+                uint##bits##_t i_val;                                          \
+            } buffer;                                                          \
+                                                                               \
+            read_stream_update_position;                                       \
+            buffer.i_val = endian##bits##toh(buffer.i_val);                    \
+            if (true_rep < 0)                                                  \
+            {                                                                  \
+                *number = (buffer.i_val != false_rep);                         \
+            }                                                                  \
+            else if (buffer.i_val == (uint32_t)true_rep)                       \
+            {                                                                  \
+                *number = true;                                                \
+            }                                                                  \
+            else if (buffer.i_val == false_rep)                                \
+            {                                                                  \
+                *number = false;                                               \
+            }                                                                  \
+            else                                                               \
+            {                                                                  \
+                pstate->error_msg = "Unable to parse boolean";                 \
+            }                                                                  \
+        }                                                                      \
+    }
+
 #define define_parse_endian_real(endian, type, bits)                           \
     void parse_##endian##_##type(type *number, PState *pstate)                 \
     {                                                                          \
@@ -38,12 +83,8 @@
                 type           f_val;                                          \
                 uint##bits##_t i_val;                                          \
             } buffer;                                                          \
-            size_t count =                                                     \
-                fread(&buffer.c_val, 1, sizeof(buffer), pstate->stream);       \
-            if (count < sizeof(buffer))                                        \
-            {                                                                  \
-                pstate->error_msg = eof_or_error_msg(pstate->stream);          \
-            }                                                                  \
+                                                                               \
+            read_stream_update_position;                                       \
             buffer.i_val = endian##bits##toh(buffer.i_val);                    \
             *number = buffer.f_val;                                            \
         }                                                                      \
@@ -59,54 +100,78 @@
                 char           c_val[sizeof(type##bits##_t)];                  \
                 type##bits##_t i_val;                                          \
             } buffer;                                                          \
-            size_t count =                                                     \
-                fread(&buffer.c_val, 1, sizeof(buffer), pstate->stream);       \
-            if (count < sizeof(buffer))                                        \
-            {                                                                  \
-                pstate->error_msg = eof_or_error_msg(pstate->stream);          \
-            }                                                                  \
+                                                                               \
+            read_stream_update_position;                                       \
             *number = endian##bits##toh(buffer.i_val);                         \
         }                                                                      \
     }
 
-// Define functions to parse binary real and integer numbers
+// Define functions to parse binary real numbers and integers
 
-define_parse_endian_real(be, double, 64)
+define_parse_endian_bool(be, 16);
+define_parse_endian_bool(be, 32);
+define_parse_endian_bool(be, 8);
 
+define_parse_endian_real(be, double, 64)
 define_parse_endian_real(be, float, 32)
 
-define_parse_endian_integer(be, uint, 64)
-
-define_parse_endian_integer(be, uint, 32)
+define_parse_endian_integer(be, int, 16)
+define_parse_endian_integer(be, int, 32)
+define_parse_endian_integer(be, int, 64)
+define_parse_endian_integer(be, int, 8)
 
 define_parse_endian_integer(be, uint, 16)
-
+define_parse_endian_integer(be, uint, 32)
+define_parse_endian_integer(be, uint, 64)
 define_parse_endian_integer(be, uint, 8)
 
-define_parse_endian_integer(be, int, 64)
-
-define_parse_endian_integer(be, int, 32)
-
-define_parse_endian_integer(be, int, 16)
-
-define_parse_endian_integer(be, int, 8)
+define_parse_endian_bool(le, 16);
+define_parse_endian_bool(le, 32);
+define_parse_endian_bool(le, 8);
 
 define_parse_endian_real(le, double, 64)
-
 define_parse_endian_real(le, float, 32)
 
-define_parse_endian_integer(le, uint, 64)
-
-define_parse_endian_integer(le, uint, 32)
+define_parse_endian_integer(le, int, 16)
+define_parse_endian_integer(le, int, 32)
+define_parse_endian_integer(le, int, 64)
+define_parse_endian_integer(le, int, 8)
 
 define_parse_endian_integer(le, uint, 16)
-
+define_parse_endian_integer(le, uint, 32)
+define_parse_endian_integer(le, uint, 64)
 define_parse_endian_integer(le, uint, 8)
 
-define_parse_endian_integer(le, int, 64)
-
-define_parse_endian_integer(le, int, 32)
-
-define_parse_endian_integer(le, int, 16)
-
-define_parse_endian_integer(le, int, 8)
+// Define function to parse fill bytes until end position is reached
+
+void
+parse_fill_bytes(size_t end_position, PState *pstate)
+{
+    while (!pstate->error_msg && pstate->position < end_position)
+    {
+        char   buffer;
+        size_t count = fread(&buffer, 1, sizeof(buffer), pstate->stream);
+
+        pstate->position += count;
+        if (count < sizeof(buffer))
+        {
+            pstate->error_msg = eof_or_error_msg(pstate->stream);
+        }
+    }
+}
+
+// Define function to validate number is same as fixed value after parse
+
+void
+parse_validate_fixed(bool same, const char *element, PState *pstate)
+{
+    UNUSED(element); // because managing strings hard in embedded C
+    if (!pstate->error_msg && !same)
+    {
+        // Error message would be easier to assemble and
+        // internationalize if we used an error struct with multiple
+        // fields instead of a const char string.
+        pstate->error_msg = "Parse: Value of element does not match value of "
+                            "its 'fixed' attribute";
+    }
+}
diff --git a/daffodil-runtime2/src/main/resources/c/libruntime/parsers.h b/daffodil-runtime2/src/main/resources/c/libruntime/parsers.h
index 1a4f831..42b8d9a 100644
--- a/daffodil-runtime2/src/main/resources/c/libruntime/parsers.h
+++ b/daffodil-runtime2/src/main/resources/c/libruntime/parsers.h
@@ -19,34 +19,58 @@
 #define PARSERS_H
 
 #include "infoset.h"  // for PState
+#include <stdbool.h>  // for bool
 #include <stdint.h>   // for int16_t, int32_t, int64_t, int8_t, uint16_t, uint32_t, uint64_t, uint8_t
 
-// Functions to parse binary floating point numbers and integers
+// Functions to parse binary booleans, real numbers, and integers
+
+extern void parse_be_bool16(bool *number, int64_t true_rep, uint32_t false_rep,
+                            PState *pstate);
+extern void parse_be_bool32(bool *number, int64_t true_rep, uint32_t false_rep,
+                            PState *pstate);
+extern void parse_be_bool8(bool *number, int64_t true_rep, uint32_t false_rep,
+                           PState *pstate);
 
 extern void parse_be_double(double *number, PState *pstate);
 extern void parse_be_float(float *number, PState *pstate);
 
-extern void parse_be_uint64(uint64_t *number, PState *pstate);
-extern void parse_be_uint32(uint32_t *number, PState *pstate);
+extern void parse_be_int16(int16_t *number, PState *pstate);
+extern void parse_be_int32(int32_t *number, PState *pstate);
+extern void parse_be_int64(int64_t *number, PState *pstate);
+extern void parse_be_int8(int8_t *number, PState *pstate);
+
 extern void parse_be_uint16(uint16_t *number, PState *pstate);
+extern void parse_be_uint32(uint32_t *number, PState *pstate);
+extern void parse_be_uint64(uint64_t *number, PState *pstate);
 extern void parse_be_uint8(uint8_t *number, PState *pstate);
 
-extern void parse_be_int64(int64_t *number, PState *pstate);
-extern void parse_be_int32(int32_t *number, PState *pstate);
-extern void parse_be_int16(int16_t *number, PState *pstate);
-extern void parse_be_int8(int8_t *number, PState *pstate);
+extern void parse_le_bool16(bool *number, int64_t true_rep, uint32_t false_rep,
+                            PState *pstate);
+extern void parse_le_bool32(bool *number, int64_t true_rep, uint32_t false_rep,
+                            PState *pstate);
+extern void parse_le_bool8(bool *number, int64_t true_rep, uint32_t false_rep,
+                           PState *pstate);
 
 extern void parse_le_double(double *number, PState *pstate);
 extern void parse_le_float(float *number, PState *pstate);
 
-extern void parse_le_uint64(uint64_t *number, PState *pstate);
-extern void parse_le_uint32(uint32_t *number, PState *pstate);
+extern void parse_le_int16(int16_t *number, PState *pstate);
+extern void parse_le_int32(int32_t *number, PState *pstate);
+extern void parse_le_int64(int64_t *number, PState *pstate);
+extern void parse_le_int8(int8_t *number, PState *pstate);
+
 extern void parse_le_uint16(uint16_t *number, PState *pstate);
+extern void parse_le_uint32(uint32_t *number, PState *pstate);
+extern void parse_le_uint64(uint64_t *number, PState *pstate);
 extern void parse_le_uint8(uint8_t *number, PState *pstate);
 
-extern void parse_le_int64(int64_t *number, PState *pstate);
-extern void parse_le_int32(int32_t *number, PState *pstate);
-extern void parse_le_int16(int16_t *number, PState *pstate);
-extern void parse_le_int8(int8_t *number, PState *pstate);
+// Function to parse fill bytes until end position is reached
+
+extern void parse_fill_bytes(size_t end_position, PState *pstate);
+
+// Function to validate number is same as fixed value after parse
+
+extern void parse_validate_fixed(bool same, const char *element,
+                                 PState *pstate);
 
 #endif // PARSERS_H
diff --git a/daffodil-runtime2/src/main/resources/c/libruntime/unparsers.c b/daffodil-runtime2/src/main/resources/c/libruntime/unparsers.c
index b48bb5d..90bdd17 100644
--- a/daffodil-runtime2/src/main/resources/c/libruntime/unparsers.c
+++ b/daffodil-runtime2/src/main/resources/c/libruntime/unparsers.c
@@ -16,8 +16,9 @@
  */
 
 #include "unparsers.h"
-#include <endian.h>  // for htobe32, htobe64, htole32, htole64, htobe16, htole16
-#include <stdio.h>   // for fwrite, size_t
+#include <endian.h>   // for htobe32, htobe64, htole32, htole64, htobe16, htole16
+#include <stdbool.h>  // for bool
+#include <stdio.h>    // for fwrite, size_t
 
 // Macros that are not defined by <endian.h>
 
@@ -25,8 +26,36 @@
 
 #define htole8(var) var
 
+// Helper macro to reduce duplication of C code writing stream,
+// updating position, and checking for errors
+
+#define write_stream_update_position                                           \
+    size_t count = fwrite(buffer.c_val, 1, sizeof(buffer), ustate->stream);    \
+    ustate->position += count;                                                 \
+    if (count < sizeof(buffer))                                                \
+    {                                                                          \
+        ustate->error_msg = eof_or_error_msg(ustate->stream);                  \
+    }
+
 // Macros to define unparse_<endian>_<type> functions
 
+#define define_unparse_endian_bool(endian, bits)                               \
+    void unparse_##endian##_bool##bits(bool number, uint32_t true_rep,         \
+                                       uint32_t false_rep, UState *ustate)     \
+    {                                                                          \
+        if (!ustate->error_msg)                                                \
+        {                                                                      \
+            union                                                              \
+            {                                                                  \
+                char           c_val[sizeof(uint##bits##_t)];                  \
+                uint##bits##_t i_val;                                          \
+            } buffer;                                                          \
+                                                                               \
+            buffer.i_val = hto##endian##bits(number ? true_rep : false_rep);   \
+            write_stream_update_position;                                      \
+        }                                                                      \
+    }
+
 #define define_unparse_endian_real(endian, type, bits)                         \
     void unparse_##endian##_##type(type number, UState *ustate)                \
     {                                                                          \
@@ -38,14 +67,10 @@
                 type           f_val;                                          \
                 uint##bits##_t i_val;                                          \
             } buffer;                                                          \
+                                                                               \
             buffer.f_val = number;                                             \
             buffer.i_val = hto##endian##bits(buffer.i_val);                    \
-            size_t count =                                                     \
-                fwrite(buffer.c_val, 1, sizeof(buffer), ustate->stream);       \
-            if (count < sizeof(buffer))                                        \
-            {                                                                  \
-                ustate->error_msg = eof_or_error_msg(ustate->stream);          \
-            }                                                                  \
+            write_stream_update_position;                                      \
         }                                                                      \
     }
 
@@ -60,54 +85,77 @@
                 char           c_val[sizeof(type##bits##_t)];                  \
                 type##bits##_t i_val;                                          \
             } buffer;                                                          \
+                                                                               \
             buffer.i_val = hto##endian##bits(number);                          \
-            size_t count =                                                     \
-                fwrite(buffer.c_val, 1, sizeof(buffer), ustate->stream);       \
-            if (count < sizeof(buffer))                                        \
-            {                                                                  \
-                ustate->error_msg = eof_or_error_msg(ustate->stream);          \
-            }                                                                  \
+            write_stream_update_position;                                      \
         }                                                                      \
     }
 
-// Define functions to unparse binary real and integer numbers
+// Define functions to unparse binary real numbers and integers
 
-define_unparse_endian_real(be, double, 64)
+define_unparse_endian_bool(be, 16);
+define_unparse_endian_bool(be, 32);
+define_unparse_endian_bool(be, 8);
 
+define_unparse_endian_real(be, double, 64)
 define_unparse_endian_real(be, float, 32)
 
-define_unparse_endian_integer(be, uint, 64)
-
-define_unparse_endian_integer(be, uint, 32)
+define_unparse_endian_integer(be, int, 16)
+define_unparse_endian_integer(be, int, 32)
+define_unparse_endian_integer(be, int, 64)
+define_unparse_endian_integer(be, int, 8)
 
 define_unparse_endian_integer(be, uint, 16)
-
+define_unparse_endian_integer(be, uint, 32)
+define_unparse_endian_integer(be, uint, 64)
 define_unparse_endian_integer(be, uint, 8)
 
-define_unparse_endian_integer(be, int, 64)
-
-define_unparse_endian_integer(be, int, 32)
-
-define_unparse_endian_integer(be, int, 16)
-
-define_unparse_endian_integer(be, int, 8)
+define_unparse_endian_bool(le, 16);
+define_unparse_endian_bool(le, 32);
+define_unparse_endian_bool(le, 8);
 
 define_unparse_endian_real(le, double, 64)
-
 define_unparse_endian_real(le, float, 32)
 
-define_unparse_endian_integer(le, uint, 64)
-
-define_unparse_endian_integer(le, uint, 32)
+define_unparse_endian_integer(le, int, 16)
+define_unparse_endian_integer(le, int, 32)
+define_unparse_endian_integer(le, int, 64)
+define_unparse_endian_integer(le, int, 8)
 
 define_unparse_endian_integer(le, uint, 16)
-
+define_unparse_endian_integer(le, uint, 32)
+define_unparse_endian_integer(le, uint, 64)
 define_unparse_endian_integer(le, uint, 8)
 
-define_unparse_endian_integer(le, int, 64)
+// Define function to unparse fill bytes until end position is reached
 
-define_unparse_endian_integer(le, int, 32)
-
-define_unparse_endian_integer(le, int, 16)
+void
+unparse_fill_bytes(size_t end_position, const char fill_byte, UState *ustate)
+{
+    while (!ustate->error_msg && ustate->position < end_position)
+    {
+        size_t count = fwrite(&fill_byte, 1, sizeof(fill_byte), ustate->stream);
 
-define_unparse_endian_integer(le, int, 8)
+        ustate->position += count;
+        if (count < sizeof(fill_byte))
+        {
+            ustate->error_msg = eof_or_error_msg(ustate->stream);
+        }
+    }
+}
+
+// Define function to validate number is same as fixed value during unparse
+
+void
+unparse_validate_fixed(bool same, const char *element, UState *ustate)
+{
+    if (!ustate->error_msg && !same)
+    {
+        // Error message would be easier to assemble and
+        // internationalize if we used an error struct with multiple
+        // fields instead of a const char string.
+        ustate->error_msg = "Unparse: Value of element does not match value of "
+                            "its 'fixed' attribute";
+        UNUSED(element); // unused because managing strings hard in embedded C
+    }
+}
diff --git a/daffodil-runtime2/src/main/resources/c/libruntime/unparsers.h b/daffodil-runtime2/src/main/resources/c/libruntime/unparsers.h
index 1d2eabd..b676f7a 100644
--- a/daffodil-runtime2/src/main/resources/c/libruntime/unparsers.h
+++ b/daffodil-runtime2/src/main/resources/c/libruntime/unparsers.h
@@ -19,34 +19,59 @@
 #define UNPARSERS_H
 
 #include "infoset.h"  // for UState
+#include <stdbool.h>  // for bool
 #include <stdint.h>   // for int16_t, int32_t, int64_t, int8_t, uint16_t, uint32_t, uint64_t, uint8_t
 
-// Functions to unparse binary floating point numbers and integers
+// Functions to unparse binary booleans, real numbers, and integers
+
+extern void unparse_be_bool16(bool number, uint32_t true_rep,
+                              uint32_t false_rep, UState *ustate);
+extern void unparse_be_bool32(bool number, uint32_t true_rep,
+                              uint32_t false_rep, UState *ustate);
+extern void unparse_be_bool8(bool number, uint32_t true_rep, uint32_t false_rep,
+                             UState *ustate);
 
 extern void unparse_be_double(double number, UState *ustate);
 extern void unparse_be_float(float number, UState *ustate);
 
-extern void unparse_be_uint64(uint64_t number, UState *ustate);
-extern void unparse_be_uint32(uint32_t number, UState *ustate);
+extern void unparse_be_int16(int16_t number, UState *ustate);
+extern void unparse_be_int32(int32_t number, UState *ustate);
+extern void unparse_be_int64(int64_t number, UState *ustate);
+extern void unparse_be_int8(int8_t number, UState *ustate);
+
 extern void unparse_be_uint16(uint16_t number, UState *ustate);
+extern void unparse_be_uint32(uint32_t number, UState *ustate);
+extern void unparse_be_uint64(uint64_t number, UState *ustate);
 extern void unparse_be_uint8(uint8_t number, UState *ustate);
 
-extern void unparse_be_int64(int64_t number, UState *ustate);
-extern void unparse_be_int32(int32_t number, UState *ustate);
-extern void unparse_be_int16(int16_t number, UState *ustate);
-extern void unparse_be_int8(int8_t number, UState *ustate);
+extern void unparse_le_bool16(bool number, uint32_t true_rep,
+                              uint32_t false_rep, UState *ustate);
+extern void unparse_le_bool32(bool number, uint32_t true_rep,
+                              uint32_t false_rep, UState *ustate);
+extern void unparse_le_bool8(bool number, uint32_t true_rep, uint32_t false_rep,
+                             UState *ustate);
 
 extern void unparse_le_double(double number, UState *ustate);
 extern void unparse_le_float(float number, UState *ustate);
 
-extern void unparse_le_uint64(uint64_t number, UState *ustate);
-extern void unparse_le_uint32(uint32_t number, UState *ustate);
+extern void unparse_le_int16(int16_t number, UState *ustate);
+extern void unparse_le_int32(int32_t number, UState *ustate);
+extern void unparse_le_int64(int64_t number, UState *ustate);
+extern void unparse_le_int8(int8_t number, UState *ustate);
+
 extern void unparse_le_uint16(uint16_t number, UState *ustate);
+extern void unparse_le_uint32(uint32_t number, UState *ustate);
+extern void unparse_le_uint64(uint64_t number, UState *ustate);
 extern void unparse_le_uint8(uint8_t number, UState *ustate);
 
-extern void unparse_le_int64(int64_t number, UState *ustate);
-extern void unparse_le_int32(int32_t number, UState *ustate);
-extern void unparse_le_int16(int16_t number, UState *ustate);
-extern void unparse_le_int8(int8_t number, UState *ustate);
+// Function to unparse fill bytes until end position is reached
+
+extern void unparse_fill_bytes(size_t end_position, const char fill_byte,
+                               UState *ustate);
+
+// Function to validate number is same as fixed value during unparse
+
+extern void unparse_validate_fixed(bool same, const char *element,
+                                   UState *ustate);
 
 #endif // UNPARSERS_H
diff --git a/daffodil-runtime2/src/main/resources/examples/NestedUnion.h b/daffodil-runtime2/src/main/resources/examples/NestedUnion.h
index 4396cd7..620e1b5 100644
--- a/daffodil-runtime2/src/main/resources/examples/NestedUnion.h
+++ b/daffodil-runtime2/src/main/resources/examples/NestedUnion.h
@@ -19,6 +19,7 @@
 #define GENERATED_CODE_H
 
 #include "infoset.h"  // for InfosetBase
+#include <stdbool.h>  // for bool
 #include <stdint.h>   // for int16_t, int32_t, int64_t, int8_t, uint16_t, uint32_t, uint64_t, uint8_t
 
 // Define infoset structures
diff --git a/daffodil-runtime2/src/main/resources/examples/ex_nums.c b/daffodil-runtime2/src/main/resources/examples/ex_nums.c
index fb6f98f..88b7247 100644
--- a/daffodil-runtime2/src/main/resources/examples/ex_nums.c
+++ b/daffodil-runtime2/src/main/resources/examples/ex_nums.c
@@ -33,19 +33,22 @@ static void bigEndian_unparseSelf(const bigEndian *instance, UState *ustate);
 static void littleEndian_initSelf(littleEndian *instance);
 static void littleEndian_parseSelf(littleEndian *instance, PState *pstate);
 static void littleEndian_unparseSelf(const littleEndian *instance, UState *ustate);
+static void fixed_initSelf(fixed *instance);
+static void fixed_parseSelf(fixed *instance, PState *pstate);
+static void fixed_unparseSelf(const fixed *instance, UState *ustate);
 static void ex_nums_initSelf(ex_nums *instance);
 static void ex_nums_parseSelf(ex_nums *instance, PState *pstate);
 static void ex_nums_unparseSelf(const ex_nums *instance, UState *ustate);
 
 // Metadata singletons
 
-static const ERD be_int16_array_ex_nums_ERD = {
+static const ERD be_bool16_array_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "be_int16", // namedQName.local
+        "be_bool16", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_INT16, // typeCode
+    PRIMITIVE_BOOLEAN, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
@@ -59,24 +62,38 @@ static const ERD be_float_array_ex_nums_ERD = {
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
+static const ERD be_int16_array_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "be_int16", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_INT16, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
 static const array array_compute_offsets;
 
-static const size_t array_offsets[6] = {
-    (const char *)&array_compute_offsets.be_int16[0] - (const char *)&array_compute_offsets,
-    (const char *)&array_compute_offsets.be_int16[1] - (const char *)&array_compute_offsets,
-    (const char *)&array_compute_offsets.be_int16[2] - (const char *)&array_compute_offsets,
+static const size_t array_offsets[8] = {
+    (const char *)&array_compute_offsets.be_bool16[0] - (const char *)&array_compute_offsets,
+    (const char *)&array_compute_offsets.be_bool16[1] - (const char *)&array_compute_offsets,
     (const char *)&array_compute_offsets.be_float[0] - (const char *)&array_compute_offsets,
     (const char *)&array_compute_offsets.be_float[1] - (const char *)&array_compute_offsets,
-    (const char *)&array_compute_offsets.be_float[2] - (const char *)&array_compute_offsets
+    (const char *)&array_compute_offsets.be_float[2] - (const char *)&array_compute_offsets,
+    (const char *)&array_compute_offsets.be_int16[0] - (const char *)&array_compute_offsets,
+    (const char *)&array_compute_offsets.be_int16[1] - (const char *)&array_compute_offsets,
+    (const char *)&array_compute_offsets.be_int16[2] - (const char *)&array_compute_offsets
 };
 
-static const ERD *array_childrenERDs[6] = {
-    &be_int16_array_ex_nums_ERD,
-    &be_int16_array_ex_nums_ERD,
-    &be_int16_array_ex_nums_ERD,
+static const ERD *array_childrenERDs[8] = {
+    &be_bool16_array_ex_nums_ERD,
+    &be_bool16_array_ex_nums_ERD,
     &be_float_array_ex_nums_ERD,
     &be_float_array_ex_nums_ERD,
-    &be_float_array_ex_nums_ERD
+    &be_float_array_ex_nums_ERD,
+    &be_int16_array_ex_nums_ERD,
+    &be_int16_array_ex_nums_ERD,
+    &be_int16_array_ex_nums_ERD
 };
 
 static const ERD array_ex_nums_ERD = {
@@ -86,7 +103,7 @@ static const ERD array_ex_nums_ERD = {
         NULL, // namedQName.ns
     },
     COMPLEX, // typeCode
-    6, // numChildren
+    8, // numChildren
     array_offsets, // offsets
     array_childrenERDs, // childrenERDs
     (ERDInitSelf)&array_initSelf, // initSelf
@@ -95,73 +112,73 @@ static const ERD array_ex_nums_ERD = {
     NULL // initChoice
 };
 
-static const ERD be_double_bigEndian_ex_nums_ERD = {
+static const ERD be_bool16_bigEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "be_double", // namedQName.local
+        "be_bool16", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_DOUBLE, // typeCode
+    PRIMITIVE_BOOLEAN, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-static const ERD be_float_bigEndian_ex_nums_ERD = {
+static const ERD be_bool32_bigEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "be_float", // namedQName.local
+        "be_bool32", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_FLOAT, // typeCode
+    PRIMITIVE_BOOLEAN, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-static const ERD be_uint64_bigEndian_ex_nums_ERD = {
+static const ERD be_bool8_bigEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "be_uint64", // namedQName.local
+        "be_bool8", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_UINT64, // typeCode
+    PRIMITIVE_BOOLEAN, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-static const ERD be_uint32_bigEndian_ex_nums_ERD = {
+static const ERD be_boolean_bigEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "be_uint32", // namedQName.local
+        "be_boolean", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_UINT32, // typeCode
+    PRIMITIVE_BOOLEAN, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-static const ERD be_uint16_bigEndian_ex_nums_ERD = {
+static const ERD be_double_bigEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "be_uint16", // namedQName.local
+        "be_double", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_UINT16, // typeCode
+    PRIMITIVE_DOUBLE, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-static const ERD be_uint8_bigEndian_ex_nums_ERD = {
+static const ERD be_float_bigEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "be_uint8", // namedQName.local
+        "be_float", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_UINT8, // typeCode
+    PRIMITIVE_FLOAT, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-static const ERD be_int64_bigEndian_ex_nums_ERD = {
+static const ERD be_int16_bigEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "be_int64", // namedQName.local
+        "be_int16", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_INT64, // typeCode
+    PRIMITIVE_INT16, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
@@ -175,13 +192,13 @@ static const ERD be_int32_bigEndian_ex_nums_ERD = {
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-static const ERD be_int16_bigEndian_ex_nums_ERD = {
+static const ERD be_int64_bigEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "be_int16", // namedQName.local
+        "be_int64", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_INT16, // typeCode
+    PRIMITIVE_INT64, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
@@ -195,32 +212,104 @@ static const ERD be_int8_bigEndian_ex_nums_ERD = {
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
+static const ERD be_integer16_bigEndian_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "be_integer16", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_INT16, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const ERD be_uint16_bigEndian_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "be_uint16", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_UINT16, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const ERD be_uint32_bigEndian_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "be_uint32", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_UINT32, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const ERD be_uint64_bigEndian_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "be_uint64", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_UINT64, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const ERD be_uint8_bigEndian_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "be_uint8", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_UINT8, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const ERD be_nonNegativeInteger32_bigEndian_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "be_nonNegativeInteger32", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_UINT32, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
 static const bigEndian bigEndian_compute_offsets;
 
-static const size_t bigEndian_offsets[10] = {
+static const size_t bigEndian_offsets[16] = {
+    (const char *)&bigEndian_compute_offsets.be_bool16 - (const char *)&bigEndian_compute_offsets,
+    (const char *)&bigEndian_compute_offsets.be_bool32 - (const char *)&bigEndian_compute_offsets,
+    (const char *)&bigEndian_compute_offsets.be_bool8 - (const char *)&bigEndian_compute_offsets,
+    (const char *)&bigEndian_compute_offsets.be_boolean - (const char *)&bigEndian_compute_offsets,
     (const char *)&bigEndian_compute_offsets.be_double - (const char *)&bigEndian_compute_offsets,
     (const char *)&bigEndian_compute_offsets.be_float - (const char *)&bigEndian_compute_offsets,
-    (const char *)&bigEndian_compute_offsets.be_uint64 - (const char *)&bigEndian_compute_offsets,
-    (const char *)&bigEndian_compute_offsets.be_uint32 - (const char *)&bigEndian_compute_offsets,
+    (const char *)&bigEndian_compute_offsets.be_int16 - (const char *)&bigEndian_compute_offsets,
+    (const char *)&bigEndian_compute_offsets.be_int32 - (const char *)&bigEndian_compute_offsets,
+    (const char *)&bigEndian_compute_offsets.be_int64 - (const char *)&bigEndian_compute_offsets,
+    (const char *)&bigEndian_compute_offsets.be_int8 - (const char *)&bigEndian_compute_offsets,
+    (const char *)&bigEndian_compute_offsets.be_integer16 - (const char *)&bigEndian_compute_offsets,
     (const char *)&bigEndian_compute_offsets.be_uint16 - (const char *)&bigEndian_compute_offsets,
+    (const char *)&bigEndian_compute_offsets.be_uint32 - (const char *)&bigEndian_compute_offsets,
+    (const char *)&bigEndian_compute_offsets.be_uint64 - (const char *)&bigEndian_compute_offsets,
     (const char *)&bigEndian_compute_offsets.be_uint8 - (const char *)&bigEndian_compute_offsets,
-    (const char *)&bigEndian_compute_offsets.be_int64 - (const char *)&bigEndian_compute_offsets,
-    (const char *)&bigEndian_compute_offsets.be_int32 - (const char *)&bigEndian_compute_offsets,
-    (const char *)&bigEndian_compute_offsets.be_int16 - (const char *)&bigEndian_compute_offsets,
-    (const char *)&bigEndian_compute_offsets.be_int8 - (const char *)&bigEndian_compute_offsets
+    (const char *)&bigEndian_compute_offsets.be_nonNegativeInteger32 - (const char *)&bigEndian_compute_offsets
 };
 
-static const ERD *bigEndian_childrenERDs[10] = {
+static const ERD *bigEndian_childrenERDs[16] = {
+    &be_bool16_bigEndian_ex_nums_ERD,
+    &be_bool32_bigEndian_ex_nums_ERD,
+    &be_bool8_bigEndian_ex_nums_ERD,
+    &be_boolean_bigEndian_ex_nums_ERD,
     &be_double_bigEndian_ex_nums_ERD,
     &be_float_bigEndian_ex_nums_ERD,
-    &be_uint64_bigEndian_ex_nums_ERD,
-    &be_uint32_bigEndian_ex_nums_ERD,
+    &be_int16_bigEndian_ex_nums_ERD,
+    &be_int32_bigEndian_ex_nums_ERD,
+    &be_int64_bigEndian_ex_nums_ERD,
+    &be_int8_bigEndian_ex_nums_ERD,
+    &be_integer16_bigEndian_ex_nums_ERD,
     &be_uint16_bigEndian_ex_nums_ERD,
+    &be_uint32_bigEndian_ex_nums_ERD,
+    &be_uint64_bigEndian_ex_nums_ERD,
     &be_uint8_bigEndian_ex_nums_ERD,
-    &be_int64_bigEndian_ex_nums_ERD,
-    &be_int32_bigEndian_ex_nums_ERD,
-    &be_int16_bigEndian_ex_nums_ERD,
-    &be_int8_bigEndian_ex_nums_ERD
+    &be_nonNegativeInteger32_bigEndian_ex_nums_ERD
 };
 
 static const ERD bigEndian_ex_nums_ERD = {
@@ -230,7 +319,7 @@ static const ERD bigEndian_ex_nums_ERD = {
         NULL, // namedQName.ns
     },
     COMPLEX, // typeCode
-    10, // numChildren
+    16, // numChildren
     bigEndian_offsets, // offsets
     bigEndian_childrenERDs, // childrenERDs
     (ERDInitSelf)&bigEndian_initSelf, // initSelf
@@ -239,63 +328,63 @@ static const ERD bigEndian_ex_nums_ERD = {
     NULL // initChoice
 };
 
-static const ERD le_uint64_littleEndian_ex_nums_ERD = {
+static const ERD le_bool16_littleEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "le_uint64", // namedQName.local
+        "le_bool16", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_UINT64, // typeCode
+    PRIMITIVE_BOOLEAN, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-static const ERD le_uint32_littleEndian_ex_nums_ERD = {
+static const ERD le_bool32_littleEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "le_uint32", // namedQName.local
+        "le_bool32", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_UINT32, // typeCode
+    PRIMITIVE_BOOLEAN, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-static const ERD le_uint16_littleEndian_ex_nums_ERD = {
+static const ERD le_bool8_littleEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "le_uint16", // namedQName.local
+        "le_bool8", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_UINT16, // typeCode
+    PRIMITIVE_BOOLEAN, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-static const ERD le_uint8_littleEndian_ex_nums_ERD = {
+static const ERD le_boolean_littleEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "le_uint8", // namedQName.local
+        "le_boolean", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_UINT8, // typeCode
+    PRIMITIVE_BOOLEAN, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-static const ERD le_int64_littleEndian_ex_nums_ERD = {
+static const ERD le_double_littleEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "le_int64", // namedQName.local
+        "le_double", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_INT64, // typeCode
+    PRIMITIVE_DOUBLE, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-static const ERD le_int32_littleEndian_ex_nums_ERD = {
+static const ERD le_float_littleEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "le_int32", // namedQName.local
+        "le_float", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_INT32, // typeCode
+    PRIMITIVE_FLOAT, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
@@ -309,6 +398,26 @@ static const ERD le_int16_littleEndian_ex_nums_ERD = {
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
+static const ERD le_int32_littleEndian_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "le_int32", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_INT32, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const ERD le_int64_littleEndian_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "le_int64", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_INT64, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
 static const ERD le_int8_littleEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
@@ -319,52 +428,104 @@ static const ERD le_int8_littleEndian_ex_nums_ERD = {
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-static const ERD le_float_littleEndian_ex_nums_ERD = {
+static const ERD le_integer64_littleEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "le_float", // namedQName.local
+        "le_integer64", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_FLOAT, // typeCode
+    PRIMITIVE_INT64, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-static const ERD le_double_littleEndian_ex_nums_ERD = {
+static const ERD le_uint16_littleEndian_ex_nums_ERD = {
     {
         NULL, // namedQName.prefix
-        "le_double", // namedQName.local
+        "le_uint16", // namedQName.local
         NULL, // namedQName.ns
     },
-    PRIMITIVE_DOUBLE, // typeCode
+    PRIMITIVE_UINT16, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const ERD le_uint32_littleEndian_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "le_uint32", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_UINT32, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const ERD le_uint64_littleEndian_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "le_uint64", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_UINT64, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const ERD le_uint8_littleEndian_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "le_uint8", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_UINT8, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const ERD le_nonNegativeInteger8_littleEndian_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "le_nonNegativeInteger8", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_UINT8, // typeCode
     0, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
 static const littleEndian littleEndian_compute_offsets;
 
-static const size_t littleEndian_offsets[10] = {
-    (const char *)&littleEndian_compute_offsets.le_uint64 - (const char *)&littleEndian_compute_offsets,
-    (const char *)&littleEndian_compute_offsets.le_uint32 - (const char *)&littleEndian_compute_offsets,
-    (const char *)&littleEndian_compute_offsets.le_uint16 - (const char *)&littleEndian_compute_offsets,
-    (const char *)&littleEndian_compute_offsets.le_uint8 - (const char *)&littleEndian_compute_offsets,
-    (const char *)&littleEndian_compute_offsets.le_int64 - (const char *)&littleEndian_compute_offsets,
-    (const char *)&littleEndian_compute_offsets.le_int32 - (const char *)&littleEndian_compute_offsets,
+static const size_t littleEndian_offsets[16] = {
+    (const char *)&littleEndian_compute_offsets.le_bool16 - (const char *)&littleEndian_compute_offsets,
+    (const char *)&littleEndian_compute_offsets.le_bool32 - (const char *)&littleEndian_compute_offsets,
+    (const char *)&littleEndian_compute_offsets.le_bool8 - (const char *)&littleEndian_compute_offsets,
+    (const char *)&littleEndian_compute_offsets.le_boolean - (const char *)&littleEndian_compute_offsets,
+    (const char *)&littleEndian_compute_offsets.le_double - (const char *)&littleEndian_compute_offsets,
+    (const char *)&littleEndian_compute_offsets.le_float - (const char *)&littleEndian_compute_offsets,
     (const char *)&littleEndian_compute_offsets.le_int16 - (const char *)&littleEndian_compute_offsets,
+    (const char *)&littleEndian_compute_offsets.le_int32 - (const char *)&littleEndian_compute_offsets,
+    (const char *)&littleEndian_compute_offsets.le_int64 - (const char *)&littleEndian_compute_offsets,
     (const char *)&littleEndian_compute_offsets.le_int8 - (const char *)&littleEndian_compute_offsets,
-    (const char *)&littleEndian_compute_offsets.le_float - (const char *)&littleEndian_compute_offsets,
-    (const char *)&littleEndian_compute_offsets.le_double - (const char *)&littleEndian_compute_offsets
+    (const char *)&littleEndian_compute_offsets.le_integer64 - (const char *)&littleEndian_compute_offsets,
+    (const char *)&littleEndian_compute_offsets.le_uint16 - (const char *)&littleEndian_compute_offsets,
+    (const char *)&littleEndian_compute_offsets.le_uint32 - (const char *)&littleEndian_compute_offsets,
+    (const char *)&littleEndian_compute_offsets.le_uint64 - (const char *)&littleEndian_compute_offsets,
+    (const char *)&littleEndian_compute_offsets.le_uint8 - (const char *)&littleEndian_compute_offsets,
+    (const char *)&littleEndian_compute_offsets.le_nonNegativeInteger8 - (const char *)&littleEndian_compute_offsets
 };
 
-static const ERD *littleEndian_childrenERDs[10] = {
-    &le_uint64_littleEndian_ex_nums_ERD,
-    &le_uint32_littleEndian_ex_nums_ERD,
-    &le_uint16_littleEndian_ex_nums_ERD,
-    &le_uint8_littleEndian_ex_nums_ERD,
-    &le_int64_littleEndian_ex_nums_ERD,
-    &le_int32_littleEndian_ex_nums_ERD,
+static const ERD *littleEndian_childrenERDs[16] = {
+    &le_bool16_littleEndian_ex_nums_ERD,
+    &le_bool32_littleEndian_ex_nums_ERD,
+    &le_bool8_littleEndian_ex_nums_ERD,
+    &le_boolean_littleEndian_ex_nums_ERD,
+    &le_double_littleEndian_ex_nums_ERD,
+    &le_float_littleEndian_ex_nums_ERD,
     &le_int16_littleEndian_ex_nums_ERD,
+    &le_int32_littleEndian_ex_nums_ERD,
+    &le_int64_littleEndian_ex_nums_ERD,
     &le_int8_littleEndian_ex_nums_ERD,
-    &le_float_littleEndian_ex_nums_ERD,
-    &le_double_littleEndian_ex_nums_ERD
+    &le_integer64_littleEndian_ex_nums_ERD,
+    &le_uint16_littleEndian_ex_nums_ERD,
+    &le_uint32_littleEndian_ex_nums_ERD,
+    &le_uint64_littleEndian_ex_nums_ERD,
+    &le_uint8_littleEndian_ex_nums_ERD,
+    &le_nonNegativeInteger8_littleEndian_ex_nums_ERD
 };
 
 static const ERD littleEndian_ex_nums_ERD = {
@@ -374,7 +535,7 @@ static const ERD littleEndian_ex_nums_ERD = {
         NULL, // namedQName.ns
     },
     COMPLEX, // typeCode
-    10, // numChildren
+    16, // numChildren
     littleEndian_offsets, // offsets
     littleEndian_childrenERDs, // childrenERDs
     (ERDInitSelf)&littleEndian_initSelf, // initSelf
@@ -383,18 +544,92 @@ static const ERD littleEndian_ex_nums_ERD = {
     NULL // initChoice
 };
 
+static const ERD boolean_false_fixed_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "boolean_false", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_BOOLEAN, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const ERD boolean_true_fixed_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "boolean_true", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_BOOLEAN, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const ERD float_1_5_fixed_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "float_1_5", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_FLOAT, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const ERD int_32_fixed_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "int_32", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    PRIMITIVE_INT32, // typeCode
+    0, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static const fixed fixed_compute_offsets;
+
+static const size_t fixed_offsets[4] = {
+    (const char *)&fixed_compute_offsets.boolean_false - (const char *)&fixed_compute_offsets,
+    (const char *)&fixed_compute_offsets.boolean_true - (const char *)&fixed_compute_offsets,
+    (const char *)&fixed_compute_offsets.float_1_5 - (const char *)&fixed_compute_offsets,
+    (const char *)&fixed_compute_offsets.int_32 - (const char *)&fixed_compute_offsets
+};
+
+static const ERD *fixed_childrenERDs[4] = {
+    &boolean_false_fixed_ex_nums_ERD,
+    &boolean_true_fixed_ex_nums_ERD,
+    &float_1_5_fixed_ex_nums_ERD,
+    &int_32_fixed_ex_nums_ERD
+};
+
+static const ERD fixed_ex_nums_ERD = {
+    {
+        NULL, // namedQName.prefix
+        "fixed", // namedQName.local
+        NULL, // namedQName.ns
+    },
+    COMPLEX, // typeCode
+    4, // numChildren
+    fixed_offsets, // offsets
+    fixed_childrenERDs, // childrenERDs
+    (ERDInitSelf)&fixed_initSelf, // initSelf
+    (ERDParseSelf)&fixed_parseSelf, // parseSelf
+    (ERDUnparseSelf)&fixed_unparseSelf, // unparseSelf
+    NULL // initChoice
+};
+
 static const ex_nums ex_nums_compute_offsets;
 
-static const size_t ex_nums_offsets[3] = {
+static const size_t ex_nums_offsets[4] = {
     (const char *)&ex_nums_compute_offsets.array - (const char *)&ex_nums_compute_offsets,
     (const char *)&ex_nums_compute_offsets.bigEndian - (const char *)&ex_nums_compute_offsets,
-    (const char *)&ex_nums_compute_offsets.littleEndian - (const char *)&ex_nums_compute_offsets
+    (const char *)&ex_nums_compute_offsets.littleEndian - (const char *)&ex_nums_compute_offsets,
+    (const char *)&ex_nums_compute_offsets.fixed - (const char *)&ex_nums_compute_offsets
 };
 
-static const ERD *ex_nums_childrenERDs[3] = {
+static const ERD *ex_nums_childrenERDs[4] = {
     &array_ex_nums_ERD,
     &bigEndian_ex_nums_ERD,
-    &littleEndian_ex_nums_ERD
+    &littleEndian_ex_nums_ERD,
+    &fixed_ex_nums_ERD
 };
 
 static const ERD ex_nums_ERD = {
@@ -404,7 +639,7 @@ static const ERD ex_nums_ERD = {
         "http://example.com", // namedQName.ns
     },
     COMPLEX, // typeCode
-    3, // numChildren
+    4, // numChildren
     ex_nums_offsets, // offsets
     ex_nums_childrenERDs, // childrenERDs
     (ERDInitSelf)&ex_nums_initSelf, // initSelf
@@ -434,126 +669,204 @@ static void
 array_initSelf(array *instance)
 {
     instance->_base.erd = &array_ex_nums_ERD;
-    instance->be_int16[0] = 0xCCCC;
-    instance->be_int16[1] = 0xCCCC;
-    instance->be_int16[2] = 0xCCCC;
+    instance->be_bool16[0] = true;
+    instance->be_bool16[1] = true;
     instance->be_float[0] = NAN;
     instance->be_float[1] = NAN;
     instance->be_float[2] = NAN;
+    instance->be_int16[0] = 0xCCCC;
+    instance->be_int16[1] = 0xCCCC;
+    instance->be_int16[2] = 0xCCCC;
 }
 
 static void
 array_parseSelf(array *instance, PState *pstate)
 {
-    parse_be_int16(&instance->be_int16[0], pstate);
-    parse_be_int16(&instance->be_int16[1], pstate);
-    parse_be_int16(&instance->be_int16[2], pstate);
+    parse_be_bool16(&instance->be_bool16[0], -1, 0, pstate);
+    parse_be_bool16(&instance->be_bool16[1], -1, 0, pstate);
     parse_be_float(&instance->be_float[0], pstate);
     parse_be_float(&instance->be_float[1], pstate);
     parse_be_float(&instance->be_float[2], pstate);
+    parse_be_int16(&instance->be_int16[0], pstate);
+    parse_be_int16(&instance->be_int16[1], pstate);
+    parse_be_int16(&instance->be_int16[2], pstate);
 }
 
 static void
 array_unparseSelf(const array *instance, UState *ustate)
 {
-    unparse_be_int16(instance->be_int16[0], ustate);
-    unparse_be_int16(instance->be_int16[1], ustate);
-    unparse_be_int16(instance->be_int16[2], ustate);
+    unparse_be_bool16(instance->be_bool16[0], ~0, 0, ustate);
+    unparse_be_bool16(instance->be_bool16[1], ~0, 0, ustate);
     unparse_be_float(instance->be_float[0], ustate);
     unparse_be_float(instance->be_float[1], ustate);
     unparse_be_float(instance->be_float[2], ustate);
+    unparse_be_int16(instance->be_int16[0], ustate);
+    unparse_be_int16(instance->be_int16[1], ustate);
+    unparse_be_int16(instance->be_int16[2], ustate);
 }
 
 static void
 bigEndian_initSelf(bigEndian *instance)
 {
     instance->_base.erd = &bigEndian_ex_nums_ERD;
+    instance->be_bool16 = true;
+    instance->be_bool32 = true;
+    instance->be_bool8 = true;
+    instance->be_boolean = true;
     instance->be_double = NAN;
     instance->be_float = NAN;
-    instance->be_uint64 = 0xCCCCCCCCCCCCCCCC;
-    instance->be_uint32 = 0xCCCCCCCC;
-    instance->be_uint16 = 0xCCCC;
-    instance->be_uint8 = 0xCC;
-    instance->be_int64 = 0xCCCCCCCCCCCCCCCC;
-    instance->be_int32 = 0xCCCCCCCC;
     instance->be_int16 = 0xCCCC;
+    instance->be_int32 = 0xCCCCCCCC;
+    instance->be_int64 = 0xCCCCCCCCCCCCCCCC;
     instance->be_int8 = 0xCC;
+    instance->be_integer16 = 0xCCCC;
+    instance->be_uint16 = 0xCCCC;
+    instance->be_uint32 = 0xCCCCCCCC;
+    instance->be_uint64 = 0xCCCCCCCCCCCCCCCC;
+    instance->be_uint8 = 0xCC;
+    instance->be_nonNegativeInteger32 = 0xCCCCCCCC;
 }
 
 static void
 bigEndian_parseSelf(bigEndian *instance, PState *pstate)
 {
+    parse_be_bool16(&instance->be_bool16, 1, 0, pstate);
+    parse_be_bool32(&instance->be_bool32, -1, 0, pstate);
+    parse_be_bool8(&instance->be_bool8, -1, 0, pstate);
+    parse_be_bool32(&instance->be_boolean, -1, 0, pstate);
     parse_be_double(&instance->be_double, pstate);
     parse_be_float(&instance->be_float, pstate);
-    parse_be_uint64(&instance->be_uint64, pstate);
-    parse_be_uint32(&instance->be_uint32, pstate);
-    parse_be_uint16(&instance->be_uint16, pstate);
-    parse_be_uint8(&instance->be_uint8, pstate);
-    parse_be_int64(&instance->be_int64, pstate);
-    parse_be_int32(&instance->be_int32, pstate);
     parse_be_int16(&instance->be_int16, pstate);
+    parse_be_int32(&instance->be_int32, pstate);
+    parse_be_int64(&instance->be_int64, pstate);
     parse_be_int8(&instance->be_int8, pstate);
+    parse_be_int16(&instance->be_integer16, pstate);
+    parse_be_uint16(&instance->be_uint16, pstate);
+    parse_be_uint32(&instance->be_uint32, pstate);
+    parse_be_uint64(&instance->be_uint64, pstate);
+    parse_be_uint8(&instance->be_uint8, pstate);
+    parse_be_uint32(&instance->be_nonNegativeInteger32, pstate);
 }
 
 static void
 bigEndian_unparseSelf(const bigEndian *instance, UState *ustate)
 {
+    unparse_be_bool16(instance->be_bool16, 1, 0, ustate);
+    unparse_be_bool32(instance->be_bool32, ~0, 0, ustate);
+    unparse_be_bool8(instance->be_bool8, ~0, 0, ustate);
+    unparse_be_bool32(instance->be_boolean, ~0, 0, ustate);
     unparse_be_double(instance->be_double, ustate);
     unparse_be_float(instance->be_float, ustate);
-    unparse_be_uint64(instance->be_uint64, ustate);
-    unparse_be_uint32(instance->be_uint32, ustate);
-    unparse_be_uint16(instance->be_uint16, ustate);
-    unparse_be_uint8(instance->be_uint8, ustate);
-    unparse_be_int64(instance->be_int64, ustate);
-    unparse_be_int32(instance->be_int32, ustate);
     unparse_be_int16(instance->be_int16, ustate);
+    unparse_be_int32(instance->be_int32, ustate);
+    unparse_be_int64(instance->be_int64, ustate);
     unparse_be_int8(instance->be_int8, ustate);
+    unparse_be_int16(instance->be_integer16, ustate);
+    unparse_be_uint16(instance->be_uint16, ustate);
+    unparse_be_uint32(instance->be_uint32, ustate);
+    unparse_be_uint64(instance->be_uint64, ustate);
+    unparse_be_uint8(instance->be_uint8, ustate);
+    unparse_be_uint32(instance->be_nonNegativeInteger32, ustate);
 }
 
 static void
 littleEndian_initSelf(littleEndian *instance)
 {
     instance->_base.erd = &littleEndian_ex_nums_ERD;
-    instance->le_uint64 = 0xCCCCCCCCCCCCCCCC;
-    instance->le_uint32 = 0xCCCCCCCC;
-    instance->le_uint16 = 0xCCCC;
-    instance->le_uint8 = 0xCC;
-    instance->le_int64 = 0xCCCCCCCCCCCCCCCC;
-    instance->le_int32 = 0xCCCCCCCC;
+    instance->le_bool16 = true;
+    instance->le_bool32 = true;
+    instance->le_bool8 = true;
+    instance->le_boolean = true;
+    instance->le_double = NAN;
+    instance->le_float = NAN;
     instance->le_int16 = 0xCCCC;
+    instance->le_int32 = 0xCCCCCCCC;
+    instance->le_int64 = 0xCCCCCCCCCCCCCCCC;
     instance->le_int8 = 0xCC;
-    instance->le_float = NAN;
-    instance->le_double = NAN;
+    instance->le_integer64 = 0xCCCCCCCCCCCCCCCC;
+    instance->le_uint16 = 0xCCCC;
+    instance->le_uint32 = 0xCCCCCCCC;
+    instance->le_uint64 = 0xCCCCCCCCCCCCCCCC;
+    instance->le_uint8 = 0xCC;
+    instance->le_nonNegativeInteger8 = 0xCC;
 }
 
 static void
 littleEndian_parseSelf(littleEndian *instance, PState *pstate)
 {
-    parse_le_uint64(&instance->le_uint64, pstate);
-    parse_le_uint32(&instance->le_uint32, pstate);
-    parse_le_uint16(&instance->le_uint16, pstate);
-    parse_le_uint8(&instance->le_uint8, pstate);
-    parse_le_int64(&instance->le_int64, pstate);
-    parse_le_int32(&instance->le_int32, pstate);
+    parse_le_bool16(&instance->le_bool16, 1, 0, pstate);
+    parse_le_bool32(&instance->le_bool32, -1, 0, pstate);
+    parse_le_bool8(&instance->le_bool8, -1, 0, pstate);
+    parse_le_bool32(&instance->le_boolean, -1, 0, pstate);
+    parse_le_double(&instance->le_double, pstate);
+    parse_le_float(&instance->le_float, pstate);
     parse_le_int16(&instance->le_int16, pstate);
+    parse_le_int32(&instance->le_int32, pstate);
+    parse_le_int64(&instance->le_int64, pstate);
     parse_le_int8(&instance->le_int8, pstate);
-    parse_le_float(&instance->le_float, pstate);
-    parse_le_double(&instance->le_double, pstate);
+    parse_le_int64(&instance->le_integer64, pstate);
+    parse_le_uint16(&instance->le_uint16, pstate);
+    parse_le_uint32(&instance->le_uint32, pstate);
+    parse_le_uint64(&instance->le_uint64, pstate);
+    parse_le_uint8(&instance->le_uint8, pstate);
+    parse_le_uint8(&instance->le_nonNegativeInteger8, pstate);
 }
 
 static void
 littleEndian_unparseSelf(const littleEndian *instance, UState *ustate)
 {
-    unparse_le_uint64(instance->le_uint64, ustate);
-    unparse_le_uint32(instance->le_uint32, ustate);
-    unparse_le_uint16(instance->le_uint16, ustate);
-    unparse_le_uint8(instance->le_uint8, ustate);
-    unparse_le_int64(instance->le_int64, ustate);
-    unparse_le_int32(instance->le_int32, ustate);
+    unparse_le_bool16(instance->le_bool16, 1, 0, ustate);
+    unparse_le_bool32(instance->le_bool32, ~0, 0, ustate);
+    unparse_le_bool8(instance->le_bool8, ~0, 0, ustate);
+    unparse_le_bool32(instance->le_boolean, ~0, 0, ustate);
+    unparse_le_double(instance->le_double, ustate);
+    unparse_le_float(instance->le_float, ustate);
     unparse_le_int16(instance->le_int16, ustate);
+    unparse_le_int32(instance->le_int32, ustate);
+    unparse_le_int64(instance->le_int64, ustate);
     unparse_le_int8(instance->le_int8, ustate);
-    unparse_le_float(instance->le_float, ustate);
-    unparse_le_double(instance->le_double, ustate);
+    unparse_le_int64(instance->le_integer64, ustate);
+    unparse_le_uint16(instance->le_uint16, ustate);
+    unparse_le_uint32(instance->le_uint32, ustate);
+    unparse_le_uint64(instance->le_uint64, ustate);
+    unparse_le_uint8(instance->le_uint8, ustate);
+    unparse_le_uint8(instance->le_nonNegativeInteger8, ustate);
+}
+
+static void
+fixed_initSelf(fixed *instance)
+{
+    instance->_base.erd = &fixed_ex_nums_ERD;
+    instance->boolean_false = true;
+    instance->boolean_true = true;
+    instance->float_1_5 = NAN;
+    instance->int_32 = 0xCCCCCCCC;
+}
+
+static void
+fixed_parseSelf(fixed *instance, PState *pstate)
+{
+    parse_be_bool32(&instance->boolean_false, -1, 0, pstate);
+    parse_validate_fixed(instance->boolean_false == false, "boolean_false", pstate);
+    parse_be_bool32(&instance->boolean_true, -1, 0, pstate);
+    parse_validate_fixed(instance->boolean_true == true, "boolean_true", pstate);
+    parse_be_float(&instance->float_1_5, pstate);
+    parse_validate_fixed(instance->float_1_5 == 1.5, "float_1_5", pstate);
+    parse_be_int32(&instance->int_32, pstate);
+    parse_validate_fixed(instance->int_32 == 32, "int_32", pstate);
+}
+
+static void
+fixed_unparseSelf(const fixed *instance, UState *ustate)
+{
+    unparse_be_bool32(instance->boolean_false, ~0, 0, ustate);
+    unparse_validate_fixed(instance->boolean_false == false, "boolean_false", ustate);
+    unparse_be_bool32(instance->boolean_true, ~0, 0, ustate);
+    unparse_validate_fixed(instance->boolean_true == true, "boolean_true", ustate);
+    unparse_be_float(instance->float_1_5, ustate);
+    unparse_validate_fixed(instance->float_1_5 == 1.5, "float_1_5", ustate);
+    unparse_be_int32(instance->int_32, ustate);
+    unparse_validate_fixed(instance->int_32 == 32, "int_32", ustate);
 }
 
 static void
@@ -563,6 +876,7 @@ ex_nums_initSelf(ex_nums *instance)
     array_initSelf(&instance->array);
     bigEndian_initSelf(&instance->bigEndian);
     littleEndian_initSelf(&instance->littleEndian);
+    fixed_initSelf(&instance->fixed);
 }
 
 static void
@@ -571,6 +885,7 @@ ex_nums_parseSelf(ex_nums *instance, PState *pstate)
     array_parseSelf(&instance->array, pstate);
     bigEndian_parseSelf(&instance->bigEndian, pstate);
     littleEndian_parseSelf(&instance->littleEndian, pstate);
+    fixed_parseSelf(&instance->fixed, pstate);
 }
 
 static void
@@ -579,5 +894,6 @@ ex_nums_unparseSelf(const ex_nums *instance, UState *ustate)
     array_unparseSelf(&instance->array, ustate);
     bigEndian_unparseSelf(&instance->bigEndian, ustate);
     littleEndian_unparseSelf(&instance->littleEndian, ustate);
+    fixed_unparseSelf(&instance->fixed, ustate);
 }
 
diff --git a/daffodil-runtime2/src/main/resources/examples/ex_nums.h b/daffodil-runtime2/src/main/resources/examples/ex_nums.h
index 403da6b..ae33283 100644
--- a/daffodil-runtime2/src/main/resources/examples/ex_nums.h
+++ b/daffodil-runtime2/src/main/resources/examples/ex_nums.h
@@ -19,6 +19,7 @@
 #define GENERATED_CODE_H
 
 #include "infoset.h"  // for InfosetBase
+#include <stdbool.h>  // for bool
 #include <stdint.h>   // for int16_t, int32_t, int64_t, int8_t, uint16_t, uint32_t, uint64_t, uint8_t
 
 // Define infoset structures
@@ -26,46 +27,69 @@
 typedef struct array
 {
     InfosetBase _base;
-    int16_t     be_int16[3];
+    bool        be_bool16[2];
     float       be_float[3];
+    int16_t     be_int16[3];
 } array;
 
 typedef struct bigEndian
 {
     InfosetBase _base;
+    bool        be_bool16;
+    bool        be_bool32;
+    bool        be_bool8;
+    bool        be_boolean;
     double      be_double;
     float       be_float;
-    uint64_t    be_uint64;
-    uint32_t    be_uint32;
-    uint16_t    be_uint16;
-    uint8_t     be_uint8;
-    int64_t     be_int64;
-    int32_t     be_int32;
     int16_t     be_int16;
+    int32_t     be_int32;
+    int64_t     be_int64;
     int8_t      be_int8;
+    int16_t     be_integer16;
+    uint16_t    be_uint16;
+    uint32_t    be_uint32;
+    uint64_t    be_uint64;
+    uint8_t     be_uint8;
+    uint32_t    be_nonNegativeInteger32;
 } bigEndian;
 
 typedef struct littleEndian
 {
     InfosetBase _base;
-    uint64_t    le_uint64;
-    uint32_t    le_uint32;
-    uint16_t    le_uint16;
-    uint8_t     le_uint8;
-    int64_t     le_int64;
-    int32_t     le_int32;
+    bool        le_bool16;
+    bool        le_bool32;
+    bool        le_bool8;
+    bool        le_boolean;
+    double      le_double;
+    float       le_float;
     int16_t     le_int16;
+    int32_t     le_int32;
+    int64_t     le_int64;
     int8_t      le_int8;
-    float       le_float;
-    double      le_double;
+    int64_t     le_integer64;
+    uint16_t    le_uint16;
+    uint32_t    le_uint32;
+    uint64_t    le_uint64;
+    uint8_t     le_uint8;
+    uint8_t     le_nonNegativeInteger8;
 } littleEndian;
 
+typedef struct fixed
+{
+    InfosetBase _base;
+    bool        boolean_false;
+    bool        boolean_true;
+    float       float_1_5;
+    int32_t     int_32;
+} fixed;
+
 typedef struct ex_nums
 {
     InfosetBase _base;
     array array;
     bigEndian bigEndian;
     littleEndian littleEndian;
+    fixed fixed;
 } ex_nums;
 
 #endif // GENERATED_CODE_H
diff --git a/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/CodeGenerator.scala b/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/CodeGenerator.scala
index 7756780..ad6cc53 100644
--- a/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/CodeGenerator.scala
+++ b/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/CodeGenerator.scala
@@ -79,10 +79,11 @@ class CodeGenerator(root: Root) extends DFDL.CodeGenerator {
         if (fileSystem != null) fileSystem.close()
     }
 
-    // Generate C code from the DFDL schema
+    // Generate C code from the DFDL schema, appending any warnings to our diagnostics
     val rootElementName = rootNS.getOrElse(root.refQName).local
     val codeGeneratorState = new CodeGeneratorState()
     Runtime2CodeGenerator.generateCode(root.document, codeGeneratorState)
+    diagnostics = diagnostics ++ root.warnings
     val codeHeaderText = codeGeneratorState.generateCodeHeader
     val codeFileText = codeGeneratorState.generateCodeFile(rootElementName)
 
diff --git a/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/Runtime2CodeGenerator.scala b/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/Runtime2CodeGenerator.scala
index 633cc28..ce494c5 100644
--- a/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/Runtime2CodeGenerator.scala
+++ b/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/Runtime2CodeGenerator.scala
@@ -21,6 +21,7 @@ import org.apache.daffodil.grammar.Gram
 import org.apache.daffodil.grammar.Prod
 import org.apache.daffodil.grammar.RootGrammarMixin
 import org.apache.daffodil.grammar.SeqComp
+import org.apache.daffodil.grammar.primitives.BinaryBoolean
 import org.apache.daffodil.grammar.primitives.BinaryDouble
 import org.apache.daffodil.grammar.primitives.BinaryFloat
 import org.apache.daffodil.grammar.primitives.BinaryIntegerKnownLength
@@ -33,6 +34,7 @@ import org.apache.daffodil.grammar.primitives.ElementParseAndUnspecifiedLength
 import org.apache.daffodil.grammar.primitives.OrderedSequence
 import org.apache.daffodil.grammar.primitives.ScalarOrderedSequenceChild
 import org.apache.daffodil.grammar.primitives.SpecifiedLengthImplicit
+import org.apache.daffodil.runtime2.generators.BinaryBooleanCodeGenerator
 import org.apache.daffodil.runtime2.generators.BinaryFloatCodeGenerator
 import org.apache.daffodil.runtime2.generators.BinaryIntegerKnownLengthCodeGenerator
 import org.apache.daffodil.runtime2.generators.CodeGeneratorState
@@ -44,7 +46,8 @@ import org.apache.daffodil.util.Misc
 import scala.annotation.tailrec
 
 object Runtime2CodeGenerator
-  extends BinaryIntegerKnownLengthCodeGenerator
+  extends BinaryBooleanCodeGenerator
+    with BinaryIntegerKnownLengthCodeGenerator
     with BinaryFloatCodeGenerator
     with ElementParseAndUnspecifiedLengthCodeGenerator
     with OrderedSequenceCodeGenerator
@@ -58,12 +61,13 @@ object Runtime2CodeGenerator
       case g: ElementCombinator => Runtime2CodeGenerator.generateCode(g.subComb, state)
       case g: SpecifiedLengthImplicit => Runtime2CodeGenerator.generateCode(g.eGram, state)
       case g: ScalarOrderedSequenceChild => Runtime2CodeGenerator.generateCode(g.term.termContentBody, state)
-      case g: SeqComp => seqCompGenerateCode(g, state)
-      case g: OrderedSequence => orderedSequenceGenerateCode(g, state)
-      case g: ElementParseAndUnspecifiedLength => elementParseAndUnspecifiedLengthGenerateCode(g, state)
-      case g: BinaryIntegerKnownLength => binaryIntegerKnownLengthGenerateCode(g, state)
-      case g: BinaryFloat => binaryFloatGenerateCode(g.e, 32, state)
+      case g: BinaryBoolean => binaryBooleanGenerateCode(g.e, state)
       case g: BinaryDouble => binaryFloatGenerateCode(g.e, 64, state)
+      case g: BinaryFloat => binaryFloatGenerateCode(g.e, 32, state)
+      case g: BinaryIntegerKnownLength => binaryIntegerKnownLengthGenerateCode(g, state)
+      case g: ElementParseAndUnspecifiedLength => elementParseAndUnspecifiedLengthGenerateCode(g, state)
+      case g: OrderedSequence => orderedSequenceGenerateCode(g, state)
+      case g: SeqComp => seqCompGenerateCode(g, state)
       case _: CaptureContentLengthStart => noop
       case _: CaptureContentLengthEnd => noop
       case _: CaptureValueLengthStart => noop
diff --git a/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/BinaryIntegerKnownLengthCodeGenerator.scala b/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/BinaryBooleanCodeGenerator.scala
similarity index 51%
copy from daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/BinaryIntegerKnownLengthCodeGenerator.scala
copy to daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/BinaryBooleanCodeGenerator.scala
index c3ac488..e5a7d3a 100644
--- a/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/BinaryIntegerKnownLengthCodeGenerator.scala
+++ b/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/BinaryBooleanCodeGenerator.scala
@@ -17,52 +17,62 @@
 
 package org.apache.daffodil.runtime2.generators
 
-import org.apache.daffodil.grammar.primitives.BinaryIntegerKnownLength
+import org.apache.daffodil.dsom.ElementBase
+import org.apache.daffodil.exceptions.Assert
+import org.apache.daffodil.schema.annotation.props.gen.BitOrder
+import org.apache.daffodil.schema.annotation.props.gen.ByteOrder
 import org.apache.daffodil.schema.annotation.props.gen.OccursCountKind
-import org.apache.daffodil.schema.annotation.props.gen.{ BitOrder, ByteOrder }
+import passera.unsigned.ULong
 
-trait BinaryIntegerKnownLengthCodeGenerator {
+trait BinaryBooleanCodeGenerator {
 
-  def binaryIntegerKnownLengthGenerateCode(g: BinaryIntegerKnownLength, cgState: CodeGeneratorState): Unit = {
+  def binaryBooleanGenerateCode(e: ElementBase, cgState: CodeGeneratorState): Unit = {
     // For the time being this is a very limited back end.
     // So there are some restrictions to enforce.
-    val e = g.e
-    val lengthInBits: Long = {
-      e.schemaDefinitionUnless(e.elementLengthInBitsEv.isConstant, "Runtime dfdl:length expressions not supported.")
-      val len = e.elementLengthInBitsEv.constValue.get
-      len
-    }
     e.schemaDefinitionUnless(e.bitOrder eq BitOrder.MostSignificantBitFirst, "Only dfdl:bitOrder 'mostSignificantBitFirst' is supported.")
     val byteOrder: ByteOrder = {
       e.schemaDefinitionUnless(e.byteOrderEv.isConstant, "Runtime dfdl:byteOrder expressions not supported.")
-      val bo = e.byteOrderEv.constValue
-      bo
+      e.byteOrderEv.constValue
     }
-
-    // Use an unusual memory bit pattern (magic debug value) to mark our field
-    // as uninitialized in case parsing or unparsing fails to set the field.
-    val initialValue = lengthInBits match {
-      case 8 => "0xCC"
-      case 16 => "0xCCCC"
-      case 32 => "0xCCCCCCCC"
-      case 64 => "0xCCCCCCCCCCCCCCCC"
-      case _ => e.SDE("Lengths other than 8, 16, 32, or 64 bits are not supported.")
+    val lengthInBits: Long = {
+      e.schemaDefinitionUnless(e.elementLengthInBitsEv.isConstant, "Runtime dfdl:length expressions not supported.")
+      val len = e.elementLengthInBitsEv.constValue.get
+      len match {
+        case 8 | 16 | 32 => len
+        case _ => e.SDE("Boolean lengths other than 8, 16, or 32 bits are not supported.")
+      }
     }
+    Assert.invariant(e.binaryBooleanTrueRep.isEmpty || e.binaryBooleanTrueRep.getULong >= ULong(0))
+    Assert.invariant(e.binaryBooleanFalseRep >= ULong(0))
+
+    val initialValue = "true"
     val fieldName = e.namedQName.local
-    val integer = if (g.signed) s"int${lengthInBits}" else s"uint${lengthInBits}"
     val conv = if (byteOrder eq ByteOrder.BigEndian) "be" else "le"
+    val prim = s"bool$lengthInBits"
+    val trueRep = if (e.binaryBooleanTrueRep.isDefined) e.binaryBooleanTrueRep.getULong else -1
+    val falseRep = e.binaryBooleanFalseRep
+    val unparseTrueRep = if (e.binaryBooleanTrueRep.isDefined) s"$trueRep" else s"~$falseRep"
     val arraySize = if (e.occursCountKind == OccursCountKind.Fixed) e.maxOccurs else 0
+    val fixed = e.xml.attribute("fixed")
+    val fixedValue = if (fixed.isDefined) fixed.get.text else ""
 
-    def addSimpleTypeStatements(deref: String): Unit = {
+    def addStatements(deref: String): Unit = {
       val initStatement = s"    instance->$fieldName$deref = $initialValue;"
-      val parseStatement = s"    parse_${conv}_$integer(&instance->$fieldName$deref, pstate);"
-      val unparseStatement = s"    unparse_${conv}_$integer(instance->$fieldName$deref, ustate);"
+      val parseStatement = s"    parse_${conv}_$prim(&instance->$fieldName$deref, $trueRep, $falseRep, pstate);"
+      val unparseStatement = s"    unparse_${conv}_$prim(instance->$fieldName$deref, $unparseTrueRep, $falseRep, ustate);"
       cgState.addSimpleTypeStatements(initStatement, parseStatement, unparseStatement)
+
+      if (fixedValue.nonEmpty) {
+        val init2 = ""
+        val parse2 = s"""    parse_validate_fixed(instance->$fieldName$deref == $fixedValue, "$fieldName", pstate);"""
+        val unparse2 = s"""    unparse_validate_fixed(instance->$fieldName$deref == $fixedValue, "$fieldName", ustate);"""
+        cgState.addSimpleTypeStatements(init2, parse2, unparse2)
+      }
     }
     if (arraySize > 0)
       for (i <- 0 until arraySize)
-        addSimpleTypeStatements(s"[$i]")
+        addStatements(s"[$i]")
     else
-      addSimpleTypeStatements("")
+      addStatements("")
   }
 }
diff --git a/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/BinaryFloatCodeGenerator.scala b/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/BinaryFloatCodeGenerator.scala
index 2567ae0..332ba66 100644
--- a/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/BinaryFloatCodeGenerator.scala
+++ b/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/BinaryFloatCodeGenerator.scala
@@ -35,21 +35,31 @@ trait BinaryFloatCodeGenerator {
 
     // Use a NAN to mark our field as uninitialized in case parsing or unparsing
     // fails to set the field.
+    val initialValue = "NAN"
     val fieldName = e.namedQName.local
-    val float = if (lengthInBits == 32) "float" else "double"
     val conv = if (byteOrder eq ByteOrder.BigEndian) "be" else "le"
+    val prim = if (lengthInBits == 32) "float" else "double"
     val arraySize = if (e.occursCountKind == OccursCountKind.Fixed) e.maxOccurs else 0
+    val fixed = e.xml.attribute("fixed")
+    val fixedValue = if (fixed.isDefined) fixed.get.text else ""
 
-    def addSimpleTypeStatements(deref: String): Unit = {
-      val initStatement = s"    instance->$fieldName$deref = NAN;"
-      val parseStatement = s"    parse_${conv}_$float(&instance->$fieldName$deref, pstate);"
-      val unparseStatement = s"    unparse_${conv}_$float(instance->$fieldName$deref, ustate);"
+    def addStatements(deref: String): Unit = {
+      val initStatement = s"    instance->$fieldName$deref = $initialValue;"
+      val parseStatement = s"    parse_${conv}_$prim(&instance->$fieldName$deref, pstate);"
+      val unparseStatement = s"    unparse_${conv}_$prim(instance->$fieldName$deref, ustate);"
       cgState.addSimpleTypeStatements(initStatement, parseStatement, unparseStatement)
+
+      if (fixedValue.nonEmpty) {
+        val init2 = ""
+        val parse2 = s"""    parse_validate_fixed(instance->$fieldName$deref == $fixedValue, "$fieldName", pstate);"""
+        val unparse2 = s"""    unparse_validate_fixed(instance->$fieldName$deref == $fixedValue, "$fieldName", ustate);"""
+        cgState.addSimpleTypeStatements(init2, parse2, unparse2)
+      }
     }
     if (arraySize > 0)
       for (i <- 0 until arraySize)
-        addSimpleTypeStatements(s"[$i]")
+        addStatements(s"[$i]")
     else
-      addSimpleTypeStatements("")
+      addStatements("")
   }
 }
diff --git a/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/BinaryIntegerKnownLengthCodeGenerator.scala b/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/BinaryIntegerKnownLengthCodeGenerator.scala
index c3ac488..9761b3b 100644
--- a/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/BinaryIntegerKnownLengthCodeGenerator.scala
+++ b/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/BinaryIntegerKnownLengthCodeGenerator.scala
@@ -46,23 +46,32 @@ trait BinaryIntegerKnownLengthCodeGenerator {
       case 16 => "0xCCCC"
       case 32 => "0xCCCCCCCC"
       case 64 => "0xCCCCCCCCCCCCCCCC"
-      case _ => e.SDE("Lengths other than 8, 16, 32, or 64 bits are not supported.")
+      case _ => e.SDE("Integer lengths other than 8, 16, 32, or 64 bits are not supported.")
     }
     val fieldName = e.namedQName.local
-    val integer = if (g.signed) s"int${lengthInBits}" else s"uint${lengthInBits}"
     val conv = if (byteOrder eq ByteOrder.BigEndian) "be" else "le"
+    val prim = if (g.signed) s"int${lengthInBits}" else s"uint${lengthInBits}"
     val arraySize = if (e.occursCountKind == OccursCountKind.Fixed) e.maxOccurs else 0
+    val fixed = e.xml.attribute("fixed")
+    val fixedValue = if (fixed.isDefined) fixed.get.text else ""
 
-    def addSimpleTypeStatements(deref: String): Unit = {
+    def addStatements(deref: String): Unit = {
       val initStatement = s"    instance->$fieldName$deref = $initialValue;"
-      val parseStatement = s"    parse_${conv}_$integer(&instance->$fieldName$deref, pstate);"
-      val unparseStatement = s"    unparse_${conv}_$integer(instance->$fieldName$deref, ustate);"
+      val parseStatement = s"    parse_${conv}_$prim(&instance->$fieldName$deref, pstate);"
+      val unparseStatement = s"    unparse_${conv}_$prim(instance->$fieldName$deref, ustate);"
       cgState.addSimpleTypeStatements(initStatement, parseStatement, unparseStatement)
+
+      if (fixedValue.nonEmpty) {
+        val init2 = ""
+        val parse2 = s"""    parse_validate_fixed(instance->$fieldName$deref == $fixedValue, "$fieldName", pstate);"""
+        val unparse2 = s"""    unparse_validate_fixed(instance->$fieldName$deref == $fixedValue, "$fieldName", ustate);"""
+        cgState.addSimpleTypeStatements(init2, parse2, unparse2)
+      }
     }
     if (arraySize > 0)
       for (i <- 0 until arraySize)
-        addSimpleTypeStatements(s"[$i]")
+        addStatements(s"[$i]")
     else
-      addSimpleTypeStatements("")
+      addStatements("")
   }
 }
diff --git a/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/CodeGeneratorState.scala b/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/CodeGeneratorState.scala
index 5142db7..0fd7922 100644
--- a/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/CodeGeneratorState.scala
+++ b/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/CodeGeneratorState.scala
@@ -17,8 +17,8 @@
 
 package org.apache.daffodil.runtime2.generators
 
+import org.apache.daffodil.api.WarnID
 import org.apache.daffodil.cookers.ChoiceBranchKeyCooker
-import org.apache.daffodil.dpath.NodeInfo
 import org.apache.daffodil.dpath.NodeInfo.PrimType
 import org.apache.daffodil.dsom.AbstractElementRef
 import org.apache.daffodil.dsom.Choice
@@ -67,8 +67,21 @@ class CodeGeneratorState {
     val C = localName(context)
     val initStatements = structs.top.initStatements.mkString("\n")
     val initChoiceStatements = structs.top.initChoiceStatements.mkString("\n")
-    val parserStatements = structs.top.parserStatements.mkString("\n")
-    val unparserStatements = structs.top.unparserStatements.mkString("\n")
+    val hasStatements = structs.top.parserStatements.nonEmpty
+    val parserStatements = if (hasStatements)
+      structs.top.parserStatements.mkString("\n")
+    else
+      s"""    // Empty struct, but need to prevent compiler warnings
+         |    UNUSED(${C}_compute_offsets);
+         |    UNUSED(instance);
+         |    UNUSED(pstate);""".stripMargin
+    val unparserStatements = if (hasStatements)
+      structs.top.unparserStatements.mkString("\n")
+    else
+      s"""    // Empty struct, but need to prevent compiler warnings
+         |    UNUSED(${C}_compute_offsets);
+         |    UNUSED(instance);
+         |    UNUSED(ustate);""".stripMargin
     val hasChoice = structs.top.initChoiceStatements.nonEmpty
     val root = structs.elems.last.C
     val prototypeInitChoice = if (hasChoice)
@@ -171,12 +184,24 @@ class CodeGeneratorState {
     res
   }
 
+  // We know context is a complex type.  We need to 1) support choice groups; 2) support
+  // padding complex elements to explicit lengths with fill bytes
   def addBeforeSwitchStatements(context: ElementBase): Unit = {
     val erd = erdName(context)
     val initStatement = s"    instance->_base.erd = &$erd;"
 
     structs.top.initStatements += initStatement
 
+    // Implement padding if complex type has an explicit length
+    if (context.maybeFixedLengthInBits.isDefined && context.maybeFixedLengthInBits.get > 0) {
+      val lengthInBytes = context.maybeFixedLengthInBits.get / 8;
+      val parseStatement = s"    const size_t end_position = pstate->position + $lengthInBytes;"
+      val unparseStatement = s"    const size_t end_position = ustate->position + $lengthInBytes;"
+
+      structs.top.parserStatements += parseStatement
+      structs.top.unparserStatements += unparseStatement
+    }
+
     val dispatchField = choiceDispatchField(context)
     if (dispatchField.nonEmpty) {
       val C = localName(context)
@@ -222,7 +247,9 @@ class CodeGeneratorState {
     }
   }
 
-  def addAfterSwitchStatements(): Unit = {
+  // We know context is a complex type.  We need to 1) support choice groups; 2) support
+  // padding complex elements to explicit lengths with fill bytes
+  def addAfterSwitchStatements(context: ElementBase): Unit = {
     if (structs.top.initChoiceStatements.nonEmpty) {
       val declaration = s"    };"
       val initChoiceStatement =
@@ -262,6 +289,16 @@ class CodeGeneratorState {
       structs.top.parserStatements += parseStatement
       structs.top.unparserStatements += unparseStatement
     }
+
+    // Implement padding if complex type has an explicit length
+    if (context.maybeFixedLengthInBits.isDefined && context.maybeFixedLengthInBits.get > 0) {
+      val octalFillByte = context.fillByteEv.constValue.toByte.toOctalString
+      val parseStatement = s"    parse_fill_bytes(end_position, pstate);"
+      val unparseStatement = s"    unparse_fill_bytes(end_position, '\\$octalFillByte', ustate);"
+
+      structs.top.parserStatements += parseStatement
+      structs.top.unparserStatements += unparseStatement
+    }
   }
 
   def addComplexTypeERD(context: ElementBase): Unit = {
@@ -316,41 +353,55 @@ class CodeGeneratorState {
   }
 
   def addSimpleTypeStatements(initStatement: String, parseStatement: String, unparseStatement: String): Unit = {
-    structs.top.initStatements += initStatement
-    structs.top.parserStatements += parseStatement
-    structs.top.unparserStatements += unparseStatement
+    if (initStatement.nonEmpty) structs.top.initStatements += initStatement
+    if (parseStatement.nonEmpty) structs.top.parserStatements += parseStatement
+    if (unparseStatement.nonEmpty) structs.top.unparserStatements += unparseStatement
   }
 
   def addComplexTypeStatements(child: ElementBase): Unit = {
     val C = localName(child)
     val e = child.name
     val hasChoice = structs.top.initChoiceStatements.nonEmpty
-    val offset = if (hasChoice) child.position - 1 else -1
-    val initStatement = s"    ${C}_initSelf(&instance->$e);"
-    val initChoiceStatement =
-      s"""        instance->_choice = $offset;
-         |        break;""".stripMargin
-    val parseStatement = if (hasChoice)
-      s"""    case $offset:
-         |        ${C}_parseSelf(&instance->$e, pstate);
-         |        break;""".stripMargin
-    else
-      s"    ${C}_parseSelf(&instance->$e, pstate);"
-    val unparseStatement = if (hasChoice)
-      s"""    case $offset:
-         |        ${C}_unparseSelf(&instance->$e, ustate);
-         |        break;""".stripMargin
-    else
-      s"    ${C}_unparseSelf(&instance->$e, ustate);"
+    val arraySize = if (child.occursCountKind == OccursCountKind.Fixed) child.maxOccurs else 0
 
-    structs.top.initStatements += initStatement
     if (hasChoice) {
+      val offset = child.position - 1
+      val initChoiceStatement =
+        s"""        instance->_choice = $offset;
+           |        break;""".stripMargin
+      val parseStatement = s"    case $offset:"
+      val unparseStatement = s"    case $offset:"
+
       structs.top.initChoiceStatements ++= ChoiceBranchKeyCooker.convertConstant(
         child.choiceBranchKey, child, forUnparse = false).map { key => s"    case $key:"}
       structs.top.initChoiceStatements += initChoiceStatement
+      structs.top.parserStatements += parseStatement
+      structs.top.unparserStatements += unparseStatement
+    }
+
+    def addStatements(deref: String): Unit = {
+      val moreIndent = if (hasChoice) "    " else ""
+      val initStatement = s"    ${C}_initSelf(&instance->$e$deref);"
+      val parseStatement = s"    $moreIndent${C}_parseSelf(&instance->$e$deref, pstate);"
+      val unparseStatement = s"    $moreIndent${C}_unparseSelf(&instance->$e$deref, ustate);"
+
+      structs.top.initStatements += initStatement
+      structs.top.parserStatements += parseStatement
+      structs.top.unparserStatements += unparseStatement
+    }
+    if (arraySize > 0)
+      for (i <- 0 until arraySize)
+        addStatements(s"[$i]")
+    else
+      addStatements("")
+
+    if (hasChoice) {
+      val parseStatement = s"        break;"
+      val unparseStatement = s"        break;"
+
+      structs.top.parserStatements += parseStatement
+      structs.top.unparserStatements += unparseStatement
     }
-    structs.top.parserStatements += parseStatement
-    structs.top.unparserStatements += unparseStatement
   }
 
   def pushComplexElement(context: ElementBase): Unit = {
@@ -362,21 +413,74 @@ class CodeGeneratorState {
     structs.pop()
   }
 
+  // Gets length from explicit length declaration if any, otherwise from base type's implicit length
+  private def getLengthInBits(e: ElementBase): Long = {
+    e.schemaDefinitionUnless(e.elementLengthInBitsEv.isConstant, "Runtime dfdl:length expressions are not supported.")
+    e.elementLengthInBitsEv.constValue.get
+  }
+
+  // Because schema authors don't always get types right, allows explicit lengths to override implicit lengths
+  private def getPrimType(e: ElementBase): PrimType = {
+    val primType = e.optPrimType.get match {
+      case PrimType.Byte
+         | PrimType.Short
+         | PrimType.Int
+         | PrimType.Long
+         | PrimType.Integer =>
+        getLengthInBits(e) match {
+          case 8 =>  PrimType.Byte
+          case 16 => PrimType.Short
+          case 32 => PrimType.Int
+          case 64 => PrimType.Long
+          case _ =>  e.SDE("Integer lengths other than 8, 16, 32, or 64 bits are not supported.")
+        }
+      case PrimType.UnsignedByte
+         | PrimType.UnsignedShort
+         | PrimType.UnsignedInt
+         | PrimType.UnsignedLong
+         | PrimType.NonNegativeInteger =>
+        getLengthInBits(e) match {
+          case 8 =>  PrimType.UnsignedByte
+          case 16 => PrimType.UnsignedShort
+          case 32 => PrimType.UnsignedInt
+          case 64 => PrimType.UnsignedLong
+          case _ =>  e.SDE("Unsigned integer lengths other than 8, 16, 32, or 64 bits are not supported.")
+        }
+      case PrimType.Double
+         | PrimType.Float =>
+        getLengthInBits(e) match {
+          case 32 => PrimType.Float
+          case 64 => PrimType.Double
+          case _ =>  e.SDE("Floating point lengths other than 32 or 64 bits are not supported.")
+        }
+      case PrimType.Boolean =>
+        getLengthInBits(e) match {
+          case 8 | 16 | 32 => PrimType.Boolean
+          case _ => e.SDE("Boolean lengths other than 8, 16, or 32 bits are not supported.")
+        }
+      case p => e.SDE("PrimType %s is not supported in C code generator.", p.toString)
+    }
+    if (primType != e.optPrimType.get)
+      e.SDW(WarnID.IgnoreDFDLProperty, "Ignoring PrimType %s, using %s", e.optPrimType.get.toString, primType.toString)
+    primType
+  }
+
   def addSimpleTypeERD(context: ElementBase): Unit = {
     val erd = erdName(context)
     val qnameInit = defineQNameInit(context)
-    val typeCode = context.optPrimType.get match {
-      case PrimType.UnsignedLong => "PRIMITIVE_UINT64"
-      case PrimType.UnsignedInt => "PRIMITIVE_UINT32"
-      case PrimType.UnsignedShort => "PRIMITIVE_UINT16"
-      case PrimType.UnsignedByte => "PRIMITIVE_UINT8"
-      case PrimType.Long => "PRIMITIVE_INT64"
-      case PrimType.Int => "PRIMITIVE_INT32"
+    val typeCode = getPrimType(context) match {
+      case PrimType.Boolean => "PRIMITIVE_BOOLEAN"
+      case PrimType.Double => "PRIMITIVE_DOUBLE"
+      case PrimType.Float => "PRIMITIVE_FLOAT"
       case PrimType.Short => "PRIMITIVE_INT16"
+      case PrimType.Int => "PRIMITIVE_INT32"
+      case PrimType.Long => "PRIMITIVE_INT64"
       case PrimType.Byte => "PRIMITIVE_INT8"
-      case PrimType.Float => "PRIMITIVE_FLOAT"
-      case PrimType.Double => "PRIMITIVE_DOUBLE"
-      case p: PrimType => context.SDE("PrimType %s not supported yet.", p.toString)
+      case PrimType.UnsignedShort => "PRIMITIVE_UINT16"
+      case PrimType.UnsignedInt => "PRIMITIVE_UINT32"
+      case PrimType.UnsignedLong => "PRIMITIVE_UINT64"
+      case PrimType.UnsignedByte => "PRIMITIVE_UINT8"
+      case p => context.SDE("PrimType %s is not supported.", p.toString)
     }
     val erdDef =
       s"""static const ERD $erd = {
@@ -409,19 +513,19 @@ class CodeGeneratorState {
 
   def addFieldDeclaration(context: ThrowsSDE, child: ElementBase): Unit = {
     val definition = if (child.isSimpleType) {
-      import NodeInfo.PrimType
-      child.optPrimType.get match {
-        case PrimType.UnsignedLong => "uint64_t   "
-        case PrimType.UnsignedInt => "uint32_t   "
-        case PrimType.UnsignedShort => "uint16_t   "
-        case PrimType.UnsignedByte => "uint8_t    "
-        case PrimType.Long => "int64_t    "
-        case PrimType.Int => "int32_t    "
+      getPrimType(child) match {
+        case PrimType.Boolean => "bool       "
+        case PrimType.Double => "double     "
+        case PrimType.Float => "float      "
         case PrimType.Short => "int16_t    "
+        case PrimType.Int => "int32_t    "
+        case PrimType.Long => "int64_t    "
         case PrimType.Byte => "int8_t     "
-        case PrimType.Float => "float      "
-        case PrimType.Double => "double     "
-        case x => context.SDE("Unsupported primitive type: " + x)
+        case PrimType.UnsignedShort => "uint16_t   "
+        case PrimType.UnsignedInt => "uint32_t   "
+        case PrimType.UnsignedLong => "uint64_t   "
+        case PrimType.UnsignedByte => "uint8_t    "
+        case p => child.SDE("PrimType %s is not supported: ", p.toString)
       }
     } else {
       localName(child)
@@ -441,6 +545,7 @@ class CodeGeneratorState {
          |#define GENERATED_CODE_H
          |
          |#include "infoset.h"  // for InfosetBase
+         |#include <stdbool.h>  // for bool
          |#include <stdint.h>   // for int16_t, int32_t, int64_t, int8_t, uint16_t, uint32_t, uint64_t, uint8_t
 
          |// Define infoset structures
diff --git a/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/ElementParseAndUnspecifiedLengthCodeGenerator.scala b/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/ElementParseAndUnspecifiedLengthCodeGenerator.scala
index 26203f8..553d2c7 100644
--- a/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/ElementParseAndUnspecifiedLengthCodeGenerator.scala
+++ b/daffodil-runtime2/src/main/scala/org/apache/daffodil/runtime2/generators/ElementParseAndUnspecifiedLengthCodeGenerator.scala
@@ -49,7 +49,7 @@ trait ElementParseAndUnspecifiedLengthCodeGenerator {
         cgState.addFieldDeclaration(context, child) // struct member for child
         Runtime2CodeGenerator.generateCode(child.enclosedElement, cgState) // generate children too
       }
-      cgState.addAfterSwitchStatements() // switch statements for choices
+      cgState.addAfterSwitchStatements(context) // switch statements for choices
       cgState.addStruct(context) // struct definition
       cgState.addImplementation(context) // initSelf, parseSelf, unparseSelf
       cgState.addComplexTypeERD(context) // ERD static initializer
diff --git a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.dfdl.xsd b/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.dfdl.xsd
index 06355f0..af0aa43 100644
--- a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.dfdl.xsd
+++ b/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.dfdl.xsd
@@ -17,21 +17,24 @@
 -->
 
 <xs:schema
-    elementFormDefault="qualified"
-    targetNamespace="http://example.com"
-    xmlns="http://example.com"
-    xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"
-    xmlns:xs="http://www.w3.org/2001/XMLSchema">
+        elementFormDefault="qualified"
+        targetNamespace="http://example.com"
+        xmlns="http://example.com"
+        xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"
+        xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
     <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
 
     <xs:annotation>
         <xs:appinfo source="http://www.ogf.org/dfdl/">
             <dfdl:format
-                byteOrder="bigEndian"
-                encoding="UTF-8"
-                representation="binary"
-                ref="GeneralFormat"/>
+                    binaryBooleanFalseRep="0"
+                    binaryBooleanTrueRep=""
+                    byteOrder="bigEndian"
+                    encoding="UTF-8"
+                    lengthUnits="bits"
+                    representation="binary"
+                    ref="GeneralFormat"/>
         </xs:appinfo>
     </xs:annotation>
 
@@ -41,44 +44,115 @@
                 <xs:element name="array">
                     <xs:complexType>
                         <xs:sequence>
-                            <xs:element name="be_int16" type="xs:short"
-                                        minOccurs="3" maxOccurs="3" dfdl:occursCountKind="fixed" />
+                            <xs:element name="be_bool16" type="xs:boolean"
+                                        dfdl:length="16"
+                                        dfdl:lengthKind="explicit"
+                                        dfdl:occursCountKind="fixed"
+                                        maxOccurs="2" minOccurs="2"/>
                             <xs:element name="be_float" type="xs:float"
-                                        minOccurs="3" maxOccurs="3" dfdl:occursCountKind="fixed" />
+                                        dfdl:occursCountKind="fixed"
+                                        minOccurs="3" maxOccurs="3"/>
+                            <xs:element name="be_int16" type="xs:short"
+                                        dfdl:occursCountKind="fixed"
+                                        minOccurs="3" maxOccurs="3"/>
                         </xs:sequence>
                     </xs:complexType>
                 </xs:element>
                 <xs:element name="bigEndian">
-                  <xs:complexType>
-                    <xs:sequence>
-                      <xs:element name="be_double" type="xs:double" />
-                      <xs:element name="be_float" type="xs:float" />
-                      <xs:element name="be_uint64" type="xs:unsignedLong" />
-                      <xs:element name="be_uint32" type="xs:unsignedInt" />
-                      <xs:element name="be_uint16" type="xs:unsignedShort" />
-                      <xs:element name="be_uint8" type="xs:unsignedByte" />
-                      <xs:element name="be_int64" type="xs:long" />
-                      <xs:element name="be_int32" type="xs:int" />
-                      <xs:element name="be_int16" type="xs:short" />
-                      <xs:element name="be_int8" type="xs:byte" />
-                    </xs:sequence>
-                  </xs:complexType>
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="be_bool16" type="xs:boolean"
+                                        dfdl:binaryBooleanTrueRep="1"
+                                        dfdl:length="16"
+                                        dfdl:lengthKind="explicit"/>
+                            <xs:element name="be_bool32" type="xs:boolean"
+                                        dfdl:length="32"
+                                        dfdl:lengthKind="explicit"/>
+                            <xs:element name="be_bool8" type="xs:boolean"
+                                        dfdl:length="8"
+                                        dfdl:lengthKind="explicit"/>
+                            <xs:element name="be_boolean" type="xs:boolean"/>
+                            <xs:element name="be_double" type="xs:double"/>
+                            <xs:element name="be_float" type="xs:float"/>
+                            <xs:element name="be_int16" type="xs:short"/>
+                            <xs:element name="be_int32" type="xs:int"/>
+                            <xs:element name="be_int64" type="xs:long"/>
+                            <xs:element name="be_int8" type="xs:byte"/>
+                            <xs:element name="be_integer16" type="xs:integer"
+                                        dfdl:length="16"
+                                        dfdl:lengthKind="explicit"/>
+                            <xs:element name="be_uint16" type="xs:unsignedShort"/>
+                            <xs:element name="be_uint32" type="xs:unsignedInt"/>
+                            <xs:element name="be_uint64" type="xs:unsignedLong"/>
+                            <xs:element name="be_uint8" type="xs:unsignedByte"/>
+                            <xs:element name="be_nonNegativeInteger32" type="xs:nonNegativeInteger"
+                                        dfdl:length="32"
+                                        dfdl:lengthKind="explicit"/>
+                        </xs:sequence>
+                    </xs:complexType>
                 </xs:element>
                 <xs:element name="littleEndian">
-                  <xs:complexType>
-                    <xs:sequence>
-                      <xs:element name="le_uint64" type="xs:unsignedLong" dfdl:byteOrder="littleEndian" />
-                      <xs:element name="le_uint32" type="xs:unsignedInt" dfdl:byteOrder="littleEndian" />
-                      <xs:element name="le_uint16" type="xs:unsignedShort" dfdl:byteOrder="littleEndian" />
-                      <xs:element name="le_uint8" type="xs:unsignedByte" dfdl:byteOrder="littleEndian" />
-                      <xs:element name="le_int64" type="xs:long" dfdl:byteOrder="littleEndian" />
-                      <xs:element name="le_int32" type="xs:int" dfdl:byteOrder="littleEndian" />
-                      <xs:element name="le_int16" type="xs:short" dfdl:byteOrder="littleEndian" />
-                      <xs:element name="le_int8" type="xs:byte" dfdl:byteOrder="littleEndian" />
-                      <xs:element name="le_float" type="xs:float" dfdl:byteOrder="littleEndian" />
-                      <xs:element name="le_double" type="xs:double" dfdl:byteOrder="littleEndian" />
-                    </xs:sequence>
-                  </xs:complexType>
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="le_bool16" type="xs:boolean"
+                                        dfdl:binaryBooleanTrueRep="1"
+                                        dfdl:byteOrder="littleEndian"
+                                        dfdl:length="16"
+                                        dfdl:lengthKind="explicit"/>
+                            <xs:element name="le_bool32" type="xs:boolean"
+                                        dfdl:byteOrder="littleEndian"
+                                        dfdl:length="32"
+                                        dfdl:lengthKind="explicit"/>
+                            <xs:element name="le_bool8" type="xs:boolean"
+                                        dfdl:byteOrder="littleEndian"
+                                        dfdl:length="8"
+                                        dfdl:lengthKind="explicit"/>
+                            <xs:element name="le_boolean" type="xs:boolean"
+                                        dfdl:byteOrder="littleEndian"/>
+                            <xs:element name="le_double" type="xs:double"
+                                        dfdl:byteOrder="littleEndian"/>
+                            <xs:element name="le_float" type="xs:float"
+                                        dfdl:byteOrder="littleEndian"/>
+                            <xs:element name="le_int16" type="xs:short"
+                                        dfdl:byteOrder="littleEndian"/>
+                            <xs:element name="le_int32" type="xs:int"
+                                        dfdl:byteOrder="littleEndian"/>
+                            <xs:element name="le_int64" type="xs:long"
+                                        dfdl:byteOrder="littleEndian"/>
+                            <xs:element name="le_int8" type="xs:byte"
+                                        dfdl:byteOrder="littleEndian"/>
+                            <xs:element name="le_integer64" type="xs:integer"
+                                        dfdl:byteOrder="littleEndian"
+                                        dfdl:length="64"
+                                        dfdl:lengthKind="explicit"/>
+                            <xs:element name="le_uint16" type="xs:unsignedShort"
+                                        dfdl:byteOrder="littleEndian"/>
+                            <xs:element name="le_uint32" type="xs:unsignedInt"
+                                        dfdl:byteOrder="littleEndian"/>
+                            <xs:element name="le_uint64" type="xs:unsignedLong"
+                                        dfdl:byteOrder="littleEndian"/>
+                            <xs:element name="le_uint8" type="xs:unsignedByte"
+                                        dfdl:byteOrder="littleEndian"/>
+                            <xs:element name="le_nonNegativeInteger8" type="xs:nonNegativeInteger"
+                                        dfdl:byteOrder="littleEndian"
+                                        dfdl:length="8"
+                                        dfdl:lengthKind="explicit"/>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+                <xs:element name="fixed">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="boolean_false" type="xs:boolean"
+                                        fixed="false"/>
+                            <xs:element name="boolean_true" type="xs:boolean"
+                                        fixed="true"/>
+                            <xs:element name="float_1_5" type="xs:float"
+                                        fixed="1.5"/>
+                            <xs:element name="int_32" type="xs:int"
+                                        fixed="32"/>
+                        </xs:sequence>
+                    </xs:complexType>
                 </xs:element>
             </xs:sequence>
         </xs:complexType>
diff --git a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml b/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml
index 3d12954..812c327 100644
--- a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml
+++ b/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml
@@ -84,4 +84,19 @@
     </tdml:document>
   </tdml:unparserTestCase>
 
+  <tdml:unparserTestCase
+    name="ex_nums_unparse_errors"
+    model="ex_nums.dfdl.xsd"
+    config="config-runtime2">
+    <tdml:infoset>
+      <tdml:dfdlInfoset type="file">ex_nums_unparse_errors.xml</tdml:dfdlInfoset>
+    </tdml:infoset>
+    <tdml:errors>
+      <tdml:error>value</tdml:error>
+      <tdml:error>does not match</tdml:error>
+      <tdml:error>fixed</tdml:error>
+      <tdml:error>attribute</tdml:error>
+    </tdml:errors>
+  </tdml:unparserTestCase>
+
 </tdml:testSuite>
diff --git a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_parse.dat b/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_parse.dat
index 7df03f3..d3285c0 100644
Binary files a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_parse.dat and b/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_parse.dat differ
diff --git a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_unparse_runtime1.xml b/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_unparse_errors.xml
similarity index 72%
copy from daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_unparse_runtime1.xml
copy to daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_unparse_errors.xml
index d30a688..deb8839 100644
--- a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_unparse_runtime1.xml
+++ b/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_unparse_errors.xml
@@ -18,35 +18,55 @@
 
 <ex_nums xmlns="http://example.com">
   <array>
-    <be_int16>1</be_int16>
-    <be_int16>2</be_int16>
-    <be_int16>3</be_int16>
+    <be_bool16>false</be_bool16>
+    <be_bool16>true</be_bool16>
     <be_float>1.0</be_float>
     <be_float>INF</be_float>
     <be_float>NaN</be_float>
+    <be_int16>1</be_int16>
+    <be_int16>2</be_int16>
+    <be_int16>3</be_int16>
   </array>
   <bigEndian>
+    <be_bool16>true</be_bool16>
+    <be_bool32>true</be_bool32>
+    <be_bool8>false</be_bool8>
+    <be_boolean>false</be_boolean>
     <be_double>1.7976931348623157E308</be_double>
     <be_float>3.4028235E38</be_float>
-    <be_uint64>64</be_uint64>
-    <be_uint32>32</be_uint32>
-    <be_uint16>16</be_uint16>
-    <be_uint8>8</be_uint8>
-    <be_int64>-64</be_int64>
-    <be_int32>-32</be_int32>
     <be_int16>-16</be_int16>
+    <be_int32>-32</be_int32>
+    <be_int64>-64</be_int64>
     <be_int8>-8</be_int8>
+    <be_integer16>-16</be_integer16>
+    <be_uint16>16</be_uint16>
+    <be_uint32>32</be_uint32>
+    <be_uint64>64</be_uint64>
+    <be_uint8>8</be_uint8>
+    <be_nonNegativeInteger32>32</be_nonNegativeInteger32>
   </bigEndian>
   <littleEndian>
-    <le_uint64>64</le_uint64>
-    <le_uint32>32</le_uint32>
-    <le_uint16>16</le_uint16>
-    <le_uint8>8</le_uint8>
-    <le_int64>-64</le_int64>
-    <le_int32>-32</le_int32>
+    <le_bool16>true</le_bool16>
+    <le_bool32>true</le_bool32>
+    <le_bool8>false</le_bool8>
+    <le_boolean>false</le_boolean>
+    <le_double>-2.2250738585072014E-308</le_double>
+    <le_float>-1.17549435E-38</le_float>
     <le_int16>-16</le_int16>
+    <le_int32>-32</le_int32>
+    <le_int64>-64</le_int64>
     <le_int8>-8</le_int8>
-    <le_float>-1.17549435E-38</le_float>
-    <le_double>-2.2250738585072014E-308</le_double>
+    <le_integer64>-64</le_integer64>
+    <le_uint16>16</le_uint16>
+    <le_uint32>32</le_uint32>
+    <le_uint64>64</le_uint64>
+    <le_uint8>8</le_uint8>
+    <le_nonNegativeInteger8>8</le_nonNegativeInteger8>
   </littleEndian>
+  <fixed>
+    <boolean_false>true</boolean_false>
+    <boolean_true>false</boolean_true>
+    <float_1_5>0.0</float_1_5>
+    <int_32>0</int_32>
+  </fixed>
 </ex_nums>
diff --git a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_unparse_runtime1.xml b/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_unparse_runtime1.xml
index d30a688..ae38f12 100644
--- a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_unparse_runtime1.xml
+++ b/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_unparse_runtime1.xml
@@ -18,35 +18,55 @@
 
 <ex_nums xmlns="http://example.com">
   <array>
-    <be_int16>1</be_int16>
-    <be_int16>2</be_int16>
-    <be_int16>3</be_int16>
+    <be_bool16>false</be_bool16>
+    <be_bool16>true</be_bool16>
     <be_float>1.0</be_float>
     <be_float>INF</be_float>
     <be_float>NaN</be_float>
+    <be_int16>1</be_int16>
+    <be_int16>2</be_int16>
+    <be_int16>3</be_int16>
   </array>
   <bigEndian>
+    <be_bool16>true</be_bool16>
+    <be_bool32>true</be_bool32>
+    <be_bool8>false</be_bool8>
+    <be_boolean>false</be_boolean>
     <be_double>1.7976931348623157E308</be_double>
     <be_float>3.4028235E38</be_float>
-    <be_uint64>64</be_uint64>
-    <be_uint32>32</be_uint32>
-    <be_uint16>16</be_uint16>
-    <be_uint8>8</be_uint8>
-    <be_int64>-64</be_int64>
-    <be_int32>-32</be_int32>
     <be_int16>-16</be_int16>
+    <be_int32>-32</be_int32>
+    <be_int64>-64</be_int64>
     <be_int8>-8</be_int8>
+    <be_integer16>-16</be_integer16>
+    <be_uint16>16</be_uint16>
+    <be_uint32>32</be_uint32>
+    <be_uint64>64</be_uint64>
+    <be_uint8>8</be_uint8>
+    <be_nonNegativeInteger32>32</be_nonNegativeInteger32>
   </bigEndian>
   <littleEndian>
-    <le_uint64>64</le_uint64>
-    <le_uint32>32</le_uint32>
-    <le_uint16>16</le_uint16>
-    <le_uint8>8</le_uint8>
-    <le_int64>-64</le_int64>
-    <le_int32>-32</le_int32>
+    <le_bool16>true</le_bool16>
+    <le_bool32>true</le_bool32>
+    <le_bool8>false</le_bool8>
+    <le_boolean>false</le_boolean>
+    <le_double>-2.2250738585072014E-308</le_double>
+    <le_float>-1.17549435E-38</le_float>
     <le_int16>-16</le_int16>
+    <le_int32>-32</le_int32>
+    <le_int64>-64</le_int64>
     <le_int8>-8</le_int8>
-    <le_float>-1.17549435E-38</le_float>
-    <le_double>-2.2250738585072014E-308</le_double>
+    <le_integer64>-64</le_integer64>
+    <le_uint16>16</le_uint16>
+    <le_uint32>32</le_uint32>
+    <le_uint64>64</le_uint64>
+    <le_uint8>8</le_uint8>
+    <le_nonNegativeInteger8>8</le_nonNegativeInteger8>
   </littleEndian>
+  <fixed>
+    <boolean_false>false</boolean_false>
+    <boolean_true>true</boolean_true>
+    <float_1_5>1.5</float_1_5>
+    <int_32>32</int_32>
+  </fixed>
 </ex_nums>
diff --git a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_unparse_runtime2.xml b/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_unparse_runtime2.xml
index f45a9fc..a656481 100644
--- a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_unparse_runtime2.xml
+++ b/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums_unparse_runtime2.xml
@@ -18,35 +18,55 @@
 
 <ex_nums xmlns="http://example.com">
   <array>
-    <be_int16>1</be_int16>
-    <be_int16>2</be_int16>
-    <be_int16>3</be_int16>
+    <be_bool16>false</be_bool16>
+    <be_bool16>true</be_bool16>
     <be_float>1</be_float>
     <be_float>INF</be_float>
     <be_float>NaN</be_float>
+    <be_int16>1</be_int16>
+    <be_int16>2</be_int16>
+    <be_int16>3</be_int16>
   </array>
   <bigEndian>
+    <be_bool16>true</be_bool16>
+    <be_bool32>true</be_bool32>
+    <be_bool8>false</be_bool8>
+    <be_boolean>false</be_boolean>
     <be_double>1.7976931348623157E+308</be_double>
     <be_float>3.40282347E+38</be_float>
-    <be_uint64>64</be_uint64>
-    <be_uint32>32</be_uint32>
-    <be_uint16>16</be_uint16>
-    <be_uint8>8</be_uint8>
-    <be_int64>-64</be_int64>
-    <be_int32>-32</be_int32>
     <be_int16>-16</be_int16>
+    <be_int32>-32</be_int32>
+    <be_int64>-64</be_int64>
     <be_int8>-8</be_int8>
+    <be_integer16>-16</be_integer16>
+    <be_uint16>16</be_uint16>
+    <be_uint32>32</be_uint32>
+    <be_uint64>64</be_uint64>
+    <be_uint8>8</be_uint8>
+    <be_nonNegativeInteger32>32</be_nonNegativeInteger32>
   </bigEndian>
   <littleEndian>
-    <le_uint64>64</le_uint64>
-    <le_uint32>32</le_uint32>
-    <le_uint16>16</le_uint16>
-    <le_uint8>8</le_uint8>
-    <le_int64>-64</le_int64>
-    <le_int32>-32</le_int32>
+    <le_bool16>true</le_bool16>
+    <le_bool32>true</le_bool32>
+    <le_bool8>false</le_bool8>
+    <le_boolean>false</le_boolean>
+    <le_double>-2.2250738585072014E-308</le_double>
+    <le_float>-1.17549435E-38</le_float>
     <le_int16>-16</le_int16>
+    <le_int32>-32</le_int32>
+    <le_int64>-64</le_int64>
     <le_int8>-8</le_int8>
-    <le_float>-1.17549435E-38</le_float>
-    <le_double>-2.2250738585072014E-308</le_double>
+    <le_integer64>-64</le_integer64>
+    <le_uint16>16</le_uint16>
+    <le_uint32>32</le_uint32>
+    <le_uint64>64</le_uint64>
+    <le_uint8>8</le_uint8>
+    <le_nonNegativeInteger8>8</le_nonNegativeInteger8>
   </littleEndian>
+  <fixed>
+    <boolean_false>false</boolean_false>
+    <boolean_true>true</boolean_true>
+    <float_1_5>1.5</float_1_5>
+    <int_32>32</int_32>
+  </fixed>
 </ex_nums>
diff --git a/daffodil-tdml-processor/src/main/scala/org/apache/daffodil/tdml/processor/Runtime2TDMLDFDLProcessor.scala b/daffodil-tdml-processor/src/main/scala/org/apache/daffodil/tdml/processor/Runtime2TDMLDFDLProcessor.scala
index f150580..5e84cd1 100644
--- a/daffodil-tdml-processor/src/main/scala/org/apache/daffodil/tdml/processor/Runtime2TDMLDFDLProcessor.scala
+++ b/daffodil-tdml-processor/src/main/scala/org/apache/daffodil/tdml/processor/Runtime2TDMLDFDLProcessor.scala
@@ -117,8 +117,12 @@ final class Runtime2TDMLDFDLProcessorFactory private(
       val compileResult = if (generator.isError) {
         Left(generator.getDiagnostics) // C code compilation diagnostics
       } else {
-        // Create a processor for running the test using the executable
-        val processor = new Runtime2TDMLDFDLProcessor(tempDir, executable)
+        // Create a processor for running the test using the executable, passing it
+        // generator.diagnostics in order to let us check generator warnings later
+        val processor = new Runtime2TDMLDFDLProcessor(tempDir, executable, generator.getDiagnostics)
+        // Sadly, TDMLRunner never checks generator diagnostics in "Right" tuple below
+        // nor does it check processor diagnostics in cross tests (runtime2's TDML tests)
+        // unless you set defaultShouldDoWarningComparisonOnCrossTests true in RunnerFactory
         Right((generator.getDiagnostics, processor))
       }
       compileResult
@@ -134,13 +138,13 @@ final class Runtime2TDMLDFDLProcessorFactory private(
  * TDML XML Infosets, feeding to the unparser, creating XML from the result created by
  * the Runtime2DataProcessor. All the "real work" is done by Runtime2DataProcessor.
  */
-class Runtime2TDMLDFDLProcessor(tempDir: os.Path, executable: os.Path) extends TDMLDFDLProcessor {
+class Runtime2TDMLDFDLProcessor(tempDir: os.Path, executable: os.Path,
+                                var diagnostics: Seq[Diagnostic]) extends TDMLDFDLProcessor {
 
   override type R = Runtime2TDMLDFDLProcessor
 
   private val dataProcessor = new Runtime2DataProcessor(executable)
   private var anyErrors: Boolean = false
-  private var diagnostics: Seq[Diagnostic] = Nil
 
   @deprecated("Use withDebugging.", "2.6.0")
   override def setDebugging(b: Boolean) = ???
@@ -175,7 +179,7 @@ class Runtime2TDMLDFDLProcessor(tempDir: os.Path, executable: os.Path) extends T
     // TODO: pass lengthLimitInBits to the C program to tell it how big the data is
     val pr = dataProcessor.parse(is)
     anyErrors = pr.isError
-    diagnostics = pr.getDiagnostics
+    diagnostics = diagnostics ++ pr.getDiagnostics
     new Runtime2TDMLParseResult(pr, tempDir)
   }
 
@@ -189,7 +193,7 @@ class Runtime2TDMLDFDLProcessor(tempDir: os.Path, executable: os.Path) extends T
     val inStream = os.read.inputStream(os.Path(tempInputFile))
     val upr = dataProcessor.unparse(inStream, outStream)
     anyErrors = upr.isError
-    diagnostics = upr.getDiagnostics
+    diagnostics = diagnostics ++ upr.getDiagnostics
     new Runtime2TDMLUnparseResult(upr, tempDir)
   }
 
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000.dfdl.xsd b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000.dfdl.xsd
new file mode 100644
index 0000000..2a74955
--- /dev/null
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000.dfdl.xsd
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/" xmlns:idl="urn:idl:1.0" targetNamespace="urn:idl:1.0">
+  <xs:annotation>
+    <xs:appinfo source="http://www.ogf.org/dfdl/">
+      <dfdl:defineFormat name="defaults">
+        <dfdl:format alignment="1" alignmentUnits="bytes" binaryBooleanFalseRep="0" binaryBooleanTrueRep="1" binaryFloatRep="ieee" binaryNumberCheckPolicy="lax" binaryNumberRep="binary" bitOrder="mostSignificantBitFirst" byteOrder="bigEndian" choiceLengthKind="implicit" encoding="utf-8" encodingErrorPolicy="replace" escapeSchemeRef="" fillByte="%NUL;" floating="no" ignoreCase="no" initiatedContent="no" initiator="" leadingSkip="0" lengthKind="implicit" lengthUnits="bytes" occursCountKind [...]
+      </dfdl:defineFormat>
+      <dfdl:format ref="idl:defaults"/>
+    </xs:appinfo>
+  </xs:annotation>
+  <xs:simpleType name="float" dfdl:length="4" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:float"/>
+  </xs:simpleType>
+  <xs:simpleType name="double" dfdl:length="8" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:double"/>
+  </xs:simpleType>
+  <xs:simpleType name="int8" dfdl:length="1" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:byte"/>
+  </xs:simpleType>
+  <xs:simpleType name="int16" dfdl:length="2" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:short"/>
+  </xs:simpleType>
+  <xs:simpleType name="int32" dfdl:length="4" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:int"/>
+  </xs:simpleType>
+  <xs:simpleType name="int64" dfdl:length="8" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:long"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint8" dfdl:length="1" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedByte"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint16" dfdl:length="2" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedShort"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint32" dfdl:length="4" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedInt"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint64" dfdl:length="8" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedLong"/>
+  </xs:simpleType>
+  <xs:simpleType name="boolean" dfdl:length="1" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:boolean"/>
+  </xs:simpleType>
+  <xs:complexType name="IsrmEntry">
+    <xs:sequence>
+      <xs:element name="x" type="idl:double"/>
+      <xs:element name="y" type="idl:double"/>
+      <xs:element name="z" type="idl:double"/>
+      <xs:element name="speed" type="idl:double"/>
+      <xs:element name="bearing" type="idl:double"/>
+      <xs:element name="confidence" type="idl:double"/>
+      <xs:element name="id">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="item" minOccurs="80" maxOccurs="80" dfdl:occursCountKind="fixed" type="idl:int8"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element name="classification">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="item" minOccurs="80" maxOccurs="80" dfdl:occursCountKind="fixed" type="idl:int8"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="IsrmEntryDecl" type="idl:IsrmEntry"/>
+  <xs:complexType name="IsrmEnd">
+    <xs:sequence/>
+  </xs:complexType>
+  <xs:element name="IsrmEndDecl" type="idl:IsrmEnd"/>
+  <xs:simpleType name="IsrmResultTag">
+    <xs:restriction base="idl:uint32"/>
+  </xs:simpleType>
+  <xs:complexType name="IsrmResult">
+    <xs:sequence>
+      <xs:element name="tag" type="idl:IsrmResultTag"/>
+      <xs:element name="data" dfdl:length="208" dfdl:lengthKind="explicit">
+        <xs:complexType>
+          <xs:choice dfdl:choiceDispatchKey="{xs:string(../tag)}">
+            <xs:element dfdl:choiceBranchKey="0" name="entry" type="idl:IsrmEntry"/>
+            <xs:element dfdl:choiceBranchKey="1" name="end" type="idl:IsrmEnd"/>
+          </xs:choice>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="IsrmResultDecl" type="idl:IsrmResult"/>
+</xs:schema>
diff --git a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000.tdml
similarity index 59%
copy from daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml
copy to daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000.tdml
index 3d12954..f062372 100644
--- a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000.tdml
@@ -17,9 +17,11 @@
 -->
 
 <tdml:testSuite
+  defaultConfig="config-runtime2"
   defaultImplementations="daffodil daffodil-runtime2"
   defaultRoundTrip="none"
-  description="TDML tests for ex_nums"
+  defaultValidation="on"
+  description="TDML tests for ISRM_green_to_orange_60000"
   xmlns:daf="urn:ogf:dfdl:2013:imp:daffodil.apache.org:2018:ext"
   xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"
   xmlns:tdml="http://www.ibm.com/xmlns/dfdl/testData">
@@ -37,50 +39,50 @@
   </tdml:defineConfig>
 
   <tdml:parserTestCase
-    name="ex_nums_parse_runtime1"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime1">
+    model="ISRM_green_to_orange_60000.dfdl.xsd"
+    name="ISRM_green_to_orange_60000_parse_0"
+    root="IsrmResultDecl">
     <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">ISRM_green_to_orange_60000_parse_0.dat</tdml:documentPart>
     </tdml:document>
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime1.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">ISRM_green_to_orange_60000_unparse_0.xml</tdml:dfdlInfoset>
     </tdml:infoset>
   </tdml:parserTestCase>
 
   <tdml:unparserTestCase
-    name="ex_nums_unparse_runtime1"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime1">
+    model="ISRM_green_to_orange_60000.dfdl.xsd"
+    name="ISRM_green_to_orange_60000_unparse_0"
+    root="IsrmResultDecl">
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime1.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">ISRM_green_to_orange_60000_unparse_0.xml</tdml:dfdlInfoset>
     </tdml:infoset>
     <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">ISRM_green_to_orange_60000_parse_0.dat</tdml:documentPart>
     </tdml:document>
   </tdml:unparserTestCase>
 
   <tdml:parserTestCase
-    name="ex_nums_parse_runtime2"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime2">
+    model="ISRM_green_to_orange_60000.dfdl.xsd"
+    name="ISRM_green_to_orange_60000_parse_1"
+    root="IsrmResultDecl">
     <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">ISRM_green_to_orange_60000_parse_1.dat</tdml:documentPart>
     </tdml:document>
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime2.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">ISRM_green_to_orange_60000_unparse_1.xml</tdml:dfdlInfoset>
     </tdml:infoset>
   </tdml:parserTestCase>
 
   <tdml:unparserTestCase
-    name="ex_nums_unparse_runtime2"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime2">
+    model="ISRM_green_to_orange_60000.dfdl.xsd"
+    name="ISRM_green_to_orange_60000_unparse_1"
+    root="IsrmResultDecl">
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime2.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">ISRM_green_to_orange_60000_unparse_1.xml</tdml:dfdlInfoset>
     </tdml:infoset>
     <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">ISRM_green_to_orange_60000_parse_1.dat</tdml:documentPart>
     </tdml:document>
   </tdml:unparserTestCase>
 
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000_parse_0.dat b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000_parse_0.dat
new file mode 100644
index 0000000..47b87e2
Binary files /dev/null and b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000_parse_0.dat differ
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000_parse_1.dat b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000_parse_1.dat
new file mode 100644
index 0000000..3f698bb
Binary files /dev/null and b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000_parse_1.dat differ
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000_unparse_0.xml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000_unparse_0.xml
new file mode 100644
index 0000000..73609a4
--- /dev/null
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000_unparse_0.xml
@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<idl:IsrmResultDecl xmlns:idl="urn:idl:1.0">
+  <tag>0</tag>
+  <data>
+    <entry>
+      <x>0.5</x>
+      <y>1.5</y>
+      <z>2.5</z>
+      <speed>3.5</speed>
+      <bearing>4.5</bearing>
+      <confidence>5.5</confidence>
+      <id>
+        <item>0</item>
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+        <item>6</item>
+        <item>7</item>
+        <item>8</item>
+        <item>9</item>
+        <item>10</item>
+        <item>11</item>
+        <item>12</item>
+        <item>13</item>
+        <item>14</item>
+        <item>15</item>
+        <item>16</item>
+        <item>17</item>
+        <item>18</item>
+        <item>19</item>
+        <item>20</item>
+        <item>21</item>
+        <item>22</item>
+        <item>23</item>
+        <item>24</item>
+        <item>25</item>
+        <item>26</item>
+        <item>27</item>
+        <item>28</item>
+        <item>29</item>
+        <item>30</item>
+        <item>31</item>
+        <item>32</item>
+        <item>33</item>
+        <item>34</item>
+        <item>35</item>
+        <item>36</item>
+        <item>37</item>
+        <item>38</item>
+        <item>39</item>
+        <item>40</item>
+        <item>41</item>
+        <item>42</item>
+        <item>43</item>
+        <item>44</item>
+        <item>45</item>
+        <item>46</item>
+        <item>47</item>
+        <item>48</item>
+        <item>49</item>
+        <item>50</item>
+        <item>51</item>
+        <item>52</item>
+        <item>53</item>
+        <item>54</item>
+        <item>55</item>
+        <item>56</item>
+        <item>57</item>
+        <item>58</item>
+        <item>59</item>
+        <item>60</item>
+        <item>61</item>
+        <item>62</item>
+        <item>63</item>
+        <item>64</item>
+        <item>65</item>
+        <item>66</item>
+        <item>67</item>
+        <item>68</item>
+        <item>69</item>
+        <item>70</item>
+        <item>71</item>
+        <item>72</item>
+        <item>73</item>
+        <item>74</item>
+        <item>75</item>
+        <item>76</item>
+        <item>77</item>
+        <item>78</item>
+        <item>79</item>
+      </id>
+      <classification>
+        <item>0</item>
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+        <item>6</item>
+        <item>7</item>
+        <item>8</item>
+        <item>9</item>
+        <item>10</item>
+        <item>11</item>
+        <item>12</item>
+        <item>13</item>
+        <item>14</item>
+        <item>15</item>
+        <item>16</item>
+        <item>17</item>
+        <item>18</item>
+        <item>19</item>
+        <item>20</item>
+        <item>21</item>
+        <item>22</item>
+        <item>23</item>
+        <item>24</item>
+        <item>25</item>
+        <item>26</item>
+        <item>27</item>
+        <item>28</item>
+        <item>29</item>
+        <item>30</item>
+        <item>31</item>
+        <item>32</item>
+        <item>33</item>
+        <item>34</item>
+        <item>35</item>
+        <item>36</item>
+        <item>37</item>
+        <item>38</item>
+        <item>39</item>
+        <item>40</item>
+        <item>41</item>
+        <item>42</item>
+        <item>43</item>
+        <item>44</item>
+        <item>45</item>
+        <item>46</item>
+        <item>47</item>
+        <item>48</item>
+        <item>49</item>
+        <item>50</item>
+        <item>51</item>
+        <item>52</item>
+        <item>53</item>
+        <item>54</item>
+        <item>55</item>
+        <item>56</item>
+        <item>57</item>
+        <item>58</item>
+        <item>59</item>
+        <item>60</item>
+        <item>61</item>
+        <item>62</item>
+        <item>63</item>
+        <item>64</item>
+        <item>65</item>
+        <item>66</item>
+        <item>67</item>
+        <item>68</item>
+        <item>69</item>
+        <item>70</item>
+        <item>71</item>
+        <item>72</item>
+        <item>73</item>
+        <item>74</item>
+        <item>75</item>
+        <item>76</item>
+        <item>77</item>
+        <item>78</item>
+        <item>79</item>
+      </classification>
+    </entry>
+  </data>
+</idl:IsrmResultDecl>
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000_unparse_1.xml
similarity index 78%
copy from daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml
copy to daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000_unparse_1.xml
index 01f3fd0..c824daf 100644
--- a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000_unparse_1.xml
@@ -16,13 +16,9 @@
   limitations under the License.
 -->
 
-<idl:CameraState xmlns:idl="urn:idl:1.0">
-  <sync0>208</sync0>
-  <sync1>13</sync1>
-  <id>97</id>
-  <length>5</length>
-  <zoom>10</zoom>
-  <focus>10</focus>
-  <index>0</index>
-  <checksum>30149</checksum>
-</idl:CameraState>
+<idl:IsrmResultDecl xmlns:idl="urn:idl:1.0">
+  <tag>1</tag>
+  <data>
+    <end />
+  </data>
+</idl:IsrmResultDecl>
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_orange_to_green_60002.dfdl.xsd b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_orange_to_green_60002.dfdl.xsd
new file mode 100644
index 0000000..4ffb8ac
--- /dev/null
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_orange_to_green_60002.dfdl.xsd
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/" xmlns:idl="urn:idl:1.0" targetNamespace="urn:idl:1.0">
+  <xs:annotation>
+    <xs:appinfo source="http://www.ogf.org/dfdl/">
+      <dfdl:defineFormat name="defaults">
+        <dfdl:format alignment="1" alignmentUnits="bytes" binaryBooleanFalseRep="0" binaryBooleanTrueRep="1" binaryFloatRep="ieee" binaryNumberCheckPolicy="lax" binaryNumberRep="binary" bitOrder="mostSignificantBitFirst" byteOrder="bigEndian" choiceLengthKind="implicit" encoding="utf-8" encodingErrorPolicy="replace" escapeSchemeRef="" fillByte="%NUL;" floating="no" ignoreCase="no" initiatedContent="no" initiator="" leadingSkip="0" lengthKind="implicit" lengthUnits="bytes" occursCountKind [...]
+      </dfdl:defineFormat>
+      <dfdl:format ref="idl:defaults"/>
+    </xs:appinfo>
+  </xs:annotation>
+  <xs:simpleType name="float" dfdl:length="4" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:float"/>
+  </xs:simpleType>
+  <xs:simpleType name="double" dfdl:length="8" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:double"/>
+  </xs:simpleType>
+  <xs:simpleType name="int8" dfdl:length="1" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:byte"/>
+  </xs:simpleType>
+  <xs:simpleType name="int16" dfdl:length="2" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:short"/>
+  </xs:simpleType>
+  <xs:simpleType name="int32" dfdl:length="4" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:int"/>
+  </xs:simpleType>
+  <xs:simpleType name="int64" dfdl:length="8" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:long"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint8" dfdl:length="1" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedByte"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint16" dfdl:length="2" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedShort"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint32" dfdl:length="4" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedInt"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint64" dfdl:length="8" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedLong"/>
+  </xs:simpleType>
+  <xs:simpleType name="boolean" dfdl:length="1" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:boolean"/>
+  </xs:simpleType>
+  <xs:complexType name="IsrmRequest">
+    <xs:sequence>
+      <xs:element name="phase">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="item" minOccurs="80" maxOccurs="80" dfdl:occursCountKind="fixed" type="idl:int8"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="IsrmRequestDecl" type="idl:IsrmRequest"/>
+</xs:schema>
diff --git a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_orange_to_green_60002.tdml
similarity index 56%
copy from daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml
copy to daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_orange_to_green_60002.tdml
index 3d12954..b4537cf 100644
--- a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_orange_to_green_60002.tdml
@@ -17,9 +17,11 @@
 -->
 
 <tdml:testSuite
+  defaultConfig="config-runtime2"
   defaultImplementations="daffodil daffodil-runtime2"
   defaultRoundTrip="none"
-  description="TDML tests for ex_nums"
+  defaultValidation="on"
+  description="TDML tests for ISRM_orange_to_green_60002"
   xmlns:daf="urn:ogf:dfdl:2013:imp:daffodil.apache.org:2018:ext"
   xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"
   xmlns:tdml="http://www.ibm.com/xmlns/dfdl/testData">
@@ -37,50 +39,26 @@
   </tdml:defineConfig>
 
   <tdml:parserTestCase
-    name="ex_nums_parse_runtime1"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime1">
+    model="ISRM_orange_to_green_60002.dfdl.xsd"
+    name="ISRM_orange_to_green_60002_parse"
+    root="IsrmRequestDecl">
     <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">ISRM_orange_to_green_60002_parse.dat</tdml:documentPart>
     </tdml:document>
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime1.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">ISRM_orange_to_green_60002_unparse.xml</tdml:dfdlInfoset>
     </tdml:infoset>
   </tdml:parserTestCase>
 
   <tdml:unparserTestCase
-    name="ex_nums_unparse_runtime1"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime1">
+    model="ISRM_orange_to_green_60002.dfdl.xsd"
+    name="ISRM_orange_to_green_60002_unparse"
+    root="IsrmRequestDecl">
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime1.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">ISRM_orange_to_green_60002_unparse.xml</tdml:dfdlInfoset>
     </tdml:infoset>
     <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
-    </tdml:document>
-  </tdml:unparserTestCase>
-
-  <tdml:parserTestCase
-    name="ex_nums_parse_runtime2"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime2">
-    <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
-    </tdml:document>
-    <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime2.xml</tdml:dfdlInfoset>
-    </tdml:infoset>
-  </tdml:parserTestCase>
-
-  <tdml:unparserTestCase
-    name="ex_nums_unparse_runtime2"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime2">
-    <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime2.xml</tdml:dfdlInfoset>
-    </tdml:infoset>
-    <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">ISRM_orange_to_green_60002_parse.dat</tdml:documentPart>
     </tdml:document>
   </tdml:unparserTestCase>
 
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_orange_to_green_60002_parse.dat b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_orange_to_green_60002_parse.dat
new file mode 100644
index 0000000..f82ef2b
Binary files /dev/null and b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_orange_to_green_60002_parse.dat differ
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_orange_to_green_60002_unparse.xml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_orange_to_green_60002_unparse.xml
new file mode 100644
index 0000000..3399c9a
--- /dev/null
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_orange_to_green_60002_unparse.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<idl:IsrmRequestDecl xmlns:idl="urn:idl:1.0">
+  <phase>
+    <item>0</item>
+    <item>1</item>
+    <item>2</item>
+    <item>3</item>
+    <item>4</item>
+    <item>5</item>
+    <item>6</item>
+    <item>7</item>
+    <item>8</item>
+    <item>9</item>
+    <item>10</item>
+    <item>11</item>
+    <item>12</item>
+    <item>13</item>
+    <item>14</item>
+    <item>15</item>
+    <item>16</item>
+    <item>17</item>
+    <item>18</item>
+    <item>19</item>
+    <item>20</item>
+    <item>21</item>
+    <item>22</item>
+    <item>23</item>
+    <item>24</item>
+    <item>25</item>
+    <item>26</item>
+    <item>27</item>
+    <item>28</item>
+    <item>29</item>
+    <item>30</item>
+    <item>31</item>
+    <item>32</item>
+    <item>33</item>
+    <item>34</item>
+    <item>35</item>
+    <item>36</item>
+    <item>37</item>
+    <item>38</item>
+    <item>39</item>
+    <item>40</item>
+    <item>41</item>
+    <item>42</item>
+    <item>43</item>
+    <item>44</item>
+    <item>45</item>
+    <item>46</item>
+    <item>47</item>
+    <item>48</item>
+    <item>49</item>
+    <item>50</item>
+    <item>51</item>
+    <item>52</item>
+    <item>53</item>
+    <item>54</item>
+    <item>55</item>
+    <item>56</item>
+    <item>57</item>
+    <item>58</item>
+    <item>59</item>
+    <item>60</item>
+    <item>61</item>
+    <item>62</item>
+    <item>63</item>
+    <item>64</item>
+    <item>65</item>
+    <item>66</item>
+    <item>67</item>
+    <item>68</item>
+    <item>69</item>
+    <item>70</item>
+    <item>71</item>
+    <item>72</item>
+    <item>73</item>
+    <item>74</item>
+    <item>75</item>
+    <item>76</item>
+    <item>77</item>
+    <item>78</item>
+    <item>79</item>
+  </phase>
+</idl:IsrmRequestDecl>
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_green_to_orange_60004.dfdl.xsd b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_green_to_orange_60004.dfdl.xsd
new file mode 100644
index 0000000..fe03a94
--- /dev/null
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_green_to_orange_60004.dfdl.xsd
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/" xmlns:idl="urn:idl:1.0" targetNamespace="urn:idl:1.0">
+  <xs:annotation>
+    <xs:appinfo source="http://www.ogf.org/dfdl/">
+      <dfdl:defineFormat name="defaults">
+        <dfdl:format alignment="1" alignmentUnits="bytes" binaryBooleanFalseRep="0" binaryBooleanTrueRep="1" binaryFloatRep="ieee" binaryNumberCheckPolicy="lax" binaryNumberRep="binary" bitOrder="mostSignificantBitFirst" byteOrder="bigEndian" choiceLengthKind="implicit" encoding="utf-8" encodingErrorPolicy="replace" escapeSchemeRef="" fillByte="%NUL;" floating="no" ignoreCase="no" initiatedContent="no" initiator="" leadingSkip="0" lengthKind="implicit" lengthUnits="bytes" occursCountKind [...]
+      </dfdl:defineFormat>
+      <dfdl:format ref="idl:defaults"/>
+    </xs:appinfo>
+  </xs:annotation>
+  <xs:simpleType name="float" dfdl:length="4" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:float"/>
+  </xs:simpleType>
+  <xs:simpleType name="double" dfdl:length="8" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:double"/>
+  </xs:simpleType>
+  <xs:simpleType name="int8" dfdl:length="1" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:byte"/>
+  </xs:simpleType>
+  <xs:simpleType name="int16" dfdl:length="2" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:short"/>
+  </xs:simpleType>
+  <xs:simpleType name="int32" dfdl:length="4" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:int"/>
+  </xs:simpleType>
+  <xs:simpleType name="int64" dfdl:length="8" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:long"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint8" dfdl:length="1" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedByte"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint16" dfdl:length="2" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedShort"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint32" dfdl:length="4" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedInt"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint64" dfdl:length="8" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedLong"/>
+  </xs:simpleType>
+  <xs:simpleType name="boolean" dfdl:length="1" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:boolean"/>
+  </xs:simpleType>
+  <xs:complexType name="ComponentReady">
+    <xs:sequence>
+      <xs:element name="name">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="item" minOccurs="80" maxOccurs="80" dfdl:occursCountKind="fixed" type="idl:int8"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element name="status" type="idl:boolean"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="ComponentReadyDecl" type="idl:ComponentReady"/>
+</xs:schema>
diff --git a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_green_to_orange_60004.tdml
similarity index 56%
copy from daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml
copy to daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_green_to_orange_60004.tdml
index 3d12954..a7bab3e 100644
--- a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_green_to_orange_60004.tdml
@@ -17,9 +17,11 @@
 -->
 
 <tdml:testSuite
+  defaultConfig="config-runtime2"
   defaultImplementations="daffodil daffodil-runtime2"
   defaultRoundTrip="none"
-  description="TDML tests for ex_nums"
+  defaultValidation="on"
+  description="TDML tests for MPU_green_to_orange_60004"
   xmlns:daf="urn:ogf:dfdl:2013:imp:daffodil.apache.org:2018:ext"
   xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"
   xmlns:tdml="http://www.ibm.com/xmlns/dfdl/testData">
@@ -37,50 +39,26 @@
   </tdml:defineConfig>
 
   <tdml:parserTestCase
-    name="ex_nums_parse_runtime1"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime1">
+    model="MPU_green_to_orange_60004.dfdl.xsd"
+    name="MPU_green_to_orange_60004_parse"
+    root="ComponentReadyDecl">
     <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">MPU_green_to_orange_60004_parse.dat</tdml:documentPart>
     </tdml:document>
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime1.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">MPU_green_to_orange_60004_unparse.xml</tdml:dfdlInfoset>
     </tdml:infoset>
   </tdml:parserTestCase>
 
   <tdml:unparserTestCase
-    name="ex_nums_unparse_runtime1"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime1">
+    model="MPU_green_to_orange_60004.dfdl.xsd"
+    name="MPU_green_to_orange_60004_unparse"
+    root="ComponentReadyDecl">
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime1.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">MPU_green_to_orange_60004_unparse.xml</tdml:dfdlInfoset>
     </tdml:infoset>
     <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
-    </tdml:document>
-  </tdml:unparserTestCase>
-
-  <tdml:parserTestCase
-    name="ex_nums_parse_runtime2"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime2">
-    <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
-    </tdml:document>
-    <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime2.xml</tdml:dfdlInfoset>
-    </tdml:infoset>
-  </tdml:parserTestCase>
-
-  <tdml:unparserTestCase
-    name="ex_nums_unparse_runtime2"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime2">
-    <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime2.xml</tdml:dfdlInfoset>
-    </tdml:infoset>
-    <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">MPU_green_to_orange_60004_parse.dat</tdml:documentPart>
     </tdml:document>
   </tdml:unparserTestCase>
 
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_green_to_orange_60004_parse.dat b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_green_to_orange_60004_parse.dat
new file mode 100644
index 0000000..81c33f6
Binary files /dev/null and b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_green_to_orange_60004_parse.dat differ
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_green_to_orange_60004_unparse.xml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_green_to_orange_60004_unparse.xml
new file mode 100644
index 0000000..1f39771
--- /dev/null
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_green_to_orange_60004_unparse.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<idl:ComponentReadyDecl xmlns:idl="urn:idl:1.0">
+  <name>
+    <item>0</item>
+    <item>1</item>
+    <item>2</item>
+    <item>3</item>
+    <item>4</item>
+    <item>5</item>
+    <item>6</item>
+    <item>7</item>
+    <item>8</item>
+    <item>9</item>
+    <item>10</item>
+    <item>11</item>
+    <item>12</item>
+    <item>13</item>
+    <item>14</item>
+    <item>15</item>
+    <item>16</item>
+    <item>17</item>
+    <item>18</item>
+    <item>19</item>
+    <item>20</item>
+    <item>21</item>
+    <item>22</item>
+    <item>23</item>
+    <item>24</item>
+    <item>25</item>
+    <item>26</item>
+    <item>27</item>
+    <item>28</item>
+    <item>29</item>
+    <item>30</item>
+    <item>31</item>
+    <item>32</item>
+    <item>33</item>
+    <item>34</item>
+    <item>35</item>
+    <item>36</item>
+    <item>37</item>
+    <item>38</item>
+    <item>39</item>
+    <item>40</item>
+    <item>41</item>
+    <item>42</item>
+    <item>43</item>
+    <item>44</item>
+    <item>45</item>
+    <item>46</item>
+    <item>47</item>
+    <item>48</item>
+    <item>49</item>
+    <item>50</item>
+    <item>51</item>
+    <item>52</item>
+    <item>53</item>
+    <item>54</item>
+    <item>55</item>
+    <item>56</item>
+    <item>57</item>
+    <item>58</item>
+    <item>59</item>
+    <item>60</item>
+    <item>61</item>
+    <item>62</item>
+    <item>63</item>
+    <item>64</item>
+    <item>65</item>
+    <item>66</item>
+    <item>67</item>
+    <item>68</item>
+    <item>69</item>
+    <item>80</item>
+    <item>81</item>
+    <item>82</item>
+    <item>83</item>
+    <item>84</item>
+    <item>85</item>
+    <item>86</item>
+    <item>87</item>
+    <item>88</item>
+    <item>89</item>
+  </name>
+  <status>true</status>
+</idl:ComponentReadyDecl>
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006.dfdl.xsd b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006.dfdl.xsd
new file mode 100644
index 0000000..441a5be
--- /dev/null
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006.dfdl.xsd
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/" xmlns:idl="urn:idl:1.0" targetNamespace="urn:idl:1.0">
+  <xs:annotation>
+    <xs:appinfo source="http://www.ogf.org/dfdl/">
+      <dfdl:defineFormat name="defaults">
+        <dfdl:format alignment="1" alignmentUnits="bytes" binaryBooleanFalseRep="0" binaryBooleanTrueRep="1" binaryFloatRep="ieee" binaryNumberCheckPolicy="lax" binaryNumberRep="binary" bitOrder="mostSignificantBitFirst" byteOrder="bigEndian" choiceLengthKind="implicit" encoding="utf-8" encodingErrorPolicy="replace" escapeSchemeRef="" fillByte="%NUL;" floating="no" ignoreCase="no" initiatedContent="no" initiator="" leadingSkip="0" lengthKind="implicit" lengthUnits="bytes" occursCountKind [...]
+      </dfdl:defineFormat>
+      <dfdl:format ref="idl:defaults"/>
+    </xs:appinfo>
+  </xs:annotation>
+  <xs:simpleType name="float" dfdl:length="4" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:float"/>
+  </xs:simpleType>
+  <xs:simpleType name="double" dfdl:length="8" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:double"/>
+  </xs:simpleType>
+  <xs:simpleType name="int8" dfdl:length="1" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:byte"/>
+  </xs:simpleType>
+  <xs:simpleType name="int16" dfdl:length="2" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:short"/>
+  </xs:simpleType>
+  <xs:simpleType name="int32" dfdl:length="4" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:int"/>
+  </xs:simpleType>
+  <xs:simpleType name="int64" dfdl:length="8" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:long"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint8" dfdl:length="1" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedByte"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint16" dfdl:length="2" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedShort"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint32" dfdl:length="4" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedInt"/>
+  </xs:simpleType>
+  <xs:simpleType name="uint64" dfdl:length="8" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:unsignedLong"/>
+  </xs:simpleType>
+  <xs:simpleType name="boolean" dfdl:length="1" dfdl:lengthKind="explicit">
+    <xs:restriction base="xs:boolean"/>
+  </xs:simpleType>
+  <xs:complexType name="SystemReady">
+    <xs:sequence/>
+  </xs:complexType>
+  <xs:element name="SystemReadyDecl" type="idl:SystemReady"/>
+  <xs:complexType name="Action">
+    <xs:sequence>
+      <xs:element name="actionId">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="item" minOccurs="10" maxOccurs="10" dfdl:occursCountKind="fixed" type="idl:int8"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element name="actionTy">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="item" minOccurs="10" maxOccurs="10" dfdl:occursCountKind="fixed" type="idl:int8"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element name="waypoint">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="item" minOccurs="10" maxOccurs="10" dfdl:occursCountKind="fixed" type="idl:int8"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="ActionDecl" type="idl:Action"/>
+  <xs:complexType name="Waypoint">
+    <xs:sequence>
+      <xs:element name="id">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="item" minOccurs="10" maxOccurs="10" dfdl:occursCountKind="fixed" type="idl:int8"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element name="x" type="idl:double"/>
+      <xs:element name="y" type="idl:double"/>
+      <xs:element name="z" type="idl:double"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="WaypointDecl" type="idl:Waypoint"/>
+  <xs:complexType name="MissionPlan">
+    <xs:sequence>
+      <xs:element name="missionId">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="item" minOccurs="20" maxOccurs="20" dfdl:occursCountKind="fixed" type="idl:int8"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element name="sensorActions">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="action" minOccurs="2" maxOccurs="2" dfdl:occursCountKind="fixed" type="idl:Action"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element name="sensorPlanId">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="item" minOccurs="10" maxOccurs="10" dfdl:occursCountKind="fixed" type="idl:int8"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element name="vehiclePlanId">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="item" minOccurs="10" maxOccurs="10" dfdl:occursCountKind="fixed" type="idl:int8"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element name="waypoints">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="item" minOccurs="4" maxOccurs="4" dfdl:occursCountKind="fixed" type="idl:Waypoint"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="MissionPlanDecl" type="idl:MissionPlan"/>
+  <xs:simpleType name="MpuRequestTag">
+    <xs:restriction base="idl:uint32"/>
+  </xs:simpleType>
+  <xs:complexType name="MpuRequest">
+    <xs:sequence>
+      <xs:element name="tag" type="idl:MpuRequestTag"/>
+      <xs:element name="data" dfdl:length="236" dfdl:lengthKind="explicit">
+        <xs:complexType>
+          <xs:choice dfdl:choiceDispatchKey="{xs:string(../tag)}">
+            <xs:element dfdl:choiceBranchKey="0" name="missionPlan" type="idl:MissionPlan"/>
+            <xs:element dfdl:choiceBranchKey="1" name="systemReady" type="idl:SystemReady"/>
+          </xs:choice>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="MpuRequestDecl" type="idl:MpuRequest"/>
+</xs:schema>
diff --git a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006.tdml
similarity index 59%
copy from daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml
copy to daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006.tdml
index 3d12954..ae6376c 100644
--- a/daffodil-runtime2/src/test/resources/org/apache/daffodil/runtime2/ex_nums.tdml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006.tdml
@@ -17,9 +17,11 @@
 -->
 
 <tdml:testSuite
+  defaultConfig="config-runtime2"
   defaultImplementations="daffodil daffodil-runtime2"
   defaultRoundTrip="none"
-  description="TDML tests for ex_nums"
+  defaultValidation="on"
+  description="TDML tests for MPU_orange_to_green_60006"
   xmlns:daf="urn:ogf:dfdl:2013:imp:daffodil.apache.org:2018:ext"
   xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"
   xmlns:tdml="http://www.ibm.com/xmlns/dfdl/testData">
@@ -37,50 +39,50 @@
   </tdml:defineConfig>
 
   <tdml:parserTestCase
-    name="ex_nums_parse_runtime1"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime1">
+    model="MPU_orange_to_green_60006.dfdl.xsd"
+    name="MPU_orange_to_green_60006_parse_0"
+    root="MpuRequestDecl">
     <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">MPU_orange_to_green_60006_parse_0.dat</tdml:documentPart>
     </tdml:document>
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime1.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">MPU_orange_to_green_60006_unparse_0.xml</tdml:dfdlInfoset>
     </tdml:infoset>
   </tdml:parserTestCase>
 
   <tdml:unparserTestCase
-    name="ex_nums_unparse_runtime1"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime1">
+    model="MPU_orange_to_green_60006.dfdl.xsd"
+    name="MPU_orange_to_green_60006_unparse_0"
+    root="MpuRequestDecl">
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime1.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">MPU_orange_to_green_60006_unparse_0.xml</tdml:dfdlInfoset>
     </tdml:infoset>
     <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">MPU_orange_to_green_60006_parse_0.dat</tdml:documentPart>
     </tdml:document>
   </tdml:unparserTestCase>
 
   <tdml:parserTestCase
-    name="ex_nums_parse_runtime2"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime2">
+    model="MPU_orange_to_green_60006.dfdl.xsd"
+    name="MPU_orange_to_green_60006_parse_1"
+    root="MpuRequestDecl">
     <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">MPU_orange_to_green_60006_parse_1.dat</tdml:documentPart>
     </tdml:document>
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime2.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">MPU_orange_to_green_60006_unparse_1.xml</tdml:dfdlInfoset>
     </tdml:infoset>
   </tdml:parserTestCase>
 
   <tdml:unparserTestCase
-    name="ex_nums_unparse_runtime2"
-    model="ex_nums.dfdl.xsd"
-    config="config-runtime2">
+    model="MPU_orange_to_green_60006.dfdl.xsd"
+    name="MPU_orange_to_green_60006_unparse_1"
+    root="MpuRequestDecl">
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">ex_nums_unparse_runtime2.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">MPU_orange_to_green_60006_unparse_1.xml</tdml:dfdlInfoset>
     </tdml:infoset>
     <tdml:document>
-      <tdml:documentPart type="file">ex_nums_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">MPU_orange_to_green_60006_parse_1.dat</tdml:documentPart>
     </tdml:document>
   </tdml:unparserTestCase>
 
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006_parse_0.dat b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006_parse_0.dat
new file mode 100644
index 0000000..5d314b7
Binary files /dev/null and b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006_parse_0.dat differ
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006_parse_1.dat b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006_parse_1.dat
new file mode 100644
index 0000000..07a1626
Binary files /dev/null and b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006_parse_1.dat differ
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006_unparse_0.xml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006_unparse_0.xml
new file mode 100644
index 0000000..eee1745
--- /dev/null
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006_unparse_0.xml
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<idl:MpuRequestDecl xmlns:idl="urn:idl:1.0">
+  <tag>0</tag>
+  <data>
+    <missionPlan>
+      <missionId>
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+        <item>6</item>
+        <item>7</item>
+        <item>8</item>
+        <item>9</item>
+        <item>10</item>
+        <item>11</item>
+        <item>12</item>
+        <item>13</item>
+        <item>14</item>
+        <item>15</item>
+        <item>16</item>
+        <item>17</item>
+        <item>18</item>
+        <item>19</item>
+        <item>20</item>
+      </missionId>
+      <sensorActions>
+        <action>
+          <actionId>
+            <item>1</item>
+            <item>2</item>
+            <item>3</item>
+            <item>4</item>
+            <item>5</item>
+            <item>6</item>
+            <item>7</item>
+            <item>8</item>
+            <item>9</item>
+            <item>10</item>
+          </actionId>
+          <actionTy>
+            <item>1</item>
+            <item>2</item>
+            <item>3</item>
+            <item>4</item>
+            <item>5</item>
+            <item>6</item>
+            <item>7</item>
+            <item>8</item>
+            <item>9</item>
+            <item>10</item>
+          </actionTy>
+          <waypoint>
+            <item>1</item>
+            <item>2</item>
+            <item>3</item>
+            <item>4</item>
+            <item>5</item>
+            <item>6</item>
+            <item>7</item>
+            <item>8</item>
+            <item>9</item>
+            <item>10</item>
+          </waypoint>
+        </action>
+        <action>
+          <actionId>
+            <item>1</item>
+            <item>2</item>
+            <item>3</item>
+            <item>4</item>
+            <item>5</item>
+            <item>6</item>
+            <item>7</item>
+            <item>8</item>
+            <item>9</item>
+            <item>10</item>
+          </actionId>
+          <actionTy>
+            <item>1</item>
+            <item>2</item>
+            <item>3</item>
+            <item>4</item>
+            <item>5</item>
+            <item>6</item>
+            <item>7</item>
+            <item>8</item>
+            <item>9</item>
+            <item>10</item>
+          </actionTy>
+          <waypoint>
+            <item>1</item>
+            <item>2</item>
+            <item>3</item>
+            <item>4</item>
+            <item>5</item>
+            <item>6</item>
+            <item>7</item>
+            <item>8</item>
+            <item>9</item>
+            <item>10</item>
+          </waypoint>
+        </action>
+      </sensorActions>
+      <sensorPlanId>
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+        <item>6</item>
+        <item>7</item>
+        <item>8</item>
+        <item>9</item>
+        <item>10</item>
+      </sensorPlanId>
+      <vehiclePlanId>
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+        <item>6</item>
+        <item>7</item>
+        <item>8</item>
+        <item>9</item>
+        <item>10</item>
+      </vehiclePlanId>
+      <waypoints>
+        <item>
+          <id>
+            <item>1</item>
+            <item>2</item>
+            <item>3</item>
+            <item>4</item>
+            <item>5</item>
+            <item>6</item>
+            <item>7</item>
+            <item>8</item>
+            <item>9</item>
+            <item>10</item>
+          </id>
+          <x>111.5</x>
+          <y>112.5</y>
+          <z>113.5</z>
+        </item>
+        <item>
+          <id>
+            <item>1</item>
+            <item>2</item>
+            <item>3</item>
+            <item>4</item>
+            <item>5</item>
+            <item>6</item>
+            <item>7</item>
+            <item>8</item>
+            <item>9</item>
+            <item>10</item>
+          </id>
+          <x>121.5</x>
+          <y>122.5</y>
+          <z>123.5</z>
+        </item>
+        <item>
+          <id>
+            <item>1</item>
+            <item>2</item>
+            <item>3</item>
+            <item>4</item>
+            <item>5</item>
+            <item>6</item>
+            <item>7</item>
+            <item>8</item>
+            <item>9</item>
+            <item>10</item>
+          </id>
+          <x>131.5</x>
+          <y>132.5</y>
+          <z>133.5</z>
+        </item>
+        <item>
+          <id>
+            <item>1</item>
+            <item>2</item>
+            <item>3</item>
+            <item>4</item>
+            <item>5</item>
+            <item>6</item>
+            <item>7</item>
+            <item>8</item>
+            <item>9</item>
+            <item>10</item>
+          </id>
+          <x>141.5</x>
+          <y>142.5</y>
+          <z>143.5</z>
+        </item>
+      </waypoints>
+    </missionPlan>
+  </data>
+</idl:MpuRequestDecl>
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006_unparse_1.xml
similarity index 78%
copy from daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml
copy to daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006_unparse_1.xml
index 01f3fd0..116d33b 100644
--- a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006_unparse_1.xml
@@ -16,13 +16,9 @@
   limitations under the License.
 -->
 
-<idl:CameraState xmlns:idl="urn:idl:1.0">
-  <sync0>208</sync0>
-  <sync1>13</sync1>
-  <id>97</id>
-  <length>5</length>
-  <zoom>10</zoom>
-  <focus>10</focus>
-  <index>0</index>
-  <checksum>30149</checksum>
-</idl:CameraState>
+<idl:MpuRequestDecl xmlns:idl="urn:idl:1.0">
+  <tag>1</tag>
+  <data>
+    <systemReady />
+  </data>
+</idl:MpuRequestDecl>
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/aptina_settings_parse.dat b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/aptina_settings_parse.dat
new file mode 100644
index 0000000..d58021f
Binary files /dev/null and b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/aptina_settings_parse.dat differ
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/aptina_settings_unparse.xml
similarity index 68%
copy from daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml
copy to daffodil-test/src/test/resources/org/apache/daffodil/runtime2/aptina_settings_unparse.xml
index 01f3fd0..ed5647d 100644
--- a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/aptina_settings_unparse.xml
@@ -16,13 +16,21 @@
   limitations under the License.
 -->
 
-<idl:CameraState xmlns:idl="urn:idl:1.0">
+<idl:AptinaSettingsDecl xmlns:idl="urn:idl:1.0">
   <sync0>208</sync0>
   <sync1>13</sync1>
-  <id>97</id>
-  <length>5</length>
-  <zoom>10</zoom>
-  <focus>10</focus>
+  <id>104</id>
+  <length>15</length>
   <index>0</index>
-  <checksum>30149</checksum>
-</idl:CameraState>
+  <minExposure>515</minExposure>
+  <maxExposure>1055</maxExposure>
+  <minGain>36</minGain>
+  <maxGain>864</maxGain>
+  <brightness>1</brightness>
+  <contrast>2</contrast>
+  <saturation>3</saturation>
+  <sharpness>5</sharpness>
+  <debugEnable>0</debugEnable>
+  <hue>6</hue>
+  <checksum>464</checksum>
+</idl:AptinaSettingsDecl>
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml
index 01f3fd0..dd78cb8 100644
--- a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml
@@ -16,7 +16,7 @@
   limitations under the License.
 -->
 
-<idl:CameraState xmlns:idl="urn:idl:1.0">
+<idl:CameraStateDecl xmlns:idl="urn:idl:1.0">
   <sync0>208</sync0>
   <sync1>13</sync1>
   <id>97</id>
@@ -25,4 +25,4 @@
   <focus>10</focus>
   <index>0</index>
   <checksum>30149</checksum>
-</idl:CameraState>
+</idl:CameraStateDecl>
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/command_unparse.xml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/command_unparse.xml
index 9a1d4a1..6aec4ad 100644
--- a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/command_unparse.xml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/command_unparse.xml
@@ -16,7 +16,7 @@
   limitations under the License.
 -->
 
-<idl:Command xmlns:idl="urn:idl:1.0">
+<idl:CommandDecl xmlns:idl="urn:idl:1.0">
   <sync0>208</sync0>
   <sync1>13</sync1>
   <id>1</id>
@@ -27,4 +27,4 @@
   <stabilized>0</stabilized>
   <impulse>0</impulse>
   <checksum>30149</checksum>
-</idl:Command>
+</idl:CommandDecl>
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/limits_parse.dat b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/limits_parse.dat
new file mode 100644
index 0000000..b007dd0
Binary files /dev/null and b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/limits_parse.dat differ
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/limits_unparse.xml
similarity index 82%
copy from daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml
copy to daffodil-test/src/test/resources/org/apache/daffodil/runtime2/limits_unparse.xml
index 01f3fd0..7fe7fe0 100644
--- a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_unparse.xml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/limits_unparse.xml
@@ -16,13 +16,10 @@
   limitations under the License.
 -->
 
-<idl:CameraState xmlns:idl="urn:idl:1.0">
+<idl:LimitsDecl xmlns:idl="urn:idl:1.0">
   <sync0>208</sync0>
   <sync1>13</sync1>
-  <id>97</id>
-  <length>5</length>
-  <zoom>10</zoom>
-  <focus>10</focus>
-  <index>0</index>
-  <checksum>30149</checksum>
-</idl:CameraState>
+  <id>34</id>
+  <length>0</length>
+  <checksum>255</checksum>
+</idl:LimitsDecl>
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/orion-command.dfdl.xsd b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/orion-command.dfdl.xsd
index 4034d39..d4569ed 100644
--- a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/orion-command.dfdl.xsd
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/orion-command.dfdl.xsd
@@ -40,7 +40,7 @@
   <xs:simpleType name="uint32" dfdl:length="32" dfdl:lengthKind="explicit">
     <xs:restriction base="xs:unsignedInt"/>
   </xs:simpleType>
-  <xs:complexType name="CommandType">
+  <xs:complexType name="Command">
     <xs:sequence>
       <xs:element name="sync0" fixed="208" type="idl:uint8"/>
       <xs:element name="sync1" fixed="13" type="idl:uint8"/>
@@ -61,8 +61,8 @@
       <xs:element name="checksum" type="idl:uint16"/>
     </xs:sequence>
   </xs:complexType>
-  <xs:element name="Command" type="idl:CommandType"/>
-  <xs:complexType name="CameraStateType">
+  <xs:element name="CommandDecl" type="idl:Command"/>
+  <xs:complexType name="CameraState">
     <xs:sequence>
       <xs:element name="sync0" fixed="208" type="idl:uint8"/>
       <xs:element name="sync1" fixed="13" type="idl:uint8"/>
@@ -74,8 +74,8 @@
       <xs:element name="checksum" type="idl:uint16"/>
     </xs:sequence>
   </xs:complexType>
-  <xs:element name="CameraState" type="idl:CameraStateType"/>
-  <xs:complexType name="VideoSettingsType">
+  <xs:element name="CameraStateDecl" type="idl:CameraState"/>
+  <xs:complexType name="VideoSettings">
     <xs:sequence>
       <xs:element name="sync0" fixed="208" type="idl:uint8"/>
       <xs:element name="sync1" fixed="13" type="idl:uint8"/>
@@ -97,5 +97,36 @@
       <xs:element name="checksum" type="idl:uint16"/>
     </xs:sequence>
   </xs:complexType>
-  <xs:element name="VideoSettings" type="idl:VideoSettingsType"/>
+  <xs:element name="VideoSettingsDecl" type="idl:VideoSettings"/>
+  <xs:complexType name="AptinaSettings">
+    <xs:sequence>
+      <xs:element name="sync0" fixed="208" type="idl:uint8"/>
+      <xs:element name="sync1" fixed="13" type="idl:uint8"/>
+      <xs:element name="id" fixed="104" type="idl:uint8"/>
+      <xs:element name="length" fixed="15" type="idl:uint8"/>
+      <xs:element name="index" fixed="0" type="idl:uint8"/>
+      <xs:element name="minExposure" type="idl:uint16"/>
+      <xs:element name="maxExposure" type="idl:uint16"/>
+      <xs:element name="minGain" type="idl:uint16"/>
+      <xs:element name="maxGain" type="idl:uint16"/>
+      <xs:element name="brightness" type="idl:int8"/>
+      <xs:element name="contrast" type="idl:int8"/>
+      <xs:element name="saturation" type="idl:int8"/>
+      <xs:element name="sharpness" type="idl:uint8"/>
+      <xs:element name="debugEnable" type="idl:uint8"/>
+      <xs:element name="hue" type="idl:int8"/>
+      <xs:element name="checksum" type="idl:uint16"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="AptinaSettingsDecl" type="idl:AptinaSettings"/>
+  <xs:complexType name="Limits">
+    <xs:sequence>
+      <xs:element name="sync0" fixed="208" type="idl:uint8"/>
+      <xs:element name="sync1" fixed="13" type="idl:uint8"/>
+      <xs:element name="id" fixed="34" type="idl:uint8"/>
+      <xs:element name="length" fixed="0" type="idl:uint8"/>
+      <xs:element name="checksum" type="idl:uint16"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="LimitsDecl" type="idl:Limits"/>
 </xs:schema>
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/orion-command.tdml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/orion-command.tdml
index 4b44391..e9c30e2 100644
--- a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/orion-command.tdml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/orion-command.tdml
@@ -20,6 +20,7 @@
   defaultConfig="config-runtime2"
   defaultImplementations="daffodil daffodil-runtime2"
   defaultRoundTrip="none"
+  defaultValidation="on"
   description="TDML tests for orion-command"
   xmlns:daf="urn:ogf:dfdl:2013:imp:daffodil.apache.org:2018:ext"
   xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"
@@ -38,62 +39,57 @@
   </tdml:defineConfig>
 
   <tdml:parserTestCase
-    description="orion-command CameraState parse test"
     model="orion-command.dfdl.xsd"
-    name="camera_state_parse"
-    root="CameraState">
+    name="command_parse"
+    root="CommandDecl">
     <tdml:document>
-      <tdml:documentPart type="file">camera_state_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">command_parse.dat</tdml:documentPart>
     </tdml:document>
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">camera_state_unparse.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">command_unparse.xml</tdml:dfdlInfoset>
     </tdml:infoset>
   </tdml:parserTestCase>
 
   <tdml:unparserTestCase
-    description="orion-command CameraState unparse test"
     model="orion-command.dfdl.xsd"
-    name="camera_state_unparse"
-    root="CameraState">
+    name="command_unparse"
+    root="CommandDecl">
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">camera_state_unparse.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">command_unparse.xml</tdml:dfdlInfoset>
     </tdml:infoset>
     <tdml:document>
-      <tdml:documentPart type="file">camera_state_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">command_parse.dat</tdml:documentPart>
     </tdml:document>
   </tdml:unparserTestCase>
 
   <tdml:parserTestCase
-    description="orion-command Command parse test"
     model="orion-command.dfdl.xsd"
-    name="command_parse"
-    root="Command">
+    name="camera_state_parse"
+    root="CameraStateDecl">
     <tdml:document>
-      <tdml:documentPart type="file">command_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">camera_state_parse.dat</tdml:documentPart>
     </tdml:document>
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">command_unparse.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">camera_state_unparse.xml</tdml:dfdlInfoset>
     </tdml:infoset>
   </tdml:parserTestCase>
 
   <tdml:unparserTestCase
-    description="orion-command Command unparse test"
     model="orion-command.dfdl.xsd"
-    name="command_unparse"
-    root="Command">
+    name="camera_state_unparse"
+    root="CameraStateDecl">
     <tdml:infoset>
-      <tdml:dfdlInfoset type="file">command_unparse.xml</tdml:dfdlInfoset>
+      <tdml:dfdlInfoset type="file">camera_state_unparse.xml</tdml:dfdlInfoset>
     </tdml:infoset>
     <tdml:document>
-      <tdml:documentPart type="file">command_parse.dat</tdml:documentPart>
+      <tdml:documentPart type="file">camera_state_parse.dat</tdml:documentPart>
     </tdml:document>
   </tdml:unparserTestCase>
 
   <tdml:parserTestCase
-    description="orion-command VideoSettings parse test"
     model="orion-command.dfdl.xsd"
     name="video_settings_parse"
-    root="VideoSettings">
+    root="VideoSettingsDecl">
     <tdml:document>
       <tdml:documentPart type="file">video_settings_parse.dat</tdml:documentPart>
     </tdml:document>
@@ -103,10 +99,9 @@
   </tdml:parserTestCase>
 
   <tdml:unparserTestCase
-    description="orion-command VideoSettings unparse test"
     model="orion-command.dfdl.xsd"
     name="video_settings_unparse"
-    root="VideoSettings">
+    root="VideoSettingsDecl">
     <tdml:infoset>
       <tdml:dfdlInfoset type="file">video_settings_unparse.xml</tdml:dfdlInfoset>
     </tdml:infoset>
@@ -115,4 +110,52 @@
     </tdml:document>
   </tdml:unparserTestCase>
 
+  <tdml:parserTestCase
+    model="orion-command.dfdl.xsd"
+    name="aptina_settings_parse"
+    root="AptinaSettingsDecl">
+    <tdml:document>
+      <tdml:documentPart type="file">aptina_settings_parse.dat</tdml:documentPart>
+    </tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset type="file">aptina_settings_unparse.xml</tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <tdml:unparserTestCase
+    model="orion-command.dfdl.xsd"
+    name="aptina_settings_unparse"
+    root="AptinaSettingsDecl">
+    <tdml:infoset>
+      <tdml:dfdlInfoset type="file">aptina_settings_unparse.xml</tdml:dfdlInfoset>
+    </tdml:infoset>
+    <tdml:document>
+      <tdml:documentPart type="file">aptina_settings_parse.dat</tdml:documentPart>
+    </tdml:document>
+  </tdml:unparserTestCase>
+
+  <tdml:parserTestCase
+    model="orion-command.dfdl.xsd"
+    name="limits_parse"
+    root="LimitsDecl">
+    <tdml:document>
+      <tdml:documentPart type="file">limits_parse.dat</tdml:documentPart>
+    </tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset type="file">limits_unparse.xml</tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <tdml:unparserTestCase
+    model="orion-command.dfdl.xsd"
+    name="limits_unparse"
+    root="LimitsDecl">
+    <tdml:infoset>
+      <tdml:dfdlInfoset type="file">limits_unparse.xml</tdml:dfdlInfoset>
+    </tdml:infoset>
+    <tdml:document>
+      <tdml:documentPart type="file">limits_parse.dat</tdml:documentPart>
+    </tdml:document>
+  </tdml:unparserTestCase>
+
 </tdml:testSuite>
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/video_settings_unparse.xml b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/video_settings_unparse.xml
index 0307283..f23d999 100644
--- a/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/video_settings_unparse.xml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/runtime2/video_settings_unparse.xml
@@ -16,7 +16,7 @@
   limitations under the License.
 -->
 
-<idl:VideoSettings xmlns:idl="urn:idl:1.0">
+<idl:VideoSettingsDecl xmlns:idl="urn:idl:1.0">
   <sync0>208</sync0>
   <sync1>13</sync1>
   <id>98</id>
@@ -34,4 +34,4 @@
   <mjpegQuality>0</mjpegQuality>
   <saveSettingsAndTsPacketCount>0</saveSettingsAndTsPacketCount>
   <checksum>3073</checksum>
-</idl:VideoSettings>
+</idl:VideoSettingsDecl>
diff --git a/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestExNums.scala b/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestExNums.scala
index ba5a060..a52caed 100644
--- a/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestExNums.scala
+++ b/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestExNums.scala
@@ -35,4 +35,5 @@ class TestExNums {
   @Test def test_ex_nums_unparse_runtime1(): Unit = { runner.runOneTest("ex_nums_unparse_runtime1") }
   @Test def test_ex_nums_parse_runtime2(): Unit = { runner.runOneTest("ex_nums_parse_runtime2") }
   @Test def test_ex_nums_unparse_runtime2(): Unit = { runner.runOneTest("ex_nums_unparse_runtime2") }
+  @Test def test_ex_nums_unparse_errors(): Unit = { runner.runOneTest("ex_nums_unparse_errors") }
 }
diff --git a/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestOrionCommand.scala b/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestIsrmGreenToOrange60000.scala
similarity index 56%
copy from daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestOrionCommand.scala
copy to daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestIsrmGreenToOrange60000.scala
index 9cf4546..ba12f18 100644
--- a/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestOrionCommand.scala
+++ b/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestIsrmGreenToOrange60000.scala
@@ -1,7 +1,7 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
+ * this work for additional information ringarding copyright ownership.
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
@@ -17,24 +17,22 @@
 
 package org.apache.daffodil.runtime2
 
-import org.junit.Test
 import org.apache.daffodil.tdml.Runner
 import org.junit.AfterClass
+import org.junit.Test
 
-object TestOrionCommand {
+object TestIsrmGreenToOrange60000 {
   val testDir = "/org/apache/daffodil/runtime2/"
-  val runner = Runner(testDir, "orion-command.tdml")
+  val runner = Runner(testDir, "ISRM_green_to_orange_60000.tdml")
 
   @AfterClass def shutDown(): Unit = { runner.reset }
 }
 
-class TestOrionCommand {
-  import TestOrionCommand._
+class TestIsrmGreenToOrange60000 {
+  import TestIsrmGreenToOrange60000._
 
-  @Test def test_camera_state_parse(): Unit = { runner.runOneTest("camera_state_parse") }
-  @Test def test_camera_state_unparse(): Unit = { runner.runOneTest("camera_state_unparse") }
-  @Test def test_command_parse(): Unit = { runner.runOneTest("command_parse") }
-  @Test def test_command_unparse(): Unit = { runner.runOneTest("command_unparse") }
-  @Test def test_video_settings_parse(): Unit = { runner.runOneTest("video_settings_parse") }
-  @Test def test_video_settings_unparse(): Unit = { runner.runOneTest("video_settings_unparse") }
+  @Test def test_ISRM_green_to_orange_60000_parse_0(): Unit = { runner.runOneTest("ISRM_green_to_orange_60000_parse_0") }
+  @Test def test_ISRM_green_to_orange_60000_unparse_0(): Unit = { runner.runOneTest("ISRM_green_to_orange_60000_unparse_0") }
+  @Test def test_ISRM_green_to_orange_60000_parse_1(): Unit = { runner.runOneTest("ISRM_green_to_orange_60000_parse_1") }
+  @Test def test_ISRM_green_to_orange_60000_unparse_1(): Unit = { runner.runOneTest("ISRM_green_to_orange_60000_unparse_1") }
 }
diff --git a/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestExNums.scala b/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestIsrmOrangeToGreen60002.scala
similarity index 62%
copy from daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestExNums.scala
copy to daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestIsrmOrangeToGreen60002.scala
index ba5a060..752834d 100644
--- a/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestExNums.scala
+++ b/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestIsrmOrangeToGreen60002.scala
@@ -1,7 +1,7 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
+ * this work for additional information ringarding copyright ownership.
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
@@ -17,22 +17,20 @@
 
 package org.apache.daffodil.runtime2
 
-import org.junit.Test
 import org.apache.daffodil.tdml.Runner
 import org.junit.AfterClass
+import org.junit.Test
 
-object TestExNums {
+object TestIsrmOrangeToGreen60002 {
   val testDir = "/org/apache/daffodil/runtime2/"
-  val runner = Runner(testDir, "ex_nums.tdml")
+  val runner = Runner(testDir, "ISRM_orange_to_green_60002.tdml")
 
   @AfterClass def shutDown(): Unit = { runner.reset }
 }
 
-class TestExNums {
-  import TestExNums._
+class TestIsrmOrangeToGreen60002 {
+  import TestIsrmOrangeToGreen60002._
 
-  @Test def test_ex_nums_parse_runtime1(): Unit = { runner.runOneTest("ex_nums_parse_runtime1") }
-  @Test def test_ex_nums_unparse_runtime1(): Unit = { runner.runOneTest("ex_nums_unparse_runtime1") }
-  @Test def test_ex_nums_parse_runtime2(): Unit = { runner.runOneTest("ex_nums_parse_runtime2") }
-  @Test def test_ex_nums_unparse_runtime2(): Unit = { runner.runOneTest("ex_nums_unparse_runtime2") }
+  @Test def test_ISRM_orange_to_green_60002_parse(): Unit = { runner.runOneTest("ISRM_orange_to_green_60002_parse") }
+  @Test def test_ISRM_orange_to_green_60002_unparse(): Unit = { runner.runOneTest("ISRM_orange_to_green_60002_unparse") }
 }
diff --git a/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestExNums.scala b/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestMpuGreenToOrange60004.scala
similarity index 62%
copy from daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestExNums.scala
copy to daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestMpuGreenToOrange60004.scala
index ba5a060..49a716b 100644
--- a/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestExNums.scala
+++ b/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestMpuGreenToOrange60004.scala
@@ -1,7 +1,7 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
+ * this work for additional information ringarding copyright ownership.
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
@@ -17,22 +17,20 @@
 
 package org.apache.daffodil.runtime2
 
-import org.junit.Test
 import org.apache.daffodil.tdml.Runner
 import org.junit.AfterClass
+import org.junit.Test
 
-object TestExNums {
+object TestMpuGreenToOrange60004 {
   val testDir = "/org/apache/daffodil/runtime2/"
-  val runner = Runner(testDir, "ex_nums.tdml")
+  val runner = Runner(testDir, "MPU_green_to_orange_60004.tdml")
 
   @AfterClass def shutDown(): Unit = { runner.reset }
 }
 
-class TestExNums {
-  import TestExNums._
+class TestMpuGreenToOrange60004 {
+  import TestMpuGreenToOrange60004._
 
-  @Test def test_ex_nums_parse_runtime1(): Unit = { runner.runOneTest("ex_nums_parse_runtime1") }
-  @Test def test_ex_nums_unparse_runtime1(): Unit = { runner.runOneTest("ex_nums_unparse_runtime1") }
-  @Test def test_ex_nums_parse_runtime2(): Unit = { runner.runOneTest("ex_nums_parse_runtime2") }
-  @Test def test_ex_nums_unparse_runtime2(): Unit = { runner.runOneTest("ex_nums_unparse_runtime2") }
+  @Test def test_MPU_green_to_orange_60004_parse(): Unit = { runner.runOneTest("MPU_green_to_orange_60004_parse") }
+  @Test def test_MPU_green_to_orange_60004_unparse(): Unit = { runner.runOneTest("MPU_green_to_orange_60004_unparse") }
 }
diff --git a/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestExNums.scala b/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestMpuOrangeToGreen60006.scala
similarity index 57%
copy from daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestExNums.scala
copy to daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestMpuOrangeToGreen60006.scala
index ba5a060..56c67b0 100644
--- a/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestExNums.scala
+++ b/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestMpuOrangeToGreen60006.scala
@@ -1,7 +1,7 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
+ * this work for additional information ringarding copyright ownership.
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
@@ -17,22 +17,22 @@
 
 package org.apache.daffodil.runtime2
 
-import org.junit.Test
 import org.apache.daffodil.tdml.Runner
 import org.junit.AfterClass
+import org.junit.Test
 
-object TestExNums {
+object TestMpuOrangeToGreen60006 {
   val testDir = "/org/apache/daffodil/runtime2/"
-  val runner = Runner(testDir, "ex_nums.tdml")
+  val runner = Runner(testDir, "MPU_orange_to_green_60006.tdml")
 
   @AfterClass def shutDown(): Unit = { runner.reset }
 }
 
-class TestExNums {
-  import TestExNums._
+class TestMpuOrangeToGreen60006 {
+  import TestMpuOrangeToGreen60006._
 
-  @Test def test_ex_nums_parse_runtime1(): Unit = { runner.runOneTest("ex_nums_parse_runtime1") }
-  @Test def test_ex_nums_unparse_runtime1(): Unit = { runner.runOneTest("ex_nums_unparse_runtime1") }
-  @Test def test_ex_nums_parse_runtime2(): Unit = { runner.runOneTest("ex_nums_parse_runtime2") }
-  @Test def test_ex_nums_unparse_runtime2(): Unit = { runner.runOneTest("ex_nums_unparse_runtime2") }
+  @Test def test_MPU_orange_to_green_60006_parse_0(): Unit = { runner.runOneTest("MPU_orange_to_green_60006_parse_0") }
+  @Test def test_MPU_orange_to_green_60006_unparse_0(): Unit = { runner.runOneTest("MPU_orange_to_green_60006_unparse_0") }
+  @Test def test_MPU_orange_to_green_60006_parse_1(): Unit = { runner.runOneTest("MPU_orange_to_green_60006_parse_1") }
+  @Test def test_MPU_orange_to_green_60006_unparse_1(): Unit = { runner.runOneTest("MPU_orange_to_green_60006_unparse_1") }
 }
diff --git a/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestOrionCommand.scala b/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestOrionCommand.scala
index 9cf4546..b5d3f92 100644
--- a/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestOrionCommand.scala
+++ b/daffodil-test/src/test/scala/org/apache/daffodil/runtime2/TestOrionCommand.scala
@@ -31,10 +31,14 @@ object TestOrionCommand {
 class TestOrionCommand {
   import TestOrionCommand._
 
-  @Test def test_camera_state_parse(): Unit = { runner.runOneTest("camera_state_parse") }
-  @Test def test_camera_state_unparse(): Unit = { runner.runOneTest("camera_state_unparse") }
   @Test def test_command_parse(): Unit = { runner.runOneTest("command_parse") }
   @Test def test_command_unparse(): Unit = { runner.runOneTest("command_unparse") }
+  @Test def test_camera_state_parse(): Unit = { runner.runOneTest("camera_state_parse") }
+  @Test def test_camera_state_unparse(): Unit = { runner.runOneTest("camera_state_unparse") }
   @Test def test_video_settings_parse(): Unit = { runner.runOneTest("video_settings_parse") }
   @Test def test_video_settings_unparse(): Unit = { runner.runOneTest("video_settings_unparse") }
+  @Test def test_aptina_settings_parse(): Unit = { runner.runOneTest("aptina_settings_parse") }
+  @Test def test_aptina_settings_unparse(): Unit = { runner.runOneTest("aptina_settings_unparse") }
+  @Test def test_limits_parse(): Unit = { runner.runOneTest("limits_parse") }
+  @Test def test_limits_unparse(): Unit = { runner.runOneTest("limits_unparse") }
 }
diff --git a/project/Rat.scala b/project/Rat.scala
index 577271a..716b6f1 100644
--- a/project/Rat.scala
+++ b/project/Rat.scala
@@ -122,6 +122,13 @@ object Rat {
     file("daffodil-tdml-lib/src/test/resources/test/tdml/test.txt"),
     file("daffodil-tdml-processor/src/test/resources/test/tdml/test.bin"),
     file("daffodil-tdml-processor/src/test/resources/test/tdml/test.txt"),
+    file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000_parse_0.dat"),
+    file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_green_to_orange_60000_parse_1.dat"),
+    file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ISRM_orange_to_green_60002_parse.dat"),
+    file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_green_to_orange_60004_parse.dat"),
+    file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006_parse_0.dat"),
+    file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/MPU_orange_to_green_60006_parse_1.dat"),
+    file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/aptina_settings_parse.dat"),
     file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/camera_state_parse.dat"),
     file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/command_parse.dat"),
     file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/egress_xdcc_bw.dfdl"),
@@ -142,6 +149,7 @@ object Rat {
     file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ingress_xdcc_bw_parse_114.dat"),
     file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ingress_xdcc_bw_parse_115.dat"),
     file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/ingress_xdcc_bw_parse_116.dat"),
+    file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/limits_parse.dat"),
     file("daffodil-test/src/test/resources/org/apache/daffodil/runtime2/video_settings_parse.dat"),
     file("daffodil-test/src/test/resources/org/apache/daffodil/section00/general/ext_file.txt"),
     file("daffodil-test/src/test/resources/org/apache/daffodil/section00/general/ext_file2.txt"),