R4A version of SocketCAN test port

Signed-off-by: Lenard Nagy <lenard.nagy@ericsson.com>
diff --git a/README.md b/README.md
index 7e94e9e..c475a24 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,4 @@
-# titan.TestPorts.SocketCANasp
-# compiled with: Titan CRL 113 200/6 R5A
-# GCC 7.3.0 Using OpenSSL 1.0.2n  
-

+# titan.TestPorts.SocketCANasp

 

 Main project page:

 

@@ -22,28 +19,33 @@
 http://www.can-cia.de/fileadmin/resources/documents/proceedings/2012_hartkopp.pdf

 http://v2.can-newsletter.org/uploads/media/raw/46c15d02e1fdd3b04e671693ec548ff7.pdf

 

-# See file: src/initscript.sh:

+# See file: demo/initscript.sh:

 

 #--------------------------------------

 #!/bin/bash

 

+

+# create a virtual can interface:

+

+sudo modprobe vcan

+sudo ip link add dev vcan0 type vcan

+sudo ip link set vcan0 up

+

+#!/bin/bash

+

 # Add vcan module to kernel

 sudo modprobe vcan

 

 # Setup of virtual can vcan0

 sudo ip link add dev vcan0 type vcan

-# set it up at as a canfd can interface

+# set it up at as a canfd capable can interface

 sudo ip link set vcan0 mtu 72

 sudo ip link set vcan0 up

 

-# Setup of virtual can vcan1

-sudo ip link add dev vcan1 type vcan

-sudo ip link set vcan1 up

+# or create a physical can interface

+# sudo ip link set can0 up type can bitrate 1000000

 

-# example configuration of a physical can bus interface

-#sudo ip link set can0 up type can bitrate 1000000

-

-ifconfig

+ip a

 

 #--------------------------------------

 

@@ -56,10 +58,12 @@
 make clean; make

 

 ttcn3_start SocketCAN SocketCAN.cfg

+or 

+ttcn3_start SocketCAN CAN_matrix_test.cfg

 

 or to run a certain testcase:

 

-ttcn3_start SocketCAN SocketCAN.cfg  SocketCANtest.tc_can_raw1 SocketCANtest.tc_can_bcm1

+ttcn3_start SocketCAN SocketCAN.cfg  SocketCAN_RAW_test.tc_can_raw_send_and_receive_can_frame SocketCAN_RAW_test.tc_can_raw_setsockopt_CAN_RAW_FILTER

 

 Review the newly created log files in the src directory

 and use e.g. Wireshark to trace the CAN interfacce.

@@ -78,16 +82,22 @@
  test interfaces for each interface have to be defined in the MTC.

  

 -CAN RAW:

- CAN and CANFD has been implemented and tested.

- Depending on the availability of the C-code #define CANFD_SUPPORT

- in src/SocketCAN_PT.cc CAN-FD support is enabled at compile time.

- If you kernel does not have CANFD support comment out the #define CANFD_SUPPORT

- the file "src/SocketCAN_PT.cc"

+ CAN FD has been implemented, however not been tested.

+ Depending on the availability of the C-code #define "CAN_FD_FRAME"

+ in /usr/include/linux/can/bcm.h, CAN-FD support is enabled at compile time.

+ The RAW setsockopt has path coverage. However no test coverage that insures

+ the setsockopt functionality provided by the kernel is working correctly. 

+ For this purpose in the future might be added additional test cases.

 

 -CAN BCM:

  TX_SETUP, TX_DELETE have been tested, TX_READ is known to fail test cases.

- The BCM has test coverage for TX_SETUP and TX_DELETE. 

+ Some tests have indicated, that that SocketCAN BCM does not support concurrently

+ active BCM channels.

+ The BCM has test coverage for TX_SETUP and TX_DELETE. However no test coverage

+ that insures the BCM functionality provided by the kernel is working correctly. 

+ For this purpose in the future might be added additional test cases.

  Return values other than the error code by the BCM are not yet supported.

+ BCM wth CAN FD frames has not been tested yet.

 

 -ISOTP:

  Iso TP functionality has been added, however currently no options like padding 

@@ -103,13 +113,45 @@
  There is an endlessly running test case: 

  ttcn3_start SocketCAN SocketCAN.cfg Isotptest.tc_Isotp_Example001

  

+-CAN J1939:

+Configure CAN J1939 as following (requires Kernel 5.4 and compiled with can-j1939 kernel module):

+sudo modprobe vcan

+sudo ip link add vcan0 type vcan

+sudo ip link set vcan0 up

+sudo modprobe can-j1939

+

+For the following test cases, the messages are so huge that screen output of the log file takes too long.

+Thus comment out as following the following lines in J1939.cfg:

+//FileMask := LOG_ALL | DEBUG | MATCHING

+//ConsoleMask := LOG_ALL | DEBUG | MATCHING

+

+ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_j1939_send_and_receive_message

+ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_j1939_send_and_receive_message_parallel

+

+Here above lines can be commented in:

+ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_f_j1939_address_claim

+ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_f_j1939_request_for_address_claimed

+

+

+

+ 

 -Merging of logfiles:

  To merge the logfies from multiple Parallel Test Componets (PTCs) from a

- single run in timely order into sigle file, run in demo directory:

-   $  ./merge.sh

-      the merged and pretty printed log file is found in "demo/log_merged_pretty.txt"

+ single run in timely order into sigle file, run:

+ ttcn3_logmerge -o log_merged.txt *.log

+ The merged log-file is found at log_merged.txt

  

-

--Dunping CAN Frames using SocketCAN:

+ -Pretty printing the log file:

+ ttcn3_logformat -o log_merged_format.log log_merged.log

+ 

+-Dumping CAN Frames using SocketCAN:

  To dump all received can frames of e.g. "vcan0" run a seperate terminal:

-   $ candump "vcan0"

+   $ candump -td -d "vcan0"

+

+-Spying J1939 CAN-Frames using SocketCAN (only for SocketCAN J1939):

+   $ j1939spy -td -P -b 4193977 vcan0

+

+- Runnung ttcn compiler and merging logs:

+

+rm *.log;make;ttcn3_start SocketCAN J1939.cfg J1939_Isobus_test.tc_can_j1939_IsobusVtEcuSimulation ;ttcn3_logmerge -o log_merged.log *.log;ttcn3_logformat -o log_merged_format.log log_merged.log;kate log_merged_format.log

+ 2004  history | grep ttcn

