You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2021/07/06 06:10:30 UTC

[plc4x] branch develop updated: plc4x: unified golang and java xml writing of spi types

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

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 3d27849  plc4x: unified golang and java xml writing of spi types
3d27849 is described below

commit 3d27849d94f57edaf3e5b2d38189e74ba16cfe4e
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Jul 6 08:10:06 2021 +0200

    plc4x: unified golang and java xml writing of spi types
---
 .../testing/protocols/ads/DriverTestsuite.xml      |  42 ++++----
 .../testing/protocols/eip/DriverTestsuite.xml      |   8 +-
 .../testing/protocols/modbus/DriverTestsuite.xml   |  40 +++----
 .../testing/protocols/s7/DriverTestsuite.xml       |  14 +--
 plc4go/internal/plc4go/ads/Field.go                | 117 +++++----------------
 plc4go/internal/plc4go/eip/Field.go                |  35 +++---
 plc4go/internal/plc4go/modbus/Field.go             |  26 ++---
 plc4go/internal/plc4go/s7/Field.go                 |  45 +++-----
 .../plc4go/spi/model/DefaultPlcReadRequest.go      |  29 ++---
 .../plc4go/spi/model/DefaultPlcReadResponse.go     |  54 +++++-----
 .../spi/model/DefaultPlcSubscriptionEvent.go       |  22 ++--
 .../spi/model/DefaultPlcSubscriptionRequest.go     |  29 ++---
 .../spi/model/DefaultPlcSubscriptionResponse.go    |  33 +++---
 .../plc4go/spi/model/DefaultPlcWriteRequest.go     |  64 ++++-------
 .../plc4go/spi/model/DefaultPlcWriteResponse.go    |  31 +++---
 .../plc4go/spi/testutils/DriverTestRunner.go       |  23 ++--
 plc4go/internal/plc4go/spi/testutils/TestUtils.go  |  12 +++
 plc4go/internal/plc4go/spi/values/BINT.go          |  14 +--
 plc4go/internal/plc4go/spi/values/BOOL.go          |  23 +---
 plc4go/internal/plc4go/spi/values/BREAL.go         |  14 ++-
 plc4go/internal/plc4go/spi/values/BYTE.go          |  11 +-
 plc4go/internal/plc4go/spi/values/CHAR.go          |  11 +-
 plc4go/internal/plc4go/spi/values/DATE.go          |   9 +-
 plc4go/internal/plc4go/spi/values/DATE_AND_TIME.go |   9 +-
 plc4go/internal/plc4go/spi/values/DINT.go          |  12 +--
 plc4go/internal/plc4go/spi/values/DWORD.go         |  11 +-
 plc4go/internal/plc4go/spi/values/INT.go           |   9 +-
 plc4go/internal/plc4go/spi/values/LINT.go          |   9 +-
 plc4go/internal/plc4go/spi/values/LREAL.go         |   9 +-
 plc4go/internal/plc4go/spi/values/LTIME.go         |   9 +-
 plc4go/internal/plc4go/spi/values/LWORD.go         |  11 +-
 plc4go/internal/plc4go/spi/values/NULL.go          |  12 ---
 plc4go/internal/plc4go/spi/values/PlcBitString.go  |  23 +---
 plc4go/internal/plc4go/spi/values/PlcByteArray.go  |  16 +--
 plc4go/internal/plc4go/spi/values/PlcList.go       |  31 +++---
 plc4go/internal/plc4go/spi/values/PlcStruct.go     |  28 +++--
 plc4go/internal/plc4go/spi/values/REAL.go          |  13 +--
 plc4go/internal/plc4go/spi/values/RawPlcValue.go   |  14 ---
 plc4go/internal/plc4go/spi/values/SINT.go          |   9 +-
 plc4go/internal/plc4go/spi/values/STRING.go        |  11 +-
 plc4go/internal/plc4go/spi/values/TIME.go          |   9 +-
 plc4go/internal/plc4go/spi/values/TIME_OF_DAY.go   |   9 +-
 plc4go/internal/plc4go/spi/values/UDINT.go         |   9 +-
 plc4go/internal/plc4go/spi/values/UINT.go          |   9 +-
 plc4go/internal/plc4go/spi/values/ULINT.go         |   9 +-
 plc4go/internal/plc4go/spi/values/USINT.go         |   9 +-
 plc4go/internal/plc4go/spi/values/WCHAR.go         |   9 +-
 plc4go/internal/plc4go/spi/values/WORD.go          |  11 +-
 plc4go/internal/plc4go/spi/values/WSTRING.go       |   9 +-
 .../plc4x/java/ads/field/DirectAdsField.java       |   1 +
 .../java/ads/field/SymbolicAdsStringField.java     |   2 +
 .../plc4x/java/eip/readwrite/field/EipField.java   |   1 +
 .../plc4x/java/modbus/field/ModbusField.java       |   1 +
 .../plc4x/java/s7/readwrite/field/S7Field.java     |   3 +
 .../java/spi/generation/WriteBufferXmlBased.java   |  15 ++-
 .../org/apache/plc4x/java/spi/values/PlcBOOL.java  |   8 ++
 .../org/apache/plc4x/java/spi/values/PlcBYTE.java  |   8 ++
 .../plc4x/java/spi/values/PlcBigDecimal.java       |   4 +-
 .../plc4x/java/spi/values/PlcBigInteger.java       |   3 +-
 .../org/apache/plc4x/java/spi/values/PlcCHAR.java  |   9 ++
 .../org/apache/plc4x/java/spi/values/PlcDATE.java  |   4 +-
 .../plc4x/java/spi/values/PlcDATE_AND_TIME.java    |   4 +-
 .../org/apache/plc4x/java/spi/values/PlcDINT.java  |   8 ++
 .../org/apache/plc4x/java/spi/values/PlcDWORD.java |   8 ++
 .../org/apache/plc4x/java/spi/values/PlcINT.java   |  10 +-
 .../org/apache/plc4x/java/spi/values/PlcLINT.java  |   8 ++
 .../org/apache/plc4x/java/spi/values/PlcLREAL.java |   8 ++
 .../org/apache/plc4x/java/spi/values/PlcLTIME.java |   4 +-
 .../org/apache/plc4x/java/spi/values/PlcLWORD.java |   8 ++
 .../org/apache/plc4x/java/spi/values/PlcREAL.java  |   8 ++
 .../org/apache/plc4x/java/spi/values/PlcSINT.java  |   8 ++
 .../apache/plc4x/java/spi/values/PlcSTRING.java    |   4 +-
 .../org/apache/plc4x/java/spi/values/PlcTIME.java  |   4 +-
 .../plc4x/java/spi/values/PlcTIME_OF_DAY.java      |   4 +-
 .../org/apache/plc4x/java/spi/values/PlcUDINT.java |   8 ++
 .../org/apache/plc4x/java/spi/values/PlcUINT.java  |   8 ++
 .../org/apache/plc4x/java/spi/values/PlcULINT.java |   8 ++
 .../org/apache/plc4x/java/spi/values/PlcUSINT.java |   8 ++
 .../org/apache/plc4x/java/spi/values/PlcWCHAR.java |   9 ++
 .../org/apache/plc4x/java/spi/values/PlcWORD.java  |   8 ++
 .../resources/protocols/ads/DriverTestsuite.xml    |  42 ++++----
 .../resources/protocols/eip/DriverTestsuite.xml    |   8 +-
 .../resources/protocols/modbus/DriverTestsuite.xml |  40 +++----
 .../resources/protocols/s7/DriverTestsuite.xml     |  14 +--
 84 files changed, 640 insertions(+), 683 deletions(-)

diff --git a/plc4go/assets/testing/protocols/ads/DriverTestsuite.xml b/plc4go/assets/testing/protocols/ads/DriverTestsuite.xml
index eb7689a..006f5f5 100644
--- a/plc4go/assets/testing/protocols/ads/DriverTestsuite.xml
+++ b/plc4go/assets/testing/protocols/ads/DriverTestsuite.xml
@@ -197,7 +197,7 @@
                   <indexGroup dataType="int" bitLength="64">4040</indexGroup>
                   <indexOffset dataType="int" bitLength="64">8</indexOffset>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </DirectAdsField>
               </hurz>
             </fields>
@@ -205,8 +205,8 @@
           <values>
             <hurz>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcBOOL dataType="string" bitLength="32">true</PlcBOOL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcBOOL dataType="bit" bitLength="1">true</PlcBOOL>
               </ResponseItem>
             </hurz>
           </values>
@@ -401,7 +401,7 @@
                   <indexGroup dataType="int" bitLength="64">4040</indexGroup>
                   <indexOffset dataType="int" bitLength="64">8</indexOffset>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </DirectAdsField>
               </hurz1>
               <hurz2>
@@ -409,7 +409,7 @@
                   <indexGroup dataType="int" bitLength="64">4040</indexGroup>
                   <indexOffset dataType="int" bitLength="64">12</indexOffset>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </DirectAdsField>
               </hurz2>
             </fields>
@@ -417,14 +417,14 @@
           <values>
             <hurz1>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcBOOL dataType="string" bitLength="32">true</PlcBOOL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcBOOL dataType="bit" bitLength="1">true</PlcBOOL>
               </ResponseItem>
             </hurz1>
             <hurz2>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcBOOL dataType="string" bitLength="32">true</PlcBOOL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcBOOL dataType="bit" bitLength="1">true</PlcBOOL>
               </ResponseItem>
             </hurz2>
           </values>
@@ -753,9 +753,9 @@
             <fields>
               <hurz1>
                 <SymbolicAdsField>
-                  <symbolicAddress dataType="string" bitLength="200">main.f_trigDateiGelesen.M</symbolicAddress>
+                  <symbolicAddress dataType="string" bitLength="200" encoding="UTF-8">main.f_trigDateiGelesen.M</symbolicAddress>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </SymbolicAdsField>
               </hurz1>
             </fields>
@@ -763,8 +763,8 @@
           <values>
             <hurz1>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcBOOL dataType="string" bitLength="40">false</PlcBOOL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcBOOL dataType="bit" bitLength="1">false</PlcBOOL>
               </ResponseItem>
             </hurz1>
           </values>
@@ -1094,9 +1094,9 @@
             <fields>
               <hurz1>
                 <SymbolicAdsField>
-                  <symbolicAddress dataType="string" bitLength="200">main.f_trigDateiGelesen.M</symbolicAddress>
+                  <symbolicAddress dataType="string" bitLength="200" encoding="UTF-8">main.f_trigDateiGelesen.M</symbolicAddress>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </SymbolicAdsField>
               </hurz1>
             </fields>
@@ -1104,8 +1104,8 @@
           <values>
             <hurz1>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcBOOL dataType="string" bitLength="40">false</PlcBOOL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcBOOL dataType="bit" bitLength="1">false</PlcBOOL>
               </ResponseItem>
             </hurz1>
           </values>
@@ -1263,9 +1263,9 @@
             <fields>
               <hurz1>
                 <SymbolicAdsField>
-                  <symbolicAddress dataType="string" bitLength="200">main.f_trigDateiGelesen.M</symbolicAddress>
+                  <symbolicAddress dataType="string" bitLength="200" encoding="UTF-8">main.f_trigDateiGelesen.M</symbolicAddress>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </SymbolicAdsField>
               </hurz1>
             </fields>
@@ -1273,8 +1273,8 @@
           <values>
             <hurz1>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcBOOL dataType="string" bitLength="40">false</PlcBOOL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcBOOL dataType="bit" bitLength="1">false</PlcBOOL>
               </ResponseItem>
             </hurz1>
           </values>
diff --git a/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml b/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
index a4addb1..2231728 100644
--- a/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
+++ b/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
@@ -213,9 +213,9 @@
             <fields>
               <hurz>
                 <EipField>
-                  <node dataType="string" bitLength="32">rate</node>
+                  <node dataType="string" bitLength="32" encoding="UTF-8">rate</node>
                   <elementNb dataType="int" bitLength="64">0</elementNb>
-                  <defaultJavaType dataType="string" bitLength="128">java.lang.Object</defaultJavaType>
+                  <defaultJavaType dataType="string" bitLength="128" encoding="UTF-8">java.lang.Object</defaultJavaType>
                 </EipField>
               </hurz>
             </fields>
@@ -223,8 +223,8 @@
           <values>
             <hurz>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcDINT dataType="string" bitLength="72">369229824</PlcDINT>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcDINT dataType="int" bitLength="64">369229824</PlcDINT>
               </ResponseItem>
             </hurz>
           </values>
diff --git a/plc4go/assets/testing/protocols/modbus/DriverTestsuite.xml b/plc4go/assets/testing/protocols/modbus/DriverTestsuite.xml
index 2998551..dd62f42 100644
--- a/plc4go/assets/testing/protocols/modbus/DriverTestsuite.xml
+++ b/plc4go/assets/testing/protocols/modbus/DriverTestsuite.xml
@@ -97,7 +97,7 @@
                 <ModbusFieldHoldingRegister>
                   <address dataType="int" bitLength="64">0</address>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">REAL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
                 </ModbusFieldHoldingRegister>
               </hurz>
             </fields>
@@ -105,8 +105,8 @@
           <values>
             <hurz>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcREAL dataType="string" bitLength="72">3.1415927</PlcREAL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcREAL dataType="float" bitLength="31">3.1415927410125732</PlcREAL>
               </ResponseItem>
             </hurz>
           </values>
@@ -187,7 +187,7 @@
                 <ModbusFieldHoldingRegister>
                   <address dataType="int" bitLength="64">0</address>
                   <numberOfElements dataType="int" bitLength="64">2</numberOfElements>
-                  <dataType dataType="string" bitLength="32">REAL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
                 </ModbusFieldHoldingRegister>
               </hurz>
             </fields>
@@ -195,10 +195,10 @@
           <values>
             <hurz>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
                 <PlcList>
-                  <PlcREAL dataType="string" bitLength="72">3.1415927</PlcREAL>
-                  <PlcREAL dataType="string" bitLength="72">3.1415927</PlcREAL>
+                  <PlcREAL dataType="float" bitLength="31">3.1415927410125732</PlcREAL>
+                  <PlcREAL dataType="float" bitLength="31">3.1415927410125732</PlcREAL>
                 </PlcList>
               </ResponseItem>
             </hurz>
