diff --git a/HTTP2_CNL113851.tpd b/HTTP2_CNL113851.tpd
new file mode 100644
index 0000000..a66c8d9
--- /dev/null
+++ b/HTTP2_CNL113851.tpd
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2017 Ericsson
+
+  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
+
+
+   File:               HTTP2_CNL113851.tpd
+   Description:        tpd project file
+   Rev:                R1A
+   Prodnr:             CNL 113 851
+
+ -->
+<TITAN_Project_File_Information version="1.0">
+  <ProjectName>HTTP2_CNL113851</ProjectName>
+  <Folders>
+    <FolderResource projectRelativePath="src" relativeURI="src"/>
+  </Folders>
+  <Files>
+    <FileResource projectRelativePath="src/HTTP2_EncDec.cc" relativeURI="src/HTTP2_EncDec.cc"/>
+    <FileResource projectRelativePath="src/HTTP2_Types.ttcn" relativeURI="src/HTTP2_Types.ttcn"/>
+  </Files>
+  <ActiveConfiguration>Default</ActiveConfiguration>
+  <Configurations>
+    <Configuration name="Default">
+      <ProjectProperties>
+        <MakefileSettings>
+          <generateInternalMakefile>true</generateInternalMakefile>
+          <GNUMake>true</GNUMake>
+          <incrementalDependencyRefresh>true</incrementalDependencyRefresh>
+          <targetExecutable>bin/HTTP2_CNL113851</targetExecutable>
+        </MakefileSettings>
+        <LocalBuildSettings>
+          <workingDirectory>bin</workingDirectory>
+        </LocalBuildSettings>
+      </ProjectProperties>
+    </Configuration>
+  </Configurations>
+</TITAN_Project_File_Information>
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..d8acd44
--- /dev/null
+++ b/README.md
@@ -0,0 +1,9 @@
+# titan.ProtocolModules.HTTP2
+
+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
diff --git a/doc/HTTP2_CNL113851_1551.doc b/doc/HTTP2_CNL113851_1551.doc
new file mode 100644
index 0000000..9d532f1
--- /dev/null
+++ b/doc/HTTP2_CNL113851_1551.doc
Binary files differ
diff --git a/doc/HTTP2_CNL113851_PRI.doc b/doc/HTTP2_CNL113851_PRI.doc
new file mode 100644
index 0000000..6526631
--- /dev/null
+++ b/doc/HTTP2_CNL113851_PRI.doc
Binary files differ
diff --git a/src/HTTP2_EncDec.cc b/src/HTTP2_EncDec.cc
new file mode 100644
index 0000000..df739c8
--- /dev/null
+++ b/src/HTTP2_EncDec.cc
@@ -0,0 +1,1928 @@
+/******************************************************************************
+* Copyright (c) 2017  Ericsson 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:
+*   Gabor Szalai - initial implementation and initial documentation
+******************************************************************************/
+//
+//  File:               HTTP2_EncDec.cc
+//  Description:        Encoder/decoder function for HTTP2 
+//  Rev:                R1A
+//  Prodnr:             CNL 113 851
+
+
+#include "HTTP2_Types.hh"
+#include <stdint.h>
+#include "memory.h"
+#include <string.h>
+#include <stdio.h>
+#include <deque>
+
+// header compression context classes
+class HTTP2_hdr_data{
+public:
+  CHARSTRING   name;
+  CHARSTRING   value;
+  int          size;
+
+  HTTP2_hdr_data(){
+    name="";
+    value="";
+    size=32;
+  };
+  HTTP2_hdr_data(const CHARSTRING& p_name, const CHARSTRING& p_value){
+    name=p_name;
+    value=p_value;
+    size=32+name.lengthof()+value.lengthof();
+  };
+  ~HTTP2_hdr_data(){};
+
+   void set(const CHARSTRING& p_name, const CHARSTRING& p_value){
+    name=p_name;
+    value=p_value;
+    size=32+name.lengthof()+value.lengthof();
+  }
+  
+};
+
+
+class HTTP2_compression_ctx{
+public:
+  std::deque<HTTP2_hdr_data*> h_table;
+  int h_table_size;
+  int h_table_max_size;
+  
+  HTTP2_compression_ctx(){
+    h_table_size=0;
+    h_table_max_size=4096;
+  };
+  HTTP2_compression_ctx(int max_size){
+    h_table_size=0;
+    h_table_max_size=max_size;
+  };
+  
+  ~HTTP2_compression_ctx(){
+    std::deque<HTTP2_hdr_data*>::iterator it = h_table.begin();
+    while(it!=h_table.end()){
+      delete *it;
+      it++;
+    }
+  };
+  
+  void set_max_size(int new_size){
+    while(new_size<h_table_size){
+      h_table_size-= h_table.back()->size;
+      delete h_table.back();
+      h_table.pop_back();
+    }
+    h_table_max_size=new_size;
+  };
+  
+  void add_hdr(const CHARSTRING& p_name, const CHARSTRING& p_value){
+    HTTP2_hdr_data *hdata= new HTTP2_hdr_data(p_name,p_value);
+    h_table.push_front(hdata);
+    h_table_size+=hdata->size;
+    while(h_table_max_size<h_table_size){
+      h_table_size-= h_table.back()->size;
+      delete h_table.back();
+      h_table.pop_back();
+    };
+    
+  };
+  
+  int find(const CHARSTRING& p_name) const {
+    for(size_t i=0;i<h_table.size();i++){
+      if(h_table[i]->name==p_name){
+        return i+1;
+      }
+    }
+    return -1;
+  };
+  int find(const CHARSTRING& p_name,  const CHARSTRING& p_value) const {
+    for(size_t i=0;i<h_table.size();i++){
+      if( (h_table[i]->name==p_name) && (h_table[i]->value==p_value) ){
+        return i+1;
+      }
+    }
+    return -1;
+  };
+  
+  const HTTP2_hdr_data* operator[](int idx) const{
+    if( (idx>0) && (idx<=(int)h_table.size()) ){
+      return h_table[idx-1];
+    }
+    return NULL;
+  };
+
+};
+
+class HTTP2_compression_ctxs{
+public:
+  HTTP2_compression_ctx local;
+  HTTP2_compression_ctx remote;
+  
+};
+
+class HTTP2_static_table_class{
+public:
+  HTTP2_compression_ctx ctx;
+  HTTP2_static_table_class(){
+    ctx.add_hdr("www-authenticate","");
+    ctx.add_hdr("via","");
+    ctx.add_hdr("vary","");
+    ctx.add_hdr("user-agent","");
+    ctx.add_hdr("transfer-encoding","");
+    ctx.add_hdr("strict-transport-security","");
+    ctx.add_hdr("set-cookie","");
+    ctx.add_hdr("server","");
+    ctx.add_hdr("retry-after","");
+    ctx.add_hdr("refresh","");
+    ctx.add_hdr("referer","");
+    ctx.add_hdr("range","");
+    ctx.add_hdr("proxy-authorization","");
+    ctx.add_hdr("proxy-authenticate","");
+    ctx.add_hdr("max-forwards","");
+    ctx.add_hdr("location","");
+    ctx.add_hdr("link","");
+    ctx.add_hdr("last-modified","");
+    ctx.add_hdr("if-unmodified-since","");
+    ctx.add_hdr("if-range","");
+    ctx.add_hdr("if-none-match","");
+    ctx.add_hdr("if-modified-since","");
+    ctx.add_hdr("if-match","");
+    ctx.add_hdr("host","");
+    ctx.add_hdr("from","");
+    ctx.add_hdr("expires","");
+    ctx.add_hdr("expect","");
+    ctx.add_hdr("etag","");
+    ctx.add_hdr("date","");
+    ctx.add_hdr("cookie","");
+    ctx.add_hdr("content-type","");
+    ctx.add_hdr("content-range","");
+    ctx.add_hdr("content-location","");
+    ctx.add_hdr("content-length","");
+    ctx.add_hdr("content-language","");
+    ctx.add_hdr("content-encoding","");
+    ctx.add_hdr("content-disposition","");
+    ctx.add_hdr("cache-control","");
+    ctx.add_hdr("authorization","");
+    ctx.add_hdr("allow","");
+    ctx.add_hdr("age","");
+    ctx.add_hdr("access-control-allow-origin","");
+    ctx.add_hdr("accept","");
+    ctx.add_hdr("accept-ranges","");
+    ctx.add_hdr("accept-language","");
+    ctx.add_hdr("accept-encoding","gzip, deflate");
+    ctx.add_hdr("accept-charset","");
+    ctx.add_hdr(":status","500");
+    ctx.add_hdr(":status","404");
+    ctx.add_hdr(":status","400");
+    ctx.add_hdr(":status","304");
+    ctx.add_hdr(":status","206");
+    ctx.add_hdr(":status","204");
+    ctx.add_hdr(":status","200");
+    ctx.add_hdr(":scheme","https");
+    ctx.add_hdr(":scheme","http");
+    ctx.add_hdr(":path","/index.html");
+    ctx.add_hdr(":path","/");
+    ctx.add_hdr(":method","POST");
+    ctx.add_hdr(":method","GET");
+    ctx.add_hdr(":authority","");
+  }
+};
+
+static const HTTP2_static_table_class HTTP2_static_table=HTTP2_static_table_class();
+
+////// Indexed variable int representation functions
+//  Support max 32 bit unsigned val
+//  it means the buffer should be at least 6 octet to safely store the max value 
+//  with the minimal prefix
+
+static const unsigned char twoN_minus_one_table[]={  // stores 2^N-1 for N=0..8
+0,1,3,7,15,31,63,127,255
+};
+
+// return the number of used octets
+static int encode_integer(unsigned char* buff,
+                          const uint32_t  val,
+                          const int prefix_len,
+                          const unsigned char filler){  // only the filler bits should be set
+  int ret_val=0;
+  if(val< twoN_minus_one_table[prefix_len]){
+     // fits in one octet
+     buff[0]= filler | (val & 0xFF);
+     ret_val=1;
+  } else {
+    uint32_t act_val=val-twoN_minus_one_table[prefix_len];
+    buff[0]= filler | ( twoN_minus_one_table[prefix_len] & 0xFF);
+    ret_val=1;
+    while(act_val>127){
+      buff[ret_val]= 0x80 | (act_val%128);
+      act_val/=128;
+      ret_val++;
+    }
+    buff[ret_val]= act_val;
+    ret_val++;
+  }
+  return ret_val;
+}
+
+// returns the number of the used octets
+static int decode_integer(const unsigned char* buff,
+                          uint32_t&  val,
+                          const int prefix_len,
+                          unsigned char& filler){  // only the filler bits will be set
+  filler = buff[0] & ~twoN_minus_one_table[prefix_len];
+  
+  val = buff[0] & twoN_minus_one_table[prefix_len];
+
+  int ret_val=0;
+  if(val==twoN_minus_one_table[prefix_len]){
+    // The value is not fit into the prefix_len bits
+    do {
+      ret_val++;
+      val += (  ((uint32_t)(buff[ret_val] & 0x7F)) << (7*ret_val) );
+    } while(buff[ret_val] & 0x80);
+    ret_val++;
+  } else {
+    ret_val=1;
+  }
+  return ret_val;
+}
+
+
+
+
+
+//////////// Huffman tables See RFC7541
+
+// Huffman code lengths in bits
+
+static const int huffman_code_length[]={
+ 13, 23, 28, 28, 28, 28, 28, 28, 28, 24, 30, 28, 28, 30, 28, 28,
+ 28, 28, 28, 28, 28, 28, 30, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+  6, 10, 10, 12, 13,  6,  8, 11, 10, 10,  8, 11,  8,  6,  6,  6,
+  5,  5,  5,  6,  6,  6,  6,  6,  6,  6,  7,  8, 15,  6, 12, 10,
+ 13,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+  7,  7,  7,  7,  7,  7,  7,  7,  8,  7,  8, 13, 19, 13, 14,  6,
+ 15,  5,  6,  5,  6,  5,  6,  6,  6,  5,  7,  7,  6,  6,  6,  5,
+  6,  7,  6,  5,  5,  6,  7,  7,  7,  7,  7, 15, 11, 14, 13, 28,
+ 20, 22, 20, 20, 22, 22, 22, 23, 22, 23, 23, 23, 23, 23, 24, 23,
+ 24, 24, 22, 23, 24, 23, 23, 23, 23, 21, 22, 23, 22, 23, 23, 24,
+ 22, 21, 20, 22, 22, 23, 23, 21, 23, 22, 22, 24, 21, 22, 23, 23,
+ 21, 21, 22, 21, 23, 22, 23, 23, 20, 22, 22, 22, 23, 22, 22, 23,
+ 26, 26, 20, 19, 22, 23, 22, 25, 26, 26, 26, 27, 27, 26, 24, 25,
+ 19, 21, 26, 27, 27, 26, 27, 24, 21, 21, 26, 26, 28, 27, 27, 27,
+ 20, 24, 20, 21, 22, 21, 21, 23, 22, 22, 25, 25, 24, 24, 26, 23,
+ 26, 27, 26, 26, 27, 27, 27, 27, 27, 28, 27, 27, 27, 27, 27, 26,
+ 30
+};
+
+static const unsigned int huffman_code_values[]={
+     0x1ff8,   0x7fffd8,  0xfffffe2,  0xfffffe3,  0xfffffe4,  0xfffffe5,  0xfffffe6,  0xfffffe7,  0xfffffe8,   0xffffea, 0x3ffffffc,  0xfffffe9,  0xfffffea, 0x3ffffffd,  0xfffffeb,  0xfffffec,
+  0xfffffed,  0xfffffee,  0xfffffef,  0xffffff0,  0xffffff1,  0xffffff2, 0x3ffffffe,  0xffffff3,  0xffffff4,  0xffffff5,  0xffffff6,  0xffffff7,  0xffffff8,  0xffffff9,  0xffffffa,  0xffffffb,
+       0x14,      0x3f8,      0x3f9,      0xffa,     0x1ff9,       0x15,       0xf8,      0x7fa,      0x3fa,      0x3fb,       0xf9,      0x7fb,       0xfa,       0x16,       0x17,       0x18,
+        0x0,        0x1,        0x2,       0x19,       0x1a,       0x1b,       0x1c,       0x1d,       0x1e,       0x1f,       0x5c,       0xfb,     0x7ffc,       0x20,      0xffb,      0x3fc,
+     0x1ffa,       0x21,       0x5d,       0x5e,       0x5f,       0x60,       0x61,       0x62,       0x63,       0x64,       0x65,       0x66,       0x67,       0x68,       0x69,       0x6a,
+       0x6b,       0x6c,       0x6d,       0x6e,       0x6f,       0x70,       0x71,       0x72,       0xfc,       0x73,       0xfd,     0x1ffb,    0x7fff0,     0x1ffc,     0x3ffc,       0x22,
+     0x7ffd,        0x3,       0x23,        0x4,       0x24,        0x5,       0x25,       0x26,       0x27,        0x6,       0x74,       0x75,       0x28,       0x29,       0x2a,        0x7,
+       0x2b,       0x76,       0x2c,        0x8,        0x9,       0x2d,       0x77,       0x78,       0x79,       0x7a,       0x7b,     0x7ffe,      0x7fc,     0x3ffd,     0x1ffd,  0xffffffc,
+    0xfffe6,   0x3fffd2,    0xfffe7,    0xfffe8,   0x3fffd3,   0x3fffd4,   0x3fffd5,   0x7fffd9,   0x3fffd6,   0x7fffda,   0x7fffdb,   0x7fffdc,   0x7fffdd,   0x7fffde,   0xffffeb,   0x7fffdf,
+   0xffffec,   0xffffed,   0x3fffd7,   0x7fffe0,   0xffffee,   0x7fffe1,   0x7fffe2,   0x7fffe3,   0x7fffe4,   0x1fffdc,   0x3fffd8,   0x7fffe5,   0x3fffd9,   0x7fffe6,   0x7fffe7,   0xffffef,
+   0x3fffda,   0x1fffdd,    0xfffe9,   0x3fffdb,   0x3fffdc,   0x7fffe8,   0x7fffe9,   0x1fffde,   0x7fffea,   0x3fffdd,   0x3fffde,   0xfffff0,   0x1fffdf,   0x3fffdf,   0x7fffeb,   0x7fffec,
+   0x1fffe0,   0x1fffe1,   0x3fffe0,   0x1fffe2,   0x7fffed,   0x3fffe1,   0x7fffee,   0x7fffef,    0xfffea,   0x3fffe2,   0x3fffe3,   0x3fffe4,   0x7ffff0,   0x3fffe5,   0x3fffe6,   0x7ffff1,
+  0x3ffffe0,  0x3ffffe1,    0xfffeb,    0x7fff1,   0x3fffe7,   0x7ffff2,   0x3fffe8,  0x1ffffec,  0x3ffffe2,  0x3ffffe3,  0x3ffffe4,  0x7ffffde,  0x7ffffdf,  0x3ffffe5,   0xfffff1,  0x1ffffed,
+    0x7fff2,   0x1fffe3,  0x3ffffe6,  0x7ffffe0,  0x7ffffe1,  0x3ffffe7,  0x7ffffe2,   0xfffff2,   0x1fffe4,   0x1fffe5,  0x3ffffe8,  0x3ffffe9,  0xffffffd,  0x7ffffe3,  0x7ffffe4,  0x7ffffe5,
+    0xfffec,   0xfffff3,    0xfffed,   0x1fffe6,   0x3fffe9,   0x1fffe7,   0x1fffe8,   0x7ffff3,   0x3fffea,   0x3fffeb,  0x1ffffee,  0x1ffffef,   0xfffff4,   0xfffff5,  0x3ffffea,   0x7ffff4,
+  0x3ffffeb,  0x7ffffe6,  0x3ffffec,  0x3ffffed,  0x7ffffe7,  0x7ffffe8,  0x7ffffe9,  0x7ffffea,  0x7ffffeb,  0xffffffe,  0x7ffffec,  0x7ffffed,  0x7ffffee,  0x7ffffef,  0x7fffff0,  0x3ffffee,
+ 0x3fffffff
+};
+
+
+// inserts the huffman code of one character into teh buffer
+static void put_code2buff(unsigned char* buff, int& bitpos, unsigned char code){
+  int code_len = huffman_code_length[code];
+  int bitpos_in_octet = bitpos%8;
+  
+  // moves to the first bit of the huffman code to the insertion point
+  int shift=  (16-bitpos_in_octet-(code_len%8))%8;
+  uint64_t ins_val= ((uint64_t)huffman_code_values[code]) << shift;
+  
+  
+  buff+= bitpos/8;
+  for(int i=((code_len+shift+7)/8)-1;i>=0;i--)  {
+    if(i==0){
+      buff[i] |= (ins_val & 0xFF);
+    } else {
+      buff[i] = (ins_val & 0xFF);
+    }
+    ins_val >>= 8;
+  }
+  bitpos+=code_len;
+}
+
+static const unsigned char get_mask_table[]={
+0x80, 0x40, 0x20, 0x10,
+0x08, 0x04, 0x02, 0x01
+};
+
+static int get_onebit(const unsigned char* buff, int& bitpos){
+  if(buff[bitpos/8] & get_mask_table[bitpos%8]){
+    bitpos++;
+    return 1;
+  }
+  bitpos++;
+  return 0;
+}
+
+// return -1 or the char code or the EOF (256)
+static int decompress_one_char(const unsigned char* buff, int& bitpos, int length /*in bits*/ ){
+  unsigned int huffman_val=0;
+  
+  if((bitpos+5)>length){
+    while(bitpos<length){
+      if(get_onebit(buff,bitpos)!=1) {return -1;} // incomplete code
+    }
+    return 256; //EOF
+  }
+
+  // get the first 5 bit, the minimum code length is 5
+  for(int i=0;i<5;i++){
+    huffman_val<<=1;
+    huffman_val+=get_onebit(buff,bitpos);
+  }
+  // Check the 5 bit codes
+  // See RFC7541 for magic values
+  switch(huffman_val){
+    case 0x0:
+      return 48;
+    case 0x1:
+      return 49;
+    case 0x2:
+      return 50;
+    case 0x3:
+      return 97;
+    case 0x4:
+      return 99;
+    case 0x5:
+      return 101;
+    case 0x6:
+      return 105;
+    case 0x7:
+      return 111;
+    case 0x8:
+      return 115;
+    case 0x9:
+      return 116;
+  }
+  
+  if(bitpos==length){ // no more bits
+    if(huffman_val == 0x1f){ // all bit is 1
+      return 256; //EOF
+    } else {
+      return -1; // invalid code
+    }
+  }
+  
+  // 6 bit codes
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+
+  switch(huffman_val){
+    case 0x14:
+      return 32;
+    case 0x15:
+      return 37;
+    case 0x16:
+      return 45;
+    case 0x17:
+      return 46;
+    case 0x18:
+      return 47;
+    case 0x19:
+      return 51;
+    case 0x1a:
+      return 52;
+    case 0x1b:
+      return 53;
+    case 0x1c:
+      return 54;
+    case 0x1d:
+      return 55;
+    case 0x1e:
+      return 56;
+    case 0x1f:
+      return 57;
+    case 0x20:
+      return 61;
+    case 0x21:
+      return 65;
+    case 0x22:
+      return 95;
+    case 0x23:
+      return 98;
+    case 0x24:
+      return 100;
+    case 0x25:
+      return 102;
+    case 0x26:
+      return 103;
+    case 0x27:
+      return 104;
+    case 0x28:
+      return 108;
+    case 0x29:
+      return 109;
+    case 0x2a:
+      return 110;
+    case 0x2b:
+      return 112;
+    case 0x2c:
+      return 114;
+    case 0x2d:
+      return 117;
+  }
+
+  if(bitpos==length){ // no more bits
+    if(huffman_val == 0x3f){ // all bit is 1
+      return 256; //EOF
+    } else {
+      return -1; // invalid code
+    }
+  }
+  
+  // 7 bit codes
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  switch(huffman_val){
+    case 0x5c:
+      return 58;
+    case 0x5d:
+      return 66;
+    case 0x5e:
+      return 67;
+    case 0x5f:
+      return 68;
+    case 0x60:
+      return 69;
+    case 0x61:
+      return 70;
+    case 0x62:
+      return 71;
+    case 0x63:
+      return 72;
+    case 0x64:
+      return 73;
+    case 0x65:
+      return 74;
+    case 0x66:
+      return 75;
+    case 0x67:
+      return 76;
+    case 0x68:
+      return 77;
+    case 0x69:
+      return 78;
+    case 0x6a:
+      return 79;
+    case 0x6b:
+      return 80;
+    case 0x6c:
+      return 81;
+    case 0x6d:
+      return 82;
+    case 0x6e:
+      return 83;
+    case 0x6f:
+      return 84;
+    case 0x70:
+      return 85;
+    case 0x71:
+      return 86;
+    case 0x72:
+      return 87;
+    case 0x73:
+      return 89;
+    case 0x74:
+      return 106;
+    case 0x75:
+      return 107;
+    case 0x76:
+      return 113;
+    case 0x77:
+      return 118;
+    case 0x78:
+      return 119;
+    case 0x79:
+      return 120;
+    case 0x7a:
+      return 121;
+    case 0x7b:
+      return 122;
+  }
+
+  if(bitpos==length){ // no more bits
+    if(huffman_val == 0x7f){ // all bit is 1
+      return 256; //EOF
+    } else {
+      return -1; // invalid code
+    }
+  }
+  
+  // 8bit codes
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  switch(huffman_val){
+    case 0xf8:
+      return 38;
+    case 0xf9:
+      return 42;
+    case 0xfa:
+      return 44;
+    case 0xfb:
+      return 59;
+    case 0xfc:
+      return 88;
+    case 0xfd:
+      return 90;
+  }
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 10bit codes
+  switch(huffman_val){
+    case 0x3f8:
+      return 33;
+    case 0x3f9:
+      return 34;
+    case 0x3fa:
+      return 40;
+    case 0x3fb:
+      return 41;
+    case 0x3fc:
+      return 63;
+  }
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 11bit codes
+  switch(huffman_val){
+    case 0x7fa:
+      return 39;
+    case 0x7fb:
+      return 43;
+    case 0x7fc:
+      return 124;
+  }  
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 12bit codes
+
+  switch(huffman_val){
+    case 0xffa:
+      return 35;
+    case 0xffb:
+      return 62;
+  }  
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 13bit codes
+
+  switch(huffman_val){
+    case 0x1ff8:
+      return 0;
+    case 0x1ff9:
+      return 36;
+    case 0x1ffa:
+      return 64;
+    case 0x1ffb:
+      return 91;
+    case 0x1ffc:
+      return 93;
+    case 0x1ffd:
+      return 126;
+  }  
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 14bit codes
+  switch(huffman_val){
+    case 0x3ffc:
+      return 94;
+    case 0x3ffd:
+      return 125;
+  }  
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 15bit codes
+  switch(huffman_val){
+    case 0x7ffc:
+      return 60;
+    case 0x7ffd:
+      return 96;
+    case 0x7ffe:
+      return 123;
+  }  
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 19bit codes
+  switch(huffman_val){
+    case 0x7fff0:
+      return 92;
+    case 0x7fff1:
+      return 195;
+    case 0x7ff2:
+      return 208;
+  }  
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 20bit codes
+  switch(huffman_val){
+    case 0xfffe6:
+      return 128;
+    case 0xfffe7:
+      return 130;
+    case 0xfffe8:
+      return 131;
+    case 0xfffe9:
+      return 162;
+    case 0xfffea:
+      return 184;
+    case 0xfffeb:
+      return 194;
+    case 0xfffec:
+      return 224;
+    case 0xfffed:
+      return 226;
+  }  
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 21bit codes
+  switch(huffman_val){
+    case 0x1fffdc:
+      return 153;
+    case 0x1fffdd:
+      return 161;
+    case 0x1fffde:
+      return 167;
+    case 0x1fffdf:
+      return 172;
+    case 0x1fffe0:
+      return 176;
+    case 0x1fffe1:
+      return 177;
+    case 0x1fffe2:
+      return 179;
+    case 0x1fffe3:
+      return 209;
+    case 0x1fffe4:
+      return 216;
+    case 0x1fffe5:
+      return 217;
+    case 0x1fffe6:
+      return 227;
+    case 0x1fffe7:
+      return 229;
+    case 0x1fffe8:
+      return 230;
+  }  
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 22bit codes
+  switch(huffman_val){
+    case 0x3fffd2:
+      return 129;
+    case 0x3fffd3:
+      return 132;
+    case 0x3fffd4:
+      return 133;
+    case 0x3fffd5:
+      return 134;
+    case 0x3fffd6:
+      return 136;
+    case 0x3fffd7:
+      return 146;
+    case 0x3fffd8:
+      return 154;
+    case 0x3fffd9:
+      return 156;
+    case 0x3fffda:
+      return 160;
+    case 0x3fffdb:
+      return 163;
+    case 0x3fffdc:
+      return 164;
+    case 0x3fffdd:
+      return 169;
+    case 0x3fffde:
+      return 170;
+    case 0x3fffdf:
+      return 173;
+    case 0x3fffe0:
+      return 178;
+    case 0x3fffe1:
+      return 181;
+    case 0x3fffe2:
+      return 185;
+    case 0x3fffe3:
+      return 186;
+    case 0x3fffe4:
+      return 187;
+    case 0x3fffe5:
+      return 189;
+    case 0x3fffe6:
+      return 190;
+    case 0x3fffe7:
+      return 196;
+    case 0x3fffe8:
+      return 198;
+    case 0x3fffe9:
+      return 228;
+    case 0x3fffea:
+      return 232;
+    case 0x3fffeb:
+      return 233;
+  }  
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 23bit codes
+  switch(huffman_val){
+    case 0x7fffd8:
+      return 1;
+    case 0x7fffd9:
+      return 135;
+    case 0x7fffda:
+      return 137;
+    case 0x7fffdb:
+      return 138;
+    case 0x7fffdc:
+      return 139;
+    case 0x7fffdd:
+      return 140;
+    case 0x7fffde:
+      return 141;
+    case 0x7fffdf:
+      return 143;
+    case 0x7fffe0:
+      return 147;
+    case 0x7fffe1:
+      return 149;
+    case 0x7fffe2:
+      return 150;
+    case 0x7fffe3:
+      return 151;
+    case 0x7fffe4:
+      return 152;
+    case 0x7fffe5:
+      return 155;
+    case 0x7fffe6:
+      return 157;
+    case 0x7fffe7:
+      return 158;
+    case 0x7fffe8:
+      return 165;
+    case 0x7fffe9:
+      return 166;
+    case 0x7fffea:
+      return 168;
+    case 0x7fffeb:
+      return 174;
+    case 0x7fffec:
+      return 175;
+    case 0x7fffed:
+      return 180;
+    case 0x7fffee:
+      return 182;
+    case 0x7fffef:
+      return 183;
+    case 0x7ffff0:
+      return 188;
+    case 0x7ffff1:
+      return 191;
+    case 0x7ffff2:
+      return 197;
+    case 0x7ffff3:
+      return 231;
+    case 0x7ffff4:
+      return 239;
+  }  
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 24bit codes
+  switch(huffman_val){
+    case 0xffffea:
+      return 9;
+    case 0xffffeb:
+      return 142;
+    case 0xffffec:
+      return 144;
+    case 0xffffed:
+      return 145;
+    case 0xffffee:
+      return 148;
+    case 0xffffef:
+      return 159;
+    case 0xfffff0:
+      return 171;
+    case 0xfffff1:
+      return 206;
+    case 0xfffff2:
+      return 215;
+    case 0xfffff3:
+      return 225;
+    case 0xfffff4:
+      return 236;
+    case 0xfffff5:
+      return 237;
+  }  
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 25bit codes
+  switch(huffman_val){
+    case 0x1ffffec:
+      return 199;
+    case 0x1ffffed:
+      return 207;
+    case 0x1ffffee:
+      return 234;
+    case 0x1ffffef:
+      return 235;
+  }  
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 26bit codes
+  switch(huffman_val){
+    case 0x3ffffe0:
+      return 192;
+    case 0x3ffffe1:
+      return 193;
+    case 0x3ffffe2:
+      return 200;
+    case 0x3ffffe3:
+      return 201;
+    case 0x3ffffe4:
+      return 202;
+    case 0x3ffffe5:
+      return 205;
+    case 0x3ffffe6:
+      return 210;
+    case 0x3ffffe7:
+      return 213;
+    case 0x3ffffe8:
+      return 218;
+    case 0x3ffffe9:
+      return 219;
+    case 0x3ffffea:
+      return 238;
+    case 0x3ffffeb:
+      return 240;
+    case 0x3ffffec:
+      return 242;
+    case 0x3ffffed:
+      return 243;
+    case 0x3ffffee:
+      return 255;
+  }  
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 27bit codes
+  switch(huffman_val){
+    case 0x3ffffde:
+      return 203;
+    case 0x3ffffdf:
+      return 204;
+    case 0x3ffffe0:
+      return 211;
+    case 0x3ffffe1:
+      return 212;
+    case 0x3ffffe2:
+      return 214;
+    case 0x3ffffe3:
+      return 221;
+    case 0x3ffffe4:
+      return 222;
+    case 0x3ffffe5:
+      return 223;
+    case 0x3ffffe6:
+      return 241;
+    case 0x3ffffe7:
+      return 244;
+    case 0x3ffffe8:
+      return 245;
+    case 0x3ffffe9:
+      return 246;
+    case 0x3ffffea:
+      return 247;
+    case 0x3ffffeb:
+      return 248;
+    case 0x3ffffec:
+      return 250;
+    case 0x3ffffed:
+      return 251;
+    case 0x3ffffee:
+      return 252;
+    case 0x3ffffef:
+      return 253;
+    case 0x3fffff0:
+      return 254;
+  }  
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 28bit codes
+  switch(huffman_val){
+    case 0xfffffe2:
+      return 2;
+    case 0xfffffe3:
+      return 3;
+    case 0xfffffe4:
+      return 4;
+    case 0xfffffe5:
+      return 5;
+    case 0xfffffe6:
+      return 6;
+    case 0xfffffe7:
+      return 7;
+    case 0xfffffe8:
+      return 8;
+    case 0xfffffe9:
+      return 11;
+    case 0xfffffea:
+      return 12;
+    case 0xfffffeb:
+      return 14;
+    case 0xfffffec:
+      return 15;
+    case 0xfffffed:
+      return 16;
+    case 0xfffffee:
+      return 17;
+    case 0xfffffef:
+      return 18;
+    case 0xffffff0:
+      return 19;
+    case 0xffffff1:
+      return 20;
+    case 0xffffff2:
+      return 21;
+    case 0xffffff3:
+      return 23;
+    case 0xffffff4:
+      return 24;
+    case 0xffffff5:
+      return 25;
+    case 0xffffff6:
+      return 26;
+    case 0xffffff7:
+      return 27;
+    case 0xffffff8:
+      return 28;
+    case 0xffffff9:
+      return 29;
+    case 0xffffffa:
+      return 30;
+    case 0xffffffb:
+      return 31;
+    case 0xffffffc:
+      return 127;
+    case 0xffffffd:
+      return 220;
+    case 0xffffffe:
+      return 249;
+  }  
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+
+  if(bitpos==length){ // no more bits
+      return -1; // invalid code
+  }
+  huffman_val<<=1;
+  huffman_val+=get_onebit(buff,bitpos);
+  // 30bit codes
+  switch(huffman_val){
+    case 0x3ffffffc:
+      return 10;
+    case 0x3ffffffd:
+      return 13;
+    case 0x3ffffffe:
+      return 22;
+    case 0x3fffffff:
+      return 256;
+  }
+
+return -1;
+}
+
+static const unsigned char mask_table[]={
+0xff, 0x7f, 0x3f, 0x1f,
+0x0f, 0x07, 0x03, 0x01
+};
+
+static OCTETSTRING enc_huff(const OCTETSTRING& pl__stream){
+  int enc_len=0;
+  const unsigned char* ptr=(const unsigned char*)pl__stream;
+  for(int i=0;i<pl__stream.lengthof();i++){
+    enc_len+=huffman_code_length[ptr[i]];
+  }
+  enc_len=(enc_len+7)/8;
+
+  unsigned char* res=(unsigned char*)Malloc(enc_len*sizeof(unsigned char));
+  memset(res,0,enc_len);
+  
+  int bitpos=0;
+  for(int i=0;i<pl__stream.lengthof();i++){
+    put_code2buff(res,bitpos,ptr[i]);
+  }
+  
+  if(bitpos%8){
+    res[bitpos/8]|=mask_table[bitpos%8];
+  }
+  OCTETSTRING ret_val=OCTETSTRING(enc_len,res);
+  Free(res);
+  return ret_val;
+}
+
+static OCTETSTRING dec_huff(const OCTETSTRING& pl__stream){
+  int bitpos=0;
+  int len=pl__stream.lengthof()*8;
+  const unsigned char* ptr=(const unsigned char*)pl__stream;
+  
+  OCTETSTRING ret_val=OCTETSTRING(0,NULL);
+  int res=decompress_one_char(ptr,bitpos,len);
+  while( (res!=-1) && (res!=256) ){
+    ret_val = ret_val + int2oct(res,1);
+    res=decompress_one_char(ptr,bitpos,len);
+  }
+  return ret_val;
+}
+
+// Encode the string according to the RFC7541 5.2
+static OCTETSTRING enc_http2_string(const OCTETSTRING& pl__stream, const int use_huffman){
+  unsigned char len_field[6];
+  
+  OCTETSTRING str= use_huffman?enc_huff(pl__stream):pl__stream;
+
+  int len_len= encode_integer(len_field,str.lengthof(),7,use_huffman?0x80:0);
+  
+  return OCTETSTRING(len_len,len_field) + str;
+  
+}
+
+static int dec_http2_string(const unsigned char* ptr, int ptr_len, OCTETSTRING& pl__stream){
+  uint32_t str_len=0;
+  unsigned char huff=0;
+  int len_len=decode_integer(ptr,str_len,7,huff);
+  ptr+=len_len;
+  if(ptr_len<len_len+(int)str_len){
+    return -1;
+  }
+  
+  pl__stream=huff?dec_huff(OCTETSTRING(str_len,ptr)):OCTETSTRING(str_len,ptr);
+  return len_len+str_len;
+}
+
+static HTTP2_compression_ctxs* get_ptr(const INTEGER& val){
+  return (HTTP2_compression_ctxs*)(val.get_long_long_val());
+}
+
+static OCTETSTRING HTTP2_encode_one_header(const CHARSTRING& hname, const CHARSTRING& hval, HTTP2_compression_ctx* comp_ctx){
+
+  // first search in the dynamic table
+  OCTETSTRING ret_val=OCTETSTRING(0,NULL);
+  unsigned char int_encode_buff[6];
+  
+  int idx=comp_ctx->find(hname,hval);
+  int idx_offset=61; // size of the fixed table
+  
+  if(idx==-1){  // not found it
+     // check the fixed table
+     idx=HTTP2_static_table.ctx.find(hname,hval);
+     idx_offset=0;
+  }
+  int idx_len=0;
+  if(idx>0){ // found it
+    idx_len=encode_integer(int_encode_buff,idx+idx_offset,7,0x80);
+    return OCTETSTRING(idx_len,int_encode_buff);
+  }
+  
+  // not found, lets check for the header name
+  idx_offset=61;
+  comp_ctx->find(hname);
+  if(idx==-1){  // not found it
+     // check the fixed table
+     idx=HTTP2_static_table.ctx.find(hname);
+     idx_offset=0;
+  }
+
+  int can_be_added=((32+hname.lengthof()+hval.lengthof())>(comp_ctx->h_table_max_size))?0:1; // Do not add if the header size is more than the max table size
+
+  if(idx>0){ // found it
+    if(can_be_added){
+      idx_len=encode_integer(int_encode_buff,idx+idx_offset,6,0x40);
+      ret_val=OCTETSTRING(idx_len,int_encode_buff);
+    } else {
+      idx_len=encode_integer(int_encode_buff,idx+idx_offset,4,0x00);
+      ret_val=OCTETSTRING(idx_len,int_encode_buff);
+    }
+    ret_val=ret_val+enc_http2_string(char2oct(hval),1);
+  } else {
+    if(can_be_added){
+      idx_len=encode_integer(int_encode_buff,0,6,0x40);
+      ret_val=OCTETSTRING(idx_len,int_encode_buff);
+    } else {
+      idx_len=encode_integer(int_encode_buff,0,4,0x00);
+      ret_val=OCTETSTRING(idx_len,int_encode_buff);
+    }
+    ret_val=ret_val+enc_http2_string(char2oct(hname),1);
+    ret_val=ret_val+enc_http2_string(char2oct(hval),1);
+  }
+  
+  if(can_be_added){
+    comp_ctx->add_hdr(hname,hval);
+  }
+  
+  return ret_val;
+}
+
+static int HTTP2_decode_one_header(const unsigned char* buff, int buff_len, CHARSTRING& hname, CHARSTRING& hval, HTTP2_compression_ctx* comp_ctx){
+  if(buff_len<1){
+    return -1; //not enough data
+  }
+  
+  int ret_val=0;
+  uint32_t idx=0;
+
+  if((buff[0] & 0xE0)== 0x20){  // Dynamic Table Size Update
+    unsigned char filler;
+    ret_val=decode_integer(buff,idx,5,filler);
+    if(ret_val>buff_len){
+      return -1;
+    }
+    
+    comp_ctx->set_max_size(idx);
+//printf("Dynamic Table Size Update %d\r\n", idx);
+    return ret_val;
+    
+  }
+
+  if(buff[0] & 0x80){  // indexed field representation
+    unsigned char filler;
+    ret_val=decode_integer(buff,idx,7,filler);
+//printf("indexed field representation %d\r\n", idx);
+
+    if(ret_val>buff_len){
+      return -1;
+    }
+    
+    if(idx==0){
+      // invalid value
+      return -1;
+    }
+    
+    if(idx<62){
+      hname=HTTP2_static_table.ctx[idx]->name;
+      hval=HTTP2_static_table.ctx[idx]->value;
+    } else {
+      idx-=61;
+      const HTTP2_hdr_data* d=((*comp_ctx)[idx]);
+      if(d==NULL){
+        return -1;
+      }
+      hname=d->name;
+      hval=d->value;
+    }
+    return ret_val;
+  }
+  
+  int add_hdr=0;
+  
+  if((buff[0] & 0xC0)== 0x40){ // Literal Header Field with Incremental Indexing
+    add_hdr=1;
+    unsigned char filler;
+    ret_val=decode_integer(buff,idx,6,filler);
+//printf("Literal Header Field with Incremental Indexing %d\r\n", idx);
+  } else if(((buff[0] & 0xF0)== 0x10) || ((buff[0] & 0xF0)== 0x00)){ // Literal Header Field without Indexing
+    unsigned char filler;
+    ret_val=decode_integer(buff,idx,4,filler);
+//printf("Literal Header Field withot Indexing %d %x\r\n", idx,buff[0]);
+  } else {
+    // not possible
+    return -1;
+  }
+    if(ret_val>buff_len){
+      return -1;
+    }
+
+  buff+=ret_val; // skip the index
+  
+  if(idx!=0){ // indexed header name
+    if(idx<62){
+      hname=HTTP2_static_table.ctx[idx]->name;
+    } else {
+      idx-=61;
+      const HTTP2_hdr_data* d=((*comp_ctx)[idx]);
+      if(d==NULL){
+        return -1;
+      }
+      hname=d->name;
+    }
+  } else {  // new header name
+    OCTETSTRING str;
+    int str_len=dec_http2_string(buff,buff_len-ret_val,str);
+    if(str_len==-1){
+      return -1;
+    }
+    buff+=str_len;
+    ret_val+=str_len;
+    hname=CHARSTRING(str.lengthof(),(const char*)(const unsigned char*)str);
+  }
+
+  OCTETSTRING str;
+  int str_len=dec_http2_string(buff,buff_len-ret_val,str);
+    if(str_len==-1){
+      return -1;
+    }
+
+  buff+=str_len;
+  ret_val+=str_len;
+  hval=CHARSTRING(str.lengthof(),(const char*)(const unsigned char*)str);
+
+  if(add_hdr){
+    comp_ctx->add_hdr(hname,hval);
+  }
+  
+  return ret_val;
+
+}
+namespace HTTP2__Types {
+
+
+HTTP2__comp__context HTTP2__comp__context__init( const INTEGER& h__table__size__local ,
+                                                 const INTEGER& h__table__size__remote){
+
+  HTTP2_compression_ctxs* ctx=new HTTP2_compression_ctxs;
+  ctx->local.set_max_size(h__table__size__local);
+  ctx->remote.set_max_size(h__table__size__remote);
+  
+  HTTP2__comp__context ret_val;
+  ret_val.internal__id1().set_long_long_val((long long int)ctx);
+  return ret_val;
+}
+
+void HTTP2__comp__context__free(HTTP2__Types::HTTP2__comp__context& ctx){
+  delete get_ptr(ctx.internal__id1());
+  ctx.internal__id1()=0;
+}
+
+void HTTP2__comp__context__set__table__size__remote(HTTP2__Types::HTTP2__comp__context& ctx, const INTEGER& new_size){
+  HTTP2_compression_ctxs* c=get_ptr(ctx.internal__id1());
+  c->remote.set_max_size(new_size);
+}
+
+void HTTP2__comp__context__set__table__size__local(HTTP2__Types::HTTP2__comp__context& ctx, const INTEGER& new_size){
+  HTTP2_compression_ctxs* c=get_ptr(ctx.internal__id1());
+  c->local.set_max_size(new_size);
+}
+
+OCTETSTRING encode_prio(const HTTP2__Priority__data& p_data){
+  return bit2oct(int2bit(p_data.exclusive__flag()?1:0,1)+int2bit(p_data.stream__dependency(),31))+int2oct(p_data.weight(),1);
+}
+
+
+OCTETSTRING enc__huff(const OCTETSTRING& pl__stream){
+  return enc_huff(pl__stream);
+}
+
+OCTETSTRING dec__huff(const OCTETSTRING& pl__stream){
+  return dec_huff(pl__stream);
+}
+
+INTEGER HTTP2__comp__context__encode(HTTP2__comp__context& pl_context, const HTTP2__header__block& pl_hblock, OCTETSTRING& pl_frame_data){
+
+  HTTP2_compression_ctxs* ctx=get_ptr(pl_context.internal__id1());
+  pl_frame_data= OCTETSTRING(0,NULL);
+  
+  if(pl_hblock.pseudo__headers().ispresent()){
+    if(pl_hblock.pseudo__headers()().method().ispresent()){
+      pl_frame_data= pl_frame_data+HTTP2_encode_one_header(":method",pl_hblock.pseudo__headers()().method()(),&ctx->local);
+    }
+    if(pl_hblock.pseudo__headers()().authority().ispresent()){
+      pl_frame_data= pl_frame_data+HTTP2_encode_one_header(":authority",pl_hblock.pseudo__headers()().authority()(),&ctx->local);
+    }
+    if(pl_hblock.pseudo__headers()().scheme().ispresent()){
+      pl_frame_data= pl_frame_data+HTTP2_encode_one_header(":scheme",pl_hblock.pseudo__headers()().scheme()(),&ctx->local);
+    }
+    if(pl_hblock.pseudo__headers()().path().ispresent()){
+      pl_frame_data= pl_frame_data+HTTP2_encode_one_header(":path",pl_hblock.pseudo__headers()().path()(),&ctx->local);
+    }
+    if(pl_hblock.pseudo__headers()().status().ispresent()){
+      pl_frame_data= pl_frame_data+HTTP2_encode_one_header(":status",int2str(pl_hblock.pseudo__headers()().status()()),&ctx->local);
+    }
+  }
+  
+  if(pl_hblock.headers().ispresent()){
+    for(int i=0;i<pl_hblock.headers()().lengthof();i++){
+       pl_frame_data= pl_frame_data+HTTP2_encode_one_header(pl_hblock.headers()()[i].header__name(),
+                                          pl_hblock.headers()()[i].header__value().ispresent()?pl_hblock.headers()()[i].header__value()():"",&ctx->local);
+    }
+  
+  }
+
+  return 0;
+}
+
+INTEGER HTTP2__comp__context__decode(HTTP2__Types::HTTP2__comp__context& pl_context, HTTP2__Types::HTTP2__header__block& pl_hblock, const OCTETSTRING& pl_stream){
+
+  const unsigned char* ptr=(const unsigned char*)pl_stream;
+  int ptr_len=pl_stream.lengthof();
+  HTTP2_compression_ctxs* ctx=get_ptr(pl_context.internal__id1());
+
+  pl_hblock.pseudo__headers()=OMIT_VALUE;
+  pl_hblock.headers()=OMIT_VALUE;
+  
+  while(ptr_len>0){
+    CHARSTRING hname="";
+    CHARSTRING hval="";
+    int hlen =-1;
+    hlen=HTTP2_decode_one_header(ptr,ptr_len,hname, hval, &(ctx->remote));
+    if(hlen==-1){
+      return 1;
+    }
+printf("decoded header len %d %s %s\r\n",hlen,(const char*)hname,(const char*)hval);    
+    if(hname==":method"){
+      if(!pl_hblock.pseudo__headers().ispresent()) pl_hblock.pseudo__headers()() = HTTP2__pseudo__headers(OMIT_VALUE,OMIT_VALUE,OMIT_VALUE,OMIT_VALUE,OMIT_VALUE);
+      pl_hblock.pseudo__headers()().method()=hval;
+    } else if(hname==":scheme") {
+      if(!pl_hblock.pseudo__headers().ispresent()) pl_hblock.pseudo__headers()() = HTTP2__pseudo__headers(OMIT_VALUE,OMIT_VALUE,OMIT_VALUE,OMIT_VALUE,OMIT_VALUE);
+      pl_hblock.pseudo__headers()().scheme()=hval;
+    } else if(hname==":authority") {
+      if(!pl_hblock.pseudo__headers().ispresent()) pl_hblock.pseudo__headers()() = HTTP2__pseudo__headers(OMIT_VALUE,OMIT_VALUE,OMIT_VALUE,OMIT_VALUE,OMIT_VALUE);
+      pl_hblock.pseudo__headers()().authority()=hval;
+    } else if(hname==":path") {
+      if(!pl_hblock.pseudo__headers().ispresent()) pl_hblock.pseudo__headers()() = HTTP2__pseudo__headers(OMIT_VALUE,OMIT_VALUE,OMIT_VALUE,OMIT_VALUE,OMIT_VALUE);
+      pl_hblock.pseudo__headers()().path()=hval;
+    } else if(hname==":status") {
+      if(!pl_hblock.pseudo__headers().ispresent()) pl_hblock.pseudo__headers()() = HTTP2__pseudo__headers(OMIT_VALUE,OMIT_VALUE,OMIT_VALUE,OMIT_VALUE,OMIT_VALUE);
+      pl_hblock.pseudo__headers()().status()=str2int(hval);
+    } else {
+      if(!pl_hblock.headers().ispresent()) pl_hblock.headers()() = NULL_VALUE;
+      pl_hblock.headers()()[pl_hblock.headers()().lengthof()]=HTTP2__header__field(hname,hval);
+
+    }
+    ptr+=hlen;
+    ptr_len-=hlen;
+    
+  
+  }
+  
+  return 0;
+}
+
+OCTETSTRING f__HTTP2__encode__frame(const HTTP2__Frame& pl__frame){
+
+  unsigned char flags=0;
+  
+  OCTETSTRING ret_val=OCTETSTRING(0,NULL);
+  
+  switch(pl__frame.get_selection()){
+    case HTTP2__Frame::ALT_data__frame:
+      if(pl__frame.data__frame().end__stream__flag()){
+        flags|=0x01;
+      }
+      if(pl__frame.data__frame().padding().ispresent()){
+        flags|=0x08;
+      }
+      ret_val=int2oct(0,1) // Type: DATA frames (type=0x0)
+              + int2oct(flags,1)
+              + int2oct(pl__frame.data__frame().stream__id(),4);
+      
+      if(pl__frame.data__frame().padding().ispresent()){
+        ret_val=ret_val+int2oct(pl__frame.data__frame().padding()().lengthof(),1);
+      }
+      ret_val=ret_val+pl__frame.data__frame().data();
+      if(pl__frame.data__frame().padding().ispresent()){
+        ret_val=ret_val+pl__frame.data__frame().padding()();
+      }
+      
+      break;
+    case HTTP2__Frame::ALT_header__frame:
+      if(pl__frame.header__frame().end__stream__flag()){
+        flags|=0x01;
+      }
+      if(pl__frame.header__frame().end__header__flag()){
+        flags|=0x04;
+      }
+      if(pl__frame.header__frame().padding().ispresent()){
+        flags|=0x08;
+      }
+      if(pl__frame.header__frame().priority__data().ispresent()){
+        flags|=0x20;
+      }
+      ret_val=int2oct(0x1,1) // Type: HEADERS frame (type=0x1)
+              + int2oct(flags,1)
+              + int2oct(pl__frame.header__frame().stream__id(),4);
+
+      if(pl__frame.header__frame().padding().ispresent()){
+        ret_val=ret_val+int2oct(pl__frame.header__frame().padding()().lengthof(),1);
+      }
+
+      if(pl__frame.header__frame().priority__data().ispresent()){
+        ret_val=ret_val+encode_prio(pl__frame.header__frame().priority__data()());
+      }
+      ret_val=ret_val+pl__frame.header__frame().header__block__fragment();
+      
+      if(pl__frame.header__frame().padding().ispresent()){
+        ret_val=ret_val+pl__frame.header__frame().padding()();
+      }
+      
+      
+      break;
+    case HTTP2__Frame::ALT_priority__frame:
+      ret_val=int2oct(0x2,1) // Type: PRIORITY frame (type=0x2)
+              + int2oct(flags,1)
+              + int2oct(pl__frame.priority__frame().stream__id(),4);
+      ret_val=ret_val+encode_prio(pl__frame.priority__frame().priority__data());
+
+
+      break;
+    case HTTP2__Frame::ALT_rst__frame:
+      ret_val=int2oct(0x3,1) // Type: RST_STREAM frame (type=0x3)
+              + int2oct(flags,1)
+              + int2oct(pl__frame.rst__frame().stream__id(),4)
+              + int2oct(pl__frame.rst__frame().error__code(),4);
+    
+      break;
+    case HTTP2__Frame::ALT_settings__frame:
+      if(pl__frame.settings__frame().ack__flag()){
+        flags|=0x01;
+      }
+      ret_val=int2oct(0x4,1) // Type: SETTINGS frame (type=0x4)
+              + int2oct(flags,1)
+              + int2oct(0,4); // The stream identifier for a SETTINGS frame MUST be zero
+      
+      if(pl__frame.settings__frame().settings().ispresent()){
+        for(int i=0;i<pl__frame.settings__frame().settings()().lengthof();i++){
+          ret_val=ret_val+int2oct(pl__frame.settings__frame().settings()()[i].setting__id(),2)+int2oct(pl__frame.settings__frame().settings()()[i].setting__value(),4);
+        }
+      }
+      break;
+    case HTTP2__Frame::ALT_push__promise__frame:
+      if(pl__frame.push__promise__frame().end__header__flag()){
+        flags|=0x04;
+      }
+      if(pl__frame.push__promise__frame().padding().ispresent()){
+        flags|=0x08;
+      }
+      ret_val=int2oct(0x5,1) // Type: PUSH_PROMISE frame (type=0x5)
+              + int2oct(flags,1)
+              + int2oct(pl__frame.push__promise__frame().stream__id(),4);
+      
+      if(pl__frame.push__promise__frame().padding().ispresent()){
+        ret_val=ret_val+int2oct(pl__frame.push__promise__frame().padding()().lengthof(),1);
+      }
+
+      ret_val=ret_val+int2oct(pl__frame.push__promise__frame().promised__stream__id(),4) 
+                     + pl__frame.push__promise__frame().header__block__fragment();
+      
+      if(pl__frame.header__frame().padding().ispresent()){
+        ret_val=ret_val+pl__frame.push__promise__frame().padding()();
+      }
+      
+      break;
+    case HTTP2__Frame::ALT_ping__frame:
+      if(pl__frame.ping__frame().ack__flag()){
+        flags|=0x01;
+      }
+      ret_val=int2oct(0x6,1) // Type: PING frame (type=0x6)
+              + int2oct(flags,1)
+              + int2oct(0,4) // The stream identifier for a PING frame MUST be zero
+              + pl__frame.ping__frame().opaque__data() ; 
+      
+      
+      
+      break;
+    case HTTP2__Frame::ALT_goaway__frame:
+      ret_val=int2oct(0x7,1) // Type: GOAWAY frame (type=0x7) 
+              + int2oct(flags,1)
+              + int2oct(0,4) // The stream identifier for a GOAWAY frame MUST be zero
+              + int2oct(pl__frame.goaway__frame().last__stream__id(),4) ; 
+              + int2oct(pl__frame.goaway__frame().error__code(),4) ; 
+      if(pl__frame.goaway__frame().debug__data().ispresent()){
+        ret_val=ret_val+pl__frame.goaway__frame().debug__data()();
+      }
+      
+      break;
+    case HTTP2__Frame::ALT_window__update__frame:
+      ret_val=int2oct(0x8,1) // Type: WINDOW_UPDATE frame (type=0x8)
+              + int2oct(flags,1)
+              + int2oct(pl__frame.window__update__frame().stream__id(),4)
+              + int2oct(pl__frame.window__update__frame().window__size__increment(),4);
+    
+      break;
+    case HTTP2__Frame::ALT_continuation__frame:
+      if(pl__frame.continuation__frame().end__header__flag()){
+        flags|=0x04;
+      }
+      ret_val=int2oct(0x9,1) // Type: CONTINUATION frame (type=0x9)
+              + int2oct(flags,1)
+              + int2oct(pl__frame.continuation__frame().stream__id(),4)
+              + pl__frame.continuation__frame().header__block__fragment();
+      
+      break;
+    case HTTP2__Frame::ALT_generic__frame:
+      ret_val=int2oct(pl__frame.generic__frame().frame__type(),1)
+              + bit2oct(pl__frame.generic__frame().flags())
+              + int2oct(pl__frame.generic__frame().stream__id(),4)
+              + pl__frame.generic__frame().payload();
+      break;
+    default:
+      break;
+  }
+
+         // length: The 9 octets of the frame header are not included in this value
+  return int2oct(ret_val.lengthof()-6,3) + ret_val;
+}
+
+INTEGER decode_uint32(const unsigned char* ptr){
+  return oct2int(OCTETSTRING(4,ptr));
+}
+INTEGER decode_uint16(const unsigned char* ptr){
+  return oct2int(OCTETSTRING(2,ptr));
+}
+
+INTEGER decode_uint31(const unsigned char* ptr){
+  unsigned int ret_val= (*ptr) & 0x7F;
+  ret_val<<=8;
+  ptr++;
+  ret_val+=*ptr;
+  ret_val<<=8;
+  ptr++;
+  ret_val+=*ptr;
+  ret_val<<=8;
+  ptr++;
+  ret_val+=*ptr;
+  return ret_val;
+}
+
+void decode_prio_data(const unsigned char* ptr, HTTP2__Priority__data& p_data){
+  p_data.exclusive__flag()=((*ptr) & 0x80);
+  p_data.stream__dependency()=decode_uint31(ptr);
+  ptr+=4;
+  p_data.weight()=*ptr;
+}
+
+INTEGER f__HTTP2__decode__frame(const OCTETSTRING& pl__stream,
+                                HTTP2__Frame& pl__frame,
+                                HTTP2__decoder__error__descr& pl__error__descr){
+
+    pl__error__descr.error__class() = c__connection__no__error__class;
+    pl__error__descr.error__type() =c__error__code__NO__ERROR;
+    pl__error__descr.error__text()= "OK";
+  
+  if(pl__stream.lengthof()<9){
+    pl__error__descr.error__class() = c__connection__error__class;
+    pl__error__descr.error__type() =c__error__code__FRAME__SIZE__ERROR;
+    pl__error__descr.error__text()= "The frame is shorter than the header size";
+    return 1; // too short
+  }
+  const unsigned char* ptr=(const unsigned char*)pl__stream;
+  // decode length
+  int payload_len= *ptr;  // payload length
+  payload_len<<=8;
+  ptr++;
+  payload_len+=*ptr;
+  payload_len<<=8;
+  ptr++;
+  payload_len+=*ptr;
+  ptr++;
+  if(pl__stream.lengthof()!=(payload_len+9)){
+    pl__error__descr.error__class() = c__connection__error__class;
+    pl__error__descr.error__type() =c__error__code__FRAME__SIZE__ERROR;
+    pl__error__descr.error__text()= "The payload size not match the packet size";
+    return 1; // length field error
+  }
+  const unsigned char type=*ptr;
+  ptr++;
+  const unsigned char flags=*ptr;
+  ptr++;
+  INTEGER stream_id=decode_uint31(ptr);
+  ptr+=4;
+  // now the ptr points to frame payload
+  switch(type){  // type
+    case 0x0: // Type: DATA frames (type=0x0)
+      if(flags & 0x8){ // padding
+        if(payload_len<1){
+           pl__error__descr.error__class() = c__connection__error__class;
+           pl__error__descr.error__type() =c__error__code__FRAME__SIZE__ERROR;
+           pl__error__descr.error__text()= "DATA frame: missing padding length field";
+           return 1; // too short
+        }
+        int pl=*ptr; // padding length
+        if(payload_len<(pl+1)){
+           pl__error__descr.error__class() = c__connection__error__class;
+           pl__error__descr.error__type() =c__error__code__PROTOCOL__ERROR;
+           pl__error__descr.error__text()= "DATA frame: wrong padding size";
+           return 1; // too short
+        }
+        ptr++;
+        pl__frame.data__frame().data()=OCTETSTRING(payload_len-pl-1,ptr);
+        ptr+=payload_len-pl-1;
+        pl__frame.data__frame().padding()=OCTETSTRING(pl,ptr);
+      } else {
+        pl__frame.data__frame().data()=OCTETSTRING(payload_len,ptr);
+        pl__frame.data__frame().padding()=OMIT_VALUE;
+      }
+      pl__frame.data__frame().stream__id()=stream_id;
+      pl__frame.data__frame().end__stream__flag()=(flags & 0x1);
+      
+      break;
+    case 0x1: {// Type: HEADERS frame (type=0x1)
+        int pl=0; // padding length
+        if(flags & 0x8){ // padding
+          if(payload_len<1){
+             pl__error__descr.error__class() = c__connection__error__class;
+             pl__error__descr.error__type() =c__error__code__FRAME__SIZE__ERROR;
+             pl__error__descr.error__text()= "HEADER frame: missing padding length field";
+             return 1; // too short
+          }
+          pl=*ptr;
+          ptr++;
+          payload_len--;
+          if(payload_len<pl){
+             pl__error__descr.error__class() = c__connection__error__class;
+             pl__error__descr.error__type() =c__error__code__PROTOCOL__ERROR;
+             pl__error__descr.error__text()= "HEADER frame: wrong padding size";
+             return 1; // too short
+          }
+        }
+        if(flags & 0x20){ // PRIORITY
+          if((payload_len - pl)<5){
+             pl__error__descr.error__class() = c__connection__error__class;
+             pl__error__descr.error__type() =c__error__code__FRAME__SIZE__ERROR;
+             pl__error__descr.error__text()= "HEADER frame: not enough payload to decode priority data";
+             return 1; // too short
+          }
+          decode_prio_data(ptr,pl__frame.header__frame().priority__data()());
+          ptr+=5;
+          payload_len-=5;
+        } else {
+          pl__frame.header__frame().priority__data()=OMIT_VALUE;
+        }
+        pl__frame.header__frame().end__stream__flag()=(flags & 0x1);
+        pl__frame.header__frame().end__header__flag()=(flags & 0x4);
+        pl__frame.header__frame().stream__id()=stream_id;
+        pl__frame.header__frame().header__block__fragment()=OCTETSTRING(payload_len-pl,ptr);
+        if(flags & 0x8){ // padding
+          ptr+=(payload_len-pl);
+          pl__frame.header__frame().padding()=OCTETSTRING(pl,ptr);
+        } else {
+          pl__frame.header__frame().padding()=OMIT_VALUE;
+        }
+         
+      }
+      break;
+    case 0x2: // Type: PRIORITY frame (type=0x2)
+      if(payload_len!=5){
+        pl__error__descr.error__class() = c__stream__error__class;
+        pl__error__descr.error__type() =c__error__code__FRAME__SIZE__ERROR;
+        pl__error__descr.error__text()= "PRIORITY frame: length is not 5 octet";
+        return 1; // wrong size
+      }
+      decode_prio_data(ptr,pl__frame.priority__frame().priority__data());
+      pl__frame.priority__frame().stream__id()=stream_id;
+      break;
+    case 0x3: // Type: RST_STREAM frame (type=0x3)
+      if(payload_len!=4){
+        pl__error__descr.error__class() = c__connection__error__class;
+        pl__error__descr.error__type() =c__error__code__FRAME__SIZE__ERROR;
+        pl__error__descr.error__text()= " RST_STREAMframe: length is not 4 octet";
+        return 1; // wrong size
+      }
+      pl__frame.rst__frame().error__code()=decode_uint32(ptr);
+      pl__frame.rst__frame().stream__id()=stream_id;
+      break;
+    case 0x4: // Type: SETTINGS frame (type=0x4)
+      if(payload_len % 6){
+        pl__error__descr.error__class() = c__connection__error__class;
+        pl__error__descr.error__type() =c__error__code__FRAME__SIZE__ERROR;
+        pl__error__descr.error__text()= " SETTINGS frame: length is not a multiple of 6 octets";
+        return 1; // wrong size
+      }
+      if(stream_id!=0){
+        pl__error__descr.error__class() = c__connection__error__class;
+        pl__error__descr.error__type() =c__error__code__PROTOCOL__ERROR;
+        pl__error__descr.error__text()= " SETTINGS frame: stream id is not 0.";
+        return 1; // wrong size
+      }
+      
+      pl__frame.settings__frame().settings()=OMIT_VALUE;
+      {int i=0;
+      while(payload_len){
+        pl__frame.settings__frame().settings()()[i].setting__id()=decode_uint16(ptr);
+        ptr+=2;
+        pl__frame.settings__frame().settings()()[i].setting__value()=decode_uint32(ptr);
+        ptr+=4;
+        payload_len-=6;
+        i++;
+      }}
+      
+      pl__frame.settings__frame().ack__flag()=(flags & 0x1);
+      break;
+    case 0x5:{ // Type: PUSH_PROMISE frame (type=0x5)
+        int pl=0; // padding length
+        if(flags & 0x8){ // padding
+          if(payload_len<5){
+            pl__error__descr.error__class() = c__connection__error__class;
+            pl__error__descr.error__type() =c__error__code__FRAME__SIZE__ERROR;
+            pl__error__descr.error__text()= "PUSH_PROMISE frame: missing padding length field or missing promised stream id";
+            return 1; // too short
+          }
+          pl=*ptr;
+          ptr++;
+          payload_len--;
+          if(payload_len<=(pl+4)){
+             pl__error__descr.error__class() = c__connection__error__class;
+             pl__error__descr.error__type() =c__error__code__PROTOCOL__ERROR;
+             pl__error__descr.error__text()= "PUSH_PROMISE frame: wrong padding size";
+             return 1; // too short
+          }
+
+        } else {
+          if(payload_len<4){
+            pl__error__descr.error__class() = c__connection__error__class;
+            pl__error__descr.error__type() =c__error__code__FRAME__SIZE__ERROR;
+            pl__error__descr.error__text()= "PUSH_PROMISE frame: missing promised stream id";
+            return 1; // too short
+          }
+        }
+        pl__frame.push__promise__frame().promised__stream__id()=decode_uint31(ptr);
+        ptr+=4;
+        payload_len-=4;
+
+        pl__frame.push__promise__frame().header__block__fragment()=OCTETSTRING(payload_len-pl,ptr);
+        if(flags & 0x8){ // padding
+          ptr+=(payload_len-pl);
+          pl__frame.push__promise__frame().padding()=OCTETSTRING(pl,ptr);
+        } else {
+          pl__frame.push__promise__frame().padding()=OMIT_VALUE;
+        }
+        pl__frame.push__promise__frame().end__header__flag()=(flags & 0x4);
+
+        pl__frame.push__promise__frame().stream__id()=stream_id;
+      } 
+      break;
+    case 0x6: // Type: PING frame (type=0x6)
+      if(payload_len !=8){
+        pl__error__descr.error__class() = c__connection__error__class;
+        pl__error__descr.error__type() =c__error__code__FRAME__SIZE__ERROR;
+        pl__error__descr.error__text()= "PING frame: length is not 8 octets";
+        return 1; // wrong size
+      }
+      if(stream_id!=0){
+        pl__error__descr.error__class() = c__connection__error__class;
+        pl__error__descr.error__type() =c__error__code__PROTOCOL__ERROR;
+        pl__error__descr.error__text()= "PING frame: stream id is not 0.";
+        return 1; // wrong size
+      }
+      pl__frame.ping__frame().opaque__data()=OCTETSTRING(8,ptr);
+      pl__frame.ping__frame().ack__flag()=(flags & 0x1);
+      break;
+    case 0x7: // Type: GOAWAY frame (type=0x7)
+      if(payload_len <8){
+        pl__error__descr.error__class() = c__connection__error__class;
+        pl__error__descr.error__type() =c__error__code__FRAME__SIZE__ERROR;
+        pl__error__descr.error__text()= "GOAWAY frame: length is less than 8 octets";
+        return 1; // wrong size
+      }
+      if(stream_id!=0){
+        pl__error__descr.error__class() = c__connection__error__class;
+        pl__error__descr.error__type() =c__error__code__PROTOCOL__ERROR;
+        pl__error__descr.error__text()= "GOAWAY frame: stream id is not 0.";
+        return 1; // wrong size
+      }
+      pl__frame.goaway__frame().last__stream__id()=decode_uint31(ptr);
+      ptr+=4;
+      payload_len-=4;
+      pl__frame.goaway__frame().error__code()=decode_uint32(ptr);
+      ptr+=4;
+      payload_len-=4;
+      if(payload_len>0){
+        pl__frame.goaway__frame().debug__data()=OCTETSTRING(payload_len,ptr);
+      } else {
+        pl__frame.goaway__frame().debug__data()=OMIT_VALUE;
+      }
+      break;
+    case 0x8: // Type: WINDOW_UPDATE frame (type=0x8)
+      if(payload_len !=4){
+        pl__error__descr.error__class() = c__connection__error__class;
+        pl__error__descr.error__type() =c__error__code__FRAME__SIZE__ERROR;
+        pl__error__descr.error__text()= "WINDOW_UPDATE frame: length is not 4 octets";
+        return 1; // wrong size
+      }
+      pl__frame.window__update__frame().window__size__increment()=decode_uint32(ptr);
+      pl__frame.window__update__frame().stream__id()=stream_id;
+      break;
+    case 0x9: // Type: CONTINUATION frame (type=0x9)
+      pl__frame.continuation__frame().header__block__fragment()=OCTETSTRING(payload_len,ptr);
+      pl__frame.continuation__frame().stream__id()=stream_id;
+      pl__frame.continuation__frame().end__header__flag()=(flags & 0x4);
+      break;
+    default:  // unknown frame
+      pl__frame.generic__frame().frame__type()=type;
+      pl__frame.generic__frame().flags()= int2bit(flags,8);
+      pl__frame.generic__frame().stream__id()=stream_id;
+      pl__frame.generic__frame().payload()=OCTETSTRING(payload_len,ptr);
+      break;
+  }
+
+  return 0;
+}
+
+}
+
diff --git a/src/HTTP2_Types.ttcn b/src/HTTP2_Types.ttcn
new file mode 100644
index 0000000..8af8071
--- /dev/null
+++ b/src/HTTP2_Types.ttcn
@@ -0,0 +1,291 @@
+/******************************************************************************
+* Copyright (c) 2017  Ericsson 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:
+*   Gabor Szalai - initial implementation and initial documentation
+******************************************************************************/
+//
+//  File:               HTTP2_Types.ttcn
+//  Description:        Functions and types for HTTP2 
+//  Rev:                R1A
+//  Prodnr:             CNL 113 851
+module HTTP2_Types{
+
+external function f_HTTP2_encode_frame(in HTTP2_Frame pl_frame) return octetstring
+with {
+  extension "prototype(convert)"
+}
+
+// return values:
+//     1 - decoding failed
+//     0 - OK
+//
+// The pl_error_descr contains the description of the error
+
+ 
+external function f_HTTP2_decode_frame(in octetstring pl_stream, 
+                                       out HTTP2_Frame pl_frame,
+                                       out HTTP2_decoder_error_descr pl_error_descr) return integer
+
+// Message dissector function for IPL4 test port
+type record of integer HTTP2_ro_integer
+
+function f_HTTP2_msglen(
+    in octetstring stream,
+    inout HTTP2_ro_integer args 
+) return integer {
+   var integer pl_len:=lengthof(stream)
+   if(pl_len<3){
+     return -1;
+   }
+   if(pl_len<lengthof(HTTP2_connection_preface)){
+     if(substr(HTTP2_connection_preface,0,pl_len)==stream ){
+       return -1
+     }
+   } else {
+     if(HTTP2_connection_preface==substr(stream,0,lengthof(HTTP2_connection_preface))){
+       return lengthof(HTTP2_connection_preface)
+     }
+     
+   }
+   return oct2int(substr(stream,0,3))+9
+}
+
+const octetstring HTTP2_connection_preface:='505249202a20485454502f322e300d0a0d0a534d0d0a0d0a'O
+
+// Error classes
+const integer c_connection_no_error_class := 0
+const integer c_connection_error_class := 1
+const integer c_stream_error_class := 2
+
+// Error codes
+const integer c_error_code_NO_ERROR:= 0
+const integer c_error_code_PROTOCOL_ERROR := 1
+const integer c_error_code_INTERNAL_ERROR :=2
+const integer c_error_code_FLOW_CONTROL_ERROR := 3
+const integer c_error_code_SETTINGS_TIMEOUT := 4
+const integer c_error_code_STREAM_CLOSED := 5
+const integer c_error_code_FRAME_SIZE_ERROR := 6
+const integer c_error_code_REFUSED_STREAM := 7
+const integer c_error_code_CANCEL := 8
+const integer c_error_code_COMPRESSION_ERROR := 9
+const integer c_error_code_CONNECT_ERROR := 10
+const integer c_error_code_ENHANCE_YOUR_CALM := 11
+const integer c_error_code_INADEQUATE_SECURITY := 12
+const integer c_error_code_HTTP_1_1_REQUIRED := 13
+
+// Settings parameters
+const integer c_SETTINGS_HEADER_TABLE_SIZE := 1
+const integer c_SETTINGS_ENABLE_PUSH := 2
+const integer c_SETTINGS_MAX_CONCURRENT_STREAMS := 3
+const integer c_SETTINGS_INITIAL_WINDOW_SIZE := 4
+const integer c_SETTINGS_MAX_FRAME_SIZE := 5
+const integer c_SETTINGS_MAX_HEADER_LIST_SIZE := 6
+
+type record HTTP2_decoder_error_descr{
+  integer    error_class,
+  integer    error_type,
+  charstring error_text
+}
+
+// HTTP/2 Frame definition
+// The length field handled automatically
+type union HTTP2_Frame {
+  HTTP2_Data_frame          data_frame,
+  HTTP2_Header_frame        header_frame,
+  HTTP2_Priority_frame      priority_frame,
+  HTTP2_RST_Stream_frame    rst_frame,
+  HTTP2_Settings_frame      settings_frame,
+  HTTP2_Push_Promise_frame  push_promise_frame,
+  HTTP2_Ping_frame          ping_frame,
+  HTTP2_Goaway_frame        goaway_frame,
+  HTTP2_Window_Update_frame window_update_frame,
+  HTTP2_Continuation_frame  continuation_frame,
+  HTTP2_Generic_frame       generic_frame
+}
+
+// Data Frame definition
+// The padding flag are handled automatically
+type record HTTP2_Data_frame{
+  integer       stream_id,
+  boolean       end_stream_flag,
+  octetstring   data,
+  octetstring   padding optional
+}
+
+// Header Frame definition
+// The padding flag are handled automatically
+// The priority flag are handled automatically
+type record HTTP2_Header_frame{
+  integer              stream_id,
+  boolean              end_stream_flag,
+  boolean              end_header_flag,
+  HTTP2_Priority_data  priority_data optional,
+  octetstring          header_block_fragment,
+  octetstring          padding optional
+}
+
+type record HTTP2_Priority_data{
+  boolean       exclusive_flag,
+  integer       stream_dependency,
+  integer       weight
+}
+
+type record HTTP2_Priority_frame{
+  integer              stream_id,
+  HTTP2_Priority_data  priority_data
+}
+
+type record HTTP2_RST_Stream_frame {
+  integer              stream_id,
+  integer              error_code
+}
+
+type record HTTP2_Setting_data{
+  integer     setting_id,
+  integer     setting_value
+}
+
+type record of HTTP2_Setting_data HTTP2_Setting_list
+
+// Always use 0 stream
+type record HTTP2_Settings_frame{
+  boolean              ack_flag,
+  HTTP2_Setting_list   settings optional
+}
+
+// The padding flag are handled automatically
+type record HTTP2_Push_Promise_frame{
+  integer              stream_id,
+  boolean              end_header_flag,
+  integer              promised_stream_id,
+  octetstring          header_block_fragment,
+  octetstring          padding optional
+}
+
+
+// Always use 0 stream
+type record HTTP2_Ping_frame{
+  boolean              ack_flag,
+  octetstring          opaque_data length(8)
+}
+
+// Always use 0 stream
+type record HTTP2_Goaway_frame{
+  integer              last_stream_id,
+  integer              error_code,
+  octetstring          debug_data optional
+}
+
+type record HTTP2_Window_Update_frame{
+  integer              stream_id,
+  integer              window_size_increment
+}
+
+type record HTTP2_Continuation_frame{
+  integer              stream_id,
+  boolean              end_header_flag,
+  octetstring          header_block_fragment
+}
+
+// Use it to send/receive non-defined or errornous frame
+// Only the length calculated by the encoder
+type record HTTP2_Generic_frame{
+  integer              frame_type,
+  bitstring            flags length(8),
+  integer              stream_id,
+  octetstring          payload
+}
+
+
+// HTTP2 request/response and header definitions
+// RFC7540 8.1.2.1
+// Note: the encoder doesn't enforces validity
+// of the specified pseudo header field combination
+
+type record HTTP2_pseudo_headers{
+  charstring      method optional,
+  charstring      scheme optional,
+  charstring      authority optional,
+  charstring      path optional,
+  integer         status optional
+}
+
+type record HTTP2_header_field{
+  charstring      header_name,
+  charstring      header_value optional
+}
+
+type record of HTTP2_header_field HTTP2_header_list
+
+// This type should be used for request/response headers
+type record HTTP2_header_block {
+  HTTP2_pseudo_headers pseudo_headers optional,
+  HTTP2_header_list    headers optional
+}
+
+
+// Header compression releated type definitions
+// For each connection (not streams) a separate
+// compression context should be used.
+
+// Never touch the fields of the HTTP2_comp_context
+// Don't even think about it !!!!!
+
+// 1. Create the context with function:
+//     HTTP2_comp_context_init
+
+// 2. Every header block should be encoded/decoded with the functions:
+//    HTTP2_comp_context_encode
+//    HTTP2_comp_context_decode
+// in the exactly the same order as the header blocks are sent or received
+// in order to maintain the header compression context
+
+// 3. Delete the context with
+//    HTTP2_comp_context_free
+//  Please note: non freed context leads to memory leak!!!!
+
+// Creates a new header compression context
+external function HTTP2_comp_context_init(in integer h_table_size_local:=4096,   // The initial size of the header table
+                                          in integer h_table_size_remote:=4096 
+                                          ) return HTTP2_comp_context
+
+// Retur value:
+//   0 - OK
+//   otherwise - error code
+external function HTTP2_comp_context_encode(inout HTTP2_comp_context pl_context, 
+                                            in HTTP2_header_block pl_hblock,
+                                            out octetstring pl_frame_data) return integer
+
+// Retur value:
+//   0 - OK
+//   otherwise - error code
+external function HTTP2_comp_context_decode(inout HTTP2_comp_context pl_context, 
+                                            out HTTP2_header_block pl_hblock,
+                                            in octetstring pl_frame_data) return integer
+
+
+// Free and release the header compression context
+external function HTTP2_comp_context_free(inout HTTP2_comp_context pl_context)
+
+
+// Set header table size
+external function HTTP2_comp_context_set_table_size_remote(inout HTTP2_comp_context pl_context, 
+                                                           in integer h_table_size)
+
+external function HTTP2_comp_context_set_table_size_local(inout HTTP2_comp_context pl_context, 
+                                                           in integer h_table_size)
+
+//**************************************************//
+// DO NOT TOUCH THE FIELDS OF THE HTTP2_comp_context 
+//**************************************************//
+type record HTTP2_comp_context{
+  integer           internal_id1
+}
+
+
+}