diff --git a/demo/Isobus.ttcn b/demo/Isobus.ttcn
index 6c525f6..20b6702 100644
--- a/demo/Isobus.ttcn
+++ b/demo/Isobus.ttcn
@@ -15,58 +15,27 @@
 
 module Isobus {
 import from General_Types all
-import from Can all
 import from IsobusCMMessageTypes all
 import from IsobusNMMessageTypes all
 import from IsobusVTMessageTypes all
 import from J1939 all
 
-// Note:
-// SocketCAN Error frames are not considered here
-// SocketCAN RTR frames are not considered here
-// SocketCAN Basic frames are not considered here
-
-external function encode_CAN_frame_j1939mod(in CAN_frame_j1939mod pdu) return octetstring 
+external function f_encode_J1939_message(in J1939_messageWithPGN pdu) return octetstring 
 with { extension "prototype(convert) encode(RAW)" }
-external function decode_CAN_frame_j1939mod(in octetstring data) return CAN_frame_j1939mod
+external function f_decode_J1939_message(in octetstring data) return J1939_messageWithPGN
 with { extension "prototype(convert) decode(RAW)" }
 
-const octetstring ISOBUS_PRIORITY_MASK    := '1C000000'O;
-const octetstring ISOBUS_RESERVED_MASK    := '02000000'O;
-const octetstring ISOBUS_DATAPAGE_MASK    := '01000000'O;
-const octetstring ISOBUS_PDUFORMAT_MASK   := '00FF0000'O;
-const octetstring ISOBUS_PDUSPECIFIC_MASK := '0000FF00'O;
-const octetstring ISOBUS_SOURCEADDRESS_MASK := '000000FF'O;
-
 type J1939_Priority Priority
 
-type record J1939_header { // Error & RTR Frames are not considered here
-  //PGN   pgn optional,
-  //BIT3           ignore,
-  Priority       prio,
-  BIT1           res, 
-  BIT1           dp,
-  OCT1           pf,
-  OCT1           ps,
-  SourceAddress  sa
-} with { variant "FIELDORDER(msb)" }
+type record J1939PDU_with_NAME
+{
+  J1939_ADDR                            addr,
+  J1939_NAME                            name,
+  J1939_messageWithPGN                  pdu
+} with {variant "" };
 
 
-
-type record J1939mod { // Error & RTR Frames are not considered here
-  //PGN   pgn optional,
-  //BIT3           ignore,
-  Priority       prio,
-  BIT1           res, 
-  BIT1           dp,
-  OCT1           pf,
-  OCT1           ps,
-  SourceAddress  sa,
-  OCT3           comp
-} with { variant "FIELDORDER(msb)" }
-
-
-type union AnyIsoBusPdu {
+type union Isobus_message {
   ETP_DT                     etp_dt,  // extended TP data transfer
   ETP_CM                     etp_cm,  // extended TP connection management 
   VT2ECU                     vt2ecu,  // Message Virtual Terminal (VT) to ECU
@@ -75,240 +44,35 @@
   TP_DT                      tp_dt,   // TP data transfer
   TP_CM                      tp_cm,   // TP connection management
   NetworkMessage             networkMessage, // Network Message according ISO 11873-4
-  CannotClaimSourceAddress   cannotClaimSourceAddress,
-  AddressClaimed             addressClaimed,
+  //CannotClaimSourceAddress   cannotClaimSourceAddress,
+  //AddressClaimed             addressClaimed,
+  AddressClaimed               addressClaimedOrCannotClaimSourceAddress, 
   CommandedAddress           commandedAddress
   // other upper layer isobus protocols like Task Comtroller are added here ...
 }
 with { variant "" }
 
-type record CAN_frame_j1939 {
-  J1939_header               can_j1939,
-  AnyIsoBusPdu        can_pdu 
-}with { variant "" }
 
-
-type record CAN_frame_j1939mod {
-  J1939mod            can_j1939,
-  AnyIsoBusPdu        can_pdu 
-}with {
-  variant (can_pdu) "CROSSTAG(
-  etp_dt,                   can_j1939.comp = 'C70000'O;  //199
-  etp_cm,                   can_j1939.comp = 'C80000'O;  //200
-  vt2ecu,                   can_j1939.comp = 'E60000'O;  //230
-  ecu2vt,                   can_j1939.comp = 'E70000'O;  //231
-  requestForAddressClaimed, can_j1939.comp = 'EA0000'O;  //234
-  tp_dt,                    can_j1939.comp = 'EB0000'O;  //235
-  tp_cm,                    can_j1939.comp = 'EC0000'O;  //236
-  networkMessage,           can_j1939.comp = 'ED0000'O;  //237
-  cannotClaimSourceAddress, can_j1939.comp = 'EEFFFE'O;  //238 all and conjuction needed!!!!!!
-  addressClaimed,           can_j1939.comp = 'EEFF00'O;  //238 all and conjuction needed!!!!!!
-  commandedAddress,         can_j1939.comp = 'FED800'O)" //254 all and conjuction needed!!!!!!
+type record J1939_messageWithPGN {
+J1939_PGN pgn,
+Isobus_message pdu
 }
-
-function j1939frame2can(in CAN_frame_j1939 p_can_frame_j1939, in Priority p_priority, in DestinationAddress p_da, in SourceAddress p_sa) return CAN_frame {
-  var CAN_frame v_can_frame
-  v_can_frame.can_id := pdu1_j1939id2canid(p_can_frame_j1939.can_j1939, p_priority, p_da, p_sa)
-  // v_can_frame.can_pdu := encode_AnyIsoBusPdu(p_can_frame_j1939.can_pdu)
-  v_can_frame.can_pdu := substr(f_encode_CAN_frame_j1939(p_can_frame_j1939),0,3)//strip 3 byte header 
-  return v_can_frame
-}
-
-function pdu1_j1939id2canid(in J1939_header p_j1939, in Priority p_priority, in DestinationAddress p_da, in SourceAddress p_sa) return CAN_id{
-  var CAN_id v_can_id
-  v_can_id := bit2oct(oct2bit(p_sa) or4b (oct2bit(p_da) << 8) or4b (oct2bit(p_j1939.pf) << 16) or4b ((p_j1939.dp) << 24) or4b 
-    ((p_j1939.res) << 25) or4b (int2bit(p_priority, 32) << 26))
-  return v_can_id
-}
-
-/*
-function j1939id2canid(in J1939 p_j1939) return CAN_id{
-var CAN_id v_can_id
-v_can_id := (p_j1939.sa << 0) or4b (p_j1939.ps << 8) or4b (p_j1939.pf << 16) or4b bit2oct(p_j1939.dp << 24) or4b 
-bit2oct(p_j1939.res << 25) or4b bit2oct(p_j1939.prio << 26)
-return v_can_id
-}
-*/
-
-function j1939id2canid(in J1939_header p_j1939) return CAN_id{
-  var CAN_id v_can_id
-  v_can_id := int2oct(
-    oct2int(p_j1939.sa) + oct2int(p_j1939.ps)*256 + oct2int(p_j1939.pf) * 256 * 256 + 
-    bit2int(p_j1939.dp) * 256 * 256 * 256 + bit2int(p_j1939.res) * 256 * 256 * 256 * 2 + 
-    p_j1939.prio * 256 * 256 * 256 * 2 * 2, 
-    4 )
-  return v_can_id
-}
-
-//---------------------------------------------------------------------------------------
-function can2j1939frame(CAN_frame p_can_frame) return CAN_frame_j1939 {
-  //--------------------------------------------------------------------------------------- 
-  var CAN_frame_j1939 v_can_frame_j1939
-
-  //log("can_id", p_can_frame.can_id)  
-  //log("can_pdu", p_can_frame.can_pdu)
-
-  v_can_frame_j1939:=f_decode_CAN_frame_j1939(p_can_frame.can_id& p_can_frame.can_pdu)
-
-  //log("Higher layer octet pdustring: ", v_can_frame_j1939)
-  return v_can_frame_j1939
-}
-
-function canid2j1939(in CAN_id p_can_id) return J1939_header {
-  //--------------------------------------------------------------------------------------- 
-
-  var bitstring v_can_id_bitstring:= oct2bit(p_can_id)
-  var J1939_header v_j1939
-
-  v_j1939.prio :=bit2int(substr(v_can_id_bitstring, 0, 6)); //3 ,3
-  v_j1939.res  :=v_can_id_bitstring[6];
-  v_j1939.dp   :=v_can_id_bitstring[7];
-  v_j1939.pf   :=p_can_id[1];//(p_can_id and4b ISOBUS_PDUFORMAT_MASK) >> 2   // shift 16 bits = 2 octets
-  v_j1939.ps   :=p_can_id[2];// (p_can_id and4b ISOBUS_PDUSPECIFIC_MASK) >> 1 // shift  8 bits = 1 octet
-  v_j1939.sa   :=p_can_id[3];//(p_can_id and4b ISOBUS_SOURCEADDRESS_MASK)
-
-  return v_j1939
-}
-
-//********************************************************************************-
-
-
-
-//---------------------------------------------------------------------------
-function f_insert_aux_hdr(in octetstring p_os) return octetstring
-//---------------------------------------------------------------------------
-{
-  var OCT3 v_os
-
-
-  v_os[0]:=p_os[1];//pf
-  if(p_os[1] == 'FE'O)
-  {
-    if (p_os[2]=='D8'O) {v_os[1]:='D8'O;v_os[2]:='00'O;}
-  }
-
-  else if(p_os[1] == 'EE'O)
-  {
-    if (p_os[2] == 'FF'O) 
-    { if (p_os[3]=='FE'O) {v_os[1]:='FF'O;v_os[2]:='FE'O;}
-      else                  {v_os[1]:='FF'O;v_os[2]:='00'O;}
-    }
-
-  } 
-
-
-  else  { v_os[1]:='00'O;v_os[2]:='00'O;}
-
-
-  //log("replace(p_os,4,0,v_os)  :",replace(p_os,4,0,v_os))
-
-  return replace(p_os,4,0,v_os)//insert aux header
-}
-
-//---------------------------------------------------------------------------
-function f_remove_aux_hdr(in octetstring p_os) return octetstring
-//---------------------------------------------------------------------------
-{
-  //log("p_os  :",p_os)
-
-
-  p_os[1]:=p_os[4]; //pf := aux[0];
-  if (p_os[4] == 'EE'O)  
-  {
-    if (p_os[6] == 'FE'O ) { //'EEFFFE' O
-      p_os[2]:=p_os[5]; //ps := aux[1];
-      p_os[3]:=p_os[6]; //sa := aux[2];
-    }
-    else    { //'EEFFXX'O
-      p_os[2]:=p_os[5]; //ps := aux[1];
-    }
-  } 
-  else  if  (p_os[4] == 'FE'O) //'FED8XX'O
-  {
-    p_os[2]:=p_os[5]; //ps := aux[1];
-  }
-
-
-  //log("p_os  :",p_os)
-
-  //log("replace(p_os,4,3,''O)   :",replace(p_os,4,3,''O))
-  return replace(p_os,4,3,''O); //remove aux header
-}
-
-//---------------------------------------------------------------------------
-function f_map_mod2frame(in CAN_frame_j1939mod p_frame) return CAN_frame_j1939
-//---------------------------------------------------------------------------
-{
-  var CAN_frame_j1939 v_CAN_frame_j1939
-
-  v_CAN_frame_j1939.can_pdu:=p_frame.can_pdu;
-  v_CAN_frame_j1939.can_j1939.prio:=p_frame.can_j1939.prio;
-  v_CAN_frame_j1939.can_j1939.res:=p_frame.can_j1939.res;
-  v_CAN_frame_j1939.can_j1939.dp:=p_frame.can_j1939.dp;
-  v_CAN_frame_j1939.can_j1939.pf:=p_frame.can_j1939.pf;
-  v_CAN_frame_j1939.can_j1939.ps:=p_frame.can_j1939.ps;
-  v_CAN_frame_j1939.can_j1939.sa:=p_frame.can_j1939.sa;
-
-
-  //log("v_CAN_frame_j1939   :",v_CAN_frame_j1939)
-  return v_CAN_frame_j1939
-
-}
-
-
-//---------------------------------------------------------------------------
-function f_map_frame2mod(in CAN_frame_j1939 p_frame) return CAN_frame_j1939mod
-//---------------------------------------------------------------------------
-{
-  var CAN_frame_j1939mod v_CAN_frame_j1939mod
-
-
-  v_CAN_frame_j1939mod.can_pdu:=p_frame.can_pdu;
-  v_CAN_frame_j1939mod.can_j1939.prio:=p_frame.can_j1939.prio;
-  v_CAN_frame_j1939mod.can_j1939.res:=p_frame.can_j1939.res;
-  v_CAN_frame_j1939mod.can_j1939.dp:=p_frame.can_j1939.dp;
-  v_CAN_frame_j1939mod.can_j1939.pf:=p_frame.can_j1939.pf;
-  v_CAN_frame_j1939mod.can_j1939.ps:=p_frame.can_j1939.ps;
-  v_CAN_frame_j1939mod.can_j1939.sa:=p_frame.can_j1939.sa;
-  if (p_frame.can_j1939.pf == 'EE'O)
-  {
-    if (p_frame.can_j1939.ps == 'D8'O)  { 
-      v_CAN_frame_j1939mod.can_j1939.comp := p_frame.can_j1939.pf&p_frame.can_j1939.ps&'00'O;
-    } else if (p_frame.can_j1939.ps == 'FF'O) {
-      if (p_frame.can_j1939.sa == 'FE'O) {
-        v_CAN_frame_j1939mod.can_j1939.comp := p_frame.can_j1939.pf&p_frame.can_j1939.ps&p_frame.can_j1939.sa
-      } else {//??
-        v_CAN_frame_j1939mod.can_j1939.comp:=p_frame.can_j1939.pf&'0000'O;
-      }
-    } else {//?? 
-      v_CAN_frame_j1939mod.can_j1939.comp:=p_frame.can_j1939.pf&'0000'O;
-    } 
-  } else {
-    v_CAN_frame_j1939mod.can_j1939.comp := p_frame.can_j1939.pf&'0000'O;
-  }
-  //log("v_CAN_frame_j1939mod  :",v_CAN_frame_j1939mod)
-  return v_CAN_frame_j1939mod;
-}
-
-
-
-//---------------------------------------------------------------------------
-function f_encode_CAN_frame_j1939(in CAN_frame_j1939 pdu) return octetstring 
-//---------------------------------------------------------------------------
-{
-
-  return f_remove_aux_hdr(encode_CAN_frame_j1939mod(f_map_frame2mod(pdu)))
-
-
-}
-//---------------------------------------------------------------------------
-function f_decode_CAN_frame_j1939(in octetstring data) return CAN_frame_j1939
-//---------------------------------------------------------------------------
-{
-  log("f_insert_aux_hdr(data)", f_insert_aux_hdr(data));
-  return f_map_mod2frame(decode_CAN_frame_j1939mod(f_insert_aux_hdr(data)))
-
-
+with {
+  variant (pdu) "CROSSTAG(
+  etp_dt,                   pgn = '00C700'O;  //199
+  etp_cm,                   pgn = '00C800'O;  //200
+  vt2ecu,                   pgn = '00E600'O;  //230
+  ecu2vt,                   pgn = '00E700'O;  //231
+  requestForAddressClaimed, pgn = '00EA00'O;  //234
+  tp_dt,                    pgn = '00EB00'O;  //235
+  tp_cm,                    pgn = '00EC00'O;  //236
+  networkMessage,           pgn = '00ED00'O;  //237
+  // cannotClaimSourceAddress, pgn = '00EEFFFE'O;  //238 where the SA is 'FE'O
+  // addressClaimed,           pgn = '00EEFFXX'O;   //238 where the SA is XX != FE!
+  addressClaimedOrCannotClaimSourceAddress,   pgn = '00EEFF'O;  //238, the SA determies
+                                                                // if it is addressClaimed (SA != 'FE'O)
+                                                                // or it is cannotClaimSourceAddress (SA == 'FE'O)
+  commandedAddress,         pgn = '00FED8'O)"  //254 
 }
 
 
diff --git a/demo/IsobusMessageTypes.ttcn b/demo/IsobusMessageTypes.ttcn
index e706f17..794f35d 100644
--- a/demo/IsobusMessageTypes.ttcn
+++ b/demo/IsobusMessageTypes.ttcn
@@ -9,8 +9,7 @@
 type integer INT24nb (0..16777215) with { variant "FIELDLENGTH(24), COMP(nosign), BYTEORDER(last)" };
 type INT24nb PGN
 
-type bitstring BIT21 length(21) with { variant "FIELDLENGTH(21)" };
-  
+
 type integer INT2 (0..65535) 
 with { variant "FIELDLENGTH(16)" };
 
diff --git a/demo/IsobusNMMessageTypes.ttcn b/demo/IsobusNMMessageTypes.ttcn
index 3a4ed24..c110803 100644
--- a/demo/IsobusNMMessageTypes.ttcn
+++ b/demo/IsobusNMMessageTypes.ttcn
@@ -5,6 +5,7 @@
 
 module IsobusNMMessageTypes {
 
+import from J1939 all
 import from General_Types all
 import from IsobusMessageTypes all
 
@@ -20,39 +21,22 @@
   variant "FIELDLENGTH(6)"
 }
 
-type BIT1  SelfConfigurableAddressBits
-type BIT3  IndustryGroupBits
-type BIT4  DeviceClassInstanceBits
-type BIT7  DeviceClassBits
-type BIT1  ReservedBits
-type BIT8  FunctionBits
-type BIT5  FunctionInstanceBits
-type BIT3  ECUInstanceBits
-type BIT11 ManufacturerCodeBits
-type BIT21 IdentityNumberBits
 
-type record NAME {
-  SelfConfigurableAddressBits selfConfigurableAddressValue,
-  IndustryGroupBits           industryGroupValue,
-  DeviceClassInstanceBits     deviceClassInstanceValue,
-  DeviceClassBits             deviceClassValue,
-  ReservedBits                reserveValued,
-  FunctionBits                functionValue,
-  FunctionInstanceBits        functionInstanceValue,
-  ECUInstanceBits             ecuInstancceValue,
-  ManufacturerCodeBits        manufacturerCodeValue,
-  IdentityNumberBits          identityNumberBits
-} with { variant "FIELDORDER(msb)" }
+
 
 
 type record CannotClaimSourceAddress
 {
-  NAME          name
+  J1939_NAME_RECORD_REVERSE_BYTE_ENCODING          name
+    // or alternatively
+  // J1939_NAME          name 
 } with { variant "" }
 
 type record AddressClaimed
 {
-  NAME          name
+  J1939_NAME_RECORD_REVERSE_BYTE_ENCODING          name
+  // or alternatively
+  // J1939_NAME          name 
 } with { variant "" }
 
 type record RequestForAddressClaimed {
@@ -62,8 +46,10 @@
 
 
 type record CommandedAddress {
-  NAME          name,
-  SourceAddress newSourceAddress
+  J1939_NAME_RECORD_REVERSE_BYTE_ENCODING          name,
+    // or alternatively
+  // J1939_NAME          name 
+  SourceAddress                                    newSourceAddress
 } with { variant "" }
 
 // --------- NetworkMessage -------------
@@ -129,7 +115,7 @@
 {
   INT1                                      maxTransferRate,
   PGN                                       pgn,
-  NAME                                      name,
+  J1939_NAME                                name,
   OCT8                                      nameQualifier
 } with {variant "" };
 
@@ -178,7 +164,7 @@
 type record SA_NAME_pair
 {
   SourceAddress                             sourceAddress,
-  NAME                                      name
+  J1939_NAME                                name
 } with {variant "" };
 
 type record N_NTX_Response 
@@ -327,7 +313,7 @@
 {
   Function                                  msgFunction (192),
   PortPair                                  portPair,  
-  NAME                                      nameOfCF
+  J1939_NAME                                nameOfCF
 } with {
   variant "" }
 
@@ -335,7 +321,7 @@
 {
   Function                                  msgFunction (193),
   PortPair                                  portPair,  
-  NAME                                      nameOfCF
+  J1939_NAME                                nameOfCF
 } with {
   variant "" }  
   
diff --git a/demo/IsobusVTMessageTypes.ttcn b/demo/IsobusVTMessageTypes.ttcn
index ab0edba..b127d80 100644
--- a/demo/IsobusVTMessageTypes.ttcn
+++ b/demo/IsobusVTMessageTypes.ttcn
@@ -3,16 +3,6 @@
 import from General_Types all
 import from IsobusMessageTypes all
 
-external function encode_VT2ECU(in VT2ECU pdu) return octetstring 
-with { extension "prototype(convert) encode(RAW)" }
-external function decode_VT2ECU(in octetstring data) return VT2ECU
-with { extension "prototype(convert) decode(RAW)" }
-
-external function encode_ECU2VT(in ECU2VT pdu) return octetstring 
-with { extension "prototype(convert) encode(RAW)" }
-external function decode_ECU2VT(in octetstring data) return ECU2VT
-with { extension "prototype(convert) decode(RAW)" }
-
 type INT1 VTfunction
 
 type integer AnyObjectID (0..65535) with { variant "FIELDLENGTH(16)" }; // includes also 65535 as no object
@@ -62,9 +52,8 @@
   e_SoftKeyActivationReq_KeyAactivationCode keyActivationCode,
   ValidObjectID                             objectID,
   ValidObjectID                             parentObjectID,
-  KeyNumberType                             keyNumber,
-  OCT1                                      reserved8  ('FF'O)
-} with {variant "" };
+  KeyNumberType                             keyNumber
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record SoftKeyActivationRes 
 {
@@ -72,9 +61,8 @@
   e_SoftKeyActivationReq_KeyAactivationCode keyActivationCode,  
   ValidObjectID                             objectID,
   ValidObjectID                             parentObjectID,
-  KeyNumberType                             keyNumber,
-  OCT1                                      reserved8  ('FF'O)
-} with {variant "" };
+  KeyNumberType                             keyNumber
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type enumerated e_ButtonActivationReq_KeyAactivationCode { 
   buttonHasBeenUnlatchedorReleased     (0),
@@ -89,9 +77,8 @@
   e_ButtonActivationReq_KeyAactivationCode keyAactivationCode,
   ValidObjectID                            objectID,
   ValidObjectID                            parentObjectID,
-  KeyNumberType                            buttonKeyCode,
-  OCT1                                     reserved8  ('FF'O)
-} with {variant "" };
+  KeyNumberType                            buttonKeyCode
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type enumerated e_ButtonActivationRes_KeyAactivationCode { 
   buttonHasBeenUnlatchedorReleased     (0),
@@ -106,9 +93,8 @@
   e_ButtonActivationRes_KeyAactivationCode keyAactivationCode,
   ValidObjectID                            objectID,
   ValidObjectID                            parentObjectID,
-  KeyNumberType                            buttonKeyCode,
-  OCT1                                     reserved8  ('FF'O)
-} with {variant "" };
+  KeyNumberType                            buttonKeyCode
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type enumerated e_PointingEvent_touchState {
   released    (0), // version 4 and later
@@ -121,19 +107,15 @@
   VTfunction                      vtfunction (2),
   PositionType                    x_position,
   PositionType                    y_position,
-  e_PointingEvent_touchState   touchState,
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with {variant "" };
+  e_PointingEvent_touchState   touchState
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record PointingEventRes {
   VTfunction                      vtfunction (2),
   PositionType                    x_position,
   PositionType                    y_position,
-  e_PointingEvent_touchState   touchState,
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with {variant "" };
+  e_PointingEvent_touchState   touchState
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type enumerated e_VTOnUserLayoutHideShow_state { 
   hidden     (0),
@@ -175,61 +157,41 @@
   VTfunction                             vtfunction (3),
   ValidObjectID                          objectID,
   e_VTSelectInputObject_selection        selection,
-  VTSelectInputObject_Bitmask            bitmask,
-  OCT1                                   reserved6  ('FF'O),
-  OCT1                                   reserved7  ('FF'O),
-  OCT1                                   reserved8  ('FF'O)
-} with {variant "" };
+  VTSelectInputObject_Bitmask            bitmask
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTSelectInputObjectReq_v3AndPrior {
   VTfunction                      vtfunction (3),
   ValidObjectID                   objectID,
-  e_VTSelectInputObject_selection selection,
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with {variant "" };
+  e_VTSelectInputObject_selection selection
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTSelectInputObjectReq_v4AndLater {
   VTfunction                             vtfunction (3),
   ValidObjectID                          objectID,
   e_VTSelectInputObject_selection        selection,
-  VTSelectInputObject_v4AndLater_Bitmask bitmask,
-  OCT1                                   reserved6  ('FF'O),
-  OCT1                                   reserved7  ('FF'O),
-  OCT1                                   reserved8  ('FF'O)
-} with {variant "" };
+  VTSelectInputObject_v4AndLater_Bitmask bitmask
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTSelectInputObjectRes {
   VTfunction                             vtfunction (3),
   ValidObjectID                          objectID,
   e_VTSelectInputObject_selection        selection,
-  VTSelectInputObject_Bitmask            bitmask,
-  OCT1                                   reserved6  ('FF'O),
-  OCT1                                   reserved7  ('FF'O),
-  OCT1                                   reserved8  ('FF'O)
-} with {variant "" };
+  VTSelectInputObject_Bitmask            bitmask
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTSelectInputObjectRes_v4AndPrior {
   VTfunction                      vtfunction (3),
   ValidObjectID                   objectID,
-  e_VTSelectInputObject_selection selection,
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with {variant "" };
+  e_VTSelectInputObject_selection selection
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTSelectInputObjectRes_v5AndLater {
   VTfunction                             vtfunction (3),
   ValidObjectID                          objectID,
   e_VTSelectInputObject_selection        selection,
-  VTSelectInputObject_v4AndLater_Bitmask bitmask,
-  OCT1                                   reserved6  ('FF'O),
-  OCT1                                   reserved7  ('FF'O),
-  OCT1                                   reserved8  ('FF'O)
-} with {variant "" };
+  VTSelectInputObject_v4AndLater_Bitmask bitmask
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTESC_ErrorCodes{ 
   boolean noInputFieldIsSelected,
@@ -247,22 +209,13 @@
 type record VTESCReq {
   VTfunction                             vtfunction (4),
   AnyObjectID                            objectID, // Object ID where input was aborted if no error code
-  VTESC_ErrorCodes                       errorCodes,
-  OCT1                                   reserved5  ('FF'O),
-  OCT1                                   reserved6  ('FF'O),
-  OCT1                                   reserved7  ('FF'O),
-  OCT1                                   reserved8  ('FF'O)
-} with {variant "" };
+  VTESC_ErrorCodes                       errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTESCRes {
   VTfunction                             vtfunction (4),
-  AnyObjectID                            objectID, // Object ID where input was aborted if no error code
-  OCT1                                   reserved4  ('FF'O),
-  OCT1                                   reserved5  ('FF'O),
-  OCT1                                   reserved6  ('FF'O),
-  OCT1                                   reserved7  ('FF'O),
-  OCT1                                   reserved8  ('FF'O)
-} with {variant "" };
+  AnyObjectID                            objectID // Object ID where input was aborted if no error code
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTChangeNumericValueReq
 {
@@ -304,13 +257,8 @@
 type record VTChangeActiveMaskRes
 {
   VTfunction                      vtfunction (6),
-  ValidObjectID                   activeMaskObjectID,
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  ValidObjectID                   activeMaskObjectID
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 
 type record VTChangeSoftKeyMaskErrorCodes{ 
@@ -330,20 +278,15 @@
   VTfunction                      vtfunction (7),
   ValidObjectID                   dataOrAlarmMaskObjectID,
   ValidObjectID                   softKeyMaskObjectID,
-  VTChangeSoftKeyMaskErrorCodes   errorCodes,
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  VTChangeSoftKeyMaskErrorCodes   errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTChangeSoftKeyMaskRes
 {
   VTfunction                      vtfunction (7),
   ValidObjectID                   dataOrAlarmMaskObjectID,
-  ValidObjectID                   softKeyMaskObjectID,
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  ValidObjectID                   softKeyMaskObjectID
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTChangeStringValueReq
 {
@@ -361,11 +304,8 @@
   VTfunction                      vtfunction (8),
   OCT1                            reserved2  ('FF'O),
   OCT1                            reserved3  ('FF'O),
-  ValidObjectID                   inputStringOrStringVariableObjectID,
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  ValidObjectID                   inputStringOrStringVariableObjectID
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTOnUserLayoutHideShowReq
 {
@@ -373,9 +313,9 @@
   ValidObjectID                   objectID1,
   e_VTOnUserLayoutHideShow_state  state1,
   AnyObjectID                     objectID2,
-  e_VTOnUserLayoutHideShow_state  state2, // If the previous attribute is the NULL Object ID, this bit shall be set to false.
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  e_VTOnUserLayoutHideShow_state  state2 // If the previous attribute is the NULL Object ID, this bit shall be set to false.
+
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTOnUserLayoutHideShowRes
 {
@@ -383,9 +323,8 @@
   ValidObjectID                   objectID1,
   e_VTOnUserLayoutHideShow_state  state1,
   AnyObjectID                     objectID2,
-  e_VTOnUserLayoutHideShow_state  state2, // If the previous attribute is the NULL Object ID, this bit shall be set to false.
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  e_VTOnUserLayoutHideShow_state  state2 // If the previous attribute is the NULL Object ID, this bit shall be set to false.
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTControlAudioSignalTerminationParameterTerminationCause
 { 
@@ -404,14 +343,8 @@
 type record VTControlAudioSignalTerminationInd // version V4 or higher
 {
   VTfunction                                                vtfunction (10),
-  VTControlAudioSignalTerminationParameterTerminationCause  terminationCause,
-  OCT1                                                      reserved3  ('FF'O),
-  OCT1                                                      reserved4  ('FF'O),
-  OCT1                                                      reserved5  ('FF'O),
-  OCT1                                                      reserved6  ('FF'O),
-  OCT1                                                      reserved7  ('FF'O),
-  OCT1                                                      reserved8  ('FF'O)
-} with { variant "" };
+  VTControlAudioSignalTerminationParameterTerminationCause  terminationCause
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type octetstring ObjectPoolRecords  with { variant "" };
 
@@ -423,15 +356,8 @@
 
 type record EndOfObjectPoolReq
 {
-  VTfunction                      vtfunction (18),
-  OCT1                            reserved2  ('FF'O),
-  OCT1                            reserved3  ('FF'O),
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  VTfunction                      vtfunction (18)
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record EndOfObjectPoolResErrorCodes
 { 
@@ -465,9 +391,8 @@
   EndOfObjectPoolResErrorCodes           errorCodes,
   AnyObjectID                            parentObjectIDoFaultyObject, // set to NULL Object ID if there are no
   AnyObjectID                            objectIDofFaultyObject,      // set to NULL Object ID if there are no
-  EndOfObjectPoolResObjectPoolErrorCodes objectPoolErrorCodes,
-  OCT1                                   reserved8  ('FF'O)
-} with { variant "" };
+  EndOfObjectPoolResObjectPoolErrorCodes objectPoolErrorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTfunction32VT2ECU
 {
@@ -552,15 +477,8 @@
 
 type record ESCreq
 {
-  VTfunction                      vtfunction (146),
-  OCT1                            reserved2  ('FF'O),
-  OCT1                            reserved3  ('FF'O),
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  VTfunction                      vtfunction (146)
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ESCerrorCodes
 { 
@@ -595,12 +513,8 @@
 {
   VTfunction                      vtfunction (160),
   ValidObjectID                   objectID,
-  e_HideShowObject_state          hideShow,
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with {variant "" };
+  e_HideShowObject_state          hideShow
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record HideShowObjectRes_errorCodes{ 
   boolean referencesToMissingObjects,
@@ -619,11 +533,8 @@
   VTfunction                      vtfunction (160),
   ValidObjectID                   objectID,
   e_HideShowObject_state          hideShow,
-  HideShowObjectRes_errorCodes    errorCodes,
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with {variant "" };
+  HideShowObjectRes_errorCodes    errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record VTfunction161VT2ECU
 {
@@ -646,12 +557,8 @@
 {
   VTfunction                          vtfunction (161),
   ValidObjectID                       objectID,
-  e_EnableDisableObject_DisableEnable DisableEnable,
-  OCT1                                reserved5  ('FF'O),
-  OCT1                                reserved6  ('FF'O),
-  OCT1                                reserved7  ('FF'O),
-  OCT1                                reserved8  ('FF'O)
-} with {variant "" };
+  e_EnableDisableObject_DisableEnable DisableEnable
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record EnableDisableObjectRes_errorCodes { 
   boolean reserved0     (false),
@@ -670,11 +577,8 @@
   VTfunction                          vtfunction (161),
   ValidObjectID                       objectID,
   e_EnableDisableObject_DisableEnable DisableEnable,
-  EnableDisableObjectRes_errorCodes   errorCodes,
-  OCT1                                reserved6  ('FF'O),
-  OCT1                                reserved7  ('FF'O),
-  OCT1                                reserved8  ('FF'O)
-} with {variant "" };
+  EnableDisableObjectRes_errorCodes   errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 
 
@@ -688,12 +592,8 @@
 type record SelectInputObjectReq{
   VTfunction                      vtfunction (162),
   AnyObjectID                     objectID,
-  e_SelectInputObjectReq_Option   option,                
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)  
-} with {variant "" };
+  e_SelectInputObjectReq_Option   option 
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type enumerated e_SelectInputObjectRes_Response { 
   objectReferencedByObjectIDisNotSelectedOrObjectIDisTheNULLobject     (0),
@@ -716,12 +616,8 @@
 type record SelectInputObjectRes{
   VTfunction                      vtfunction (162),
   AnyObjectID                     objectID,
-  e_SelectInputObjectRes_Response response,                
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)  
-} with {variant "" };
+  e_SelectInputObjectRes_Response response 
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ControlAudioSignalReq{
   VTfunction                      vtfunction (163),
@@ -751,25 +647,14 @@
 
 type record ControlAudioSignalRes{
   VTfunction                        vtfunction (163),
-  ControlAudioSignalRes_ErrorCodes  errorCodes,
-  OCT1                            reserved3  ('FF'O),
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with {variant "" };
+  ControlAudioSignalRes_ErrorCodes  errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record SetAudioVolumeReq
 {
   VTfunction                      vtfunction (164),
-  PercentType                     volumeInPercent,
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  PercentType                     volumeInPercent
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record SetAudioVolumeErrorCodes
 { 
@@ -787,14 +672,8 @@
 type record SetAudioVolumeRes
 {
   VTfunction                      vtfunction (164),
-  SetAudioVolumeErrorCodes        errorCodes,
-  OCT1                            reserved3  ('FF'O),
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" }; 
+  SetAudioVolumeErrorCodes        errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record  ChangeChildLocationReq 
 {
@@ -802,9 +681,8 @@
   ValidObjectID                   parentObjectID,
   ValidObjectID                   objectIDofObjectToMove,
   DeltaPositionType               relativeChangeInXposition,
-  DeltaPositionType               relativeChangeInYposition,
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  DeltaPositionType               relativeChangeInYposition
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeChildLocationRes_errorCodes
 { 
@@ -824,19 +702,16 @@
   VTfunction                        vtfunction (165),
   ValidObjectID                     parentObjectID,
   ValidObjectID                     objectIDofObjectToMove,
-  ChangeChildLocationRes_errorCodes errorCodes,
-  OCT1                              reserved7  ('FF'O),
-  OCT1                              reserved8  ('FF'O)
-} with { variant "" };
+  ChangeChildLocationRes_errorCodes errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeSizeReq
 {
   VTfunction                        vtfunction (166),
   ValidObjectID                     objectIDofObjectToSize,
   WidthType                         newWidth,
-  HeightType                        newHeight,
-  OCT1                              reserved8  ('FF'O)
-} with { variant "" };
+  HeightType                        newHeight
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 
 type record ChangeSizeRes_errorCodes
@@ -856,23 +731,15 @@
 {
   VTfunction                        vtfunction (166),
   ValidObjectID                     objectIDofObjectToSize,
-  ChangeSizeRes_errorCodes          errorCodes,
-  OCT1                              reserved5  ('FF'O),
-  OCT1                              reserved6  ('FF'O),
-  OCT1                              reserved7  ('FF'O),
-  OCT1                              reserved8  ('FF'O)
-} with { variant "" };
+  ChangeSizeRes_errorCodes          errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeBackgroundColourReq
 {
   VTfunction                        vtfunction (167),
   ValidObjectID                     objectIDofObjectToChange,
-  ColorType                         newBackgroundColour,
-  OCT1                              reserved5  ('FF'O),
-  OCT1                              reserved6  ('FF'O),
-  OCT1                              reserved7  ('FF'O),
-  OCT1                              reserved8  ('FF'O)
-} with { variant "" };
+  ColorType                         newBackgroundColour
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeBackgroundColourRes_errorCodes { 
   boolean invalidObjectID,
@@ -891,11 +758,8 @@
   VTfunction                           vtfunction (167),
   ValidObjectID                        objectIDofObjectToChange,
   ColorType                            newBackgroundColour,
-  ChangeBackgroundColourRes_errorCodes errorCodes,
-  OCT1                                 reserved6  ('FF'O),
-  OCT1                                 reserved7  ('FF'O),
-  OCT1                                 reserved8  ('FF'O)
-} with { variant "" };
+  ChangeBackgroundColourRes_errorCodes errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeNumericValueReq{
   VTfunction                      vtfunction (168),
@@ -940,12 +804,8 @@
 {
   VTfunction                        vtfunction (169),
   ValidObjectID                     objectID,
-  ChangeEndPointRes_errorCodes      errorCodes,
-  OCT1                              reserved5  ('FF'O),
-  OCT1                              reserved6  ('FF'O),
-  OCT1                              reserved7  ('FF'O),
-  OCT1                              reserved8  ('FF'O)
-} with { variant "" };
+  ChangeEndPointRes_errorCodes      errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 
 
@@ -980,12 +840,8 @@
 {
   VTfunction                        vtfunction (170),
   ValidObjectID                     objectID,
-  ChangeFontAttributesRes_errorCodes errorCodes,
-  OCT1                              reserved5  ('FF'O),
-  OCT1                              reserved6  ('FF'O),
-  OCT1                              reserved7  ('FF'O),
-  OCT1                              reserved8  ('FF'O)
-} with { variant "" };
+  ChangeFontAttributesRes_errorCodes errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeFontAttributesReq 
 {
@@ -994,9 +850,8 @@
   ColorType                         fontColour, 
   FontSize                          fontSize,
   FontType                          fontType,
-  FontStyle                         fontStyle,
-  OCT1                              reserved8  ('FF'O)
-} with { variant "" };
+  FontStyle                         fontStyle
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeLineAttributesRes_errorCodes
 { 
@@ -1015,12 +870,8 @@
 {
   VTfunction                        vtfunction (171),
   ValidObjectID                     objectID,
-  ChangeLineAttributesRes_errorCodes errorCodes,
-  OCT1                              reserved5  ('FF'O),
-  OCT1                              reserved6  ('FF'O),
-  OCT1                              reserved7  ('FF'O),
-  OCT1                              reserved8  ('FF'O)
-} with { variant "" };
+  ChangeLineAttributesRes_errorCodes errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record  ChangeLineAttributesReq
 {
@@ -1028,9 +879,8 @@
   ValidObjectID                     ObjectIDofObjectToChange, 
   ColorType                         lineColour, 
   LineWidth                         lineWidth,
-  LineArt                           LineArt,
-  OCT1                              reserved8  ('FF'O)
-} with { variant "" };
+  LineArt                           LineArt
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeFillAttributesRes_errorCodes
 { 
@@ -1049,12 +899,8 @@
 {
   VTfunction                      vtfunction (172),
   ValidObjectID                     objectID,
-  ChangeFillAttributesRes_errorCodes errorCodes,
-  OCT1                              reserved5  ('FF'O),
-  OCT1                              reserved6  ('FF'O),
-  OCT1                              reserved7  ('FF'O),
-  OCT1                              reserved8  ('FF'O)
-} with { variant "" };
+  ChangeFillAttributesRes_errorCodes errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeFillAttributesReq 
 {
@@ -1063,19 +909,15 @@
   ColorType                         lineColour, 
   LineWidth                         lineWidth,
   LineArt                           lineArt,
-  ValidObjectID                     fillPatternObjectID,
-  OCT1                              reserved8  ('FF'O)
-} with { variant "" };
+  ValidObjectID                     fillPatternObjectID
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeActiveMaskReq
 {
   VTfunction                      vtfunction (173),
   ValidObjectID                   workingSetObjectID,
-  ValidObjectID                   newActiveMaskObjectID,
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with {variant "" };
+  ValidObjectID                   newActiveMaskObjectID
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeActiveMaskRes_errorCodes { 
   boolean invalidWorkingSetObjectID,
@@ -1092,13 +934,8 @@
 type record ChangeActiveMaskRes
 {
   VTfunction                      vtfunction (173),
-  ValidObjectID                   newActiveMaskObjectID,
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-}
-with {variant "" };
+  ValidObjectID                   newActiveMaskObjectID
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type enumerated e_ChangeSoftKeyMaskReq_MaskType { 
   Data                     (1),
@@ -1110,10 +947,8 @@
   VTfunction                      vtfunction (174),
   e_ChangeSoftKeyMaskReq_MaskType maskType,
   ValidObjectID                   DataOrAlarmMaskObjectID,
-  ValidObjectID                   NewSoftKeyMaskObjectID,
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)}
-with {variant "" };
+  ValidObjectID                   NewSoftKeyMaskObjectID
+  } with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeSoftKeyMaskRes_errorCodes { 
   boolean invalidDataOrAlarmMaskObjectID,
@@ -1132,9 +967,8 @@
   VTfunction                      vtfunction (174),
   ValidObjectID                   DataOrAlarmMaskObjectID,
   ValidObjectID                   NewSoftKeyMaskObjectID,
-  ChangeSoftKeyMaskRes_errorCodes errorCodes,
-  OCT1                            reserved8  ('FF'O)}
-with {variant "" };
+  ChangeSoftKeyMaskRes_errorCodes errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeAttributeReq
 {
@@ -1162,12 +996,8 @@
   VTfunction                      vtfunction (175),
   ValidObjectID                   objectID,
   AttributeID                     attributeID,
-  ChangeAttributeRes_errorCodes   errorCodes,
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-}
-with {variant "" };
+  ChangeAttributeRes_errorCodes   errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangePriorityRes_errorCodes { 
   boolean invalidObjectID,
@@ -1186,20 +1016,15 @@
   VTfunction                      vtfunction (176),
   ValidObjectID                   objectIDofArlarmMask,
   Priority                        newPriority,
-  ChangePriorityRes_errorCodes    errorCodes,
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  ChangePriorityRes_errorCodes    errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangePriorityReq
 {
   VTfunction                      vtfunction (176),
   ValidObjectID                   objectIDofArlarmMask,
-  Priority                        newPriority,
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  Priority                        newPriority
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeListItemRes_errorCodes { 
   boolean invalidObjectID, // Invalid Input List object ID or Output List object ID , 
@@ -1220,9 +1045,8 @@
   ValidObjectID                   objectID,  // of an Input List object, Output List object, Animation object, 
   // or External Object Definition object
   Index                           listIndex, // (items are numbered 0-n)
-  AnyObjectID                     newObjectID, //  or 0xFFFF to set empty item
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  AnyObjectID                     newObjectID //  or 0xFFFF to set empty item
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeListItemReq
 {
@@ -1230,22 +1054,13 @@
   ValidObjectID                   objectID, // of an Input List object, Output List object, Animation object, 
   // or External Object Definition object
   Index                           listIndex, // (items are numbered 0-n)
-  AnyObjectID                     newObjectID, //  or 0xFFFF to set empty item
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  AnyObjectID                     newObjectID //  or 0xFFFF to set empty item
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record DeleteObjectPoolReq
 {
-  VTfunction                      vtfunction (178),
-  OCT1                            reserved2  ('FF'O),
-  OCT1                            reserved3  ('FF'O),
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with {variant "" };
+  VTfunction                      vtfunction (178)
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record DeleteObjectPoolRes_ErrorCodes { 
   boolean deletionError,
@@ -1261,14 +1076,8 @@
 type record DeleteObjectPoolRes
 {
   VTfunction                      vtfunction (178),
-  DeleteObjectPoolRes_ErrorCodes  errorCodes,
-  OCT1                            reserved3  ('FF'O),
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with {variant "" };
+  DeleteObjectPoolRes_ErrorCodes  errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeStringValueReq
 {
@@ -1300,10 +1109,8 @@
   OCT1                            reserved2  ('FF'O),
   OCT1                            reserved3  ('FF'O),
   ValidObjectID                   objectID,
-  ChangeStringValueRes_ErrorCodes errorCodes,
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with {variant "" };
+  ChangeStringValueRes_ErrorCodes errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeChildPositionReq
 {
@@ -1351,14 +1158,8 @@
 type record ChangeObjectLabelRes
 {
   VTfunction                      vtfunction (181),
-  ChangeObjectLabelRes_ErrorCodes errorCodes,
-  OCT1                            reserved3  ('FF'O),
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  ChangeObjectLabelRes_ErrorCodes errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangeObjectLabelReq
 {
@@ -1393,13 +1194,8 @@
 {
   VTfunction                      vtfunction (182),
   ValidObjectID                   objectIDofTheOutputPolygonObjectToChange,
-  ChangePolygonPointRes_ErrorCodes errorCodes,
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  ChangePolygonPointRes_ErrorCodes errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ChangePolygonPointReq
 {
@@ -1439,9 +1235,8 @@
   VTfunction                      vtfunction (183),
   ValidObjectID                   objectIDofaOutputPolygonObjectToScale,
   WidthType                       newWidthAttribute,
-  HeightType                      newHeightAttribute,
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  HeightType                      newHeightAttribute
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record GraphicsContextRes_ErrorCodes { 
   boolean invalidObjectIDorObjectIsNotAGraphics,
@@ -1460,11 +1255,8 @@
   VTfunction                      vtfunction (184),
   ValidObjectID                   objectIDofAGraphicsContextObject,
   INT1                            subcommandID,   
-  GraphicsContextRes_ErrorCodes   errorCodes,
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  GraphicsContextRes_ErrorCodes   errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record SetGraphicsCursor
 {
@@ -1694,12 +1486,8 @@
 {
   VTfunction                      vtfunction (185),
   ValidObjectID                   objectID,
-  AttributeID                     AttributeIDofTheObject,
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  AttributeID                     AttributeIDofTheObject
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record SelectColourMapRes_ErrorCodes { 
   boolean invalidObjectID,
@@ -1717,48 +1505,25 @@
 {
   VTfunction                      vtfunction (186),
   ValidObjectID                   objectIDofTheColourMapObject,  
-  SelectColourMapRes_ErrorCodes   errorCodes,
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  SelectColourMapRes_ErrorCodes   errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record SelectColourMapReq
 {
   VTfunction                      vtfunction (186),
-  ValidObjectID                   ObjectIDofTheColourMapObjectOrFFFFtoRestoreTheDefaultColourTable,
+  ValidObjectID                   ObjectIDofTheColourMapObjectOrFFFFtoRestoreTheDefaultColourTable
   // (See A.3 VT standard colour palette)
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record IdentifyVTRes
 {
-  VTfunction                      vtfunction (187),
-  OCT1                            reserved2  ('FF'O),
-  OCT1                            reserved3  ('FF'O),
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  VTfunction                      vtfunction (187)
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record IdentifyVTReq 
 {
-  VTfunction                      vtfunction (187),
-  OCT1                            reserved2  ('FF'O),
-  OCT1                            reserved3  ('FF'O),
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  VTfunction                      vtfunction (187)
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ExecuteExtendedMacroRes_ErrorCodes { 
   boolean objectIDdoesNotExist,
@@ -1776,23 +1541,14 @@
 {
   VTfunction                      vtfunction (188),
   ValidObjectID                   ObjectIDofMacroObject,
-  ExecuteExtendedMacroRes_ErrorCodes   errorCodes,
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  ExecuteExtendedMacroRes_ErrorCodes   errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ExecuteExtendedMacroReq
 {
   VTfunction                      vtfunction (188),
-  ValidObjectID                   ObjectIDofMacroObject,
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  ValidObjectID                   ObjectIDofMacroObject
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 
 type record LockUnlockMaskRes_ErrorCodes { 
@@ -1811,13 +1567,8 @@
 {
   VTfunction                      vtfunction (189),
   e_LockUnlockMaskReqCommand      command,
-  LockUnlockMaskRes_ErrorCodes    errorCodes,
-  OCT1                            reserved4  ('FF'O), 
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  LockUnlockMaskRes_ErrorCodes    errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type enumerated e_LockUnlockMaskReqCommand { 
   unlockDataMaskOrUserLayoutDataMask           (0),
@@ -1830,10 +1581,8 @@
   VTfunction                      vtfunction (189),
   e_LockUnlockMaskReqCommand      command,
   ValidObjectID                   ObjectIDofTheDataMaskOrUserLayoutDataMaskToLockOrUnlock,
-  INT2                            lockTimeout,
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  INT2                            lockTimeout
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ExecuteMacroReq_ErrorCodes { 
   boolean objectIDdoesNotExist,
@@ -1851,34 +1600,21 @@
 {
   VTfunction                      vtfunction (190),
   ValidObjectID                   objectIDofMacroObject,
-  ExecuteMacroReq_ErrorCodes      errorCodes,
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  ExecuteMacroReq_ErrorCodes      errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ExecuteMacroReq
 {
   VTfunction                      vtfunction (190),
-  ValidObjectID                   objectIDofMacroObject,
-  OCT1                            reserved3  ('FF'O),
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-  } with { variant "" };
+  ValidObjectID                   objectIDofMacroObject
+  } with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record GetMemoryReq
 {
-  VTfunction vtfunction (194),
+  VTfunction vtfunction (192),
   OCT1           reserved2  ('FF'O),
-  INT3           memoryRequired,
-  OCT1           reserved7  ('FF'O),
-  OCT1           reserved8  ('FF'O)
-} with { variant "" };
+  INT3           memoryRequired
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type enumerated e_GetMemoryResVersionNumber { 
   compliantWithHannoverAgritechnica_2001_limitedfeatureSet          (0),
@@ -1896,51 +1632,32 @@
 
 type record GetMemoryRes
 {
-  VTfunction vtfunction (194),
+  VTfunction vtfunction (192),
   e_GetMemoryResVersionNumber versionNumber,
-  e_GetMemoryResStatus        status,
-  OCT1    reserved4  ('FF'O),
-  OCT1    reserved5  ('FF'O),
-  OCT1    reserved6  ('FF'O),
-  OCT1    reserved7  ('FF'O),
-  OCT1    reserved8  ('FF'O)
-} with { variant "" };
+  e_GetMemoryResStatus        status
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record GetNumberOfSoftKeysReq
 {
-  VTfunction vtfunction (192),
-  OCT1           reserved2  ('FF'O),
-  OCT1           reserved3  ('FF'O),
-  OCT1           reserved4  ('FF'O),
-  OCT1           reserved5  ('FF'O),
-  OCT1           reserved6  ('FF'O),
-  OCT1           reserved7  ('FF'O),
-  OCT1           reserved8  ('FF'O)
-} with { variant "" };
+  VTfunction vtfunction (194)
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record GetNumberOfSoftKeysRes
 {
-  VTfunction vtfunction (192),
-  OCT1           navigationSoftKeys_,
+  VTfunction vtfunction (194),
+  OCT1           navigationSoftKeys,
   OCT1           reserved3  ('FF'O),
   OCT1           reserved4  ('FF'O),
   OCT1           x_dots,
   OCT1           y_dots,
-  OCT1           numberOfVirtualSoftKeys_,
-  OCT1           numberOfPhysicalSoftKeys_
+  OCT1           numberOfVirtualSoftKeys,
+  OCT1           numberOfPhysicalSoftKeys
 } with { variant "" };
 
 type record GetTextFontDataReq
 {
-  VTfunction vtfunction (195),
-  OCT1           reserved2  ('FF'O),
-  OCT1           reserved3  ('FF'O),
-  OCT1           reserved4  ('FF'O),
-  OCT1           reserved5  ('FF'O),
-  OCT1           reserved6  ('FF'O),
-  OCT1           reserved7  ('FF'O),
-  OCT1           reserved8  ('FF'O)
-} with { variant "" };
+  VTfunction vtfunction (195)
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 
 type record TextFontDataRes_small_font_sizes { 
@@ -1991,17 +1708,87 @@
   TextFontDataRes_type_attribute    type_attribute
 } with { variant "" };
 
+
+
+type enumerated e_Codeplane { 
+  codeplane0     (0),
+  codeplane1     (1),
+  codeplane2     (2),
+  codeplane3     (3),
+  codeplane4     (4),
+  codeplane5     (5),
+  codeplane6     (6),
+  codeplane7     (7),
+  codeplane8     (8),
+  codeplane9     (9),
+  codeplane10    (10),
+  codeplane11    (11),
+  codeplane12    (12),
+  codeplane13    (13),
+  codeplane14    (14),
+  codeplane15    (15),
+  codeplane16    (16)}
+with {variant "PADDING(octet)"}
+
+
+type record GetSupportedWidecharsReq
+{
+  VTfunction vtfunction (193),
+  e_Codeplane    codeplane,
+  OCT2           firstWideCharInInquiryRange,
+  OCT2           lastWideCharInInquiryRange
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
+
+type record WideCharRange
+{
+  OCT2           firstWideChar, 
+  OCT2           lastWideChar
+} with { variant "" };
+
+type record of WideCharRange WideCharRangeArray
+
+type record GetSupportedWidecharsRes
+{
+  VTfunction vtfunction (193),
+  e_Codeplane        codeplane,
+  OCT2               firstWideCharInInquiryRange,
+  OCT2               lastWideCharInInquiryRange,
+  INT1               numberOfRanges,
+  WideCharRangeArray wideCharRangeArray
+} with {
+  variant (numberOfRanges) "LENGTHTO(wideCharRangeArray)";
+  variant (numberOfRanges) "UNIT(elements)"}
+
+type record GetWindowMaskDataReq
+{
+  VTfunction vtfunction (196)
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
+
+type record GetWindowMaskDataRes
+{
+  VTfunction vtfunction (196),
+  OCT1    BackgroundColourVTUserLayoutDataMasks,
+  OCT1    BackgroundColourVTKeyCells
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
+
+type record GetSupportedObjectsReq
+{
+  VTfunction vtfunction (197)
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
+
+type record GetSupportedObjectsRes
+{
+  VTfunction vtfunction (197),
+  INT2         numberOfBytesToFollow,
+  OCT1         supportedObjectTypes
+} with {
+  variant (numberOfBytesToFollow) "LENGTHTO(supportedObjectTypes)";
+  variant (numberOfBytesToFollow) "UNIT(elements)"}
+
 type record GetHardwareReq
 {
-  VTfunction vtfunction (199),
-  OCT1           reserved2  ('FF'O),
-  OCT1           reserved3  ('FF'O),
-  OCT1           reserved4  ('FF'O),
-  OCT1           reserved5  ('FF'O),
-  OCT1           reserved6  ('FF'O),
-  OCT1           reserved7  ('FF'O),
-  OCT1           reserved8  ('FF'O)
-} with { variant "" };
+  VTfunction vtfunction (199)
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 
 type enumerated e_GetHardwareResGraphicType { 
@@ -2034,102 +1821,6 @@
   INT2                         yPixels
 } with { variant "" };
 
-type enumerated e_Codeplane { 
-  codeplane0     (0),
-  codeplane1     (1),
-  codeplane2     (2),
-  codeplane3     (3),
-  codeplane4     (4),
-  codeplane5     (5),
-  codeplane6     (6),
-  codeplane7     (7),
-  codeplane8     (8),
-  codeplane9     (9),
-  codeplane10    (10),
-  codeplane11    (11),
-  codeplane12    (12),
-  codeplane13    (13),
-  codeplane14    (14),
-  codeplane15    (15),
-  codeplane16    (16)}
-with {variant "PADDING(octet)"}
-
-
-type record GetSupportedWidecharsReq
-{
-  VTfunction vtfunction (193),
-  e_Codeplane    codeplane,
-  OCT2           firstWideCharInInquiryRange,
-  OCT2           lastWideCharInInquiryRange,
-  OCT1           reserved7  ('FF'O),
-  OCT1           reserved8  ('FF'O)
-} with { variant "" };
-
-type record WideCharRange
-{
-  OCT2           firstWideChar, 
-  OCT2           lastWideChar
-} with { variant "" };
-
-type record of WideCharRange WideCharRangeArray
-
-type record GetSupportedWidecharsRes
-{
-  VTfunction vtfunction (193),
-  e_Codeplane        codeplane,
-  OCT2               firstWideCharInInquiryRange,
-  OCT2               lastWideCharInInquiryRange,
-  INT1               numberOfRanges,
-  WideCharRangeArray wideCharRangeArray
-} with {
-  variant (numberOfRanges) "LENGTHTO(wideCharRangeArray)";
-  variant (numberOfRanges) "UNIT(elements)"}
-
-type record GetWindowMaskDataReq
-{
-  VTfunction vtfunction (196),
-  OCT1    reserved2  ('FF'O),
-  OCT1    reserved3  ('FF'O),
-  OCT1    reserved4  ('FF'O),
-  OCT1    reserved5  ('FF'O),
-  OCT1    reserved6  ('FF'O),
-  OCT1    reserved7  ('FF'O),
-  OCT1    reserved8  ('FF'O)
-} with { variant "" };
-
-type record GetWindowMaskDataRes
-{
-  VTfunction vtfunction (196),
-  OCT1    BackgroundColourVTUserLayoutDataMasks,
-  OCT1    BackgroundColourVTKeyCells,
-  OCT1    reserved4  ('FF'O),
-  OCT1    reserved5  ('FF'O),
-  OCT1    reserved6  ('FF'O),
-  OCT1    reserved7  ('FF'O),
-  OCT1    reserved8  ('FF'O)
-} with { variant "" };
-
-type record GetSupportedObjectsReq
-{
-  VTfunction vtfunction (197),
-  OCT1    reserved2  ('FF'O),
-  OCT1    reserved3  ('FF'O),
-  OCT1    reserved4  ('FF'O),
-  OCT1    reserved5  ('FF'O),
-  OCT1    reserved6  ('FF'O),
-  OCT1    reserved7  ('FF'O),
-  OCT1    reserved8  ('FF'O)
-} with { variant "" };
-
-type record GetSupportedObjectsRes
-{
-  VTfunction vtfunction (197),
-  INT2         numberOfBytesToFollow,
-  OCT1         supportedObjectTypes
-} with {
-  variant (numberOfBytesToFollow) "LENGTHTO(supportedObjectTypes)";
-  variant (numberOfBytesToFollow) "UNIT(elements)"}
-
 type record StoreVersionRes_errorCodesType {
   boolean reserved0,
   boolean versionLabelIsNotCorrect,
@@ -2141,6 +1832,12 @@
   boolean reserved7
 } with {variant ""}
 
+type record  StoreVersionReq
+{
+  VTfunction                      vtfunction (208),
+  VersionLabel7Char               versionLabel
+} with { variant "" };
+
 type record StoreVersionRes
 {
   VTfunction                      vtfunction (208),
@@ -2148,16 +1845,8 @@
   OCT1                            reserved3  ('FF'O),
   OCT1                            reserved4  ('FF'O),
   OCT1                            reserved5  ('FF'O),
-  StoreVersionRes_errorCodesType  errorCodes,
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
-
-type record  StoreVersionReq
-{
-  VTfunction                      vtfunction (208),
-  VersionLabel7Char               versionLabel
-} with { variant "" };
+  StoreVersionRes_errorCodesType  errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record WorkingSetMaintenanceBitMask {
   boolean initiatingWorkingSetMaintenance,
@@ -2204,10 +1893,8 @@
   OCT1    reserved3  ('FF'O),
   OCT1    reserved4  ('FF'O),
   OCT1    reserved5  ('FF'O),
-  LoadVersionRes_errorCodesType    errorCodes,
-  OCT1    reserved7  ('FF'O),
-  OCT1    reserved8  ('FF'O)
-} with { variant "" };
+  LoadVersionRes_errorCodesType    errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record DeleteVersionRes_errorCodesType {
   boolean reserved0,
@@ -2227,10 +1914,8 @@
   OCT1                            reserved3  ('FF'O),
   OCT1                            reserved4  ('FF'O),
   OCT1                            reserved5  ('FF'O),
-  DeleteVersionRes_errorCodesType  errorCodes,
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  DeleteVersionRes_errorCodesType  errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record  DeleteVersionReq
 {
@@ -2254,15 +1939,8 @@
 
 type record ExtendedGetVersionsReq 
 {
-  VTfunction                      vtfunction (211),
-  OCT1                            reserved2  ('FF'O),
-  OCT1                            reserved3  ('FF'O),
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  VTfunction                      vtfunction (211)
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ExtendedStoreVersionRes_errorCodesType {
   boolean reserved0,
@@ -2282,10 +1960,8 @@
   OCT1                            reserved3  ('FF'O),
   OCT1                            reserved4  ('FF'O),
   OCT1                            reserved5  ('FF'O),
-  ExtendedStoreVersionRes_errorCodesType  errorCodes,
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  ExtendedStoreVersionRes_errorCodesType  errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ExtendedStoreVersionReq 
 {
@@ -2311,10 +1987,8 @@
   OCT1                            reserved3  ('FF'O),
   OCT1                            reserved4  ('FF'O),
   OCT1                            reserved5  ('FF'O),
-  ExtendedLoadVersionRes_errorCodesType  errorCodes,
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  ExtendedLoadVersionRes_errorCodesType  errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ExtendedLoadVersionReq
 {
@@ -2340,10 +2014,8 @@
   OCT1                            reserved3  ('FF'O),
   OCT1                            reserved4  ('FF'O),
   OCT1                            reserved5  ('FF'O),
-  ExtendedDeleteVersionRes_errorCodesType  errorCodes,
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  ExtendedDeleteVersionRes_errorCodesType  errorCodes
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record ExtendedDeleteVersionReq
 {
@@ -2353,21 +2025,16 @@
 
 type record GetVersionsReq
 {
-  VTfunction                      vtfunction (223),
-  OCT1                            reserved2  ('FF'O),
-  OCT1                            reserved3  ('FF'O),
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  VTfunction                      vtfunction (223)
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
+
+type record of VersionLabel7Char VersionLabel7Chars
 
 type record GetVersionsRes
 {
   VTfunction                      vtfunction (224),
   INT1                            numberOfVersionStrings,
-  VersionLabel7Char               versionStrings
+  VersionLabel7Chars               versionStrings
 }
 with{
   variant (numberOfVersionStrings) "LENGTHTO(versionStrings)";
@@ -2377,39 +2044,21 @@
 type record  VTUnsupportedVTFunctionInd 
 {
   VTfunction                      vtfunction (253),
-  OCT1                            unsupportedVTfunction, // should be VTfunction, but since unsupported is OCT1
-  OCT1                            reserved3  ('FF'O),
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  OCT1                            unsupportedVTfunction // should be VTfunction, but since unsupported is OCT1
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type record  UnsupportedVTFunctionInd 
 {
   VTfunction                      vtfunction (253),
-  OCT1                            unsupportedVTfunction, // should be VTfunction, but since unsupported is OCT1
-  OCT1                            reserved3  ('FF'O),
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
+  OCT1                            unsupportedVTfunction // should be VTfunction, but since unsupported is OCT1
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
-} with { variant "" };
-
-type record WorkingSetMaintenanceReq
+type record WorkingSetMaintenanceInd
 {
   VTfunction                      vtfunction (255),
   WorkingSetMaintenanceBitMask    bitMask,
-  e_WorkingSetMaintenanceVersionNumber versionNumber,
-  OCT1                            reserved4  ('FF'O),
-  OCT1                            reserved5  ('FF'O),
-  OCT1                            reserved6  ('FF'O),
-  OCT1                            reserved7  ('FF'O),
-  OCT1                            reserved8  ('FF'O)
-} with { variant "" };
+  e_WorkingSetMaintenanceVersionNumber versionNumber
+} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"}
 
 type enumerated e_BusyCodes { 
   vtIsBusyUpdatingVisibleMask            (0),
@@ -2422,7 +2071,7 @@
   vtIsOutOfMemory                        (7)}
 with {variant "PADDING(octet)"}
 
-type record VTStatusReq
+type record VTStatusInd
 {
   VTfunction                      vtfunction (254),
   OCT1 	                          sourceAddressOfActiveWorkingSetMaster,
@@ -2487,10 +2136,10 @@
   LockUnlockMaskRes                  lockUnlockMaskRes,
   ExecuteMacroRes                    executeMacroRes,
   GetMemoryRes                       getMemoryRes,
+  GetSupportedWidecharsRes           getSupportedWidecharsRes,
   GetNumberOfSoftKeysRes             getNumberOfSoftKeysRes,
   GetTextFontDataRes                 getTextFontDataRes,
   GetHardwareRes                     getHardwareRes,
-  GetSupportedWidecharsRes           getSupportedWidecharsRes,
   GetWindowMaskDataRes               getWindowMaskDataRes,
   GetSupportedObjectsRes             getSupportedObjectsRes,
   StoreVersionRes                    storeVersionRes,
@@ -2502,7 +2151,7 @@
   ExtendedDeleteVersionRes           extendedDeleteVersionRes,
   GetVersionsRes                     getVersionsRes,
   VTUnsupportedVTFunctionInd         vtUnsupportedVTFunctionInd,
-  VTStatusReq                        vtStatusReq
+  VTStatusInd                        vtStatusInd
 }
 with {variant "TAG	(
   // put all VT2ECU messages here
@@ -2556,10 +2205,10 @@
   lockUnlockMaskRes,                 vtfunction = 189;
   executeMacroRes,                   vtfunction = 190;
   getMemoryRes,                      vtfunction = 192;
+  getSupportedWidecharsRes,          vtfunction = 193;
   getNumberOfSoftKeysRes,            vtfunction = 194;
   getTextFontDataRes,                vtfunction = 195;
   getHardwareRes,                    vtfunction = 199;
-  getSupportedWidecharsRes,          vtfunction = 193;
   getWindowMaskDataRes,              vtfunction = 196;
   getSupportedObjectsRes,            vtfunction = 197;
   storeVersionRes,                   vtfunction = 208;
@@ -2571,7 +2220,7 @@
   extendedDeleteVersionRes,          vtfunction = 214;
   getVersionsRes,                    vtfunction = 224;
   vtUnsupportedVTFunctionInd,        vtfunction = 253;
-  vtStatusReq, 	                     vtfunction = 254;)"
+  vtStatusInd, 	                     vtfunction = 254;)"
 } 
 
 type union ECU2VT
@@ -2586,7 +2235,7 @@
   VTESCRes                           vtESCRes, 
   VTChangeNumericValueRes            vtChangeNumericValueRes,
   VTChangeActiveMaskRes              vtChangeActiveMaskRes,
-  VTChangeSoftKeyMaskReq             vtChangeSoftKeyMaskReq,
+  VTChangeSoftKeyMaskRes             vtChangeSoftKeyMaskRes,
   VTChangeStringValueRes             vtChangeStringValueRes,
   VTOnUserLayoutHideShowRes          vtOnUserLayoutHideShowRes, 
   ObjectPoolTransferInd              objectPoolTransferInd,
@@ -2631,10 +2280,10 @@
   LockUnlockMaskReq                  lockUnlockMaskReq,
   ExecuteMacroReq                    executeMacroReq,
   GetMemoryReq                       getMemoryReq,
+  GetSupportedWidecharsReq           getSupportedWidecharsReq,
   GetNumberOfSoftKeysReq             getNumberOfSoftKeysReq,
   GetTextFontDataReq                 getTextFontDataReq,
   GetHardwareReq                     getHardwareReq,
-  GetSupportedWidecharsReq           getSupportedWidecharsReq,
   GetWindowMaskDataReq               getWindowMaskDataReq,
   GetSupportedObjectsReq             getSupportedObjectsReq,
   StoreVersionReq                    storeVersionReq,
@@ -2646,7 +2295,7 @@
   ExtendedDeleteVersionReq           extendedDeleteVersionReq,
   GetVersionsReq                     getVersionsReq,
   UnsupportedVTFunctionInd           unsupportedVTFunctionInd,
-  WorkingSetMaintenanceReq           workingSetMaintenanceReq
+  WorkingSetMaintenanceInd           workingSetMaintenanceInd
   // put all ECU2VT response messages here
   //Dummy_ECU2VT_Res                dummy_ECU2VT_Res
 }
@@ -2659,7 +2308,7 @@
   vtESCRes,                          vtfunction =   4;
   vtChangeNumericValueRes,           vtfunction =   5;
   vtChangeActiveMaskRes,             vtfunction =   6;
-  vtChangeSoftKeyMaskReq,            vtfunction =   7;
+  vtChangeSoftKeyMaskRes,            vtfunction =   7;
   vtChangeStringValueRes,            vtfunction =   8;
   vtOnUserLayoutHideShowRes,         vtfunction =   9;
   objectPoolTransferInd,             vtfunction =  17;
@@ -2704,10 +2353,10 @@
   lockUnlockMaskReq,                 vtfunction = 189;
   executeMacroReq,                   vtfunction = 190;
   getMemoryReq,                      vtfunction = 192;
+  getSupportedWidecharsReq,          vtfunction = 193;
   getNumberOfSoftKeysReq,            vtfunction = 194;
   getTextFontDataReq,                vtfunction = 195;
   getHardwareReq,                    vtfunction = 199;
-  getSupportedWidecharsReq,          vtfunction = 193;
   getWindowMaskDataReq,              vtfunction = 196;
   getSupportedObjectsReq,            vtfunction = 197;
   storeVersionReq,                   vtfunction = 208;
@@ -2719,7 +2368,7 @@
   extendedDeleteVersionReq,          vtfunction = 214;
   getVersionsReq,                    vtfunction = 223;
   unsupportedVTFunctionInd,          vtfunction = 253;
-  workingSetMaintenanceReq,          vtfunction = 255;
+  workingSetMaintenanceInd,          vtfunction = 255;
   ) " 
 } 
 
diff --git a/demo/IsobusVT_Templates.ttcn b/demo/IsobusVT_Templates.ttcn
new file mode 100644
index 0000000..e9d8cd5
--- /dev/null
+++ b/demo/IsobusVT_Templates.ttcn
@@ -0,0 +1,524 @@
+module IsobusVT_Templates {
+
+import from IsobusMessageTypes all
+import from IsobusVTMessageTypes all
+import from IsobusCMMessageTypes all
+import from IsobusNMMessageTypes all
+import from Isobus all
+import from General_Types all
+import from J1939 all
+
+template J1939PDU_with_NAME t_J1939PDU_with_NAME(template J1939_ADDR p_addr, template J1939_NAME p_name, template J1939_messageWithPGN p_pdu)
+:= {
+  addr     := p_addr,
+  name     := p_name,
+  pdu      := p_pdu
+}
+
+template Isobus.J1939_messageWithPGN t_ButtonActivationReq(
+  template e_ButtonActivationReq_KeyAactivationCode p_keyAactivationCode,
+  template ValidObjectID                            p_objectID,
+  template ValidObjectID                            p_parentObjectID,
+  template KeyNumberType                            p_buttonKeyCode) 
+:= {pgn := '00E600'O, pdu := {vt2ecu := {buttonActivationReq := {
+        vtfunction                    := 1,
+        keyAactivationCode            := p_keyAactivationCode,
+        objectID                      := p_objectID,
+        parentObjectID                := p_parentObjectID,
+        buttonKeyCode                 := p_buttonKeyCode
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_ButtonActivationRes (
+  template e_ButtonActivationRes_KeyAactivationCode p_keyAactivationCode,
+  template ValidObjectID                            p_objectID,
+  template ValidObjectID                            p_parentObjectID,
+  template KeyNumberType                            p_buttonKeyCode
+) 
+:= {pgn := '00E700'O, pdu := {ecu2vt := {buttonActivationRes := {
+        vtfunction                    := 1,
+        keyAactivationCode            := p_keyAactivationCode,
+        objectID                      := p_objectID,
+        parentObjectID                := p_parentObjectID,
+        buttonKeyCode                 := p_buttonKeyCode
+      }}}} 
+
+template Isobus.J1939_messageWithPGN t_PointingEventReq (
+  template PositionType                    p_x_position,
+  template PositionType                    p_y_position,
+  template e_PointingEvent_touchState      p_touchState) 
+:= {pgn := '00E600'O, pdu := {vt2ecu := {pointingEventReq := {
+        vtfunction                    := 2,
+        x_position                    := p_x_position,
+        y_position                    := p_y_position,
+        touchState                    := p_touchState
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_PointingEventRes (
+  template PositionType                  p_x_position,
+  template PositionType                  p_y_position,
+  template e_PointingEvent_touchState    p_touchState) 
+:= {pgn := '00E700'O, pdu := {ecu2vt := {pointingEventRes := {
+        vtfunction                  := 2,
+        x_position                  := p_x_position,
+        y_position                  := p_y_position,
+        touchState                  := p_touchState
+      }}}}
+
+template Isobus.J1939_messageWithPGN  t_VTSelectInputObjectReq (
+  template ValidObjectID                          p_objectID,
+  template e_VTSelectInputObject_selection        p_selection,
+  template boolean                                p_objectIsOpenForDataInput,
+  template boolean                                p_reserved
+  // p_reserved for v3 or earlier: true , for v4 and later: false
+)  := {pgn := '00E600'O, pdu := {vt2ecu := {vtSelectInputObjectReq := {
+        vtfunction                   := 3,
+        objectID                     := p_objectID,
+        selection                    := p_selection,
+        bitmask                      := {
+          objectIsOpenForDataInput     := p_objectIsOpenForDataInput,
+          reserved1                    := p_reserved,
+          reserved2                    := p_reserved,
+          reserved3                    := p_reserved,
+          reserved4                    := p_reserved,
+          reserved5                    := p_reserved,
+          reserved6                    := p_reserved,
+          reserved7                    := p_reserved}
+      }}}}
+
+//template VTSelectInputObjectReq_v3AndPrior t_VTSelectInputObjectReq_v3AndPrior (
+//  template ValidObjectID                   p_objectID,
+//  template e_VTSelectInputObject_selection p_selection) := {
+//  vtfunction                   := 3,
+//  objectID                     := p_objectID,
+//  selection                    := p_selection,
+//  reserved5                    := 'FF'O,
+//  reserved6                    := 'FF'O,
+//  reserved7                    := 'FF'O,
+//  reserved8                    := 'FF'O
+//} 
+
+//template VTSelectInputObjectReq_v4AndLater t_VTSelectInputObjectReq_v4AndLater (
+//  template ValidObjectID                          p_objectID,
+//  template e_VTSelectInputObject_selection        p_selection,
+//  template VTSelectInputObject_v4AndLater_Bitmask p_bitmask) := {
+//  vtfunction                   := 3,
+//  objectID                     := p_objectID,
+//  selection                    := p_selection,
+//  bitmask                      := p_bitmask,
+//  reserved6                    := 'FF'O,
+//  reserved7                    := 'FF'O,
+//  reserved8                    := 'FF'O
+//}
+
+template Isobus.J1939_messageWithPGN t_VTSelectInputObjectRes(
+  template ValidObjectID                          p_objectID,
+  template e_VTSelectInputObject_selection        p_selection,
+  template boolean                                p_objectIsOpenForDataInput,
+  template boolean                                p_reserved
+  // p_reserved for v3 or earlier: true , for v4 and later: false
+)   := {pgn := '00E700'O, pdu := {ecu2vt := {vtSelectInputObjectRes := {
+        vtfunction                    := 3,
+        objectID                      := p_objectID,
+        selection                     := p_selection,
+        bitmask                      := {
+          objectIsOpenForDataInput     := p_objectIsOpenForDataInput,
+          reserved1                    := p_reserved,
+          reserved2                    := p_reserved,
+          reserved3                    := p_reserved,
+          reserved4                    := p_reserved,
+          reserved5                    := p_reserved,
+          reserved6                    := p_reserved,
+          reserved7                    := p_reserved}
+      }}}}
+
+//template VTSelectInputObjectRes_v4AndPrior t_VTSelectInputObjectRes_v4AndPrior(
+//  template   ValidObjectID                   p_objectID,
+//  template   e_VTSelectInputObject_selection p_selection) := {
+//  vtfunction                   := 3,
+//  objectID                     := p_objectID,
+//  selection                    := p_selection
+//}
+
+//template VTSelectInputObjectRes_v5AndLater t_VTSelectInputObjectRes_v5AndLater(
+//  template ValidObjectID                          p_objectID,
+//  template e_VTSelectInputObject_selection        p_selection,
+//  template VTSelectInputObject_v4AndLater_Bitmask p_bitmask) := {
+//  vtfunction                    := 3,
+//  objectID                      := p_objectID,
+//  selection                     := p_selection,
+//  bitmask                       := p_bitmask
+//}
+
+template Isobus.J1939_messageWithPGN t_VTESCReq (
+  template AnyObjectID          p_objectID,
+  template VTESC_ErrorCodes     p_errorCodes) 
+:= {pgn := '00E600'O, pdu := {vt2ecu := {vtESCReq := {
+        vtfunction                    := 4,
+        objectID                      := p_objectID,
+        errorCodes                    := p_errorCodes
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_VTESCRes (
+  template AnyObjectID        p_objectID) 
+:= {pgn := '00E700'O, pdu := {ecu2vt := {vtESCRes := {
+        vtfunction                    := 4,
+        objectID                      := p_objectID
+      }}}}
+
+template Isobus.J1939_messageWithPGN  t_VTChangeNumericValueReq (
+  template ValidObjectID       p_objectID,
+  template OCT4                p_value) 
+:= {pgn := '00E600'O, pdu := {vt2ecu := {vtChangeNumericValueReq := {
+        vtfunction                     := 5,
+        objectID                       := p_objectID,
+        reserved4                      := 'FF'O,
+        value_                         := p_value
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_VTChangeNumericValueRes (
+  template ValidObjectID       p_objectID,
+  template OCT4                p_value) 
+:= {pgn := '00E700'O, pdu := {ecu2vt := {vtChangeNumericValueRes := {
+        vtfunction                     := 5,
+        objectID                       := p_objectID,
+        reserved4                      := 'FF'O,
+        value_                         := p_value
+      }}}}
+
+template Isobus.J1939_messageWithPGN  t_VTChangeActiveMaskReq (
+  template ValidObjectID                   p_activeMaskOrWindowMaskOrKeyGroupObjectID,
+  template VTChangeActiveMasErrorcodes     p_errorCodes,
+  template ValidObjectID                   p_objectIDcontainingError,
+  template ValidObjectID                   p_parentObjectIDofErrorObjectID)   
+:= {pgn := '00E600'O, pdu := {vt2ecu := {vtChangeActiveMaskReq := {
+        vtfunction                               := 6,
+        activeMaskOrWindowMaskOrKeyGroupObjectID := p_activeMaskOrWindowMaskOrKeyGroupObjectID,
+        errorCodes                               := p_errorCodes,
+        objectIDcontainingError                  := p_objectIDcontainingError,
+        parentObjectIDofErrorObjectID            := p_parentObjectIDofErrorObjectID
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_VTChangeActiveMaskRes (
+  template   ValidObjectID                   p_activeMaskObjectID) 
+:= {pgn := '00E700'O, pdu := {ecu2vt := {vtChangeActiveMaskRes := {
+        vtfunction                    := 6,
+        activeMaskObjectID            := p_activeMaskObjectID
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_VTChangeSoftKeyMaskReq(
+  template ValidObjectID                   p_dataOrAlarmMaskObjectID,
+  template ValidObjectID                   p_softKeyMaskObjectID,
+  template VTChangeSoftKeyMaskErrorCodes   p_errorCodes)  
+:= {pgn := '00E600'O, pdu := {vt2ecu := {vtChangeSoftKeyMaskReq := {
+        vtfunction                    := 7,
+        dataOrAlarmMaskObjectID       := p_dataOrAlarmMaskObjectID,
+        softKeyMaskObjectID           := p_softKeyMaskObjectID,
+        errorCodes                    := p_errorCodes
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_VTChangeSoftKeyMaskRes(
+  template ValidObjectID                   p_dataOrAlarmMaskObjectID,
+  template ValidObjectID                   p_softKeyMaskObjectID) 
+:= {pgn := '00E700'O, pdu := {ecu2vt := {vtChangeSoftKeyMaskRes := {
+        vtfunction                    := 7,
+        dataOrAlarmMaskObjectID       := p_dataOrAlarmMaskObjectID,
+        softKeyMaskObjectID           := p_softKeyMaskObjectID
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_VTChangeStringValueReq (
+  template   ValidObjectID                   p_inputStringOrStringVariableObjectID,
+  template   INT1                            p_numberOfBytes,
+  template   octetstring                     p_enteredStringValue) 
+:= {pgn := '00E600'O, pdu := {vt2ecu := {vtChangeStringValueReq := {
+        vtfunction                            := 8,
+        inputStringOrStringVariableObjectID := p_inputStringOrStringVariableObjectID,
+        numberOfBytes := lengthof(p_enteredStringValue),
+        enteredStringValue   := p_enteredStringValue
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_VTChangeStringValueRes (
+  template ValidObjectID                   p_inputStringOrStringVariableObjectID) 
+:= {pgn := '00E700'O, pdu := {ecu2vt := {vtChangeStringValueRes := {
+        vtfunction                            := 8,
+        reserved2                             := 'FF'O,
+        reserved3                             := 'FF'O,
+        inputStringOrStringVariableObjectID   := p_inputStringOrStringVariableObjectID
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_ObjectPoolTransferInd(
+  template ObjectPoolRecords p_objectPoolRecords) 
+:= {pgn := '00E700'O,
+  pdu := {ecu2vt := {objectPoolTransferInd := {
+        vtfunction                                             := 17,
+        objectPoolRecords                                      := p_objectPoolRecords
+      }}}
+}
+
+template Isobus.J1939_messageWithPGN t_EndOfObjectPoolReq 
+:= {pgn := '00E700'O,
+  pdu := {ecu2vt := {endOfObjectPoolReq := {
+        vtfunction := 18
+      }}}
+}
+
+
+template Isobus.J1939_messageWithPGN t_EndOfObjectPoolRes (
+  template EndOfObjectPoolResErrorCodes p_errorCodes,
+  template AnyObjectID p_parentObjectIDoFaultyObject,
+  template AnyObjectID p_objectIDofFaultyObject,
+  template EndOfObjectPoolResObjectPoolErrorCodes p_objectPoolErrorCodes
+):= {pgn := '00E600'O,
+  pdu := {vt2ecu := {endOfObjectPoolRes := {
+        vtfunction                  := 18,
+        errorCodes                  := p_errorCodes,
+        parentObjectIDoFaultyObject := p_parentObjectIDoFaultyObject, // set to NULL Object ID if there are no
+        objectIDofFaultyObject      := p_objectIDofFaultyObject,      // set to NULL Object ID if there are no
+        objectPoolErrorCodes        := p_objectPoolErrorCodes
+      }}}
+}
+
+template Isobus.J1939_messageWithPGN t_GetMemoryReq(
+  template INT3 p_memoryRequired) 
+:= {  
+  pgn := '00E700'O,
+  pdu := {ecu2vt := {getMemoryReq := {
+        vtfunction                    := 192,
+        reserved2                     := 'FF'O,
+        memoryRequired                := p_memoryRequired
+      }
+    }
+  }
+}
+
+template Isobus.J1939_messageWithPGN t_GetMemoryRes(
+  template e_GetMemoryResVersionNumber p_versionNumber, 
+  template e_GetMemoryResStatus p_status) 
+:= {  
+  pgn := '00E600'O,
+  pdu := {vt2ecu := {getMemoryRes :=  {
+        vtfunction                      := 192,
+        versionNumber                   := p_versionNumber,
+        status                          := p_status
+      }}}}
+
+
+template Isobus.J1939_messageWithPGN t_GetSupportedWidecharsReq(
+  template e_Codeplane p_codeplane, 
+  template OCT2 p_firstWideCharInInquiryRange, 
+  template OCT2 p_lastWideCharInInquiryRange)
+:= {  
+  pgn := '00E700'O,
+  pdu := {ecu2vt := { getSupportedWidecharsReq := {
+        vtfunction                  := 193,
+        codeplane                   := p_codeplane,
+        firstWideCharInInquiryRange := p_firstWideCharInInquiryRange,
+        lastWideCharInInquiryRange  := p_lastWideCharInInquiryRange
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_GetSupportedWidecharsRes(
+  template e_Codeplane p_codeplane, 
+  template OCT2 p_firstWideCharInInquiryRange, 
+  template OCT2 p_lastWideCharInInquiryRange,
+  template  INT1 p_numberOfRanges, 
+  WideCharRangeArray p_wideCharRangeArray) 
+:= {  
+  pgn := '00E600'O,
+  pdu := {vt2ecu := {getSupportedWidecharsRes := {
+        vtfunction                  := 193,
+        codeplane                   := p_codeplane,
+        firstWideCharInInquiryRange := p_firstWideCharInInquiryRange,
+        lastWideCharInInquiryRange  := p_lastWideCharInInquiryRange,
+        numberOfRanges              := p_numberOfRanges, 
+        wideCharRangeArray          := p_wideCharRangeArray
+      }}}}
+
+
+template Isobus.J1939_messageWithPGN t_GetNumberOfSoftKeysReq
+:= {  
+  pgn := '00E700'O,
+  pdu := {ecu2vt := {getNumberOfSoftKeysReq := {
+        vtfunction                 := 194
+      }
+    }
+  }
+}
+
+template Isobus.J1939_messageWithPGN t_GetNumberOfSoftKeysRes(
+  template OCT1           p_navigationSoftKeys,
+  template OCT1           p_x_dots,
+  template OCT1           p_y_dots,
+  template OCT1           p_numberOfVirtualSoftKeys,
+  template OCT1           p_numberOfPhysicalSoftKeys
+) 
+:= {  
+  pgn := '00E600'O,
+  pdu := {vt2ecu := {getNumberOfSoftKeysRes :=  {
+        vtfunction                 := 194,
+        navigationSoftKeys        := p_navigationSoftKeys,
+        reserved3                 := 'FF'O,
+        reserved4                 := 'FF'O,
+        x_dots                    := p_x_dots,
+        y_dots                    := p_y_dots,
+        numberOfVirtualSoftKeys   := p_numberOfVirtualSoftKeys,
+        numberOfPhysicalSoftKeys  := p_numberOfPhysicalSoftKeys
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_GetTextFontDataReq
+:= {  
+  pgn := '00E700'O,
+  pdu := {ecu2vt := {getTextFontDataReq := {
+        vtfunction                := 195
+      }
+    }
+  }
+}
+
+template Isobus.J1939_messageWithPGN t_GetTextFontDataRes(
+  template TextFontDataRes_small_font_sizes  p_small_font_sizes,
+  template TextFontDataRes_large_font_sizes  p_large_font_sizes,
+  template TextFontDataRes_type_attribute    p_type_attribute
+) 
+:= {  
+  pgn := '00E600'O,
+  pdu := {vt2ecu := {getTextFontDataRes :=  {
+        vtfunction         := 195,
+        reserved2         := 'FF'O,
+        reserved3         := 'FF'O,
+        reserved4         := 'FF'O,
+        reserved5         := 'FF'O,
+        small_font_sizes  := p_small_font_sizes,
+        large_font_sizes  := p_large_font_sizes,
+        type_attribute    := p_type_attribute
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_GetHardwareReq
+:= {  
+  pgn := '00E700'O,
+  pdu := {ecu2vt := {getHardwareReq := {
+        vtfunction                    := 199
+      }
+    }
+  }
+}
+
+template Isobus.J1939_messageWithPGN t_GetHardwareRes(
+  template BootTimeType p_bootTimeInSeconds,  
+  template e_GetHardwareResGraphicType  p_graphicType,
+  template GetHardwareResHardwareType   p_hardware,
+  template INT2                         p_xPixels,
+  template INT2                         p_yPixels
+) 
+:= {  
+  pgn := '00E600'O,
+  pdu := {vt2ecu := {getHardwareRes :=  {
+        vtfunction                      := 199,
+        bootTimeInSeconds               := p_bootTimeInSeconds,  // 255 for information not available
+        graphicType                     := p_graphicType,
+        hardware                        := p_hardware,
+        xPixels                         := p_xPixels,
+        yPixels                         := p_yPixels
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_StoreVersionReq(VersionLabel7Char p_versionLabel)
+:= {  
+  pgn := '00E700'O,
+  pdu := {ecu2vt := {storeVersionReq := {
+        vtfunction                    := 208,
+        versionLabel                  := p_versionLabel
+      }
+    }
+  }
+}
+
+template Isobus.J1939_messageWithPGN t_StoreVersionRes(
+  StoreVersionRes_errorCodesType  p_errorCodes
+) 
+:= {  
+  pgn := '00E600'O,
+  pdu := {vt2ecu := {storeVersionRes :=  {
+        vtfunction                      := 208,
+        reserved2  := 'FF'O,
+        reserved3  := 'FF'O,
+        reserved4  := 'FF'O,
+        reserved5  := 'FF'O,
+        errorCodes := p_errorCodes
+      }}}}
+
+
+template Isobus.J1939_messageWithPGN t_LoadVersionReq(VersionLabel7Char p_versionLabel)
+:= {  
+  pgn := '00E700'O,
+  pdu := {ecu2vt := {loadVersionReq := {
+        vtfunction                    := 209,
+        versionLabel                  := p_versionLabel
+      }
+    }
+  }
+}
+
+template Isobus.J1939_messageWithPGN t_LoadVersionRes(
+  template LoadVersionRes_errorCodesType    p_errorCodes
+) 
+:= {  
+  pgn := '00E600'O,
+  pdu := {vt2ecu := {loadVersionRes :=  {
+        vtfunction                      := 209,
+        reserved2  := 'FF'O,
+        reserved3  := 'FF'O,
+        reserved4  := 'FF'O,
+        reserved5  := 'FF'O,
+        errorCodes := p_errorCodes
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_GetVersionsReq
+:= {  
+  pgn := '00E700'O,
+  pdu := {ecu2vt := {getVersionsReq := {
+        vtfunction                    := 223
+      }
+    }
+  }
+}
+
+template Isobus.J1939_messageWithPGN t_GetVersionsRes(
+  template INT1                            p_numberOfVersionStrings,
+  template VersionLabel7Chars              p_versionStrings
+) 
+:= {  
+  pgn := '00E600'O,
+  pdu := {vt2ecu := {getVersionsRes :=  {
+        vtfunction                      := 224,
+        numberOfVersionStrings          := p_numberOfVersionStrings,
+        versionStrings                  := p_versionStrings
+      }}}}
+
+template Isobus.J1939_messageWithPGN t_VTStatusInd(
+  template OCT1 p_sourceAddressOfActiveWorkingSetMaster, 
+  template OCT2 p_objectIDOfTheVisibleDataAlarmMaskOfTheActiveWorkingSet,
+  template OCT2 p_objectIDOfTheVisibleSoftKeyMaskOfTheActiveWorkingSet,
+  template e_BusyCodes p_vtBusyCodes,
+  template OCT1 p_vtFunctionCode) := {pgn := '00E600'O,
+  pdu := {vt2ecu := {vtStatusInd := {
+        vtfunction											   := 254,
+        sourceAddressOfActiveWorkingSetMaster                  := p_sourceAddressOfActiveWorkingSetMaster,
+        objectIDOfTheVisibleDataAlarmMaskOfTheActiveWorkingSet := p_objectIDOfTheVisibleDataAlarmMaskOfTheActiveWorkingSet,
+        objectIDOfTheVisibleSoftKeyMaskOfTheActiveWorkingSet   := p_objectIDOfTheVisibleSoftKeyMaskOfTheActiveWorkingSet,
+        vtBusyCodes                                            := p_vtBusyCodes,
+        vtFunctionCode                                         := p_vtFunctionCode
+      }}}
+}
+
+template Isobus.J1939_messageWithPGN  t_WorkingSetMaintenanceInd(
+  template boolean p_initiatingWorkingSetMaintenance, 
+  template e_WorkingSetMaintenanceVersionNumber p_versionNumber) := {
+  pgn := '00E700'O,
+  pdu := {
+    ecu2vt := {workingSetMaintenanceInd := {
+        vtfunction                    := 255,
+        bitMask                       := { initiatingWorkingSetMaintenance := p_initiatingWorkingSetMaintenance, reserved1 := false, reserved2 := false, reserved3 := false, reserved4 := false, reserved5 := false, reserved6 := false, reserved7 := false },
+        versionNumber                 := p_versionNumber
+      }}}
+}
+
+}
+
diff --git a/demo/Isobus_Templates.ttcn b/demo/Isobus_Templates.ttcn
deleted file mode 100644
index 48e6e26..0000000
--- a/demo/Isobus_Templates.ttcn
+++ /dev/null
@@ -1,395 +0,0 @@
-module Isobus_Templates {
-
-import from IsobusMessageTypes all
-import from IsobusVTMessageTypes all
-import from IsobusCMMessageTypes all
-import from IsobusNMMessageTypes all
-import from Isobus all
-import from General_Types all
-
-
-template CAN_frame_j1939 t_message(Isobus.Priority prio_param, BIT1 res_param, BIT1 dp_param, 
-  OCT1 pf_param, OCT1 ps_param, SourceAddress sa_param, template AnyIsoBusPdu t_can_pdu) 
-:= { can_j1939 := {
-    prio := prio_param, 
-    res := res_param, 
-    dp  := dp_param,
-    pf  := pf_param,
-    ps  := ps_param,
-    sa  := sa_param},
-  can_pdu := t_can_pdu
-}
-
-template CAN_frame_j1939 t_network_message(Isobus.Priority prio_param, BIT1 res_param, BIT1 dp_param, 
-  OCT1 pf_param, OCT1 ps_param, SourceAddress sa_param, template IsobusNMMessageTypes.NetworkMessage t_networkMessage) 
-:= { can_j1939 := {
-    prio := prio_param, 
-    res := res_param, 
-    dp  := dp_param,
-    pf  := pf_param,
-    ps  := ps_param,
-    sa  := sa_param},
-  can_pdu := {networkMessage := t_networkMessage}
-}
-
-template ECU2VT t_GetMemoryReqX( INT3 p_memoryRequired) := {
-  getMemoryReq := {
-    vtfunction                      := 194,
-    reserved2                       := 'FF'O,
-    memoryRequired                  := p_memoryRequired,
-    reserved7                       := 'FF'O,
-    reserved8                       := 'FF'O
-  }
-};
-
-template AnyIsoBusPdu t_ecu2vt(template ECU2VT t_Message) := {
-  ecu2vt := t_Message
-};
-
-template AnyIsoBusPdu t_vt2ecu(template VT2ECU t_Message) := {
-  vt2ecu := t_Message
-};
-
-template AnyIsoBusPdu t_GetMemoryReq_pdu(INT3 p_memoryRequired) := {
-  ecu2vt := {getMemoryReq := t_GetMemoryReq(p_memoryRequired)}
-}
-
-
-template ButtonActivationReq t_ButtonActivationReq(
-  template e_ButtonActivationReq_KeyAactivationCode p_keyAactivationCode,
-  template ValidObjectID                            p_objectID,
-  template ValidObjectID                            p_parentObjectID,
-  template KeyNumberType                            p_buttonKeyCode) := {
-  vtfunction                    := 1,
-  keyAactivationCode            := p_keyAactivationCode,
-  objectID                      := p_objectID,
-  parentObjectID                := p_parentObjectID,
-  buttonKeyCode                 := p_buttonKeyCode,
-  reserved8                     := 'FF'O
-}
-
-template ButtonActivationRes t_ButtonActivationRes (
-  template e_ButtonActivationRes_KeyAactivationCode p_keyAactivationCode,
-  template ValidObjectID                            p_objectID,
-  template ValidObjectID                            p_parentObjectID,
-  template KeyNumberType                            p_buttonKeyCode
-) := {
-  vtfunction                    := 1,
-  keyAactivationCode            := p_keyAactivationCode,
-  objectID                      := p_objectID,
-  parentObjectID                := p_parentObjectID,
-  buttonKeyCode                 := p_buttonKeyCode,
-  reserved8                     := 'FF'O
-} 
-
-template PointingEventReq t_PointingEventReq (
-  template PositionType                    p_x_position,
-  template PositionType                    p_y_position,
-  template e_PointingEvent_touchState      p_touchState) := {
-  vtfunction                    := 2,
-  x_position                    := p_x_position,
-  y_position                    := p_y_position,
-  touchState                    := p_touchState,
-  reserved7                     := 'FF'O,
-  reserved8                     := 'FF'O
-}
-
-template PointingEventRes t_PointingEventRes (
-  template PositionType                  p_x_position,
-  template PositionType                  p_y_position,
-  template e_PointingEvent_touchState    p_touchState) := {
-  vtfunction                  := 2,
-  x_position                  := p_x_position,
-  y_position                  := p_y_position,
-  touchState                  := p_touchState,
-  reserved7                   := 'FF'O,
-  reserved8                   := 'FF'O
-}
-
-template VTSelectInputObjectReq t_VTSelectInputObjectReq (
-  template ValidObjectID                          p_objectID,
-  template e_VTSelectInputObject_selection        p_selection,
-  template boolean                                p_objectIsOpenForDataInput,
-  template boolean                                p_reserved
-  // p_reserved for v3 or earlier: true , for v4 and later: false
-) := {
-  vtfunction                   := 3,
-  objectID                     := p_objectID,
-  selection                    := p_selection,
-  bitmask                      := {
-    objectIsOpenForDataInput     := p_objectIsOpenForDataInput,
-    reserved1                    := p_reserved,
-    reserved2                    := p_reserved,
-    reserved3                    := p_reserved,
-    reserved4                    := p_reserved,
-    reserved5                    := p_reserved,
-    reserved6                    := p_reserved,
-    reserved7                    := p_reserved},
-  reserved6                    := 'FF'O,
-  reserved7                    := 'FF'O,
-  reserved8                    := 'FF'O
-}
-
-template VTSelectInputObjectReq_v3AndPrior t_VTSelectInputObjectReq_v3AndPrior (
-  template ValidObjectID                   p_objectID,
-  template e_VTSelectInputObject_selection p_selection) := {
-  vtfunction                   := 3,
-  objectID                     := p_objectID,
-  selection                    := p_selection,
-  reserved5                    := 'FF'O,
-  reserved6                    := 'FF'O,
-  reserved7                    := 'FF'O,
-  reserved8                    := 'FF'O
-} 
-
-template VTSelectInputObjectReq_v4AndLater t_VTSelectInputObjectReq_v4AndLater (
-  template ValidObjectID                          p_objectID,
-  template e_VTSelectInputObject_selection        p_selection,
-  template VTSelectInputObject_v4AndLater_Bitmask p_bitmask) := {
-  vtfunction                   := 3,
-  objectID                     := p_objectID,
-  selection                    := p_selection,
-  bitmask                      := p_bitmask,
-  reserved6                    := 'FF'O,
-  reserved7                    := 'FF'O,
-  reserved8                    := 'FF'O
-}
-
-template VTSelectInputObjectRes t_VTSelectInputObjectRes(
-  template ValidObjectID                          p_objectID,
-  template e_VTSelectInputObject_selection        p_selection,
-  template boolean                                p_objectIsOpenForDataInput,
-  template boolean                                p_reserved
-  // p_reserved for v3 or earlier: true , for v4 and later: false
-) := {
-  vtfunction                    := 3,
-  objectID                      := p_objectID,
-  selection                     := p_selection,
-  bitmask                      := {
-    objectIsOpenForDataInput     := p_objectIsOpenForDataInput,
-    reserved1                    := p_reserved,
-    reserved2                    := p_reserved,
-    reserved3                    := p_reserved,
-    reserved4                    := p_reserved,
-    reserved5                    := p_reserved,
-    reserved6                    := p_reserved,
-    reserved7                    := p_reserved},
-  reserved6                     := 'FF'O,
-  reserved7                     := 'FF'O,
-  reserved8                     := 'FF'O
-}
-
-template VTSelectInputObjectRes_v4AndPrior t_VTSelectInputObjectRes_v4AndPrior(
-  template   ValidObjectID                   p_objectID,
-  template   e_VTSelectInputObject_selection p_selection) := {
-  vtfunction                   := 3,
-  objectID                     := p_objectID,
-  selection                    := p_selection,
-  reserved5                    := 'FF'O,
-  reserved6                    := 'FF'O,
-  reserved7                    := 'FF'O,
-  reserved8                    := 'FF'O
-}
-
-template VTSelectInputObjectRes_v5AndLater t_VTSelectInputObjectRes_v5AndLater(
-  template ValidObjectID                          p_objectID,
-  template e_VTSelectInputObject_selection        p_selection,
-  template VTSelectInputObject_v4AndLater_Bitmask p_bitmask) := {
-  vtfunction                    := 3,
-  objectID                      := p_objectID,
-  selection                     := p_selection,
-  bitmask                       := p_bitmask,
-  reserved6                     := 'FF'O,
-  reserved7                     := 'FF'O,
-  reserved8                     := 'FF'O
-}
-
-template VTESCReq t_VTESCReq (
-  template AnyObjectID          p_objectID,
-  template VTESC_ErrorCodes     p_errorCodes) := {
-  vtfunction                    := 4,
-  objectID                      := p_objectID,
-  errorCodes                    := p_errorCodes,
-  reserved5                     := 'FF'O,
-  reserved6                     := 'FF'O,
-  reserved7                     := 'FF'O,
-  reserved8                     := 'FF'O
-}
-
-template VTESCRes t_VTESCRes (
-  template AnyObjectID        p_objectID) :={
-  vtfunction                    := 4,
-  objectID                      := p_objectID, 
-  reserved4                     := 'FF'O,
-  reserved5                     := 'FF'O,
-  reserved6                     := 'FF'O,
-  reserved7                     := 'FF'O,
-  reserved8                     := 'FF'O
-}
-
-template VTChangeNumericValueReq t_VTChangeNumericValueReq (
-  template ValidObjectID       p_objectID,
-  template OCT4                p_value) := {
-  vtfunction                     := 5,
-  objectID                       := p_objectID,
-  reserved4                      := 'FF'O,
-  value_                         := p_value
-} 
-
-template VTChangeNumericValueRes t_VTChangeNumericValueRes (
-  template ValidObjectID       p_objectID,
-  template OCT4                p_value) := {
-  vtfunction                     := 5,
-  objectID                       := p_objectID,
-  reserved4                      := 'FF'O,
-  value_                         := p_value
-} 
-
-template VTChangeActiveMaskReq t_VTChangeActiveMaskReq (
-  template ValidObjectID                   p_activeMaskOrWindowMaskOrKeyGroupObjectID,
-  template VTChangeActiveMasErrorcodes     p_errorCodes,
-  template ValidObjectID                   p_objectIDcontainingError,
-  template ValidObjectID                   p_parentObjectIDofErrorObjectID) := 
-{
-  vtfunction                               := 6,
-  activeMaskOrWindowMaskOrKeyGroupObjectID := p_activeMaskOrWindowMaskOrKeyGroupObjectID,
-  errorCodes                               := p_errorCodes,
-  objectIDcontainingError                  := p_objectIDcontainingError,
-  parentObjectIDofErrorObjectID            := p_parentObjectIDofErrorObjectID
-}
-
-template VTChangeActiveMaskRes t_VTChangeActiveMaskRes (
-	template   ValidObjectID                   p_activeMaskObjectID) := {
-  vtfunction                    := 6,
-  activeMaskObjectID            := p_activeMaskObjectID,
-  reserved4                     := 'FF'O,
-  reserved5                     := 'FF'O,
-  reserved6                     := 'FF'O,
-  reserved7                     := 'FF'O,
-  reserved8                     := 'FF'O
-}
-
-template VTChangeSoftKeyMaskReq t_VTChangeSoftKeyMaskReq(
-  template ValidObjectID                   p_dataOrAlarmMaskObjectID,
-  template ValidObjectID                   p_softKeyMaskObjectID,
-  template VTChangeSoftKeyMaskErrorCodes   p_errorCodes) := 
-{
-  vtfunction                    := 7,
-  dataOrAlarmMaskObjectID       := p_dataOrAlarmMaskObjectID,
-  softKeyMaskObjectID           := p_softKeyMaskObjectID,
-  errorCodes                    := p_errorCodes,
-  reserved7                     := 'FF'O,
-  reserved8                     := 'FF'O
-}
-
-template VTChangeSoftKeyMaskRes t_VTChangeSoftKeyMaskRes(
-  template ValidObjectID                   p_dataOrAlarmMaskObjectID,
-  template ValidObjectID                   p_softKeyMaskObjectID) := 
-{
-  vtfunction                    := 7,
-  dataOrAlarmMaskObjectID       := p_dataOrAlarmMaskObjectID,
-  softKeyMaskObjectID           := p_softKeyMaskObjectID,
-  reserved6                     := 'FF'O,
-  reserved7                     := 'FF'O,
-  reserved8                     := 'FF'O
-}
-
-template VTChangeStringValueReq t_VTChangeStringValueReq (
-  template ValidObjectID                   p_inputStringOrStringVariableObjectID,
-  template octetstring                     p_enteredStringValue) := 
-{
-  vtfunction                            := 8,
-  inputStringOrStringVariableObjectID   := p_inputStringOrStringVariableObjectID,
-  numberOfBytes                         := lengthof(p_enteredStringValue),
-  enteredStringValue                    := p_enteredStringValue
-} 
-
-template VTChangeStringValueRes t_VTChangeStringValueRes (
-	template ValidObjectID                   p_inputStringOrStringVariableObjectID) :=
-{
-  vtfunction                            := 8,
-  reserved2                             := 'FF'O,
-  reserved3                             := 'FF'O,
-  inputStringOrStringVariableObjectID   := p_inputStringOrStringVariableObjectID,
-  reserved6                             := 'FF'O,
-  reserved7                             := 'FF'O,
-  reserved8                             := 'FF'O
-}
-
-template GetSupportedWidecharsReq t_GetSupportedWidecharsReq(e_Codeplane p_codeplane, OCT2 p_firstWideCharInInquiryRange, OCT2 p_lastWideCharInInquiryRange) := {
-  vtfunction                  := 193,
-  codeplane                   := p_codeplane,
-  firstWideCharInInquiryRange := p_firstWideCharInInquiryRange,
-  lastWideCharInInquiryRange  := p_lastWideCharInInquiryRange,
-  reserved7                   := 'FF'O,
-  reserved8                   := 'FF'O
-}
-
-template GetSupportedWidecharsRes t_GetSupportedWidecharsRes(e_Codeplane p_codeplane, OCT2 p_firstWideCharInInquiryRange, 
-  OCT2 p_lastWideCharInInquiryRange,
-  INT1 p_numberOfRanges, 
-  WideCharRangeArray p_wideCharRangeArray) := 
-{
-  vtfunction                  := 193,
-  codeplane                   := p_codeplane,
-  firstWideCharInInquiryRange := p_firstWideCharInInquiryRange,
-  lastWideCharInInquiryRange  := p_lastWideCharInInquiryRange,
-  numberOfRanges              := p_numberOfRanges, 
-  wideCharRangeArray          := p_wideCharRangeArray
-}
-
-template GetMemoryReq t_GetMemoryReq(INT3 p_memoryRequired) := {
-  vtfunction                    := 194,
-  reserved2                     := 'FF'O,
-  memoryRequired                := p_memoryRequired,
-  reserved7                     := 'FF'O,
-  reserved8                     := 'FF'O
-}
-
-template GetMemoryRes t_GetMemoryRes(e_GetMemoryResVersionNumber p_versionNumber, e_GetMemoryResStatus p_status) := {
-  vtfunction                      := 194,
-  versionNumber                   := p_versionNumber,
-  status                          := p_status,
-  reserved4                       := 'FF'O,
-  reserved5                       := 'FF'O,
-  reserved6                       := 'FF'O,
-  reserved7                       := 'FF'O,
-  reserved8                       := 'FF'O
-}
-
-template AnyIsoBusPdu t_WorkingSetMaintenanceReq_pdu(
-  WorkingSetMaintenanceBitMask p_bitMask, 
-  e_WorkingSetMaintenanceVersionNumber p_versionNumber) := {
-  ecu2vt := {workingSetMaintenanceReq := t_WorkingSetMaintenanceReq(p_bitMask, p_versionNumber)}
-}
-
-template WorkingSetMaintenanceReq t_WorkingSetMaintenanceReq(
-  WorkingSetMaintenanceBitMask p_bitMask, 
-  e_WorkingSetMaintenanceVersionNumber p_versionNumber) := {
-  vtfunction                    := 255,
-  bitMask                       := p_bitMask,
-  versionNumber                 := p_versionNumber,    
-  reserved4                     := 'FF'O,
-  reserved5                     := 'FF'O,
-  reserved6                     := 'FF'O,
-  reserved7                     := 'FF'O,
-  reserved8                     := 'FF'O
-}
-
-template N_SP_Response t_N_SP_Response(template e_PortNumber t_fromPort, 
-  template e_PortNumber t_toPort, 
-  template N_SP_Response.requestedParametrics requestedParametrics_param) := {  
-  msgFunction := 132,
-  portPair := {fromPort := t_fromPort, toPort := t_toPort},
-  requestedParametrics := requestedParametrics_param
-}
-
-template AnyIsoBusPdu t_N_SP_Response_pdu(template e_PortNumber t_fromPort, 
-  template e_PortNumber t_toPort, 
-  template N_SP_Response.requestedParametrics t_requestedParametrics_param) := {  
-  networkMessage := {n_SP_Response := t_N_SP_Response(t_fromPort, t_toPort, t_requestedParametrics_param)
-  }}
-
-
-}
-
diff --git a/demo/Isobus_test.ttcn b/demo/Isobus_test.ttcn
new file mode 100644
index 0000000..d170980
--- /dev/null
+++ b/demo/Isobus_test.ttcn
@@ -0,0 +1,1290 @@
+/* Copyright (c) 2000-2019 Ericsson Telecom AB
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v2.0
+* which accompanies this distribution, and is available at
+* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+*
+* Contributors:
+* Michael Josenhans
+******************************************************************************/
+//
+//  File:               J1939test.ttcn
+//  Description:        J1939 port type test
+//
+
+
+module Isobus_test {
+
+import from SocketCAN_Types all;
+import from SocketCAN_PortType all;
+import from SocketCAN_Templates all;
+import from J1939 all;
+import from IsobusVT_Templates all;
+import from Isobus all;
+
+template WorkingSetMaintenanceMessages t_WorkingSetMaintenanceTick(template boolean p_tickvalue) := 
+{workingSetMaintenanceTick := p_tickvalue}
+
+template WorkingSetMaintenanceMessages t_WorkingSetMaintenanceInitialize(template boolean p_tickvalue) := 
+{workingSetMaintenanceInitialize := p_tickvalue}
+const float c_guard := 50.0
+
+type enumerated SocketCAN_open_socket_type
+{ 
+  OPEN_CAN_RAW,
+  OPEN_CAN_BCM,
+  OPEN_CAN_ISOTP,
+  OPEN_CAN_J1939
+}
+
+type enumerated e_Phase {
+  e_open_socket, 
+  e_testbody1, 
+  e_testbody2,
+  e_testbody3,
+  e_testbody4,
+  e_testbody5,
+  e_testbody6,
+  e_testbody7,
+  e_testbodyEnd,
+  e_testcase_complete
+}
+
+type record SocketCAN_open_j1939_result{
+  SocketCAN_ifr                    ifr,
+  SocketCAN_socketid               socket_id} 
+
+type record J1939_message  {
+  e_Phase phase,
+  SocketCAN_J1939_PDU j1939_pdu
+}
+
+const integer J1939_MAX_PDU_NUMBER := 256;  // for testing purposes
+
+type record length (0 .. J1939_MAX_PDU_NUMBER) of SocketCAN_J1939_PDU SocketCAN_J1939_PDUs
+
+// workarounds as (x .. enum2int(e_testcase_complete)) fails but:
+// workarounds as (x .. enum2int(c_testcase_complete)) works
+const e_Phase c_firstPhase        := e_open_socket
+const e_Phase c_testcase_complete := e_testcase_complete
+
+type record PhaseStartReq {
+  e_Phase phase,
+  integer phase_int
+}
+type record PhaseEndInd   {
+  e_Phase phase, 
+  integer phase_int
+}
+
+type boolean HaltReq
+type boolean HaltInd
+
+type union  Command_MTC2PTC{
+  PhaseStartReq                       phaseStartReq,
+  HaltReq                             haltReq
+}
+
+type union  Command_PTC2MTC{
+  PhaseEndInd                         phaseEndInd,
+  HaltInd                             haltInd
+}
+
+type port SyncMasterPort message {
+  out Command_MTC2PTC
+  in  Command_PTC2MTC
+} with { extension "internal" }
+
+type port SyncSlavePort message {
+  in  Command_MTC2PTC
+  out Command_PTC2MTC
+} with { extension "internal" }
+
+type port J1939PDU_PT message {
+  inout   J1939PDU_with_NAME
+} with { extension "internal" }
+
+type boolean PoolUploadOngoing
+
+type port PoolUploadOngoingIn message {
+  in   PoolUploadOngoing
+} with { extension "internal" }
+
+type port PoolUploadOngoingOut message {
+  out   PoolUploadOngoing
+} with { extension "internal" }
+
+type boolean VTStatusTick
+
+type port VTStatusTickIn message {
+  in   VTStatusTick
+} with { extension "internal" }
+
+type port VTStatusTickOut message {
+  out   VTStatusTick
+} with { extension "internal" }
+
+type boolean WorkingSetMaintenaceOnOff
+
+type port WorkingSetMaintenaceOnOffIn message {
+  in   WorkingSetMaintenaceOnOff
+} with { extension "internal" }
+
+type port WorkingSetMaintenaceOnOffOut message {
+  out   WorkingSetMaintenaceOnOff
+} with { extension "internal" }
+
+type union WorkingSetMaintenanceMessages
+{
+  // put all workingSetMaintenance messages here
+  boolean               workingSetMaintenanceTick,
+  boolean               workingSetMaintenanceInitialize
+}
+
+type port WorkingSetMaintenanceIn message {
+  in   WorkingSetMaintenanceMessages
+} with { extension "internal" }
+
+type port WorkingSetMaintenanceOut message {
+  out   WorkingSetMaintenanceMessages
+} with { extension "internal" }
+
+//component declarations
+
+type component SyncPTC {
+  port SyncSlavePort                      pt_sync
+  var  e_Phase                            v_phase := c_firstPhase
+}
+
+type component PTC_Isobus_VT_VTSTATUSCycleSend_CT extends SyncPTC
+{
+  port VTStatusTickOut                    pt_VTStatusTick
+  port PoolUploadOngoingIn                pt_PoolUploadOngoing
+  //variables
+  //timers
+}
+
+type component PTC_Isobus_ECU_VTSTATUSCycleReceive_CT extends SyncPTC
+{
+  port VTStatusTickIn                     pt_VTStatusTick
+  port WorkingSetMaintenaceOnOffOut       pt_WorkingSetMaintenaceOnOff
+  //variables
+  //timers
+}
+
+type component PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT extends SyncPTC
+{
+  port WorkingSetMaintenaceOnOffIn        pt_WorkingSetMaintenaceOnOff
+  port WorkingSetMaintenanceOut           pt_WorkingSetMaintenance
+  //timers
+}
+
+type component PTC_Isobus_VT_CT extends SyncPTC
+{
+  port J1939PDU_PT                        pt_j1939PDU
+  port VTStatusTickIn                     pt_VTStatusTick
+  //variables
+  var J1939_ADDR v_peeraddr := J1939_NO_ADDR
+  var J1939_NAME v_peername := J1939_NO_NAME
+  //timers
+}
+
+type component PTC_Isobus_ECU_CT extends SyncPTC
+{
+  port J1939PDU_PT                        pt_j1939PDU
+  port WorkingSetMaintenanceIn            pt_WorkingSetMaintenance
+  port VTStatusTickOut                    pt_VTStatusTick
+  //variables
+  var J1939_ADDR v_peeraddr := J1939_NO_ADDR
+  var J1939_NAME v_peername := J1939_NO_NAME
+  //timers
+}
+
+type component PTCAdapter extends SyncPTC {
+  port SocketCAN_PT                       pt_socketCAN
+  port J1939PDU_PT                        pt_j1939PDU
+}
+
+type record of PTCs PTCSet 
+
+type union  PTCs{
+  PTCAdapter                                          ptc_Adapter,
+  PTC_Isobus_VT_VTSTATUSCycleSend_CT                  ptc_Isobus_VT_VTSTATUSCycleSend_CT,
+  PTC_Isobus_VT_CT                                    ptc_Isobus_VT_CT,
+  PTC_Isobus_ECU_CT                                   ptc_Isobus_ECU_CT, 
+  PTC_Isobus_ECU_VTSTATUSCycleReceive_CT              ptc_Isobus_ECU_VTSTATUSCycleReceive_CT,
+  PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT ptc_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT
+}
+
+
+type component MTC{ 
+  timer t_guard
+  port  SyncMasterPort pt_sync
+  var PTCSet         v_PTCSet := {}
+}
+
+altstep alt_awaitPhaseStartReq(in e_Phase p_phase) runs on SyncPTC {
+  var Command_MTC2PTC v_PhaseStartReq;
+  [] pt_sync.receive (Command_MTC2PTC:{phaseStartReq:={phase := p_phase, phase_int := ?}}){
+    log("PTC name: ", self)
+    log("Waits for start of phase: ", p_phase)
+  }
+  // between v_phase and p_phase
+  [] pt_sync.receive (Command_MTC2PTC:{phaseStartReq:={phase := ?, phase_int := (enum2int(c_firstPhase) .. enum2int(v_phase))}}) -> value v_PhaseStartReq 
+  { 
+    //v_phase := f_incPhase(v_phase)
+    log("PTC name: ", self)
+    log("Waits for start of phase: ", p_phase)
+    log("Received completion of phase: ", p_phase)
+    f_sendPhaseEndInd()
+    repeat
+  }
+  [] pt_sync.receive (Command_MTC2PTC:{phaseStartReq:={phase := ?, phase_int :=?}}) -> value v_PhaseStartReq
+  {log("Received unexpected message:", v_PhaseStartReq);setverdict(inconc)}
+}
+
+function f_startPhase (in e_Phase p_phase) runs on MTC {
+  var integer v_i
+  var integer v_amount := sizeof(v_PTCSet)
+  var Command_MTC2PTC v_phaseStartReq := {phaseStartReq:={ phase := p_phase, phase_int := enum2int(p_phase)}}
+
+  for (v_i := 0; v_i < v_amount; v_i := v_i +1){
+    log("MTC instance: ", self)
+    if        (ischosen(v_PTCSet[v_i].ptc_Adapter))   { pt_sync.send(v_phaseStartReq) to v_PTCSet[v_i].ptc_Adapter}
+    else if   (ischosen(v_PTCSet[v_i].ptc_Isobus_VT_VTSTATUSCycleSend_CT)) { pt_sync.send(v_phaseStartReq) to v_PTCSet[v_i].ptc_Isobus_VT_VTSTATUSCycleSend_CT}
+    else if   (ischosen(v_PTCSet[v_i].ptc_Isobus_VT_CT)) { pt_sync.send(v_phaseStartReq) to v_PTCSet[v_i].ptc_Isobus_VT_CT}
+    else if   (ischosen(v_PTCSet[v_i].ptc_Isobus_ECU_CT)){ pt_sync.send(v_phaseStartReq) to v_PTCSet[v_i].ptc_Isobus_ECU_CT}
+    else if   (ischosen(v_PTCSet[v_i].ptc_Isobus_ECU_VTSTATUSCycleReceive_CT)) { pt_sync.send(v_phaseStartReq) to v_PTCSet[v_i].ptc_Isobus_ECU_VTSTATUSCycleReceive_CT}
+    else if   (ischosen(v_PTCSet[v_i].ptc_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT)){ pt_sync.send(v_phaseStartReq) to v_PTCSet[v_i].ptc_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT}
+    else {
+      log("Chosen PTC type misssing, please add handling for all PTC types!");
+      setverdict(inconc)}//something wrong, this should not happen
+  }
+}
+
+function f_haltAllComponents () runs on MTC {
+  var integer v_i
+  var integer v_amount := sizeof(v_PTCSet)
+  var Command_MTC2PTC v_haltReq := {haltReq:=true}
+  for (v_i := 0; v_i < v_amount; v_i := v_i +1){
+    log("MTC instance: ", self)
+    if        (ischosen(v_PTCSet[v_i].ptc_Adapter))   { pt_sync.send(v_haltReq) to v_PTCSet[v_i].ptc_Adapter}
+    else if   (ischosen(v_PTCSet[v_i].ptc_Isobus_VT_VTSTATUSCycleSend_CT)) { pt_sync.send(v_haltReq) to v_PTCSet[v_i].ptc_Isobus_VT_VTSTATUSCycleSend_CT}
+    else if   (ischosen(v_PTCSet[v_i].ptc_Isobus_VT_CT)) { pt_sync.send(v_haltReq) to v_PTCSet[v_i].ptc_Isobus_VT_CT}
+    else if   (ischosen(v_PTCSet[v_i].ptc_Isobus_ECU_CT)){ pt_sync.send(v_haltReq) to v_PTCSet[v_i].ptc_Isobus_ECU_CT}
+    else if   (ischosen(v_PTCSet[v_i].ptc_Isobus_ECU_VTSTATUSCycleReceive_CT)) { pt_sync.send(v_haltReq) to v_PTCSet[v_i].ptc_Isobus_ECU_VTSTATUSCycleReceive_CT}
+    else if   (ischosen(v_PTCSet[v_i].ptc_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT)){ pt_sync.send(v_haltReq) to v_PTCSet[v_i].ptc_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT}
+    else {
+      log("Chosen PTC type misssing, please add handling for all PTC types!");
+      setverdict(inconc)}//something wrong, this should not happen
+  }
+}
+
+function f_incPTCPhase(in e_Phase p_currentPhase) runs on SyncPTC return e_Phase {
+  var e_Phase v_nextPhase
+  log("PTC: ", self)
+  log("PTC instance: ", self)
+  log("Current PTC phase: ", p_currentPhase)
+  int2enum( enum2int(p_currentPhase)+1, v_nextPhase)
+  log("Next PTC phase:", v_nextPhase)
+  return v_nextPhase
+}
+
+function f_sendPhaseEndInd() runs on SyncPTC{
+  // just to allow matching with integer ranges on the reception side, as it is not poosible to do so with enums
+  var Command_PTC2MTC v_PhaseEndInd := {phaseEndInd :={phase := v_phase, phase_int := enum2int(v_phase)}}
+  pt_sync.send(v_PhaseEndInd)
+  log("PTC: PhaseEndInd to MTC with content: ", v_PhaseEndInd, self)
+  v_phase := f_incPTCPhase(v_phase)
+}
+
+function f_addSyncSlaveSet (in PTCs p_slave,
+  inout PTCSet p_set) {
+  p_set[sizeof(p_set)] := p_slave
+  return
+}
+function f_incMTCPhase(in e_Phase p_currentPhase) runs on MTC return e_Phase {
+  var e_Phase v_nextPhase
+  log("MTC: ", self)
+  log("Current phase: ", p_currentPhase)
+  int2enum( enum2int(p_currentPhase)+1, v_nextPhase)
+  log("Next phase:", v_nextPhase)
+  return v_nextPhase
+}
+
+function f_awaitEndPhase(in e_Phase p_phase) runs on MTC {
+  var integer v_amount:= sizeof(v_PTCSet);
+  var integer v_i
+  t_guard.start(c_guard)
+  var Command_PTC2MTC v_PhaseEndInd
+
+  log("Available PTCs", v_PTCSet)
+
+  for(v_i := 0; v_i < v_amount; v_i := v_i +1) {
+    alt {
+      [] pt_sync.receive (Command_PTC2MTC:{phaseEndInd:= {phase :=p_phase, phase_int := ?}}) -> value v_PhaseEndInd
+      {
+        log("Nth PTC", v_i, "of n PTCs: ", v_amount, "Ended phase: ", v_PhaseEndInd.phaseEndInd.phase)
+      }
+      // value between p_phase +1  and e_testcase_complete:
+      [] pt_sync.receive (Command_PTC2MTC:{phaseEndInd:= {phase :=?, phase_int :=  (enum2int(p_phase) .. (enum2int(c_testcase_complete)))}}) -> value v_PhaseEndInd
+      {
+        log("Nth PTC", v_i, "of n PTCs: ", v_amount, "Ended phase: ", v_PhaseEndInd.phaseEndInd.phase)
+      }
+      [] t_guard.timeout {
+        log("Timeout in MTC phase:", p_phase)
+        setverdict(inconc)
+      }
+      [] pt_sync.receive (Command_PTC2MTC:{phaseEndInd:=?})  -> value v_PhaseEndInd {
+        log("Unexpected phase recieved: ", v_PhaseEndInd)
+        log("Expected phase range: ", p_phase)
+        log(" to ", c_testcase_complete)
+        setverdict(inconc)        
+      }
+      [] any port.receive{
+        log("Expected phase:", p_phase)
+        setverdict(inconc)
+      }
+
+    } 
+  }
+  t_guard.stop
+}
+
+function f_awaitAllComponentsHalt() runs on MTC {
+  var integer v_amount:= sizeof(v_PTCSet);
+  var integer v_i
+  t_guard.start(c_guard)
+
+  for(v_i := 0; v_i < v_amount; v_i := v_i +1) {
+    alt {
+      [] pt_sync.receive (Command_PTC2MTC:{haltInd :=?}){
+      }
+      [] t_guard.timeout {
+        log("Timeout in MTC while waiting for command HaltRes")
+        setverdict(inconc)
+      }
+      [] any port.receive{
+        log("Received unexpeced message")
+        setverdict(inconc)
+      }
+    } 
+  }
+  t_guard.stop
+}
+function f_open_socket(in SocketCAN_socket p_socket) 
+runs on PTCAdapter 
+return SocketCAN_socket_result {
+
+  var SocketCAN_socket_result v_result  
+  timer t_guard
+  t_guard.start(c_guard)
+
+  pt_socketCAN.send(p_socket)  
+
+  // receive response
+  alt {
+    [] pt_socketCAN.receive(
+      a_SocketCAN_socket_result(a_result(SocketCAN_SUCCESS))) -> value v_result
+    {log("SocketCan:Socket opened: ", v_result.id)}
+    [] pt_socketCAN.receive(a_SocketCAN_socket_result(a_result(SocketCAN_ERROR)))
+    {log("Received Opening Socket failed"); setverdict(fail)}
+    [] t_guard.timeout {
+      log("guard timeout!")
+      setverdict(fail)}
+  }
+  t_guard.stop
+  return v_result
+}
+
+function f_ioctl_get_if_index(in SocketCAN_socketid p_socket_id) 
+runs on PTCAdapter 
+return SocketCAN_ioctl_result {
+  var SocketCAN_ioctl_result v_result   
+  timer t_guard
+  t_guard.start(c_guard)
+
+  pt_socketCAN.send(SocketCAN_ioctl:{id:= p_socket_id, ifu := omit});
+  // receive response
+  alt {
+    [] pt_socketCAN.receive(a_SocketCAN_ioctl_result(a_result(SocketCAN_SUCCESS))) -> value v_result
+    {log("Retrieved interface index", v_result.ifr.if_index)}
+    [] pt_socketCAN.receive(a_SocketCAN_ioctl_result(a_result(SocketCAN_ERROR)))
+    {log("Retrieving interface index failed", p_socket_id); setverdict(fail)}       
+    [] t_guard.timeout {
+      log("guard timeout!")
+      setverdict(fail)
+    }
+  } 
+  t_guard.stop
+  return v_result
+}
+
+function f_connect(in SocketCAN_socketid p_socket_id,
+  in SocketCAN_if_index p_if_index, 
+  in J1939_NAME p_j1939_name_destination,
+  in J1939_PGN  p_j1939_pgn_destination,
+  in J1939_ADDR  p_j1939_pgn_addr)
+runs on PTCAdapter 
+return SocketCAN_connect_result {  
+  var SocketCAN_connect_result v_result                   
+  timer t_guard
+  t_guard.start(c_guard)
+
+  pt_socketCAN.send(SocketCAN_Types.SocketCAN_connect:{id:= p_socket_id, 
+      connectu := {j1939 := {if_index:= p_if_index, 
+          j1939_destination:= {
+            name := p_j1939_name_destination /* or J1939_NO_NAME */,
+            pgn  := p_j1939_pgn_destination /* or J1939_NO_PGN */, 
+            addr := p_j1939_pgn_addr        /* or J1939_NO_ADDR */}}}});
+  // SocketCAN_connect receive response
+  alt {
+    [] pt_socketCAN.receive(a_SocketCAN_connect_result(a_result(SocketCAN_SUCCESS))) -> value v_result
+    {log("Connecting socket", p_socket_id)}
+    [] pt_socketCAN.receive(a_SocketCAN_connect_result(a_result(SocketCAN_ERROR))) 
+    {log("Connecting socket failed.", p_socket_id); setverdict(fail)}       
+    [] t_guard.timeout {
+      log("guard timeout!")
+      setverdict(fail)}
+  } 
+  t_guard.stop
+  return v_result
+}
+
+function f_bind(
+  in SocketCAN_socketid p_socket_id,
+  in SocketCAN_if_index p_if_index, 
+  in J1939_NAME         p_j1939_name_source,
+  in J1939_PGN          p_j1939_pgn_source,
+  in J1939_ADDR         p_j1939_addr_source) 
+runs on PTCAdapter 
+return SocketCAN_bind_result {
+  var SocketCAN_bind_result v_result
+  timer t_guard
+  t_guard.start(c_guard)
+
+  log("p_socket_id", p_socket_id)
+  log("p_if_index", p_if_index)
+  log("p_j1939_name_source", p_j1939_name_source)
+  log("p_j1939_pgn_source", p_j1939_pgn_source)
+  log("p_j1939_addr_source", p_j1939_addr_source)
+
+
+  pt_socketCAN.send(SocketCAN_bind:{id:= p_socket_id, 
+      bindu := {j1939 := {if_index:= p_if_index, 
+          j1939_source:= 
+          {name :=  p_j1939_name_source /* or J1939_NO_NAME */,
+            pgn :=  p_j1939_pgn_source  /* or J1939_NO_PGN */, 
+            addr := p_j1939_addr_source /* or J1939_NO_ADDR or J1939_IDLE_ADDR */ }}}});
+  alt {
+    [] pt_socketCAN.receive(a_SocketCAN_bind_result(a_result(SocketCAN_SUCCESS))) -> value v_result
+    {log("Binding socket", p_socket_id)}
+    [] pt_socketCAN.receive(a_SocketCAN_bind_result(a_result(SocketCAN_ERROR))) {}
+    [] t_guard.timeout {
+      log("guard timeout!")
+      setverdict(fail)
+    }
+  }
+  t_guard.stop
+  return v_result
+}
+
+function f_j1939_send_data_to(
+  in SocketCAN_socketid   p_socket_id, 
+  in SocketCAN_if_index   p_if_index,
+  in J1939_hdr            p_j1939_destination,
+  in SocketCAN_J1939_PDU  p_pdu)
+runs on PTCAdapter
+return SocketCAN_j1939_send_data_to_result { 
+  var SocketCAN_j1939_send_data_to_result v_result
+
+  timer t_guard
+  t_guard.start(c_guard)
+
+  pt_socketCAN.send(SocketCAN_j1939_send_data_to:{
+      id                := p_socket_id,
+      if_index          := p_if_index,
+      j1939_destination := p_j1939_destination,
+      pdu               := p_pdu});
+
+  alt {
+    [] pt_socketCAN.receive(a_SocketCAN_j1939_send_data_to_result(a_result(SocketCAN_SUCCESS))) -> value v_result
+    {log("Sending j1939_send_data_to", p_socket_id)}
+    [] pt_socketCAN.receive(a_SocketCAN_j1939_send_data_to_result(a_result(SocketCAN_ERROR))) 
+    {log("Sending j1939_send_data_to failed", p_socket_id); setverdict(fail)}       
+    [] t_guard.timeout {
+      log("guard timeout!")
+      setverdict(fail)
+    }
+  }
+  t_guard.stop
+  return v_result
+}
+
+function f_j1939_send_data(in SocketCAN_socketid p_socket_id, 
+  in SocketCAN_J1939_PDU              p_pdu) 
+runs on PTCAdapter 
+return SocketCAN_j1939_send_data_result { 
+
+  var SocketCAN_j1939_send_data_result v_result
+
+  timer t_guard
+  t_guard.start(c_guard)
+  log("SocketCAN_j1939_send_data_to:{id}:", p_socket_id)
+  log("SocketCAN_j1939_send_data_to:{pdu}:", p_pdu)
+
+  pt_socketCAN.send(SocketCAN_j1939_send_data:{
+      id:= p_socket_id, 
+      pdu:=p_pdu});
+  alt {
+    [] pt_socketCAN.receive(a_SocketCAN_j1939_send_data_result(a_result(SocketCAN_SUCCESS))) -> value v_result
+    {log("Writing data on J1939 socket: ", p_socket_id)}
+    [] pt_socketCAN.receive(a_SocketCAN_j1939_send_data_result(a_result(SocketCAN_ERROR))) 
+    {log("Writing data on J1939 socket failed", p_socket_id); 
+      setverdict(fail)}       
+    [] t_guard.timeout {
+      log("guard timeout!")
+      setverdict(fail)}
+  }
+  t_guard.stop
+  return v_result
+}
+
+function f_setsockopt(in SocketCAN_socketid p_socket_id,
+  in SocketCAN_setsockopt_commandu p_command)
+runs on PTCAdapter 
+return SocketCAN_setsockopt_result{
+  var SocketCAN_setsockopt_result v_result
+
+  timer t_guard
+  t_guard.start(c_guard)
+
+  pt_socketCAN.send(SocketCAN_Types.SocketCAN_setsockopt:{id:= p_socket_id, command := p_command});
+  alt {
+    [] pt_socketCAN.receive(a_SocketCAN_setsockopt_result(a_result(SocketCAN_SUCCESS))) -> value v_result
+    {log("Writing data", p_socket_id)}
+    [] pt_socketCAN.receive(a_SocketCAN_setsockopt_result(a_result(SocketCAN_ERROR))) 
+    {log("Writing data failed", p_socket_id); setverdict(fail)}       
+    [] t_guard.timeout {
+      log("guard timeout!")
+      setverdict(fail)
+    }
+  }
+  t_guard.stop
+  return v_result
+}
+
+function f_close_socket (in SocketCAN_socketid p_socket_id) 
+runs on PTCAdapter {
+  pt_socketCAN.send(SocketCAN_close:{id:= p_socket_id});
+}
+
+function f_open_j1939()
+runs on PTCAdapter 
+return SocketCAN_open_j1939_result {
+  var SocketCAN_socketid v_socket_id
+  v_socket_id := f_open_socket({domain:=PF_CAN, ptype := SOCK_DGRAM, protocol:= CAN_J1939}).id
+  var SocketCAN_ifr v_ifr
+  v_ifr := f_ioctl_get_if_index(v_socket_id).ifr
+
+  var SocketCAN_open_j1939_result v_result
+  v_result := {ifr := v_ifr, socket_id := v_socket_id}
+
+  return v_result
+}
+
+function f_ptc_J1939Adapter(
+  in e_Phase             p_phase,
+  in J1939_Priority      p_send_prio,
+  in J1939_NAME          p_j1939_name_source) runs on PTCAdapter {
+  map(self:pt_socketCAN, system:pt_socketCAN)
+  var SocketCAN_socketid v_socket_id
+  var SocketCAN_ifr v_ifr
+
+  alt_awaitPhaseStartReq(e_open_socket)
+  var SocketCAN_open_j1939_result res
+  res := f_open_j1939()
+  v_socket_id := res.socket_id
+  v_ifr := res.ifr
+  var SocketCAN_bind_result v_bind_result
+  v_bind_result := f_bind(v_socket_id,
+    v_ifr.if_index, 
+    p_j1939_name_source, 
+    J1939_NO_PGN,  /* p_j1939_pgn_source */
+    J1939_NO_ADDR  /* p_j1939_addr_source */)
+  var SocketCAN_setsockopt_result            v_setsockopt_result
+  v_setsockopt_result := f_setsockopt(v_socket_id, {j1939_prio:=p_send_prio})
+  const SocketCAN_setsockopt_commandu c_commandu_activate_broadcast := {j1939_broadcast := Enable} 
+  // configure broadcast:
+  v_setsockopt_result := f_setsockopt(v_socket_id, c_commandu_activate_broadcast)
+  f_sendPhaseEndInd() //e_open_socket
+  alt_awaitPhaseStartReq(p_phase)
+  f_sendPhaseEndInd()
+  alt_awaitPhaseStartReq(e_testbodyEnd)
+  f_sendPhaseEndInd()
+
+
+  var SocketCAN_receive_j1939_message v_result
+  var SocketCAN_j1939_send_data_to_result v_send_data_to_result
+  var J1939PDU_with_NAME v_pgn_and_pdu_with_name
+  var boolean condition := true
+  var boolean v_guard :=true
+
+  timer t_guard
+
+
+
+  while (condition)
+  {
+    alt 
+    {
+      [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){
+
+        pt_sync.send(Command_PTC2MTC:{haltInd:=true})
+        log("PTC name: ", self)
+        log("Got HaltReq command")
+        condition := false
+      }
+
+      [v_guard] pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=?,pdu:=?}) 
+      -> value v_pgn_and_pdu_with_name 
+      { 
+        t_guard.start(c_guard)
+
+        var octetstring v_j1939_pdu, v_pgn_and_pdu
+        v_pgn_and_pdu := f_encode_J1939_message (v_pgn_and_pdu_with_name.pdu)
+        v_j1939_pdu := substr(v_pgn_and_pdu,3,lengthof(v_pgn_and_pdu)-3)// strip PGN
+
+        var J1939_hdr v_j1939_destination := {
+          name := v_pgn_and_pdu_with_name.name, 
+          pgn := substr(v_pgn_and_pdu,0,3),        // strip PDU,  pgn_destination 
+          addr:= v_pgn_and_pdu_with_name.addr
+        }
+
+
+        pt_socketCAN.send(SocketCAN_j1939_send_data_to:{
+            id                := v_socket_id,
+            if_index          := v_ifr.if_index,
+            j1939_destination := v_j1939_destination,
+            // strip PGN
+            pdu               := v_j1939_pdu});
+
+        v_guard:=false;  //stop receiving until send confirmation received 
+      }
+
+      [not(v_guard)] pt_socketCAN.receive(a_SocketCAN_j1939_send_data_to_result(a_result(SocketCAN_SUCCESS))) -> value v_send_data_to_result
+      {
+        log("Sending j1939_send_data_to:", v_socket_id, ", ", v_ifr.if_index)
+        v_guard:=true
+        t_guard.stop
+      }
+
+      [not(v_guard)] pt_socketCAN.receive(a_SocketCAN_j1939_send_data_to_result(a_result(SocketCAN_ERROR))) 
+      {
+        log("Sending j1939_send_data_to failed", v_socket_id); 
+        v_guard:=true
+        t_guard.stop
+        setverdict(fail)
+      }
+
+      [] pt_socketCAN.receive(a_SocketCAN_receive_j1939_message(
+          v_socket_id,
+          v_ifr,
+          ?, /* any pgn */
+          ?, /* any peer_addr */
+          ?, /* any peer_name */
+          ?  /* any j1939_pdu */)) -> value v_result
+      {
+        log("SocketCan:J1939 message from socket received", v_result)     
+        pt_j1939PDU.send({addr:=v_result.destAddr, name:= v_result.name, 
+            // concatenate received pgn and pdu
+            pdu:=f_decode_J1939_message(v_result.pgn & v_result.pdu) /* concatenate pgn & pdu */}); 
+      }
+      [] pt_sync.receive
+      {
+        log("Fail:Unexpected message from port pt_sync received");
+        setverdict(fail)
+      }
+      [v_guard] pt_socketCAN.receive
+      {
+        log("Fail:Unexpected message from port pt_socketCAN received")
+        //this should catch any incoming message type not matched on the first alternatives
+        setverdict(fail)
+      }
+
+      [v_guard] pt_j1939PDU.receive
+      {
+        log("Fail:Unexpected message from port pt_j1939PDU received")
+        //this should catch any incoming message type not matched on the first alternatives
+        setverdict(fail)
+      }
+
+      [v_guard] any port.receive   
+      {
+        log("Fail:Message received on a different port")
+        //this should catch any incoming message type not matched on the first alternatives on any other port
+        setverdict(fail)
+      } 
+
+      [not(v_guard)] t_guard.timeout {
+        log("guard timeout!")
+        setverdict(fail)
+      }
+    }//endalt
+  } // end while
+
+
+  f_close_socket (v_socket_id)
+  unmap(self:pt_socketCAN, system:pt_socketCAN)
+  setverdict(pass)
+}
+
+function f_ptc_J1939ECUApplication(in e_Phase p_phase) runs on PTC_Isobus_ECU_CT
+{
+
+  var boolean condition := true
+  alt_awaitPhaseStartReq(p_phase)
+  f_sendPhaseEndInd()
+  alt_awaitPhaseStartReq(e_testbodyEnd)
+
+
+  while (condition)
+  {
+    var J1939PDU_with_NAME v_pgn_and_pdu_with_name  
+
+    alt 
+    {
+      [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){
+        pt_sync.send(Command_PTC2MTC:{haltInd:=true})
+        log("PTC name: ", self)
+        log("Got HaltReq command")
+        condition := false
+      }
+
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=?,
+          pdu:=t_VTStatusInd(?, ?, ?, ?, ?)}) -> value v_pgn_and_pdu_with_name 
+      { 
+        v_peeraddr := v_pgn_and_pdu_with_name.addr
+        v_peername := v_pgn_and_pdu_with_name.name
+        // store peer name
+        //log incoming message 
+        log("SocketCan:Expected message VTStatusReq received!", v_pgn_and_pdu_with_name)
+        pt_VTStatusTick.send( true );
+      }  
+      [] pt_WorkingSetMaintenance.receive(t_WorkingSetMaintenanceTick(?)) {
+        pt_j1939PDU.send(t_J1939PDU_with_NAME(
+            J1939_NO_ADDR, /* set addr 0xFF, applies as name is set */
+            v_peername,    /* set peername */
+            t_WorkingSetMaintenanceInd(true, compliantWithVTVersion4)
+
+          ))
+      }
+
+      []pt_WorkingSetMaintenance.receive(t_WorkingSetMaintenanceInitialize(true)) {
+        // the ECU has received the first VTStatus message
+        pt_j1939PDU.send(t_J1939PDU_with_NAME(
+            J1939_NO_ADDR, /* set addr 0xFF, applies as name is set */
+            v_peername,    /* set peername */
+            t_GetHardwareReq
+          ))    
+      }
+
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=v_peername,
+          pdu:=t_GetHardwareRes(?, ?, ?, ?, ?)}) -> value v_pgn_and_pdu_with_name 
+      { 
+        log("SocketCan:Expected message GetHardwareRes received!", v_pgn_and_pdu_with_name)
+        pt_j1939PDU.send(t_J1939PDU_with_NAME(
+            J1939_NO_ADDR, /* set addr 0xFF, applies as name is set */
+            v_peername,    /* set peername */
+            t_GetNumberOfSoftKeysReq
+          ))    
+      }  
+
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=v_peername,
+          pdu:=t_GetNumberOfSoftKeysRes(?, ?, ?, ?, ?)}) -> value v_pgn_and_pdu_with_name 
+      { 
+        log("SocketCan:Expected message GetNumberOfSoftKeysRes received!", v_pgn_and_pdu_with_name)
+        pt_j1939PDU.send(t_J1939PDU_with_NAME(
+            J1939_NO_ADDR, /* set addr 0xFF, applies as name is set */
+            v_peername,    /* set peername */
+            t_GetTextFontDataReq
+          ))    
+      } 
+
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=v_peername,
+          pdu:=t_GetTextFontDataRes(?, ?, ?)}) -> value v_pgn_and_pdu_with_name 
+      { 
+        log("SocketCan:Expected message GetTextFontDataRes received!", v_pgn_and_pdu_with_name)
+        pt_j1939PDU.send(t_J1939PDU_with_NAME(
+            J1939_NO_ADDR, /* set addr 0xFF, applies as name is set */
+            v_peername,    /* set peername */
+            t_GetMemoryReq(100000)
+          ))    
+      } 
+
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=v_peername,
+          pdu:=t_GetMemoryRes(?, ?)}) -> value v_pgn_and_pdu_with_name 
+      { 
+        log("SocketCan:Expected message GetMemoryRes received!", v_pgn_and_pdu_with_name)
+        log("SocketCan:Sending broken object pool!")
+        pt_j1939PDU.send(t_J1939PDU_with_NAME(
+            J1939_NO_ADDR, /* set addr 0xFF, applies as name is set */
+            v_peername,    /* set peername */
+            t_ObjectPoolTransferInd('0123456789ABCDEF'O)))  
+        pt_j1939PDU.send(t_J1939PDU_with_NAME(
+            J1939_NO_ADDR, /* set addr 0xFF, applies as name is set */
+            v_peername,    /* set peername */
+            t_EndOfObjectPoolReq))    
+      } 
+
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=v_peername,
+          pdu:=t_EndOfObjectPoolRes(?, ?, ?,               
+            /* objectPoolErrorCodes */   { 
+              methodOrAttributeNotSupportedByTheVT   :=?,
+              unknownObjectReference                 :=true,
+              anyOtherError                          :=?,
+              objectPoolWasDeletedFromVolatileMemory :=?,
+              reserved4                              :=false,
+              reserved5                              :=false,
+              reserved6                              :=false,
+              reserved7                              :=false
+            })}) -> value v_pgn_and_pdu_with_name 
+      { 
+        log("Expected message EndOfObjectPoolRes received!", v_pgn_and_pdu_with_name)
+        f_sendPhaseEndInd()
+
+        setverdict ( pass );
+      }
+
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=v_peername,
+          pdu:=t_EndOfObjectPoolRes(?, ?, ?,               
+            /* objectPoolErrorCodes */   { 
+              methodOrAttributeNotSupportedByTheVT   :=?,
+              unknownObjectReference                 :=?,
+              anyOtherError                          :=?,
+              objectPoolWasDeletedFromVolatileMemory :=?,
+              reserved4                              :=false,
+              reserved5                              :=false,
+              reserved6                              :=false,
+              reserved7                              :=false
+            })}) -> value v_pgn_and_pdu_with_name 
+      { 
+        log("Unxxpected message EndOfObjectPoolRes response parameter received!", v_pgn_and_pdu_with_name)
+        f_sendPhaseEndInd()
+
+        setverdict ( fail );
+      }
+
+      [] pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:=?, name:=?,pdu:=?}) -> value v_pgn_and_pdu_with_name
+      {
+        log("Unexpected message received!", v_pgn_and_pdu_with_name)
+      }
+
+      [] pt_j1939PDU.receive  
+      {log("Unexpected message received")} //this should catch any incoming message type not matched on the first alternatives
+
+      //      [] any port.receive   
+      //      {
+      //        setverdict(fail)        
+      //        log("Message received on a different port") //this should catch any incoming message type not matched on the first alternatives on any other port
+      //      }
+    }//endalt
+  } // end while
+}
+
+function f_ptc_J1939VTApplication(in e_Phase p_phase) runs on PTC_Isobus_VT_CT
+{
+  var  boolean  condition := true
+  alt_awaitPhaseStartReq(p_phase)
+  f_sendPhaseEndInd()
+  alt_awaitPhaseStartReq(e_testbodyEnd)
+
+
+  while (condition)
+  {
+    var J1939PDU_with_NAME v_pgn_and_pdu_with_name    
+    alt 
+    {
+      [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){
+        pt_sync.send(Command_PTC2MTC:{haltInd:=true})
+        log("PTC name: ", self)
+        log("Got HaltReq command")
+        condition := false
+      }
+
+      []pt_VTStatusTick.receive(VTStatusTick:?)
+      {
+        pt_j1939PDU.send(t_J1939PDU_with_NAME(
+            J1939_NO_ADDR, /* send broadcast, as name is set to J1939_NO_NAME */
+            J1939_NO_NAME, /* set peername */
+            t_VTStatusInd(J1939_IDLE_ADDR, 
+              'FFFF'O, 
+              'FFFF'O, 
+              vtIsBusyUpdatingVisibleMask, 
+              'FF'O)
+          ))
+      }
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{
+          addr := ?, 
+          name:=?,
+          pdu:=t_WorkingSetMaintenanceInd(?, ?)}) -> value v_pgn_and_pdu_with_name 
+      { 
+        //log incoming message 
+        log("SocketCan:Expected WorkingSetMaintenanceInd message received!", v_pgn_and_pdu_with_name)
+        log("The version number is", v_pgn_and_pdu_with_name.pdu.pdu.ecu2vt.workingSetMaintenanceInd.versionNumber)
+        v_peeraddr := v_pgn_and_pdu_with_name.addr
+        v_peername := v_pgn_and_pdu_with_name.name
+        // store peer name
+      }  
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{
+          addr := ?, 
+          name:=?,
+          pdu:=t_GetHardwareReq}) -> value v_pgn_and_pdu_with_name 
+      { 
+        pt_j1939PDU.send(t_J1939PDU_with_NAME(
+            v_pgn_and_pdu_with_name.addr, 
+            v_pgn_and_pdu_with_name.name,    /* respond to sender */
+            t_GetHardwareRes(
+              /* bootTimeInSeconds */ 255,
+              /* graphicType */ colors256, 
+              /* hardware */ { 
+                touchScreenandPointingEvent := true, 
+                pointingDeviceAndPointingEvent := false, 
+                multipleFrequencyAudioOutput := true, 
+                adjustableVolumeAudioOutput := true, 
+                simultaneousActivationsOfPhysicalSoftKeys := false, 
+                simultaneousActivationsOfButtons := false, 
+                dragOperationViaPointingEvent := true, 
+                intermediateCoordinatesDuringDragOperation := true }, 
+              /* xPixels */ 480, 
+              /* yPixels */480) 
+          ))  
+      }
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{
+          addr := ?, 
+          name:=?,
+          pdu:=t_GetNumberOfSoftKeysReq}) -> value v_pgn_and_pdu_with_name 
+      { 
+        pt_j1939PDU.send(t_J1939PDU_with_NAME(
+            v_pgn_and_pdu_with_name.addr, 
+            v_pgn_and_pdu_with_name.name,    /* respond to sender */
+            t_GetNumberOfSoftKeysRes(
+              /* navigationSoftKeys */ '00'O, 
+              /* x_dots */ '7D'O, 
+              /* y_dots */ '48'O, 
+              /* numberOfVirtualSoftKeys */ '40'O , 
+              /* numberOfPhysicalSoftKeys */ '0C'O
+            )))  
+      }
+
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{
+          addr := ?, 
+          name:=?,
+          pdu:=t_GetTextFontDataReq}) -> value v_pgn_and_pdu_with_name 
+      { 
+        pt_j1939PDU.send(t_J1939PDU_with_NAME(
+            v_pgn_and_pdu_with_name.addr, 
+            v_pgn_and_pdu_with_name.name,    /* respond to sender */
+            t_GetTextFontDataRes(
+              /* small_font_sizes */ { 
+                font_8x8 := true, 
+                font_8x12 := true, 
+                font_12x16 := true, 
+                font_16x16 := true, 
+                font_16x24 := true, 
+                font_24x32 := true, 
+                font_32x32 := true, 
+                reserved := false }, 
+              /* large_font_sizes */ { 
+                font_32x48 := true, 
+                font_48x64 := true, 
+                font_64x64 := true, 
+                font_64x96 := true, 
+                font_96x128 := true, 
+                font_128x128 := true, 
+                font_128x192 := true, 
+                reserved := false }, 
+              /* type_attribute */ { 
+                bold_text := true, 
+                crossed_out_text := true, 
+                underlined_text := true, 
+                italics_text := true, 
+                inverted_text := true, 
+                flash_inverted := true, 
+                flash_background_and_foreground := true, 
+                proportional_font_rendering := true }
+            )))  
+      }
+
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{
+          addr := ?, 
+          name:=?,
+          pdu:=t_GetMemoryReq(?)}) -> value v_pgn_and_pdu_with_name 
+      { 
+        pt_j1939PDU.send(t_J1939PDU_with_NAME(
+            v_pgn_and_pdu_with_name.addr, 
+            v_pgn_and_pdu_with_name.name,    /* respond to sender */
+            t_GetMemoryRes(
+              /* versionNumber */ compliantWithISVersionISO11783_6_2010_E_Second_Edition_version_4, 
+              /* status */ thereCanBeEnoughMemory
+            )))  
+      }
+
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{
+          addr := ?, 
+          name:=?,
+          pdu:=t_GetVersionsReq}) -> value v_pgn_and_pdu_with_name 
+      { 
+        pt_j1939PDU.send(t_J1939PDU_with_NAME(
+            v_pgn_and_pdu_with_name.addr, 
+            v_pgn_and_pdu_with_name.name,    /* respond to sender */
+            t_GetVersionsRes(
+              /* numberOfVersionStrings */ 0, 
+              /* versionStrings */ {  }
+            )))  
+      }
+
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{
+          addr := ?, 
+          name:=?,
+          pdu:=t_ObjectPoolTransferInd(?)}) -> value v_pgn_and_pdu_with_name 
+      { 
+        log("Received Object Pool", v_pgn_and_pdu_with_name.pdu.pdu.ecu2vt.objectPoolTransferInd.objectPoolRecords) 
+        log("From addr:", v_pgn_and_pdu_with_name.addr)
+        log("From name:", v_pgn_and_pdu_with_name.name)     
+      }
+
+      []pt_j1939PDU.receive(J1939PDU_with_NAME:{
+          addr := ?, 
+          name:=?,
+          pdu:=t_EndOfObjectPoolReq}) -> value v_pgn_and_pdu_with_name 
+      { 
+        pt_j1939PDU.send(t_J1939PDU_with_NAME(
+            v_pgn_and_pdu_with_name.addr, 
+            v_pgn_and_pdu_with_name.name,    /* respond to sender */
+            t_EndOfObjectPoolRes(
+              /* errorCodes */ {
+                thereAreErrorsInTheObjectPool  := false,
+                vtRanOutOfMemoryDuringTransfer := false,
+                reserved2                      := false,
+                reserved3                      := false,
+                anyOtherError                  := false,
+                reserved5                      := false,
+                reserved6                      := false,
+                reserved7                      := false},
+              /* parentObjectIDoFaultyObject */ 1,
+              /* objectIDofFaultyObject */      2,
+              /* objectPoolErrorCodes */   { 
+                methodOrAttributeNotSupportedByTheVT   :=false,
+                unknownObjectReference                 :=true,
+                anyOtherError                          :=false,
+                objectPoolWasDeletedFromVolatileMemory :=false,
+                reserved4                              :=false,
+                reserved5                              :=false,
+                reserved6                              :=false,
+                reserved7                              :=false
+              }
+            ))) 
+        f_sendPhaseEndInd()
+
+        setverdict ( pass );
+      }
+
+      [] pt_j1939PDU.receive(J1939PDU_with_NAME:{addr := ?, name:=?,pdu:=?}) -> value v_pgn_and_pdu_with_name
+      {
+        log("SocketCan:Unexpected message received!", v_pgn_and_pdu_with_name)
+      }
+
+      [] pt_j1939PDU.receive  
+      {log("Unexpected message received")} 
+      //this should catch any incoming message type not matched on the first alternatives
+
+      [] any port.receive   
+      {
+        setverdict(fail)
+        log("Message received on a different port")} 
+      //this should catch any incoming message type not matched on the first alternatives on any other port
+
+    }//endalt
+  } // end while
+
+  setverdict(pass)
+}
+
+
+function  f_ptc_J1939VTStatusCycleSend(in e_Phase p_phase)  runs on PTC_Isobus_VT_VTSTATUSCycleSend_CT
+{
+  //periodic sending
+  timer VTStatusClock := 1.0
+  var  boolean  condition := true
+  alt_awaitPhaseStartReq(p_phase)
+  f_sendPhaseEndInd()
+  alt_awaitPhaseStartReq(e_testbodyEnd)
+  f_sendPhaseEndInd()
+
+  while (condition)
+  {
+    pt_VTStatusTick.send(true);
+
+    VTStatusClock.start 
+    alt
+    {
+      [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){
+        pt_sync.send(Command_PTC2MTC:{haltInd:=true})
+        log("PTC name: ", self)
+        log("Got HaltReq command")
+        condition := false
+      }
+
+      []VTStatusClock.timeout;
+    }
+  }//endwhile
+
+  setverdict(pass)
+
+}//endfunction
+
+function  f_ptc_J1939_VTStatusCycleReceive(in e_Phase p_phase)  runs on PTC_Isobus_ECU_VTSTATUSCycleReceive_CT
+{
+
+  timer T_VTStatusReceive := 3.0
+  var boolean v_VTStatusReceive_running := false
+  var boolean condition := true
+  //periodic reception
+
+  alt_awaitPhaseStartReq(p_phase)
+  f_sendPhaseEndInd()
+  alt_awaitPhaseStartReq(e_testbodyEnd)
+  f_sendPhaseEndInd()
+
+  while (condition)
+  {
+    select (v_VTStatusReceive_running) // state
+    {
+      case (true) {
+        alt {
+          [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){
+            pt_sync.send(Command_PTC2MTC:{haltInd:=true})
+            log("PTC name: ", self)
+            log("Got HaltReq command")
+            condition := false
+          }
+
+          []pt_VTStatusTick.receive(?) { 
+            //log incoming message
+            T_VTStatusReceive.stop;
+            T_VTStatusReceive.start;
+            pt_WorkingSetMaintenaceOnOff.send( true ); 
+          } 
+
+          []T_VTStatusReceive.timeout
+          {
+            pt_WorkingSetMaintenaceOnOff.send( false );
+            v_VTStatusReceive_running := false
+          }
+        }//endalt
+      }
+      case (false) {
+        alt {
+          [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){
+            pt_sync.send(Command_PTC2MTC:{haltInd:=true})
+            log("PTC name: ", self)
+            log("Got HaltReq command")
+            condition := false
+          }
+
+          []pt_VTStatusTick.receive(?) { 
+            //log incoming message
+            T_VTStatusReceive.start;
+            v_VTStatusReceive_running := true
+            pt_WorkingSetMaintenaceOnOff.send( true ); 
+          } 
+        } //endalt
+      }
+    }
+
+  }
+  setverdict(pass)
+
+}//endfunction
+
+
+function  J1939_ECU_WorkingSetMaintenanceIndCycleSend(in e_Phase p_phase)  runs on PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT
+{
+  timer T_WorkingSetMaintenanceIndCycleSend := 1.0
+  var boolean  v_WorkingSetMaintenaceOn := false
+  var boolean  condition := true
+
+  //periodic reception
+
+  alt_awaitPhaseStartReq(p_phase)
+  f_sendPhaseEndInd()
+  alt_awaitPhaseStartReq(e_testbodyEnd)
+  f_sendPhaseEndInd()
+
+  while (condition)
+  {
+    select (v_WorkingSetMaintenaceOn) {
+      case (true) {
+        alt {
+          [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){
+            pt_sync.send(Command_PTC2MTC:{haltInd:=true})
+            log("PTC name: ", self)
+            log("Got HaltReq command")
+            condition := false
+          }
+
+          []pt_WorkingSetMaintenaceOnOff.receive(true) 
+          // timer already running 
+          { 
+            //do not do anything
+            //log incoming message
+          } 
+          []pt_WorkingSetMaintenaceOnOff.receive(false) { 
+            T_WorkingSetMaintenanceIndCycleSend.stop;
+            //log incoming message
+            // do not start timer
+            v_WorkingSetMaintenaceOn := false // timer is not running
+            // trigger ECU reset
+          } 
+          []T_WorkingSetMaintenanceIndCycleSend.timeout
+          {
+            // restart timer
+            T_WorkingSetMaintenanceIndCycleSend.start
+            pt_WorkingSetMaintenance.send( t_WorkingSetMaintenanceTick(true))
+          }
+        } //endalt
+      }
+      case (false) {
+        alt {
+          [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){
+            pt_sync.send(Command_PTC2MTC:{haltInd:=true})
+            log("PTC name: ", self)
+            log("Got HaltReq command")
+            condition := false
+          }
+
+          []pt_WorkingSetMaintenaceOnOff.receive(true) { 
+            // timer not running 
+            // start timer
+            T_WorkingSetMaintenanceIndCycleSend.start
+            //log incoming message
+            v_WorkingSetMaintenaceOn := true // timer is running
+            pt_WorkingSetMaintenance.send( t_WorkingSetMaintenanceTick(true) )
+            pt_WorkingSetMaintenance.send( t_WorkingSetMaintenanceInitialize(true) )
+          } 
+          []pt_WorkingSetMaintenaceOnOff.receive(false) { 
+            //timer is stopped
+            //log incoming message
+            // do not start timer
+            // trigger ECU reset
+          }
+        }
+      } //endalt
+    }
+  }
+  setverdict ( pass );
+}//endfunction
+
+
+}
diff --git a/demo/Isobus_test_encoder.ttcn b/demo/Isobus_test_encoder.ttcn
new file mode 100644
index 0000000..f69a236
--- /dev/null
+++ b/demo/Isobus_test_encoder.ttcn
@@ -0,0 +1,762 @@
+/* Copyright (c) 2000-2019 Ericsson Telecom AB AB
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+* Michael Josenhans
+******************************************************************************/
+//
+//  File:               Isobustest_plain_socketcan.ttcn
+//  Description:        Encoder / Decoder for Isobus message frames
+//
+// Revision R1A
+
+module Isobustest_test_encoder{
+
+import from Isobus all
+import from IsobusVT_Templates all
+import from J1939 all
+
+//component declarations
+type component MTC_CT
+{ 
+}
+
+testcase tc_encdec() runs on MTC_CT
+{
+  template J1939_messageWithPGN t_address_claimed :=  {pgn := '00EEFF'O,
+    pdu := {addressClaimedOrCannotClaimSourceAddress := { name := {  
+          identityNumber := 514,
+          manufacturerCode := 368,
+          ecuInstance := 3,
+          functionInstance := 5,  
+          function_ := 3,
+          reserved := 0, 
+          vehicleSystem := 101, 
+          vehicleSystemInstance := 1, 
+          industryGroup := 3, 
+          arbitraryAddresssBit := 0     
+        }}}}
+
+  log(f_encode_J1939_message(valueof(t_address_claimed)))
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(f_encode_J1939_message(valueof(t_address_claimed))))
+  log("--------------------------------------------")
+
+  template J1939_messageWithPGN t_requestForAddressClaimed :=  {pgn := '00EA00'O,
+    pdu := {requestForAddressClaimed := {pgn := 123}}}
+
+  log(f_encode_J1939_message(valueof(t_requestForAddressClaimed)))
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(f_encode_J1939_message(valueof(t_requestForAddressClaimed))))
+  log("--------------------------------------------")
+
+  //  template CAN_frame_j1939 t_CAN_frame_j1939_3 :=  { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := 'FD'O, sa := 'C0'O }, can_pdu := { cannotClaimSourceAddress := { name := {  
+  //    arbitraryAddresssBitValue := 0, 
+  //    industryGroupValue := 3, 
+  //    vehicleSystemInstanceValue := 1, 
+  //    vehicleSystemValue := 101, 
+  //    reservedValue := 0, 
+  //    functionValue := 3, 
+  //    functionInstanceValue := 5, 
+  //    ecuInstanceValue := 3, 
+  //    manufacturerCodeValue := 368, 
+  //    identityNumberValue := 514 } }}}
+  //  log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_3)))
+  //  log("--------------------------------------------")
+  //  log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_3))))
+  //  log("--------------------------------------------")
+
+  template J1939_messageWithPGN t_commandedAddress :=  {pgn := '00FED8'O,
+    pdu := { commandedAddress := {
+        name := {  
+          identityNumber := 514,
+          manufacturerCode := 368,
+          ecuInstance := 3,
+          functionInstance := 5,  
+          function_ := 3,
+          reserved := 0, 
+          vehicleSystem := 101, 
+          vehicleSystemInstance := 1, 
+          industryGroup := 3, 
+          arbitraryAddresssBit := 0 },
+        newSourceAddress:='AA'O
+      } } }
+
+  log(f_encode_J1939_message(valueof(t_commandedAddress)))
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(f_encode_J1939_message(valueof(t_commandedAddress))))
+  log("--------------------------------------------")
+}
+
+testcase tc_encdec_vtStatusReq() runs on MTC_CT
+{
+  template J1939_messageWithPGN t_commandedAddress :=  {pgn := '00E600'O,
+    pdu := {vt2ecu := {vtStatusInd :=
+        { vtfunction := 254, 
+          sourceAddressOfActiveWorkingSetMaster := '11'O,
+          objectIDOfTheVisibleDataAlarmMaskOfTheActiveWorkingSet := '2233'O,
+          objectIDOfTheVisibleSoftKeyMaskOfTheActiveWorkingSet := '4455'O,
+          vtBusyCodes := vtIsBusyExecutingACommand,
+          vtFunctionCode := '66'O}}}}
+  log(f_encode_J1939_message(valueof(t_commandedAddress)))
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(f_encode_J1939_message(valueof(t_commandedAddress))))
+  log("--------------------------------------------")
+}
+
+testcase tc_encdec_getMemoryReq() runs on MTC_CT
+{
+  template J1939_messageWithPGN t_commandedAddress :=  {pgn := '00E700'O,
+    pdu := {ecu2vt := {getMemoryReq :=
+        { vtfunction := 192, 
+          reserved2 := 'FF'O,
+          memoryRequired := 1234567}}}}
+  log(f_encode_J1939_message(valueof(t_commandedAddress)))
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(f_encode_J1939_message(valueof(t_commandedAddress))))
+  log("--------------------------------------------")
+}
+
+testcase tc_encdec_getMemoryReq_with_template() runs on MTC_CT // using a template
+{
+  template J1939_messageWithPGN t_getMemoryReq := t_GetMemoryReq(1234567)
+  log(f_encode_J1939_message(valueof(t_getMemoryReq)))
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(f_encode_J1939_message(valueof(t_getMemoryReq))))
+  log("--------------------------------------------")
+}
+
+testcase tc_encdec_workingSetMaintenanceReq() runs on MTC_CT // using a template
+{
+  template J1939_messageWithPGN t_workingSetMaintenanceReq := t_WorkingSetMaintenanceInd(
+    true,
+    compliantWithVTVersion4)
+  log(f_encode_J1939_message(valueof(t_workingSetMaintenanceReq)))
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(f_encode_J1939_message(valueof(t_workingSetMaintenanceReq))))
+  log("--------------------------------------------")
+}
+
+
+//testcase tc_dec_largemessage() runs on MTC_CT
+//{
+//
+//  var octetstring j1939_pdu
+//  //j1939_pdu := '18EAFFFE00EE00'O                
+//  //j1939_pdu := '18EEFFF83102032E003D0080'O
+//  //j1939_pdu := '18EEFFF73102032E008200A0'O
+//  //j1939_pdu := '18EAF8F8EBFE00'O  
+//  j1939_pdu := '18ECF8F810160004FFEBFE00'O
+//
+//  // j1939_pdu := '00E726F8B3DA590B0066696C6520736572766572'O
+//  // j1939_pdu := '03FE00F8FE2A66696C65207365727665722A3139373136392A2D2A'O
+//  // j1939_pdu := '03FE00F82A66696C65207365727665722A3139373136392A2D2A'O
+//  // j1939_pdu := '03FE00262A6661726D20646973706C61792A3139373136392A2D2A'O
+//  // j1939_pdu := '03FE00F72A7461736B20636F6E74726F6C6C65722A3139373136392A2D2A'O
+//  // j1939_pdu := '03FE00FD2A6661726D20646973706C61792A3139373136392A2D2A'O
+//  // j1939_pdu := '01FD00F82D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O
+//  // j1939_pdu := '01FD00262D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O
+//  // j1939_pdu := '01FD00F72D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O
+//  // j1939_pdu := '01FD00262D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O
+//  // j1939_pdu := '01FD00FD2D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O
+//  // j1939_pdu := '02FE00FD016661726D20646973706C617920312E33372E31362E3733352A'O
+//  // j1939_pdu := '02FE0026026661726D20646973706C617920312E33372E31362E3733352A69736F627573206C69627261727920312E32362E332E3932382A'O
+//  // j1939_pdu := '02FE00F8096E696E67757065782066696C6520736572766572207573657220696E74657266616365204E5820322E322E342E3237302A746F6F6C206C69627261727920322E34322E382E3834302A6C6F67206C69627261727920322E302E31312E3136342A636F6E66696775726174696F6E206C69627261727920312E31322E322E3139332A43414E20627573206861726477617265206C69627261727920312E31392E352E3139382A7365637572697479206C69627261727920312E31312E302E3332312A69736F627573206C69627261727920312E32362E332E3932382A69736F62757320636F6D6D6F6E206C69627261727920322E31322E302E3139332A66696C652073657276657220312E342E352E3235382A'O
+//  // j1939_pdu := '9CFE0DF8FE01FFFFFFFFFFFFFF'O
+//
+//  log(j1939_pdu)
+//  log("--------------------------------------------")
+//  log(f_decode_CAN_frame_j1939(j1939_pdu))
+//  log("--------------------------------------------")
+//}
+
+testcase tc_dec_message1() runs on MTC_CT
+{
+
+  var J1939_PGN j1939_pgn
+  var octetstring j1939_pdu
+
+
+  j1939_pgn := '00e600'O
+  j1939_pdu := 'fefeffffffff00ff'O
+
+  log(j1939_pgn, j1939_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn & j1939_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message2() runs on MTC_CT
+{
+
+  var J1939_PGN j1939_pgn
+  var octetstring j1939_pdu
+
+
+  j1939_pgn := '00e700'O
+  j1939_pdu := 'ff0104ffffffffff'O
+
+  log(j1939_pgn, j1939_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn & j1939_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message3() runs on MTC_CT
+{
+
+  var J1939_PGN j1939_pgn
+  var octetstring j1939_pdu
+
+
+  j1939_pgn := '00e700'O
+  j1939_pdu := 'c7ffffffffffffff'O
+
+  log(j1939_pgn, j1939_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn & j1939_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message4() runs on MTC_CT
+{
+
+  var J1939_PGN j1939_pgn
+  var octetstring j1939_pdu
+
+
+  j1939_pgn := '00e600'O
+  j1939_pdu := 'c7ff02cde001e001'O
+
+  log(j1939_pgn, j1939_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn & j1939_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message5() runs on MTC_CT
+{
+
+  var J1939_PGN j1939_pgn
+  var octetstring j1939_pdu
+
+
+  j1939_pgn := '00e700'O
+  j1939_pdu := 'c2ffffffffffffff'O
+
+  log(j1939_pgn, j1939_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn & j1939_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message6() runs on MTC_CT
+{
+
+  var J1939_PGN j1939_pgn
+  var octetstring j1939_pdu
+
+
+  j1939_pgn := '00e600'O
+  j1939_pdu := 'c200ffff7d48400c'O
+
+  log(j1939_pgn, j1939_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn & j1939_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message7() runs on MTC_CT
+{
+
+  var J1939_PGN j1939_pgn
+  var octetstring j1939_pdu
+
+
+  j1939_pgn := '00e700'O
+  j1939_pdu := 'C3FFFFFFFFFFFFFF'O
+
+  log(j1939_pgn, j1939_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn & j1939_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message8() runs on MTC_CT
+{
+
+  var J1939_PGN j1939_pgn
+  var octetstring j1939_pdu
+
+
+  j1939_pgn := '00e600'O
+  j1939_pdu := 'C3FFFFFFFF7F7FFF'O
+
+  log(j1939_pgn, j1939_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn & j1939_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message9() runs on MTC_CT
+{
+
+  var J1939_PGN j1939_pgn
+  var octetstring j1939_pdu
+
+
+  j1939_pgn := '00e700'O
+  j1939_pdu := 'C0FF00000000FFFF'O
+
+  log(j1939_pgn, j1939_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn & j1939_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message10() runs on MTC_CT
+{
+
+  var J1939_PGN j1939_pgn
+  var octetstring j1939_pdu
+
+
+  j1939_pgn := '00e600'O
+  j1939_pdu := 'C00400FFFFFFFFFF'O
+
+  log(j1939_pgn, j1939_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn & j1939_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message11() runs on MTC_CT
+{
+
+  var J1939_PGN j1939_pgn
+  var octetstring j1939_pdu
+
+
+  j1939_pgn := '00e700'O
+  j1939_pdu := 'DFFFFFFFFFFFFFFF'O
+
+  log(j1939_pgn, j1939_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn & j1939_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message12() runs on MTC_CT
+{
+
+  var J1939_PGN j1939_pgn
+  var octetstring j1939_pdu
+
+
+  j1939_pgn := '00e600'O
+  j1939_pdu := 'E00130303034333030'O
+
+  log(j1939_pgn, j1939_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn & j1939_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message13() runs on MTC_CT
+{
+
+  var J1939_PGN j1939_pgn
+  var octetstring j1939_pdu
+
+
+  j1939_pgn := '00e700'O
+  j1939_pdu := 'D130303034333030'O
+
+  log(j1939_pgn, j1939_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn & j1939_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message14() runs on MTC_CT
+{
+
+  var J1939_PGN j1939_pgn
+  var octetstring j1939_pdu
+
+
+  j1939_pgn := '00e600'O
+  j1939_pdu := 'D1FFFFFFFF00FFFF'O
+
+  log(j1939_pgn, j1939_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn & j1939_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message15() runs on MTC_CT
+{
+
+  var octetstring j1939_pgn_and_pdu
+
+
+  j1939_pgn_and_pdu := '00E600E00130303032303036'O
+
+  log(j1939_pgn_and_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn_and_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message16() runs on MTC_CT
+{
+
+  var octetstring j1939_pgn_and_pdu
+
+
+  j1939_pgn_and_pdu := '00E700D130303032303036'O
+
+  log(j1939_pgn_and_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn_and_pdu))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_message17() runs on MTC_CT
+{
+
+  var octetstring j1939_pgn_and_pdu
+
+
+  j1939_pgn_and_pdu := '00E60009D00701FFFF01FF'O
+  j1939_pgn_and_pdu := '00E70009D00701FFFF01FF'O
+  j1939_pgn_and_pdu := '00E600FEF8D007FFFF00FF'O
+  j1939_pgn_and_pdu := '00E600B3FFFFDA5900FFFF'O
+  j1939_pgn_and_pdu := '00E700A82BD3FFBC0B0000'O
+  j1939_pgn_and_pdu := '00E600A82BD300BC0B0000'O
+  j1939_pgn_and_pdu := '00E700A82CD3FFBB0B0000'O
+  j1939_pgn_and_pdu := '00E600A82CD300BB0B0000'O
+  j1939_pgn_and_pdu := '00E700A82DD3FFBB0B0000'O
+  j1939_pgn_and_pdu := '00E600A82DD300BB0B0000'O
+  j1939_pgn_and_pdu := '00E600D1FFFFFFFF00FFFF'O
+  j1939_pgn_and_pdu := '00E700B3DA590B0066696C6520736572766572'O
+  j1939_pgn_and_pdu := '00E60009D00701FFFF00FF'O
+  j1939_pgn_and_pdu := '00E70009D00701FFFF00FF'O
+  j1939_pgn_and_pdu := '00E700B302D72B00746F756368206F72207072657373206B657920746F206D6F766520686572652066726F6D20565420233100'O
+  j1939_pgn_and_pdu := '00E600B3FFFF02D700FFFF'O
+  j1939_pgn_and_pdu := '00E700B3B42D08006E696E6775706578'O
+  j1939_pgn_and_pdu := '00E600B3FFFFB42D00FFFF'O
+  j1939_pgn_and_pdu := '00E700A875D6FFC4DA0000'O
+  j1939_pgn_and_pdu := '00E600A875D600C4DA0000'O
+  //..
+  j1939_pgn_and_pdu := '00E700AD0000ED03FFFFFF'O
+  j1939_pgn_and_pdu := '00E600ADED0300FFFFFFFF'O
+
+  log(j1939_pgn_and_pdu)
+  log("--------------------------------------------")
+  log(f_decode_J1939_message(j1939_pgn_and_pdu))
+  log("--------------------------------------------")
+}
+
+
+
+
+function f_reverse_j1939_name_withoutencoding(in J1939_NAME p_j1939_name) 
+//runs on PTC_isobus_CT 
+return J1939_NAME{
+  var J1939_NAME v_j1939_name_reverse := 
+
+  p_j1939_name[7]& p_j1939_name[6]& p_j1939_name[5]&
+  p_j1939_name[4]& p_j1939_name[3]& p_j1939_name[2]& 
+  p_j1939_name[1]& p_j1939_name[0];
+  return v_j1939_name_reverse
+}
+
+// f_reverse_j1939_name() has the same behaviour as f_reverse_j1939_name_withoutencoding()
+
+function f_reverse_j1939_name(in J1939_NAME p_j1939_name) 
+//runs on PTC_isobus_CT 
+return J1939_NAME{
+  var J1939_NAME v_j1939_name_reverse := f_encode_J1939_name(p_j1939_name)
+
+  return v_j1939_name_reverse
+}
+
+testcase tc_dec_name_1() runs on MTC_CT
+{
+
+  var J1939_NAME j1939_name_reverse, j1939_name
+
+  j1939_name_reverse := '3102032E003D0080'O
+
+  j1939_name := f_reverse_j1939_name(j1939_name_reverse)
+
+  log("j1939 name reverse:-------------------------")
+  log(j1939_name_reverse)
+  log("j1939 name----------------------------------")
+  log(j1939_name)
+  log("--------------------------------------------")
+  log(f_decode_J1939_name(j1939_name))
+  log("--------------------------------------------")
+  log(f_encode_J1939_name(f_decode_J1939_name(j1939_name)))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_name_2() runs on MTC_CT
+{
+
+  var J1939_NAME j1939_name_reverse, j1939_name
+
+  j1939_name_reverse := '3102032E008200A0'O
+
+  j1939_name := f_reverse_j1939_name(j1939_name_reverse)
+
+  log("j1939 name reverse:-------------------------")
+  log(j1939_name_reverse)
+  log("j1939 name----------------------------------")
+  log(j1939_name)
+  log("--------------------------------------------")
+  log(f_decode_J1939_name(j1939_name))
+  log("--------------------------------------------")
+  log(f_encode_J1939_name(f_decode_J1939_name(j1939_name)))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_name_3() runs on MTC_CT
+{
+
+  var J1939_NAME j1939_name_reverse, j1939_name
+
+  j1939_name_reverse := '3102032E001D0080'O
+
+  j1939_name := f_reverse_j1939_name(j1939_name_reverse)
+
+  log("j1939 name reverse:-------------------------")
+  log(j1939_name_reverse)
+  log("j1939 name----------------------------------")
+  log(j1939_name)
+  log("--------------------------------------------")
+  log(f_decode_J1939_name(j1939_name))
+  log("--------------------------------------------")
+  log(f_encode_J1939_name(f_decode_J1939_name(j1939_name)))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_name_4() runs on MTC_CT
+{
+
+  var J1939_NAME j1939_name_reverse, j1939_name
+
+  j1939_name_reverse := '3102032E008100A0'O
+
+  j1939_name := f_reverse_j1939_name(j1939_name_reverse)
+
+  log("j1939 name reverse:-------------------------")
+  log(j1939_name_reverse)
+  log("j1939 name----------------------------------")
+  log(j1939_name)
+  log("--------------------------------------------")
+  log(f_decode_J1939_name(j1939_name))
+  log("--------------------------------------------")
+  log(f_encode_J1939_name(f_decode_J1939_name(j1939_name)))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_name_5() runs on MTC_CT
+{
+
+  var J1939_NAME j1939_name_reverse, j1939_name
+
+  j1939_name_reverse := '3102032E00800AA1'O  
+
+  j1939_name := f_reverse_j1939_name(j1939_name_reverse)
+
+  log("j1939 name reverse:-------------------------")
+  log(j1939_name_reverse)
+  log("j1939 name----------------------------------")
+  log(j1939_name)
+  log("--------------------------------------------")
+  log(f_decode_J1939_name(j1939_name))
+  log("--------------------------------------------")
+  log(f_encode_J1939_name(f_decode_J1939_name(j1939_name)))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_name_6() runs on MTC_CT
+{
+
+  var J1939_NAME j1939_name_reverse, j1939_name
+
+  j1939_name_reverse := '3102032E193D0B93'O  
+
+  j1939_name := f_reverse_j1939_name(j1939_name_reverse)
+
+  log("j1939 name reverse:-------------------------")
+  log(j1939_name_reverse)
+  log("j1939 name----------------------------------")
+  log(j1939_name)
+  log("--------------------------------------------")
+  log(f_decode_J1939_name(j1939_name))
+  log("--------------------------------------------")
+  log(f_encode_J1939_name(f_decode_J1939_name(j1939_name)))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_name_record_1() runs on MTC_CT
+{
+
+  var J1939_NAME j1939_name_reverse, j1939_name
+
+  j1939_name_reverse := '3102032E003D0080'O
+
+  j1939_name := f_reverse_j1939_name(j1939_name_reverse)
+
+  log("j1939 name reverse:-------------------------")
+  log(j1939_name_reverse)
+  log("j1939 name----------------------------------")
+  log(j1939_name)
+  log("--------------------------------------------")
+  log(f_decode_J1939_name_record(j1939_name))
+  log("--------------------------------------------")
+  log(f_encode_J1939_name_record(f_decode_J1939_name_record(j1939_name)))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_name_record_2() runs on MTC_CT
+{
+
+  var J1939_NAME j1939_name_reverse, j1939_name
+
+  j1939_name_reverse := '3102032E008200A0'O
+
+  j1939_name := f_reverse_j1939_name(j1939_name_reverse)
+
+  log("j1939 name reverse:-------------------------")
+  log(j1939_name_reverse)
+  log("j1939 name----------------------------------")
+  log(j1939_name)
+  log("--------------------------------------------")
+  log(f_decode_J1939_name_record(j1939_name))
+  log("--------------------------------------------")
+  log(f_encode_J1939_name_record(f_decode_J1939_name_record(j1939_name)))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_name_record_3() runs on MTC_CT
+{
+
+  var J1939_NAME j1939_name_reverse, j1939_name
+
+  j1939_name_reverse := '3102032E001D0080'O
+
+  j1939_name := f_reverse_j1939_name(j1939_name_reverse)
+
+  log("j1939 name reverse:-------------------------")
+  log(j1939_name_reverse)
+  log("j1939 name----------------------------------")
+  log(j1939_name)
+  log("--------------------------------------------")
+  log(f_decode_J1939_name_record(j1939_name))
+  log("--------------------------------------------")
+  log(f_encode_J1939_name_record(f_decode_J1939_name_record(j1939_name)))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_name_record_4() runs on MTC_CT
+{
+
+  var J1939_NAME j1939_name_reverse, j1939_name
+
+  j1939_name_reverse := '3102032E008100A0'O
+
+  j1939_name := f_reverse_j1939_name(j1939_name_reverse)
+
+  log("j1939 name reverse:-------------------------")
+  log(j1939_name_reverse)
+  log("j1939 name----------------------------------")
+  log(j1939_name)
+  log("--------------------------------------------")
+  log(f_decode_J1939_name_record(j1939_name))
+  log("--------------------------------------------")
+  log(f_encode_J1939_name_record(f_decode_J1939_name_record(j1939_name)))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_name_record_5() runs on MTC_CT
+{
+
+  var J1939_NAME j1939_name_reverse, j1939_name
+
+  j1939_name_reverse := '3102032E00800AA1'O  
+
+  j1939_name := f_reverse_j1939_name(j1939_name_reverse)
+
+  log("j1939 name reverse:-------------------------")
+  log(j1939_name_reverse)
+  log("j1939 name----------------------------------")
+  log(j1939_name)
+  log("--------------------------------------------")
+  log(f_decode_J1939_name_record(j1939_name))
+  log("--------------------------------------------")
+  log(f_encode_J1939_name_record(f_decode_J1939_name_record(j1939_name)))
+  log("--------------------------------------------")
+}
+
+testcase tc_dec_name_record_encode_1() runs on MTC_CT
+{
+
+  var J1939_NAME_RECORD j1939_name_record := {
+    arbitraryAddresssBit := 1,
+    industryGroup := 2,
+    vehicleSystemInstance := 0,
+    vehicleSystem := 0,
+    reserved := 0,
+    function_ := 129,
+    functionInstance := 0,
+    ecuInstance := 0,
+    manufacturerCode := 368,
+    identityNumber := 999
+  }
+
+  log("j1939 name_record --------------------------")
+  log(j1939_name_record)
+  log("--------------------------------------------")
+  log(f_encode_J1939_name_record(j1939_name_record))
+  log("--------------------------------------------")
+  log(f_decode_J1939_name_record(f_encode_J1939_name_record(j1939_name_record)))
+  log("--------------------------------------------")
+}
+// result NAME = A00081002E0003E7
+
+testcase tc_dec_name_record_encode_2() runs on MTC_CT
+{
+
+  var J1939_NAME_RECORD j1939_name_record := {
+    arbitraryAddresssBit := 1,
+    industryGroup := 2,
+    vehicleSystemInstance := 0,
+    vehicleSystem := 0,
+    reserved := 0,
+    function_ := 128,
+    functionInstance := 0,
+    ecuInstance := 0,
+    manufacturerCode := 368,
+    identityNumber := 998
+  }
+
+  log("j1939 name_record --------------------------")
+  log(j1939_name_record)
+  log("--------------------------------------------")
+  log(f_encode_J1939_name_record(j1939_name_record))
+  log("--------------------------------------------")
+  log(f_decode_J1939_name_record(f_encode_J1939_name_record(j1939_name_record)))
+  log("--------------------------------------------")
+}
+
+// result NAME = A00080002E0003E6
+
+} with { encode "RAW" } 
+
diff --git a/demo/Isobustest.ttcn b/demo/Isobustest.ttcn
deleted file mode 100644
index 943a8ab..0000000
--- a/demo/Isobustest.ttcn
+++ /dev/null
@@ -1,837 +0,0 @@
-/* Copyright (c) 2000-2019 Ericsson Telecom AB AB
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-*
-* Contributors:
-* Michael Josenhans
-******************************************************************************/
-//
-//  File:               Isobustest.ttcn
-//  Description:        Encoder / Decoder for Isobus message frames
-//
-// Revision R1A
-
-module Isobustest {
-
-import from General_Types all
-import from CanError all
-import from SocketCANtest all
-import from SocketCAN_Types all
-import from SocketCAN_PortType all
-import from SocketCAN_Templates all
-import from Can all
-import from Isobus all
-import from IsobusMessageTypes all
-import from Isobus_Templates all
-import from J1939 all
-
- import from IsobusNMMessageTypes all
-
-type union CAN_ID {
-  OCT4 can_eff, // 29-bit can address
-  OCT2 can_sff, // 11-bit can address
-  RTR  can_rtr, 
-  BIT29 can_err  // up to 29 can error bits
-}
-
-type bitstring BIT29 length(29)
-type enumerated RTR { RTRNULL } 
-
-type union Can_IDs {
-  BIT29 can_eff,  // CAN extended format
-  BIT11 can_sff,  // CAN basic format
-  RTR   can_rtr,  // Remote Transmission Request (RTR), seldom used
-  BIT29 can_err   // CAN Error
-}
-with { variant "" }
-
-type record Can_IDwithType {
-  INT1     cantype,   // can_id >> 29 bit
-  Can_IDs  can_ids    // can_id and4b '1FFFFFFF'O
-}
-with {
-  variant (can_ids) "CROSSTAG( 
-  can_eff, cantype = 4; 
-  can_rtr, cantype = 2; 
-  can_err, cantype = 1; 
-  can_sff, cantype = 0)" 
-}
-
-//component declarations
-type component MTC_CT
-{ 
-}
-
-type component PTC_isobus_CT
-{
-  port SocketCAN_PT                   pt_socketCAN
-  port Isobus_PT                      pt_isobus
-  //variables
-  //timers
-  timer T0:= 0.2
-}
-
-const integer MAX_CONNECTIONS := 65535
-
-type record length (0..MAX_CONNECTIONS) of PTC2_CT OpenConnections
-type record length (0..MAX_CONNECTIONS) of boolean OpenConnectionsFlags
-
-type component PTC1_CT
-{
-  port Isobus_PT                      pt_isobus
-  //variables
-  var OpenConnections                 openConnections
-  var OpenConnectionsFlags            openConnectionsFlags
-  //timers
-  timer T1:= 0.2
-
-}
-type component PTC2_CT
-{
-  port Isobus_PT                      pt_isobus
-  //variables
-  var octetstring receivedUnacknowledgedData
-  var INT2        msgSizeInBytes
-  var INT2        receivedUnacknowledgedMsgSizeInBytes
-  var INT1        nextExpectedPacketNumber
-  var PGN         pgnOfMultiPacketMessage
-  var OCT1        ps, sa
-  var CAN_id      tp_dt_can_id
-  //timers
-  timer T2:= 0.2
-}
-
-type port Isobus_PT message {
-  out CAN_frame_j1939
-  in  CAN_frame_j1939
-} with { extension "internal" }
-
-type port SyncMasterPort message {
-  out PhaseStartReq
-  in  PhaseEndInd
-} with { extension "internal" }
-
-type port SyncSlavePort message {
-  in   PhaseStartReq
-  out  PhaseEndInd
-} with { extension "internal" }
-
-type record of PTC PTCSet 
-
-
-type component PTC {
-  port SyncSlavePort                  pt_sync
-  port SocketCAN_PT                   pt_socketCAN
-  var  e_Phase                        v_phase := c_firstPhase
-}
-
-
-function f_open_socket2(in SocketCAN_open_socket_type v_socket_type) 
-runs on PTC_isobus_CT 
-return SocketCAN_socket_result {
-
-  var SocketCAN_socket_result v_result  
-  timer t_guard
-  t_guard.start(c_guard)
-
-  var SocketCAN_socket socket
-
-  if(v_socket_type==OPEN_CAN_RAW) {
-    socket := {domain:=PF_CAN, ptype := SOCK_RAW, protocol:= CAN_RAW};
-  } else if (v_socket_type == OPEN_CAN_BCM) {
-    socket := {domain:=PF_CAN, ptype := SOCK_DGRAM, protocol:= CAN_BCM};  
-  }
-  pt_socketCAN.send(socket)  
-
-  // receive response
-  alt {
-    [] pt_socketCAN.receive(
-      a_SocketCAN_socket_result(a_result(SocketCAN_SUCCESS))) -> value v_result
-    {log("SocketCan:Socket opened: ", v_result.id)}
-    [] pt_socketCAN.receive(a_SocketCAN_socket_result(a_result(SocketCAN_ERROR)))
-    {log("Received Opening Socket failed"); setverdict(fail)}
-    [] t_guard.timeout {
-      log("timeout!")
-      setverdict(fail)}
-    [] t_guard.timeout {
-      log("timeout!")
-      setverdict(fail)}
-  }
-  t_guard.stop
-  return v_result
-}
-
-function f_open_raw2()
-runs on PTC_isobus_CT 
-return SocketCAN_open_raw_result {
-  var SocketCAN_socketid v_socket_id
-  v_socket_id := f_open_socket2(OPEN_CAN_RAW).id
-  var SocketCAN_ifr v_ifr
-  v_ifr := f_ioctl_get_if_index2(v_socket_id).ifr
-  var SocketCAN_bind_result v_bind_result
-  v_bind_result := f_bind2(v_socket_id, v_ifr.if_index)
-
-  var SocketCAN_open_raw_result v_result
-  v_result := {ifr := v_ifr, socket_id := v_socket_id}
-
-  return v_result
-}
-
-function f_ioctl_get_if_index2(in SocketCAN_socketid p_socket_id) 
-runs on PTC_isobus_CT 
-return SocketCAN_ioctl_result {
-  var SocketCAN_ioctl_result v_result   
-  timer t_guard
-  t_guard.start(c_guard)
-
-  pt_socketCAN.send(SocketCAN_ioctl:{id:= p_socket_id, ifu := omit});
-  // receive response
-  alt {
-    [] pt_socketCAN.receive(a_SocketCAN_ioctl_result(a_result(SocketCAN_SUCCESS))) -> value v_result
-    {log("Retrieved interface index", v_result.ifr.if_index)}
-    [] pt_socketCAN.receive(a_SocketCAN_ioctl_result(a_result(SocketCAN_ERROR)))
-    {log("Retrieving interface index failed", p_socket_id); setverdict(fail)}       
-    [] t_guard.timeout {
-      log("timeout!")
-      setverdict(fail)
-    }
-  } 
-  return v_result
-}
-
-function f_bind2(in SocketCAN_socketid p_socket_id,
-  in SocketCAN_if_index p_if_index) 
-runs on PTC_isobus_CT 
-return SocketCAN_bind_result {
-  var SocketCAN_bind_result v_result
-  timer t_guard
-  t_guard.start(c_guard)
-
-  pt_socketCAN.send(SocketCAN_bind:{id:= p_socket_id, bindu := {raw := {if_index:= p_if_index}}});
-  alt {
-    [] pt_socketCAN.receive(a_SocketCAN_bind_result(a_result(SocketCAN_SUCCESS))) -> value v_result
-    {log("Binding socket", p_socket_id)}
-    [] pt_socketCAN.receive(a_SocketCAN_bind_result(a_result(SocketCAN_ERROR))) {}
-    [] t_guard.timeout {
-      log("timeout!")
-      setverdict(fail)
-    }
-  }  
-  return v_result
-}
-
-function f_close_socket2 (in SocketCAN_socketid p_socket_id) 
-runs on PTC_isobus_CT {
-  pt_socketCAN.send(SocketCAN_close:{id:= p_socket_id});
-}
-
-function f_behaviour_isobus(in PTC1_CT v_ptc1)  runs on PTC_isobus_CT
-{
-
-  map(self:pt_socketCAN, system:pt_socketCAN)
-  connect(v_ptc1:pt_isobus, self:pt_isobus)
-
-  var SocketCAN_socketid v_socket_id
-  var SocketCAN_ifr v_ifr
-  var SocketCAN_send_data_ifu v_ifu
-
-  var SocketCAN_open_raw_result res
-  res := f_open_raw2();
-  v_socket_id := res.socket_id
-  v_ifr := res.ifr
-  v_ifu.if_name :=  v_ifr.if_name 
-
-  log("socket open(): ", res)
-
-  var boolean condition3 := true
-  //periodic reception
-
-  while (condition3)
-  {
-    //var SocketCAN_socket_result v_result_socketcan
-    var SocketCAN_receive_CAN_or_CAN_FD_frame v_result_socketcan
-    //T0.start;
-
-    alt 
-    {
-      [] pt_socketCAN.receive(a_SocketCAN_receive_CAN_frame(v_socket_id, t_CAN_EFF_FLAG, ?)) -> value v_result_socketcan
-      {
-        //log("SocketCan:Expected frame received", v_result_socketcan)
-        // it is assumed that no can fd frames are received here
-        if(ischosen(v_result_socketcan.frame.can_frame)){
-          var CAN_frame_j1939  v_CAN_frame_j1939 := can2j1939frame(v_result_socketcan.frame.can_frame)
-          pt_isobus.send(v_CAN_frame_j1939) to v_ptc1
-        } else {
-          setverdict(inconc, "reception of canfd frame not expected") 
-        }
-      }
-    }//endalt
-  }
-  f_close_socket2(v_socket_id)
-  disconnect(self:pt_isobus, v_ptc1:pt_isobus)
-  unmap(self:pt_socketCAN, system:pt_socketCAN)
-  setverdict(pass)
-}//endfunction
-
-
-function  f_behaviour1_sync()  runs on PTC1_CT
-{
-
-  var boolean condition1 := true
-  var CAN_frame_j1939 v_can_frame_j1939
-  //periodic reception
-
-  while (condition1)
-  {
-    //T1.start;
-
-    alt 
-    {
-
-      /*  []syncport.receive("halt") {
-      condition1:=false  } */
-
-      []pt_isobus.receive(CAN_frame_j1939:?) -> value v_can_frame_j1939 { 
-        //T1.stop; 
-        //log incoming message 
-        //log ("received: ",  v_can_frame_j1939);
-      } 
-
-      //[]T1.timeout; 
-
-    }//endalt
-  }
-}//endfunction  var boolean condition1
-
-function f_get_component (in OCT1 connectioninitiator, in OCT1 connectionresponder) runs on PTC1_CT return PTC2_CT {
-
-  var PTC2_CT v_PTC2
-
-  var integer index
-  index:= oct2int(connectioninitiator) + 256 * oct2int(connectionresponder)
-
-  if (openConnectionsFlags[index] == false){
-
-    v_PTC2 := PTC2_CT.create
-    v_PTC2.start(f_behaviour_connections()); 
-    openConnectionsFlags[index] := true
-    openConnections[index] := v_PTC2
-    connect(v_PTC2:pt_isobus, self:pt_isobus)
-  } else {
-    v_PTC2 := openConnections[index]
-  }
-  return v_PTC2
-}
-
-
-
-function  f_behaviour2_sync() runs on PTC1_CT
-{
-
-  var boolean condition1 := true
-  var CAN_frame_j1939 v_can_frame_j1939
-
-  // initialization
-
-  var integer i
-  for(i:=1;i<=MAX_CONNECTIONS; i:= i+1){
-    openConnectionsFlags[i] := false
-  }
-
-  //periodic reception
-
-
-
-
-  while (condition1)
-  {
-    //T1.start;
-
-    alt 
-    {
-
-      /*  []syncport.receive("halt") {
-      condition1:=false  } */
-      []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { requestToSend := ?}}}) -> value v_can_frame_j1939 { 
-        //T1.stop; 
-        //log incoming message 
-        //log ("received requestToSend: ",  v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps);
-
-        var PTC2_CT v_PTC2
-        v_PTC2 := f_get_component(v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps)
-        pt_isobus.send(v_can_frame_j1939) to v_PTC2
-      } 
-      []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { clearToSend := ?}}}) -> value v_can_frame_j1939 { 
-        //T1.stop; 
-        //log incoming message 
-        //log ("received requestToSend: ",  v_can_frame_j1939, v_can_frame_j1939.can_j1939.ps, v_can_frame_j1939.can_j1939.sa);
-
-        var PTC2_CT v_PTC2
-        v_PTC2 := f_get_component(v_can_frame_j1939.can_j1939.ps, v_can_frame_j1939.can_j1939.sa)
-        pt_isobus.send(v_can_frame_j1939) to v_PTC2
-      } 
-      []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { endOfMessageAcknowledgement := ?}}}) -> value v_can_frame_j1939 { 
-        //T1.stop; 
-        //log incoming message 
-        //log ("received requestToSend: ",  v_can_frame_j1939, v_can_frame_j1939.can_j1939.ps, v_can_frame_j1939.can_j1939.sa);
-
-        var PTC2_CT v_PTC2
-        v_PTC2 := f_get_component(v_can_frame_j1939.can_j1939.ps, v_can_frame_j1939.can_j1939.sa)
-        pt_isobus.send(v_can_frame_j1939) to v_PTC2
-      } 
-      []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { connectionAbort := ?}}}) -> value v_can_frame_j1939 { 
-        //T1.stop; 
-        //log incoming message 
-        //log ("received requestToSend: ",  v_can_frame_j1939, v_can_frame_j1939.can_j1939.ps, v_can_frame_j1939.can_j1939.sa);
-
-        var PTC2_CT v_PTC2
-        v_PTC2 := f_get_component(v_can_frame_j1939.can_j1939.ps, v_can_frame_j1939.can_j1939.sa)
-        pt_isobus.send(v_can_frame_j1939) to v_PTC2
-      } 
-      []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { broadcastAnnounce := ?}}}) -> value v_can_frame_j1939 { 
-        //T1.stop; 
-        //log incoming message 
-        //log ("received requestToSend: ",  v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps);
-
-        var PTC2_CT v_PTC2
-        v_PTC2 := f_get_component(v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps)
-        pt_isobus.send(v_can_frame_j1939) to v_PTC2
-      } 
-      []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_dt := ?}}) -> value v_can_frame_j1939 { 
-        //T1.stop; 
-        //log incoming message 
-        //log ("received tp_ct: ",  v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps);
-
-        var PTC2_CT v_PTC2
-        v_PTC2 := f_get_component(v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps)
-        pt_isobus.send(v_can_frame_j1939) to v_PTC2
-      } 
-      []pt_isobus.receive(CAN_frame_j1939:?) -> value v_can_frame_j1939 { 
-        //T1.stop; 
-        //log incoming message 
-        //log ("received: ",  v_can_frame_j1939);
-      } 
-
-      //[]T1.timeout; 
-
-    }//endalt
-  }
-}//endfunction  var boolean condition1
-function  f_behaviour_connections() runs on PTC2_CT
-{
-
-  var boolean condition1 := true
-  var CAN_frame_j1939 v_can_frame_j1939
-
-  // initialization
-
-  //periodic reception
-
-
-
-
-  while (condition1)
-  {
-    //T1.start;
-
-    alt 
-    {
-
-      /*  []syncport.receive("halt") {
-      condition1:=false  } */
-      []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { requestToSend := ?}}}) -> value v_can_frame_j1939 { 
-        //T1.stop; 
-        msgSizeInBytes := v_can_frame_j1939.can_pdu.tp_cm.requestToSend.msgSizeInBytes
-        receivedUnacknowledgedData := ''O
-        receivedUnacknowledgedMsgSizeInBytes := 0
-        pgnOfMultiPacketMessage := v_can_frame_j1939.can_pdu.tp_cm.requestToSend.pgnOfMultiPacketMessage
-        ps := v_can_frame_j1939.can_j1939.ps
-        sa := v_can_frame_j1939.can_j1939.sa
-        //log incoming message 
-        log ("received requestToSend: ",  v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps);
-        alt // connection open requested
-        {
-          []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { clearToSend := {ctrl := '11'O, 
-                    totalNumberOfPackets := ?,
-                    nextPacketNumber :=1, 
-                    reserved4 := ?,
-                    reserved5 := ?, 
-                    pgnOfMultiPacketMessage := ?}}}}) -> value v_can_frame_j1939 { 
-            //T1.stop; 
-            nextExpectedPacketNumber := v_can_frame_j1939.can_pdu.tp_cm.clearToSend.nextPacketNumber
-            //log incoming message 
-            log ("received clearToSend: ",  v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps);
-            alt // connection open - receivig data
-            {
-              []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_dt := ?}}) -> value v_can_frame_j1939 { 
-                //T1.stop; 
-                if ((msgSizeInBytes - receivedUnacknowledgedMsgSizeInBytes) > 7) {
-                  tp_dt_can_id := j1939id2canid(v_can_frame_j1939.can_j1939) // actuallay it is only necessary to store it once
-                  receivedUnacknowledgedData := receivedUnacknowledgedData & v_can_frame_j1939.can_pdu.tp_dt.data
-                  receivedUnacknowledgedMsgSizeInBytes := receivedUnacknowledgedMsgSizeInBytes + 7
-                  nextExpectedPacketNumber := nextExpectedPacketNumber + 1 }
-                else {
-                  log("v_can_frame_j1939.can_j1939: ", v_can_frame_j1939.can_j1939)
-                  tp_dt_can_id := j1939id2canid(v_can_frame_j1939.can_j1939) // actuallay it is only necessary to store it once
-                  receivedUnacknowledgedData := receivedUnacknowledgedData & substr(v_can_frame_j1939.can_pdu.tp_dt.data
-                    ,0 , (msgSizeInBytes - receivedUnacknowledgedMsgSizeInBytes))
-                  nextExpectedPacketNumber := 0 
-                  receivedUnacknowledgedMsgSizeInBytes := msgSizeInBytes
-                }
-                //log incoming message 
-                log ("received tp_dt: ",  v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps);
-                repeat
-              }
-              []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { clearToSend := ?}}}) -> value v_can_frame_j1939 { 
-                //T1.stop; 
-                //log incoming message 
-                log ("received clearToSend: ",  v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps);
-                repeat
-              }
-              []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { endOfMessageAcknowledgement := ?}}}) -> value v_can_frame_j1939 { 
-                //T1.stop; 
-                //log incoming message 
-                log ("received endOfMessageAcknowledgement: ",  v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps);
-                if (receivedUnacknowledgedMsgSizeInBytes == msgSizeInBytes) {
-                  var octetstring receivedData
-                  //var PGN pgn := v_can_frame_j1939.can_pdu.tp_cm.endOfMessageAcknowledgement.pgnOfMultiPacketMessage
-                  if (oct2int((int2oct(pgnOfMultiPacketMessage, 3) and4b '00FF00'O)>> 1 ) < 240) {
-                    log ("pgnOfMultiPacketMessage: ", pgnOfMultiPacketMessage, ", ", int2oct(pgnOfMultiPacketMessage, 3))
-                    log ("ps: ", ps)
-                    log ("sa: ", sa)
-                    receivedData := int2oct(oct2int((int2oct(pgnOfMultiPacketMessage, 3) and4b '03FFFF'O)>> 1 ), 2) & ps & sa & receivedUnacknowledgedData
-                  }
-                  else
-                  {
-                    log ("pgnOfMultiPacketMessage: ", pgnOfMultiPacketMessage, ", ", int2oct(pgnOfMultiPacketMessage, 3))
-                    log ("sa: ", sa)
-                    receivedData := (int2oct(pgnOfMultiPacketMessage, 3) and4b '03FFFF'O) & sa & receivedUnacknowledgedData
-                  }
-                  //var octetstring receivedData := (tp_dt_can_id and4b  '0003FFFF'O) & receivedUnacknowledgedData
-                  log("tp_dt_can_id: ", tp_dt_can_id)
-                  //var octetstring receivedData := tp_dt_can_id & receivedUnacknowledgedData
-                  //var octetstring receivedData := receivedUnacknowledgedData
-                  //log ("received tp_dt frame with PGN: ",  receivedData);
-                  // changed by MJ
-                  
-                  //receivedData := receivedUnacknowledgedData
-                  log ("received multipart frame",  receivedData);
-                  v_can_frame_j1939:=f_decode_CAN_frame_j1939(receivedData)
-                  log ("received tp_dt frame j1939: ",  v_can_frame_j1939);
-                }
-                else {
-                  log ("received incomplete message frame: ",  receivedUnacknowledgedData);
-                }
-              }
-            }
-          }
-          []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { connectionAbort := ?}}}) -> value v_can_frame_j1939 { 
-            //T1.stop; 
-            //log incoming message 
-            log ("received connectionAbort: ",  v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps);
-          }
-        }
-
-
-      } 
-      []pt_isobus.receive(CAN_frame_j1939:?) -> value v_can_frame_j1939 { 
-        //T1.stop; 
-        //log incoming message 
-        //log ("received: ",  v_can_frame_j1939);
-      } 
-
-      //[]T1.timeout; 
-
-    }//endalt
-  }
-}//endfunction  var boolean condition1
-
-
-testcase tc_encdec() runs on MTC_CT
-
-{
-
-  template CAN_frame_j1939 t_CAN_frame_j1939 :=  { can_j1939 := { prio := 6, res := '0'B, dp := '1'B, pf := 'E9'O, ps := 'FD'O, sa := 'E6'O },     
-  can_pdu := { addressClaimed := { name := { selfConfigurableAddressValue := '0'B, industryGroupValue := '011'B, deviceClassInstanceValue := '0001'B, deviceClassValue := '0000001'B, reserveValued := '0'B, functionValue := '00000011'B, functionInstanceValue := '00101'B, ecuInstancceValue := '110'B, manufacturerCodeValue := '10000000000'B, identityNumberBits := '101000010000101000000'B } }}}
-  log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))
-  log("--------------------------------------------")
-  log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))))
-  log("--------------------------------------------")
-
-  template CAN_frame_j1939 t_CAN_frame_j1939_2 :=  { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := 'FD'O, sa := 'C0'O }, can_pdu := { requestForAddressClaimed := {pgn := 123}} }
-  log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_2)))
-  log("--------------------------------------------")
-  log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_2))))
-  log("--------------------------------------------")
-
-  template CAN_frame_j1939 t_CAN_frame_j1939_3 :=  { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := 'FD'O, sa := 'C0'O }, can_pdu := { cannotClaimSourceAddress := { name := { selfConfigurableAddressValue := '0'B, industryGroupValue := '011'B, deviceClassInstanceValue := '0001'B, deviceClassValue := '0000001'B, reserveValued := '0'B, functionValue := '00000011'B, functionInstanceValue := '00101'B, ecuInstancceValue := '110'B, manufacturerCodeValue := '10000000000'B, identityNumberBits := '101000010000101000000'B } }}}
-  log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_3)))
-  log("--------------------------------------------")
-  log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_3))))
-  log("--------------------------------------------")
-
-  template CAN_frame_j1939 t_CAN_frame_j1939_6 :=  { can_j1939 := { prio := 6, res := '0'B, dp := '1'B, pf := 'E6'O , ps := 'FD'O, sa := '00'O }, can_pdu := { commandedAddress := {
-        name := { selfConfigurableAddressValue := '0'B, industryGroupValue := '011'B, deviceClassInstanceValue := '0001'B, deviceClassValue := '0000001'B, reserveValued := '0'B, functionValue := '00000011'B, functionInstanceValue := '00101'B, ecuInstancceValue := '110'B, manufacturerCodeValue := '10000000000'B, identityNumberBits := '101000010000101000000'B },
-        newSourceAddress:='AA'O
-      } } }
-  log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_6)))
-  log("--------------------------------------------")
-  log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_6))))
-  log("--------------------------------------------")
-}
-
-testcase tc_encdec_vt2ecu_vtStatusReq() runs on MTC_CT
-{
-  template CAN_frame_j1939 t_CAN_frame_j1939 :=  { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := '00'O, sa := '00'O }, can_pdu := 
-    {vt2ecu := {vtStatusReq :=
-        { vtfunction := 254, 
-          sourceAddressOfActiveWorkingSetMaster := '11'O,
-          objectIDOfTheVisibleDataAlarmMaskOfTheActiveWorkingSet := '2233'O,
-          objectIDOfTheVisibleSoftKeyMaskOfTheActiveWorkingSet := '4455'O,
-          vtBusyCodes := vtIsBusyExecutingACommand,
-          vtFunctionCode := '66'O}}}}
-  log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))
-  log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))))
-}
-
-testcase tc_encdec_ecu2vt_getMemoryReq() runs on MTC_CT
-{
-  template CAN_frame_j1939 t_CAN_frame_j1939 :=  { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := '00'O, sa := '00'O }, can_pdu := 
-    {ecu2vt := {getMemoryReq :=
-        { vtfunction := 194, 
-          reserved2 := 'FF'O,
-          memoryRequired := 1234567,
-          reserved7 := 'FF'O,
-          reserved8 := 'FF'O}}}}
-  log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))
-  log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))))
-}
-
-testcase tc_encdec_ecu2vt_getMemoryReq_with_templateI() runs on MTC_CT // using a template
-{
-  template CAN_frame_j1939 t_CAN_frame_j1939 :=  { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := '00'O, sa := '00'O }, can_pdu := 
-    {ecu2vt := {getMemoryReq := t_GetMemoryReq(1234567)}}}
-  log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))
-  log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))))
-}
-
-testcase tc_encdec_ecu2vt_getMemoryReq_with_template_II() runs on MTC_CT // using a template
-{
-  template CAN_frame_j1939 t_CAN_frame_j1939 :=  { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := '00'O, sa := '00'O }, can_pdu := 
-    t_GetMemoryReq_pdu(1234567)}
-  log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))
-  log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))))
-}
-
-testcase tc_encdec_networkMessage_N_SP_Response_pdu_with_template() runs on MTC_CT // using a template
-{
-  template CAN_frame_j1939 t_CAN_frame_j1939 :=  t_message ( 1, '1'B, '0'B, '0A'O, '0B'O, '0C'O , 
-  t_N_SP_Response_pdu(port_3, port_4, {'01'O,'02'O,'03'O,'04'O,'05'O,'06'O,'07'O}))
-  log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))
-  log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))))
-}
-
-testcase tc_encdec_networkMessage_N_SP_Response_with_template() runs on MTC_CT // using a template
-{
-  template CAN_frame_j1939 t_CAN_frame_j1939 :=  t_network_message ( 1, '1'B, '0'B, '0A'O, '0B'O, '0C'O , 
-  {n_SP_Response := t_N_SP_Response(port_3, port_4, {'01'O,'02'O,'03'O,'04'O,'05'O,'06'O,'07'O})})
-  log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))
-  log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))))
-}
-
-testcase tc_encdec_N_SP_Response_with_template() runs on MTC_CT // using a template
-{
-  template CAN_frame_j1939 t_CAN_frame_j1939 :=  t_message ( 1, '1'B, '0'B, '0A'O, '0B'O, '0C'O , 
-  {networkMessage := {n_SP_Response := t_N_SP_Response(port_3, port_4, {'01'O,'02'O,'03'O,'04'O,'05'O,'06'O,'07'O})}})
-  log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))
-  log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))))
-}
-
-testcase tc_encdec_ecu2vt_workingSetMaintenanceReq() runs on MTC_CT // using a template
-{
-  template CAN_frame_j1939 t_CAN_frame_j1939 :=  { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := '00'O, sa := '00'O }, can_pdu := 
-    t_WorkingSetMaintenanceReq_pdu({
-        initiatingWorkingSetMaintenance := true,
-        reserved1 := false,
-        reserved2 := false,
-        reserved3 := false,
-        reserved4 := false,
-        reserved5 := false,
-        reserved6 := false,
-        reserved7 := false}, compliantWithVTVersion4)}
-  log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))
-  log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))))
-}
-
-
-testcase tc_encdec_etp_dt () runs on MTC_CT // using a template
-{
-  template CAN_frame_j1939 t_CAN_frame_j1939 :=  { can_j1939 := { prio := 0, res := '1'B, dp := '1'B, pf := 'FE'O, ps := '00'O, sa := 'F8'O }, 
-        can_pdu := { etp_dt := { seq_no := 105, data := '6C652073657276'O } } }
-  log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))
-  log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))))
-}
-
-
-testcase tc_dec_requestForAddressClaimed() runs on MTC_CT
-{
-
-  var octetstring j1939_pdu
-  j1939_pdu := '98EAFFFE00EE00'O
-
-  log(j1939_pdu)
-  log("--------------------------------------------")
-  log(f_decode_CAN_frame_j1939(j1939_pdu))
-  log("--------------------------------------------")
-}
-
-
-testcase tc_dec_largemessage() runs on MTC_CT
-{
-
-  var octetstring j1939_pdu
-//j1939_pdu := '18EAFFFE00EE00'O                
-//j1939_pdu := '18EEFFF83102032E003D0080'O
-//j1939_pdu := '18EEFFF73102032E008200A0'O
-//j1939_pdu := '18EAF8F8EBFE00'O  
-j1939_pdu := '18ECF8F810160004FFEBFE00'O
-
-// j1939_pdu := '00E726F8B3DA590B0066696C6520736572766572'O
-// j1939_pdu := '03FE00F8FE2A66696C65207365727665722A3139373136392A2D2A'O
-// j1939_pdu := '03FE00F82A66696C65207365727665722A3139373136392A2D2A'O
-// j1939_pdu := '03FE00262A6661726D20646973706C61792A3139373136392A2D2A'O
-// j1939_pdu := '03FE00F72A7461736B20636F6E74726F6C6C65722A3139373136392A2D2A'O
-// j1939_pdu := '03FE00FD2A6661726D20646973706C61792A3139373136392A2D2A'O
-// j1939_pdu := '01FD00F82D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O
-// j1939_pdu := '01FD00262D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O
-// j1939_pdu := '01FD00F72D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O
-// j1939_pdu := '01FD00262D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O
-// j1939_pdu := '01FD00FD2D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O
-// j1939_pdu := '02FE00FD016661726D20646973706C617920312E33372E31362E3733352A'O
-// j1939_pdu := '02FE0026026661726D20646973706C617920312E33372E31362E3733352A69736F627573206C69627261727920312E32362E332E3932382A'O
-// j1939_pdu := '02FE00F8096E696E67757065782066696C6520736572766572207573657220696E74657266616365204E5820322E322E342E3237302A746F6F6C206C69627261727920322E34322E382E3834302A6C6F67206C69627261727920322E302E31312E3136342A636F6E66696775726174696F6E206C69627261727920312E31322E322E3139332A43414E20627573206861726477617265206C69627261727920312E31392E352E3139382A7365637572697479206C69627261727920312E31312E302E3332312A69736F627573206C69627261727920312E32362E332E3932382A69736F62757320636F6D6D6F6E206C69627261727920322E31322E302E3139332A66696C652073657276657220312E342E352E3235382A'O
-// j1939_pdu := '9CFE0DF8FE01FFFFFFFFFFFFFF'O
-
-  log(j1939_pdu)
-  log("--------------------------------------------")
-  log(f_decode_CAN_frame_j1939(j1939_pdu))
-  log("--------------------------------------------")
-}
-
-
-import from IsobusVTMessageTypes all
-
-testcase tc_decode_VT2ECU() runs on MTC_CT
-{
-
-  var octetstring j1939_vt_pdu
-  j1939_vt_pdu := 'c7ff02cde001e001'O
-  j1939_vt_pdu := 'c200ffff7d48400c'O
-  j1939_vt_pdu := 'c3ffffffff7f7fff'O
-  j1939_vt_pdu := 'c00400ffffffffff'O
-  j1939_vt_pdu := 'e00130303034333030'O
-  j1939_vt_pdu := 'd1ffffffff00ffff'O
-  j1939_vt_pdu := '09d00701ffff01ff'O
-  j1939_vt_pdu := 'b3ffffda5900ffff'O
-  j1939_vt_pdu := 'a82bd300bc0b0000'O
-  j1939_vt_pdu := 'a82cd300bb0b0000'O
-  j1939_vt_pdu := 'a82dd300bb0b0000'O
-  j1939_vt_pdu := 'b3ffff02d700ffff'O
-  j1939_vt_pdu := 'a875d600c4da0000'O
-  j1939_vt_pdu := 'a876d600c2da0000'O
-  j1939_vt_pdu := 'a877d600ffff0000'O
-  j1939_vt_pdu := 'a878d600ffff0000'O
-  j1939_vt_pdu := 'a879d600ffff0000'O
-  j1939_vt_pdu := 'a87ad600ffff0000'O
-  j1939_vt_pdu := 'a87bd600ffff0000'O
-  j1939_vt_pdu := 'a87cd600ffff0000'O
-  j1939_vt_pdu := 'a87dd600ffff0000'O
-  j1939_vt_pdu := 'a87ed600ffff0000'O
-  //j1939_vt_pdu := 'ade90300ffffffff'O
-  //j1939_vt_pdu := '09d00700ffff00ff'O
-  
-  log(j1939_vt_pdu)
-  log("--------------------------------------------")
-  log(decode_VT2ECU(j1939_vt_pdu))
-  log("--------------------------------------------")
-}
-
-//test case declarations
-testcase tc_Example001()  runs on MTC_CT
-{
-
-  var PTC_isobus_CT v_PTC_isobus 
-  var PTC1_CT v_PTC1
-
-  //create components
-  v_PTC_isobus:=PTC_isobus_CT.create; 
-  v_PTC1:=PTC1_CT.create; 
-
-  //connnect ports
-  //map ports
-
-  //start components 
-
-  v_PTC1.start(f_behaviour1_sync());
-  v_PTC_isobus.start(f_behaviour_isobus(v_PTC1));
-
-  //wait for termination
-  all component.done
-
-
-  //unmap ports
-  //disconnect ports
-  //terminate all parallel test componenets
-  all component.kill
-
-}
-//when the test case terminates, MTC will terminate as well
-//PTCs terminate (reach the state done) when the function with which they were started terminates
-
-
-//test case declarations
-testcase tc_Example002()  runs on MTC_CT
-{
-
-  var PTC_isobus_CT v_PTC_isobus 
-  var PTC1_CT v_PTC1
-
-  //create components
-  v_PTC_isobus:=PTC_isobus_CT.create; 
-  v_PTC1:=PTC1_CT.create; 
-
-  //connnect ports
-  //map ports
-
-  //start components 
-
-  v_PTC1.start(f_behaviour2_sync());
-  v_PTC_isobus.start(f_behaviour_isobus(v_PTC1));
-
-  //wait for termination
-  all component.done
-
-
-  //unmap ports
-  //disconnect ports
-  //terminate all parallel test componenets
-  all component.kill
-
-}
-//when the test case terminates, MTC will terminate as well
-//PTCs terminate (reach the state done) when the function with which they were started terminates
-
-
-control 
-{
-
-
-  execute(tc_Example001())
-
-
-}//endcontrol
-
-} with { encode "RAW" } 
-
diff --git a/demo/J1939.cfg b/demo/J1939.cfg
index 4825fd6..290e64d 100644
--- a/demo/J1939.cfg
+++ b/demo/J1939.cfg
@@ -28,5 +28,7 @@
 
 [EXECUTE]
 //CAN J1939 tests
-SocketCAN_J1939_test.tc_can_j1939_send_and_receive_can_frame
-SocketCAN_J1939_test.tc_can_j1939_send_and_receive_can_frame_parallel
+SocketCAN_J1939_test.tc_can_j1939_send_and_receive_message
+SocketCAN_J1939_test.tc_can_j1939_send_and_receive_message_parallel
+J1939_Isobus_test.tc_can_j1939_IsobusVtEcuSimulation
+J1939_Isobus_test.tc_can_j1939_IsobusEcuSimulation
diff --git a/demo/J1939.ttcn b/demo/J1939.ttcn
deleted file mode 100644
index 404728b..0000000
--- a/demo/J1939.ttcn
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright (c) 2000-2019 Ericsson Telecom AB
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v2.0
-* which accompanies this distribution, and is available at
-* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
-*
-* Contributors:
-* Michael Josenhans
-******************************************************************************/
-
-module J1939 {
-import from General_Types all;
-
-type record CAN_identifier {
-BIT3 priority,
-BIT1 reseved, 
-BIT1 datapage, 
-OCT1 pduformat,
-OCT1 destinationAddress,
-OCT1 sourceAddress
-}
-
-type OCT3 PGN
-
-}
diff --git a/demo/J1939_Isobus_test.ttcn b/demo/J1939_Isobus_test.ttcn
new file mode 100644
index 0000000..d1c4073
--- /dev/null
+++ b/demo/J1939_Isobus_test.ttcn
@@ -0,0 +1,230 @@
+/* Copyright (c) 2000-2019 Ericsson Telecom AB
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v2.0
+* which accompanies this distribution, and is available at
+* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+*
+* Contributors:
+* Michael Josenhans
+******************************************************************************/
+//
+//  File:               SocketCAN_J1939_test.ttcn
+//  Description:        SocketCAN J1939 testcases for J1939 messages
+//
+
+
+
+module J1939_Isobus_test
+{
+import from J1939 all
+import from Isobus_test all
+
+testcase tc_can_j1939_IsobusVtEcuSimulation() runs on MTC {
+
+  // before running this test cases start the j1939 address claim deamons via commandline
+  /*
+  
+  j1939acd -r 100,80-120 -c /tmp/A00080002E0003E6.jacd A00080002E0003E6 vcan0
+  j1939acd -r 100,80-120 -c /tmp/A00081002E0003E7.jacd A00081002E0003E7 vcan0
+  */
+
+  var PTCAdapter v_ptc_J1939VTAdapter                                 := PTCAdapter.create("PTC1_ptc_j1939VTAdapter") alive
+  var PTCAdapter v_ptc_J1939ECUAdapter                                := PTCAdapter.create("PTC2_ptc_j1939ECUAdapter") alive
+  var PTC_Isobus_VT_CT  v_ptc_J1939VTApplication                      := PTC_Isobus_VT_CT.create("PTC1_ptc_j1939VTApplication") alive
+  var PTC_Isobus_VT_VTSTATUSCycleSend_CT v_ptc_J1939VT_VTStatusCycleSend      := PTC_Isobus_VT_VTSTATUSCycleSend_CT.create("PTC_Isobus_VT_VTSTATUSCycleSend") alive
+  var PTC_Isobus_ECU_CT v_ptc_J1939ECUApplication                     := PTC_Isobus_ECU_CT.create("PTC2_ptc_j1939ECUApplication") alive
+  var PTC_Isobus_ECU_VTSTATUSCycleReceive_CT v_ptc_J1939_VTStatusCycleReceive  := PTC_Isobus_ECU_VTSTATUSCycleReceive_CT.create("PTC_Isobus_VT_VTSTATUSCycleReceive") alive
+  var PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend := PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT.  create( "PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend" ) alive;
+
+
+  f_addSyncSlaveSet({ptc_Adapter:=v_ptc_J1939VTAdapter}, v_PTCSet);
+  f_addSyncSlaveSet({ptc_Adapter:=v_ptc_J1939ECUAdapter}, v_PTCSet);
+  f_addSyncSlaveSet({ptc_Isobus_VT_CT:=v_ptc_J1939VTApplication}, v_PTCSet);
+  f_addSyncSlaveSet({ptc_Isobus_VT_VTSTATUSCycleSend_CT:=v_ptc_J1939VT_VTStatusCycleSend}, v_PTCSet);
+  f_addSyncSlaveSet({ptc_Isobus_ECU_CT:=v_ptc_J1939ECUApplication}, v_PTCSet);
+  f_addSyncSlaveSet({ptc_Isobus_ECU_VTSTATUSCycleReceive_CT:=v_ptc_J1939_VTStatusCycleReceive}, v_PTCSet);
+  f_addSyncSlaveSet({ptc_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT:=v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend}, v_PTCSet);
+
+  connect(mtc:pt_sync, v_ptc_J1939VTAdapter:pt_sync)
+  connect(mtc:pt_sync, v_ptc_J1939ECUAdapter:pt_sync)
+  connect(mtc:pt_sync, v_ptc_J1939VTApplication:pt_sync)
+  connect(mtc:pt_sync, v_ptc_J1939VT_VTStatusCycleSend:pt_sync)
+  connect(mtc:pt_sync, v_ptc_J1939ECUApplication:pt_sync)
+  connect(mtc:pt_sync, v_ptc_J1939_VTStatusCycleReceive:pt_sync)
+  connect(mtc:pt_sync, v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend:pt_sync)
+
+
+  connect(v_ptc_J1939VTAdapter:pt_j1939PDU,                                            v_ptc_J1939VTApplication:pt_j1939PDU)
+  connect(v_ptc_J1939VT_VTStatusCycleSend:pt_VTStatusTick,                             v_ptc_J1939VTApplication:pt_VTStatusTick)
+  connect(v_ptc_J1939ECUAdapter:pt_j1939PDU,                                           v_ptc_J1939ECUApplication:pt_j1939PDU)
+  connect(v_ptc_J1939ECUApplication:pt_VTStatusTick,                                   v_ptc_J1939_VTStatusCycleReceive:pt_VTStatusTick)
+  connect(v_ptc_J1939_VTStatusCycleReceive:pt_WorkingSetMaintenaceOnOff,               v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend:pt_WorkingSetMaintenaceOnOff)
+  connect(v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend:pt_WorkingSetMaintenance,  v_ptc_J1939ECUApplication:pt_WorkingSetMaintenance)
+
+
+
+  const integer     c_send_prio        := 2
+  const J1939_NAME  c_name_VT          := 'A00080002E0003E6'O
+  const J1939_NAME  c_name_ECU         := 'A00081002E0003E7'O  
+
+  v_ptc_J1939VTAdapter.start(f_ptc_J1939Adapter(
+      e_testbody1, 
+      c_send_prio,
+      c_name_VT)) /* name source */
+
+  v_ptc_J1939ECUAdapter.start(f_ptc_J1939Adapter(
+      e_testbody1, 
+      c_send_prio,
+      c_name_ECU ))/* name source */
+
+  v_ptc_J1939VTApplication.start(f_ptc_J1939VTApplication(e_testbody1));
+  v_ptc_J1939ECUApplication.start(f_ptc_J1939ECUApplication(e_testbody1));
+
+  v_ptc_J1939VT_VTStatusCycleSend.start(f_ptc_J1939VTStatusCycleSend(e_testbody1));
+
+  v_ptc_J1939_VTStatusCycleReceive.start(f_ptc_J1939_VTStatusCycleReceive(e_testbody1));
+
+  v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend.start(J1939_ECU_WorkingSetMaintenanceIndCycleSend(e_testbody1))
+  var e_Phase v_phase
+
+  for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) {
+    f_startPhase(v_phase)
+    log("MTC: ", v_phase)
+    f_awaitEndPhase(v_phase)
+  }
+
+  f_haltAllComponents()
+  f_awaitAllComponentsHalt()
+
+  all component.done;
+  log("MTC done")
+
+  disconnect(v_ptc_J1939VTAdapter:pt_j1939PDU,                v_ptc_J1939VTApplication:pt_j1939PDU)
+  disconnect(v_ptc_J1939ECUAdapter:pt_j1939PDU,               v_ptc_J1939ECUApplication:pt_j1939PDU)
+
+  all component.kill;      
+}
+
+testcase tc_can_j1939_IsobusVtSimulation() runs on MTC {
+
+  // before running this test cases start the j1939 address claim deamons via commandline
+  /*
+  j1939acd -r 100,80-120 -c /tmp/A00080002E0003E6.jacd A00080002E0003E6 vcan0
+  */
+
+  var PTCAdapter v_ptc_J1939VTAdapter                                 := PTCAdapter.create("PTC1_ptc_j1939VTAdapter") alive
+  var PTC_Isobus_VT_CT  v_ptc_J1939VTApplication                      := PTC_Isobus_VT_CT.create("PTC1_ptc_j1939VTApplication") alive
+  var PTC_Isobus_VT_VTSTATUSCycleSend_CT v_ptc_J1939VT_VTStatusCycleSend      := PTC_Isobus_VT_VTSTATUSCycleSend_CT.create("PTC_Isobus_VT_VTSTATUSCycleSend") alive
+
+  f_addSyncSlaveSet({ptc_Adapter:=v_ptc_J1939VTAdapter}, v_PTCSet);
+  f_addSyncSlaveSet({ptc_Isobus_VT_CT:=v_ptc_J1939VTApplication}, v_PTCSet);
+  f_addSyncSlaveSet({ptc_Isobus_VT_VTSTATUSCycleSend_CT:=v_ptc_J1939VT_VTStatusCycleSend}, v_PTCSet);
+
+  connect(mtc:pt_sync, v_ptc_J1939VTAdapter:pt_sync)
+  connect(mtc:pt_sync, v_ptc_J1939VTApplication:pt_sync)
+  connect(mtc:pt_sync, v_ptc_J1939VT_VTStatusCycleSend:pt_sync)
+
+
+  connect(v_ptc_J1939VTAdapter:pt_j1939PDU,                                            v_ptc_J1939VTApplication:pt_j1939PDU)
+  connect(v_ptc_J1939VT_VTStatusCycleSend:pt_VTStatusTick,                             v_ptc_J1939VTApplication:pt_VTStatusTick)
+
+  const integer     c_send_prio        := 2
+  const J1939_NAME  c_name_VT          := 'A00080002E0003E6'O
+
+  v_ptc_J1939VTAdapter.start(f_ptc_J1939Adapter(
+      e_testbody1, 
+      c_send_prio,
+      c_name_VT)) /* name source */
+
+  v_ptc_J1939VTApplication.start(f_ptc_J1939VTApplication(e_testbody1));
+
+  v_ptc_J1939VT_VTStatusCycleSend.start(f_ptc_J1939VTStatusCycleSend(e_testbody1));
+  var e_Phase v_phase
+
+  for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) {
+    f_startPhase(v_phase)
+    log("MTC: ", v_phase)
+    f_awaitEndPhase(v_phase)
+  }
+
+  f_haltAllComponents()
+  f_awaitAllComponentsHalt()
+
+  all component.done;
+  log("MTC done")
+
+  disconnect(v_ptc_J1939VTAdapter:pt_j1939PDU,                v_ptc_J1939VTApplication:pt_j1939PDU)
+
+  all component.kill;      
+}
+
+testcase tc_can_j1939_IsobusEcuSimulation() runs on MTC {
+
+  // before running this test cases start the j1939 address claim deamons via commandline
+  /*
+  j1939acd -r 100,80-120 -c /tmp/A00081002E0003E7.jacd A00081002E0003E7 vcan0
+  */
+
+  var PTCAdapter v_ptc_J1939ECUAdapter                                := PTCAdapter.create("PTC2_ptc_j1939ECUAdapter") alive
+  var PTC_Isobus_ECU_CT v_ptc_J1939ECUApplication                     := PTC_Isobus_ECU_CT.create("PTC2_ptc_j1939ECUApplication") alive
+  var PTC_Isobus_ECU_VTSTATUSCycleReceive_CT v_ptc_J1939_VTStatusCycleReceive  := PTC_Isobus_ECU_VTSTATUSCycleReceive_CT.create("PTC_Isobus_VT_VTSTATUSCycleReceive") alive
+  var PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend := PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT.  create( "PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend" ) alive;
+
+  f_addSyncSlaveSet({ptc_Adapter:=v_ptc_J1939ECUAdapter}, v_PTCSet);
+  f_addSyncSlaveSet({ptc_Isobus_ECU_CT:=v_ptc_J1939ECUApplication}, v_PTCSet);
+  f_addSyncSlaveSet({ptc_Isobus_ECU_VTSTATUSCycleReceive_CT:=v_ptc_J1939_VTStatusCycleReceive}, v_PTCSet);
+  f_addSyncSlaveSet({ptc_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT:=v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend}, v_PTCSet);
+
+  connect(mtc:pt_sync, v_ptc_J1939ECUAdapter:pt_sync)
+
+  connect(mtc:pt_sync, v_ptc_J1939ECUApplication:pt_sync)
+  connect(mtc:pt_sync, v_ptc_J1939_VTStatusCycleReceive:pt_sync)
+  connect(mtc:pt_sync, v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend:pt_sync)
+
+
+  connect(v_ptc_J1939ECUAdapter:pt_j1939PDU,                                           v_ptc_J1939ECUApplication:pt_j1939PDU)
+  connect(v_ptc_J1939ECUApplication:pt_VTStatusTick,                                   v_ptc_J1939_VTStatusCycleReceive:pt_VTStatusTick)
+  connect(v_ptc_J1939_VTStatusCycleReceive:pt_WorkingSetMaintenaceOnOff,               v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend:pt_WorkingSetMaintenaceOnOff)
+  connect(v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend:pt_WorkingSetMaintenance,  v_ptc_J1939ECUApplication:pt_WorkingSetMaintenance)
+
+
+
+  const integer     c_send_prio        := 2
+  const J1939_NAME  c_name_ECU         := 'A00081002E0003E7'O  
+
+  v_ptc_J1939ECUAdapter.start(f_ptc_J1939Adapter(
+      e_testbody1, 
+      c_send_prio,
+      c_name_ECU ))/* name source */
+
+  v_ptc_J1939ECUApplication.start(f_ptc_J1939ECUApplication(e_testbody1));
+
+  v_ptc_J1939_VTStatusCycleReceive.start(f_ptc_J1939_VTStatusCycleReceive(e_testbody1));
+
+  v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend.start(J1939_ECU_WorkingSetMaintenanceIndCycleSend(e_testbody1))
+  var e_Phase v_phase
+
+  for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) {
+    f_startPhase(v_phase)
+    log("MTC: ", v_phase)
+    f_awaitEndPhase(v_phase)
+  }
+
+  f_haltAllComponents()
+  f_awaitAllComponentsHalt()
+
+  all component.done;
+  log("MTC done")
+
+  disconnect(v_ptc_J1939ECUAdapter:pt_j1939PDU,               v_ptc_J1939ECUApplication:pt_j1939PDU)
+
+  all component.kill;      
+}
+
+//=========================================================================
+// Control
+//=========================================================================
+
+// Insert control part here if applicable!
+
+}  // end of module
diff --git a/demo/J1939test.ttcn b/demo/J1939test.ttcn
index a0e4d19..7db1488 100644
--- a/demo/J1939test.ttcn
+++ b/demo/J1939test.ttcn
@@ -20,7 +20,7 @@
 import from SocketCAN_Templates all;
 import from J1939 all;
 
-const float c_guard := 10.0
+const float c_guard := 50.0
 
 type enumerated SocketCAN_open_socket_type
 { 
@@ -83,7 +83,6 @@
 
 type record of PTC PTCSet 
 
-
 type component PTC {
   port SyncSlavePort                  pt_sync
   port SocketCAN_PT                   pt_socketCAN
@@ -446,16 +445,65 @@
         p_peer_addr,
         p_peer_name,
         p_j1939_pdu__expected)) -> value v_result
-    {log("SocketCan:Expected frame received", v_result)}
+    {
+      log("SocketCan:Expected frame received", v_result)
+      setverdict(pass)      
+    }
     [] pt_socketCAN.receive(SocketCAN_receive_j1939_message:?) -> value v_result
-    {log("SocketCan:Unexpected frame received!", v_result)
-      setverdict(fail)}
+    {
+      log("SocketCan:Unexpected frame received!", v_result)
+    }
     [] t_guard.timeout {
       log("timeout!")
       setverdict(fail)}
   }
 }
 
+function f_receive_messages_until_expected_message_got_j1939_data(
+  in SocketCAN_socketid p_socket_id,
+  template SocketCAN_ifr      p_ifr,
+  template J1939_PGN          p_peer_pgn,
+  template J1939_ADDR         p_peer_addr,
+  template J1939_NAME         p_peer_name,
+  template SocketCAN_J1939_PDU p_j1939_pdu__expected)
+runs on PTC { 
+  var SocketCAN_receive_j1939_message v_result
+
+  timer t_guard
+  t_guard.start(c_guard)
+  var boolean exitloop := true
+
+  while (exitloop == true)
+  {
+    // receive frame or timeout
+    log("SocketCan:Waiting for frame")
+  // receive frame or timeout
+  alt {
+    [] pt_socketCAN.receive(a_SocketCAN_receive_j1939_message(
+        p_socket_id,
+        p_ifr,
+        p_peer_pgn,
+        p_peer_addr,
+        p_peer_name,
+        p_j1939_pdu__expected)) -> value v_result
+    {
+      log("SocketCan:Expected frame received", v_result)
+      exitloop := false
+      setverdict(pass)
+    }
+//    [] pt_socketCAN.receive(SocketCAN_receive_j1939_message:?) -> value v_result
+//    {
+//      log("SocketCan:Unexpected frame received!", v_result)
+//    }
+    [] t_guard.timeout 
+    {
+      log("timeout!")
+      exitloop := false
+      setverdict(fail)
+      }
+  }
+ }
+}
 
 function f_setsockopt(in SocketCAN_socketid p_socket_id,
   in SocketCAN_setsockopt_commandu p_command)
@@ -523,13 +571,12 @@
     p_j1939_addr_source)
   var SocketCAN_setsockopt_result            v_setsockopt_result
   v_setsockopt_result := f_setsockopt(v_socket_id, {j1939_prio:=p_send_prio})
-  v_setsockopt_result := f_setsockopt(v_socket_id, {j1939_prio:=p_send_prio})
   f_sendPhaseEndInd()
 
   alt_awaitPhaseStartReq(p_phase)
   var SocketCAN_j1939_send_data_to_result send_data_to_result
   var J1939_hdr v_j1939_destination := {
-    //name := p_j1939_name_source, 
+    //name := p_j1939_name_destination, 
     pgn := p_j1939_pgn_destination, 
     addr:= p_j1939_addr_destination}
 
@@ -547,6 +594,105 @@
   f_sendPhaseEndInd()
 }
 
+function f_ptc_J1939SendToNameInitiator(
+  in e_Phase             p_phase,
+  in J1939_Priority      p_send_prio,
+  in J1939_NAME          p_j1939_name_source,
+  in J1939_PGN           p_j1939_pgn_destination,
+  in J1939_NAME          p_j1939_name_destination,
+  in SocketCAN_J1939_PDU p_pdu_send) runs on PTC {
+  map(self:pt_socketCAN, system:pt_socketCAN)
+  var SocketCAN_socketid v_socket_id
+  var SocketCAN_ifr v_ifr
+
+  alt_awaitPhaseStartReq(e_open_socket)
+  var SocketCAN_open_j1939_result res
+  res := f_open_j1939()
+  v_socket_id := res.socket_id
+  v_ifr := res.ifr
+  var SocketCAN_bind_result v_bind_result
+  v_bind_result := f_bind(v_socket_id,
+    v_ifr.if_index, 
+    p_j1939_name_source, 
+    J1939_NO_PGN,  /* p_j1939_pgn_source */
+    J1939_NO_ADDR  /* p_j1939_addr_source */)
+  var SocketCAN_setsockopt_result            v_setsockopt_result
+  v_setsockopt_result := f_setsockopt(v_socket_id, {j1939_prio:=p_send_prio})
+  f_sendPhaseEndInd()
+
+  alt_awaitPhaseStartReq(p_phase)
+  var SocketCAN_j1939_send_data_to_result send_data_to_result
+  var J1939_hdr v_j1939_destination := {
+    name := p_j1939_name_destination, 
+    pgn := p_j1939_pgn_destination 
+    //addr:= p_j1939_addr_destination
+    }
+
+  send_data_to_result := f_j1939_send_data_to(
+    v_socket_id, 
+    v_ifr.if_index,
+    v_j1939_destination,
+    p_pdu_send)
+  f_sendPhaseEndInd()
+
+  alt_awaitPhaseStartReq(e_close_socket)
+  f_close_socket (v_socket_id)
+  unmap(self:pt_socketCAN, system:pt_socketCAN)
+  setverdict(pass)
+  f_sendPhaseEndInd()
+}
+
+function f_ptc_J1939SendToGlobalAddressInitiator(
+  in e_Phase             p_phase,
+  in J1939_Priority      p_send_prio,
+  in J1939_NAME          p_j1939_name_source,
+  in J1939_PGN           p_j1939_pgn_destination,
+  in SocketCAN_J1939_PDU p_pdu_send) runs on PTC {
+  map(self:pt_socketCAN, system:pt_socketCAN)
+  var SocketCAN_socketid v_socket_id
+  var SocketCAN_ifr v_ifr
+
+  alt_awaitPhaseStartReq(e_open_socket)
+  var SocketCAN_open_j1939_result res
+  res := f_open_j1939()
+  v_socket_id := res.socket_id
+  v_ifr := res.ifr
+  var SocketCAN_bind_result v_bind_result
+  v_bind_result := f_bind(v_socket_id,
+    v_ifr.if_index, 
+    p_j1939_name_source, 
+    J1939_NO_PGN,  /* p_j1939_pgn_source */
+    J1939_NO_ADDR  /* p_j1939_addr_source */)
+  var SocketCAN_setsockopt_result            v_setsockopt_result
+  v_setsockopt_result := f_setsockopt(v_socket_id, {j1939_prio:=p_send_prio})
+  f_sendPhaseEndInd()
+  const SocketCAN_setsockopt_commandu c_commandu_activate_broadcast := {j1939_broadcast := Enable} 
+
+  // configure broadcast:
+  v_setsockopt_result := f_setsockopt(v_socket_id, c_commandu_activate_broadcast)
+  
+
+  alt_awaitPhaseStartReq(p_phase)
+  var SocketCAN_j1939_send_data_to_result send_data_to_result
+  var J1939_hdr v_j1939_destination := {
+    //name := p_j1939_name_destination, 
+    pgn := p_j1939_pgn_destination, 
+    addr:= J1939_NO_ADDR /*addr_destination */
+    }
+
+  send_data_to_result := f_j1939_send_data_to(
+    v_socket_id, 
+    v_ifr.if_index,
+    v_j1939_destination,
+    p_pdu_send)
+  f_sendPhaseEndInd()
+
+  alt_awaitPhaseStartReq(e_close_socket)
+  f_close_socket (v_socket_id)
+  unmap(self:pt_socketCAN, system:pt_socketCAN)
+  setverdict(pass)
+  f_sendPhaseEndInd()
+}
 
 function f_ptc_J1939SendInitiatorWithConnect(
   in e_Phase p_phase,
@@ -634,6 +780,136 @@
   f_sendPhaseEndInd()
 }
 
+function f_ptc_J1939FrameReceiverByName(
+  in e_Phase p_phase,
+  in J1939_NAME               p_j1939_name_local,
+  template J1939_PGN          p_pgn_local,
+  template J1939_ADDR         p_peer_addr,
+  template J1939_NAME         p_peer_name, 
+  template SocketCAN_J1939_PDU p_j1939_pdu_expected) runs on PTC {
+  map(self:pt_socketCAN, system:pt_socketCAN)
+  var SocketCAN_socketid v_socket_id
+  var SocketCAN_ifr v_ifr
+
+  alt_awaitPhaseStartReq(e_open_socket)
+  var SocketCAN_open_j1939_result res
+  res := f_open_j1939()
+  v_socket_id := res.socket_id
+  v_ifr := res.ifr
+  var SocketCAN_bind_result v_bind_result
+  v_bind_result := f_bind(v_socket_id,
+    v_ifr.if_index, 
+    p_j1939_name_local,
+    J1939_NO_PGN,
+    J1939_NO_ADDR)
+  f_sendPhaseEndInd()
+
+  alt_awaitPhaseStartReq(p_phase)
+  f_receive_j1939_data(
+    v_socket_id, 
+    v_ifr,
+    p_pgn_local,
+    p_peer_addr,
+    p_peer_name,
+    p_j1939_pdu_expected)
+  f_sendPhaseEndInd()
+
+  alt_awaitPhaseStartReq(e_close_socket)
+  f_close_socket (v_socket_id)
+  unmap(self:pt_socketCAN, system:pt_socketCAN)  
+  setverdict(pass)
+  f_sendPhaseEndInd()
+}
+
+
+function f_ptc_J1939FrameBroadcastReceiver(
+  in e_Phase p_phase,
+  in J1939_NAME               p_j1939_name_local,
+  template J1939_PGN          p_pgn_local,
+  template SocketCAN_J1939_PDU p_j1939_pdu_expected) runs on PTC {
+  map(self:pt_socketCAN, system:pt_socketCAN)
+  var SocketCAN_socketid v_socket_id
+  var SocketCAN_ifr v_ifr
+
+  alt_awaitPhaseStartReq(e_open_socket)
+  var SocketCAN_open_j1939_result res
+  res := f_open_j1939()
+  v_socket_id := res.socket_id
+  v_ifr := res.ifr
+  var SocketCAN_bind_result v_bind_result
+  v_bind_result := f_bind(v_socket_id,
+    v_ifr.if_index, 
+    p_j1939_name_local,
+    J1939_NO_PGN,
+    J1939_NO_ADDR)
+  var SocketCAN_setsockopt_result            v_setsockopt_result
+  const SocketCAN_setsockopt_commandu c_commandu_activate_broadcast := {j1939_broadcast := Enable} 
+
+  // configure broadcast:
+  v_setsockopt_result := f_setsockopt(v_socket_id, c_commandu_activate_broadcast)
+  
+  f_sendPhaseEndInd()
+
+  alt_awaitPhaseStartReq(p_phase)
+  f_receive_j1939_data(
+    v_socket_id, 
+    v_ifr,
+    p_pgn_local,
+    ?, /* p_peer_addr */
+    ?, /* p_peer_name */
+    p_j1939_pdu_expected)
+  f_sendPhaseEndInd()
+
+  alt_awaitPhaseStartReq(e_close_socket)
+  f_close_socket (v_socket_id)
+  unmap(self:pt_socketCAN, system:pt_socketCAN)  
+  setverdict(pass)
+  f_sendPhaseEndInd()
+}
+
+function f_ptc_J1939FrameReceiverUntilExpectedMessage(
+  in e_Phase p_phase,
+  in J1939_NAME               p_j1939_name_source,
+  in J1939_PGN                p_j1939_pgn_source,
+  in J1939_ADDR               p_j1939_addr_source,
+  template J1939_PGN          p_peer_pgn,
+  template J1939_ADDR         p_peer_addr,
+  template J1939_NAME         p_peer_name, 
+  template SocketCAN_J1939_PDU p_j1939_pdu_expected) runs on PTC {
+  map(self:pt_socketCAN, system:pt_socketCAN)
+  var SocketCAN_socketid v_socket_id
+  var SocketCAN_ifr v_ifr
+
+  alt_awaitPhaseStartReq(e_open_socket)
+  var SocketCAN_open_j1939_result res
+  res := f_open_j1939()
+  v_socket_id := res.socket_id
+  v_ifr := res.ifr
+  var SocketCAN_bind_result v_bind_result
+  v_bind_result := f_bind(v_socket_id,
+    v_ifr.if_index, 
+    p_j1939_name_source,
+    p_j1939_pgn_source,
+    p_j1939_addr_source)
+  f_sendPhaseEndInd()
+
+  alt_awaitPhaseStartReq(p_phase)
+  f_receive_messages_until_expected_message_got_j1939_data(
+    v_socket_id, 
+    v_ifr,
+    p_peer_pgn,
+    p_peer_addr,
+    p_peer_name,
+    p_j1939_pdu_expected)
+  f_sendPhaseEndInd()
+
+  alt_awaitPhaseStartReq(e_close_socket)
+  f_close_socket (v_socket_id)
+  unmap(self:pt_socketCAN, system:pt_socketCAN)  
+  setverdict(pass)
+  f_sendPhaseEndInd()
+}
+
 function f_ptc_J1939SendInitiatorDynamic(in e_Phase p_phase,
   in J1939_NAME p_j1939_name_source,  
   in J1939_NAME p_j1939_name_destination,
@@ -664,7 +940,7 @@
   var SocketCAN_setsockopt_result            v_setsockopt_result
   const SocketCAN_setsockopt_commandu c_commandu_activate_broadcast := {j1939_broadcast := Enable} 
 
-  // configure filters:
+  // configure broadcast:
   v_setsockopt_result := f_setsockopt(v_socket_id, c_commandu_activate_broadcast)
   // configure filters:
   const J1939_filter c_j1939_filter0 := {
@@ -870,16 +1146,17 @@
     pgn := J1939_PGN_ADDRESS_CLAIMED, 
     addr:= J1939_NO_ADDR}
 
-  var J1939_NAME v_j1939_name_source_reverse := 
-  p_j1939_name_source[7]& p_j1939_name_source[6]& p_j1939_name_source[5]&
-  p_j1939_name_source[4]& p_j1939_name_source[3]& p_j1939_name_source[2]& 
-  p_j1939_name_source[1]& p_j1939_name_source[0]
+  var J1939_NAME v_j1939_name_encoded := f_encode_J1939_name(p_j1939_name_source)
   
+//  p_j1939_name_source[7]& p_j1939_name_source[6]& p_j1939_name_source[5]&
+//  p_j1939_name_source[4]& p_j1939_name_source[3]& p_j1939_name_source[2]& 
+//  p_j1939_name_source[1]& p_j1939_name_source[0]
+
   send_data_to_result := f_j1939_send_data_to(
     v_socket_id, 
     v_ifr.if_index,
     v_j1939_destination,
-    v_j1939_name_source_reverse /*p_pdu_send*/)
+    v_j1939_name_encoded /*p_pdu_send*/)
 
   f_sendPhaseEndInd()
 
@@ -890,7 +1167,7 @@
   f_sendPhaseEndInd()
 }
 
-function f_j1939_address_claim2(in e_Phase p_phase, 
+function f_j1939_request_for_address_claimed(in e_Phase p_phase, 
   in   J1939_NAME          p_j1939_name_source, 
   in   SocketCAN_J1939_PDU p_pdu_send) runs on PTC {
   map(self:pt_socketCAN, system:pt_socketCAN)
@@ -948,7 +1225,7 @@
     name := omit, 
     pgn := J1939_PGN_REQUEST, 
     addr:= J1939_NO_ADDR}
-  
+
   send_data_to_result := f_j1939_send_data_to(
     v_socket_id, 
     v_ifr.if_index,
diff --git a/demo/Makefile b/demo/Makefile
index b47299d..aea14be 100644
--- a/demo/Makefile
+++ b/demo/Makefile
@@ -86,13 +86,14 @@
 TTCN3_MODULES = ../src/Bcm.ttcn ../src/Can.ttcn ../src/CanError.ttcn ../src/General_Types.ttcn ../src/Raw.ttcn \
 SocketCAN_BCM_test.ttcn ../src/SocketCAN_PortType.ttcn SocketCAN_RAW_test.ttcn ../src/SocketCAN_Templates.ttcn \
 ../src/SocketCAN_Types.ttcn ../src/J1939.ttcn \
-SocketCANtest.ttcn Isobus.ttcn Isobustest.ttcn IsobusMessageTypes.ttcn \
-Isobus_Templates.ttcn IsobusNMMessageTypes.ttcn IsobusCMMessageTypes.ttcn IsobusVTMessageTypes.ttcn \
+SocketCANtest.ttcn Isobus.ttcn IsobusMessageTypes.ttcn \
+IsobusVT_Templates.ttcn IsobusNMMessageTypes.ttcn IsobusCMMessageTypes.ttcn IsobusVTMessageTypes.ttcn \
 Isotp.ttcn Isotptest.ttcn \
 CAN_matrix_general_types.ttcn  CAN_matrix_test.ttcn  CAN_matrix.ttcn CAN_matrix_messages.ttcn CANFD_matrix_messages.ttcn \
 CAN_matrix_signals.ttcn CAN_matrix_templates.ttcn \
 UnifiedDiagnosticServices.ttcn UnifiedDiagnosticServicestest.ttcn UnifiedDiagnosticServices_Template.ttcn \
-J1939test.ttcn SocketCAN_J1939_test.ttcn
+J1939test.ttcn SocketCAN_J1939_test.ttcn Isobus_test.ttcn J1939_Isobus_test.ttcn \
+Isobus_test_encoder.ttcn
 
 # ASN.1 modules of this project:
 ASN1_MODULES =
@@ -102,13 +103,14 @@
 GENERATED_SOURCES = Bcm.cc Can.cc CanError.cc General_Types.cc Raw.cc \
 SocketCAN_BCM_test.cc SocketCAN_PortType.cc SocketCAN_RAW_test.cc SocketCAN_Templates.cc \
 SocketCAN_Types.cc J1939.cc \
-SocketCANtest.cc Isobus.cc Isobustest.cc IsobusMessageTypes.cc \
-Isobus_Templates.cc IsobusNMMessageTypes.cc IsobusCMMessageTypes.cc IsobusVTMessageTypes.cc \
+SocketCANtest.cc Isobus.cc IsobusMessageTypes.cc \
+IsobusVT_Templates.cc IsobusNMMessageTypes.cc IsobusCMMessageTypes.cc IsobusVTMessageTypes.cc \
 Isotp.cc Isotptest.cc \
 CAN_matrix_general_types.cc  CAN_matrix_test.cc  CAN_matrix.cc CAN_matrix_messages.cc CANFD_matrix_messages.cc \
 CAN_matrix_signals.cc CAN_matrix_templates.cc \
 UnifiedDiagnosticServices.cc UnifiedDiagnosticServicestest.cc UnifiedDiagnosticServices_Template.cc \
-J1939test.cc SocketCAN_J1939_test.cc
+J1939test.cc SocketCAN_J1939_test.cc Isobus_test.cc J1939_Isobus_test.cc \
+Isobustest_test_encoder.cc
 
 GENERATED_HEADERS = $(GENERATED_SOURCES:.cc=.hh)
 
diff --git a/demo/SocketCAN_J1939_test.ttcn b/demo/SocketCAN_J1939_test.ttcn
index 64b8da4..6dd2bee 100644
--- a/demo/SocketCAN_J1939_test.ttcn
+++ b/demo/SocketCAN_J1939_test.ttcn
@@ -62,7 +62,7 @@
   return v_pdu
 }
 
-testcase tc_can_j1939_send_and_receive_can_frame() runs on MTC {
+testcase tc_can_j1939_send_and_receive_message() runs on MTC {
   var PTC v_ptc_j1939SendInitiator := PTC.create("PTC1_ptc_j1939SendInitiator") alive
   var PTC v_ptc_j1939FrameReceiver := PTC.create("PTC2_ptc_j1939FrameReceiver") alive
 
@@ -80,8 +80,18 @@
 
 
   var octetstring v_pdu_send := ''O
+
+  // According to ETP specification messages of 117440505 Bytes are possible, 
+  // however the maximum possible message size for the current Linux kernels 
+  // ETP implemantion messages depends upon the available RAM.
+  // Tests on my Laptop have shown that 4193975 bytes work                                              
+  // When using very large messages, disable logging by commenting out
+  // the following lines in J1939.cfg and set the test cases guard timer
+  // c_guard appropriate (e.g. 100s):
+  // FileMask := LOG_ALL | DEBUG | MATCHING
+  // ConsoleMask := LOG_ALL | DEBUG | MATCHING
   //v_pdu_send := create_octetstring_of_size(117440505)
-                                               
+  
   v_pdu_send := create_octetstring_of_size    (4193975) //4193976
 
   log("length of v_pdu_send: ", lengthof(v_pdu_send))
@@ -99,8 +109,8 @@
       c_addr_destination1,     /* p_j1939_addr_source */
       c_pgn_destination1,      /* p_peer_pgn */
       c_addr_source1,          /* p_peer_addr */
-      J1939_NO_NAME,          /* p_peer_name */
-      v_pdu_send              /* p_j1939_pdu_expected */))
+      J1939_NO_NAME,           /* p_peer_name */
+      v_pdu_send               /* p_j1939_pdu_expected */))
 
   var e_Phase v_phase
 
@@ -119,7 +129,7 @@
   all component.kill;      
 }
 
-testcase tc_can_j1939_send_and_receive_can_frame_parallel() runs on MTC {
+testcase tc_can_j1939_send_and_receive_message_parallel() runs on MTC {
   var PTC v_ptc_j1939SendInitiator1 := PTC.create("PTC1_ptc_j1939SendInitiator1") alive
   var PTC v_ptc_j1939FrameReceiver1 := PTC.create("PTC2_ptc_j1939FrameReceiver1") alive
   var PTC v_ptc_j1939SendInitiator2 := PTC.create("PTC1_ptc_j1939SendInitiator2") alive
@@ -145,8 +155,10 @@
   var octetstring v_pdu_send2 := ''O
   //v_pdu_send := create_octetstring_of_size(117440505)
   v_pdu_send1 := create_octetstring_of_size(4193976)
+  //v_pdu_send1 := create_octetstring_of_size(2093976)
   log("length of v_pdu_send1: ", lengthof(v_pdu_send1))
   v_pdu_send2 := create_octetstring_of_size(4193976)
+  //v_pdu_send2 := create_octetstring_of_size(2093976)
   log("length of v_pdu_send2: ", lengthof(v_pdu_send2))
 
   v_ptc_j1939SendInitiator1.start(f_ptc_J1939SendInitiator(
@@ -198,14 +210,14 @@
   all component.kill;      
 }
 
-testcase tc_can_f_j1939_address_claim() runs on MTC {
+testcase tc_can_j1939_address_claim() runs on MTC {
   var PTC v_ptc_j1939AddressClaimInitiator := PTC.create("PTC1_ptc_j1939AddressClaimInitiator") alive
 
   f_addSyncSlaveSet(v_ptc_j1939AddressClaimInitiator, v_PTCSet)
 
   connect(mtc:pt_sync, v_ptc_j1939AddressClaimInitiator:pt_sync)
 
-  const J1939_NAME c_j1939_name_source  := '1122334455667788'O
+  const J1939_NAME c_j1939_name_source  := '1122334455667789'O
 
   v_ptc_j1939AddressClaimInitiator.start(f_j1939_address_claim(
   	e_testbody1, 
@@ -228,17 +240,128 @@
   all component.kill;      
 }
 
-testcase tc_can_f_j1939_address_claim2() runs on MTC {
-  var PTC v_ptc_j1939AddressClaimInitiator := PTC.create("PTC1_ptc_j1939AddressClaimInitiator") alive
+testcase tc_can_j1939_send_to_name_and_receive_message() runs on MTC {
+// before running this test cases start the j1939 address claim deamons via commandline
+//j1939acd -r 100,80-120 -c /tmp/1122334455667789.jacd 1122334455667789
+//j1939acd -r 100,80-120 -c /tmp/1122334455667788.jacd 1122334455667788
 
-  f_addSyncSlaveSet(v_ptc_j1939AddressClaimInitiator, v_PTCSet)
+  var PTC v_ptc_j1939SendInitiatorECU := PTC.create("PTC1_ptc_j1939SendInitiatorECU") alive
+  var PTC v_ptc_j1939FrameReceiverVT := PTC.create("PTC2_ptc_j1939FrameReceiverVT") alive
 
-  connect(mtc:pt_sync, v_ptc_j1939AddressClaimInitiator:pt_sync)
+  f_addSyncSlaveSet(v_ptc_j1939SendInitiatorECU, v_PTCSet)
+  f_addSyncSlaveSet(v_ptc_j1939FrameReceiverVT, v_PTCSet)
 
-  const J1939_NAME  c_j1939_name_source  := '1122334455667788'O
+  connect(mtc:pt_sync, v_ptc_j1939SendInitiatorECU:pt_sync)
+  connect(mtc:pt_sync, v_ptc_j1939FrameReceiverVT:pt_sync)
+
+
+  const J1939_NAME  c_name_VT          := '1122334455667788'O
+  const J1939_NAME  c_name_ECU   := '1122334455667789'O
+  const integer     c_send_prio        := 2
+  const octetstring c_pgn_ECU2VT       := '00E700'O // ECU to VT
+
+
+
+  var octetstring v_pdu_send           := 'FEFEFFFFFFFF00FF'O
+    
+  v_ptc_j1939SendInitiatorECU.start(f_ptc_J1939SendToNameInitiator(
+      e_testbody3, 
+      c_send_prio,
+      c_name_ECU, /* name source */
+      c_pgn_ECU2VT,         /* pgn destination */
+      c_name_VT,        /* name destination */
+      v_pdu_send))
+
+  v_ptc_j1939FrameReceiverVT.start(f_ptc_J1939FrameReceiverByName(
+      e_testbody4,     
+      c_name_VT,        /* p_j1939_name_local */
+      c_pgn_ECU2VT,     /* p_pgn_local */
+      J1939_NO_ADDR,    /* p_peer_addr */
+      c_name_ECU,       /* p_peer_name */
+      v_pdu_send        /* p_j1939_pdu_expected */))
+
+  var e_Phase v_phase
+
+  for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) {
+    f_startPhase(v_phase)
+    log("MTC: ", v_phase)
+    f_awaitEndPhase(v_phase)
+  }
+
+  all component.done;
+  log("MTC done")
+
+  disconnect(mtc:pt_sync, v_ptc_j1939SendInitiatorECU:pt_sync)
+  disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiverVT:pt_sync)
+  all component.kill;      
+}
+
+testcase tc_can_j1939_send_to_global_address_and_receive_message() runs on MTC {
+// before running this test cases start the j1939 address claim deamons via commandline
+//j1939acd -r 100,80-120 -c /tmp/1122334455667789.jacd 1122334455667789
+//j1939acd -r 100,80-120 -c /tmp/1122334455667788.jacd 1122334455667788
+
+  var PTC v_ptc_j1939SendInitiatorVT := PTC.create("PTC1_ptc_j1939SendInitiatorVT") alive
+  var PTC v_ptc_j1939FrameReceiverECU := PTC.create("PTC2_ptc_j1939FrameReceiverECU") alive
+
+  f_addSyncSlaveSet(v_ptc_j1939SendInitiatorVT, v_PTCSet)
+  f_addSyncSlaveSet(v_ptc_j1939FrameReceiverECU, v_PTCSet)
+
+  connect(mtc:pt_sync, v_ptc_j1939SendInitiatorVT:pt_sync)
+  connect(mtc:pt_sync, v_ptc_j1939FrameReceiverECU:pt_sync)
+
+
+  const J1939_NAME  c_name_VT         := '1122334455667788'O
+  const J1939_NAME  c_name_ECU        := '1122334455667789'O
+  const integer     c_send_prio       := 2
+  const octetstring c_pgn_VT2ECU      := '00E600'O // VT to ECU
+
+
+
+  var octetstring v_pdu_send := 'FF0104FFFFFFFFFF'O
+    
+  v_ptc_j1939SendInitiatorVT.start(f_ptc_J1939SendToGlobalAddressInitiator(
+      e_testbody3, 
+      c_send_prio,
+      c_name_VT,        /* name source */
+      c_pgn_VT2ECU,     /* pgn destination */
+      v_pdu_send))
+
+  v_ptc_j1939FrameReceiverECU.start(f_ptc_J1939FrameBroadcastReceiver(
+      e_testbody4,     
+      c_name_ECU,       /* p_j1939_name_local */
+      c_pgn_VT2ECU,     /* p_pgn_local */
+      v_pdu_send        /* p_j1939_pdu_expected */))
+
+  var e_Phase v_phase
+
+  for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) {
+    f_startPhase(v_phase)
+    log("MTC: ", v_phase)
+    f_awaitEndPhase(v_phase)
+  }
+
+  all component.done;
+  log("MTC done")
+
+  disconnect(mtc:pt_sync, v_ptc_j1939SendInitiatorVT:pt_sync)
+  disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiverECU:pt_sync)
+  all component.kill;      
+}
+
+
+testcase tc_can_j1939_request_for_address_claimed() runs on MTC {
+  var PTC v_ptc_j1939RequestForAddressClaimedInitiator := PTC.create("PTC1_ptc_j1939v_ptc_j1939RequestForAddressClaimedInitiator") alive
+
+  f_addSyncSlaveSet(v_ptc_j1939RequestForAddressClaimedInitiator, v_PTCSet)
+
+  connect(mtc:pt_sync, v_ptc_j1939RequestForAddressClaimedInitiator:pt_sync)
+
+  //const J1939_NAME  c_j1939_name_source  := '1122334455667788'O
+  const J1939_NAME  c_j1939_name_source  := J1939_NO_NAME
   const octetstring c_j1939_pdu_send     := '00EE00'O
   
-  v_ptc_j1939AddressClaimInitiator.start(f_j1939_address_claim2(
+  v_ptc_j1939RequestForAddressClaimedInitiator.start(f_j1939_request_for_address_claimed(
   	e_testbody1, 
     c_j1939_name_source,
     c_j1939_pdu_send))
@@ -254,12 +377,141 @@
   all component.done;
   log("MTC done")
 
-  disconnect(mtc:pt_sync, v_ptc_j1939AddressClaimInitiator:pt_sync)
+  disconnect(mtc:pt_sync, v_ptc_j1939RequestForAddressClaimedInitiator:pt_sync)
 
 
   all component.kill;      
 }
 
+testcase tc_can_j1939_receive_message() runs on MTC {
+  var PTC v_ptc_j1939FrameReceiver := PTC.create("PTC2_ptc_j1939FrameReceiver") alive
+
+  f_addSyncSlaveSet(v_ptc_j1939FrameReceiver, v_PTCSet)
+
+  connect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync)
+
+
+  const octetstring c_addr_source1      := J1939_NO_ADDR
+  const octetstring c_pgn_destination1  := '00E600'O // ECU to VT
+  const octetstring c_addr_destination1 := 'F8'O // '90'O
+
+
+
+  template octetstring v_pdu_receive := ?//''O
+
+  v_ptc_j1939FrameReceiver.start(f_ptc_J1939FrameReceiver(
+      e_testbody2,     
+      c_addr_destination1,     /* p_j1939_addr_source */
+      c_pgn_destination1,      /* p_peer_pgn */
+      c_addr_source1,          /* p_peer_addr */
+      J1939_NO_NAME,           /* p_peer_name */
+      v_pdu_receive            /* p_j1939_pdu_expected */))
+
+  var e_Phase v_phase
+
+  for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) {
+    f_startPhase(v_phase)
+    log("MTC: ", v_phase)
+    f_awaitEndPhase(v_phase)
+  }
+
+  all component.done;
+  log("MTC done")
+
+  disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync)
+
+  all component.kill;      
+}
+
+testcase tc_can_j1939_receive_message_VT2ECU() runs on MTC {
+  var PTC v_ptc_j1939FrameReceiver := PTC.create("PTC2_ptc_j1939FrameReceiver") alive
+
+  f_addSyncSlaveSet(v_ptc_j1939FrameReceiver, v_PTCSet)
+
+  connect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync)
+
+  template J1939_NAME  t_name_source         := '80001d002e030231'O //J1939_NO_NAME
+  template octetstring t_pgn_source          := '00E600'O // VT to ECU 
+  template octetstring t_addr_source         := ? //'F7'O //J1939_IDLE_ADDR
+  const octetstring c_pgn_local  := '00E600'O  //J1939_NO_PGN
+  const octetstring c_addr_local := 'F8'O // J1939_NO_ADDR
+  const J1939_NAME  c_name_local := J1939_NO_NAME // '80003d002e030231'O //'80001d002e030231'O 
+
+
+  var template octetstring v_pdu_receive :=  'c7ff02cde001e001'O
+  
+  //log("length of v_pdu_receive: ", lengthof(v_pdu_receive))
+
+  v_ptc_j1939FrameReceiver.start(f_ptc_J1939FrameReceiverUntilExpectedMessage(
+      e_testbody2,     
+      c_name_local,
+      c_pgn_local,
+      c_addr_local,         /* p_j1939_addr_source */
+      t_pgn_source,     /* p_peer_pgn */
+      t_addr_source,    /* p_peer_addr */
+      t_name_source,    /* p_peer_name */
+      v_pdu_receive          /* p_j1939_pdu_expected */))
+
+  var e_Phase v_phase
+
+  for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) {
+    f_startPhase(v_phase)
+    log("MTC: ", v_phase)
+    f_awaitEndPhase(v_phase)
+  }
+    all component.done;
+  log("MTC done")
+
+  disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync)
+
+  all component.kill;      
+}
+testcase tc_can_j1939_receive_message_ECU2VT() runs on MTC {
+  var PTC v_ptc_j1939FrameReceiver := PTC.create("PTC2_ptc_j1939FrameReceiver") alive
+
+  f_addSyncSlaveSet(v_ptc_j1939FrameReceiver, v_PTCSet)
+
+  connect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync)
+
+  const J1939_NAME  c_name_source         := '80001d002e030231'O //J1939_NO_NAME
+  const octetstring c_pgn_source          := '00E700'O // ECU to VT 
+  const octetstring c_addr_source         := 'F8'O //J1939_NO_ADDR
+  template octetstring c_pgn_destination  := '00E700'O  //J1939_NO_PGN
+  template octetstring c_addr_destination := ? //J1939_NO_ADDR
+  template J1939_NAME  c_name_destination := ? //J1939_NO_NAME //'000000002e030231'O //'80001d002e030231'O 
+
+
+  var template octetstring v_pdu_receive := ? // 'ff0104ffffffffff'O
+
+
+  //log("length of v_pdu_receive: ", lengthof(v_pdu_receive))
+
+  v_ptc_j1939FrameReceiver.start(f_ptc_J1939FrameReceiverUntilExpectedMessage(
+      e_testbody2,     
+      c_name_source,
+      c_pgn_source,
+      c_addr_source,         /* p_j1939_addr_source */
+      c_pgn_destination,     /* p_peer_pgn */
+      c_addr_destination,    /* p_peer_addr */
+      c_name_destination,    /* p_peer_name */
+      v_pdu_receive          /* p_j1939_pdu_expected */))
+
+  var e_Phase v_phase
+
+  for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) {
+    f_startPhase(v_phase)
+    log("MTC: ", v_phase)
+    f_awaitEndPhase(v_phase)
+  }
+  
+  all component.done;
+  log("MTC done")
+
+  disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync)
+
+  all component.kill;      
+}
+
 //=========================================================================
 // Control
 //=========================================================================