@@ -327,14 +327,14 @@
                 <ModbusFieldHoldingRegister>
                   <address dataType="int" bitLength="64">0</address>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">REAL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
                 </ModbusFieldHoldingRegister>
               </hurz1>
               <hurz2>
                 <ModbusFieldHoldingRegister>
                   <address dataType="int" bitLength="64">2</address>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">REAL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
                 </ModbusFieldHoldingRegister>
               </hurz2>
             </fields>
@@ -342,14 +342,14 @@
           <values>
             <hurz1>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcREAL dataType="string" bitLength="72">3.1415927</PlcREAL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcREAL dataType="float" bitLength="31">3.1415927410125732</PlcREAL>
               </ResponseItem>
             </hurz1>
             <hurz2>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcREAL dataType="string" bitLength="72">3.1415927</PlcREAL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcREAL dataType="float" bitLength="31">3.1415927410125732</PlcREAL>
               </ResponseItem>
             </hurz2>
           </values>
@@ -429,14 +429,14 @@
                 <ModbusFieldHoldingRegister>
                   <address dataType="int" bitLength="64">0</address>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">REAL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
                 </ModbusFieldHoldingRegister>
-                <value dataType="string" bitLength="72">3.1415927</value>
+                <value dataType="string" bitLength="72" encoding="UTF-8">3.1415927</value>
               </hurz>
             </fields>
           </PlcWriteRequest>
           <fields>
-            <hurz dataType="string" bitLength="16">OK</hurz>
+            <hurz dataType="string" bitLength="16" encoding="UTF-8">OK</hurz>
           </fields>
         </PlcWriteResponse>
       </api-response>
@@ -519,15 +519,15 @@
                 <ModbusFieldHoldingRegister>
                   <address dataType="int" bitLength="64">0</address>
                   <numberOfElements dataType="int" bitLength="64">2</numberOfElements>
-                  <dataType dataType="string" bitLength="32">REAL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
                 </ModbusFieldHoldingRegister>
-                <value dataType="string" bitLength="72">3.1415927</value>
-                <value dataType="string" bitLength="72">3.1415927</value>
+                <value dataType="string" bitLength="72" encoding="UTF-8">3.1415927</value>
+                <value dataType="string" bitLength="72" encoding="UTF-8">3.1415927</value>
               </hurz>
             </fields>
           </PlcWriteRequest>
           <fields>
-            <hurz dataType="string" bitLength="16">OK</hurz>
+            <hurz dataType="string" bitLength="16" encoding="UTF-8">OK</hurz>
           </fields>
         </PlcWriteResponse>
       </api-response>
diff --git a/plc4go/assets/testing/protocols/s7/DriverTestsuite.xml b/plc4go/assets/testing/protocols/s7/DriverTestsuite.xml
index 6b5e78c..bfd535f 100644
--- a/plc4go/assets/testing/protocols/s7/DriverTestsuite.xml
+++ b/plc4go/assets/testing/protocols/s7/DriverTestsuite.xml
@@ -535,12 +535,12 @@
             <fields>
               <hurz>
                 <S7Field>
-                  <memoryArea dataType="string" bitLength="56">OUTPUTS</memoryArea>
+                  <memoryArea dataType="string" bitLength="56" encoding="UTF-8">OUTPUTS</memoryArea>
                   <blockNumber dataType="int" bitLength="64">0</blockNumber>
                   <byteOffset dataType="int" bitLength="64">0</byteOffset>
                   <bitOffset dataType="int" bitLength="64">0</bitOffset>
                   <numElements dataType="int" bitLength="64">1</numElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </S7Field>
               </hurz>
             </fields>
@@ -548,8 +548,8 @@
           <values>
             <hurz>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcBOOL dataType="string" bitLength="32">true</PlcBOOL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcBOOL dataType="bit" bitLength="1">true</PlcBOOL>
               </ResponseItem>
             </hurz>
           </values>
@@ -671,12 +671,12 @@
             <fields>
               <hurz>
                 <S7Field>
-                  <memoryArea dataType="string" bitLength="56">OUTPUTS</memoryArea>
+                  <memoryArea dataType="string" bitLength="56" encoding="UTF-8">OUTPUTS</memoryArea>
                   <blockNumber dataType="int" bitLength="64">0</blockNumber>
                   <byteOffset dataType="int" bitLength="64">0</byteOffset>
                   <bitOffset dataType="int" bitLength="64">0</bitOffset>
                   <numElements dataType="int" bitLength="64">1</numElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </S7Field>
               </hurz>
             </fields>
@@ -684,7 +684,7 @@
           <values>
             <hurz>
               <ResponseItem>
-                <result dataType="string" bitLength="104">ACCESS_DENIED</result>
+                <result dataType="string" bitLength="104" encoding="UTF-8">ACCESS_DENIED</result>
               </ResponseItem>
             </hurz>
           </values>
diff --git a/plc4go/internal/plc4go/ads/Field.go b/plc4go/internal/plc4go/ads/Field.go
index 45533d8..cb3cb1c 100644
--- a/plc4go/internal/plc4go/ads/Field.go
+++ b/plc4go/internal/plc4go/ads/Field.go
@@ -23,10 +23,9 @@ import (
 	"encoding/xml"
 	"fmt"
 	model2 "github.com/apache/plc4x/plc4go/internal/plc4go/ads/readwrite/model"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/model"
 	"github.com/pkg/errors"
-	"github.com/rs/zerolog/log"
-	"strconv"
 )
 
 type PlcField struct {
@@ -108,46 +107,36 @@ func castToDirectAdsFieldFromPlcField(plcField model.PlcField) (DirectPlcField,
 	return DirectPlcField{}, errors.Errorf("couldn't %T cast to DirectPlcField", plcField)
 }
 
-func (m DirectPlcField) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	log.Trace().Msg("MarshalXML")
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: m.FieldType.GetName()}}); err != nil {
+func (m DirectPlcField) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext(m.FieldType.GetName()); err != nil {
 		return err
 	}
 
-	if err := e.EncodeElement(m.IndexGroup, xml.StartElement{Name: xml.Name{Local: "indexGroup"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "int"},
-		{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-	}}); err != nil {
+	// TODO: fix types to uint32
+	if err := writeBuffer.WriteInt64("indexGroup", 64, int64(m.IndexGroup)); err != nil {
 		return err
 	}
-	if err := e.EncodeElement(m.IndexOffset, xml.StartElement{Name: xml.Name{Local: "indexOffset"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "int"},
-		{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-	}}); err != nil {
+	if err := writeBuffer.WriteInt64("indexOffset", 64, int64(m.IndexOffset)); err != nil {
 		return err
 	}
-	if m.StringLength > 0 {
-		if err := e.EncodeElement(m.StringLength, xml.StartElement{Name: xml.Name{Local: "stringLength"}, Attr: []xml.Attr{
-			{Name: xml.Name{Local: "dataType"}, Value: "int"},
-			{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-		}}); err != nil {
-			return err
-		}
-	}
-	if err := e.EncodeElement(m.NumberOfElements, xml.StartElement{Name: xml.Name{Local: "numberOfElements"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "int"},
-		{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-	}}); err != nil {
+
+	// TODO: fix types to uint32
+	if err := writeBuffer.WriteInt64("numberOfElements", 64, int64(m.NumberOfElements)); err != nil {
 		return err
 	}
-	if err := e.EncodeElement(m.Datatype.String(), xml.StartElement{Name: xml.Name{Local: "dataType"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "string"},
-		{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len(m.Datatype.String()) * 8)},
-	}}); err != nil {
+
+	if err := writeBuffer.WriteString("dataType", uint8(len([]rune(m.Datatype.String()))*8), "UTF-8", m.Datatype.String()); err != nil {
 		return err
 	}
 
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: m.FieldType.GetName()}}); err != nil {
+	if m.StringLength != 0 {
+		// TODO: fix types to int32
+		if err := writeBuffer.WriteInt64("stringLength", 64, int64(m.StringLength)); err != nil {
+			return err
+		}
+	}
+
+	if err := writeBuffer.PopContext(m.FieldType.GetName()); err != nil {
 		return err
 	}
 	return nil
@@ -200,82 +189,32 @@ func castToSymbolicPlcFieldFromPlcField(plcField model.PlcField) (SymbolicPlcFie
 	return SymbolicPlcField{}, errors.Errorf("couldn't cast %T to SymbolicPlcField", plcField)
 }
 
-func (m SymbolicPlcField) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	log.Trace().Msg("MarshalXML")
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: m.FieldType.GetName()}}); err != nil {
+func (m SymbolicPlcField) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext(m.FieldType.GetName()); err != nil {
 		return err
 	}
 
-	if err := e.EncodeElement(m.SymbolicAddress, xml.StartElement{Name: xml.Name{Local: "symbolicAddress"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "string"},
-		{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len(m.SymbolicAddress) * 8)},
-	}}); err != nil {
-		return err
-	}
-	if m.StringLength > 0 {
-		if err := e.EncodeElement(m.StringLength, xml.StartElement{Name: xml.Name{Local: "stringLength"}}); err != nil {
-			return err
-		}
-	}
-	if err := e.EncodeElement(m.NumberOfElements, xml.StartElement{Name: xml.Name{Local: "numberOfElements"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "int"},
-		{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-	}}); err != nil {
-		return err
-	}
-	if err := e.EncodeElement(m.Datatype.String(), xml.StartElement{Name: xml.Name{Local: "dataType"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "string"},
-		{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len(m.Datatype.String()) * 8)},
-	}}); err != nil {
+	if err := writeBuffer.WriteString("symbolicAddress", uint8(len([]rune(m.SymbolicAddress))*8), "UTF-8", m.SymbolicAddress); err != nil {
 		return err
 	}
 
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: m.FieldType.GetName()}}); err != nil {
+	// TODO: fix types to uint32
+	if err := writeBuffer.WriteInt64("numberOfElements", 64, int64(m.NumberOfElements)); err != nil {
 		return err
 	}
-	return nil
-}
 
