diff --git a/ragconnect.base/src/main/jastadd/Analysis.jrag b/ragconnect.base/src/main/jastadd/Analysis.jrag
index f3724eab6217b2e76472ee57f8f341ab31730861..f686d3af0009baa0382e8ec3ba2d548b797e85a6 100644
--- a/ragconnect.base/src/main/jastadd/Analysis.jrag
+++ b/ragconnect.base/src/main/jastadd/Analysis.jrag
@@ -62,6 +62,8 @@ aspect Analysis {
   }
   syn String JavaTypeUse.primitivePrettyPrint() {
     switch(getName()) {
+      case "boolean":
+      case "Boolean": return "boolean";
       case "int":
       case "Integer": return "int";
       case "short":
diff --git a/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag b/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag
index 1ef7d167efd07d06d9dbea7ca8d37ba3a30e1186..3479f11728195a2480109343e05292ccb1c6a45e 100644
--- a/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag
+++ b/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag
@@ -20,6 +20,8 @@ aspect DefaultMappings {
     return result;
   }
 
+  syn nta DefaultMappingDefinition RagConnect.defaultBytesToBooleanMapping() = baseDefaultMappingDefinition(
+      "byte[]", "boolean", "return input[0] == (byte) 1;");
   syn nta DefaultMappingDefinition RagConnect.defaultBytesToIntMapping() = baseDefaultMappingDefinition(
       "byte[]", "int", "return java.nio.ByteBuffer.wrap(input).getInt();");
   syn nta DefaultMappingDefinition RagConnect.defaultBytesToShortMapping() = baseDefaultMappingDefinition(
@@ -35,6 +37,8 @@ aspect DefaultMappings {
   syn nta DefaultMappingDefinition RagConnect.defaultBytesToStringMapping() = baseDefaultMappingDefinition(
       "byte[]", "String", "return new String(input);");
 
+  syn nta DefaultMappingDefinition RagConnect.defaultBooleanToBytesMapping() = baseDefaultMappingDefinition(
+        "boolean", "byte[]", "return java.nio.ByteBuffer.allocate(1).put((byte) (input ? 1 : 0)).array();");
   syn nta DefaultMappingDefinition RagConnect.defaultIntToBytesMapping() = baseDefaultMappingDefinition(
       "int", "byte[]", "return java.nio.ByteBuffer.allocate(Integer.BYTES).putInt(input).array();");
   syn nta DefaultMappingDefinition RagConnect.defaultShortToBytesMapping() = baseDefaultMappingDefinition(
@@ -50,6 +54,8 @@ aspect DefaultMappings {
   syn nta DefaultMappingDefinition RagConnect.defaultStringToBytesMapping() = baseDefaultMappingDefinition(
       "String", "byte[]", "return input.getBytes();");
 
+  syn nta DefaultMappingDefinition RagConnect.defaultStringToBooleanMapping() = baseDefaultMappingDefinition(
+      "String", "boolean", "return Boolean.parseBoolean(input);");
   syn nta DefaultMappingDefinition RagConnect.defaultStringToIntMapping() = baseDefaultMappingDefinition(
       "String", "int", "return Integer.parseInt(input);");
   syn nta DefaultMappingDefinition RagConnect.defaultStringToShortMapping() = baseDefaultMappingDefinition(
@@ -63,6 +69,8 @@ aspect DefaultMappings {
   syn nta DefaultMappingDefinition RagConnect.defaultStringToCharMapping() = baseDefaultMappingDefinition(
       "String", "char", "return input.charAt(0);");
 
+  syn nta DefaultMappingDefinition RagConnect.defaultBooleanToStringMapping() = baseDefaultMappingDefinition(
+      "boolean", "String", "return String.valueOf(input);");
   syn nta DefaultMappingDefinition RagConnect.defaultIntToStringMapping() = baseDefaultMappingDefinition(
       "int", "String", "return String.valueOf(input);");
   syn nta DefaultMappingDefinition RagConnect.defaultShortToStringMapping() = baseDefaultMappingDefinition(
@@ -111,6 +119,7 @@ aspect Mappings {
   syn boolean JavaTypeUse.isPrimitiveType() = false;
   eq SimpleJavaTypeUse.isPrimitiveType() {
     switch(getName()) {
+      case "boolean":
       case "int":
       case "short":
       case "long":
@@ -131,6 +140,8 @@ aspect Mappings {
   // --- suitableReceiveDefaultMapping ---
   syn DefaultMappingDefinition EndpointDefinition.suitableReceiveDefaultMapping() {
     switch (targetTypeName()) {
+      case "boolean":
+      case "Boolean": return ragconnect().defaultBytesToBooleanMapping();
       case "int":
       case "Integer": return ragconnect().defaultBytesToIntMapping();
       case "short":
@@ -150,6 +161,8 @@ aspect Mappings {
   // --- suitableSendDefaultMapping ---
   syn DefaultMappingDefinition EndpointDefinition.suitableSendDefaultMapping() {
     switch (targetTypeName()) {
+      case "boolean":
+      case "Boolean": return ragconnect().defaultBooleanToBytesMapping();
       case "int":
       case "Integer": return ragconnect().defaultIntToBytesMapping();
       case "short":
@@ -240,6 +253,7 @@ aspect Mappings {
     java.util.List<MappingDefinition> result = new java.util.ArrayList<>();
     getMappingDefinitionList().iterator().forEachRemaining(result::add);
     // byte[] conversion
+    result.add(defaultBytesToBooleanMapping());
     result.add(defaultBytesToIntMapping());
     result.add(defaultBytesToShortMapping());
     result.add(defaultBytesToLongMapping());
@@ -247,6 +261,7 @@ aspect Mappings {
     result.add(defaultBytesToDoubleMapping());
     result.add(defaultBytesToCharMapping());
     result.add(defaultBytesToStringMapping());
+    result.add(defaultBooleanToBytesMapping());
     result.add(defaultIntToBytesMapping());
     result.add(defaultShortToBytesMapping());
     result.add(defaultLongToBytesMapping());
@@ -255,12 +270,14 @@ aspect Mappings {
     result.add(defaultCharToBytesMapping());
     result.add(defaultStringToBytesMapping());
 //    // string conversion
+//    result.add(defaultStringToBooleanMapping());
 //    result.add(defaultStringToIntMapping());
 //    result.add(defaultStringToShortMapping());
 //    result.add(defaultStringToLongMapping());
 //    result.add(defaultStringToFloatMapping());
 //    result.add(defaultStringToDoubleMapping());
 //    result.add(defaultStringToCharMapping());
+//    result.add(defaultBooleanToStringMapping());
 //    result.add(defaultIntToStringMapping());
 //    result.add(defaultShortToStringMapping());
 //    result.add(defaultLongToStringMapping());
diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
index c7879cf20250fa47aa418da03797aeb71d4e19c1..95e08da36c6f2f3becf3f9f009aec443a3c4d5fa 100644
--- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
@@ -206,7 +206,7 @@ public class Compiler extends AbstractCompiler {
           atLeastOneRagConnect = true;
           break;
         default:
-          throw new CompilerException("Unknown file extension in " + filename);
+          throw new CompilerException("Unknown file extension " + extension + " in " + filename);
       }
     }
     if (!atLeastOneGrammar) {
@@ -218,14 +218,19 @@ public class Compiler extends AbstractCompiler {
     if (!atLeastOneGrammar && !atLeastOneRagConnect) {
       System.exit(1);
     }
+
+    // here, the program subtree is also flushed and resolved
     ragConnect.flushTreeCache();
     ragConnect.treeResolveAll();
+
     ragConnect.additionalRelations().forEach(ragConnectGrammarPart::addDeclaration);
     ASTNode.loggingEnabledForReads = optionLogReads.value();
     ASTNode.loggingEnabledForWrites = optionLogWrites.value();
+
     // reuse "--incremental" option of JastAdd
     ASTNode.incrementalOptionActive = getConfiguration().incremental() && getConfiguration().traceFlush();
     printMessage("ASTNode.incrementalOptionActive = " + ASTNode.incrementalOptionActive);
+
     ASTNode.usesMqtt = optionProtocols.hasValue(OPTION_PROTOCOL_MQTT);
     ASTNode.usesRest = optionProtocols.hasValue(OPTION_PROTOCOL_REST);
     return ragConnect;
@@ -240,7 +245,6 @@ public class Compiler extends AbstractCompiler {
         grammarFile.dumpTree(System.out);
       }
       program.addGrammarFile(grammarFile);
-      grammarFile.treeResolveAll();
       grammarFile.setFileName(toBaseName(filename));
     } catch (IOException | Parser.Exception e) {
       throw new CompilerException("Could not parse grammar file " + filename, e);
diff --git a/ragconnect.tests/build.gradle b/ragconnect.tests/build.gradle
index 1ff5652f946d8a8c7f8b88d03b3e10fa171e00e7..9dd51b5ea7e55128426d5eb25c9c91481d89d427 100644
--- a/ragconnect.tests/build.gradle
+++ b/ragconnect.tests/build.gradle
@@ -84,7 +84,7 @@ task specificTest(type: Test, dependsOn: testClasses) {
     group = 'verification'
 
     useJUnitPlatform {
-        includeTags 'NewTest'
+        includeTags 'SpecificTest'
     }
 }
 
diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect b/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect
index 475d91614073a4a3e8211a5e9e7362c6c832f0e0..69a2165b1dc0ace787a1dbe8143807c90b3197c8 100644
--- a/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect
+++ b/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect
@@ -1,4 +1,5 @@
 // --- update definitions ---
+receive NativeTypes.BooleanValue;
 receive NativeTypes.IntValue;
 receive NativeTypes.ShortValue;
 receive NativeTypes.LongValue;
@@ -7,6 +8,7 @@ receive NativeTypes.DoubleValue;
 receive NativeTypes.CharValue;
 receive NativeTypes.StringValue;
 
+receive NativeTypes.BooleanValueTransformed using BooleanTransformation;
 receive NativeTypes.IntValueTransformed using IntTransformation;
 receive NativeTypes.ShortValueTransformed using ShortTransformation;
 receive NativeTypes.LongValueTransformed using LongTransformation;
@@ -15,6 +17,7 @@ receive NativeTypes.DoubleValueTransformed using DoubleTransformation;
 receive NativeTypes.CharValueTransformed using CharTransformation;
 receive NativeTypes.StringValueTransformed using StringTransformation;
 
+receive BoxedTypes.BooleanValue;
 receive BoxedTypes.IntValue;
 receive BoxedTypes.ShortValue;
 receive BoxedTypes.LongValue;
@@ -22,6 +25,7 @@ receive BoxedTypes.FloatValue;
 receive BoxedTypes.DoubleValue;
 receive BoxedTypes.CharValue;
 
+receive BoxedTypes.BooleanValueTransformed using BooleanTransformation;
 receive BoxedTypes.IntValueTransformed using IntTransformation;
 receive BoxedTypes.ShortValueTransformed using ShortTransformation;
 receive BoxedTypes.LongValueTransformed using LongTransformation;
@@ -29,6 +33,9 @@ receive BoxedTypes.FloatValueTransformed using FloatTransformation;
 receive BoxedTypes.DoubleValueTransformed using DoubleTransformation;
 receive BoxedTypes.CharValueTransformed using CharTransformation;
 
+BooleanTransformation maps boolean b to boolean {:
+  return b;
+:}
 IntTransformation maps int i to int {:
   return i;
 :}
diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.relast b/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.relast
index 750dc0795e39ae42eb10d9ed733ea9a01fc05c26..060d5a5c16e793a20c79d99a267e58833b0c8ac1 100644
--- a/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.relast
+++ b/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.relast
@@ -1,3 +1,3 @@
 A ::= NativeTypes* BoxedTypes* ;
-NativeTypes ::= <IntValue:int> <ShortValue:short> <LongValue:long> <FloatValue:float> <DoubleValue:double> <CharValue:char> <StringValue:String> <IntValueTransformed:int> <ShortValueTransformed:short> <LongValueTransformed:long> <FloatValueTransformed:float> <DoubleValueTransformed:double> <CharValueTransformed:char> <StringValueTransformed:String> ;
-BoxedTypes ::= <IntValue:Integer> <ShortValue:Short> <LongValue:Long> <FloatValue:Float> <DoubleValue:Double> <CharValue:Character> <IntValueTransformed:Integer> <ShortValueTransformed:Short> <LongValueTransformed:Long> <FloatValueTransformed:Float> <DoubleValueTransformed:Double> <CharValueTransformed:Character> ;
+NativeTypes ::= <BooleanValue:boolean> <IntValue:int> <ShortValue:short> <LongValue:long> <FloatValue:float> <DoubleValue:double> <CharValue:char> <StringValue:String> <BooleanValueTransformed:boolean> <IntValueTransformed:int> <ShortValueTransformed:short> <LongValueTransformed:long> <FloatValueTransformed:float> <DoubleValueTransformed:double> <CharValueTransformed:char> <StringValueTransformed:String> ;
+BoxedTypes ::= <BooleanValue:Boolean> <IntValue:Integer> <ShortValue:Short> <LongValue:Long> <FloatValue:Float> <DoubleValue:Double> <CharValue:Character> <BooleanValueTransformed:Boolean> <IntValueTransformed:Integer> <ShortValueTransformed:Short> <LongValueTransformed:Long> <FloatValueTransformed:Float> <DoubleValueTransformed:Double> <CharValueTransformed:Character> ;
diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect
index 076809cf16de0b52b809856e0d17ac0010c8f21f..44ca4ba05574a67b29268a1b4ff61185a30ea15f 100644
--- a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect
+++ b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect
@@ -1,5 +1,6 @@
 // --- update definitions ---
 // native types, synthesized
+send NativeTypesSyn.BooleanValue;
 send NativeTypesSyn.IntValue;
 send NativeTypesSyn.ShortValue;
 send NativeTypesSyn.LongValue;
@@ -9,6 +10,7 @@ send NativeTypesSyn.CharValue;
 send NativeTypesSyn.StringValue;
 
 // native types, synthesized, transformed
+send NativeTypesSyn.BooleanValueTransformed using BooleanTransformation;
 send NativeTypesSyn.IntValueTransformed using IntTransformation;
 send NativeTypesSyn.ShortValueTransformed using ShortTransformation;
 send NativeTypesSyn.LongValueTransformed using LongTransformation;
@@ -18,6 +20,7 @@ send NativeTypesSyn.CharValueTransformed using CharTransformation;
 send NativeTypesSyn.StringValueTransformed using StringTransformation;
 
 // boxed types, synthesized
+send BoxedTypesSyn.BooleanValue;
 send BoxedTypesSyn.IntValue;
 send BoxedTypesSyn.ShortValue;
 send BoxedTypesSyn.LongValue;
@@ -26,6 +29,7 @@ send BoxedTypesSyn.DoubleValue;
 send BoxedTypesSyn.CharValue;
 
 // boxed types, synthesized, transformed
+send BoxedTypesSyn.BooleanValueTransformed using BooleanTransformation;
 send BoxedTypesSyn.IntValueTransformed using IntTransformation;
 send BoxedTypesSyn.ShortValueTransformed using ShortTransformation;
 send BoxedTypesSyn.LongValueTransformed using LongTransformation;
@@ -34,6 +38,7 @@ send BoxedTypesSyn.DoubleValueTransformed using DoubleTransformation;
 send BoxedTypesSyn.CharValueTransformed using CharTransformation;
 
 // --- dependency definitions ---
+NativeTypesSyn.BooleanValue canDependOn NativeTypesSyn.DriverSyn as nativeBooleanDependency;
 NativeTypesSyn.IntValue canDependOn NativeTypesSyn.DriverSyn as nativeIntDependency;
 NativeTypesSyn.ShortValue canDependOn NativeTypesSyn.DriverSyn as nativeShortDependency;
 NativeTypesSyn.LongValue canDependOn NativeTypesSyn.DriverSyn as nativeLongDependency;
@@ -41,6 +46,8 @@ NativeTypesSyn.FloatValue canDependOn NativeTypesSyn.DriverSyn as nativeFloatDep
 NativeTypesSyn.DoubleValue canDependOn NativeTypesSyn.DriverSyn as nativeDoubleDependency;
 NativeTypesSyn.CharValue canDependOn NativeTypesSyn.DriverSyn as nativeCharDependency;
 NativeTypesSyn.StringValue canDependOn NativeTypesSyn.DriverSyn as nativeStringDependency;
+
+BoxedTypesSyn.BooleanValue canDependOn BoxedTypesSyn.DriverSyn as boxedBooleanDependency;
 BoxedTypesSyn.IntValue canDependOn BoxedTypesSyn.DriverSyn as boxedIntDependency;
 BoxedTypesSyn.ShortValue canDependOn BoxedTypesSyn.DriverSyn as boxedShortDependency;
 BoxedTypesSyn.LongValue canDependOn BoxedTypesSyn.DriverSyn as boxedLongDependency;
@@ -48,6 +55,7 @@ BoxedTypesSyn.FloatValue canDependOn BoxedTypesSyn.DriverSyn as boxedFloatDepend
 BoxedTypesSyn.DoubleValue canDependOn BoxedTypesSyn.DriverSyn as boxedDoubleDependency;
 BoxedTypesSyn.CharValue canDependOn BoxedTypesSyn.DriverSyn as boxedCharDependency;
 
+NativeTypesSyn.BooleanValueTransformed canDependOn NativeTypesSyn.DriverSyn as nativeBooleanTransformedDependency;
 NativeTypesSyn.IntValueTransformed canDependOn NativeTypesSyn.DriverSyn as nativeIntTransformedDependency;
 NativeTypesSyn.ShortValueTransformed canDependOn NativeTypesSyn.DriverSyn as nativeShortTransformedDependency;
 NativeTypesSyn.LongValueTransformed canDependOn NativeTypesSyn.DriverSyn as nativeLongTransformedDependency;
@@ -56,6 +64,7 @@ NativeTypesSyn.DoubleValueTransformed canDependOn NativeTypesSyn.DriverSyn as na
 NativeTypesSyn.CharValueTransformed canDependOn NativeTypesSyn.DriverSyn as nativeCharTransformedDependency;
 NativeTypesSyn.StringValueTransformed canDependOn NativeTypesSyn.DriverSyn as nativeStringTransformedDependency;
 
+BoxedTypesSyn.BooleanValueTransformed canDependOn BoxedTypesSyn.DriverSyn as boxedBooleanTransformedDependency;
 BoxedTypesSyn.IntValueTransformed canDependOn BoxedTypesSyn.DriverSyn as boxedIntTransformedDependency;
 BoxedTypesSyn.ShortValueTransformed canDependOn BoxedTypesSyn.DriverSyn as boxedShortTransformedDependency;
 BoxedTypesSyn.LongValueTransformed canDependOn BoxedTypesSyn.DriverSyn as boxedLongTransformedDependency;
@@ -82,6 +91,9 @@ BoxedTypesSyn.CharValueTransformed canDependOn BoxedTypesSyn.DriverSyn as boxedC
 //send BoxedTypesInh.DoubleValue;
 //send BoxedTypesInh.CharValue;
 
+BooleanTransformation maps boolean b to boolean {:
+  return b;
+:}
 IntTransformation maps int i to int {:
   return i;
 :}
diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.jadd b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.jadd
index 1692609251ba21e58d41049a58eadd1efdf4753c..76f3f159b673f1b03c1001a2d7a251bc9ca54dfa 100644
--- a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.jadd
+++ b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.jadd
@@ -1,5 +1,6 @@
 aspect Computation {
   // native types, synthesized
+  syn boolean NativeTypesSyn.getBooleanValue() = Integer.parseInt(getDriverSyn()) > 1;
   syn int NativeTypesSyn.getIntValue() = Integer.parseInt(getDriverSyn());
   syn short NativeTypesSyn.getShortValue() = Short.parseShort(getDriverSyn());
   syn long NativeTypesSyn.getLongValue() = Long.parseLong(getDriverSyn());
@@ -7,6 +8,8 @@ aspect Computation {
   syn double NativeTypesSyn.getDoubleValue() = Double.parseDouble(getDriverSyn());
   syn char NativeTypesSyn.getCharValue() = getDriverSyn().charAt(0);
   syn String NativeTypesSyn.getStringValue() = new String(getDriverSyn());
+
+  syn boolean NativeTypesSyn.getBooleanValueTransformed() = Integer.parseInt(getDriverSyn()) > 1;
   syn int NativeTypesSyn.getIntValueTransformed() = Integer.parseInt(getDriverSyn());
   syn short NativeTypesSyn.getShortValueTransformed() = Short.parseShort(getDriverSyn());
   syn long NativeTypesSyn.getLongValueTransformed() = Long.parseLong(getDriverSyn());
@@ -16,12 +19,15 @@ aspect Computation {
   syn String NativeTypesSyn.getStringValueTransformed() = new String(getDriverSyn());
 
   // boxed types, synthesized
+  syn Boolean BoxedTypesSyn.getBooleanValue() = Integer.parseInt(getDriverSyn()) > 1;
   syn Integer BoxedTypesSyn.getIntValue() = Integer.valueOf(getDriverSyn());
   syn Short BoxedTypesSyn.getShortValue() = Short.valueOf(getDriverSyn());
   syn Long BoxedTypesSyn.getLongValue() = Long.valueOf(getDriverSyn());
   syn Float BoxedTypesSyn.getFloatValue() = Float.valueOf(getDriverSyn());
   syn Double BoxedTypesSyn.getDoubleValue() = Double.valueOf(getDriverSyn());
   syn Character BoxedTypesSyn.getCharValue() = getDriverSyn().charAt(0);
+
+  syn Boolean BoxedTypesSyn.getBooleanValueTransformed() = Integer.parseInt(getDriverSyn()) > 1;
   syn Integer BoxedTypesSyn.getIntValueTransformed() = Integer.valueOf(getDriverSyn());
   syn Short BoxedTypesSyn.getShortValueTransformed() = Short.valueOf(getDriverSyn());
   syn Long BoxedTypesSyn.getLongValueTransformed() = Long.valueOf(getDriverSyn());
diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.relast b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.relast
index 56452539efeeec9cdd67f5e17a61bb0e41061a57..b9203c6ac13736308216c42326551e60dcd6c84c 100644
--- a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.relast
+++ b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.relast
@@ -1,8 +1,8 @@
 A ::= NativeTypesSyn* BoxedTypesSyn* <DriverInh:String>;
 // native types, synthesized
-NativeTypesSyn ::= <DriverSyn:String> /<IntValue:int>/ /<ShortValue:short>/ /<LongValue:long>/ /<FloatValue:float>/ /<DoubleValue:double>/ /<CharValue:char>/ /<StringValue:String>/ /<IntValueTransformed:int>/ /<ShortValueTransformed:short>/ /<LongValueTransformed:long>/ /<FloatValueTransformed:float>/ /<DoubleValueTransformed:double>/ /<CharValueTransformed:char>/ /<StringValueTransformed:String>/ ;
+NativeTypesSyn ::= <DriverSyn:String> /<BooleanValue:boolean>/ /<IntValue:int>/ /<ShortValue:short>/ /<LongValue:long>/ /<FloatValue:float>/ /<DoubleValue:double>/ /<CharValue:char>/ /<StringValue:String>/ /<BooleanValueTransformed:boolean>/ /<IntValueTransformed:int>/ /<ShortValueTransformed:short>/ /<LongValueTransformed:long>/ /<FloatValueTransformed:float>/ /<DoubleValueTransformed:double>/ /<CharValueTransformed:char>/ /<StringValueTransformed:String>/ ;
 // boxed types, synthesized
-BoxedTypesSyn ::= <DriverSyn:String> /<IntValue:Integer>/ /<ShortValue:Short>/ /<LongValue:Long>/ /<FloatValue:Float>/ /<DoubleValue:Double>/ /<CharValue:Character>/ /<IntValueTransformed:Integer>/ /<ShortValueTransformed:Short>/ /<LongValueTransformed:Long>/ /<FloatValueTransformed:Float>/ /<DoubleValueTransformed:Double>/ /<CharValueTransformed:Character>/ ;
+BoxedTypesSyn ::= <DriverSyn:String> /<BooleanValue:Boolean>/ /<IntValue:Integer>/ /<ShortValue:Short>/ /<LongValue:Long>/ /<FloatValue:Float>/ /<DoubleValue:Double>/ /<CharValue:Character>/ /<BooleanValueTransformed:Boolean>/ /<IntValueTransformed:Integer>/ /<ShortValueTransformed:Short>/ /<LongValueTransformed:Long>/ /<FloatValueTransformed:Float>/ /<DoubleValueTransformed:Double>/ /<CharValueTransformed:Character>/ ;
 
 // --- inherited attributes not supported ---
 //// native types, inherited
diff --git a/ragconnect.tests/src/test/01-input/mapping/Test.connect b/ragconnect.tests/src/test/01-input/mapping/Test.connect
index 1b38714a1a61afe69d0b494f0e163e8621d08aab..10f7c839afa6742ed20484e92c1108c6b6d3c1ca 100644
--- a/ragconnect.tests/src/test/01-input/mapping/Test.connect
+++ b/ragconnect.tests/src/test/01-input/mapping/Test.connect
@@ -4,6 +4,7 @@ receive NativeTypes.LongValue using String2Int, Int2Short, Short2Long ;
 receive NativeTypes.FloatValue using String2Int, Int2Short, Short2Long, Long2Float ;
 receive NativeTypes.DoubleValue using String2Int, Int2Short, Short2Long, Long2Float, Float2Double ;
 receive NativeTypes.CharValue using String2Int, Int2Short, Short2Long, Long2Float, Float2Double, Double2Char ;
+receive NativeTypes.BooleanValue using String2Int, Int2Short, Short2Long, Long2Float, Float2Double, Double2Char, Char2Boolean ;
 
 send NativeTypes.WriteIntValue using String2Int ;
 send NativeTypes.WriteShortValue using String2Int, Int2Short ;
@@ -11,6 +12,7 @@ send NativeTypes.WriteLongValue using String2Int, Int2Short, Short2Long ;
 send NativeTypes.WriteFloatValue using String2Int, Int2Short, Short2Long, Long2Float ;
 send NativeTypes.WriteDoubleValue using String2Int, Int2Short, Short2Long, Long2Float, Float2Double ;
 send NativeTypes.WriteCharValue using String2Int, Int2Short, Short2Long, Long2Float, Float2Double, Double2Char ;
+send NativeTypes.WriteBooleanValue using String2Int, Int2Short, Short2Long, Long2Float, Float2Double, Double2Char, Char2Boolean ;
 
 receive BoxedTypes.IntValue using String2Int ;
 receive BoxedTypes.ShortValue using String2Int, Int2Short ;
@@ -18,6 +20,7 @@ receive BoxedTypes.LongValue using String2Int, Int2Short, Short2Long ;
 receive BoxedTypes.FloatValue using String2Int, Int2Short, Short2Long, Long2Float ;
 receive BoxedTypes.DoubleValue using String2Int, Int2Short, Short2Long, Long2Float, Float2Double ;
 receive BoxedTypes.CharValue using String2Int, Int2Short, Short2Long, Long2Float, Float2Double, Double2Char ;
+receive BoxedTypes.BooleanValue using String2Int, Int2Short, Short2Long, Long2Float, Float2Double, Double2Char, Char2Boolean ;
 
 String2Int maps String s to int {:
   return Integer.parseInt(s);
@@ -37,6 +40,9 @@ Float2Double maps float f to double {:
 Double2Char maps double d to char {:
   return (char) ((int) d);
 :}
+Char2Boolean maps char c to boolean {:
+  return c > 21;
+:}
 
 NativeTypes.WriteIntValue canDependOn NativeTypes.Driver as nativeIntDependency;
 NativeTypes.WriteShortValue canDependOn NativeTypes.Driver as nativeShortDependency;
@@ -44,3 +50,4 @@ NativeTypes.WriteLongValue canDependOn NativeTypes.Driver as nativeLongDependenc
 NativeTypes.WriteFloatValue canDependOn NativeTypes.Driver as nativeFloatDependency;
 NativeTypes.WriteDoubleValue canDependOn NativeTypes.Driver as nativeDoubleDependency;
 NativeTypes.WriteCharValue canDependOn NativeTypes.Driver as nativeCharDependency;
+NativeTypes.WriteBooleanValue canDependOn NativeTypes.Driver as nativeBooleanDependency;
diff --git a/ragconnect.tests/src/test/01-input/mapping/Test.jadd b/ragconnect.tests/src/test/01-input/mapping/Test.jadd
index 7837d7dc7328b0b2ec1563e163383fb242190f5b..1ac351565b5f370453e431847f3c42237ec93861 100644
--- a/ragconnect.tests/src/test/01-input/mapping/Test.jadd
+++ b/ragconnect.tests/src/test/01-input/mapping/Test.jadd
@@ -6,4 +6,5 @@ aspect Computation {
   syn String NativeTypes.getWriteFloatValue() = getDriver();
   syn String NativeTypes.getWriteDoubleValue() = getDriver();
   syn String NativeTypes.getWriteCharValue() = getDriver();
+  syn String NativeTypes.getWriteBooleanValue() = getDriver();
 }
diff --git a/ragconnect.tests/src/test/01-input/mapping/Test.relast b/ragconnect.tests/src/test/01-input/mapping/Test.relast
index c15991d5029b783f96b1d0f77fb6c242f0883bf3..718d16768e344af165efc4cfcd1653f9a92f6b02 100644
--- a/ragconnect.tests/src/test/01-input/mapping/Test.relast
+++ b/ragconnect.tests/src/test/01-input/mapping/Test.relast
@@ -1,3 +1,3 @@
 A ::= NativeTypes BoxedTypes ;
-NativeTypes ::= <IntValue:int> <ShortValue:short> <LongValue:long> <FloatValue:float> <DoubleValue:double> <CharValue:char> <Driver:String> /<WriteIntValue:String>/ /<WriteShortValue:String>/ /<WriteLongValue:String>/ /<WriteFloatValue:String>/ /<WriteDoubleValue:String>/ /<WriteCharValue:String>/;
-BoxedTypes ::= <IntValue:Integer> <ShortValue:Short> <LongValue:Long> <FloatValue:Float> <DoubleValue:Double> <CharValue:Character> ;
+NativeTypes ::= <IntValue:int> <ShortValue:short> <LongValue:long> <FloatValue:float> <DoubleValue:double> <CharValue:char> <BooleanValue:boolean> <Driver:String> /<WriteIntValue:String>/ /<WriteShortValue:String>/ /<WriteLongValue:String>/ /<WriteFloatValue:String>/ /<WriteDoubleValue:String>/ /<WriteCharValue:String>/ /<WriteBooleanValue:String>/;
+BoxedTypes ::= <IntValue:Integer> <ShortValue:Short> <LongValue:Long> <FloatValue:Float> <DoubleValue:Double> <CharValue:Character> <BooleanValue:Boolean> ;
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyReadTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyReadTest.java
index 14b26799670088f7b3acf16bb7f6d1946ae8f914..844f35d61b64364aa271a82fe770401f7ab8ba5f 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyReadTest.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyReadTest.java
@@ -6,7 +6,6 @@ import defaultOnlyRead.ast.MqttHandler;
 import defaultOnlyRead.ast.NativeTypes;
 
 import java.io.IOException;
-import java.nio.ByteBuffer;
 import java.util.concurrent.TimeUnit;
 
 import static org.jastadd.ragconnect.tests.TestUtils.mqttUri;
@@ -20,7 +19,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
  */
 public class DefaultOnlyReadTest extends AbstractMqttTest {
 
-  private static final String TOPIC_NATIVE_INT = "native/int";
+  private static final String TOPIC_NATIVE_INT = "native/boolean";
+  private static final String TOPIC_NATIVE_BOOLEAN = "native/int";
   private static final String TOPIC_NATIVE_SHORT = "native/short";
   private static final String TOPIC_NATIVE_LONG = "native/long";
   private static final String TOPIC_NATIVE_FLOAT = "native/float";
@@ -28,6 +28,7 @@ public class DefaultOnlyReadTest extends AbstractMqttTest {
   private static final String TOPIC_NATIVE_CHAR = "native/char";
   private static final String TOPIC_NATIVE_STRING = "native/string";
 
+  private static final String TOPIC_BOXED_BOOLEAN = "boxed/boolean";
   private static final String TOPIC_BOXED_INTEGER = "boxed/Integer";
   private static final String TOPIC_BOXED_SHORT = "boxed/Short";
   private static final String TOPIC_BOXED_LONG = "boxed/Long";
@@ -59,6 +60,7 @@ public class DefaultOnlyReadTest extends AbstractMqttTest {
   protected void setupReceiverAndConnect(boolean writeCurrentValue) throws IOException {
     model.ragconnectSetupMqttWaitUntilReady(2, TimeUnit.SECONDS);
 
+    integers.connectBooleanValue(mqttUri(TOPIC_NATIVE_BOOLEAN));
     integers.connectIntValue(mqttUri(TOPIC_NATIVE_INT));
     integers.connectShortValue(mqttUri(TOPIC_NATIVE_SHORT));
     integers.connectLongValue(mqttUri(TOPIC_NATIVE_LONG));
@@ -67,6 +69,7 @@ public class DefaultOnlyReadTest extends AbstractMqttTest {
     chars.connectCharValue(mqttUri(TOPIC_NATIVE_CHAR));
     chars.connectStringValue(mqttUri(TOPIC_NATIVE_STRING));
 
+    integers.connectBooleanValueTransformed(mqttUri(TOPIC_NATIVE_BOOLEAN));
     integers.connectIntValueTransformed(mqttUri(TOPIC_NATIVE_INT));
     integers.connectShortValueTransformed(mqttUri(TOPIC_NATIVE_SHORT));
     integers.connectLongValueTransformed(mqttUri(TOPIC_NATIVE_LONG));
@@ -75,6 +78,7 @@ public class DefaultOnlyReadTest extends AbstractMqttTest {
     chars.connectCharValueTransformed(mqttUri(TOPIC_NATIVE_CHAR));
     chars.connectStringValueTransformed(mqttUri(TOPIC_NATIVE_STRING));
 
+    allBoxed.connectBooleanValue(mqttUri(TOPIC_BOXED_BOOLEAN));
     allBoxed.connectIntValue(mqttUri(TOPIC_BOXED_INTEGER));
     allBoxed.connectShortValue(mqttUri(TOPIC_BOXED_SHORT));
     allBoxed.connectLongValue(mqttUri(TOPIC_BOXED_LONG));
@@ -82,6 +86,7 @@ public class DefaultOnlyReadTest extends AbstractMqttTest {
     allBoxed.connectDoubleValue(mqttUri(TOPIC_BOXED_DOUBLE));
     allBoxed.connectCharValue(mqttUri(TOPIC_BOXED_CHARACTER));
 
+    allBoxed.connectBooleanValueTransformed(mqttUri(TOPIC_BOXED_BOOLEAN));
     allBoxed.connectIntValueTransformed(mqttUri(TOPIC_BOXED_INTEGER));
     allBoxed.connectShortValueTransformed(mqttUri(TOPIC_BOXED_SHORT));
     allBoxed.connectLongValueTransformed(mqttUri(TOPIC_BOXED_LONG));
@@ -100,6 +105,7 @@ public class DefaultOnlyReadTest extends AbstractMqttTest {
 
   @Override
   protected void communicateOnlyUpdatedValue() throws InterruptedException {
+    final boolean expectedBooleanValue = true;
     final int expectedIntValue = 1;
     final short expectedShortValue = 2;
     final long expectedLongValue = 3L;
@@ -108,23 +114,26 @@ public class DefaultOnlyReadTest extends AbstractMqttTest {
     final char expectedCharValue = 'c';
     final String expectedStringValue = "6.3";
 
-    sender.publish(TOPIC_NATIVE_INT, ByteBuffer.allocate(4).putInt(expectedIntValue).array());
-    sender.publish(TOPIC_NATIVE_SHORT, ByteBuffer.allocate(2).putShort(expectedShortValue).array());
-    sender.publish(TOPIC_NATIVE_LONG, ByteBuffer.allocate(8).putLong(expectedLongValue).array());
-    sender.publish(TOPIC_NATIVE_FLOAT, ByteBuffer.allocate(4).putFloat(expectedFloatValue).array());
-    sender.publish(TOPIC_NATIVE_DOUBLE, ByteBuffer.allocate(8).putDouble(expectedDoubleValue).array());
-    sender.publish(TOPIC_NATIVE_CHAR, ByteBuffer.allocate(2).putChar(expectedCharValue).array());
-    sender.publish(TOPIC_NATIVE_STRING, expectedStringValue.getBytes());
-
-    sender.publish(TOPIC_BOXED_INTEGER, ByteBuffer.allocate(4).putInt(expectedIntValue).array());
-    sender.publish(TOPIC_BOXED_SHORT, ByteBuffer.allocate(2).putShort(expectedShortValue).array());
-    sender.publish(TOPIC_BOXED_LONG, ByteBuffer.allocate(8).putLong(expectedLongValue).array());
-    sender.publish(TOPIC_BOXED_FLOAT, ByteBuffer.allocate(4).putFloat(expectedFloatValue).array());
-    sender.publish(TOPIC_BOXED_DOUBLE, ByteBuffer.allocate(8).putDouble(expectedDoubleValue).array());
-    sender.publish(TOPIC_BOXED_CHARACTER, ByteBuffer.allocate(2).putChar(expectedCharValue).array());
+    sender.publish(TOPIC_NATIVE_BOOLEAN, TestUtils.DefaultMappings.BoolToBytes(expectedBooleanValue));
+    sender.publish(TOPIC_NATIVE_INT, TestUtils.DefaultMappings.IntToBytes(expectedIntValue));
+    sender.publish(TOPIC_NATIVE_SHORT, TestUtils.DefaultMappings.ShortToBytes(expectedShortValue));
+    sender.publish(TOPIC_NATIVE_LONG, TestUtils.DefaultMappings.LongToBytes(expectedLongValue));
+    sender.publish(TOPIC_NATIVE_FLOAT, TestUtils.DefaultMappings.FloatToBytes(expectedFloatValue));
+    sender.publish(TOPIC_NATIVE_DOUBLE, TestUtils.DefaultMappings.DoubleToBytes(expectedDoubleValue));
+    sender.publish(TOPIC_NATIVE_CHAR, TestUtils.DefaultMappings.CharToBytes(expectedCharValue));
+    sender.publish(TOPIC_NATIVE_STRING, TestUtils.DefaultMappings.StringToBytes(expectedStringValue));
+
+    sender.publish(TOPIC_BOXED_BOOLEAN, TestUtils.DefaultMappings.BoolToBytes(expectedBooleanValue));
+    sender.publish(TOPIC_BOXED_INTEGER, TestUtils.DefaultMappings.IntToBytes(expectedIntValue));
+    sender.publish(TOPIC_BOXED_SHORT, TestUtils.DefaultMappings.ShortToBytes(expectedShortValue));
+    sender.publish(TOPIC_BOXED_LONG, TestUtils.DefaultMappings.LongToBytes(expectedLongValue));
+    sender.publish(TOPIC_BOXED_FLOAT, TestUtils.DefaultMappings.FloatToBytes(expectedFloatValue));
+    sender.publish(TOPIC_BOXED_DOUBLE, TestUtils.DefaultMappings.DoubleToBytes(expectedDoubleValue));
+    sender.publish(TOPIC_BOXED_CHARACTER, TestUtils.DefaultMappings.CharToBytes(expectedCharValue));
 
     TestUtils.waitForMqtt();
 
+    assertEquals(expectedBooleanValue, integers.getBooleanValue());
     assertEquals(expectedIntValue, integers.getIntValue());
     assertEquals(expectedShortValue, integers.getShortValue());
     assertEquals(expectedLongValue, integers.getLongValue());
@@ -133,6 +142,7 @@ public class DefaultOnlyReadTest extends AbstractMqttTest {
     assertEquals(expectedCharValue, chars.getCharValue());
     assertEquals(expectedStringValue, chars.getStringValue());
 
+    assertEquals(expectedBooleanValue, integers.getBooleanValueTransformed());
     assertEquals(expectedIntValue, integers.getIntValueTransformed());
     assertEquals(expectedShortValue, integers.getShortValueTransformed());
     assertEquals(expectedLongValue, integers.getLongValueTransformed());
@@ -141,6 +151,7 @@ public class DefaultOnlyReadTest extends AbstractMqttTest {
     assertEquals(expectedCharValue, chars.getCharValueTransformed());
     assertEquals(expectedStringValue, chars.getStringValueTransformed());
 
+    assertEquals(expectedBooleanValue, allBoxed.getBooleanValue());
     assertEquals(expectedIntValue, allBoxed.getIntValue().intValue());
     assertEquals(expectedShortValue, allBoxed.getShortValue().shortValue());
     assertEquals(expectedLongValue, allBoxed.getLongValue().longValue());
@@ -148,6 +159,7 @@ public class DefaultOnlyReadTest extends AbstractMqttTest {
     assertEquals(expectedDoubleValue, allBoxed.getDoubleValue(), TestUtils.DELTA);
     assertEquals(expectedCharValue, allBoxed.getCharValue().charValue());
 
+    assertEquals(expectedBooleanValue, allBoxed.getBooleanValueTransformed());
     assertEquals(expectedIntValue, allBoxed.getIntValueTransformed().intValue());
     assertEquals(expectedShortValue, allBoxed.getShortValueTransformed().shortValue());
     assertEquals(expectedLongValue, allBoxed.getLongValueTransformed().longValue());
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyWriteTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyWriteTest.java
index 3044bb53504018a2586552d60a3c21d0b192f0e2..a5d20afb5a2b98ee5e9aef0fac0102ecced2b15a 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyWriteTest.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyWriteTest.java
@@ -18,6 +18,7 @@ import static org.junit.jupiter.api.Assertions.*;
  */
 public class DefaultOnlyWriteTest extends AbstractMqttTest {
 
+  private static final String TOPIC_NATIVE_BOOLEAN = "native/boolean";
   private static final String TOPIC_NATIVE_INT = "native/int";
   private static final String TOPIC_NATIVE_SHORT = "native/short";
   private static final String TOPIC_NATIVE_LONG = "native/long";
@@ -26,6 +27,7 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
   private static final String TOPIC_NATIVE_CHAR = "native/char";
   private static final String TOPIC_NATIVE_STRING = "native/string";
 
+  private static final String TOPIC_NATIVE_BOOLEAN_TRANSFORMED = "native/boolean/t";
   private static final String TOPIC_NATIVE_INT_TRANSFORMED = "native/int/t";
   private static final String TOPIC_NATIVE_SHORT_TRANSFORMED = "native/short/t";
   private static final String TOPIC_NATIVE_LONG_TRANSFORMED = "native/long/t";
@@ -34,6 +36,7 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
   private static final String TOPIC_NATIVE_CHAR_TRANSFORMED = "native/char/t";
   private static final String TOPIC_NATIVE_STRING_TRANSFORMED = "native/string/t";
 
+  private static final String TOPIC_BOXED_BOOLEAN = "boxed/Boolean";
   private static final String TOPIC_BOXED_INTEGER = "boxed/Integer";
   private static final String TOPIC_BOXED_SHORT = "boxed/Short";
   private static final String TOPIC_BOXED_LONG = "boxed/Long";
@@ -41,6 +44,7 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
   private static final String TOPIC_BOXED_DOUBLE = "boxed/Double";
   private static final String TOPIC_BOXED_CHARACTER = "boxed/Character";
 
+  private static final String TOPIC_BOXED_BOOLEAN_TRANSFORMED = "boxed/Boolean/t";
   private static final String TOPIC_BOXED_INTEGER_TRANSFORMED = "boxed/Integer/t";
   private static final String TOPIC_BOXED_SHORT_TRANSFORMED = "boxed/Short/t";
   private static final String TOPIC_BOXED_LONG_TRANSFORMED = "boxed/Long/t";
@@ -87,6 +91,7 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
     receiver = new MqttHandler().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost());
     assertTrue(receiver.waitUntilReady(2, TimeUnit.SECONDS));
 
+    nativeIntegers.addNativeBooleanDependency(nativeIntegers);
     nativeIntegers.addNativeIntDependency(nativeIntegers);
     nativeIntegers.addNativeShortDependency(nativeIntegers);
     nativeIntegers.addNativeLongDependency(nativeIntegers);
@@ -95,6 +100,7 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
     nativeChars.addNativeCharDependency(nativeChars);
     nativeChars.addNativeStringDependency(nativeChars);
 
+    nativeIntegers.addNativeBooleanTransformedDependency(nativeIntegers);
     nativeIntegers.addNativeIntTransformedDependency(nativeIntegers);
     nativeIntegers.addNativeShortTransformedDependency(nativeIntegers);
     nativeIntegers.addNativeLongTransformedDependency(nativeIntegers);
@@ -103,6 +109,7 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
     nativeChars.addNativeCharTransformedDependency(nativeChars);
     nativeChars.addNativeStringTransformedDependency(nativeChars);
 
+    boxedIntegers.addBoxedBooleanDependency(boxedIntegers);
     boxedIntegers.addBoxedIntDependency(boxedIntegers);
     boxedIntegers.addBoxedShortDependency(boxedIntegers);
     boxedIntegers.addBoxedLongDependency(boxedIntegers);
@@ -110,6 +117,7 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
     boxedFloats.addBoxedDoubleDependency(boxedFloats);
     boxedChars.addBoxedCharDependency(boxedChars);
 
+    boxedIntegers.addBoxedBooleanTransformedDependency(boxedIntegers);
     boxedIntegers.addBoxedIntTransformedDependency(boxedIntegers);
     boxedIntegers.addBoxedShortTransformedDependency(boxedIntegers);
     boxedIntegers.addBoxedLongTransformedDependency(boxedIntegers);
@@ -120,6 +128,7 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
     dataNormal = createReceiver(false);
     dataTransformed = createReceiver(true);
 
+    nativeIntegers.connectBooleanValue(mqttUri(TOPIC_NATIVE_BOOLEAN), writeCurrentValue);
     nativeIntegers.connectIntValue(mqttUri(TOPIC_NATIVE_INT), writeCurrentValue);
     nativeIntegers.connectShortValue(mqttUri(TOPIC_NATIVE_SHORT), writeCurrentValue);
     nativeIntegers.connectLongValue(mqttUri(TOPIC_NATIVE_LONG), writeCurrentValue);
@@ -128,6 +137,7 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
     nativeChars.connectCharValue(mqttUri(TOPIC_NATIVE_CHAR), writeCurrentValue);
     nativeChars.connectStringValue(mqttUri(TOPIC_NATIVE_STRING), writeCurrentValue);
 
+    nativeIntegers.connectBooleanValueTransformed(mqttUri(TOPIC_NATIVE_BOOLEAN_TRANSFORMED), writeCurrentValue);
     nativeIntegers.connectIntValueTransformed(mqttUri(TOPIC_NATIVE_INT_TRANSFORMED), writeCurrentValue);
     nativeIntegers.connectShortValueTransformed(mqttUri(TOPIC_NATIVE_SHORT_TRANSFORMED), writeCurrentValue);
     nativeIntegers.connectLongValueTransformed(mqttUri(TOPIC_NATIVE_LONG_TRANSFORMED), writeCurrentValue);
@@ -136,6 +146,7 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
     nativeChars.connectCharValueTransformed(mqttUri(TOPIC_NATIVE_CHAR_TRANSFORMED), writeCurrentValue);
     nativeChars.connectStringValueTransformed(mqttUri(TOPIC_NATIVE_STRING_TRANSFORMED), writeCurrentValue);
 
+    boxedIntegers.connectBooleanValue(mqttUri(TOPIC_BOXED_BOOLEAN), writeCurrentValue);
     boxedIntegers.connectIntValue(mqttUri(TOPIC_BOXED_INTEGER), writeCurrentValue);
     boxedIntegers.connectShortValue(mqttUri(TOPIC_BOXED_SHORT), writeCurrentValue);
     boxedIntegers.connectLongValue(mqttUri(TOPIC_BOXED_LONG), writeCurrentValue);
@@ -143,6 +154,7 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
     boxedFloats.connectDoubleValue(mqttUri(TOPIC_BOXED_DOUBLE), writeCurrentValue);
     boxedChars.connectCharValue(mqttUri(TOPIC_BOXED_CHARACTER), writeCurrentValue);
 
+    boxedIntegers.connectBooleanValueTransformed(mqttUri(TOPIC_BOXED_BOOLEAN_TRANSFORMED), writeCurrentValue);
     boxedIntegers.connectIntValueTransformed(mqttUri(TOPIC_BOXED_INTEGER_TRANSFORMED), writeCurrentValue);
     boxedIntegers.connectShortValueTransformed(mqttUri(TOPIC_BOXED_SHORT_TRANSFORMED), writeCurrentValue);
     boxedIntegers.connectLongValueTransformed(mqttUri(TOPIC_BOXED_LONG_TRANSFORMED), writeCurrentValue);
@@ -154,57 +166,65 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
   private ReceiverData createReceiver(boolean transformed) {
     ReceiverData result = new ReceiverData();
 
+    receiver.newConnection(transformed ? TOPIC_NATIVE_BOOLEAN_TRANSFORMED : TOPIC_NATIVE_BOOLEAN, bytes -> {
+      result.numberOfNativeBoolValues += 1;
+      result.lastNativeBoolValue = TestUtils.DefaultMappings.BytesToBool(bytes);
+    });
     receiver.newConnection(transformed ? TOPIC_NATIVE_INT_TRANSFORMED : TOPIC_NATIVE_INT, bytes -> {
       result.numberOfNativeIntValues += 1;
-      result.lastNativeIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
+      result.lastNativeIntValue = TestUtils.DefaultMappings.BytesToInt(bytes);
     });
     receiver.newConnection(transformed ? TOPIC_NATIVE_SHORT_TRANSFORMED : TOPIC_NATIVE_SHORT, bytes -> {
       result.numberOfNativeShortValues += 1;
-      result.lastNativeShortValue = java.nio.ByteBuffer.wrap(bytes).getShort();
+      result.lastNativeShortValue = TestUtils.DefaultMappings.BytesToShort(bytes);
     });
     receiver.newConnection(transformed ? TOPIC_NATIVE_LONG_TRANSFORMED : TOPIC_NATIVE_LONG, bytes -> {
       result.numberOfNativeLongValues += 1;
-      result.lastNativeLongValue = java.nio.ByteBuffer.wrap(bytes).getLong();
+      result.lastNativeLongValue = TestUtils.DefaultMappings.BytesToLong(bytes);
     });
     receiver.newConnection(transformed ? TOPIC_NATIVE_FLOAT_TRANSFORMED : TOPIC_NATIVE_FLOAT, bytes -> {
       result.numberOfNativeFloatValues += 1;
-      result.lastNativeFloatValue = java.nio.ByteBuffer.wrap(bytes).getFloat();
+      result.lastNativeFloatValue = TestUtils.DefaultMappings.BytesToFloat(bytes);
     });
     receiver.newConnection(transformed ? TOPIC_NATIVE_DOUBLE_TRANSFORMED : TOPIC_NATIVE_DOUBLE, bytes -> {
       result.numberOfNativeDoubleValues += 1;
-      result.lastNativeDoubleValue = java.nio.ByteBuffer.wrap(bytes).getDouble();
+      result.lastNativeDoubleValue = TestUtils.DefaultMappings.BytesToDouble(bytes);
     });
     receiver.newConnection(transformed ? TOPIC_NATIVE_CHAR_TRANSFORMED : TOPIC_NATIVE_CHAR, bytes -> {
       result.numberOfNativeCharValues += 1;
-      result.lastNativeCharValue = java.nio.ByteBuffer.wrap(bytes).getChar();
+      result.lastNativeCharValue = TestUtils.DefaultMappings.BytesToChar(bytes);
     });
     receiver.newConnection(transformed ? TOPIC_NATIVE_STRING_TRANSFORMED : TOPIC_NATIVE_STRING, bytes -> {
       result.numberOfNativeStringValues += 1;
-      result.lastNativeStringValue = new String(bytes);
+      result.lastNativeStringValue = TestUtils.DefaultMappings.BytesToString(bytes);
+    });
+    receiver.newConnection(transformed ? TOPIC_BOXED_BOOLEAN_TRANSFORMED : TOPIC_BOXED_BOOLEAN, bytes -> {
+      result.numberOfBoxedBoolValues += 1;
+      result.lastBoxedBoolValue = TestUtils.DefaultMappings.BytesToBool(bytes);
     });
     receiver.newConnection(transformed ? TOPIC_BOXED_INTEGER_TRANSFORMED : TOPIC_BOXED_INTEGER, bytes -> {
       result.numberOfBoxedIntValues += 1;
-      result.lastBoxedIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
+      result.lastBoxedIntValue = TestUtils.DefaultMappings.BytesToInt(bytes);
     });
     receiver.newConnection(transformed ? TOPIC_BOXED_SHORT_TRANSFORMED : TOPIC_BOXED_SHORT, bytes -> {
       result.numberOfBoxedShortValues += 1;
-      result.lastBoxedShortValue = java.nio.ByteBuffer.wrap(bytes).getShort();
+      result.lastBoxedShortValue = TestUtils.DefaultMappings.BytesToShort(bytes);
     });
     receiver.newConnection(transformed ? TOPIC_BOXED_LONG_TRANSFORMED : TOPIC_BOXED_LONG, bytes -> {
       result.numberOfBoxedLongValues += 1;
-      result.lastBoxedLongValue = java.nio.ByteBuffer.wrap(bytes).getLong();
+      result.lastBoxedLongValue = TestUtils.DefaultMappings.BytesToLong(bytes);
     });
     receiver.newConnection(transformed ? TOPIC_BOXED_FLOAT_TRANSFORMED : TOPIC_BOXED_FLOAT, bytes -> {
       result.numberOfBoxedFloatValues += 1;
-      result.lastBoxedFloatValue = java.nio.ByteBuffer.wrap(bytes).getFloat();
+      result.lastBoxedFloatValue = TestUtils.DefaultMappings.BytesToFloat(bytes);
     });
     receiver.newConnection(transformed ? TOPIC_BOXED_DOUBLE_TRANSFORMED : TOPIC_BOXED_DOUBLE, bytes -> {
       result.numberOfBoxedDoubleValues += 1;
-      result.lastBoxedDoubleValue = java.nio.ByteBuffer.wrap(bytes).getDouble();
+      result.lastBoxedDoubleValue = TestUtils.DefaultMappings.BytesToDouble(bytes);
     });
     receiver.newConnection(transformed ? TOPIC_BOXED_CHARACTER_TRANSFORMED : TOPIC_BOXED_CHARACTER, bytes -> {
       result.numberOfBoxedCharValues += 1;
-      result.lastBoxedCharValue = java.nio.ByteBuffer.wrap(bytes).getChar();
+      result.lastBoxedCharValue = TestUtils.DefaultMappings.BytesToChar(bytes);
     });
     return result;
   }
@@ -212,37 +232,37 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
   @Override
   protected void communicateSendInitialValue() throws InterruptedException {
     // check initial value
-    checkData(1, 1, 1.1, 'a', "ab");
+    checkData(1, 1, false, 1, 1.1, 'a', "ab");
 
     // set new value
     setData("2", "2.2", "cd");
 
     // check new value
-    checkData(2, 2, 2.2, 'c', "cd");
+    checkData(2, 2, true, 2, 2.2, 'c', "cd");
 
     // set new value
     setData("3", "3.2", "ee");
 
     // check new value
-    checkData(3, 3, 3.2, 'e', "ee");
+    checkData(3, 2, true, 3, 3.2, 'e', "ee");
   }
 
   @Override
   protected void communicateOnlyUpdatedValue() throws InterruptedException {
     // check initial value (will be default values)
-    checkData(0, null, null, null, null);
+    checkData(0, 0, null, null, null, null, null);
 
     // set new value
     setData("2", "2.2", "cd");
 
     // check new value
-    checkData(1, 2, 2.2, 'c', "cd");
+    checkData(1, 1, true, 2, 2.2, 'c', "cd");
 
     // set new value
     setData("3", "3.2", "ee");
 
     // check new value
-    checkData(2, 3, 3.2, 'e', "ee");
+    checkData(2, 1, true, 3, 3.2, 'e', "ee");
   }
 
   @Override
@@ -265,11 +285,12 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
     boxedChars.setDriverSyn(stringDriver);
   }
 
-  private void checkData(int expectedNumberOfValues,
-                         Integer expectedInt, Double expectedDouble,
+  private void checkData(int expectedNumberOfValues, int expectedNumberOfBoolValues,
+                         Boolean expectedBool, Integer expectedInt, Double expectedDouble,
                          Character expectedChar, String expectedString) throws InterruptedException {
     TestUtils.waitForMqtt();
     for (ReceiverData data : new ReceiverData[]{dataNormal, dataTransformed}) {
+      assertEquals(expectedNumberOfBoolValues, data.numberOfNativeBoolValues);
       assertEquals(expectedNumberOfValues, data.numberOfNativeIntValues);
       assertEquals(expectedNumberOfValues, data.numberOfNativeShortValues);
       assertEquals(expectedNumberOfValues, data.numberOfNativeLongValues);
@@ -278,6 +299,7 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
       assertEquals(expectedNumberOfValues, data.numberOfNativeCharValues);
       assertEquals(expectedNumberOfValues, data.numberOfNativeStringValues);
 
+      assertEquals(expectedNumberOfBoolValues, data.numberOfBoxedBoolValues);
       assertEquals(expectedNumberOfValues, data.numberOfBoxedIntValues);
       assertEquals(expectedNumberOfValues, data.numberOfBoxedShortValues);
       assertEquals(expectedNumberOfValues, data.numberOfBoxedLongValues);
@@ -285,6 +307,14 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
       assertEquals(expectedNumberOfValues, data.numberOfBoxedDoubleValues);
       assertEquals(expectedNumberOfValues, data.numberOfBoxedCharValues);
 
+      if (expectedBool != null) {
+        assertEquals(expectedBool, data.lastNativeBoolValue);
+        assertEquals(expectedBool, data.lastBoxedBoolValue);
+      } else {
+        assertFalse(data.lastNativeBoolValue);
+        assertNull(data.lastBoxedBoolValue);
+      }
+
       if (expectedInt != null) {
         assertEquals(expectedInt.intValue(), data.lastNativeIntValue);
         assertEquals(expectedInt.shortValue(), data.lastNativeShortValue);
@@ -325,6 +355,8 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
   }
 
   private static class ReceiverData {
+    boolean lastNativeBoolValue;
+    int numberOfNativeBoolValues = 0;
     int lastNativeIntValue;
     int numberOfNativeIntValues = 0;
     short lastNativeShortValue;
@@ -340,6 +372,8 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
     String lastNativeStringValue;
     int numberOfNativeStringValues = 0;
 
+    Boolean lastBoxedBoolValue;
+    int numberOfBoxedBoolValues = 0;
     Integer lastBoxedIntValue;
     int numberOfBoxedIntValues = 0;
     Short lastBoxedShortValue;
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/IncrementalDependencyTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/IncrementalDependencyTest.java
index 00123e5dbec5cc1a26e3c7d85620b64160943a12..e7d6555ef302f59f8ada8d77a9e6a33c262910cc 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/IncrementalDependencyTest.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/IncrementalDependencyTest.java
@@ -61,15 +61,15 @@ public class IncrementalDependencyTest extends AbstractMqttTest {
 
     handler.newConnection(TOPIC_OUT_A, bytes -> {
       dataA.numberOfStringValues += 1;
-      dataA.lastStringValue = new String(bytes);
+      dataA.lastStringValue = TestUtils.DefaultMappings.BytesToString(bytes);
     });
     handler.newConnection(TOPIC_OUT_B1, bytes -> {
       dataB1.numberOfStringValues += 1;
-      dataB1.lastStringValue = new String(bytes);
+      dataB1.lastStringValue = TestUtils.DefaultMappings.BytesToString(bytes);
     });
     handler.newConnection(TOPIC_OUT_B2, bytes -> {
       dataB2.numberOfStringValues += 1;
-      dataB2.lastStringValue = new String(bytes);
+      dataB2.lastStringValue = TestUtils.DefaultMappings.BytesToString(bytes);
     });
 
     model.connectInput(mqttUri(TOPIC_IN));
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/MappingTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/MappingTest.java
index 84ad0b9e90305e4acbe3a582f403310330c7c9e3..2c7cd6ccf9d0a2ac3ce353fcc025881938194191 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/MappingTest.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/MappingTest.java
@@ -4,7 +4,6 @@ import mapping.ast.A;
 import mapping.ast.BoxedTypes;
 import mapping.ast.MqttHandler;
 import mapping.ast.NativeTypes;
-import org.junit.jupiter.api.Tag;
 
 import java.io.IOException;
 import java.util.concurrent.TimeUnit;
@@ -18,7 +17,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
  *
  * @author rschoene - Initial contribution
  */
-@Tag("NewTest")
 public class MappingTest extends AbstractMqttTest {
 
   private static final String TOPIC_INPUT = "input";
@@ -28,6 +26,7 @@ public class MappingTest extends AbstractMqttTest {
   private static final String TOPIC_WRITE_NATIVE_FLOAT = "native/float";
   private static final String TOPIC_WRITE_NATIVE_DOUBLE = "native/double";
   private static final String TOPIC_WRITE_NATIVE_CHAR = "native/char";
+  private static final String TOPIC_WRITE_NATIVE_BOOLEAN = "native/boolean";
 
   private A model;
   private NativeTypes natives;
@@ -58,31 +57,36 @@ public class MappingTest extends AbstractMqttTest {
     natives.addNativeFloatDependency(natives);
     natives.addNativeDoubleDependency(natives);
     natives.addNativeCharDependency(natives);
+    natives.addNativeBooleanDependency(natives);
 
     data = new ReceiverData();
     handler.newConnection(TOPIC_WRITE_NATIVE_INT, bytes -> {
       data.numberOfNativeIntValues += 1;
-      data.lastNativeIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
+      data.lastNativeIntValue = TestUtils.DefaultMappings.BytesToInt(bytes);
     });
     handler.newConnection(TOPIC_WRITE_NATIVE_SHORT, bytes -> {
       data.numberOfNativeShortValues += 1;
-      data.lastNativeShortValue = java.nio.ByteBuffer.wrap(bytes).getShort();
+      data.lastNativeShortValue = TestUtils.DefaultMappings.BytesToShort(bytes);
     });
     handler.newConnection(TOPIC_WRITE_NATIVE_LONG, bytes -> {
       data.numberOfNativeLongValues += 1;
-      data.lastNativeLongValue = java.nio.ByteBuffer.wrap(bytes).getLong();
+      data.lastNativeLongValue = TestUtils.DefaultMappings.BytesToLong(bytes);
     });
     handler.newConnection(TOPIC_WRITE_NATIVE_FLOAT, bytes -> {
       data.numberOfNativeFloatValues += 1;
-      data.lastNativeFloatValue = java.nio.ByteBuffer.wrap(bytes).getFloat();
+      data.lastNativeFloatValue = TestUtils.DefaultMappings.BytesToFloat(bytes);
     });
     handler.newConnection(TOPIC_WRITE_NATIVE_DOUBLE, bytes -> {
       data.numberOfNativeDoubleValues += 1;
-      data.lastNativeDoubleValue = java.nio.ByteBuffer.wrap(bytes).getDouble();
+      data.lastNativeDoubleValue = TestUtils.DefaultMappings.BytesToDouble(bytes);
     });
     handler.newConnection(TOPIC_WRITE_NATIVE_CHAR, bytes -> {
       data.numberOfNativeCharValues += 1;
-      data.lastNativeCharValue = java.nio.ByteBuffer.wrap(bytes).getChar();
+      data.lastNativeCharValue = TestUtils.DefaultMappings.BytesToChar(bytes);
+    });
+    handler.newConnection(TOPIC_WRITE_NATIVE_BOOLEAN, bytes -> {
+      data.numberOfNativeBooleanValues += 1;
+      data.lastNativeBooleanValue = TestUtils.DefaultMappings.BytesToBool(bytes);
     });
 
     natives.connectWriteIntValue(mqttUri(TOPIC_WRITE_NATIVE_INT), writeCurrentValue);
@@ -91,6 +95,7 @@ public class MappingTest extends AbstractMqttTest {
     natives.connectWriteFloatValue(mqttUri(TOPIC_WRITE_NATIVE_FLOAT), writeCurrentValue);
     natives.connectWriteDoubleValue(mqttUri(TOPIC_WRITE_NATIVE_DOUBLE), writeCurrentValue);
     natives.connectWriteCharValue(mqttUri(TOPIC_WRITE_NATIVE_CHAR), writeCurrentValue);
+    natives.connectWriteBooleanValue(mqttUri(TOPIC_WRITE_NATIVE_BOOLEAN), writeCurrentValue);
 
     natives.connectIntValue(mqttUri(TOPIC_INPUT));
     natives.connectShortValue(mqttUri(TOPIC_INPUT));
@@ -98,6 +103,7 @@ public class MappingTest extends AbstractMqttTest {
     natives.connectFloatValue(mqttUri(TOPIC_INPUT));
     natives.connectDoubleValue(mqttUri(TOPIC_INPUT));
     natives.connectCharValue(mqttUri(TOPIC_INPUT));
+    natives.connectBooleanValue(mqttUri(TOPIC_INPUT));
 
     boxes.connectIntValue(mqttUri(TOPIC_INPUT));
     boxes.connectShortValue(mqttUri(TOPIC_INPUT));
@@ -105,48 +111,49 @@ public class MappingTest extends AbstractMqttTest {
     boxes.connectFloatValue(mqttUri(TOPIC_INPUT));
     boxes.connectDoubleValue(mqttUri(TOPIC_INPUT));
     boxes.connectCharValue(mqttUri(TOPIC_INPUT));
+    boxes.connectBooleanValue(mqttUri(TOPIC_INPUT));
   }
 
   @Override
   protected void communicateSendInitialValue() throws InterruptedException {
-    checkSendData(1, 1, (short) 1, 1, 1.01f, 1.01d, (char) 1);
+    checkSendData(1, 1, (short) 1, 1, 1.01f, 1.01d, (char) 1, 1, false);
     // no check for initial received data (no input set yet)
 
     // send first value
     sendAndSetData("21", "31");
-    checkSendData(2, 21, (short) 21, 21, 21.01f, 21.01d, (char) 21);
-    checkReceiveData(31, (short) 31, 31, 31.01f, 31.01d, (char) 31);
+    checkSendData(2, 21, (short) 21, 21, 21.01f, 21.01d, (char) 21, 1, false);
+    checkReceiveData(31, (short) 31, 31, 31.01f, 31.01d, (char) 31, true);
 
     // send same value
     sendAndSetData("21", "31");
-    checkSendData(2, 21, (short) 21, 21, 21.01f, 21.01d, (char) 21);
-    checkReceiveData(31, (short) 31, 31, 31.01f, 31.01d, (char) 31);
+    checkSendData(2, 21, (short) 21, 21, 21.01f, 21.01d, (char) 21, 1, false);
+    checkReceiveData(31, (short) 31, 31, 31.01f, 31.01d, (char) 31, true);
 
     // send new value
     sendAndSetData("22", "32");
-    checkSendData(3, 22, (short) 22, 22, 22.01f, 22.01d, (char) 22);
-    checkReceiveData(32, (short) 32, 32, 32.01f, 32.01d, (char) 32);
+    checkSendData(3, 22, (short) 22, 22, 22.01f, 22.01d, (char) 22, 2, true);
+    checkReceiveData(32, (short) 32, 32, 32.01f, 32.01d, (char) 32, true);
   }
 
   @Override
   protected void communicateOnlyUpdatedValue() throws InterruptedException {
-    checkSendData(0, 0, (short) 0, 0, 0f, 0d, (char) 0);
+    checkSendData(0, 0, (short) 0, 0, 0f, 0d, (char) 0, 0, false);
     // no check for initial received data (no input set yet)
 
     // send first value
     sendAndSetData("41", "51");
-    checkSendData(1, 41, (short) 41, 41, 41.01f, 41.01d, (char) 41);
-    checkReceiveData(51, (short) 51, 51, 51.01f, 51.01d, (char) 51);
+    checkSendData(1, 41, (short) 41, 41, 41.01f, 41.01d, (char) 41, 1, true);
+    checkReceiveData(51, (short) 51, 51, 51.01f, 51.01d, (char) 51, true);
 
     // send same value
     sendAndSetData("41", "51");
-    checkSendData(1, 41, (short) 41, 41, 41.01f, 41.01d, (char) 41);
-    checkReceiveData(51, (short) 51, 51, 51.01f, 51.01d, (char) 51);
+    checkSendData(1, 41, (short) 41, 41, 41.01f, 41.01d, (char) 41, 1, true);
+    checkReceiveData(51, (short) 51, 51, 51.01f, 51.01d, (char) 51, true);
 
     // send new value
     sendAndSetData("42", "52");
-    checkSendData(2, 42, (short) 42, 42, 42.01f, 42.01d, (char) 42);
-    checkReceiveData(52, (short) 52, 52, 52.01f, 52.01d, (char) 52);
+    checkSendData(2, 42, (short) 42, 42, 42.01f, 42.01d, (char) 42, 1, true);
+    checkReceiveData(52, (short) 52, 52, 52.01f, 52.01d, (char) 52, true);
   }
 
   @Override
@@ -164,7 +171,7 @@ public class MappingTest extends AbstractMqttTest {
     handler.publish(TOPIC_INPUT, input.getBytes());
   }
 
-  private void checkSendData(int expectedNumberOfValues, int expectedInt, short expectedShort, long expectedLong, float expectedFloat, double expectedDouble, char expectedChar) throws InterruptedException {
+  private void checkSendData(int expectedNumberOfValues, int expectedInt, short expectedShort, long expectedLong, float expectedFloat, double expectedDouble, char expectedChar, int expectedNumberOfBooleanValues, boolean expectedBoolean) throws InterruptedException {
     TestUtils.waitForMqtt();
     assertEquals(expectedNumberOfValues, data.numberOfNativeIntValues);
     assertEquals(expectedNumberOfValues, data.numberOfNativeShortValues);
@@ -172,6 +179,7 @@ public class MappingTest extends AbstractMqttTest {
     assertEquals(expectedNumberOfValues, data.numberOfNativeFloatValues);
     assertEquals(expectedNumberOfValues, data.numberOfNativeDoubleValues);
     assertEquals(expectedNumberOfValues, data.numberOfNativeCharValues);
+    assertEquals(expectedNumberOfBooleanValues, data.numberOfNativeBooleanValues);
 
     if (expectedNumberOfValues == 0) {
       return;
@@ -182,15 +190,17 @@ public class MappingTest extends AbstractMqttTest {
     assertEquals(expectedFloat, data.lastNativeFloatValue, TestUtils.DELTA);
     assertEquals(expectedDouble, data.lastNativeDoubleValue, TestUtils.DELTA);
     assertEquals(expectedChar, data.lastNativeCharValue);
+    assertEquals(expectedBoolean, data.lastNativeBooleanValue);
   }
 
-  private void checkReceiveData(int expectedInt, short expectedShort, long expectedLong, float expectedFloat, double expectedDouble, char expectedChar) {
+  private void checkReceiveData(int expectedInt, short expectedShort, long expectedLong, float expectedFloat, double expectedDouble, char expectedChar, boolean expectedBoolean) {
     assertEquals(expectedInt, natives.getIntValue());
     assertEquals(expectedShort, natives.getShortValue());
     assertEquals(expectedLong, natives.getLongValue());
     assertEquals(expectedFloat, natives.getFloatValue(), TestUtils.DELTA);
     assertEquals(expectedDouble, natives.getDoubleValue(), TestUtils.DELTA);
     assertEquals(expectedChar, natives.getCharValue());
+    assertEquals(expectedBoolean, natives.getBooleanValue());
 
     assertEquals(expectedInt, boxes.getIntValue());
     assertEquals(expectedShort, boxes.getShortValue());
@@ -198,6 +208,7 @@ public class MappingTest extends AbstractMqttTest {
     assertEquals(expectedFloat, boxes.getFloatValue(), TestUtils.DELTA);
     assertEquals(expectedDouble, boxes.getDoubleValue(), TestUtils.DELTA);
     assertEquals(expectedChar, boxes.getCharValue());
+    assertEquals(expectedBoolean, boxes.getBooleanValue());
   }
 
   private static class ReceiverData {
@@ -213,6 +224,8 @@ public class MappingTest extends AbstractMqttTest {
     int numberOfNativeDoubleValues = 0;
     char lastNativeCharValue;
     int numberOfNativeCharValues = 0;
+    boolean lastNativeBooleanValue;
+    int numberOfNativeBooleanValues = 0;
   }
 
 }
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read1Write2Test.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read1Write2Test.java
index b51b88ddc8bfccf26ab49a31e173731feea72e27..57db1a70581249d94023a3865264085d4cfa1334 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read1Write2Test.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read1Write2Test.java
@@ -75,29 +75,29 @@ public class Read1Write2Test extends AbstractMqttTest {
 
     handler.newConnection(TOPIC_SAME_WRITE_INT, bytes -> {
       dataSame.numberOfIntValues += 1;
-      dataSame.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
+      dataSame.lastIntValue = TestUtils.DefaultMappings.BytesToInt(bytes);
     });
     handler.newConnection(TOPIC_SAME_WRITE_STRING, bytes -> {
       dataSame.numberOfStringValues += 1;
-      dataSame.lastStringValue = new String(bytes);
+      dataSame.lastStringValue = TestUtils.DefaultMappings.BytesToString(bytes);
     });
 
     handler.newConnection(TOPIC_DIFFERENT_WRITE1_INT, bytes -> {
       dataOther1.numberOfIntValues += 1;
-      dataOther1.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
+      dataOther1.lastIntValue = TestUtils.DefaultMappings.BytesToInt(bytes);
     });
     handler.newConnection(TOPIC_DIFFERENT_WRITE1_STRING, bytes -> {
       dataOther1.numberOfStringValues += 1;
-      dataOther1.lastStringValue = new String(bytes);
+      dataOther1.lastStringValue = TestUtils.DefaultMappings.BytesToString(bytes);
     });
 
     handler.newConnection(TOPIC_DIFFERENT_WRITE2_INT, bytes -> {
       dataOther2.numberOfIntValues += 1;
-      dataOther2.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
+      dataOther2.lastIntValue = TestUtils.DefaultMappings.BytesToInt(bytes);
     });
     handler.newConnection(TOPIC_DIFFERENT_WRITE2_STRING, bytes -> {
       dataOther2.numberOfStringValues += 1;
-      dataOther2.lastStringValue = new String(bytes);
+      dataOther2.lastStringValue = TestUtils.DefaultMappings.BytesToString(bytes);
     });
 
     onSameNonterminal.connectInput(mqttUri(TOPIC_SAME_READ));
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read2Write1Test.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read2Write1Test.java
index b9bce7882d6552fe9da3a55c40bcbedc22429fad..048528bd895d45d4a296907cb4580b72f07f5b02 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read2Write1Test.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read2Write1Test.java
@@ -76,17 +76,17 @@ public class Read2Write1Test extends AbstractMqttTest {
 
     handler.newConnection(TOPIC_SAME_WRITE_INT, bytes -> {
       dataSame.numberOfIntValues += 1;
-      dataSame.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
+      dataSame.lastIntValue = TestUtils.DefaultMappings.BytesToInt(bytes);
     });
 
     handler.newConnection(TOPIC_DIFFERENT_WRITE1_INT, bytes -> {
       dataOther1.numberOfIntValues += 1;
-      dataOther1.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
+      dataOther1.lastIntValue = TestUtils.DefaultMappings.BytesToInt(bytes);
     });
 
     handler.newConnection(TOPIC_DIFFERENT_WRITE2_INT, bytes -> {
       dataOther2.numberOfIntValues += 1;
-      dataOther2.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
+      dataOther2.lastIntValue = TestUtils.DefaultMappings.BytesToInt(bytes);
     });
 
     onSameNonterminal.connectInput1(mqttUri(TOPIC_SAME_READ1));
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java
index 143c74e984af40f9acf883ed7be2f3eb8adb253a..5958b395d7920e70e71bfa6a4f49866dfce4c087 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java
@@ -1,5 +1,7 @@
 package org.jastadd.ragconnect.tests;
 
+import defaultOnlyRead.ast.ASTNode;
+
 import java.io.File;
 import java.io.IOException;
 import java.nio.charset.Charset;
@@ -70,4 +72,136 @@ public class TestUtils {
   static void waitForMqtt() throws InterruptedException {
     TimeUnit.SECONDS.sleep(2);
   }
+
+  @SuppressWarnings({"unused", "rawtypes"})
+  static class DefaultMappings extends ASTNode {
+    public static boolean BytesToBool(byte[] input) {
+      try {
+        return _apply__DefaultBytesToBooleanMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return false;
+      }
+    }
+    public static int BytesToInt(byte[] input) {
+      try {
+        return _apply__DefaultBytesToIntMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return 0;
+      }
+    }
+    public static short BytesToShort(byte[] input) {
+      try {
+        return _apply__DefaultBytesToShortMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return 0;
+      }
+    }
+    public static long BytesToLong(byte[] input) {
+      try {
+        return _apply__DefaultBytesToLongMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return 0;
+      }
+    }
+    public static float BytesToFloat(byte[] input) {
+      try {
+        return _apply__DefaultBytesToFloatMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return 0;
+      }
+    }
+    public static double BytesToDouble(byte[] input) {
+      try {
+        return _apply__DefaultBytesToDoubleMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return 0;
+      }
+    }
+    public static char BytesToChar(byte[] input) {
+      try {
+        return _apply__DefaultBytesToCharMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return 0;
+      }
+    }
+    public static String BytesToString(byte[] input) {
+      try {
+        return _apply__DefaultBytesToStringMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return null;
+      }
+    }
+    public static byte[] BoolToBytes(boolean input) {
+      try {
+        return _apply__DefaultBooleanToBytesMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return null;
+      }
+    }
+    public static byte[] IntToBytes(int input) {
+      try {
+        return _apply__DefaultIntToBytesMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return null;
+      }
+    }
+    public static byte[] ShortToBytes(short input) {
+      try {
+        return _apply__DefaultShortToBytesMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return null;
+      }
+    }
+    public static byte[] LongToBytes(long input) {
+      try {
+        return _apply__DefaultLongToBytesMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return null;
+      }
+    }
+    public static byte[] FloatToBytes(float input) {
+      try {
+        return _apply__DefaultFloatToBytesMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return null;
+      }
+    }
+    public static byte[] DoubleToBytes(double input) {
+      try {
+        return _apply__DefaultDoubleToBytesMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return null;
+      }
+    }
+    public static byte[] CharToBytes(char input) {
+      try {
+        return _apply__DefaultCharToBytesMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return null;
+      }
+    }
+    public static byte[] StringToBytes(String input) {
+      try {
+        return _apply__DefaultStringToBytesMapping(input);
+      } catch (Exception e) {
+        e.printStackTrace();
+        return null;
+      }
+    }
+  }
 }
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TokenValueSendTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TokenValueSendTest.java
index a0c0a24d8e63fb1a53337e31a1f910844954385f..8c8c461df4bfdc8e2d21b9520815fb20807ae240 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TokenValueSendTest.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TokenValueSendTest.java
@@ -71,20 +71,20 @@ public class TokenValueSendTest extends AbstractMqttTest {
 
     handler.newConnection(TOPIC_SEND_ONE, bytes -> {
       dataOne.numberOfStringValues += 1;
-      dataOne.lastStringValue = new String(bytes);
+      dataOne.lastStringValue = TestUtils.DefaultMappings.BytesToString(bytes);
     });
     handler.newConnection(TOPIC_SEND_TWO, bytes -> {
       dataTwo.numberOfStringValues += 1;
-      dataTwo.lastStringValue = new String(bytes);
+      dataTwo.lastStringValue = TestUtils.DefaultMappings.BytesToString(bytes);
     });
 
     handler.newConnection(TOPIC_SEND_THREE_VALUE, bytes -> {
       dataThree.numberOfStringValues += 1;
-      dataThree.lastStringValue = new String(bytes);
+      dataThree.lastStringValue = TestUtils.DefaultMappings.BytesToString(bytes);
     });
     handler.newConnection(TOPIC_SEND_THREE_OTHER, bytes -> {
       dataThreeOther.numberOfStringValues += 1;
-      dataThreeOther.lastStringValue = new String(bytes);
+      dataThreeOther.lastStringValue = TestUtils.DefaultMappings.BytesToString(bytes);
     });
 
     one.connectValue(mqttUri(TOPIC_SEND_ONE), writeCurrentValue);
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ViaTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ViaTest.java
index c3041f7568c08f3bb390decedd2ccfbeeb8e0cbd..766208f725c6a73c6dd391a20cd0b105ac894a77 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ViaTest.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ViaTest.java
@@ -279,15 +279,15 @@ public class ViaTest extends AbstractMqttTest {
 
     handler.newConnection(TOPIC_MQTT_2_MQTT_SEND, bytes -> {
       dataMqtt2Mqtt.numberOfStringValues += 1;
-      dataMqtt2Mqtt.lastStringValue = new String(bytes);
+      dataMqtt2Mqtt.lastStringValue = TestUtils.DefaultMappings.BytesToString(bytes);
     });
     handler.newConnection(TOPIC_REST_2_MQTT_SEND, bytes -> {
       dataRest2Mqtt.numberOfStringValues += 1;
-      dataRest2Mqtt.lastStringValue = new String(bytes);
+      dataRest2Mqtt.lastStringValue = TestUtils.DefaultMappings.BytesToString(bytes);
     });
     handler.newConnection(TOPIC_BOTH_2_MQTT_SEND, bytes -> {
       dataBoth2Mqtt.numberOfStringValues += 1;
-      dataBoth2Mqtt.lastStringValue = new String(bytes);
+      dataBoth2Mqtt.lastStringValue = TestUtils.DefaultMappings.BytesToString(bytes);
     });
 
     Client client = ClientBuilder.newClient();