diff --git a/demo/SocketCAN_Templates.ttcn b/demo/SocketCAN_Templates.ttcn
deleted file mode 100644
index 5ec6cfe..0000000
--- a/demo/SocketCAN_Templates.ttcn
+++ /dev/null
@@ -1,107 +0,0 @@
-/* Copyright (c) 2000-2019 Ericsson Telecom AB
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v2.0
-* which accompanies this distribution, and is available at
-* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
-*
-* Contributors:
-* Michael Josenhans
-******************************************************************************/
-//
-//  File:               SocketCANtest.ttcn
-//  Description:        SocketCAN port type test
-//
-
-
-module SocketCAN_Templates {
-
-import from SocketCAN_Types all;
-import from Bcm all
-import from Can all
-
-template SocketCAN_Result a_result(in SocketCAN_Result_code v_result_code) := {          
-  result_code   := v_result_code,
-  err           := *,
-  err_text      := *
-}
-
-template SocketCAN_socket_result 
-a_SocketCAN_socket_result(template SocketCAN_Result p_result) := {
-  id := ?, 
-  result := p_result
-}
-
-template SocketCAN_ioctl_result 
-a_SocketCAN_ioctl_result(template SocketCAN_Result p_result) := {
-  ifr := ?,
-  result := p_result
-}
-
-template SocketCAN_connect_result
-a_SocketCAN_connect_result(template SocketCAN_Result p_result) := {
-  result := p_result
-}
-
-template SocketCAN_bind_result
-a_SocketCAN_bind_result(template SocketCAN_Result p_result) := {
-  result := p_result
-}
-
-template SocketCAN_send_data_result
-a_SocketCAN_send_data_result(template SocketCAN_Result p_result) := {
-  result := p_result
-}
-
-template SocketCAN_write_data_result
-a_SocketCAN_write_data_result(template SocketCAN_Result p_result) := {
-  result := p_result
-}
-
-template SocketCAN_receive_CAN_or_CAN_FD_frame a_SocketCAN_receive_CAN_frame(
-  template SocketCAN_socketid p_id, 
-  template CAN_id p_can_id,
-  template CAN_PDU p_can_pdu) := { 
-  // recieved CAN frame
-  id        := p_id,
-  ifr       := ?,
-  frame     := {can_frame := {can_id := p_can_id, can_pdu := p_can_pdu}}, 
-  timestamp := ?
-}
-
-
-template SocketCAN_receive_CAN_or_CAN_FD_frame a_SocketCAN_receive_CAN_FD_frame(
-  template SocketCAN_socketid p_id, 
-  template CAN_id p_can_id,
-  template CAN_PDU p_can_pdu) := { 
-  // recieved CAN or CAN FD frame
-  id        := p_id,
-  ifr       := ?,
-  frame     := {canfd_frame := {can_id := p_can_id, can_pdu := p_can_pdu}}, 
-  timestamp := ?
-}
-
-template SocketCAN_receive_CAN_or_CAN_FD_frame a_SocketCAN_receive_CAN_or_CAN_FD_frame(
-  template SocketCAN_socketid p_id, 
-  template SocketCAN_CAN_or_CAN_FD_frame p_frame) := { 
-  // recieved CAN or CAN FD frame
-  id        := p_id,
-  ifr       := ?,
-  frame     := p_frame, 
-  timestamp := ?
-}
-
-template SocketCAN_receive_BCM_message a_SocketCAN_receive_BCM_message(
-  template SocketCAN_socketid p_id, 
-  template SocketCAN_bcm_frame p_frame) := { 
-  // recieved CAN or CAN FD frame
-  id        := p_id,
-  ifr       := ?,
-  frame     := p_frame
-}
-
-template SocketCAN_setsockopt_result
-a_SocketCAN_setsockopt_result(template SocketCAN_Result p_result) := {
-  result := p_result
-}
-
-}
\ No newline at end of file
diff --git a/demo/initscript.sh b/demo/initscript.sh
old mode 100755
new mode 100644
diff --git a/doc/README.md b/doc/README.md
deleted file mode 100644
index de9ee7f..0000000
--- a/doc/README.md
+++ /dev/null
@@ -1,144 +0,0 @@
-# titan.TestPorts.SocketCANasp