-func (m DirectPlcField) banana(e *xml.Encoder, start xml.StartElement) error {
-	log.Trace().Msg("MarshalXML")
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: m.FieldType.GetName()}}); err != nil {
+	if err := writeBuffer.WriteString("dataType", uint8(len([]rune(m.Datatype.String()))*8), "UTF-8", m.Datatype.String()); err != nil {
 		return err
 	}
 
-	if err := e.EncodeElement(m.IndexGroup, xml.StartElement{Name: xml.Name{Local: "indexGroup"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "int"},
-		{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-	}}); err != nil {
-		return err
-	}
-	if err := e.EncodeElement(m.IndexOffset, xml.StartElement{Name: xml.Name{Local: "indexOffset"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "int"},
-		{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-	}}); err != nil {
-		return err
-	}
 	if m.StringLength > 0 {
-		if err := e.EncodeElement(m.StringLength, xml.StartElement{Name: xml.Name{Local: "stringLength"}, Attr: []xml.Attr{
-			{Name: xml.Name{Local: "dataType"}, Value: "int"},
-			{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-		}}); err != nil {
+		// TODO: fix types to int32
+		if err := writeBuffer.WriteInt64("stringLength", 64, int64(m.StringLength)); err != nil {
 			return err
 		}
 	}
-	if err := e.EncodeElement(m.NumberOfElements, xml.StartElement{Name: xml.Name{Local: "numberOfElements"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "int"},
-		{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-	}}); err != nil {
-		return err
-	}
-	if err := e.EncodeElement(m.Datatype.String(), xml.StartElement{Name: xml.Name{Local: "dataType"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "string"},
-		{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len(m.Datatype.String()) * 8)},
-	}}); err != nil {
-		return err
-	}
 
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: m.FieldType.GetName()}}); err != nil {
+	if err := writeBuffer.PopContext(m.FieldType.GetName()); err != nil {
 		return err
 	}
 	return nil
diff --git a/plc4go/internal/plc4go/eip/Field.go b/plc4go/internal/plc4go/eip/Field.go
index b6b8f1e..83c6696 100644
--- a/plc4go/internal/plc4go/eip/Field.go
+++ b/plc4go/internal/plc4go/eip/Field.go
@@ -20,10 +20,8 @@
 package eip
 
 import (
-	"encoding/xml"
 	readWrite "github.com/apache/plc4x/plc4go/internal/plc4go/eip/readwrite/model"
-	"github.com/rs/zerolog/log"
-	"strconv"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 )
 
 type EIPPlcField interface {
@@ -70,41 +68,32 @@ func (m PlcField) GetElementNb() uint16 {
 	return m.ElementNb
 }
 
-func (m PlcField) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	log.Trace().Msg("MarshalXML")
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "EipField"}}); err != nil {
+func (m PlcField) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("EipField"); err != nil {
 		return err
 	}
 
-	if err := e.EncodeElement(m.Tag, xml.StartElement{Name: xml.Name{Local: "node"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "string"},
-		{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len(m.Tag) * 8)},
-	}}); err != nil {
+	if err := writeBuffer.WriteString("node", uint8(len([]rune(m.Tag))*8), "UTF-8", m.Tag); err != nil {
 		return err
 	}
+
 	if m.Type != 0 {
-		if err := e.EncodeElement(m.Type, xml.StartElement{Name: xml.Name{Local: "type"}, Attr: []xml.Attr{
-			{Name: xml.Name{Local: "dataType"}, Value: "string"},
-			{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(int(m.Type.LengthInBits()))},
-		}}); err != nil {
+		if err := writeBuffer.WriteString("type", uint8(len([]rune(m.Type.String()))*8), "UTF-8", m.Type.String()); err != nil {
 			return err
 		}
 	}
-	if err := e.EncodeElement(m.ElementNb, xml.StartElement{Name: xml.Name{Local: "elementNb"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "int"},
-		{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-	}}); err != nil {
+
+	// TODO: fix types to uint16
+	if err := writeBuffer.WriteInt64("elementNb", 64, int64(m.ElementNb)); err != nil {
 		return err
 	}
+
 	// TODO: remove this from the spec
-	if err := e.EncodeElement("java.lang.Object", xml.StartElement{Name: xml.Name{Local: "defaultJavaType"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "string"},
-		{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len("java.lang.Object") * 8)},
-	}}); err != nil {
+	if err := writeBuffer.WriteString("defaultJavaType", uint8(len([]rune("java.lang.Object"))*8), "UTF-8", "java.lang.Object"); err != nil {
 		return err
 	}
 
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "EipField"}}); err != nil {
+	if err := writeBuffer.PopContext("EipField"); err != nil {
 		return err
 	}
 	return nil
diff --git a/plc4go/internal/plc4go/modbus/Field.go b/plc4go/internal/plc4go/modbus/Field.go
index 0e35e80..15d703d 100644
--- a/plc4go/internal/plc4go/modbus/Field.go
+++ b/plc4go/internal/plc4go/modbus/Field.go
@@ -20,9 +20,9 @@
 package modbus
 
 import (
-	"encoding/xml"
 	"fmt"
 	model2 "github.com/apache/plc4x/plc4go/internal/plc4go/modbus/readwrite/model"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/model"
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog/log"
@@ -89,32 +89,24 @@ func CastToModbusFieldFromPlcField(plcField model.PlcField) (PlcField, error) {
 	return PlcField{}, errors.New("couldn't cast to ModbusPlcField")
 }
 
-func (m PlcField) MarshalXML(e *xml.Encoder, _ xml.StartElement) error {
-	log.Trace().Msg("MarshalXML")
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: m.FieldType.GetName()}}); err != nil {
+func (m PlcField) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext(m.FieldType.GetName()); err != nil {
 		return err
 	}
 
-	if err := e.EncodeElement(m.Address, xml.StartElement{Name: xml.Name{Local: "address"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "int"},
-		{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-	}}); err != nil {
+	// TODO: fix types to uint16
+	if err := writeBuffer.WriteInt64("address", 64, int64(m.Address)); err != nil {
 		return err
 	}
-	if err := e.EncodeElement(m.Quantity, xml.StartElement{Name: xml.Name{Local: "numberOfElements"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "int"},
-		{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-	}}); err != nil {
+	if err := writeBuffer.WriteInt64("numberOfElements", 64, int64(m.GetQuantity())); err != nil {
 		return err
 	}
-	if err := e.EncodeElement(m.Datatype.String(), xml.StartElement{Name: xml.Name{Local: "dataType"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "string"},
-		{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len(m.Datatype.String()) * 8)},
-	}}); err != nil {
+	dataType := m.GetDataType().String()
+	if err := writeBuffer.WriteString("dataType", uint8(len([]rune(dataType))*8), "UTF-8", dataType); err != nil {
 		return err
 	}
 
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: m.FieldType.GetName()}}); err != nil {
+	if err := writeBuffer.PopContext(m.FieldType.GetName()); err != nil {
 		return err
 	}
 	return nil
diff --git a/plc4go/internal/plc4go/s7/Field.go b/plc4go/internal/plc4go/s7/Field.go
index cda8bca..abaa392 100644
--- a/plc4go/internal/plc4go/s7/Field.go
+++ b/plc4go/internal/plc4go/s7/Field.go
@@ -20,13 +20,11 @@
 package s7
 
 import (
-	"encoding/xml"
 	"fmt"
 	readWrite "github.com/apache/plc4x/plc4go/internal/plc4go/s7/readwrite/model"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/model"
 	"github.com/pkg/errors"
-	"github.com/rs/zerolog/log"
-	"strconv"
 )
 
 type S7PlcField interface {
@@ -124,50 +122,35 @@ func CastTos7FieldFromPlcField(plcField model.PlcField) (PlcField, error) {
 	return PlcField{}, errors.New("couldn't cast to s7PlcField")
 }
 
-func (m PlcField) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	log.Trace().Msg("MarshalXML")
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: m.FieldType.GetName()}}); err != nil {
+func (m PlcField) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext(m.FieldType.GetName()); err != nil {
 		return err
 	}
 
-	if err := e.EncodeElement(m.MemoryArea.String(), xml.StartElement{Name: xml.Name{Local: "memoryArea"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "string"},
-		{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len(m.MemoryArea.String()) * 8)},
-	}}); err != nil {
+	if err := writeBuffer.WriteString("memoryArea", uint8(len(m.MemoryArea.String())*8), "UTF-8", m.MemoryArea.String()); err != nil {
 		return err
 	}
-	if err := e.EncodeElement(m.BlockNumber, xml.StartElement{Name: xml.Name{Local: "blockNumber"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "int"},
-		{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-	}}); err != nil {
+	// TODO: change to uint16
+	if err := writeBuffer.WriteInt64("blockNumber", 64, int64(m.BlockNumber)); err != nil {
 		return err
 	}
-	if err := e.EncodeElement(m.ByteOffset, xml.StartElement{Name: xml.Name{Local: "byteOffset"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "int"},
-		{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-	}}); err != nil {
+	// TODO: change to uint16
+	if err := writeBuffer.WriteInt64("byteOffset", 64, int64(m.ByteOffset)); err != nil {
 		return err
 	}
-	if err := e.EncodeElement(m.BitOffset, xml.StartElement{Name: xml.Name{Local: "bitOffset"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "int"},
-		{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-	}}); err != nil {
+	// TODO: change to uint16
+	if err := writeBuffer.WriteInt64("bitOffset", 64, int64(m.BitOffset)); err != nil {
 		return err
 	}
-	if err := e.EncodeElement(m.NumElements, xml.StartElement{Name: xml.Name{Local: "numElements"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "int"},
-		{Name: xml.Name{Local: "bitLength"}, Value: "64"},
-	}}); err != nil {
+	// TODO: change to uint16
+	if err := writeBuffer.WriteInt64("numElements", 64, int64(m.NumElements)); err != nil {
 		return err
 	}
-	if err := e.EncodeElement(m.Datatype.String(), xml.StartElement{Name: xml.Name{Local: "dataType"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "string"},
-		{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len(m.Datatype.String()) * 8)},
-	}}); err != nil {
+	if err := writeBuffer.WriteString("dataType", uint8(len(m.Datatype.String())*8), "UTF-8", m.Datatype.String()); err != nil {
 		return err
 	}
 
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: m.FieldType.GetName()}}); err != nil {
+	if err := writeBuffer.PopContext(m.FieldType.GetName()); err != nil {
 		return err
 	}
 	return nil
diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcReadRequest.go b/plc4go/internal/plc4go/spi/model/DefaultPlcReadRequest.go
index 9f2c681..c05c7e5 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultPlcReadRequest.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultPlcReadRequest.go
@@ -20,9 +20,9 @@
 package model
 
 import (
-	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/interceptors"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/model"
 	"github.com/pkg/errors"
 	"time"
@@ -140,31 +140,34 @@ func (m DefaultPlcReadRequest) Execute() <-chan model.PlcReadRequestResult {
 	return resultChannel
 }
 
-func (m DefaultPlcReadRequest) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcReadRequest"}}); err != nil {
+func (m DefaultPlcReadRequest) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcReadRequest"); err != nil {
 		return err
 	}
 
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "fields"}}); err != nil {
+	if err := writeBuffer.PushContext("fields"); err != nil {
 		return err
 	}
-	for _, fieldName := range m.fieldNames {
-		field := m.fields[fieldName]
-		if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: fieldName}}); err != nil {
+	for _, fieldName := range m.GetFieldNames() {
+		if err := writeBuffer.PushContext(fieldName); err != nil {
 			return err
 		}
-		if err := e.EncodeElement(field, xml.StartElement{Name: xml.Name{Local: "field"}}); err != nil {
-			return err
+		field := m.GetField(fieldName)
+		if serializableField, ok := field.(utils.Serializable); ok {
+			if err := serializableField.Serialize(writeBuffer); err != nil {
+				return err
+			}
+		} else {
+			return errors.Errorf("Error serializing. Field %T doesn't implement Serializable", field)
 		}
-		if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: fieldName}}); err != nil {
+		if err := writeBuffer.PopContext(fieldName); err != nil {
 			return err
 		}
 	}
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "fields"}}); err != nil {
+	if err := writeBuffer.PopContext("fields"); err != nil {
 		return err
 	}
-
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "PlcReadRequest"}}); err != nil {
+	if err := writeBuffer.PopContext("PlcReadRequest"); err != nil {
 		return err
 	}
 	return nil
diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcReadResponse.go b/plc4go/internal/plc4go/spi/model/DefaultPlcReadResponse.go
index 30bc4a7..3133ad7 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultPlcReadResponse.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultPlcReadResponse.go
@@ -20,10 +20,10 @@
 package model
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	values2 "github.com/apache/plc4x/plc4go/internal/plc4go/spi/values"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/model"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/values"
-	"strconv"
 )
 
 type DefaultPlcReadResponse struct {
@@ -59,50 +59,56 @@ func (m DefaultPlcReadResponse) GetValue(name string) values.PlcValue {
 	return m.values[name]
 }
 
-func (m DefaultPlcReadResponse) MarshalXML(e *xml.Encoder, _ xml.StartElement) error {
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcReadResponse"}}); err != nil {
+func (m DefaultPlcReadResponse) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcReadResponse"); err != nil {
 		return err
 	}
 
-	if err := e.EncodeElement(m.request, xml.StartElement{Name: xml.Name{Local: "PlcReadRequest"}}); err != nil {
-		return err
+	if request, ok := m.request.(utils.Serializable); ok {
+		if err := request.Serialize(writeBuffer); err != nil {
+			return err
+		}
 	}
-
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "values"}}); err != nil {
+	if err := writeBuffer.PushContext("values"); err != nil {
 		return err
 	}
 	for _, fieldName := range m.GetFieldNames() {
-		if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: fieldName}}); err != nil {
+		if err := writeBuffer.PushContext(fieldName); err != nil {
 			return err
 		}
-		if err := e.EncodeToken(xml.StartElement{
-			Name: xml.Name{Local: "ResponseItem"},
-		}); err != nil {
+		if err := writeBuffer.PushContext("ResponseItem"); err != nil {
 			return err
 		}
-		if err := e.EncodeElement(m.GetResponseCode(fieldName).GetName(), xml.StartElement{Name: xml.Name{Local: "result"}, Attr: []xml.Attr{
-			{Name: xml.Name{Local: "dataType"}, Value: "string"},
-			{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len(m.GetResponseCode(fieldName).GetName()) * 8)},
-		}}); err != nil {
+		codeName := m.GetResponseCode(fieldName).GetName()
+		if err := writeBuffer.WriteString("result", uint8(len([]rune(codeName))*8), "UTF-8", codeName); err != nil {
 			return err
 		}
-		if err := e.EncodeElement(m.GetValue(fieldName), xml.StartElement{Name: xml.Name{Local: "field"}}); err != nil {
+
+		valueResponse := m.GetValue(fieldName)
+		if _, ok := valueResponse.(values2.PlcNULL); ok {
+			// We ignore nulls
+			if err := writeBuffer.PopContext("ResponseItem"); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext(fieldName); err != nil {
+				return err
+			}
+			continue
+		}
+		if err := valueResponse.(utils.Serializable).Serialize(writeBuffer); err != nil {
 			return err
 		}
-		if err := e.EncodeToken(xml.EndElement{
-			Name: xml.Name{Local: "ResponseItem"},
-		}); err != nil {
+		if err := writeBuffer.PopContext("ResponseItem"); err != nil {
 			return err
 		}
-		if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: fieldName}}); err != nil {
+		if err := writeBuffer.PopContext(fieldName); err != nil {
 			return err
 		}
 	}
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "values"}}); err != nil {
+	if err := writeBuffer.PopContext("values"); err != nil {
 		return err
 	}
-
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "PlcReadResponse"}}); err != nil {
+	if err := writeBuffer.PopContext("PlcReadResponse"); err != nil {
 		return err
 	}
 	return nil
diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionEvent.go b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionEvent.go
index 4ef16b4..06f97a7 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionEvent.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionEvent.go
@@ -20,7 +20,7 @@
 package model
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/model"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/values"
 	"time"
@@ -74,30 +74,30 @@ func (m DefaultPlcSubscriptionEvent) GetValue(name string) values.PlcValue {
 	return m.values[name]
 }
 
-func (m DefaultPlcSubscriptionEvent) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcSubscriptionRequest"}}); err != nil {
+func (m DefaultPlcSubscriptionEvent) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcReadResponse"); err != nil {
 		return err
 	}
 
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "fields"}}); err != nil {
+	if err := writeBuffer.PushContext("fields"); err != nil {
 		return err
 	}
-	for fieldName, field := range m.fields {
-		if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: fieldName}}); err != nil {
+	for _, fieldName := range m.GetFieldNames() {
+		if err := writeBuffer.PushContext(fieldName); err != nil {
 			return err
 		}
-		if err := e.EncodeElement(field, xml.StartElement{Name: xml.Name{Local: "field"}}); err != nil {
+		valueResponse := m.GetValue(fieldName)
+		if err := valueResponse.(utils.Serializable).Serialize(writeBuffer); err != nil {
 			return err
 		}
-		if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: fieldName}}); err != nil {
+		if err := writeBuffer.PopContext(fieldName); err != nil {
 			return err
 		}
 	}
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "fields"}}); err != nil {
+	if err := writeBuffer.PopContext("fields"); err != nil {
 		return err
 	}
-
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "PlcSubscriptionRequest"}}); err != nil {
+	if err := writeBuffer.PopContext("PlcReadResponse"); err != nil {
 		return err
 	}
 	return nil
diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionRequest.go b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionRequest.go
index f5b0552..89497f2 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionRequest.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionRequest.go
@@ -20,8 +20,8 @@
 package model
 
 import (
-	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/model"
 	"github.com/pkg/errors"
 	"time"
@@ -151,31 +151,34 @@ func (m DefaultPlcSubscriptionRequest) GetInterval(name string) time.Duration {
 	return m.intervals[name]
 }
 
-func (m DefaultPlcSubscriptionRequest) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcSubscriptionRequest"}}); err != nil {
+func (m DefaultPlcSubscriptionRequest) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcSubscriptionRequest"); err != nil {
 		return err
 	}
 
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "fields"}}); err != nil {
+	if err := writeBuffer.PushContext("fields"); err != nil {
 		return err
 	}
-	for _, fieldName := range m.fieldNames {
-		field := m.fields[fieldName]
-		if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: fieldName}}); err != nil {
+	for _, fieldName := range m.GetFieldNames() {
+		if err := writeBuffer.PushContext(fieldName); err != nil {
 			return err
 		}
-		if err := e.EncodeElement(field, xml.StartElement{Name: xml.Name{Local: "field"}}); err != nil {
-			return err
+		field := m.GetField(fieldName)
+		if serializableField, ok := field.(utils.Serializable); ok {
+			if err := serializableField.Serialize(writeBuffer); err != nil {
+				return err
+			}
+		} else {
+			return errors.New("Error serializing. Field doesn't implement Serializable")
 		}
-		if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: fieldName}}); err != nil {
+		if err := writeBuffer.PopContext(fieldName); err != nil {
 			return err
 		}
 	}
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "fields"}}); err != nil {
+	if err := writeBuffer.PopContext("fields"); err != nil {
 		return err
 	}
-
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "PlcSubscriptionRequest"}}); err != nil {
+	if err := writeBuffer.PopContext("PlcSubscriptionRequest"); err != nil {
 		return err
 	}
 	return nil
diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionResponse.go b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionResponse.go
index 19a1256..9a2a323 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionResponse.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionResponse.go
@@ -20,8 +20,9 @@
 package model
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/model"
+	"github.com/apache/plc4x/plc4go/pkg/plc4go/values"
 )
 
 type DefaultPlcSubscriptionResponse struct {
@@ -51,41 +52,39 @@ func (m DefaultPlcSubscriptionResponse) GetFieldNames() []string {
 	return fieldNames
 }
 
-func (m DefaultPlcSubscriptionResponse) GetValue(name string) interface{} {
+func (m DefaultPlcSubscriptionResponse) GetValue(name string) values.PlcValue {
 	panic("not implemented: implement me")
 }
 
-func (m DefaultPlcSubscriptionResponse) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcReadResponse"}}); err != nil {
+func (m DefaultPlcSubscriptionResponse) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcSubscriptionResponse"); err != nil {
 		return err
 	}
 
-	if err := e.EncodeElement(m.request, xml.StartElement{Name: xml.Name{Local: "PlcReadRequest"}}); err != nil {
-		return err
+	if request, ok := m.request.(utils.Serializable); ok {
+		if err := request.Serialize(writeBuffer); err != nil {
+			return err
+		}
 	}
-
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "values"}}); err != nil {
+	if err := writeBuffer.PushContext("values"); err != nil {
 		return err
 	}
 	for _, fieldName := range m.GetFieldNames() {
-		if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: fieldName},
-			Attr: []xml.Attr{
-				{Name: xml.Name{Local: "result"}, Value: m.GetResponseCode(fieldName).GetName()},
-			}}); err != nil {
+		if err := writeBuffer.PushContext(fieldName); err != nil {
 			return err
 		}
-		if err := e.EncodeElement(m.GetValue(fieldName), xml.StartElement{Name: xml.Name{Local: "field"}}); err != nil {
+		valueResponse := m.GetValue(fieldName)
+		if err := valueResponse.(utils.Serializable).Serialize(writeBuffer); err != nil {
 			return err
 		}
-		if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: fieldName}}); err != nil {
+		if err := writeBuffer.PopContext(fieldName); err != nil {
 			return err
 		}
 	}
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "values"}}); err != nil {
+	if err := writeBuffer.PopContext("values"); err != nil {
 		return err
 	}
-
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "PlcReadResponse"}}); err != nil {
+	if err := writeBuffer.PopContext("PlcSubscriptionResponse"); err != nil {
 		return err
 	}
 	return nil
diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcWriteRequest.go b/plc4go/internal/plc4go/spi/model/DefaultPlcWriteRequest.go
index 6325bd8..6e71eef 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultPlcWriteRequest.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultPlcWriteRequest.go
@@ -20,14 +20,13 @@
 package model
 
 import (
-	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/interceptors"
-	values2 "github.com/apache/plc4x/plc4go/internal/plc4go/spi/values"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	spiValues "github.com/apache/plc4x/plc4go/internal/plc4go/spi/values"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/model"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/values"
 	"github.com/pkg/errors"
-	"strconv"
 	"time"
 )
 
@@ -170,26 +169,30 @@ func (m DefaultPlcWriteRequest) GetValue(name string) values.PlcValue {
 	return m.values[name]
 }
 
-func (m DefaultPlcWriteRequest) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcWriteRequest"}}); err != nil {
+func (m DefaultPlcWriteRequest) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcWriteRequest"); err != nil {
 		return err
 	}
 
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "fields"}}); err != nil {
+	if err := writeBuffer.PushContext("fields"); err != nil {
 		return err
 	}
-	for _, fieldName := range m.fieldNames {
-		field := m.fields[fieldName]
-		value := m.values[fieldName]
-		if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: fieldName}}); err != nil {
+	for _, fieldName := range m.GetFieldNames() {
+		if err := writeBuffer.PushContext(fieldName); err != nil {
 			return err
 		}
-		if err := e.EncodeElement(field, xml.StartElement{Name: xml.Name{Local: "field"}}); err != nil {
-			return err
+		field := m.GetField(fieldName)
+		if serializableField, ok := field.(utils.Serializable); ok {
+			if err := serializableField.Serialize(writeBuffer); err != nil {
+				return err
+			}
+		} else {
+			return errors.New("Error serializing. Field doesn't implement Serializable")
 		}
+		value := m.GetValue(fieldName)
 		switch value.(type) {
-		case values2.PlcList:
-			listValue, ok := value.(values2.PlcList)
+		case spiValues.PlcList:
+			listValue, ok := value.(spiValues.PlcList)
 			if !ok {
 				return errors.New("couldn't cast PlcValue to PlcList")
 			}
@@ -197,45 +200,24 @@ func (m DefaultPlcWriteRequest) MarshalXML(e *xml.Encoder, start xml.StartElemen
 				if !subValue.IsString() {
 					return errors.New("value not serializable to string")
 				}
-				if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "value"}, Attr: []xml.Attr{
-					{Name: xml.Name{Local: "dataType"}, Value: "string"},
-					{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len(subValue.GetString()) * 8)},
-				}}); err != nil {
-					return err
-				}
-				if err := e.EncodeToken(xml.CharData(subValue.GetString())); err != nil {
-					return err
-				}
-				if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "value"}}); err != nil {
+				subValue.GetString()
+				if err := writeBuffer.WriteString("value", uint8(len([]rune(subValue.GetString()))*8), "UTF-8", subValue.GetString()); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "value"}, Attr: []xml.Attr{
-				{Name: xml.Name{Local: "dataType"}, Value: "string"},
-				{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len(value.GetString()) * 8)},
-			}}); err != nil {
-				return err
-			}
-			if !value.IsString() {
-				return errors.New("value not serializable to string")
-			}
-			if err := e.EncodeToken(xml.CharData(value.GetString())); err != nil {
-				return err
-			}
-			if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "value"}}); err != nil {
+			if err := writeBuffer.WriteString("value", uint8(len([]rune(value.GetString()))*8), "UTF-8", value.GetString()); err != nil {
 				return err
 			}
 		}
