diff --git a/doc/tech_report.tex b/doc/tech_report.tex
index 561d69a0ac4d9437c826735f71b919a3ca04464f..7e9d6a86bb2f4c57740b665a15bbe036b060ce21 100644
--- a/doc/tech_report.tex
+++ b/doc/tech_report.tex
@@ -169,6 +169,22 @@ language covering most common use-cases.
   sample string a_string;
 \end{verbatim}
 
+\subsection{The void type}
+
+There is a type, \verb+void+, which can be used to send
+a sample that contains no data. 
+
+\begin{verbatim}
+typedef void an_empty_type;
+
+sample an_empty_type no_data1;
+sample void no_data2;
+\end{verbatim}
+
+\verb+void+ type can may not be used as a field in a struct or
+the element type of an array.
+
+
 \subsection{Arrays}
 
 \begin{verbatim}
@@ -198,7 +214,46 @@ only arrays of arrays.
   } a_struct;
 \end{verbatim}
 
-\section{User defined types}
+\subsection{Sample type refereces}
+
+In addition to the primitive types, a sample may contain
+a reference to a sample type. References are declared using
+the \verb+sample+ keyword.
+
+Examples:
+
+\begin{verbatim}
+sample sample a_ref;
+
+sample sample ref_list[4];
+
+sample struct { 
+    sample ref1;
+    sample ref2;
+    int x;
+    int y;
+} refs_and_ints;
+\end{verbatim}
+
+Sample references are need to be registered on both encoder and decoder
+side, using the functions
+
+\begin{verbatim}
+int labcomm_decoder_sample_ref_register(
+    struct labcomm_decoder *decoder\nonumber
+    const struct labcomm_signature *signature);
+
+int labcomm_encoder_sample_ref_register(
+    struct labcomm_encoder *encoder\nonumber
+    const struct labcomm_signature *signature);
+\end{verbatim}
+
+The value of an unregistered sample reference will be decoded as \verb+null+.
+
+\subsection{User defined types}
+
+User defined types are declared with the \verb+typedef+ reserved word,
+and can then be used in type and sample declarations.
 
 \begin{verbatim}
   typedef struct {
@@ -469,6 +524,7 @@ Field ::= Type <Name:String>;
 
 abstract Type;
 VoidType          : Type;
+SampleRefType     : Type;
 PrimType          : Type ::= <Name:String> <Token:int>;
 UserType          : Type ::= <Name:String>;
 StructType        : Type ::= Field*;
@@ -526,42 +582,50 @@ The built-in data types are encoded as follows:
 \subsection{Protocol grammar}
 \label{sec:ConcreteGrammar}
 \begin{lstlisting}[basicstyle=\footnotesize\ttfamily]
-<packet>       := <id> <length> ( <version>      | 
-                                  <type_decl>    | 
-                                  <sample_decl>  |
-                                  <type_binding> |
-                                  <sample_data> )
-<version>      := <string>
-<sample_decl>  := <sample_id> <string> <type>
-<type_decl>    := <type_id> <string> <type>
-<type_binding> := <sample_id> <type_id>
-<user_id>      := 0x40..0xffffffff  
+<packet>          := <id> <length> ( <version>      | 
+                                     <type_decl>    | 
+                                     <sample_decl>  |
+                                     <sample_ref>   |
+                                     <type_binding> |
+                                     <sample_data> )
+<version>         := <string>
+<sample_decl>     := <sample_id> <string> <type>
+<sample_ref>      := <sample_id> <string> <type>
+<type_decl>       := <type_id> <string> <type>
+<type_binding>    := <sample_id> <type_id>
+<user_id>         := 0x40..0xffffffff  
 <sample_id> : <user_id>
 <type_id>   : <user_id>
-<string>       := <string_length> <char>*
-<string_length>:= 0x00..0xffffffff  
-<char>         := any UTF-8 char
-<type>         := <length> ( <basic_type> | <array_decl> | <struct_decl> | <type_id> )
-<basic_type>   := ( <boolean_type> | <byte_type> | <short_type> |
-                  <integer_type> | <long_type> | <float_type> |
-                  <double_type> | <string_type> )
-<boolean_type> := 0x20 
-<byte_type>    := 0x21 
-<short_type>   := 0x22 
-<integer_type> := 0x23 
-<long_type>    := 0x24 
-<float_type>   := 0x25 
-<double_type>  := 0x26 
-<string_type>  := 0x27 
-<array_decl>   := 0x10  <number_of_indices> <indices> <type>
-<number_of_indices> := 0x00..0xffffffff  
-<indices>      := ( <variable_index> | <fixed_index> )*
-<variable_index> := 0x00  
-<fixed_index>  := 0x01..0xffffffff  
-<struct_decl>  := 0x11  <number_of_fields> <field>*
-<number_of_fields> := 0x00..0xffffffff  
-<field>        := <string> <type>
-<sample_data>  := packed sample data sent in network order, with
+<string>          := <string_length> <char>*
+<string_length>   := 0x00..0xffffffff  
+<char>            := any UTF-8 char
+<type>            := <length> ( <basic_type>  | 
+                                <array_decl>  | 
+                                <struct_decl> | 
+                                <type_id> )
+<basic_type>      := ( <void_type> | <boolean_type> | <byte_type> | <short_type> |
+                     <integer_type> | <long_type> | <float_type> |
+                     <double_type> | <string_type> | <sample_ref_type>)
+
+<void_type>       := <struct_decl> 0 //void is encoded as empty struct
+<boolean_type>    := 0x20 
+<byte_type>       := 0x21 
+<short_type>      := 0x22 
+<integer_type>    := 0x23 
+<long_type>       := 0x24 
+<float_type>      := 0x25 
+<double_type>     := 0x26 
+<string_type>     := 0x27 
+<sample_ref_type> := 0x28 
+<array_decl>      := 0x10  <nbr_of_indices> <indices> <type>
+<nbr_of_indices>  := 0x00..0xffffffff  
+<indices>         := ( <variable_index> | <fixed_index> )*
+<variable_index>  := 0x00  
+<fixed_index>     := 0x01..0xffffffff  
+<struct_decl>     := 0x11  <nbr_of_fields> <field>*
+<nbr_of_fields>   := 0x00..0xffffffff  
+<field>           := <string> <type>
+<sample_data>     := packed sample data sent in network order, with
                   primitive type elements encoded according to
                   the sizes above
 \end{lstlisting}
@@ -571,8 +635,9 @@ The labcomm sytem packet ids are:
 \begin{lstlisting}[basicstyle=\footnotesize\ttfamily]
 version:      0x01 
 sample_decl:  0x02 
-type_decl:    0x03 
-type_binding: 0x04          
+sample_ref:   0x03 
+type_decl:    0x04 
+type_binding: 0x05          
 \end{lstlisting}
 Note that since the signature transmitted in a \verb+<sample_def>+ is
 flattened, the \verb+<type>+ transmitted in a \verb+<sample_def>+ may
diff --git a/lib/python/labcomm/LabComm.py b/lib/python/labcomm/LabComm.py
index b3b6dd6d8acef3124588fc0811bb97bab380e1eb..3816c0f834cf6da92928a85cc6ee2caa868988bf 100644
--- a/lib/python/labcomm/LabComm.py
+++ b/lib/python/labcomm/LabComm.py
@@ -29,11 +29,29 @@
 #   | ...
 #   +----+--
 #
+# LabComm2014 SAMPLE_REF:
+#
+#   +----+----+----+----+
+#   | id = 0x03             (packed32)
+#   +----+----+----+----+
+#   | length                (packed32)
+#   +----+----+----+----+
+#   | type number           (packed32)
+#   +----+----+----+----+
+#   | type name (UTF8)
+#   | ...
+#   +----+----+----+----+
+#   | signature length      (packed32)
+#   +----+----+----+----+
+#   | type signature
+#   | ...
+#   +----+--
+#
 # LabComm2014 TYPE_DEF: (as SAMPLE_DEF, but signatures are hierarchical,
 #                         i.e., may contain references to other types
 #
 #   +----+----+----+----+
-#   | id = 0x03             (packed32)
+#   | id = 0x04             (packed32)
 #   +----+----+----+----+
 #   | length                (packed32)
 #   +----+----+----+----+
@@ -51,7 +69,7 @@
 # LabComm2014 TYPE_BINDING
 #
 #   +----+----+----+----+
-#   | id = 0x04             (packed32)
+#   | id = 0x05             (packed32)
 #   +----+----+----+----+
 #   | length                (packed32)
 #   +----+----+----+----+