-

-Main project page:

-

-https://projects.eclipse.org/projects/tools.titan

-

-The source code of the TTCN-3 compiler and executor:

-

-https://github.com/eclipse/titan.core

-

-

-References:

-https://www.kernel.org/doc/Documentation/networking/can.txt

-

-Other useful documentation:

-https://docs.python.org/3/library/socket.html (search for: "AF_CAN")

-https://media.readthedocs.org/pdf/python-can/latest/python-can.pdf

-http%3A%2F%2Fwww.can-cia.de%2Ffileadmin%2Fresources%2Fdocuments%2Fproceedings%2F2012_hartkopp.pdf

-http://www.can-cia.de/fileadmin/resources/documents/proceedings/2012_hartkopp.pdf

-http://v2.can-newsletter.org/uploads/media/raw/46c15d02e1fdd3b04e671693ec548ff7.pdf

-

-# See file: demo/initscript.sh:

-

-#--------------------------------------

-#!/bin/bash

-

-

-# create a virtual can interface:

-

-sudo modprobe vcan

-sudo ip link add dev vcan0 type vcan

-sudo ip link set vcan0 up

-

-#!/bin/bash

-

-# Add vcan module to kernel

-sudo modprobe vcan

-

-# Setup of virtual can vcan0

-sudo ip link add dev vcan0 type vcan