-		if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: fieldName}}); err != nil {
+		if err := writeBuffer.PopContext(fieldName); err != nil {
 			return err
 		}
 	}
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "fields"}}); err != nil {
+	if err := writeBuffer.PopContext("fields"); err != nil {
 		return err
 	}
-
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "PlcWriteRequest"}}); err != nil {
+	if err := writeBuffer.PopContext("PlcWriteRequest"); err != nil {
 		return err
 	}
 	return nil
diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcWriteResponse.go b/plc4go/internal/plc4go/spi/model/DefaultPlcWriteResponse.go
index db0ee57..442bc40 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultPlcWriteResponse.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultPlcWriteResponse.go
@@ -20,9 +20,8 @@
 package model
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/model"
-	"strconv"
 )
 
 type DefaultPlcWriteResponse struct {
@@ -52,37 +51,31 @@ func (m DefaultPlcWriteResponse) GetRequest() model.PlcWriteRequest {
 	return m.request
 }
 
-func (m DefaultPlcWriteResponse) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcWriteResponse"}}); err != nil {
+func (m DefaultPlcWriteResponse) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcWriteResponse"); err != nil {
 		return err
 	}
 
-	if err := e.EncodeElement(m.request, xml.StartElement{Name: xml.Name{Local: "PlcWriteRequest"}}); err != nil {
-		return err
+	if serializableRequest, ok := m.request.(utils.Serializable); ok {
+		if err := serializableRequest.Serialize(writeBuffer); err != nil {
+			return err
+		}
 	}
 
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "fields"}}); err != nil {
+	if err := writeBuffer.PushContext("fields"); err != nil {
 		return err
 	}
 	for _, fieldName := range m.GetFieldNames() {
-		if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: fieldName}, Attr: []xml.Attr{
-			{Name: xml.Name{Local: "dataType"}, Value: "string"},
-			{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len(m.GetResponseCode(fieldName).GetName()) * 8)},
-		}}); err != nil {
-			return err
-		}
-		if err := e.EncodeToken(xml.CharData(m.GetResponseCode(fieldName).GetName())); err != nil {
-			return err
-		}
-		if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: fieldName}}); err != nil {
+		responseCodeName := m.GetResponseCode(fieldName).GetName()
+		if err := writeBuffer.WriteString(fieldName, uint8(len([]rune(responseCodeName))*8), "UTF-8", responseCodeName); err != nil {
 			return err
 		}
 	}
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "fields"}}); err != nil {
+	if err := writeBuffer.PopContext("fields"); err != nil {
 		return err
 	}
 
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "PlcWriteResponse"}}); err != nil {
+	if err := writeBuffer.PopContext("PlcWriteResponse"); err != nil {
 		return err
 	}
 	return nil
diff --git a/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go b/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
index 0f76e29..e534c20 100644
--- a/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
+++ b/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
@@ -21,7 +21,6 @@ package testutils
 
 import (
 	"encoding/hex"
-	"encoding/xml"
 	"fmt"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/transports"
@@ -216,14 +215,16 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 				return errors.Wrap(readRequestResult.Err, "error sending response")
 			}
 			// Serialize the response to XML
-			actualResponse, err := xml.Marshal(readRequestResult.Response)
+			xmlWriteBuffer := utils.NewXmlWriteBuffer()
+			err := readRequestResult.Response.(utils.Serializable).Serialize(xmlWriteBuffer)
 			if err != nil {
 				return errors.Wrap(err, "error serializing response")
 			}
+			actualResponse := xmlWriteBuffer.GetXmlString()
 			// Get the reference XML
-			referenceSerialized := step.payload.XML()
+			referenceSerialized := step.payload.XMLPretty()
 			// Compare the results
-			err = CompareResults(actualResponse, []byte(referenceSerialized))
+			err = CompareResults([]byte(actualResponse), []byte(referenceSerialized))
 			if err != nil {
 				return errors.Wrap(err, "Error comparing the results")
 			}
@@ -239,14 +240,16 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 				return errors.Wrap(writeResponseResult.Err, "error sending response")
 			}
 			// Serialize the response to XML
-			actualResponse, err := xml.Marshal(writeResponseResult.Response)
+			xmlWriteBuffer := utils.NewXmlWriteBuffer()
+			err := writeResponseResult.Response.(utils.Serializable).Serialize(xmlWriteBuffer)
 			if err != nil {
 				return errors.Wrap(err, "error serializing response")
 			}
+			actualResponse := xmlWriteBuffer.GetXmlString()
 			// Get the reference XML
-			referenceSerialized := step.payload.XML()
+			referenceSerialized := step.payload.XMLPretty()
 			// Compare the results
-			err = CompareResults(actualResponse, []byte(referenceSerialized))
+			err = CompareResults([]byte(actualResponse), []byte(referenceSerialized))
 			if err != nil {
 				return errors.Wrap(err, "Error comparing the results")
 			}
@@ -255,7 +258,7 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 		}
 	case StepTypeOutgoingPlcMessage:
 		typeName := step.payload.Name
-		payloadString := step.payload.XML()
+		payloadString := step.payload.XMLPretty()
 
 		// Parse the xml into a real model
 		log.Trace().Msg("parsing xml")
@@ -341,7 +344,7 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 		// If there's a difference, parse the input and display it to simplify debugging
 	case StepTypeIncomingPlcMessage:
 		typeName := step.payload.Name
-		payloadString := step.payload.XML()
+		payloadString := step.payload.XMLPretty()
 
 		// Parse the xml into a real model
 		log.Trace().Msg("Parsing model")
@@ -422,7 +425,7 @@ func (m DriverTestsuite) parseMessage(typeName string, payloadString string, ste
 
 func (m DriverTestsuite) ParseXml(referenceXml *xmldom.Node, parserArguments []string) {
 	normalizeXml(referenceXml)
-	//referenceSerialized := referenceXml.FirstChild().XML()
+	//referenceSerialized := referenceXml.FirstChild().XMLPretty()
 }
 
 type Testcase struct {
diff --git a/plc4go/internal/plc4go/spi/testutils/TestUtils.go b/plc4go/internal/plc4go/spi/testutils/TestUtils.go
index b5d41fb..9d60f39 100644
--- a/plc4go/internal/plc4go/spi/testutils/TestUtils.go
+++ b/plc4go/internal/plc4go/spi/testutils/TestUtils.go
@@ -25,6 +25,7 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog/log"
 	"os"
+	"strings"
 )
 
 func CompareResults(actualString []byte, referenceString []byte) error {
@@ -50,6 +51,17 @@ func CompareResults(actualString []byte, referenceString []byte) error {
 				log.Info().Msgf("We ignore empty elements which should be deleted %v", delta)
 				continue
 			}
+			// Workaround for different precisions on float
+			if delta.Operation == xdiff.Update &&
+				string(delta.Subject.Parent.FirstChild.Name) == "dataType" &&
+				string(delta.Subject.Parent.FirstChild.Value) == "float" &&
+				string(delta.Object.Parent.FirstChild.Name) == "dataType" &&
+				string(delta.Object.Parent.FirstChild.Value) == "float" {
+				if strings.Contains(string(delta.Subject.Value), string(delta.Object.Value)) || strings.Contains(string(delta.Object.Value), string(delta.Subject.Value)) {
+					log.Info().Msgf("We ignore precision diffs %v", delta)
+					continue
+				}
+			}
 			cleanDiff = append(cleanDiff, delta)
 		}
 
diff --git a/plc4go/internal/plc4go/spi/values/BINT.go b/plc4go/internal/plc4go/spi/values/BINT.go
index ab0b2f4..a744db4 100644
--- a/plc4go/internal/plc4go/spi/values/BINT.go
+++ b/plc4go/internal/plc4go/spi/values/BINT.go
@@ -20,7 +20,7 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"math"
 	"math/big"
 	"strconv"
@@ -121,14 +121,6 @@ func (m PlcBINT) GetFloat64() float64 {
 func (m PlcBINT) GetString() string {
 	return strconv.Itoa(int(m.GetInt64()))
 }
-
-func (m PlcBINT) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcBINT"}}); err != nil {
-		return err
-	}
-	return nil
-}
-
 func (m PlcBINT) isZero() bool {
 	return m.value.Cmp(big.NewInt(0)) == 0
 }
@@ -144,3 +136,7 @@ func (m PlcBINT) isGreaterOrEqual(other int64) bool {
 func (m PlcBINT) isLowerOrEqual(other int64) bool {
 	return m.value.Cmp(big.NewInt(other)) <= 0
 }
+
+func (m PlcBINT) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteBigInt("PlcBINT", uint8(m.value.BitLen()), m.value)
+}
diff --git a/plc4go/internal/plc4go/spi/values/BOOL.go b/plc4go/internal/plc4go/spi/values/BOOL.go
index a21e1df..70f0ee8 100644
--- a/plc4go/internal/plc4go/spi/values/BOOL.go
+++ b/plc4go/internal/plc4go/spi/values/BOOL.go
@@ -19,10 +19,7 @@
 
 package values
 
-import (
-	"encoding/xml"
-	"strconv"
-)
+import "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 
 type PlcBOOL struct {
 	value bool
@@ -58,20 +55,6 @@ func (m PlcBOOL) GetBoolArray() []bool {
 	return []bool{m.value}
 }
 
-func (m PlcBOOL) MarshalXML(e *xml.Encoder, _ xml.StartElement) error {
-	size := 40
-	if m.value {
-		size = 32
-	}
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcBOOL"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "string"},
-		{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(size)},
-	}}); err != nil {
-		return err
-	}
-	return nil
-}
-
 func (m PlcBOOL) IsString() bool {
 	return true
 }
@@ -83,3 +66,7 @@ func (m PlcBOOL) GetString() string {
 		return "false"
 	}
 }
+
+func (m PlcBOOL) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteBit("PlcBOOL", m.value)
+}
diff --git a/plc4go/internal/plc4go/spi/values/BREAL.go b/plc4go/internal/plc4go/spi/values/BREAL.go
index 51aeee5..6098e72 100644
--- a/plc4go/internal/plc4go/spi/values/BREAL.go
+++ b/plc4go/internal/plc4go/spi/values/BREAL.go
@@ -20,8 +20,8 @@
 package values
 
 import (
-	"encoding/xml"
 	"fmt"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"math"
 	"math/big"
 )
@@ -150,13 +150,6 @@ func (m PlcBREAL) GetString() string {
 	return fmt.Sprintf("%g", m.GetFloat64())
 }
 
-func (m PlcBREAL) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcBREAL"}}); err != nil {
-		return err
-	}
-	return nil
-}
-
 func (m PlcBREAL) isZero() bool {
 	return m.value.Cmp(big.NewFloat(0.0)) == 0.0
 }
@@ -172,3 +165,8 @@ func (m PlcBREAL) isGreaterOrEqual(other float64) bool {
 func (m PlcBREAL) isLowerOrEqual(other float64) bool {
 	return m.value.Cmp(big.NewFloat(other)) <= 0
 }
+
+func (m PlcBREAL) Serialize(writeBuffer utils.WriteBuffer) error {
+	// TODO: fix this a insert a valid bit length calculation
+	return writeBuffer.WriteBigFloat("PlcBREAL", uint8(m.value.MinPrec()), m.value)
+}
diff --git a/plc4go/internal/plc4go/spi/values/BYTE.go b/plc4go/internal/plc4go/spi/values/BYTE.go
index 0c426ed..32a102b 100644
--- a/plc4go/internal/plc4go/spi/values/BYTE.go
+++ b/plc4go/internal/plc4go/spi/values/BYTE.go
@@ -19,7 +19,9 @@
 
 package values
 
-import "encoding/xml"
+import (
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+)
 
 type PlcBYTE struct {
 	value uint8
@@ -77,9 +79,6 @@ func (m PlcBYTE) GetString() string {
 	return strVal
 }
 
-func (m PlcBYTE) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcBYTE"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcBYTE) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteByte("PlcBYTE", m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/CHAR.go b/plc4go/internal/plc4go/spi/values/CHAR.go
index 138cd72..2420718 100644
--- a/plc4go/internal/plc4go/spi/values/CHAR.go
+++ b/plc4go/internal/plc4go/spi/values/CHAR.go
@@ -19,7 +19,9 @@
 
 package values
 
-import "encoding/xml"
+import (
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+)
 
 type PlcCHAR struct {
 	value []byte
@@ -40,9 +42,6 @@ func (m PlcCHAR) GetString() string {
 	return string(m.value)
 }
 
-func (m PlcCHAR) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcCHAR"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcCHAR) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteString("PlcBYTE", 16, "UTF-8", string(m.value))
 }
diff --git a/plc4go/internal/plc4go/spi/values/DATE.go b/plc4go/internal/plc4go/spi/values/DATE.go
index 7e4000b..4830f6a 100644
--- a/plc4go/internal/plc4go/spi/values/DATE.go
+++ b/plc4go/internal/plc4go/spi/values/DATE.go
@@ -20,7 +20,7 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"time"
 )
 
@@ -60,9 +60,6 @@ func (m PlcDATE) GetString() string {
 	return m.GetDate().Format("2006-01-02")
 }
 
-func (m PlcDATE) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcDATE"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcDATE) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteString("PlcDATE", byte(len([]rune(m.GetString()))*8), "UTF-8", m.GetString())
 }
diff --git a/plc4go/internal/plc4go/spi/values/DATE_AND_TIME.go b/plc4go/internal/plc4go/spi/values/DATE_AND_TIME.go
index ee05096..70d61d6 100644
--- a/plc4go/internal/plc4go/spi/values/DATE_AND_TIME.go
+++ b/plc4go/internal/plc4go/spi/values/DATE_AND_TIME.go
@@ -20,8 +20,8 @@
 package values
 
 import (
-	"encoding/xml"
 	"fmt"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"time"
 )
 
@@ -47,9 +47,6 @@ func (m PlcDATE_AND_TIME) GetString() string {
 	return fmt.Sprintf("%v", m.GetDateTime())
 }
 
-func (m PlcDATE_AND_TIME) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcDATE_AND_TIME"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcDATE_AND_TIME) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteString("PlcDATE_AND_TIME", byte(len([]rune(m.GetString()))*8), "UTF-8", m.GetString())
 }
diff --git a/plc4go/internal/plc4go/spi/values/DINT.go b/plc4go/internal/plc4go/spi/values/DINT.go
index 3a950f6..8df3a74 100644
--- a/plc4go/internal/plc4go/spi/values/DINT.go
+++ b/plc4go/internal/plc4go/spi/values/DINT.go
@@ -20,7 +20,7 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"math"
 	"strconv"
 )
@@ -131,12 +131,6 @@ func (m PlcDINT) GetString() string {
 	return strconv.Itoa(int(m.GetInt64()))
 }
 
-func (m PlcDINT) MarshalXML(e *xml.Encoder, _ xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcDINT"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "string"},
-		{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len(strconv.Itoa(int(m.value))) * 8)},
-	}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcDINT) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteInt32("PlcDINT", 64, m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/DWORD.go b/plc4go/internal/plc4go/spi/values/DWORD.go
index 756c0dc..2263142 100644
--- a/plc4go/internal/plc4go/spi/values/DWORD.go
+++ b/plc4go/internal/plc4go/spi/values/DWORD.go
@@ -19,7 +19,9 @@
 
 package values
 
-import "encoding/xml"
+import (
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+)
 
 type PlcDWORD struct {
 	value uint32
@@ -89,9 +91,6 @@ func (m PlcDWORD) GetString() string {
 	return strVal
 }
 
-func (m PlcDWORD) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcDWORD"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcDWORD) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint32("PlcDINT", 32, m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/INT.go b/plc4go/internal/plc4go/spi/values/INT.go
index f73cbab..f960d34 100644
--- a/plc4go/internal/plc4go/spi/values/INT.go
+++ b/plc4go/internal/plc4go/spi/values/INT.go
@@ -20,7 +20,7 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"math"
 	"strconv"
 )
@@ -124,9 +124,6 @@ func (m PlcINT) GetString() string {
 	return strconv.Itoa(int(m.GetInt64()))
 }
 
-func (m PlcINT) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcINT"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcINT) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteInt16("PlcINT", 32, m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/LINT.go b/plc4go/internal/plc4go/spi/values/LINT.go
index f4ec5c6..7c982c9 100644
--- a/plc4go/internal/plc4go/spi/values/LINT.go
+++ b/plc4go/internal/plc4go/spi/values/LINT.go
@@ -20,7 +20,7 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"math"
 	"strconv"
 )
@@ -138,9 +138,6 @@ func (m PlcLINT) GetString() string {
 	return strconv.Itoa(int(m.GetInt64()))
 }
 
-func (m PlcLINT) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcLINT"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcLINT) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteInt64("PlcLINT", 64, m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/LREAL.go b/plc4go/internal/plc4go/spi/values/LREAL.go
index 11962ee..8526dad 100644
--- a/plc4go/internal/plc4go/spi/values/LREAL.go
+++ b/plc4go/internal/plc4go/spi/values/LREAL.go
@@ -20,8 +20,8 @@
 package values
 
 import (
-	"encoding/xml"
 	"fmt"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"math"
 )
 
@@ -154,9 +154,6 @@ func (m PlcLREAL) GetString() string {
 	return fmt.Sprintf("%g", m.GetFloat64())
 }
 
-func (m PlcLREAL) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcLREAL"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcLREAL) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteFloat64("PlcLREAL", 64, m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/LTIME.go b/plc4go/internal/plc4go/spi/values/LTIME.go
index 7a1d74f..d718dcf 100644
--- a/plc4go/internal/plc4go/spi/values/LTIME.go
+++ b/plc4go/internal/plc4go/spi/values/LTIME.go
@@ -20,8 +20,8 @@
 package values
 
 import (
-	"encoding/xml"
 	"fmt"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"time"
 )
 
@@ -52,9 +52,6 @@ func (m PlcLTIME) GetString() string {
 	return fmt.Sprintf("PT%0.fS", m.GetDuration().Seconds())
 }
 
-func (m PlcLTIME) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcLTIME"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcLTIME) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteString("PlcLTIME", byte(len([]rune(m.GetString()))*8), "UTF-8", m.GetString())
 }
diff --git a/plc4go/internal/plc4go/spi/values/LWORD.go b/plc4go/internal/plc4go/spi/values/LWORD.go
index a2b0908..7042ded 100644
--- a/plc4go/internal/plc4go/spi/values/LWORD.go
+++ b/plc4go/internal/plc4go/spi/values/LWORD.go
@@ -19,7 +19,9 @@
 
 package values
 
-import "encoding/xml"
+import (
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+)
 
 type PlcLWORD struct {
 	value uint64
@@ -105,9 +107,6 @@ func (m PlcLWORD) GetString() string {
 	return strVal
 }
 
-func (m PlcLWORD) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcLWORD"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcLWORD) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint64("PlcLWORD", 64, m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/NULL.go b/plc4go/internal/plc4go/spi/values/NULL.go
index efb17a1..120d63d 100644
--- a/plc4go/internal/plc4go/spi/values/NULL.go
+++ b/plc4go/internal/plc4go/spi/values/NULL.go
@@ -19,8 +19,6 @@
 
 package values
 
-import "encoding/xml"
-
 type PlcNULL struct {
 	PlcValueAdapter
 }
@@ -28,13 +26,3 @@ type PlcNULL struct {
 func NewPlcNULL() PlcNULL {
 	return PlcNULL{}
 }
-
-func (m PlcNULL) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcNULL"}}); err != nil {
-		return err
-	}
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "PlcNULL"}}); err != nil {
-		return err
-	}
-	return nil
-}
diff --git a/plc4go/internal/plc4go/spi/values/PlcBitString.go b/plc4go/internal/plc4go/spi/values/PlcBitString.go
index 651fd13..e79bac8 100644
--- a/plc4go/internal/plc4go/spi/values/PlcBitString.go
+++ b/plc4go/internal/plc4go/spi/values/PlcBitString.go
@@ -20,13 +20,11 @@
 package values
 
 import (
-	"encoding/xml"
 	api "github.com/apache/plc4x/plc4go/pkg/plc4go/values"
 )
 
 type PlcBitString struct {
-	Values []api.PlcValue
-	PlcValueAdapter
+	PlcList
 }
 
 func NewPlcBitString(value interface{}) PlcBitString {
@@ -55,7 +53,7 @@ func NewPlcBitString(value interface{}) PlcBitString {
 	}
 
 	return PlcBitString{
-		Values: bools,
+		PlcList{Values: bools},
 	}
 }
 
@@ -74,20 +72,3 @@ func (m PlcBitString) GetIndex(i uint32) api.PlcValue {
 func (m PlcBitString) GetList() []api.PlcValue {
 	return m.Values
 }
-
-func (m PlcBitString) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcBitString"}}); err != nil {
-		return err
-	}
-
-	for _, value := range m.Values {
-		if err := e.EncodeElement(value, xml.StartElement{Name: xml.Name{Local: "-set-by-element-"}}); err != nil {
-			return err
-		}
-	}
-
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "PlcBitString"}}); err != nil {
-		return err
-	}
-	return nil
-}
diff --git a/plc4go/internal/plc4go/spi/values/PlcByteArray.go b/plc4go/internal/plc4go/spi/values/PlcByteArray.go
index 56a980c..2f97ccd 100644
--- a/plc4go/internal/plc4go/spi/values/PlcByteArray.go
+++ b/plc4go/internal/plc4go/spi/values/PlcByteArray.go
@@ -20,7 +20,7 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	api "github.com/apache/plc4x/plc4go/pkg/plc4go/values"
 )
 
@@ -59,14 +59,16 @@ func (m PlcByteArray) GetList() []api.PlcValue {
 	return plcValues
 }
 
-func (m PlcByteArray) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcByteArray"}}); err != nil {
+func (m PlcByteArray) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcByteArray"); err != nil {
 		return err
 	}