-# set it up at as a canfd capable can interface

-sudo ip link set vcan0 mtu 72

-sudo ip link set vcan0 up

-

-# or create a physical can interface

-# sudo ip link set can0 up type can bitrate 1000000

-

-ip a

-

-#--------------------------------------

-

-cd src

-./demo/initscript.sh 

-

-or alternatively

-source demo/initscript.sh

-

-make clean; make

-

-ttcn3_start SocketCAN SocketCAN.cfg

-or 

-ttcn3_start SocketCAN CAN_matrix_test.cfg

-

-or to run a certain testcase:

-

-ttcn3_start SocketCAN SocketCAN.cfg  SocketCAN_RAW_test.tc_can_raw_send_and_receive_can_frame SocketCAN_RAW_test.tc_can_raw_setsockopt_CAN_RAW_FILTER

-

-Review the newly created log files in the src directory

-and use e.g. Wireshark to trace the CAN interfacce.

-

-#--------------------------------------

-Notes:

--Using multiple Test interfacces:

- Currently the init script sets up multiple virtual can interfaces ("vcan0", 

- "vcan1" in oder to allow using multiple CAN interfaces.

- The CAN interfaces have to be defined in the TTCN configuration files or may 

- alternatively be defined in the optional parameters of port messages commands 

- ioctl and send_data.

- 

- Handling of multiple CAN interfaces is work in progress and no test cases are

- provided. In order to configure usage with multiple test interfaces, 

- test interfaces for each interface have to be defined in the MTC.

- 

--CAN RAW:

- CAN FD has been implemented, however not been tested.

- Depending on the availability of the C-code #define "CAN_FD_FRAME"

- in /usr/include/linux/can/bcm.h, CAN-FD support is enabled at compile time.

- The RAW setsockopt has path coverage. However no test coverage that insures

- the setsockopt functionality provided by the kernel is working correctly. 

- For this purpose in the future might be added additional test cases.

-

--CAN BCM:

- TX_SETUP, TX_DELETE have been tested, TX_READ is known to fail test cases.

- Some tests have indicated, that that SocketCAN BCM does not support concurrently

- active BCM channels.

- The BCM has test coverage for TX_SETUP and TX_DELETE. However no test coverage

- that insures the BCM functionality provided by the kernel is working correctly. 

- For this purpose in the future might be added additional test cases.

- Return values other than the error code by the BCM are not yet supported.

- BCM wth CAN FD frames has not been tested yet.

-

--ISOTP:

- Iso TP functionality has been added, however currently no options like padding 

- are supported. Feel free to request needed options.

-

- First install the isotp kernel module as descibed here:

- https://github.com/hartkopp/can-isotp-modules

-  

-  ./make_isotp.sh

-  sudo insmod ./can-isotp.ko

- 

-

- There is an endlessly running test case: 

- ttcn3_start SocketCAN SocketCAN.cfg Isotptest.tc_Isotp_Example001

- 

--CAN J1939:

-Configure CAN J1939 as following (requires Kernel 5.4 and compiled with can-j1939 kernel module):

-sudo modprobe vcan

-sudo ip link add vcan0 type vcan

-sudo ip link set vcan0 up

-sudo modprobe can-j1939

-

-For the following test cases, the messages are so huge that screen output of the log file takes too long.

-Thus comment out as following the following lines in J1939.cfg:

-//FileMask := LOG_ALL | DEBUG | MATCHING

-//ConsoleMask := LOG_ALL | DEBUG | MATCHING

-

-ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_j1939_send_and_receive_can_frame

-ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_j1939_send_and_receive_can_frame_parallel

-

-Here above lines can be commented in:

-ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_f_j1939_address_claim

-ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_f_j1939_address_claim2

-

- 

--Merging of logfiles:

- To merge the logfies from multiple Parallel Test Componets (PTCs) from a

- single run in timely order into sigle file, run:

-   $TTCN3_DIR/bin/ttcn3_logmerge -o log_merged.txt *.log

- The merged log-file is found at log_merged.txt

- 

--Dumping CAN Frames using SocketCAN:

- To dump all received can frames of e.g. "vcan0" run a seperate terminal:

-   $ candump "vcan0"

diff --git a/src/J1939.ttcn b/src/J1939.ttcn
index be62538..6021cd8 100644
--- a/src/J1939.ttcn
+++ b/src/J1939.ttcn
@@ -11,9 +11,24 @@
 module J1939 {
 import from General_Types all;
 
+external function f_encode_J1939_name(in J1939_NAME pdu) return octetstring 
+with { extension "prototype(convert) encode(RAW)" }
+external function f_decode_J1939_name(in octetstring data) return J1939_NAME
+with { extension "prototype(convert) decode(RAW)" }
+
+external function f_encode_J1939_name_record(in J1939_NAME_RECORD pdu) return octetstring 
+with { extension "prototype(convert) encode(RAW)" }
+external function f_decode_J1939_name_record(in octetstring data) return J1939_NAME_RECORD
+with { extension "prototype(convert) decode(RAW)" }
+
+external function f_encode_J1939_name_record_reverse_byte_order(in J1939_NAME_RECORD_REVERSE_BYTE_ENCODING pdu) return octetstring 
+with { extension "prototype(convert) encode(RAW)" }
+external function f_decode_J1939_name_record_reverse_byte_order(in octetstring data) return J1939_NAME_RECORD_REVERSE_BYTE_ENCODING
+with { extension "prototype(convert) decode(RAW)" }
+
 const octetstring J1939_MAX_UNICAST_ADDR      := 'FD'O
 const octetstring J1939_IDLE_ADDR             := 'FE'O
-const octetstring J1939_NO_ADDR               := 'FF'O
+const octetstring J1939_NO_ADDR               := 'FF'O     /* == broadcast or no addr */
 const J1939_NAME  J1939_NO_NAME               := '0000000000000000'O
 const octetstring J1939_PGN_REQUEST           := '00ea00'O /* Request PG */
 const octetstring J1939_PGN_ADDRESS_CLAIMED   := '00ee00'O /* Address Claimed */
@@ -22,10 +37,78 @@
 const octetstring J1939_PGN_MAX               := '03ffff'O
 const octetstring J1939_NO_PGN                := '040000'O
 
+const octetstring c_pgn_VT2ECU      := '00E600'O // VT to ECU
+const octetstring c_pgn_ECU2VT      := '00E700'O // ECU to VT
+
+
+
+
 type OCT3       J1939_PGN 		  // max 0x3ffff
-type OCT8 		J1939_NAME
+type OCT8 		J1939_NAME  with {variant "BYTEORDER(last)"}
 type OCT1		J1939_ADDR
 
+type record J1939_NAME_RECORD{
+  J1939_ARBITRARY_ADDRESS_BIT       arbitraryAddresssBit,  // selfConfigurableAddressValue
+  J1939_INDUSTRY_GROUP              industryGroup,         // deviceClassInstanceValue 
+  J1939_VEHICLE_SYSTEM_INSTANCE     vehicleSystemInstance, // deviceClassInstanceValue
+  J1939_VEHICLE_SYSTEM              vehicleSystem,
+  J1939_RESERVED                    reserved,
+  J1939_FUNCTION                    function_,
+  J1939_FUNCTION_INSTANCE           functionInstance,
+  J1939_ECU_INSTANCE                ecuInstance,
+  J1939_MANUFACTURER_CODE           manufacturerCode,
+  J1939_IDENTITY_NUMBER             identityNumber
+} with { variant "FIELDORDER(msb)" 
+  variant (identityNumber) "BYTEORDER(last)"
+  variant (manufacturerCode) "BYTEORDER(last)" 
+}
+
+type record J1939_NAME_RECORD_REVERSE_BYTE_ENCODING{
+  J1939_IDENTITY_NUMBER             identityNumber,
+  J1939_MANUFACTURER_CODE           manufacturerCode,
+  J1939_ECU_INSTANCE                ecuInstance,
+  J1939_FUNCTION_INSTANCE           functionInstance,
+  J1939_FUNCTION                    function_,
+  J1939_RESERVED                    reserved,
+  J1939_VEHICLE_SYSTEM              vehicleSystem,
+  J1939_VEHICLE_SYSTEM_INSTANCE     vehicleSystemInstance, // deviceClassInstanceValue
+  J1939_INDUSTRY_GROUP              industryGroup,         // deviceClassInstanceValue 
+  J1939_ARBITRARY_ADDRESS_BIT       arbitraryAddresssBit   // selfConfigurableAddressValue
+}  with { variant "FIELDORDER(lsb)"  /* it has no effect here, added for visibility only */ 
+
+  variant (identityNumber) "BYTEORDER(first)"
+  variant (manufacturerCode) "BYTEORDER(first)" 
+  /* the following variants are not needed:  
+  variant (ecuInstance) "BYTEORDER(first)"    
+  variant (functionInstance) "BYTEORDER(first)"
+  variant (function_) "BYTEORDER(first)"
+  variant (reserved) "BYTEORDER(first)"
+  variant (vehicleSystem) "BYTEORDER(first)"
+  variant (vehicleSystemInstance) "BYTEORDER(first)"
+  variant (industryGroup) "BYTEORDER(first)"
+  variant (arbitraryAddresssBit) "BYTEORDER(first)"
+  */
+}
+
+type	INT1BIT		J1939_ARBITRARY_ADDRESS_BIT
+type	INT3BIT		J1939_INDUSTRY_GROUP
+type	INT4BIT		J1939_VEHICLE_SYSTEM_INSTANCE
+type	INT7BIT		J1939_VEHICLE_SYSTEM
+type	INT1BIT		J1939_RESERVED
+type	INT8BIT		J1939_FUNCTION
+type	INT5BIT		J1939_FUNCTION_INSTANCE
+type	INT3BIT		J1939_ECU_INSTANCE
+type	INT11BIT	J1939_MANUFACTURER_CODE
+type	INT21BIT	J1939_IDENTITY_NUMBER
+
+type integer INT1BIT 	(0..1)          with { variant "FIELDLENGTH(1)"}		           // 2^1-1
+type integer INT3BIT 	(0..7)          with { variant "FIELDLENGTH(3)"}                   // 2^3-1
+type integer INT4BIT 	(0..15)         with { variant "FIELDLENGTH(4)"}                   // 2^4-1
+type integer INT5BIT 	(0..31)         with { variant "FIELDLENGTH(5)"}                   // 2^5-1
+type integer INT7BIT    (0..127)        with { variant "FIELDLENGTH(7)"}                   // 2^7-1
+type integer INT8BIT 	(0..255)        with { variant "FIELDLENGTH(8)"}                   // 2^8-1
+type integer INT11BIT 	(0..2047)       with { variant "FIELDLENGTH(11),BYTEORDER(last)"}  // 2^11-1
+type integer INT21BIT 	(0..2097151)    with { variant "FIELDLENGTH(21),BYTEORDER(last)"}  // 2^21-1
 
 type integer J1939_Priority (0..7)
 
@@ -39,6 +122,6 @@
   J1939_PGN			               pgn optional,
   //			 * 1 byte address *
   J1939_ADDR			           addr optional
-}
+} with { variant "" }
 