-
-	// TODO: Implement this ...
-
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "PlcByteArray"}}); err != nil {
+	for _, value := range m.Values {
+		if err := writeBuffer.WriteByte("value", value); err != nil {
+			return err
+		}
+	}
+	if err := writeBuffer.PopContext("PlcByteArray"); err != nil {
 		return err
 	}
 	return nil
diff --git a/plc4go/internal/plc4go/spi/values/PlcList.go b/plc4go/internal/plc4go/spi/values/PlcList.go
index 6165a80..96388e9 100644
--- a/plc4go/internal/plc4go/spi/values/PlcList.go
+++ b/plc4go/internal/plc4go/spi/values/PlcList.go
@@ -20,16 +20,17 @@
 package values
 
 import (
-	"encoding/xml"
-	api "github.com/apache/plc4x/plc4go/pkg/plc4go/values"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"github.com/apache/plc4x/plc4go/pkg/plc4go/values"
+	"github.com/pkg/errors"
 )
 
 type PlcList struct {
-	Values []api.PlcValue
+	Values []values.PlcValue
 	PlcValueAdapter
 }
 
-func NewPlcList(values []api.PlcValue) api.PlcValue {
+func NewPlcList(values []values.PlcValue) values.PlcValue {
 	return PlcList{
 		Values: values,
 	}
@@ -43,26 +44,28 @@ func (m PlcList) GetLength() uint32 {
 	return uint32(len(m.Values))
 }
 
-func (m PlcList) GetIndex(i uint32) api.PlcValue {
+func (m PlcList) GetIndex(i uint32) values.PlcValue {
 	return m.Values[i]
 }
 
-func (m PlcList) GetList() []api.PlcValue {
+func (m PlcList) GetList() []values.PlcValue {
 	return m.Values
 }
 
-func (m PlcList) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcList"}}); err != nil {
+func (m PlcList) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcList"); err != nil {
 		return err
 	}
-
-	for _, value := range m.Values {
-		if err := e.EncodeElement(value, xml.StartElement{Name: xml.Name{Local: "-set-by-element-"}}); err != nil {
-			return err
+	for _, listItem := range m.GetList() {
+		if listItemSerializable, ok := listItem.(utils.Serializable); ok {
+			if err := listItemSerializable.Serialize(writeBuffer); err != nil {
+				return err
+			}
+		} else {
+			return errors.New("Error serializing. List item doesn't implement Serializable")
 		}
 	}
-
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "PlcList"}}); err != nil {
+	if err := writeBuffer.PopContext("PlcList"); err != nil {
 		return err
 	}
 	return nil
diff --git a/plc4go/internal/plc4go/spi/values/PlcStruct.go b/plc4go/internal/plc4go/spi/values/PlcStruct.go
index ddf1bcf..1320761 100644
--- a/plc4go/internal/plc4go/spi/values/PlcStruct.go
+++ b/plc4go/internal/plc4go/spi/values/PlcStruct.go
@@ -20,8 +20,9 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	api "github.com/apache/plc4x/plc4go/pkg/plc4go/values"
+	"github.com/pkg/errors"
 	"strings"
 )
 
@@ -80,19 +81,26 @@ func (m PlcStruct) GetString() string {
 	return sb.String()
 }
 
-func (m PlcStruct) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcNULL"}}); err != nil {
+func (m PlcStruct) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcStruct"); err != nil {
 		return err
 	}
-
-	for fieldName, fieldValue := range m.values {
-		if err := e.EncodeElement(fieldValue, xml.StartElement{Name: xml.Name{Local: fieldName}}); err != nil {
+	for fieldName, plcValue := range m.values {
+		if err := writeBuffer.PushContext(fieldName); err != nil {
 			return err
 		}
-	}
 
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "PlcNULL"}}); err != nil {
-		return err
+		if serializablePlcValue, ok := plcValue.(utils.Serializable); ok {
+			if err := serializablePlcValue.Serialize(writeBuffer); err != nil {
+				return err
+			}
+		} else {
+			return errors.Errorf("Error serializing. %T doesn't implement Serializable", plcValue)
+		}
+
+		if err := writeBuffer.PopContext(fieldName); err != nil {
+			return err
+		}
 	}
-	return nil
+	return writeBuffer.PopContext("PlcStruct")
 }
diff --git a/plc4go/internal/plc4go/spi/values/REAL.go b/plc4go/internal/plc4go/spi/values/REAL.go
index 0faabad..8e2515f 100644
--- a/plc4go/internal/plc4go/spi/values/REAL.go
+++ b/plc4go/internal/plc4go/spi/values/REAL.go
@@ -20,10 +20,9 @@
 package values
 
 import (
-	"encoding/xml"
 	"fmt"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"math"
-	"strconv"
 )
 
 type PlcREAL struct {
@@ -149,12 +148,6 @@ func (m PlcREAL) GetString() string {
 	return fmt.Sprintf("%g", m.GetFloat32())
 }
 
-func (m PlcREAL) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcREAL"}, Attr: []xml.Attr{
-		{Name: xml.Name{Local: "dataType"}, Value: "string"},
-		{Name: xml.Name{Local: "bitLength"}, Value: strconv.Itoa(len(m.GetString()) * 8)},
-	}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcREAL) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteFloat32("PlcREAL", 31, m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/RawPlcValue.go b/plc4go/internal/plc4go/spi/values/RawPlcValue.go
index 87a4313..a8750b4 100644
--- a/plc4go/internal/plc4go/spi/values/RawPlcValue.go
+++ b/plc4go/internal/plc4go/spi/values/RawPlcValue.go
@@ -20,7 +20,6 @@
 package values
 
 import (
-	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	api "github.com/apache/plc4x/plc4go/pkg/plc4go/values"
 )
@@ -77,16 +76,3 @@ func (m RawPlcValue) RawHasMore() bool {
 func (m RawPlcValue) RawReset() {
 	m.readBuffer.(utils.ReadBufferByteBased).Reset()
 }
-
-func (m RawPlcValue) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcByteArray"}}); err != nil {
-		return err
-	}
-
-	// TODO: Implement this ...
-
-	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "PlcByteArray"}}); err != nil {
-		return err
-	}
-	return nil
-}
diff --git a/plc4go/internal/plc4go/spi/values/SINT.go b/plc4go/internal/plc4go/spi/values/SINT.go
index 6edc134..08e50ef 100644
--- a/plc4go/internal/plc4go/spi/values/SINT.go
+++ b/plc4go/internal/plc4go/spi/values/SINT.go
@@ -20,7 +20,7 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"strconv"
 )
 
@@ -116,9 +116,6 @@ func (m PlcSINT) GetString() string {
 	return strconv.Itoa(int(m.GetInt64()))
 }
 
-func (m PlcSINT) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcSINT"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcSINT) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteInt8("PlcINT", 8, m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/STRING.go b/plc4go/internal/plc4go/spi/values/STRING.go
index d51c60d..2c620e4 100644
--- a/plc4go/internal/plc4go/spi/values/STRING.go
+++ b/plc4go/internal/plc4go/spi/values/STRING.go
@@ -19,7 +19,9 @@
 
 package values
 
-import "encoding/xml"
+import (
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+)
 
 type PlcSTRING struct {
 	value string
@@ -40,9 +42,6 @@ func (m PlcSTRING) GetString() string {
 	return m.value
 }
 
-func (m PlcSTRING) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcSTRING"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcSTRING) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteString("PlcSTRING", uint8(len([]rune(m.value))*8), "UTF-8", m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/TIME.go b/plc4go/internal/plc4go/spi/values/TIME.go
index a9c0487..01c8926 100644
--- a/plc4go/internal/plc4go/spi/values/TIME.go
+++ b/plc4go/internal/plc4go/spi/values/TIME.go
@@ -20,8 +20,8 @@
 package values
 
 import (
-	"encoding/xml"
 	"fmt"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"time"
 )
 
@@ -52,9 +52,6 @@ func (m PlcTIME) GetString() string {
 	return fmt.Sprintf("PT%0.fS", m.GetDuration().Seconds())
 }
 
-func (m PlcTIME) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcTIME"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcTIME) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteString("PlcTIME", byte(len([]rune(m.GetString()))*8), "UTF-8", m.GetString())
 }
diff --git a/plc4go/internal/plc4go/spi/values/TIME_OF_DAY.go b/plc4go/internal/plc4go/spi/values/TIME_OF_DAY.go
index 1d9e39e..5a14d56 100644
--- a/plc4go/internal/plc4go/spi/values/TIME_OF_DAY.go
+++ b/plc4go/internal/plc4go/spi/values/TIME_OF_DAY.go
@@ -20,7 +20,7 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"time"
 )
 
@@ -63,9 +63,6 @@ func (m PlcTIME_OF_DAY) GetString() string {
 	return m.value.Format("15:04:05.000")
 }
 
-func (m PlcTIME_OF_DAY) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcTIME_OF_DAY"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcTIME_OF_DAY) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteString("PlcTIME_OF_DAY", byte(len([]rune(m.GetString()))*8), "UTF-8", m.GetString())
 }
diff --git a/plc4go/internal/plc4go/spi/values/UDINT.go b/plc4go/internal/plc4go/spi/values/UDINT.go
index d793814..6f6bce0 100644
--- a/plc4go/internal/plc4go/spi/values/UDINT.go
+++ b/plc4go/internal/plc4go/spi/values/UDINT.go
@@ -20,7 +20,7 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"math"
 	"strconv"
 )
@@ -124,9 +124,6 @@ func (m PlcUDINT) GetString() string {
 	return strconv.Itoa(int(m.GetInt64()))
 }
 
-func (m PlcUDINT) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcUDINT"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcUDINT) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint32("PlcUDINT", 32, m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/UINT.go b/plc4go/internal/plc4go/spi/values/UINT.go
index 47d6a73..42e3686 100644
--- a/plc4go/internal/plc4go/spi/values/UINT.go
+++ b/plc4go/internal/plc4go/spi/values/UINT.go
@@ -20,7 +20,7 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"math"
 	"strconv"
 )
@@ -110,9 +110,6 @@ func (m PlcUINT) GetString() string {
 	return strconv.Itoa(int(m.GetInt64()))
 }
 
-func (m PlcUINT) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcUINT"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcUINT) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint16("PlcUINT", 16, m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/ULINT.go b/plc4go/internal/plc4go/spi/values/ULINT.go
index 2e72940..2188d44 100644
--- a/plc4go/internal/plc4go/spi/values/ULINT.go
+++ b/plc4go/internal/plc4go/spi/values/ULINT.go
@@ -20,7 +20,7 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"math"
 	"strconv"
 )
@@ -138,9 +138,6 @@ func (m PlcULINT) GetString() string {
 	return strconv.Itoa(int(m.GetInt64()))
 }
 
-func (m PlcULINT) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcULINT"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcULINT) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint64("PlcUINT", 64, m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/USINT.go b/plc4go/internal/plc4go/spi/values/USINT.go
index 2d0887b..f5ec7f7 100644
--- a/plc4go/internal/plc4go/spi/values/USINT.go
+++ b/plc4go/internal/plc4go/spi/values/USINT.go
@@ -20,7 +20,7 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"math"
 	"strconv"
 )
@@ -96,9 +96,6 @@ func (m PlcUSINT) GetString() string {
 	return strconv.Itoa(int(m.GetInt64()))
 }
 
-func (m PlcUSINT) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcUSINT"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcUSINT) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint8("PlcUSINT", 64, m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/WCHAR.go b/plc4go/internal/plc4go/spi/values/WCHAR.go
index f7ab331..83819a4 100644
--- a/plc4go/internal/plc4go/spi/values/WCHAR.go
+++ b/plc4go/internal/plc4go/spi/values/WCHAR.go
@@ -20,7 +20,7 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"unicode/utf16"
 )
 
@@ -43,9 +43,6 @@ func (m PlcWCHAR) GetString() string {
 	return string(m.value)
 }
 
-func (m PlcWCHAR) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcWCHAR"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcWCHAR) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteString("PlcSTRING", uint8(len(m.value)*8), "UTF-8", string(m.value))
 }
diff --git a/plc4go/internal/plc4go/spi/values/WORD.go b/plc4go/internal/plc4go/spi/values/WORD.go
index 3e96a3b..77c19f2 100644
--- a/plc4go/internal/plc4go/spi/values/WORD.go
+++ b/plc4go/internal/plc4go/spi/values/WORD.go
@@ -19,7 +19,9 @@
 
 package values
 
-import "encoding/xml"
+import (
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+)
 
 type PlcWORD struct {
 	value uint16
@@ -81,9 +83,6 @@ func (m PlcWORD) GetString() string {
 	return strVal
 }
 
-func (m PlcWORD) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcWORD"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcWORD) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint16("PlcWORD", 16, m.value)
 }
diff --git a/plc4go/internal/plc4go/spi/values/WSTRING.go b/plc4go/internal/plc4go/spi/values/WSTRING.go
index d08a189..b574425 100644
--- a/plc4go/internal/plc4go/spi/values/WSTRING.go
+++ b/plc4go/internal/plc4go/spi/values/WSTRING.go
@@ -20,7 +20,7 @@
 package values
 
 import (
-	"encoding/xml"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"unicode/utf16"
 )
 
@@ -43,9 +43,6 @@ func (m PlcWSTRING) GetString() string {
 	return string(m.value)
 }
 
-func (m PlcWSTRING) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	if err := e.EncodeElement(m.value, xml.StartElement{Name: xml.Name{Local: "PlcWSTRING"}}); err != nil {
-		return err
-	}
-	return nil
+func (m PlcWSTRING) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteString("PlcSTRING", uint8(len([]rune(m.value))*8), "UTF-8", string(m.value))
 }
diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/DirectAdsField.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/DirectAdsField.java
index dd30aec..8cc2bff 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/DirectAdsField.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/DirectAdsField.java
@@ -154,6 +154,7 @@ public class DirectAdsField implements AdsField {
     public void serialize(WriteBuffer writeBuffer) throws ParseException {
         writeBuffer.pushContext(getClass().getSimpleName());
 
+        // TODO: fix types to uint32
         writeBuffer.writeLong("indexGroup", 64, getIndexGroup());
         writeBuffer.writeLong("indexOffset", 64, getIndexOffset());
         writeBuffer.writeLong("numberOfElements", 64, getNumberOfElements());
diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/SymbolicAdsStringField.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/SymbolicAdsStringField.java
index 776b51d..4068353 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/SymbolicAdsStringField.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/SymbolicAdsStringField.java
@@ -87,11 +87,13 @@ public class SymbolicAdsStringField extends SymbolicAdsField implements AdsStrin
         String symbolicAddress = getSymbolicAddress();
         writeBuffer.writeString("symbolicAddress", symbolicAddress.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), symbolicAddress);
 
+        // TODO: fix types to uint32
         writeBuffer.writeInt("numberOfElements", 64, getNumberOfElements());
 
         String dataType = getPlcDataType();
         writeBuffer.writeString("dataType", dataType.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), dataType);
 