-}
+} with { encode "RAW" } 
diff --git a/src/SocketCAN_PT.cc b/src/SocketCAN_PT.cc
index 69f6c42..5208cb6 100644
--- a/src/SocketCAN_PT.cc
+++ b/src/SocketCAN_PT.cc
@@ -49,6 +49,7 @@
 #include <cstddef>
 #include <cstring>
 #include <iostream>
+#include <openssl/bn.h>
 
 struct bcm_msg_head;
 struct can_frame;
@@ -180,8 +181,20 @@
 				nbytes = recvfrom(sock, msg, J1939_RECIEVE_BUFSIZE, 0,
 						(struct sockaddr*) &addr, &addr_len);
 
+				BIGNUM* bn = BN_new();
+				BN_add_word(bn, (BN_ULONG)(addr.can_addr.j1939.name / ULONG_MAX));
+				BN_add_word(bn, (BN_ULONG)(addr.can_addr.j1939.name % ULONG_MAX));
+				int_val_t ival(bn);
+				INTEGER tmp;
+				tmp.set_val(ival);
+
+
 				//nbytes = read(sock, msg, J1939_RECIEVE_BUFSIZE);
 				if (nbytes > 0 && nbytes < J1939_RECIEVE_BUFSIZE) {
+					log("SocketCAN: Received j1939 message addr %x, name %llx, pgn %x",
+							addr.can_addr.j1939.addr,
+							addr.can_addr.j1939.name,
+							addr.can_addr.j1939.pgn);
 					struct ifreq ifr;
 					ifr.ifr_ifindex = addr.can_ifindex;
 					parameters.ifr().if__index() = ifr.ifr_ifindex;
@@ -189,9 +202,10 @@
 					parameters.id() = a;
 					parameters.pdu() = OCTETSTRING(nbytes, msg);
 					parameters.pgn() = int2oct(addr.can_addr.j1939.pgn, 3);
-					parameters.name() = int2oct(addr.can_addr.j1939.name, 8);
+					parameters.name() = int2oct(tmp, 8);
 					parameters.destAddr() = int2oct(addr.can_addr.j1939.addr,
 							1);
+
 					incoming_message(parameters);
 				}
 				delete[] msg;