+        // TODO: fix types to int32
         writeBuffer.writeInt("stringLength", 64, getStringLength());
         writeBuffer.popContext(getClass().getSimpleName());
     }
diff --git a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/readwrite/field/EipField.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/readwrite/field/EipField.java
index 551befa..7986050 100644
--- a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/readwrite/field/EipField.java
+++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/readwrite/field/EipField.java
@@ -147,6 +147,7 @@ public class EipField implements PlcField, Serializable {
         if (type != null) {
             writeBuffer.writeString("type", type.name().getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), type.name());
         }
+        // TODO: fix types to uint16
         writeBuffer.writeInt("elementNb", 64, elementNb);
         // TODO: remove this (not language agnostic)
         String defaultJavaType = (type == null ? Object.class : getDefaultJavaType()).getName();
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusField.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusField.java
index 896a8fa..82a9549 100644
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusField.java
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusField.java
@@ -132,6 +132,7 @@ public abstract class ModbusField implements PlcField, Serializable {
     public void serialize(WriteBuffer writeBuffer) throws ParseException {
         writeBuffer.pushContext(getClass().getSimpleName());
 
+        // TODO: fix types to uint16
         writeBuffer.writeInt("address", 64, address);
         writeBuffer.writeInt("numberOfElements", 64, getNumberOfElements());
         String dataType = getPlcDataType();
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7Field.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7Field.java
index 53ba02a..a89748b 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7Field.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7Field.java
@@ -364,8 +364,11 @@ public class S7Field implements PlcField, Serializable {
         String memoryArea = getMemoryArea().name();
         writeBuffer.writeString("memoryArea", memoryArea.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), memoryArea);
 
+        // TODO: change to uint16
         writeBuffer.writeInt("blockNumber", 64, getBlockNumber());
+        // TODO: change to uint16
         writeBuffer.writeInt("byteOffset", 64, getByteOffset());
+        // TODO: change to uint8
         writeBuffer.writeInt("bitOffset", 64, getBitOffset());
         writeBuffer.writeInt("numElements", 64, getNumberOfElements());
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferXmlBased.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferXmlBased.java
index 2379298..b066337 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferXmlBased.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferXmlBased.java
@@ -19,6 +19,7 @@
 
 package org.apache.plc4x.java.spi.generation;
 
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 
@@ -36,7 +37,6 @@ import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.ArrayDeque;
 import java.util.Deque;
-import java.util.Stack;
 
 public class WriteBufferXmlBased implements WriteBuffer, BufferCommons {
 
@@ -194,7 +194,7 @@ public class WriteBufferXmlBased implements WriteBuffer, BufferCommons {
 
     @Override
     public void writeString(String logicalName, int bitLength, String encoding, String value, WithWriterArgs... writerArgs) throws ParseException {
-        createAndAppend(logicalName, rwStringKey, bitLength, value, writerArgs);
+        createAndAppend(logicalName, rwStringKey, bitLength, value, encoding, writerArgs);
         move(bitLength);
     }
 
@@ -215,7 +215,7 @@ public class WriteBufferXmlBased implements WriteBuffer, BufferCommons {
 
         String context = stack.pop();
         if (!context.equals(logicalName)) {
-            throw new PlcRuntimeException("Unexpected pop context '" + context + '\''+ ". Expected '"+logicalName+ '\'');
+            throw new PlcRuntimeException("Unexpected pop context '" + context + '\'' + ". Expected '" + logicalName + '\'');
         }
         if (stack.isEmpty()) {
             try {
@@ -249,6 +249,10 @@ public class WriteBufferXmlBased implements WriteBuffer, BufferCommons {
     }
 
     private void createAndAppend(String logicalName, String dataType, int bitLength, String data, WithWriterArgs... writerArgs) {
+        createAndAppend(logicalName, dataType, bitLength, data, null, writerArgs);
+    }
+
+    private void createAndAppend(String logicalName, String dataType, int bitLength, String data, String encoding, WithWriterArgs... writerArgs) {
         try {
             indent();
             StartElement startElement = xmlEventFactory.createStartElement("", "", sanitizeLogicalName(logicalName));
@@ -262,6 +266,10 @@ public class WriteBufferXmlBased implements WriteBuffer, BufferCommons {
                 Attribute additionalStringRepresentationAttribute = xmlEventFactory.createAttribute(rwStringRepresentationKey, additionalStringRepresentation);
                 xmlEventWriter.add(additionalStringRepresentationAttribute);
             }
+            if (encoding != null) {
+                Attribute encodingAttribute = xmlEventFactory.createAttribute(rwEncodingKey, encoding);
+                xmlEventWriter.add(encodingAttribute);
+            }
             Characters dataCharacters = xmlEventFactory.createCharacters(data);
             xmlEventWriter.add(dataCharacters);
             EndElement endElement = xmlEventFactory.createEndElement("", "", sanitizeLogicalName(logicalName));
@@ -271,5 +279,4 @@ public class WriteBufferXmlBased implements WriteBuffer, BufferCommons {
             throw new PlcRuntimeException(e);
         }
     }
-
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBOOL.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBOOL.java
index df27fd7..165bda0 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBOOL.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBOOL.java
@@ -24,9 +24,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcBOOL extends PlcIECValue<Boolean> {
@@ -283,4 +286,9 @@ public class PlcBOOL extends PlcIECValue<Boolean> {
         return Boolean.toString(value);
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeBit(getClass().getSimpleName(), value);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBYTE.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBYTE.java
index 41955fc..60abd85 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBYTE.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBYTE.java
@@ -24,9 +24,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 import java.util.BitSet;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
@@ -295,4 +298,9 @@ public class PlcBYTE extends PlcIECValue<Short> {
         return bytes;
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeShort(getClass().getSimpleName(), 8, value);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigDecimal.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigDecimal.java
index b8d2f28..4bc5360 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigDecimal.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigDecimal.java
@@ -29,6 +29,7 @@ import org.w3c.dom.Element;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcBigDecimal extends PlcSimpleValue<BigDecimal> {
@@ -166,7 +167,8 @@ public class PlcBigDecimal extends PlcSimpleValue<BigDecimal> {
 
     @Override
     public void serialize(WriteBuffer writeBuffer) throws ParseException {
-        // TODO: Implement
+        int scale = 32;
+        writeBuffer.writeBigDecimal(getClass().getSimpleName(), value.unscaledValue().bitLength() + scale, value);
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigInteger.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigInteger.java
index b43a9ad..7b86b27 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigInteger.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigInteger.java
@@ -29,6 +29,7 @@ import org.w3c.dom.Element;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcBigInteger extends PlcSimpleValue<BigInteger> {
@@ -166,7 +167,7 @@ public class PlcBigInteger extends PlcSimpleValue<BigInteger> {
 
     @Override
     public void serialize(WriteBuffer writeBuffer) throws ParseException {
-        // TODO: Implement
+        writeBuffer.writeBigInteger(getClass().getSimpleName(), value.bitLength(), value);
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcCHAR.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcCHAR.java
index bcd74fb..45e7967 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcCHAR.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcCHAR.java
@@ -24,9 +24,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcCHAR extends PlcIECValue<Short> {
@@ -325,4 +328,10 @@ public class PlcCHAR extends PlcIECValue<Short> {
         return bytes;
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        String valueString = value.toString();
+        writeBuffer.writeString(getClass().getSimpleName(), 16, StandardCharsets.UTF_8.name(), valueString);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE.java
index 29479f8..27f8922 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE.java
@@ -28,6 +28,7 @@ import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -97,7 +98,8 @@ public class PlcDATE extends PlcSimpleValue<LocalDate> {
 
     @Override
     public void serialize(WriteBuffer writeBuffer) throws ParseException {
-        // TODO: Implement
+        String valueString = value.toString();
+        writeBuffer.writeString(getClass().getSimpleName(), valueString.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), valueString);
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java
index a4e98b1..4c25c3f 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java
@@ -28,6 +28,7 @@ import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.time.*;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
@@ -110,7 +111,8 @@ public class PlcDATE_AND_TIME extends PlcSimpleValue<LocalDateTime> {
 
     @Override
     public void serialize(WriteBuffer writeBuffer) throws ParseException {
-        // TODO: Implement
+        String valueString = value.toString();
+        writeBuffer.writeString(getClass().getSimpleName(), valueString.getBytes(StandardCharsets.UTF_8).length*8,StandardCharsets.UTF_8.name(),valueString);
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDINT.java
index 25a0e89..e974bd6 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDINT.java
@@ -24,9 +24,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcDINT extends PlcIECValue<Integer> {
@@ -271,4 +274,9 @@ public class PlcDINT extends PlcIECValue<Integer> {
         };
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeInt(getClass().getSimpleName(), 64, value);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDWORD.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDWORD.java
index c8312ff..a009b9b 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDWORD.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDWORD.java
@@ -24,9 +24,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 import java.util.BitSet;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
@@ -298,4 +301,9 @@ public class PlcDWORD extends PlcIECValue<Long> {
         return bytes;
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeLong(getClass().getSimpleName(), 32, value);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcINT.java
index 81770c2..01c9b45 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcINT.java
@@ -24,9 +24,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcINT extends PlcIECValue<Short> {
@@ -147,7 +150,7 @@ public class PlcINT extends PlcIECValue<Short> {
     @Override
     @JsonIgnore
     public boolean getBoolean() {
-        return (value != null) && !value.equals((short)0);
+        return (value != null) && !value.equals((short) 0);
     }
 
     @Override
@@ -272,4 +275,9 @@ public class PlcINT extends PlcIECValue<Short> {
         };
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeInt(getClass().getSimpleName(), 16, value);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLINT.java
index 18a92bf..3756d3d 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLINT.java
@@ -24,9 +24,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcLINT extends PlcIECValue<Long> {
@@ -272,4 +275,9 @@ public class PlcLINT extends PlcIECValue<Long> {
         };
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeLong(getClass().getSimpleName(), 64, value);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLREAL.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLREAL.java
index 41472ca..c7b55b0 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLREAL.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLREAL.java
@@ -24,9 +24,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcLREAL extends PlcIECValue<Double> {
@@ -262,4 +265,9 @@ public class PlcLREAL extends PlcIECValue<Double> {
         };
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeDouble(getClass().getSimpleName(), value, 11, 52);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java
index 6a90af5..efca6a7 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java
@@ -28,6 +28,7 @@ import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Element;
 
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 import java.time.Duration;
 import java.time.temporal.ChronoUnit;
 
@@ -92,7 +93,8 @@ public class PlcLTIME extends PlcSimpleValue<Duration> {
 
     @Override
     public void serialize(WriteBuffer writeBuffer) throws ParseException {
-        // TODO: Implement
+        String valueString = value.toString();
+        writeBuffer.writeString(getClass().getSimpleName(), valueString.getBytes(StandardCharsets.UTF_8).length*8,StandardCharsets.UTF_8.name(),valueString);
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLWORD.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLWORD.java
index 1d201a7..90b1a2c 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLWORD.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLWORD.java
@@ -22,9 +22,12 @@ package org.apache.plc4x.java.spi.values;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 import java.util.BitSet;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
@@ -309,4 +312,9 @@ public class PlcLWORD extends PlcIECValue<BigInteger> {
         return bytes;
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeBigInteger(getClass().getSimpleName(), 64, value);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcREAL.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcREAL.java
index 8b3b2eb..e31b140 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcREAL.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcREAL.java
@@ -21,9 +21,12 @@ package org.apache.plc4x.java.spi.values;
 
 import com.fasterxml.jackson.annotation.*;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcREAL extends PlcIECValue<Float> {
@@ -253,4 +256,9 @@ public class PlcREAL extends PlcIECValue<Float> {
         return new byte[]{(byte) (intBits >> 24), (byte) (intBits >> 16), (byte) (intBits >> 8), (byte) (intBits)};
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeDouble(getClass().getSimpleName(), value, 8, 23);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSINT.java
index 20e9663..a8ae33a 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSINT.java
@@ -24,9 +24,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcSINT extends PlcIECValue<Byte> {
@@ -273,4 +276,9 @@ public class PlcSINT extends PlcIECValue<Byte> {
         return bytes;
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeByte(getClass().getSimpleName(), value);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSTRING.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSTRING.java
index 96c9847..6af4e9d 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSTRING.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSTRING.java
@@ -29,6 +29,7 @@ import org.w3c.dom.Element;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcSTRING extends PlcSimpleValue<String> {
@@ -233,7 +234,8 @@ public class PlcSTRING extends PlcSimpleValue<String> {
 
     @Override
     public void serialize(WriteBuffer writeBuffer) throws ParseException {
-        // TODO: Implement
+        String valueString = value.toString();
+        writeBuffer.writeString(getClass().getSimpleName(), valueString.getBytes(StandardCharsets.UTF_8).length*8,StandardCharsets.UTF_8.name(),valueString);
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java
index 28e4681..ddb8a05 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java
@@ -27,6 +27,7 @@ import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.time.Duration;
 import java.time.temporal.ChronoUnit;
 
@@ -87,7 +88,8 @@ public class PlcTIME extends PlcSimpleValue<Duration> {
 
     @Override
     public void serialize(WriteBuffer writeBuffer) throws ParseException {
-        // TODO: Implement
+        String valueString = value.toString();
+        writeBuffer.writeString(getClass().getSimpleName(), valueString.getBytes(StandardCharsets.UTF_8).length*8,StandardCharsets.UTF_8.name(),valueString);
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java
index f9225a2..e44b559 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java
@@ -28,6 +28,7 @@ import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.time.LocalTime;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
@@ -84,7 +85,8 @@ public class PlcTIME_OF_DAY extends PlcSimpleValue<LocalTime> {
 
     @Override
     public void serialize(WriteBuffer writeBuffer) throws ParseException {
-        // TODO: Implement
+        String valueString = value.toString();
+        writeBuffer.writeString(getClass().getSimpleName(), valueString.getBytes(StandardCharsets.UTF_8).length*8,StandardCharsets.UTF_8.name(),valueString);
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUDINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUDINT.java
index eb2b370..21b49fe 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUDINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUDINT.java
@@ -24,9 +24,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcUDINT extends PlcIECValue<Long> {
@@ -290,4 +293,9 @@ public class PlcUDINT extends PlcIECValue<Long> {
         return bytes;
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeLong(getClass().getSimpleName(), 32, value);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUINT.java
index 1904697..0d499b9 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUINT.java
@@ -24,9 +24,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcUINT extends PlcIECValue<Integer> {
@@ -281,4 +284,9 @@ public class PlcUINT extends PlcIECValue<Integer> {
         };
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeInt(getClass().getSimpleName(), 16, value);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcULINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcULINT.java
index 6ea8432..2164190 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcULINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcULINT.java
@@ -22,9 +22,12 @@ package org.apache.plc4x.java.spi.values;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcULINT extends PlcIECValue<BigInteger> {
@@ -298,4 +301,9 @@ public class PlcULINT extends PlcIECValue<BigInteger> {
         return bytes;
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeBigInteger(getClass().getSimpleName(), 64, value);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUSINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUSINT.java
index 21ddccb..1c7658d 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUSINT.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUSINT.java
@@ -24,9 +24,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcUSINT extends PlcIECValue<Short> {
@@ -283,4 +286,9 @@ public class PlcUSINT extends PlcIECValue<Short> {
         return bytes;
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeShort(getClass().getSimpleName(), 8, value);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWCHAR.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWCHAR.java
index 7975b4a..ec4ddd3 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWCHAR.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWCHAR.java
@@ -24,9 +24,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public class PlcWCHAR extends PlcIECValue<Integer> {
@@ -301,4 +304,10 @@ public class PlcWCHAR extends PlcIECValue<Integer> {
         };
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        String valueString = value.toString();
+        writeBuffer.writeString(getClass().getSimpleName(), 16, StandardCharsets.UTF_8.name(), valueString);
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWORD.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWORD.java
index 6a968bc..ac0729b 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWORD.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWORD.java
@@ -24,11 +24,14 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 import java.util.BitSet;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
@@ -294,4 +297,9 @@ public class PlcWORD extends PlcIECValue<Integer> {
         };
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.writeInt(getClass().getSimpleName(), 16, value);
+    }
+
 }
diff --git a/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml b/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml
index eb7689a..006f5f5 100644
--- a/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml
+++ b/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml
@@ -197,7 +197,7 @@
                   <indexGroup dataType="int" bitLength="64">4040</indexGroup>
                   <indexOffset dataType="int" bitLength="64">8</indexOffset>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </DirectAdsField>
               </hurz>
             </fields>
@@ -205,8 +205,8 @@
           <values>
             <hurz>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcBOOL dataType="string" bitLength="32">true</PlcBOOL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcBOOL dataType="bit" bitLength="1">true</PlcBOOL>
               </ResponseItem>
             </hurz>
           </values>
@@ -401,7 +401,7 @@
                   <indexGroup dataType="int" bitLength="64">4040</indexGroup>
                   <indexOffset dataType="int" bitLength="64">8</indexOffset>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </DirectAdsField>
               </hurz1>
               <hurz2>
@@ -409,7 +409,7 @@
                   <indexGroup dataType="int" bitLength="64">4040</indexGroup>
                   <indexOffset dataType="int" bitLength="64">12</indexOffset>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </DirectAdsField>
               </hurz2>
             </fields>
@@ -417,14 +417,14 @@
           <values>
             <hurz1>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcBOOL dataType="string" bitLength="32">true</PlcBOOL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcBOOL dataType="bit" bitLength="1">true</PlcBOOL>
               </ResponseItem>
             </hurz1>
             <hurz2>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcBOOL dataType="string" bitLength="32">true</PlcBOOL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcBOOL dataType="bit" bitLength="1">true</PlcBOOL>
               </ResponseItem>
             </hurz2>
           </values>
@@ -753,9 +753,9 @@
             <fields>
               <hurz1>
                 <SymbolicAdsField>
-                  <symbolicAddress dataType="string" bitLength="200">main.f_trigDateiGelesen.M</symbolicAddress>
+                  <symbolicAddress dataType="string" bitLength="200" encoding="UTF-8">main.f_trigDateiGelesen.M</symbolicAddress>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </SymbolicAdsField>
               </hurz1>
             </fields>
@@ -763,8 +763,8 @@
           <values>
             <hurz1>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcBOOL dataType="string" bitLength="40">false</PlcBOOL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcBOOL dataType="bit" bitLength="1">false</PlcBOOL>
               </ResponseItem>
             </hurz1>
           </values>
@@ -1094,9 +1094,9 @@
             <fields>
               <hurz1>
                 <SymbolicAdsField>
-                  <symbolicAddress dataType="string" bitLength="200">main.f_trigDateiGelesen.M</symbolicAddress>
+                  <symbolicAddress dataType="string" bitLength="200" encoding="UTF-8">main.f_trigDateiGelesen.M</symbolicAddress>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </SymbolicAdsField>
               </hurz1>
             </fields>
@@ -1104,8 +1104,8 @@
           <values>
             <hurz1>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcBOOL dataType="string" bitLength="40">false</PlcBOOL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcBOOL dataType="bit" bitLength="1">false</PlcBOOL>
               </ResponseItem>
             </hurz1>
           </values>
@@ -1263,9 +1263,9 @@
             <fields>
               <hurz1>
                 <SymbolicAdsField>
-                  <symbolicAddress dataType="string" bitLength="200">main.f_trigDateiGelesen.M</symbolicAddress>
+                  <symbolicAddress dataType="string" bitLength="200" encoding="UTF-8">main.f_trigDateiGelesen.M</symbolicAddress>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </SymbolicAdsField>
               </hurz1>
             </fields>
@@ -1273,8 +1273,8 @@
           <values>
             <hurz1>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcBOOL dataType="string" bitLength="40">false</PlcBOOL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcBOOL dataType="bit" bitLength="1">false</PlcBOOL>
               </ResponseItem>
             </hurz1>
           </values>
diff --git a/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml b/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml
index a4addb1..2231728 100644
--- a/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml
+++ b/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml
@@ -213,9 +213,9 @@
             <fields>
               <hurz>
                 <EipField>
-                  <node dataType="string" bitLength="32">rate</node>
+                  <node dataType="string" bitLength="32" encoding="UTF-8">rate</node>
                   <elementNb dataType="int" bitLength="64">0</elementNb>
-                  <defaultJavaType dataType="string" bitLength="128">java.lang.Object</defaultJavaType>
+                  <defaultJavaType dataType="string" bitLength="128" encoding="UTF-8">java.lang.Object</defaultJavaType>
                 </EipField>
               </hurz>
             </fields>
@@ -223,8 +223,8 @@
           <values>
             <hurz>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcDINT dataType="string" bitLength="72">369229824</PlcDINT>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcDINT dataType="int" bitLength="64">369229824</PlcDINT>
               </ResponseItem>
             </hurz>
           </values>
diff --git a/protocols/modbus/src/test/resources/protocols/modbus/DriverTestsuite.xml b/protocols/modbus/src/test/resources/protocols/modbus/DriverTestsuite.xml
index 2998551..dd62f42 100644
--- a/protocols/modbus/src/test/resources/protocols/modbus/DriverTestsuite.xml
+++ b/protocols/modbus/src/test/resources/protocols/modbus/DriverTestsuite.xml
@@ -97,7 +97,7 @@
                 <ModbusFieldHoldingRegister>
                   <address dataType="int" bitLength="64">0</address>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">REAL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
                 </ModbusFieldHoldingRegister>
               </hurz>
             </fields>
@@ -105,8 +105,8 @@
           <values>
             <hurz>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcREAL dataType="string" bitLength="72">3.1415927</PlcREAL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcREAL dataType="float" bitLength="31">3.1415927410125732</PlcREAL>
               </ResponseItem>
             </hurz>
           </values>
@@ -187,7 +187,7 @@
                 <ModbusFieldHoldingRegister>
                   <address dataType="int" bitLength="64">0</address>
                   <numberOfElements dataType="int" bitLength="64">2</numberOfElements>
-                  <dataType dataType="string" bitLength="32">REAL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
                 </ModbusFieldHoldingRegister>
               </hurz>
             </fields>
@@ -195,10 +195,10 @@
           <values>
             <hurz>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
                 <PlcList>
-                  <PlcREAL dataType="string" bitLength="72">3.1415927</PlcREAL>
-                  <PlcREAL dataType="string" bitLength="72">3.1415927</PlcREAL>
+                  <PlcREAL dataType="float" bitLength="31">3.1415927410125732</PlcREAL>
+                  <PlcREAL dataType="float" bitLength="31">3.1415927410125732</PlcREAL>
                 </PlcList>
               </ResponseItem>
             </hurz>
@@ -327,14 +327,14 @@
                 <ModbusFieldHoldingRegister>
                   <address dataType="int" bitLength="64">0</address>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">REAL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
                 </ModbusFieldHoldingRegister>
               </hurz1>
               <hurz2>
                 <ModbusFieldHoldingRegister>
                   <address dataType="int" bitLength="64">2</address>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">REAL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
                 </ModbusFieldHoldingRegister>
               </hurz2>
             </fields>
@@ -342,14 +342,14 @@
           <values>
             <hurz1>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcREAL dataType="string" bitLength="72">3.1415927</PlcREAL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcREAL dataType="float" bitLength="31">3.1415927410125732</PlcREAL>
               </ResponseItem>
             </hurz1>
             <hurz2>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcREAL dataType="string" bitLength="72">3.1415927</PlcREAL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcREAL dataType="float" bitLength="31">3.1415927410125732</PlcREAL>
               </ResponseItem>
             </hurz2>
           </values>
@@ -429,14 +429,14 @@
                 <ModbusFieldHoldingRegister>
                   <address dataType="int" bitLength="64">0</address>
                   <numberOfElements dataType="int" bitLength="64">1</numberOfElements>
-                  <dataType dataType="string" bitLength="32">REAL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
                 </ModbusFieldHoldingRegister>
-                <value dataType="string" bitLength="72">3.1415927</value>
+                <value dataType="string" bitLength="72" encoding="UTF-8">3.1415927</value>
               </hurz>
             </fields>
           </PlcWriteRequest>
           <fields>
-            <hurz dataType="string" bitLength="16">OK</hurz>
+            <hurz dataType="string" bitLength="16" encoding="UTF-8">OK</hurz>
           </fields>
         </PlcWriteResponse>
       </api-response>
@@ -519,15 +519,15 @@
                 <ModbusFieldHoldingRegister>
                   <address dataType="int" bitLength="64">0</address>
                   <numberOfElements dataType="int" bitLength="64">2</numberOfElements>
-                  <dataType dataType="string" bitLength="32">REAL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
                 </ModbusFieldHoldingRegister>
-                <value dataType="string" bitLength="72">3.1415927</value>
-                <value dataType="string" bitLength="72">3.1415927</value>
+                <value dataType="string" bitLength="72" encoding="UTF-8">3.1415927</value>
+                <value dataType="string" bitLength="72" encoding="UTF-8">3.1415927</value>
               </hurz>
             </fields>
           </PlcWriteRequest>
           <fields>
-            <hurz dataType="string" bitLength="16">OK</hurz>
+            <hurz dataType="string" bitLength="16" encoding="UTF-8">OK</hurz>
           </fields>
         </PlcWriteResponse>
       </api-response>
diff --git a/protocols/s7/src/test/resources/protocols/s7/DriverTestsuite.xml b/protocols/s7/src/test/resources/protocols/s7/DriverTestsuite.xml
index 6b5e78c..bfd535f 100644
--- a/protocols/s7/src/test/resources/protocols/s7/DriverTestsuite.xml
+++ b/protocols/s7/src/test/resources/protocols/s7/DriverTestsuite.xml
@@ -535,12 +535,12 @@
             <fields>
               <hurz>
                 <S7Field>
-                  <memoryArea dataType="string" bitLength="56">OUTPUTS</memoryArea>
+                  <memoryArea dataType="string" bitLength="56" encoding="UTF-8">OUTPUTS</memoryArea>
                   <blockNumber dataType="int" bitLength="64">0</blockNumber>
                   <byteOffset dataType="int" bitLength="64">0</byteOffset>
                   <bitOffset dataType="int" bitLength="64">0</bitOffset>
                   <numElements dataType="int" bitLength="64">1</numElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </S7Field>
               </hurz>
             </fields>
@@ -548,8 +548,8 @@
           <values>
             <hurz>
               <ResponseItem>
-                <result dataType="string" bitLength="16">OK</result>
-                <PlcBOOL dataType="string" bitLength="32">true</PlcBOOL>
+                <result dataType="string" bitLength="16" encoding="UTF-8">OK</result>
+                <PlcBOOL dataType="bit" bitLength="1">true</PlcBOOL>
               </ResponseItem>
             </hurz>
           </values>
@@ -671,12 +671,12 @@
             <fields>
               <hurz>
                 <S7Field>
-                  <memoryArea dataType="string" bitLength="56">OUTPUTS</memoryArea>
+                  <memoryArea dataType="string" bitLength="56" encoding="UTF-8">OUTPUTS</memoryArea>
                   <blockNumber dataType="int" bitLength="64">0</blockNumber>
                   <byteOffset dataType="int" bitLength="64">0</byteOffset>
                   <bitOffset dataType="int" bitLength="64">0</bitOffset>
                   <numElements dataType="int" bitLength="64">1</numElements>
-                  <dataType dataType="string" bitLength="32">BOOL</dataType>
+                  <dataType dataType="string" bitLength="32" encoding="UTF-8">BOOL</dataType>
                 </S7Field>
               </hurz>
             </fields>
@@ -684,7 +684,7 @@
           <values>
             <hurz>
               <ResponseItem>
-                <result dataType="string" bitLength="104">ACCESS_DENIED</result>
+                <result dataType="string" bitLength="104" encoding="UTF-8">ACCESS_DENIED</result>
               </ResponseItem>
             </hurz>
           </values>