@@ -856,7 +870,13 @@
 	log("entering SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__bind)");
 
 	int sock;
-	struct sockaddr_can addr = { };
+	struct sockaddr_can addr =	{};
+
+	addr.can_family = AF_CAN;
+	addr.can_addr.j1939.addr = J1939_NO_ADDR;
+	addr.can_addr.j1939.name = J1939_NO_NAME;
+	addr.can_addr.j1939.pgn = J1939_NO_PGN;
+
 	int cn = send_par.id();
 	int res;
 	SocketCAN__Types::SocketCAN__bind__result result;
@@ -1327,9 +1347,11 @@
 		nrOfBytestoSend = send_par.pdu().lengthof();
 		nrOfBytesRemaining = nrOfBytestoSend;
 		do {
+			log("SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to):Sending of remaining of bytes %ld", nrOfBytesRemaining);
 			nrOfBytesSent = sendto(sock, (const void*)((const unsigned char*)send_par.pdu()+nrOfBytestoSend-nrOfBytesRemaining),
 					nrOfBytesRemaining, 0, (struct sockaddr*) &destaddr, sizeof(destaddr));
 			nrOfBytesRemaining = nrOfBytesRemaining - nrOfBytesSent;
+			log("SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to):Sent bytes %d, remaining of bytes %ld", nrOfBytesSent, nrOfBytesRemaining);
 		} while ((nrOfBytesSent >= 0) and (nrOfBytesRemaining != 0));
 
 		log(
@@ -1361,15 +1383,15 @@
 
 		log("SocketCAN: Nr of bytes sent = %ld", nrOfBytesSent);
 	} else {
-		TTCN_error("SocketCAN: Unknown socket reference: %d \n", cn);
 		result.result().result__code() =
 				SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
 		result.result().err() = OMIT_VALUE;
 		result.result().err__text() = "Unknown socket reference";
+		TTCN_error("SocketCAN: Unknown socket reference: %d \n", cn);
 	}
+	log("Creating incoming message for SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to)");
 	incoming_message(result);
-	log(
-			"leaving SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to)");
+	log("leaving SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to)");
 #else // CANJ1939_SUPPORT
 	TTCN_error("SocketCAN: CAN J1939 is not supported by your current kernel error");
 #endif // CANJ1939_SUPPORT
diff --git a/src/SocketCAN_Templates.ttcn b/src/SocketCAN_Templates.ttcn
index 57616a7..a5901e6 100644
--- a/src/SocketCAN_Templates.ttcn
+++ b/src/SocketCAN_Templates.ttcn
@@ -20,7 +20,7 @@
 import from Can all
 import from J1939 all
 
-template SocketCAN_Result a_result(in SocketCAN_Result_code v_result_code) := {          
+template SocketCAN_Result a_result(template SocketCAN_Result_code v_result_code) := {          
   result_code   := v_result_code,
   err           := *,
   err_text      := *