Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/Adapter.prj
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/Adapter.prj	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/Adapter.prj	(revision 22)
@@ -0,0 +1,95 @@
+[Project ID]
+Signature=UE Proj: v.1
+[Open Files]
+Open File0=C:\Program Files\Elvior\MessageMagic5\mmagic_codec_log.txt
+Active File Display Mode=3
+Open File Pos0=0
+Open File Line0=2663
+Open File Window Pos0=2,3,-1,-1,-4,-30,88,116,961,519
+Open File1=D:\cygwin\home\yann\dev\g++\STF 370\codec\c++\sip_codets.cpp
+Open File Pos1=53160
+Open File Line1=52644
+Open File Window Pos1=0,1,-1,-1,-4,-30,110,145,987,552
+Open File2=D:\cygwin\home\yann\dev\g++\STF 370\adapter\tmp\gen\gen_classes.h
+Open File Pos2=64146
+Open File Line2=63468
+Open File Window Pos2=0,1,-1,-1,-4,-30,132,174,1009,581
+Open File3=D:\cygwin\home\yann\dev\g++\STF 370\codec\c++\Regex.h
+Open File Pos3=1948
+Open File Line3=1835
+Active File Index=0
+Open File Window Pos3=0,1,-1,-1,-4,-30,0,0,877,407
+Open File4=
+Open File Pos4=14349
+Open File Line4=13919
+Open File Window Pos4=0,1,-1,-1,-4,-30,22,29,899,436
+Open File5=
+Open File Pos5=0
+Open File Line5=0
+Open File Window Pos5=0,1,-1,-1,-4,-30,132,174,1019,581
+Open File6=
+Open File Pos6=5267
+Open File Line6=4743
+Open File Window Pos6=0,1,-1,-1,-4,-30,110,145,1019,521
+Open File7=D:\cygwin\home\yann\dev\g++\STF 370\adapter\validation\TestExecution.ttcn
+Open File Pos7=4045
+Open File Line7=4007
+Open File Window Pos7=2,3,-1,-1,-4,-30,0,0,909,376
+Open File8=
+Open File Pos8=23209
+Open File Line8=22507
+Open File Window Pos8=0,1,-1,-1,-4,-30,44,58,953,434
+Open File9=D:\cygwin\home\yann\dev\g++\STF 370\adapter\src\UpperTestAdapter\TriggerCommandsGUI\TriggerCommands.cpp
+Open File Pos9=989
+Open File Line9=217
+Open File Window Pos9=0,1,-1,-1,-4,-30,66,87,975,463
+Open File10=D:\cygwin\home\yann\dev\g++\STF 370\adapter\src\Helper\GeneralConfigurationParams.h
+Open File Pos10=665
+Open File Line10=358
+Open File Window Pos10=0,1,-1,-1,-4,-30,88,116,997,492
+Open File11=
+[Project Information]
+Use Relative Directory=1
+Relative to Project File=1
+Project Start=D907090003001000160010001300000035
+Include Sub Directories=1
+Project Tagfile=
+Project Wordfile=
+Filter=
+Create Tagfile=0
+Working Time=1030139
+[Files]
+0=.\src\
+1=..\ttcn\
+2=Makefile
+3=..\codec\c++\
+4=.\validation\
+5=.\tmp\gen\
+6=..\codec\validation\
+7=..\LibSip\
+[Group Filter]
+- src=*.cpp;*.h
+- STF 370=*.ttcn
+- codec=*.ttcn
+..\codec\c++\=*.cpp;*.h;Make*
+- validation=*.ttcn
+- gen=*.cpp;*.h
+- TriggerCommandsGUI=*.cpp;*.h
+ - STF 370=*.ttcn
+[Folders]
+..\codec\c++\ - tmp - gen=1
+.\src\UpperTestAdapter\TriggerCommandsGUI\=1
+.\validation\ - generic_interface_configuration=1
+.\validation\ - LibUpperTester=1
+.\validation\ - LibIms_ConfigAndTrigger=1
+.\validation\ - AtsImsIot=1
+.\validation\ - LibIot=1
+..\codec\c++\ - tmp=1
+..\ttcn\ - LibIot=1
+..\ttcn\ - AtsImsIot=1
+..\ttcn\ - LibIms_ConfigAndTrigger=1
+.\src\ - UpperTestAdapter - Processors=1
+.\src\ - UpperTestAdapter - TriggerCommandsGUI=1
+..\LibSip\ - ttcn=1
+.\tmp\gen\=1
+..\codec\c++\=1
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/Doxygen.conf
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/Doxygen.conf	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/Doxygen.conf	(revision 22)
@@ -0,0 +1,165 @@
+# Doxygen configuration
+# $Id$
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME           = STF370_Adapter
+PROJECT_NUMBER         = 
+OUTPUT_DIRECTORY       = ./doc
+OUTPUT_LANGUAGE        = English
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ALWAYS_DETAILED_SEC    = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+INTERNAL_DOCS          = NO
+CLASS_DIAGRAMS         = YES
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+VERBATIM_HEADERS       = YES
+SHOW_INCLUDE_FILES     = YES
+JAVADOC_AUTOBRIEF      = YES
+INHERIT_DOCS           = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+DISTRIBUTE_GROUP_DOC   = NO
+TAB_SIZE               = 2
+ENABLED_SECTIONS       = 
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+ALIASES                = 
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ./ \
+                         ./src/Ports \
+                         ./src/LowerTestAdapter \
+                         ./src/Messages \
+                         ./src/PacketFilter \
+                         ./src/UpperTestAdapter \
+                         ./src/UpperTestAdapter/Processors \
+                         ./src/UpperTestAdapter/TriggerCommandsOffLine \
+                         ./src/UpperTestAdapter/TriggerCommandsGUI \
+                         ./src/Helper \
+                         ./src/Logger
+                         
+FILE_PATTERNS          = *.cpp \
+                         *.c \
+                         *.h \
+                         *.hpp \
+                         *.inl
+RECURSIVE              = YES
+EXCLUDE                = 
+EXCLUDE_PATTERNS       = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = NO
+TREEVIEW_WIDTH         = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = 
+PDF_HYPERLINKS         = NO
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = YES
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = YES
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = 
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+HAVE_DOT               = NO
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+GRAPHICAL_HIERARCHY    = YES
+DOT_PATH               = 
+MAX_DOT_GRAPH_WIDTH    = 1024
+MAX_DOT_GRAPH_HEIGHT   = 1024
+GENERATE_LEGEND        = YES
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
+CGI_NAME               = search.cgi
+CGI_URL                = 
+DOC_URL                = 
+DOC_ABSPATH            = 
+BIN_ABSPATH            = /usr/local/bin/
+EXT_DOC_PATHS          = 
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/STF370_ATS/STF370_ATS.mmsln
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/STF370_ATS/STF370_ATS.mmsln	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/STF370_ATS/STF370_ATS.mmsln	(revision 22)
@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="utf-8"?>
+<solution>
+ <metaclasses>
+  <enc>
+   <plain>
+    <byte_order>le</byte_order>
+    <signed />
+    <int>dword</int>
+    <float>double</float>
+    <custom_int>8</custom_int>
+    <string>null</string>
+    <custom_str>32</custom_str>
+    <char>UTF8</char>
+    <bool>dword</bool>
+    <bin>dword</bin>
+    <custom_bin>16</custom_bin>
+    <align>1</align>
+    <coll>ext</coll>
+    <str_unit>bytes</str_unit>
+    <str_end>\r\n</str_end>
+    <uni_end>\r\n</uni_end>
+    <any>word</any>
+   </plain>
+  </enc>
+  <items />
+ </metaclasses>
+ <comp_module>
+  <file>STF370_ATS.mmtcs</file>
+ </comp_module>
+ <tes>
+  <items>
+   <te>
+    <file>TestingEnvironment1.xmmte</file>
+   </te>
+  </items>
+ </tes>
+ <scripts>
+  <items>
+   <script>
+    <name>AtsImsIot_Behavior</name>
+    <file>..\..\..\ttcn\AtsImsIot\AtsImsIot_Behavior.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_Functions</name>
+    <file>..\..\..\ttcn\AtsImsIot\AtsImsIot_Functions.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_Templates</name>
+    <file>..\..\..\ttcn\AtsImsIot\AtsImsIot_Templates.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_TestCases_MESS</name>
+    <file>..\..\..\ttcn\AtsImsIot\AtsImsIot_TestCases_MESS.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_TestConfiguration</name>
+    <file>..\..\..\ttcn\AtsImsIot\AtsImsIot_TestConfiguration.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_TestSystem</name>
+    <file>..\..\..\ttcn\AtsImsIot\AtsImsIot_TestSystem.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_TypesAndValues</name>
+    <file>..\..\..\ttcn\AtsImsIot\AtsImsIot_TypesAndValues.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibIms_UpperTester</name>
+    <file>..\..\..\ttcn\LibIms_ConfigAndTrigger\LibIms_UpperTester.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibIot_Functions</name>
+    <file>..\..\..\ttcn\LibIot\LibIot_Functions.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibIot_PIXITS</name>
+    <file>..\..\..\ttcn\LibIot\LibIot_PIXITS.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibIot_TestConfiguration</name>
+    <file>..\..\..\ttcn\LibIot\LibIot_TestConfiguration.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibIot_TestInterface</name>
+    <file>..\..\..\ttcn\LibIot\LibIot_TestInterface.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibIot_TypesAndValues</name>
+    <file>..\..\..\ttcn\LibIot\LibIot_TypesAndValues.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibUpperTester</name>
+    <file>..\..\..\ttcn\LibUpperTester\LibUpperTester.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibCommon_AbstractData</name>
+    <file>..\..\validation\LibCommon\LibCommon_AbstractData.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibCommon_BasicTypesAndValues</name>
+    <file>..\..\validation\LibCommon\LibCommon_BasicTypesAndValues.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibCommon_DataStrings</name>
+    <file>..\..\validation\LibCommon\LibCommon_DataStrings.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibCommon_Sync</name>
+    <file>..\..\validation\LibCommon\LibCommon_Sync.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibCommon_TextStrings</name>
+    <file>..\..\validation\LibCommon\LibCommon_TextStrings.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibCommon_Time</name>
+    <file>..\..\validation\LibCommon\LibCommon_Time.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibCommon_VerdictControl</name>
+    <file>..\..\validation\LibCommon\LibCommon_VerdictControl.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_TestControl</name>
+    <file>..\..\..\ttcn\AtsImsIot\AtsImsIot_TestControl.ttcn3</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_TestCases_CALL</name>
+    <file>..\..\..\ttcn\AtsImsIot\AtsImsIot_TestCases_CALL.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_TestCases_REG</name>
+    <file>..\..\..\ttcn\AtsImsIot\AtsImsIot_TestCases_REG.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_TestCases_SS</name>
+    <file>..\..\..\ttcn\AtsImsIot\AtsImsIot_TestCases_SS.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>XSDAUX</name>
+    <file>..\..\..\LibSip\ttcn\XSDAUX.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibSip_Interface</name>
+    <file>..\..\..\LibSip\ttcn\LibSip_Interface.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibSip_PIXITS</name>
+    <file>..\..\..\LibSip\ttcn\LibSip_PIXITS.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibSip_SDPTypes</name>
+    <file>..\..\..\LibSip\ttcn\LibSip_SDPTypes.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibSip_SIPTypesAndValues</name>
+    <file>..\..\..\LibSip\ttcn\LibSip_SIPTypesAndValues.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibSip_Steps</name>
+    <file>..\..\..\LibSip\ttcn\LibSip_Steps.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibSip_Templates</name>
+    <file>..\..\..\LibSip\ttcn\LibSip_Templates.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibSip_XMLTypes</name>
+    <file>..\..\..\LibSip\ttcn\LibSip_XMLTypes.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+  </items>
+ </scripts>
+ <messages>
+  <items />
+ </messages>
+ <scenarios>
+  <items />
+ </scenarios>
+ <verstool />
+ <timer>
+  <int>1000</int>
+ </timer>
+ <sut>
+  <exe>D:\cygwin\home\yann\dev\g++\STF 370\adapter\TestExecution-SA.exe</exe>
+  <port>7777</port>
+  <ctime>60</ctime>
+  <htime>30</htime>
+  <count>1</count>
+  <rtime>20</rtime>
+ </sut>
+ <codec_rules>CodecRules_STF370_ATS.txt</codec_rules>
+ <ExternalAttributeFiles>
+  <items />
+ </ExternalAttributeFiles>
+ <ModuleParFiles>
+  <items />
+ </ModuleParFiles>
+ <TestcaseSelections>
+  <items />
+ </TestcaseSelections>
+ <TestCampaigns>
+  <items />
+ </TestCampaigns>
+ <ttcn3_settings>
+  <tc_block />
+  <ttcn3_version>Ttcn3_2009</ttcn3_version>
+  <ext_codec />
+  <ext_cdpath>D:\cygwin\home\yann\dev\g++\STF 370\adapter\TestExecution-CD.dll</ext_cdpath>
+  <asn>BER</asn>
+  <no_internal_codec />
+  <sa_traffic />
+  <codec_timeout>10000</codec_timeout>
+  <log_reject />
+ </ttcn3_settings>
+</solution>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/STF370_ATS/STF370_ATS.mmsln.user
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/STF370_ATS/STF370_ATS.mmsln.user	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/STF370_ATS/STF370_ATS.mmsln.user	(revision 22)
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<user_space>
+ <logs>
+  <items>
+   <log>TestingEnvironment1_200909251138282\ttcn3_log.xmmlog</log>
+  </items>
+ </logs>
+ <open>
+  <metaclasses />
+  <tes />
+  <scripts />
+  <scenarios />
+  <mis />
+  <logs>
+   <item>
+    <name>TestingEnvironment1_200909251138282\ttcn3_log.xmmlog</name>
+    <tab>
+     <pos>0</pos>
+     <active />
+    </tab>
+   </item>
+  </logs>
+ </open>
+ <main_script>AtsImsIot_TestControl</main_script>
+ <campaigns />
+ <ext_att />
+ <ext_mp />
+ <tc_sel />
+</user_space>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/STF370_ATS/STF370_ATS.mmtcs
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/STF370_ATS/STF370_ATS.mmtcs	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/STF370_ATS/STF370_ATS.mmtcs	(revision 22)
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<tctypes>
+ <items>
+  <cls>
+   <name>TSystemAdapter</name>
+   <tcc>
+    <ports>
+     <cls>
+      <name>port1</name>
+      <port />
+      <null />
+      <auto />
+     </cls>
+    </ports>
+    <log />
+    <open />
+   </tcc>
+  </cls>
+  <cls>
+   <name>TMainTC</name>
+   <tcc>
+    <ports>
+     <cls>
+      <name>port1</name>
+      <port />
+      <null />
+      <auto />
+     </cls>
+    </ports>
+    <log />
+    <open />
+   </tcc>
+  </cls>
+ </items>
+</tctypes>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/TestExecution.mmsln
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/TestExecution.mmsln	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/TestExecution.mmsln	(revision 22)
@@ -0,0 +1,242 @@
+<?xml version="1.0" encoding="utf-8"?>
+<solution>
+ <metaclasses>
+  <enc>
+   <plain>
+    <byte_order>le</byte_order>
+    <signed />
+    <int>dword</int>
+    <float>double</float>
+    <custom_int>8</custom_int>
+    <string>null</string>
+    <custom_str>32</custom_str>
+    <char>UTF8</char>
+    <bool>dword</bool>
+    <bin>dword</bin>
+    <custom_bin>16</custom_bin>
+    <align>1</align>
+    <coll>ext</coll>
+    <str_unit>bytes</str_unit>
+    <str_end>\r\n</str_end>
+    <uni_end>\r\n</uni_end>
+    <any>word</any>
+   </plain>
+  </enc>
+  <items />
+ </metaclasses>
+ <comp_module>
+  <file>TestExecution.mmtcs</file>
+ </comp_module>
+ <tes>
+  <items>
+   <te>
+    <file>TestingEnvironment1.xmmte</file>
+   </te>
+  </items>
+ </tes>
+ <scripts>
+  <items>
+   <script>
+    <name>LibSip_Interface</name>
+    <file>..\..\LibSip\LibSip_Interface.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibSip_PIXITS</name>
+    <file>..\..\LibSip\LibSip_PIXITS.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibSip_SDPTypes</name>
+    <file>..\..\LibSip\LibSip_SDPTypes.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibSip_SIPTypesAndValues</name>
+    <file>..\..\LibSip\LibSip_SIPTypesAndValues.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibSip_Steps</name>
+    <file>..\..\LibSip\LibSip_Steps.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibSip_Templates</name>
+    <file>..\..\LibSip\LibSip_Templates.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibSip_XMLTypes</name>
+    <file>..\..\LibSip\LibSip_XMLTypes.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>XSDAUX</name>
+    <file>..\..\LibSip\XSDAUX.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibIot_TestConfiguration</name>
+    <file>..\..\ttcn\LibIot\LibIot_TestConfiguration.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibIot_Functions</name>
+    <file>..\..\ttcn\LibIot\LibIot_Functions.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibIot_TypesAndValues</name>
+    <file>..\..\ttcn\LibIot\LibIot_TypesAndValues.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibIot_PIXITS</name>
+    <file>..\..\ttcn\LibIot\LibIot_PIXITS.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibIot_TestInterface</name>
+    <file>..\..\ttcn\LibIot\LibIot_TestInterface.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibUpperTester</name>
+    <file>..\..\ttcn\LibUpperTester\LibUpperTester.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibIms_UpperTester</name>
+    <file>..\..\ttcn\LibIms_ConfigAndTrigger\LibIms_UpperTester.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_Templates</name>
+    <file>..\..\ttcn\AtsImsIot\AtsImsIot_Templates.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_Behavior</name>
+    <file>..\..\ttcn\AtsImsIot\AtsImsIot_Behavior.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_TestSystem</name>
+    <file>..\..\ttcn\AtsImsIot\AtsImsIot_TestSystem.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_TestConfiguration</name>
+    <file>..\..\ttcn\AtsImsIot\AtsImsIot_TestConfiguration.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_TypesAndValues</name>
+    <file>..\..\ttcn\AtsImsIot\AtsImsIot_TypesAndValues.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_Functions</name>
+    <file>..\..\ttcn\AtsImsIot\AtsImsIot_Functions.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibCommon_BasicTypesAndValues</name>
+    <file>..\validation\LibCommon\LibCommon_BasicTypesAndValues.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibCommon_Sync</name>
+    <file>..\validation\LibCommon\LibCommon_Sync.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibCommon_AbstractData</name>
+    <file>..\validation\LibCommon\LibCommon_AbstractData.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibCommon_Time</name>
+    <file>..\validation\LibCommon\LibCommon_Time.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibCommon_VerdictControl</name>
+    <file>..\validation\LibCommon\LibCommon_VerdictControl.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibCommon_DataStrings</name>
+    <file>..\validation\LibCommon\LibCommon_DataStrings.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>LibCommon_TextStrings</name>
+    <file>..\validation\LibCommon\LibCommon_TextStrings.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>TestExecution</name>
+    <file>..\validation\TestExecution.ttcn</file>
+    <type>ttcn3</type>
+   </script>
+   <script>
+    <name>AtsImsIot_TestControl</name>
+    <file>..\..\ttcn\AtsImsIot\AtsImsIot_TestControl.ttcn3</file>
+    <type>ttcn3</type>
+   </script>
+  </items>
+ </scripts>
+ <messages>
+  <items />
+ </messages>
+ <scenarios>
+  <items />
+ </scenarios>
+ <verstool>
+  <vers_item>
+   <vers>
+   </vers>
+   <date>8/27/2009</date>
+   <auth>
+   </auth>
+   <comm>
+   </comm>
+  </vers_item>
+ </verstool>
+ <timer>
+  <int>1000</int>
+ </timer>
+ <sut>
+  <port>7777</port>
+  <ctime>60</ctime>
+  <htime>30</htime>
+  <count>1</count>
+  <rtime>20</rtime>
+ </sut>
+ <codec_rules>CodecRules_TestExecution.txt</codec_rules>
+ <ExternalAttributeFiles>
+  <items />
+ </ExternalAttributeFiles>
+ <ModuleParFiles>
+  <items />
+ </ModuleParFiles>
+ <TestcaseSelections>
+  <items />
+ </TestcaseSelections>
+ <TestCampaigns>
+  <items />
+ </TestCampaigns>
+ <ttcn3_settings>
+  <tc_block />
+  <ttcn3_version>Ttcn3_2009</ttcn3_version>
+  <ext_codec />
+  <ext_cdpath>D:\cygwin\home\yann\dev\g++\STF 370\adapter\TestExecution-CD.dll</ext_cdpath>
+  <asn>BER</asn>
+  <no_internal_codec />
+  <sa_traffic />
+  <codec_timeout>10000</codec_timeout>
+  <log_reject />
+ </ttcn3_settings>
+</solution>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/TestExecution.mmsln.user
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/TestExecution.mmsln.user	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/TestExecution.mmsln.user	(revision 22)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<user_space>
+ <logs>
+  <items />
+ </logs>
+ <open>
+  <metaclasses />
+  <tes />
+  <scripts />
+  <scenarios />
+  <mis />
+  <logs />
+ </open>
+ <main_script>TestExecution</main_script>
+ <campaigns />
+ <ext_att />
+ <ext_mp />
+ <tc_sel />
+</user_space>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/TestExecution.mmtcs
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/TestExecution.mmtcs	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/TestExecution.mmtcs	(revision 22)
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<tctypes>
+ <items>
+  <cls>
+   <name>TSystemAdapter</name>
+   <tcc>
+    <ports>
+     <cls>
+      <name>port1</name>
+      <port />
+      <null />
+      <auto />
+     </cls>
+    </ports>
+    <log />
+    <open />
+   </tcc>
+  </cls>
+  <cls>
+   <name>TMainTC</name>
+   <tcc>
+    <ports>
+     <cls>
+      <name>port1</name>
+      <port />
+      <null />
+      <auto />
+     </cls>
+    </ports>
+    <log />
+    <open />
+   </tcc>
+  </cls>
+ </items>
+</tctypes>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/TestingEnvironment1.xmmte
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/TestingEnvironment1.xmmte	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/MMagic/TestingEnvironment1.xmmte	(revision 22)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<te>
+ <name>TestingEnvironment1</name>
+ <system>
+  <tc>
+   <class>TSystemAdapter</class>
+  </tc>
+ </system>
+ <mtc>
+  <tc>
+   <class>TMainTC</class>
+  </tc>
+ </mtc>
+ <tcs />
+ <def />
+ <port_map>
+  <item>
+   <p1>
+    <tc>system</tc>
+    <port>port1</port>
+   </p1>
+   <p2>
+    <tc>mtc</tc>
+    <port>port1</port>
+   </p2>
+  </item>
+ </port_map>
+</te>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/Makefile
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/Makefile	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/Makefile	(revision 22)
@@ -0,0 +1,95 @@
+ifeq '$(T3DK_TOOL)' 'mmagic'
+BOOST_LIB_SUFFIX  = -mt
+TOOL_SPECIFIC_LIBS  = -lws2_32
+TOOL_SPECIFIC_LDFLAGS = -L/opt/boost-mingw/lib
+else
+BOOST_LIB_SUFFIX  = $(if $(shell uname -o | grep Cygwin),-gcc-mt,-mt)
+endif
+
+# Original STF 370 TTCN-3 source code
+T3DK_TTCN_SOURCES_STF370 = $(wildcard validation/*.ttcn \
+      ../../LibCommon/*.ttcn \
+      ../LibSip/ttcn/LibSip_Interface.ttcn \
+      ../LibSip/ttcn/LibSip_SDPTypes.ttcn \
+      ../LibSip/ttcn/LibSip_SIPTypesAndValues.ttcn \
+      ../codec/validation/LibSip_DummyXMLTypes.ttcn \
+      ../ttcn/LibIot/*.ttcn \
+      ../ttcn/LibUpperTester/LibUpperTester.ttcn \
+      ../ttcn/LibIms_ConfigAndTrigger/LibIms_UpperTester.ttcn \
+      ../ttcn/AtsImsIot/AtsImsIot_Functions.ttcn \
+      ../ttcn/AtsImsIot/AtsImsIot_TypesAndValues.ttcn \
+      ../ttcn/AtsImsIot/AtsImsIot_TestConfiguration.ttcn )
+
+# Modified STF 370 TTCN-3 source code to make adapter running properly
+T3DK_TTCN_SOURCES_VALIDATION = $(wildcard validation/*.ttcn \
+      validation/LibCommon/*.ttcn \
+      validation/LibIot/*.ttcn \
+      validation/LibUpperTester/LibUpperTester.ttcn \
+      validation/generic_interface_configuration/Interface_configuration.ttcn \
+      validation/LibIms_ConfigAndTrigger/LibIms_UpperTester.ttcn \
+      validation/AtsImsIot/AtsImsIot_TypesAndValues.ttcn \
+      validation/AtsImsIot/AtsImsIot_TestSystem.ttcn \
+      validation/AtsImsIot/AtsImsIot_TestConfiguration.ttcn \
+      validation/AtsImsIot/AtsImsIot_Functions.ttcn \
+      validation/AtsImsIot/AtsImsIot_Templates.ttcn \
+      ../codec/validation/LibSip_Interface.ttcn \
+      ../codec/validation/LibSip_SDPTypes.ttcn \
+      ../codec/validation/LibSip_SIPTypesAndValues.ttcn \
+      ../codec/validation/LibSip_DummyXMLTypes.ttcn )
+
+T3DK_TTCN_SOURCES = $(T3DK_TTCN_SOURCES_STF370) #$(T3DK_TTCN_SOURCES_VALIDATION)
+
+T3DK_ROOT_MODULE  = TestExecution
+
+T3DK_C_SOURCES    = $(wildcard src/*.c)
+T3DK_CXX_SOURCES  = $(T3DK_CXX_TCI_SOURCES) $(T3DK_CXX_TRI_SOURCES)
+T3DK_CXX_TCI_SOURCES  = $(wildcard src/libiot_codets.cpp ../codec/c++/s*.cpp)
+T3DK_CXX_TRI_SOURCES  = $(wildcard src/init.cpp \
+      src/Ports/*.cpp \
+      src/LowerTestAdapter/*.cpp \
+      src/Messages/*.cpp \
+      src/PacketFilter/*.cpp \
+      src/UpperTestAdapter/*.cpp \
+      src/UpperTestAdapter/Processors/*.cpp \
+      src/UpperTestAdapter/TriggerCommandsOffLine/*.cpp \
+      src/UpperTestAdapter/TriggerCommandsGUI/*.cpp \
+      src/Helper/*.cpp \
+      src/Logger/*.cpp \
+      src/Dispatcher/*.cpp \
+      )
+
+T3DK_LIBS   = $(TOOL_SPECIFIC_LIBS) \
+      -lboost_date_time$(BOOST_LIB_SUFFIX) \
+      -lboost_thread$(BOOST_LIB_SUFFIX) \
+      -lboost_regex$(BOOST_LIB_SUFFIX)
+
+T3DK_CDGEN_HEADER       = src/codec.h
+T3DK_CODETS             = $(wildcard src/codec.h src/libiot_codets.h src/libiot_codets.cpp ../codec/c++/s*.h ../codec/c++/s*.cpp ../codec/c++/libcommon_codets.h)
+
+T3DK_DEBUG   = 1
+
+CPPFLAGS    = -Isrc \
+      -Isrc/LowerTestAdapter \
+      -Isrc/UpperTestAdapter \
+      -Isrc/Helper \
+      -Isrc/Logger \
+      -Isrc/Dispatcher \
+      -I../codec/c++
+ 
+CC      = gcc
+CXX     = g++
+
+CFLAGS      = -g -O2
+CXXFLAGS    = -g -O2 
+T3DK_LDFLAGS    = $(TOOL_SPECIFIC_LDFLAGS)
+
+ifeq '$(T3DK_TOOL)' 'mmagic'
+include $(shell mingw32-t3devkit-config --mk)
+else
+ifeq '$(T3DK_TOOL)' 'ttwb'
+include $(shell mingw32-t3devkit-config --mk)
+else
+include $(shell t3devkit-config --mk)
+endif
+endif
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/mm/Adapter.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/mm/Adapter.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/mm/Adapter.cpp	(revision 22)
@@ -0,0 +1,166 @@
+extern "C"
+{
+	#include "TriChannel.h"
+}
+#ifdef WIN32
+#include <Windows.h>
+#endif
+#include <boost/thread/thread.hpp>
+#include <boost/thread/condition.hpp>
+#include "tri-sa.h"
+#include "tri-pa.h"
+#include "Logger/Logger.h"
+#include <iostream>
+
+static boost::mutex exitMutex;
+static boost::condition exitCondition;
+
+void onConnectionClosed()
+{
+	boost::mutex::scoped_lock localLock(exitMutex);
+	exitCondition.notify_one();
+}
+
+int main(int argc, char **argv)
+{
+	if (argc == 2 && strcmp(argv[1], "-help") == 0)
+	{
+		std::cout << "Usage: Adapter [-a address][-p port_number]" << std::endl;
+		std::cout << "-a address       Specifies MessageMagic IP address. 127.0.0.1 is used by" << std::endl;
+		std::cout << "                 default." << std::endl;
+		std::cout << "-p port_number   Specifies MessageMagic port. 7777 is used by default." << std::endl;
+		std::cout << "-L*              Sets the log level. Log levels can be combined together." << std::endl;
+		std::cout << "                 The following log levels are available:" << std::endl;
+		std::cout << "   -Linfo        Displays information messages" << std::endl;
+		std::cout << "   -Lerr         Displays errors" << std::endl;
+		std::cout << "   -Lwarn        Displays warnings" << std::endl;
+		std::cout << "   -Ldebug       Displays debugging information" << std::endl;
+		std::cout << "   -Lall         Displays all information" << std::endl;
+		std::cout << "   -Lnone        No messages are displayed" << std::endl;
+		return 0;
+	}
+
+	int nLogMode = 0;
+	bool bLogModeSet = false;
+	bool bError = false;
+	Logger::Instance().SetLoggingMode(Logger::LOG_ERRORS);
+	char * pszAddr = "127.0.0.1";
+	int nPort = 7777;
+	for (int i = 1; i < argc; ++i)
+	{
+		bool bLog = false;
+		char * pszArg = argv[i];
+		if (strcmp(pszArg, "-p") == 0)
+		{
+			if (bError = i + 1 == argc)
+				std::cout << "Port value missing" << std::endl;
+			else
+			{
+				pszArg = argv[++i];
+				nPort = atoi(pszArg);
+			}
+		}
+		else if (strcmp(pszArg, "-a") == 0)
+		{
+			if (bError = i + 1 == argc)
+				std::cout << "Address value missing" << std::endl;
+			else
+			{
+				pszArg = argv[++i];
+				pszAddr = pszArg;
+			}
+		}
+		else if (bLog = strcmp(pszArg, "-Linfo") == 0)
+			nLogMode |= Logger::LOG_INFO;
+		else if (bLog = strcmp(pszArg, "-Lerr") == 0)
+			nLogMode |= Logger::LOG_ERRORS;
+		else if (bLog = strcmp(pszArg, "-Lwarn") == 0)
+			nLogMode |= Logger::LOG_WARNINGS;
+		else if (bLog = strcmp(pszArg, "-Ldebug") == 0)
+			nLogMode |= Logger::LOG_DEBUG | Logger::LOG_INFO;
+		else if (bLog = strcmp(pszArg, "-Lall") == 0)
+			nLogMode = Logger::LOG_ALL;
+		else if (bLog = strcmp(pszArg, "-Lnone") == 0)
+			nLogMode = Logger::LOG_NOTHING;
+		else
+		{
+			bError = true;
+			std::string s = "Unknown command line parameter \"";
+			s += pszArg;
+			s += "\"";
+			std::cout << s << std::endl;
+		}
+		if (bLog)
+			bLogModeSet = true;
+	}
+	if (bError)
+		return 1;
+	if (!bLogModeSet)
+		nLogMode = Logger::LOG_INFO | Logger::LOG_ERRORS;
+	Logger::Instance().SetLoggingMode(nLogMode);
+	Logger::Instance().LogDebug("Command line parameters processed successfully");
+
+
+#ifdef WIN32
+	// Winsock init
+	WSADATA w;
+	if (WSAStartup(0x0002, &w))
+	{
+		std::cout << "Error initiating Winsock library" << std::endl;
+		return 1;
+	}
+#endif
+	// Map callbacks
+	setTriSAResetCallback (triSAReset);
+	setTriExecuteTestCaseCallback (triExecuteTestCase);
+	setTriMapCallback (triMap);
+	setTriUnmapCallback (triUnmap);
+	setTriEndTestCaseCallback (triEndTestcase);
+	setTriSendCallback (triSend);
+	//setTriSendBCCallback (triSendBC);
+	//setTriSendMCCallback (triSendMC);
+	setTriCallCallback (triCall);
+	//setTriCallBCCallback (triCallBC);
+	//setTriCallMCCallback (triCallMC);
+	setTriReplyCallback (triReply);
+	//setTriReplyBCCallback (triReplyBC);
+	//setTriReplyMCCallback (triReplyMC);
+	setTriRaiseCallback (triRaise);
+	//setTriRaiseBCCallback (triRaiseBC);
+	//setTriRaiseMCCallback (triRaiseMC);
+	//setTriSUTActionInformalCallback (triSUTActionInformal);
+	//setTriPAResetCallback (triPAReset);
+	//setTriStartTimerCallback (triStartTimer);
+	//setTriStopTimerCallback (triStopTimer);
+	//setTriReadTimerCallback (triReadTimer);
+	//setTriTimerRunningCallback (triTimerRunning);
+	//setTriExternalFunctionCallback (triExternalFunction);
+
+	// Callback for monitoring connection termination
+	setOnConnectionClosedCallback(onConnectionClosed);
+
+	int nRes = 0;
+	// Create TCP/IP connection
+	if (openTriChannel(pszAddr, nPort, -1, -1, L"Generic T3devkit Adapter"))
+	{
+		std::cout << "TCP/IP connection with MessageMagic established" << std::endl;
+		// Local lock for monitoring exit condition
+		boost::mutex::scoped_lock exitLock(exitMutex);
+		// Waiting for exit condition
+		exitCondition.wait(exitLock);
+		closeTriChannel();
+		std::cout << "TCP/IP connection with MessageMagic closed" << std::endl;
+	}
+	else
+	{
+		std::cout << "Failed to open TRI channel" << std::endl;
+		nRes = 2;
+	}
+#ifdef WIN32
+	// Winsock cleanup
+	WSACleanup();
+#endif
+	return 2;
+}
+
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/mm/tri-pa.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/mm/tri-pa.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/mm/tri-pa.h	(revision 22)
@@ -0,0 +1,15 @@
+#ifndef MM_TRI_PA
+#define MM_TRI_PA
+
+#include "TriStructs.h"
+
+TriStatus triPAReset();
+TriStatus triExternalFunction (const TriFunctionId* functionId,
+			       TriParameterList* parameterList,
+			       TriParameter* returnValue);
+TriStatus triStartTimer (const TriTimerId* timerId, TriTimerDuration timerDuration);
+TriStatus triStopTimer (const TriTimerId* timerId);
+TriStatus triReadTimer (const TriTimerId* timerId, TriTimerDuration* elapsedTime);
+TriStatus triTimerRunning (const TriTimerId* timerId, unsigned char* running);
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/mm/tri-sa.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/mm/tri-sa.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/mm/tri-sa.h	(revision 22)
@@ -0,0 +1,88 @@
+#ifndef MM_TRI_SA
+#define MM_TRI_SA
+
+#include "TriStructs.h"
+
+TriStatus triSAReset();
+
+TriStatus triExecuteTestCase (const TriTestCaseId*     testCaseId,
+				const TriPortIdList*     tsiPortList);
+
+TriStatus triMap (const TriPortId*         compPortId,
+		  const TriPortId*         tsiPortId);
+
+TriStatus triUnmap (const TriPortId* compPortId, const TriPortId* tsiPortId);
+
+TriStatus triSend (const TriComponentId*      componentId,
+				   const TriPortId*           tsiPortId,
+				   const TriAddress*          sutAddress,
+				   const TriMessage*          sendMessage);
+
+TriStatus triCall (const TriComponentId*      componentId,
+ 				   const TriPortId*           tsiPortId, 
+ 				   const TriAddress*          sutAddress, 
+ 				   const TriSignatureId*      signatureId, 
+ 				   const TriParameterList*    parameterList);
+
+TriStatus triReply (const TriComponentId*     componentId,
+  					const TriPortId*          tsiPortId,
+  					const TriAddress*         sutAddress,
+  					const TriSignatureId*     signatureId,
+  					const TriParameterList*   parameterList,
+  					const TriParameter*       returnValue);
+
+TriStatus triRaise (const TriComponentId*     componentId,
+  					const TriPortId*          tsiPortId,
+  					const TriAddress*         sutAddress,
+  					const TriSignatureId*     signatureId,
+  					const TriException*       exception);
+
+TriStatus triSUTActionInformal (const char* description);
+
+TriStatus triSendMC (const TriComponentId    *componentId,
+					 const TriPortId         *tsiPortId,
+					 const TriAddressList    *sutAddresses,
+					 const TriMessage        *sendMessage);
+
+TriStatus triSendBC (const TriComponentId    *componentId,
+					 const TriPortId         *tsiPortId,
+					 const TriMessage        *sendMessage);
+
+TriStatus triCallMC (const TriComponentId    *componentId,
+					 const TriPortId         *tsiPortId,
+					 const TriAddressList    *sutAddresses,
+					 const TriSignatureId    *signatureId,
+					 const TriParameterList  *parameterList);
+
+TriStatus triCallBC (const TriComponentId    *componentId,
+					 const TriPortId         *tsiPortId,
+					 const TriSignatureId    *signatureId,
+					 const TriParameterList  *parameterList);
+
+TriStatus triReplyMC (const TriComponentId   *componentId,
+					  const TriPortId        *tsiPortId,
+					  const TriAddressList   *sutAddresses,
+					  const TriSignatureId   *signatureId,
+					  const TriParameterList *parameterList,
+					  const TriParameter     *returnValue);
+
+TriStatus triReplyBC (const TriComponentId   *componentId,
+					  const TriPortId        *tsiPortId, 
+					  const TriSignatureId   *signatureId, 
+					  const TriParameterList *parameterList, 
+					  const TriParameter     *returnValue);
+
+TriStatus triRaiseMC (const TriComponentId   *componentId, 
+					  const TriPortId        *tsiPortId, 
+					  const TriAddressList   *sutAddresses, 
+					  const TriSignatureId   *signatureId, 
+					  const TriException     *exception);
+
+TriStatus triRaiseBC (const TriComponentId   *componentId, 
+					  const TriPortId        *tsiPortId, 
+					  const TriSignatureId   *signatureId, 
+					  const TriException     *exception);
+
+TriStatus triEndTestcase(void);
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/CaptureDispatch.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/CaptureDispatch.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/CaptureDispatch.h	(revision 22)
@@ -0,0 +1,31 @@
+/**
+ * @file CaptureDispatch.h
+ * This header file defines the CaptureDispatch class.
+ * @author Tomas Urban
+ * @version 0.1
+ * @date 16/07/2009
+ */
+#ifndef CAPTURE_DISPATCH_H
+#define CAPTURE_DISPATCH_H
+
+#include "Messages/CapturedData.h"
+
+/**
+ * An abstract class providing a generic interface for dispatching captured data. The
+ * exact way how the dispatching mechanism works is defined in child classes 
+ * (strategy design pattern).
+ */
+class CaptureDispatch
+{
+protected:
+	CaptureDispatch(void) {};
+public:
+	virtual ~CaptureDispatch(void) {};
+	/**
+	 * Dispatches captured data to the recipient.
+	 * @param pData Captured data to be dispatched
+	 */
+	virtual void DispatchData(CapturedData * pData) = 0;
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/CaptureFactory.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/CaptureFactory.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/CaptureFactory.cpp	(revision 22)
@@ -0,0 +1,51 @@
+/**
+ * @file CaptureFactory.cpp
+ * @author Tomas Urban
+ * @version 0.1
+ * @date 16/07/2009
+ */
+#include "CaptureFactory.h"
+#include "PCAPLiveCapture.h"
+#include "PCAPOfflineCapture.h"
+#include "Logger/Logger.h"
+
+CaptureFactory::CaptureFactory(void)
+{
+}
+
+CaptureFactory::~CaptureFactory(void)
+{
+}
+
+GenericCapture * CaptureFactory::CreateCaptureInstance(ECaptureType captureType,
+		ECaptureMode captureMode)
+{
+	GenericCapture * pInst = NULL;
+	std::string s = "Capture instance created: ";
+	switch (captureType)
+	{
+		case ECaptureType_PCAP:
+			if (captureMode == ECaptureMode_Live)
+			{
+				pInst = new PCAPLiveCapture();
+				s += "PCAP live";
+			}
+			else
+			{
+				pInst = new PCAPOfflineCapture();
+				s += "PCAP offline";
+			}
+			break;
+	}
+	if (pInst)
+		Logger::Instance().LogDebug(s);
+	else
+		Logger::Instance().LogError("Unknown capture type");
+	return pInst;
+}
+void CaptureFactory::DisposeCaptureInstance(GenericCapture * pInstance)
+{
+	delete pInstance;
+}
+
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/CaptureFactory.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/CaptureFactory.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/CaptureFactory.h	(revision 22)
@@ -0,0 +1,43 @@
+/**
+ * @file CaptureFactory.h
+ * This header file defines the CaptureFactory class.
+ * @author Tomas Urban
+ * @version 0.1
+ * @date 16/07/2009
+ */
+#ifndef CAPTURE_FACTORY_H
+#define CAPTURE_FACTORY_H
+
+#include "GenericCapture.h"
+#include "Helper/Singleton.h"
+
+/**
+ * A singleton factory class for instantiating received data messages.
+ */
+class CaptureFactory  : public Singleton<CaptureFactory>
+{
+private:
+	friend class Singleton<CaptureFactory>;
+	CaptureFactory(void);
+public:
+	~CaptureFactory(void);
+	/**
+	 * The factory method for creating capture device instances based on supplied
+	 * device type and mode. The objects returned by this method are allocated on the heap, so they
+	 * have to be disposed when they are not needed anymore by the \c delete operator or
+	 * calling the #DisposeCaptureInstance method.
+	 * @param captureType Type of the capturing device
+	 * @param captureMode Capturing mode (live or offline)
+	 * @return Created device instance or \c NULL if any error has ocurred (e.g. unknown
+	 * or unsupported device).
+	 */
+	GenericCapture * CreateCaptureInstance(ECaptureType captureType,
+		ECaptureMode captureMode);
+	/**
+	 * This method is used for disposing instances allocated by the #CreateCaptureInstance method.
+	 * @param pInstance Capture device instance to be disposed
+	 */
+	void DisposeCaptureInstance(GenericCapture * pInstance);
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/ConnectionController.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/ConnectionController.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/ConnectionController.cpp	(revision 22)
@@ -0,0 +1,261 @@
+/**
+ * @file ConnectionController.cpp
+ * @author Tomas Urban
+ * @version 0.5
+ * @date 23/07/2009
+ */
+#include "ConnectionController.h"
+#include "PCAPLiveCapture.h"
+#include "Logger/Logger.h"
+#include "CaptureFactory.h"
+#include "Messages/TrafficCaptureMessageFactory.h"
+#include "Messages/CommonTrafficCaptureMessages.h"
+#include <boost/filesystem.hpp>
+
+ConnectionController::ConnectionController(SOCKET_TYPE hSocket) :
+	m_hSocket(hSocket),
+	m_pCapture(0)
+{
+}
+
+ConnectionController::~ConnectionController(void)
+{
+	CaptureFactory::Instance().DisposeCaptureInstance(m_pCapture);
+}
+
+void ConnectionController::SendSimpleReply(CommonReplyMessage & reply, bool bRes)
+{
+	reply.SetResult(bRes);
+	send(m_hSocket, reply.GetEncodedMessage(), reply.GetEncodedDataLength(), 0);
+}
+
+void ConnectionController::ProcessMessage(const struct TMessageHeader & header, const char * pPayload,
+										  TcpipDispatch &td)
+{
+	std::string s = "Control message received (id: ";
+	s += boost::lexical_cast<std::string>(header.nMsgType);
+	s += ", len: ";
+	s += boost::lexical_cast<std::string>(header.nMsgLen);
+	s += ")";
+	Logger::Instance().LogDebug(s);
+	TrafficCaptureMessage * pMsg = TrafficCaptureMessageFactory::Instance().CreateMessage(
+		header.nMsgType, pPayload, header.nMsgLen);
+	if (!pMsg)
+		return;
+	const char * pszIgnoreWarn = "Warning: message ignored; the capturing device hasn't been created yet";
+	switch (pMsg->GetId())
+	{
+	case OPEN_DEVICE_REQ:
+		{
+			Logger::Instance().LogInfo("OpenDeviceRequest message received");
+			ECaptureInitResult res = ECaptureInit_Failed;
+			if (m_pCapture == 0)
+			{
+				Logger::Instance().LogDebug("Creating capture instance...");
+				OpenDeviceRequest * pReq = dynamic_cast<OpenDeviceRequest*>(pMsg);
+				m_pCapture = CaptureFactory::Instance().CreateCaptureInstance(
+					pReq->GetCaptureType(), pReq->GetCaptureMode());				
+				if (m_pCapture != 0)
+				{
+					m_pCapture->InitDispatch(&td);
+					m_pCapture->SetStartOffset(pReq->GetTimestamp());
+					Logger::Instance().LogDebug("Initializing capture instance...");
+					res = m_pCapture->OpenDevice(pReq->GetParameters());
+					std::string sFile = pReq->GetCaptureFile();
+					if (res != ECaptureInit_Failed && sFile.length() > 0)
+					{
+						if (!m_pCapture->SetCaptureFile(sFile))
+							res = ECaptureInit_Failed;
+					}
+					if (res == ECaptureInit_Failed)
+					{
+						CaptureFactory::Instance().DisposeCaptureInstance(m_pCapture);
+						m_pCapture = 0;
+					}
+				}				
+			}
+			else
+				Logger::Instance().LogWarning("Capture device has been already created");
+			OpenDeviceReply reply;
+			reply.SetResult(res);
+			send(m_hSocket, reply.GetEncodedMessage(), reply.GetEncodedDataLength(), 0);
+			Logger::Instance().LogDebug("OpenDeviceReply message sent");
+		}
+		break;
+	case SET_FILTER_REQ:
+		Logger::Instance().LogInfo("SetFilterRequest message received");
+		{
+			bool bRes = (m_pCapture != 0);
+			if (bRes)
+			{
+				SetFilterRequest * pReq = dynamic_cast<SetFilterRequest*>(pMsg);
+				std::string sFilter = pReq->GetFilter();
+				std::string s = "The received filter value is: ";
+				s += sFilter;
+				Logger::Instance().LogDebug(s);
+				bRes = m_pCapture->SetFilter(sFilter);
+			}
+			else 
+				Logger::Instance().LogWarning(pszIgnoreWarn);
+			SetFilterReply reply;
+			SendSimpleReply(reply, !bRes);
+			Logger::Instance().LogDebug("SetFilterReply message sent");
+		}
+		break;
+	case START_CAPTURE_REQ:
+		{
+			Logger::Instance().LogInfo("StartCaptureRequest message received");
+			if (m_pCapture)
+				m_pCapture->StartCapture();
+			else 
+				Logger::Instance().LogWarning(pszIgnoreWarn);
+			StartCaptureReply reply;
+			SendSimpleReply(reply, m_pCapture == 0);
+		}
+		Logger::Instance().LogDebug("StartCaptureReply message sent");
+		break;
+	case STOP_CAPTURE_REQ:
+		{
+			Logger::Instance().LogInfo("StopCaptureRequest message received");
+			if (m_pCapture)
+				m_pCapture->StopCapture();
+			else 
+				Logger::Instance().LogWarning(pszIgnoreWarn);
+			StopCaptureReply reply;
+			SendSimpleReply(reply, m_pCapture == 0);
+			Logger::Instance().LogDebug("StopCaptureReply message sent");
+		}
+		break;
+	case MERGE_FILES_REQ:
+		{
+			MergePcapFilesRequest * pReq = dynamic_cast<MergePcapFilesRequest*>(pMsg);
+			Logger::Instance().LogInfo("MergePcapFilesRequest message received");
+			MergePcapFilesReply reply;
+			bool bRes;
+			std::vector<std::string> vsFiles = pReq->GetFilesToMerge();
+			if (bRes = vsFiles.size() > 0)
+			{
+				boost::filesystem::path targetFile = pReq->GetMergePath();
+				targetFile /= "mergefile.pcap";				
+				if (boost::filesystem::exists(targetFile))
+					try
+					{
+						boost::filesystem::remove(targetFile);
+						Logger::Instance().LogDebug(
+							"Merge file from a previous session has been successfully removed");
+					}
+					catch (boost::filesystem::filesystem_error)					
+					{
+						Logger::Instance().LogError(
+							"Merge file from a previous session could not be removed");
+						bRes = false;
+					}
+				else
+					Logger::Instance().LogDebug("No merge file from a previous session");
+				if (bRes)
+				{
+					boost::filesystem::path mergecapPath = pReq->GetMergecapDirectory();
+					mergecapPath /= "mergecap";
+					std::string sCmd = "\"";
+#ifdef WIN32
+					sCmd += "\"";
+#endif
+					sCmd += mergecapPath.string();
+					sCmd += "\" -w \"";
+					sCmd += targetFile.string();
+					sCmd += "\"";
+					for (unsigned int i = 0; i < vsFiles.size(); ++i)
+					{
+						sCmd += " \"";
+						sCmd += vsFiles[i];
+						sCmd += "\"";
+					}
+#ifdef WIN32
+					sCmd += "\"";
+#endif
+					Logger::Instance().LogDebug("Starting mergecap...");
+					Logger::Instance().LogDebug(sCmd);
+					system(sCmd.c_str());
+					reply.SetMergeFile(targetFile.string());
+					if (bRes = boost::filesystem::exists(targetFile))
+						Logger::Instance().LogDebug("Files merged successfully");
+					else
+						Logger::Instance().LogError("File merging failed");
+				}
+					
+			}
+			SendSimpleReply(reply, bRes);
+			Logger::Instance().LogDebug("MergePcapFilesReply message sent");
+		}
+		break;
+	default:
+		Logger::Instance().LogWarning("Warning: the received control message is not supported");
+	}	
+	TrafficCaptureMessageFactory::Instance().DisposeMessage(pMsg);
+}
+
+void ConnectionController::Run()
+{
+	TcpipDispatch td(m_hSocket);
+	Logger::Instance().LogInfo("Waiting for control messages to inialize capturing...");
+
+	// infinite receiving loop: interrupted when the connection is closed
+	TMessageHeader header;
+	int nReceived = 0, nLen, nRemaining;
+	char * pBuf = NULL;
+	while (-1)
+	{
+		if (nReceived < sizeof(header))
+		{
+			nRemaining = sizeof(header) - nReceived;
+			if ((nLen = recv(m_hSocket, reinterpret_cast<char*>(&header) + nReceived, nRemaining, 0)) <= 0)
+				break;
+			nReceived += nLen;
+		}
+		else
+		{
+			if (header.nMsgLen > 0)
+			{
+				if (pBuf == NULL)
+					pBuf = new char[header.nMsgLen];
+				nRemaining = sizeof(header) + header.nMsgLen - nReceived;
+				if ((nLen = recv(m_hSocket, pBuf + nReceived - sizeof(header), nRemaining , 0)) <= 0)
+					break;
+				nReceived += nLen;
+			}
+			if (nReceived == sizeof(header) + header.nMsgLen)
+			{
+				ProcessMessage(header, pBuf, td);
+				delete[] pBuf;
+				pBuf = NULL;
+				nReceived = 0;
+				if (!m_hSocket)
+					break;
+			}
+		}
+	}
+
+	boost::mutex::scoped_lock cond(m_mutex);
+	td.Stop();
+	CaptureFactory::Instance().DisposeCaptureInstance(m_pCapture);
+	m_pCapture = NULL;
+	Logger::Instance().LogInfo("Client connection terminated");
+	if (m_hSocket != SOCKET_CALL_ERROR)
+	{
+		CLOSE_SOCKET(m_hSocket);
+		m_hSocket = SOCKET_CALL_ERROR;
+	}
+	m_captureClosed.notify_one();
+	
+}
+
+void ConnectionController::Stop()
+{
+	boost::mutex::scoped_lock cond(m_mutex);
+	if (m_hSocket != SOCKET_CALL_ERROR)
+	{
+		CLOSE_SOCKET(m_hSocket);
+		m_hSocket = SOCKET_CALL_ERROR;
+		m_captureClosed.wait(cond);		
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/ConnectionController.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/ConnectionController.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/ConnectionController.h	(revision 22)
@@ -0,0 +1,50 @@
+/**
+ * @file ConnectionController.h
+ * This header file defines the TcpipServer class.
+ * @author Tomas Urban
+ * @version 0.2
+ * @date 23/07/2009
+ */
+#ifndef CONNECTION_CONTROLLER_H
+#define CONNECTION_CONTROLLER_H
+
+#include "TcpipDefs.h"
+#include "GenericCapture.h"
+#include "Messages/TrafficCaptureMessage.h"
+#include "TcpipDispatch.h"
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/condition.hpp>
+
+/**
+ * ConnectionController is class which handles a single client TCP/IP connection. It reads requests from
+ * the client, decodes and processes them and replies to them if needed.
+ */
+class ConnectionController
+{
+private:
+	SOCKET_TYPE m_hSocket;
+	GenericCapture * m_pCapture;
+	boost::mutex m_mutex;
+	boost::condition m_captureClosed;
+	void SendSimpleReply(CommonReplyMessage & reply, bool bRes);
+	void ProcessMessage(const struct TMessageHeader & header, const char * pPayload, TcpipDispatch & td);
+public:
+	/**
+	 * Class constructor.
+	 * @param hSocket Handle to client's socket
+	 */
+	ConnectionController(SOCKET_TYPE hSocket);
+	~ConnectionController(void);
+	/**
+	 * The method starts waiting for client's requests and processing them. It is a blocking method
+	 * and it returns only if the connection is interrupted or on client's request to terminate the whole
+	 * session.
+	 */
+	void Run();
+	/**
+	 * The method is used for stopping a running connection controller.
+	 */
+	void Stop();
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/GenericCapture.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/GenericCapture.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/GenericCapture.cpp	(revision 22)
@@ -0,0 +1,68 @@
+/**
+ * @file GenericCapture.cpp
+ * @author Tomas Urban
+ * @version 0.3
+ * @date 23/07/2009
+ */
+#include "GenericCapture.h"
+#include "Logger/Logger.h"
+
+GenericCapture::GenericCapture() :
+	m_pDispatch(0)
+{
+	m_startPoint.tv_sec = 0;
+	m_startPoint.tv_usec = 0;
+	m_offset.tv_sec = 0;
+	m_offset.tv_usec = 0;
+	m_timestamp.tv_sec = 0;
+	m_timestamp.tv_usec = 0;
+}
+
+GenericCapture::~GenericCapture(void)
+{
+	
+}
+
+void GenericCapture::UpdateTimestamp()
+{
+	m_timestamp.tv_sec = m_startPoint.tv_sec + m_offset.tv_sec;
+	m_timestamp.tv_usec = m_startPoint.tv_usec + m_offset.tv_usec;
+	int nSec = m_timestamp.tv_usec / 1000000;
+	if (nSec > 0)
+	{
+		m_timestamp.tv_sec += nSec;
+		m_timestamp.tv_usec -= nSec * 1000000;
+	}
+}
+
+void GenericCapture::SetStartPoint(struct timeval timestamp)
+{
+	m_startPoint = timestamp;
+	UpdateTimestamp();
+}
+
+void GenericCapture::SetStartOffset(struct timeval offset) 
+{ 
+	m_offset = offset;
+	UpdateTimestamp();
+}
+
+void GenericCapture::ProcessCapturedData(CapturedData * pData)
+{
+	if (!m_pDispatch)
+		return;
+	timeval msgTime = pData->GetTimestamp();
+	if (msgTime.tv_sec > m_timestamp.tv_sec ||
+		msgTime.tv_sec == m_timestamp.tv_sec && msgTime.tv_usec >= m_timestamp.tv_usec)
+	{
+		pData->SetCaptureType(GetCaptureType());
+		m_pDispatch->DispatchData(pData);
+	}
+	else
+		Logger::Instance().LogDebug("Captured message discarded (older than start point)");
+}
+
+bool GenericCapture::SetCaptureFile(const std::string sFile) 
+{ 
+	return sFile.length() == 0; 
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/GenericCapture.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/GenericCapture.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/GenericCapture.h	(revision 22)
@@ -0,0 +1,107 @@
+/**
+ * @file GenericCapture.h
+ * This header file defines the GenericCapture class.
+ * @author Tomas Urban
+ * @version 0.2
+ * @date 21/07/2009
+ */
+#ifndef GENERIC_CAPTURE_H
+#define GENERIC_CAPTURE_H
+
+#include "Messages/CapturedData.h"
+#include "CaptureDispatch.h"
+
+
+/**
+ * Abstract class describing a capturing device. It defines the common interface and several
+ * useful methods. However, the capturing code itself must be implemented in child classes
+ * according to the means used for capture (strategy design pattern).
+ */
+class GenericCapture
+{
+private:
+	CaptureDispatch * m_pDispatch;
+	struct timeval m_offset;
+	struct timeval m_startPoint;
+	struct timeval m_timestamp;
+	void UpdateTimestamp();
+protected:
+	GenericCapture();
+	/**
+	 * This method is used for processing the captured data, passing it to an associated
+	 * CaptureDispatch object.
+	 * @param pData Data to process
+	 */
+	void ProcessCapturedData(CapturedData * pData);
+	/**
+	 * Sets the capture start point timestamp which is used in time-based filtering
+	 * @param timestamp Timestamp of the beginning of capture
+	 */
+	void SetStartPoint(struct timeval timestamp);
+public:	
+	virtual ~GenericCapture(void);
+	/**
+	 * Sets the object used for delivering captured data to the final recipient.
+	 */
+	void InitDispatch(CaptureDispatch * pDispatch) { m_pDispatch = pDispatch; }
+	/**
+	 * Initializes capturing object. The parameter contains additional initialization
+	 * data. The format of the data is device specific.
+	 * @param sParams Start-up parameters of the device
+	 * @return Operation success
+	 */
+	virtual ECaptureInitResult OpenDevice(const std::string sParams) = 0;
+	/**
+	 * Sets the path to an associated capture file. This call is used only by devices
+	 * capable of saving traffic into a file. In the default case, the method
+	 * doesn't cause any traffic to be saved.
+	 * @param sFile Name of the target file or empty string if the traffic should not 
+	 * be saved.
+	 * @return \c true if the operation succeeds, \c false otherwise.
+	 */
+	virtual bool SetCaptureFile(const std::string sFile);
+	/**
+	 * Contains device-specific clean-up code.
+	 */
+	virtual void CloseDevice() = 0;	
+	/**
+	 * Sets up the capture filter. If the string is empty, no filtering should be applied.
+	 * The format of the filtering parameter is device specific.
+	 * @param sFilter Filtering data
+	 * @return \c true if the operation was successful, \c false otherwise (e.g. in case
+	 * of invalid filter format)
+	 **/
+	virtual bool SetFilter(const std::string sFilter) = 0;
+	/**
+	 * Starts or resumes data capture on the device
+	 * @return \c true if the operation was successful, \c false otherwise
+	 */	
+	virtual bool StartCapture() = 0;
+	/**
+	 * Stops or suspends data capture on the device
+	 * @return \c true if the operation was successful, \c false otherwise
+	 */	
+	virtual bool StopCapture() = 0;
+	/**
+	 * Returns the type of the capturing device.
+	 * @return Capture type
+	 */
+	virtual ECaptureType GetCaptureType() = 0;
+	/**
+	 * Returns the offset of the time-based capturing filter. If the returned value is equal
+	 * to zero, no time-based filter is applied.
+	 * @return Offset used for time-based filtering
+	 */
+	struct timeval GetStartOffset() const { return m_offset; }
+	/**
+	 * Sets the offset of the time-based capturing filter. If the timestamp value is equal
+	 * to zero, no time-based filter is applied. Otherwise the capturing device automatically
+	 * discards captured messages whose timestamp is smaller than the specified offset. The
+	 * offset is related to the first captured message.
+	 * @param offset Offset used for time-based filtering
+	 */
+	void SetStartOffset(struct timeval offset);
+};
+
+#endif
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPCapture.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPCapture.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPCapture.cpp	(revision 22)
@@ -0,0 +1,255 @@
+/**
+ * @file PCAPCapture.cpp
+ * @author Tomas Urban
+ * @version 0.4
+ * @date 23/07/2009
+ */
+#include "PCAPCapture.h"
+#include <boost/thread/thread.hpp>
+#include <boost/tokenizer.hpp>
+#include "Logger/Logger.h"
+
+PCAPCapture::PCAPCapture() :
+	m_fp(NULL),
+	m_nHandleCount(0),
+	m_bRunning(false),
+	m_dumpFiles(0),
+	m_threadRunning(0)
+{
+}
+
+PCAPCapture::~PCAPCapture() 
+{
+	CloseDevice();	
+}
+
+pcap_t * PCAPCapture::OpenPcapSource(const std::string sSource)
+{
+	char errbuf[PCAP_ERRBUF_SIZE];
+	return pcap_open(sSource.c_str(), SNAP_LEN, PCAP_OPENFLAG_PROMISCUOUS,
+		1000, NULL, errbuf);
+}
+
+void PCAPCapture::CloseDevice()
+{
+	if (m_fp != NULL)
+	{
+		StopCapture();
+		CloseCaptureFile();
+		for (int i = 0; i < m_nHandleCount; i++)
+			pcap_close(m_fp[i]);
+		delete m_fp;
+		m_fp = NULL;
+		m_threadRunning = NULL;
+		m_nHandleCount = 0;
+	}
+}
+void PCAPCapture::SetPcapHandles(pcap_t ** srcBuf, int nLen)
+{
+	CloseDevice();
+	m_fp = new pcap_t*[nLen];
+	m_nHandleCount = nLen;
+	memcpy(m_fp, srcBuf, nLen * sizeof(pcap_t*));
+	m_threadRunning = new bool[nLen];
+	memset(m_threadRunning, 0, nLen * sizeof(bool));
+}
+
+void PCAPCapture::DispatcherHandler(u_char *temp1, 
+                        const struct pcap_pkthdr *header, const u_char *pkt_data)
+{	
+	PCAPCapture::CapturingThread * pThread = reinterpret_cast<PCAPCapture::CapturingThread*>(temp1);
+	PCAPCapture * pObj = pThread->m_pCapture;
+	int nIndex = pThread->m_nHandleIndex;
+	if (pObj->m_dumpFiles)
+	{
+		boost::mutex::scoped_lock lock(pObj->m_mutex);
+		pcap_dump(reinterpret_cast <u_char*>(pObj->m_dumpFiles[nIndex]), header, pkt_data);
+	}
+	CapturedData cd;
+	cd.SetData(header->caplen, reinterpret_cast <const char*> (pkt_data));
+	cd.SetTimestamp(header->ts);
+	if (pObj->m_fp)
+		pObj->ProcessCapturedData(&cd);
+}
+
+PCAPCapture::CapturingThread::CapturingThread(PCAPCapture * pCapture, int nHandleIndex) :
+	m_pCapture(pCapture),
+	m_nHandleIndex(nHandleIndex)
+{
+}
+
+void PCAPCapture::CapturingThread::operator()()
+{
+	std::string s = "Packet capture started";
+	std::string s2 = "";
+	if (m_pCapture->m_nHandleCount > 1)
+	{
+		s2 = " (source #";
+		s2 += boost::lexical_cast<std::string>(m_nHandleIndex + 1);
+		s2 += ")";
+		s += s2;
+	}
+	Logger::Instance().LogDebug(s);
+
+	pcap_loop(m_pCapture->m_fp[m_nHandleIndex], 0, PCAPCapture::DispatcherHandler, 
+		reinterpret_cast <u_char*> (this));
+
+	s = "Packet capture ended";
+	s += s2;
+	Logger::Instance().LogDebug(s);
+	{
+		boost::mutex::scoped_lock(m_pCapture->m_mutex);
+		m_pCapture->m_threadRunning[m_nHandleIndex] = false;
+		if (m_pCapture->m_bRunning)
+			m_pCapture->m_threadClosed.notify_one();
+	}
+}
+
+bool PCAPCapture::StartCapture()
+{
+	if (m_bRunning)
+		return true;
+	m_bRunning = true;
+	if (m_fp)		
+	{
+		for (int i = 0; i < m_nHandleCount; i++)
+		{
+			m_threadRunning[i] = true;
+			boost::thread thread(CapturingThread(this, i));
+		}
+	}
+	return true;
+}
+
+bool PCAPCapture::StopCapture()
+{	
+	if (!m_bRunning)
+		return true;
+	m_bRunning = false;
+	if (m_fp)
+	{
+		for (int i = 0; i < m_nHandleCount; i++)
+		{
+			boost::mutex::scoped_lock cond(m_mutex);
+			if (m_threadRunning[i])
+			{
+				pcap_breakloop(m_fp[i]);
+				m_threadClosed.wait(cond);
+			}
+		}
+	}
+	return true;
+}
+
+bool PCAPCapture::SetFilter(const std::string sFilter)
+{
+	if (!m_fp)
+	{
+		Logger::Instance().LogWarning("Cannot apply filter; the capture device is not open");
+		return false;
+	}
+	
+	std::string sFormattedFilter = sFilter;
+
+	// compile the filter		
+	struct bpf_program fcode;
+	std::string s = "Setting PCAP filter (";
+	s += sFormattedFilter;
+	s += ")...";
+	Logger::Instance().LogDebug(s);
+	bool bRes = true;
+	for (int i = 0; i < m_nHandleCount; i++)
+	{		
+		if (m_nHandleCount > 1)
+		{
+			s = "Applying filter to source #";
+			s += boost::lexical_cast<std::string>(i + 1);
+			s += "...";
+			Logger::Instance().LogDebug(s);
+		}				
+		if (pcap_compile(m_fp[i], &fcode, sFormattedFilter.c_str(), 1, 0) < 0)
+		{
+			Logger::Instance().LogError("Error compiling packet filter");
+			bRes = false;
+			continue;
+		}
+	    
+		//set the filter
+		int nRes = pcap_setfilter(m_fp[i], &fcode);
+		pcap_freecode(&fcode);
+		if (nRes < 0)
+		{
+			Logger::Instance().LogError("Error setting packet filter");
+			bRes = false;
+			continue;
+		}		
+		Logger::Instance().LogInfo("Filter applied successfully");
+	}
+	Logger::Instance().LogDebug("PCAP filter ready");
+	return bRes;
+}
+
+void PCAPCapture::CloseCaptureFile()
+{
+	if (m_dumpFiles)
+	{
+		boost::mutex::scoped_lock lock(m_mutex);
+		for (int i = 0; i < m_nHandleCount; i++)
+			pcap_dump_close(m_dumpFiles[i]);
+		delete m_dumpFiles;
+		m_dumpFiles = 0;
+	}
+}
+
+bool PCAPCapture::InitCaptureFile(const std::string sFile)
+{
+	if (!m_nHandleCount)
+		return false;
+	CloseCaptureFile();
+	bool bRes = true;
+	if (sFile.length() > 0)
+	{
+		boost::mutex::scoped_lock lock(m_mutex);
+		m_dumpFiles = new pcap_dumper_t * [m_nHandleCount];
+		memset(m_dumpFiles, 0, sizeof(pcap_dumper_t*) * m_nHandleCount);
+
+		std::string sName = sFile;
+		std::string sExt = "";
+		if (m_nHandleCount > 1)
+		{
+			size_t nSize = sFile.find_last_of('.');
+			if (nSize < sFile.length())
+			{
+				sName = sFile.substr(0, nSize);
+				sExt = sFile.substr(nSize);
+			}
+		}
+		
+		for (int i = 0; i < m_nHandleCount; i++)
+		{
+			std::string sTmp = sFile;
+			if (m_nHandleCount > 1)
+			{
+				sTmp = sName;
+				sTmp += boost::lexical_cast<std::string>(i + 1);
+				sTmp += sExt;
+			}
+			m_dumpFiles[i] = pcap_dump_open(m_fp[i], sTmp.c_str());
+			if (!m_dumpFiles[i])
+			{
+				std::string s = "Failed to create dump file \"";
+				s += sTmp;
+				s += "\"";
+				Logger::Instance().LogError(s);
+				return false;
+			}
+		}
+		Logger::Instance().LogDebug("PCAP dump file successfully initialized");
+	}
+	else
+		Logger::Instance().LogDebug("Dump file disabled");
+	return true;;
+}
+
+
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPCapture.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPCapture.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPCapture.h	(revision 22)
@@ -0,0 +1,77 @@
+/**
+ * @file PCAPCapture.h
+ * This header file defines the PCAPCapture class.
+ * @author Tomas Urban
+ * @version 0.2
+ * @date 22/07/2009
+ */
+#ifndef PCAP_CAPTURE_H
+#define PCAP_CAPTURE_H
+
+#include "GenericCapture.h"
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/condition.hpp>
+
+#define HAVE_REMOTE
+#include "pcap/pcap.h"
+
+/**
+ * This abstract class describes capturing based on the pcap library.
+ */
+class PCAPCapture :	public GenericCapture
+{
+private:
+	static const int SNAP_LEN = 0x1000; 
+	pcap_t ** m_fp; //array of pcap handles
+	int m_nHandleCount;
+	bool * m_threadRunning;
+	static void DispatcherHandler(u_char * temp1, const struct pcap_pkthdr *header, const u_char *pkt_data);
+	boost::mutex m_mutex;
+	boost::condition m_threadClosed;
+	bool m_bRunning;
+	pcap_dumper_t ** m_dumpFiles;
+	void CloseCaptureFile();	
+	class CapturingThread
+	{ 
+	public:
+		PCAPCapture * m_pCapture;
+		int m_nHandleIndex;
+		CapturingThread(PCAPCapture * pCapture, int nHandleIndex);
+		void operator()();
+	}; 
+protected:
+	PCAPCapture();	
+	/**
+	 * Saves supplied array of pcap sources for later use. This method is usually called
+	 * by the #OpenDevice method of child classes.
+	 * @param srcBuf Source array
+	 * @param nLen Number of elements in the source array
+	 */
+	void SetPcapHandles(pcap_t ** srcBuf, int nLen);
+	/**
+	 * Helper method for opening a pcap data source
+	 * @return Pointer to the pcap source or \c NULL if the operation is not successful.
+	 */
+	pcap_t * OpenPcapSource(const std::string sSource);
+	/**
+	 * Helper method for setting up data saving into a file. It is used by child classes
+	 * that allow data saving into a file.
+	 * @param sFile Path to the capture file
+	 */
+	bool InitCaptureFile(const std::string sFile);
+public:
+	virtual ~PCAPCapture(void);
+	virtual ECaptureType GetCaptureType() { return ECaptureType_PCAP; }
+	/**
+	 * Sets a traffic filter. The filter must follow pcap library syntax for filtering expressions.
+	 * @param sFilter Filtering data in pcap format
+	 * @return \c true if the operation was successful, \c false otherwise (e.g. in case
+	 * of invalid filter format)
+	 */
+	virtual bool SetFilter(const std::string sFilter);
+	virtual void CloseDevice();
+	virtual bool StartCapture();
+	virtual bool StopCapture();
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPLiveCapture.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPLiveCapture.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPLiveCapture.cpp	(revision 22)
@@ -0,0 +1,81 @@
+/**
+ * @file PCAPLiveCapture.cpp
+ * @author Tomas Urban
+ * @version 0.4
+ * @date 23/07/2009
+ */
+#include <boost/tokenizer.hpp>
+#include "PCAPLiveCapture.h"
+#include "Logger/Logger.h"
+#include <ctime>
+
+PCAPLiveCapture::PCAPLiveCapture()
+{
+}
+
+PCAPLiveCapture::~PCAPLiveCapture(void)
+{
+}
+
+ECaptureInitResult PCAPLiveCapture::OpenDevice(const std::string sParams)
+{
+	CloseDevice();
+	int nCounter = 1;
+	const char * pszData = sParams.c_str();
+	for (int i = 0; pszData[i]; i++)
+		if (pszData[i] == ';')
+			++nCounter;
+
+	pcap_t ** tmpBuf = new pcap_t*[nCounter];
+	
+	std::string sTmp = sParams;	
+	boost::char_separator<char> sep(";");
+	boost::tokenizer<boost::char_separator<char> > tokens(sTmp, sep);
+	nCounter = 0;
+	ECaptureInitResult res = ECaptureInit_Successful;
+	for(boost::tokenizer<boost::char_separator<char> >::iterator it = tokens.begin(); 
+		it != tokens.end(); ++it)
+	{
+		pcap_t * pHandle = OpenPcapSource(it->c_str());
+		if (pHandle)
+			tmpBuf[nCounter++] = pHandle;
+		else
+		{
+			std::string s = "Failed to open adapter \"";
+			s += *it;
+			s += "\" for packet capture.";
+			Logger::Instance().LogWarning(s);
+			res = ECaptureInit_PartiallySuccessful;
+		}
+	}
+
+	bool bRes = true;
+	if (nCounter > 0)
+	{
+		SetPcapHandles(tmpBuf, nCounter);
+		std::string s = boost::lexical_cast<std::string>(nCounter);
+		s += " adapter(s) available for packet capture";
+		Logger::Instance().LogInfo(s);
+		timeval timestamp;
+		timestamp.tv_usec = 0;
+#ifdef WIN32
+		timestamp.tv_sec = static_cast<long>(time(0));
+#else
+		timestamp.tv_sec = time(0);
+#endif
+		SetStartPoint(timestamp);
+	}
+	else
+	{
+		Logger::Instance().LogError("No adapter available for packet capture");
+		res = ECaptureInit_Failed;
+	}
+	delete tmpBuf;
+	return res;
+}
+
+bool PCAPLiveCapture::SetCaptureFile(const std::string sFile)
+{
+	return InitCaptureFile(sFile);
+}
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPLiveCapture.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPLiveCapture.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPLiveCapture.h	(revision 22)
@@ -0,0 +1,41 @@
+/**
+ * @file PCAPLiveCapture.h
+ * This header file defines the PCAPLiveCapture class.
+ * @author Tomas Urban
+ * @version 0.3
+ * @date 22/07/2009
+ */
+#ifndef PCAP_LIVE_CAPTURE_H
+#define PCAP_LIVE_CAPTURE_H
+
+#include "PCAPCapture.h"
+/**
+ * Class used for real-time capture from network adapters using the pcap library.
+ */
+class PCAPLiveCapture :
+	public PCAPCapture
+{
+public:
+	PCAPLiveCapture();
+	virtual ~PCAPLiveCapture(void);
+	/**
+	 * Initializes capturing object. The parameter contains a semicolon-separated list 
+	 * of adapters in the pcap source syntax (i.e. rpcap:://Device). For more information
+	 * about the format, please check pcap documentation.
+	 * @param sParams List of adapters for capturing
+	 * @return Operation success
+	 */	
+	virtual ECaptureInitResult OpenDevice(const std::string sParams);	
+	/**
+	 * Sets the path to a file into which the device should save captured traffic. 
+	 * A successful #OpenDevice() call must precede, otherwise the method returns \c false.
+	 * If capture is performed on several network adapters, several files will be created
+	 * with adapter's ordinal number appended to the file name.
+	 * @param sFile Name of the target file or empty string if the traffic should not 
+	 * be saved.
+	 * @return Operation success
+	 */
+	virtual bool SetCaptureFile(const std::string sFile);
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPOfflineCapture.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPOfflineCapture.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPOfflineCapture.cpp	(revision 22)
@@ -0,0 +1,40 @@
+/**
+ * @file PCAPOfflineCapture.cpp
+ * @author Tomas Urban
+ * @version 0.4
+ * @date 23/07/2009
+ */
+#include "PCAPOfflineCapture.h"
+#include "Logger/Logger.h"
+
+PCAPOfflineCapture::PCAPOfflineCapture()
+{
+}
+
+PCAPOfflineCapture::~PCAPOfflineCapture(void)
+{
+}
+
+ECaptureInitResult PCAPOfflineCapture::OpenDevice(const std::string sParams)
+{
+	CloseDevice();
+	char errbuf[PCAP_ERRBUF_SIZE];
+	char source[PCAP_BUF_SIZE];
+
+	if ( pcap_createsrcstr( source, PCAP_SRC_FILE, NULL, NULL, sParams.c_str(), errbuf) != 0)
+		return ECaptureInit_Failed;
+
+	pcap_t * fp = OpenPcapSource(source);
+	if (!fp)
+		return ECaptureInit_Failed;
+
+	pcap_pkthdr header;
+	if (pcap_next(fp, &header))
+		SetStartPoint(header.ts);
+	pcap_close(fp);
+	fp = OpenPcapSource(source);
+	
+
+	SetPcapHandles(&fp, 1);
+	return ECaptureInit_Successful;
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPOfflineCapture.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPOfflineCapture.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/PCAPOfflineCapture.h	(revision 22)
@@ -0,0 +1,31 @@
+/**
+ * @file PCAPOfflineCapture.h
+ * This header file defines the PCAPOfflineCapture class.
+ * @author Tomas Urban
+ * @version 0.1
+ * @date 16/07/2009
+ */
+#ifndef PCAP_OFFLINE_CAPTURE_H
+#define PCAP_OFFLINE_CAPTURE_H
+
+#include "PCAPCapture.h"
+/**
+ * Class used for reading traffic logs stored in the pcap format.
+ */
+class PCAPOfflineCapture :
+	public PCAPCapture
+{
+
+public:
+	PCAPOfflineCapture();
+	virtual ~PCAPOfflineCapture(void);
+	/**
+	 * Initializes capturing object. The parameter shall contain a path to the traffic log file.
+	 * @param sParams Log file path
+	 * @return Operation success
+	 */	
+	virtual ECaptureInitResult OpenDevice(const std::string sParams);
+};
+
+#endif
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipDefs.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipDefs.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipDefs.h	(revision 22)
@@ -0,0 +1,28 @@
+/**
+ * @file TcpipDefs.h
+ * The file contains definitions needed for socket communication allowing to compile
+ * the code with VisualStudio (using Winsock2 library) and with g++ (using POSIX sockets).
+ * @author Tomas Urban
+ * @version 0.1
+ * @date 16/07/2009
+ */
+#ifndef TCPIP_DEFS_H
+#define TCPIP_DEFS_H
+
+#ifdef WIN32
+#include <Winsock2.h>
+#include <Ws2tcpip.h>
+#define SOCKET_TYPE SOCKET /**< Defines compiler-specific socket handle type */
+#define SOCKET_CALL_ERROR INVALID_SOCKET /**< Defines compiler-specific error value of some socket functions */
+#define CLOSE_SOCKET closesocket /**< Defines compiler-specific function for closing sockets */
+#else
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#define SOCKET_TYPE int /**< Defines compiler-specific socket handle type */
+#define SOCKET_CALL_ERROR -1 /**< Defines compiler-specific error value of some socket functions */
+#define CLOSE_SOCKET close /**< Defines compiler-specific function for closing sockets */
+#endif
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipDispatch.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipDispatch.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipDispatch.cpp	(revision 22)
@@ -0,0 +1,36 @@
+/**
+ * @file TcpipDispatch.cpp
+ * @author Tomas Urban
+ * @version 0.2
+ * @date 23/07/2009
+ */
+#include "TcpipDispatch.h"
+#include "Logger/Logger.h"
+
+TcpipDispatch::TcpipDispatch(SOCKET_TYPE hSocket)
+{
+	m_hSocket = hSocket;
+}
+
+TcpipDispatch::~TcpipDispatch(void)
+{
+	Stop();
+}
+
+void TcpipDispatch::Stop()
+{
+	m_hSocket = 0;
+}
+
+void TcpipDispatch::DispatchData(CapturedData * pData)
+{
+	if (m_hSocket)
+	{		
+		{
+			boost::mutex::scoped_lock lock(m_mutex);
+			// send data
+			send(m_hSocket, pData->GetEncodedMessage(), pData->GetEncodedDataLength(), 0);
+		}
+		Logger::Instance().LogCapture(pData->ToString());
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipDispatch.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipDispatch.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipDispatch.h	(revision 22)
@@ -0,0 +1,40 @@
+/**
+ * @file TcpipDispatch.h
+ * This header file defines the TcpipDispatch class.
+ * @author Tomas Urban
+ * @version 0.2
+ * @date 21/07/2009
+ */
+#ifndef TCPIP_DISPATCH_H
+#define TCPIP_DISPATCH_H
+
+#include "CaptureDispatch.h"
+#include <boost/thread/mutex.hpp>
+#include "TcpipDefs.h"
+
+/**
+ * This class uses a TCP/IP connection for dispatching captured data messages.
+ */
+class TcpipDispatch :
+	public CaptureDispatch
+{
+private:
+	boost::mutex m_mutex;
+	SOCKET_TYPE m_hSocket;
+public:
+	/**
+	 * The constructor requires a handle to an existing socket. This socket is then used
+	 * for sending captured messages to a remote host.
+	 * @param hSocket Socket handle
+	 */
+	TcpipDispatch(SOCKET_TYPE hSocket);
+	virtual ~TcpipDispatch(void);
+	/**
+	 * This method stops sending messages over the underlying TCP/IP connection. The method
+	 * is typically used in closing scenarios.
+	 */
+	void Stop();
+	virtual void DispatchData(CapturedData * pData);
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipServer.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipServer.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipServer.cpp	(revision 22)
@@ -0,0 +1,136 @@
+/**
+ * @file TcpipServer.cpp
+  * @author Tomas Urban
+ * @version 0.3
+ * @date 23/07/2009
+ */
+#include "TcpipServer.h"
+#include <iostream>
+#include <boost/thread/thread.hpp>
+#include <signal.h>
+#include "Logger/Logger.h"
+
+using namespace std;
+
+TcpipServer::TcpipServer(void) :
+	m_hListeningSocket (SOCKET_CALL_ERROR)
+{
+}
+
+TcpipServer::~TcpipServer(void)
+{
+}
+
+void TcpipServer::Run(int nPort)
+{
+	signal(SIGINT, OnExit);
+
+	Logger::Instance().LogDebug("Initializing TCP/IP connection...");
+	
+	// create socket and start listening
+	struct sockaddr_in srvAddr;
+
+	memset(&srvAddr, 0, sizeof srvAddr);
+	srvAddr.sin_family = AF_INET;
+	srvAddr.sin_addr.s_addr = INADDR_ANY;
+	srvAddr.sin_port = htons(nPort);
+
+	if ( (m_hListeningSocket = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_CALL_ERROR )
+	{
+		Logger::Instance().LogError("Error creating listening socket");
+		return;
+	}
+	Logger::Instance().LogDebug("Listening socket successfully created");
+
+	if (bind(m_hListeningSocket, reinterpret_cast<sockaddr*> (&srvAddr), sizeof(srvAddr)) != 0)
+	{
+		Logger::Instance().LogError("Error binding listening socket; the port is probably used by other process");
+		return;
+	}
+
+	Logger::Instance().LogDebug("Listening socket successfully bound");
+
+	if (listen(m_hListeningSocket, 0) != 0 )
+	{
+		Logger::Instance().LogError("Listening operation failed");
+		return;		
+	}
+
+	std::string s = "Waiting for connection request on port ";
+	s += boost::lexical_cast<std::string>(nPort);
+	s += "...";
+	Logger::Instance().LogInfo(s);
+
+	struct sockaddr_in clientAddr;
+	while (-1)
+	{
+		int nLen = sizeof(clientAddr);
+		SOCKET_TYPE sock = accept(
+			m_hListeningSocket, reinterpret_cast<sockaddr*>(&clientAddr), &nLen);
+		if (sock == SOCKET_CALL_ERROR)
+			break;
+		Logger::Instance().LogInfo("Connection accepted");
+		Logger::Instance().LogDebug("Starting socket thread...");
+		ConnectionHandler handler(sock);
+		boost::thread thread(handler);
+	}
+	OnExit();
+}
+
+TcpipServer::ConnectionHandler::ConnectionHandler(SOCKET_TYPE hSocket) :
+	m_hSocket(hSocket)
+{
+}
+
+void TcpipServer::ConnectionHandler::operator()()
+{
+	Logger::Instance().LogDebug("Socket thread started successfully");
+
+	ConnectionController cc(m_hSocket);
+	{
+		boost::mutex::scoped_lock lock(TcpipServer::Instance().m_mutex);
+		TcpipServer::Instance().m_lActiveControllers.push_back(&cc);
+	}
+	cc.Run();
+	{
+		boost::mutex::scoped_lock lock(TcpipServer::Instance().m_mutex);
+		TcpipServer::Instance().m_lActiveControllers.remove(&cc);
+	
+		if (m_hSocket != SOCKET_CALL_ERROR)
+		{
+			CLOSE_SOCKET(m_hSocket);
+			m_hSocket = SOCKET_CALL_ERROR;
+		}
+		Logger::Instance().LogDebug("Socket thread terminated");
+		TcpipServer::Instance().m_operationEnded.notify_one();
+	}
+}
+
+void TcpipServer::OnExit()
+{
+	if (m_hListeningSocket != SOCKET_CALL_ERROR)
+	{
+		{
+			boost::mutex::scoped_lock lock(m_mutex);
+			for(std::list<ConnectionController *>::iterator it = m_lActiveControllers.begin(); 
+				it != m_lActiveControllers.end(); it++)
+				(*it)->Stop();
+		}
+		// wait for threads to quit
+		while (-1)
+		{
+			boost::mutex::scoped_lock cond(m_mutex);
+			if (m_lActiveControllers.begin() == m_lActiveControllers.end())
+				break;
+			m_operationEnded.wait(cond);
+		}
+		CLOSE_SOCKET(m_hListeningSocket);
+		m_hListeningSocket = SOCKET_CALL_ERROR;
+		Logger::Instance().LogDebug("Listening socket closed");
+	}
+}
+
+void TcpipServer::OnExit(int nSig)
+{
+	Instance().OnExit();
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipServer.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipServer.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TcpipServer.h	(revision 22)
@@ -0,0 +1,59 @@
+/**
+ * @file TcpipServer.h
+ * This header file defines the TcpipServer class.
+ * @author Tomas Urban
+ * @version 0.3
+ * @date 23/07/2009
+ */
+#ifndef TCPIP_SERVER_H
+#define TCPIP_SERVER_H
+
+#include "TcpipDefs.h"
+#include "Helper/Singleton.h"
+#include "ConnectionController.h"
+#include <list>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/condition.hpp>
+
+/**
+ * Simple class for creating a listening socket on a certain port and handling incoming connection requests
+ * from clients.
+ */
+class TcpipServer : public Singleton<TcpipServer>
+{
+private:
+	SOCKET_TYPE m_hListeningSocket;
+	boost::mutex m_mutex;
+	boost::condition m_operationEnded;
+	std::list<ConnectionController *> m_lActiveControllers;
+
+	class ConnectionHandler
+	{ 
+	private:
+		SOCKET_TYPE m_hSocket;
+	public:
+		ConnectionHandler(SOCKET_TYPE hSocket);
+		void operator()();
+	}; 
+
+	friend class Singleton<TcpipServer>;
+	TcpipServer(void);
+	void OnExit();
+	static void OnExit(int nSig);
+public:
+	/**
+	 * Default port number
+	 */
+	static int const DEFAULT_PORT = 5501;
+	~TcpipServer(void);
+	/**
+	 * The method opens a TCP/IP socket on a specified port and start listening on it. When a connection
+	 * request is accepted, a new thread is created for handling the communication with the client.
+	 * The method is designed as blocking and it returns only if an error occurs or on a client 
+	 * (i.e. lower tester) request.
+	 * @param nPort Port on which the instance should listen
+	 */
+	void Run(int nPort);
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TrafficCapture.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TrafficCapture.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TrafficCapture.cpp	(revision 22)
@@ -0,0 +1,100 @@
+/**
+ * @file CapturedData.cpp
+ * @author Tomas Urban
+ * @version 0.3
+ * @date 23/07/2009
+ */
+#include "TcpipServer.h"
+#include "Logger/Logger.h"
+#include <iostream>
+
+using namespace std;
+
+int main(int argc, char **argv)
+{
+	if (argc == 2 && strcmp(argv[1], "-help") == 0)
+	{
+		cout << "Usage: TrafficCapture.exe [-p port_number][-Linfo][-Lerr][-Lwarn][-Lcapt]\n";
+		cout << "       [-Ldebug][-Lall][-Lnone]\n";
+		cout << "-p port_number   Specifies the port for TCP/IP communication. 5501 is used\n";
+		cout << "                 by default\n";
+		cout << "-L*              Sets the log level. Log levels can be combined together.\n";
+		cout << "                 The following log levels are available:\n";
+		cout << "   -Linfo        Displays information messages\n";
+		cout << "   -Lerr         Displays errors\n";
+		cout << "   -Lwarn        Displays warnings\n";
+		cout << "   -Ldebug       Displays debugging information\n";
+		cout << "   -Lcapt        Displays capturing information\n";
+		cout << "   -Lall         Displays all information\n";
+		cout << "   -Lnone        No messages are displayed\n";
+		return 0;
+	}
+	int nLogMode = 0;
+	bool bLogModeSet = false;
+	bool bError = false;
+	Logger::Instance().SetLoggingMode(Logger::LOG_ERRORS);
+	int nPort = TcpipServer::DEFAULT_PORT;
+	for (int i = 1; i < argc; ++i)
+	{
+		bool bLog = false;
+		char * pszArg = argv[i];
+		if (strcmp(pszArg, "-p") == 0)
+		{
+			if (bError = i + 1 == argc)
+				Logger::Instance().LogError("Port value missing");
+			else
+			{
+				pszArg = argv[++i];
+				nPort = atoi(pszArg);
+			}
+		}
+		else if (bLog = strcmp(pszArg, "-Linfo") == 0)
+			nLogMode |= Logger::LOG_INFO;
+		else if (bLog = strcmp(pszArg, "-Lerr") == 0)
+			nLogMode |= Logger::LOG_ERRORS;
+		else if (bLog = strcmp(pszArg, "-Lwarn") == 0)
+			nLogMode |= Logger::LOG_WARNINGS;
+		else if (bLog = strcmp(pszArg, "-Lcapt") == 0)
+			nLogMode |= Logger::LOG_CAPTURE;
+		else if (bLog = strcmp(pszArg, "-Ldebug") == 0)
+			nLogMode |= Logger::LOG_DEBUG | Logger::LOG_INFO;
+		else if (bLog = strcmp(pszArg, "-Lall") == 0)
+			nLogMode = Logger::LOG_ALL;
+		else if (bLog = strcmp(pszArg, "-Lnone") == 0)
+			nLogMode = Logger::LOG_NOTHING;
+		else
+		{
+			bError = true;
+			std::string s = "Unknown command line parameter \"";
+			s += pszArg;
+			s += "\"";
+			Logger::Instance().LogError(s);
+		}
+		if (bLog)
+			bLogModeSet = true;
+	}
+
+	if (bError)
+		return 1;
+	if (!bLogModeSet)
+		nLogMode = Logger::LOG_INFO | Logger::LOG_ERRORS;
+	Logger::Instance().SetLoggingMode(nLogMode);
+	Logger::Instance().LogDebug("Command line parameters processed successfully");
+
+#ifdef WIN32
+	// Initialize Winsock.
+	WSADATA wsaData;
+	int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
+	if (iResult != NO_ERROR) 
+	{
+		Logger::Instance().LogError("Error at WSAStartup()\n");
+		return 2;
+	}
+#endif
+	TcpipServer::Instance().Run(nPort);
+#ifdef WIN32
+	WSACleanup();
+#endif
+	return 0;
+}
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TrafficCapture.sln
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TrafficCapture.sln	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TrafficCapture.sln	(revision 22)
@@ -0,0 +1,20 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C++ Express 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrafficCapture", "TrafficCapture.vcproj", "{098C43A2-2F76-4395-A53B-7585150285EC}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Release|Win32 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{098C43A2-2F76-4395-A53B-7585150285EC}.Debug|Win32.ActiveCfg = Debug|Win32
+		{098C43A2-2F76-4395-A53B-7585150285EC}.Debug|Win32.Build.0 = Debug|Win32
+		{098C43A2-2F76-4395-A53B-7585150285EC}.Release|Win32.ActiveCfg = Release|Win32
+		{098C43A2-2F76-4395-A53B-7585150285EC}.Release|Win32.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TrafficCapture.vcproj
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TrafficCapture.vcproj	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/TrafficCapture.vcproj	(revision 22)
@@ -0,0 +1,313 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9,00"
+	Name="TrafficCapture"
+	ProjectGUID="{098C43A2-2F76-4395-A53B-7585150285EC}"
+	RootNamespace="TrafficCapture"
+	TargetFrameworkVersion="196613"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;$(SolutionDir)..&quot;;&quot;C:\Program Files\WinPcap\WpdPack\Include&quot;;&quot;C:\Program Files\boost\boost_1_38&quot;"
+				PreprocessorDefinitions="WIN32;DEBUG"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				WarningLevel="3"
+				DebugInformationFormat="4"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="wpcap.lib ws2_32.lib"
+				LinkIncremental="0"
+				AdditionalLibraryDirectories="&quot;C:\Program Files\WinPcap\WpdPack\Lib&quot;;&quot;C:\Program Files\boost\boost_1_38\lib&quot;"
+				GenerateDebugInformation="true"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="2"
+			WholeProgramOptimization="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="2"
+				EnableIntrinsicFunctions="true"
+				AdditionalIncludeDirectories="&quot;$(SolutionDir)..&quot;;&quot;C:\Program Files\WinPcap\WpdPack\Include&quot;;&quot;C:\Program Files\boost\boost_1_38&quot;"
+				PreprocessorDefinitions="WIN32"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				WarningLevel="3"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="wpcap.lib ws2_32.lib"
+				AdditionalLibraryDirectories="&quot;C:\Program Files\WinPcap\WpdPack\Lib&quot;;&quot;C:\Program Files\boost\boost_1_38\lib&quot;"
+				GenerateDebugInformation="true"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+			>
+			<File
+				RelativePath="..\Messages\CapturedData.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\CaptureFactory.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\Messages\CommonTrafficCaptureMessages.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\ConnectionController.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\GenericCapture.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\Logger\Logger.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\PCAPCapture.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\PCAPLiveCapture.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\PCAPOfflineCapture.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\TcpipDispatch.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\TcpipServer.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\TrafficCapture.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\Messages\TrafficCaptureMessage.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\Messages\TrafficCaptureMessageFactory.cpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+			>
+			<File
+				RelativePath="..\Messages\CapturedData.h"
+				>
+			</File>
+			<File
+				RelativePath=".\CaptureDispatch.h"
+				>
+			</File>
+			<File
+				RelativePath=".\CaptureFactory.h"
+				>
+			</File>
+			<File
+				RelativePath="..\Messages\CommonTrafficCaptureMessages.h"
+				>
+			</File>
+			<File
+				RelativePath=".\ConnectionController.h"
+				>
+			</File>
+			<File
+				RelativePath=".\GenericCapture.h"
+				>
+			</File>
+			<File
+				RelativePath="..\Logger\Logger.h"
+				>
+			</File>
+			<File
+				RelativePath=".\PCAPCapture.h"
+				>
+			</File>
+			<File
+				RelativePath=".\PCAPLiveCapture.h"
+				>
+			</File>
+			<File
+				RelativePath=".\PCAPOfflineCapture.h"
+				>
+			</File>
+			<File
+				RelativePath="..\Helper\Singleton.h"
+				>
+			</File>
+			<File
+				RelativePath=".\TcpipDefs.h"
+				>
+			</File>
+			<File
+				RelativePath=".\TcpipDispatch.h"
+				>
+			</File>
+			<File
+				RelativePath=".\TcpipServer.h"
+				>
+			</File>
+			<File
+				RelativePath="..\Messages\TrafficCaptureMessage.h"
+				>
+			</File>
+			<File
+				RelativePath="..\Messages\TrafficCaptureMessageFactory.h"
+				>
+			</File>
+			<File
+				RelativePath="..\Messages\TrafficCaptureMessageId.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+			>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/makefile
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/makefile	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Capture/makefile	(revision 22)
@@ -0,0 +1,90 @@
+OBJECTS = CapturedData.o GenericCapture.o PCAPCapture.o Logger.o \
+  PCAPOfflineCapture.o PCAPLiveCapture.o TcpipServer.o TcpipDispatch.o ConnectionController.o \
+  TrafficCapture.o CaptureFactory.o TrafficCaptureMessage.o CommonTrafficCaptureMessages.o \
+  TrafficCaptureMessageFactory.o
+INCLUDES = -I/usr/include/pcap \
+  -I/usr/local/boost_1_39_0 \
+  -I.. \
+# -I/opt/boost-mingw-gcc345-1.38.0/include \
+
+LIBPATH = #-L/usr/lib -L/opt/boost-mingw-gcc345-1.38.0/lib
+#-L/usr/local/boost/stage
+
+CPPFLAGS = #-mno-cygwin 
+
+TrafficCapture.exe: $(OBJECTS)
+	g++ $(CPPFLAGS) $(OBJECTS) $(LIBPATH) -o TrafficCapture.exe -lwpcap -lboost_thread-gcc34-mt -lboost_system-gcc34-mt -lboost_filesystem-gcc34-mt
+#-lboost_system-mt -lboost_thread-mt -lws2_32
+
+TrafficCaptureMessage.o : ../Messages/TrafficCaptureMessage.h
+	g++ $(CPPFLAGS) $(INCLUDES) -c ../Messages/TrafficCaptureMessage.cpp
+
+../Messages/CommonTrafficCaptureMessages.h : ../Messages/TrafficCaptureMessageId.h ../Messages/TrafficCaptureMessage.h
+
+CommonTrafficCaptureMessages.o : ../Messages/CommonTrafficCaptureMessages.h
+	g++ $(CPPFLAGS) $(INCLUDES) -c ../Messages/CommonTrafficCaptureMessages.cpp
+
+../Messages/CaptureData.h : ../Messages/TrafficCaptureMessageId.h ../Messages/TrafficCaptureMessage.h
+
+CapturedData.o : ../Messages/CapturedData.cpp ../Messages/CapturedData.h
+	g++ $(CPPFLAGS) $(INCLUDES) -c ../Messages/CapturedData.cpp
+
+../Messages/TrafficCaptureMessageFactory.h : ../Helper/Singleton.h ../Messages/TrafficCaptureMessage.h
+
+TrafficCaptureMessageFactory.o : ../Messages/TrafficCaptureMessageFactory.h ../Messages/TrafficCaptureMessageId.h \
+  ../Messages/CommonTrafficCaptureMessages.h ../Logger/Logger.h
+	g++ $(CPPFLAGS) $(INCLUDES) -c ../Messages/TrafficCaptureMessageFactory.cpp
+
+../Logger/Logger.h : ../Messages/CapturedData.h
+
+Logger.o : ../Logger/Logger.cpp ../Logger/Logger.h ../Helper/Singleton.h
+	g++ $(CPPFLAGS) $(INCLUDES) -c ../Logger/Logger.cpp
+
+CaptureDispatch.h : ../Messages/CapturedData.h
+
+GenericCapture.h : ../Messages/CapturedData.h CaptureDispatch.h
+
+GenericCapture.o : GenericCapture.cpp GenericCapture.h ../Logger/Logger.h
+	g++ $(CPPFLAGS) $(INCLUDES) -c GenericCapture.cpp
+
+PCAPCapture.h : GenericCapture.h
+
+PCAPCapture.o : PCAPCapture.cpp PCAPCapture.h ../Logger/Logger.h
+	g++ $(CPPFLAGS) $(INCLUDES) -c PCAPCapture.cpp
+
+PCAPOfflineCapture.h : PCAPCapture.h
+
+PCAPOfflineCapture.o : PCAPOfflineCapture.cpp PCAPOfflineCapture.h
+	g++ $(CPPFLAGS) $(INCLUDES) -c PCAPOfflineCapture.cpp
+
+PCAPLiveCapture.h : PCAPCapture.h ../Logger/Logger.h
+
+PCAPLiveCapture.o : PCAPLiveCapture.cpp PCAPLiveCapture.h
+	g++ $(CPPFLAGS) $(INCLUDES) -c PCAPLiveCapture.cpp
+
+CaptureFactory.h : GenericCapture.h ../Helper/Singleton.h
+
+CaptureFactory.o : CaptureFactory.cpp CaptureFactory.h PCAPLiveCapture.h PCAPOfflineCapture.h ../Logger/Logger.h
+	g++ $(CPPFLAGS) $(INCLUDES) -c CaptureFactory.cpp
+
+ConnectionController.h : TcpipDefs.h GenericCapture.h ../Messages/TrafficCaptureMessage.h TcpipDispatch.h
+
+ConnectionController.o : ConnectionController.cpp ConnectionController.h  ../Logger/Logger.h \
+  ../Messages/TrafficCaptureMessageFactory.h ../Messages/CommonTrafficCaptureMessages.h
+	g++ $(CPPFLAGS) $(INCLUDES) -c ConnectionController.cpp
+
+TcpipServer.h : TcpipDefs.h
+
+TcpipServer.o : TcpipServer.cpp TcpipServer.h ConnectionController.h ../Logger/Logger.h
+	g++ $(CPPFLAGS) $(INCLUDES) -c TcpipServer.cpp
+
+TcpipDispatch.h : TcpipDefs.h CaptureDispatch.h
+
+TcpipDispatch.o : TcpipDispatch.cpp TcpipDispatch.h ../Logger/Logger.h
+	g++ $(CPPFLAGS) $(INCLUDES) -c TcpipDispatch.cpp
+
+TrafficCapture.o : TrafficCapture.cpp TcpipServer.h
+	g++ $(CPPFLAGS) $(INCLUDES) -c TrafficCapture.cpp
+
+clean:
+	rm -f *.o TrafficCapture.exe
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/.gdb_history
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/.gdb_history	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/.gdb_history	(revision 22)
@@ -0,0 +1,256 @@
+s
+s
+c
+s
+p this
+c
+run
+c
+c
+c
+r
+p sData
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+c
+s
+s
+s
+s
+s
+s
+s
+s
+p _M_node
+p __x._M_node
+p m_sName
+s
+p m_sName
+p this
+c
+q
+b Dispatcher.cpp:29
+r
+n
+n
+n
+n
+n
+n
+n
+n
+n
+n
+n
+n
+n
+n
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+q
+r
+p nOffset
+l
+l80
+l 80
+l 65
+l 50
+b IpDissector::Reassemble
+r
+p m_payloadSize
+c
+p m_payloadSize
+c
+p m_payloadSize
+c
+r
+n
+n
+n
+n
+n
+n
+n
+p m_ipHdr->id
+n
+n
+p nFirstFragmentByte
+n
+n
+n
+p nFirstFragmentByte
+p nLastFragmentByte
+q
+b IpDispatcher::Reassemble
+b IpDispatcher::Reassemble
+r
+b IpDissector::Reassemble
+r
+n
+p nFirstFragmentByte
+p nLastFragmentByte
+l
+p m_ipHdr->totalLength
+m_ipHdr->headerLength
+p m_ipHdr->headerLength
+q
+b IpDissector.cpp:62
+r
+p nFirstFragmentByte
+p nLastFragmentByte
+c
+p nLastFragmentByte
+p nFirstFragmentByte
+l
+l50
+l 50
+p pIpDissector->m_ipHdr->fragOffset
+p pIpDissector->m_ipHdr->fragOffset1
+p ntohs(pIpDissector->m_ipHdr->fragOffset1)
+q
+b IpDissector.cpp:62
+r
+c
+p nFirstFragmentByte
+q
+b IpDissector.cpp:62
+r
+c
+p nFirstFragmentByte
+c
+p nFirstFragmentByte
+l
+n
+n
+n
+n
+n
+n
+n
+n
+n
+n
+n
+n
+p m_fragmentSizes[nFirstFragmentByte]
+n
+n
+n
+n
+n
+n
+n
+p m_payloadSize
+n
+n
+n
+p &m_payload[nOffset]
+p m_fragments[nOffset]
+q
+r
+n
+n
+l
+p nOffset
+n
+n
+n
+n
+p nOffset
+q
+b IpDissector::Dissect
+r
+c
+l
+m_ipHdr->headerLength
+p m_ipHdr->headerLength
+p data.second
+r
+p data.second
+n
+n
+n
+n
+n
+n
+p m_payloadSize
+r
+n
+p m_payloadSize
+p m_ipHdr->headerLength
+q
+r
+p (*it)
+q
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DispatchInfo.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DispatchInfo.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DispatchInfo.cpp	(revision 22)
@@ -0,0 +1,57 @@
+#include "DispatchInfo.h"
+
+DispatchInfo::DispatchInfo() 
+  : m_pData(0),
+    m_nDataSize(0),
+	m_pProtocolInfo(0)
+{
+}
+
+DispatchInfo::~DispatchInfo() 
+{
+	delete [] m_pData;
+	delete m_pProtocolInfo;
+}
+
+const unsigned char * DispatchInfo::GetData() const {
+  return m_pData;
+}
+
+const ssize_t DispatchInfo::GetDataSize() const {
+  return m_nDataSize;
+}
+
+void DispatchInfo::SetData(const unsigned char * pData, const ssize_t nDataSize)
+{
+	delete [] m_pData;
+	if (nDataSize > 0)
+	{
+		m_pData = new unsigned char[nDataSize];
+		memcpy(m_pData, pData, nDataSize);
+		m_nDataSize = nDataSize;
+	}
+	else
+	{
+		m_pData = 0;
+		m_nDataSize = 0;
+	}
+}
+
+void DispatchInfo::AddProtocolInfo(ProtocolInfoElement * info)
+{
+	if (!m_pProtocolInfo)
+		m_pProtocolInfo = new ProtocolInfo();
+	m_pProtocolInfo->AddItem(info);
+}
+
+ProtocolInfo * DispatchInfo::DetachProtocolInfo()
+{
+	ProtocolInfo * pRes = m_pProtocolInfo;
+	m_pProtocolInfo = 0;
+	return pRes;
+}
+
+ProtocolInfo * DispatchInfo::GetProtocolInfo() const
+{
+	return m_pProtocolInfo;
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DispatchInfo.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DispatchInfo.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DispatchInfo.h	(revision 22)
@@ -0,0 +1,30 @@
+#ifndef DISPATCH_INFO_H
+#define DISPATCH_INFO_H
+
+#include "ProtocolInfo.h"
+#include <list>
+#include <vector>
+
+#ifdef _MSC_VER
+typedef int ssize_t;
+#endif
+
+class DispatchInfo {
+  
+ public:
+  DispatchInfo();
+  ~DispatchInfo();
+  const unsigned char * GetData() const;
+  const ssize_t GetDataSize() const;
+  void SetData(const unsigned char * pData, const ssize_t nDataSize); 
+  void AddProtocolInfo(ProtocolInfoElement * info);
+  ProtocolInfo * DetachProtocolInfo();
+  ProtocolInfo * GetProtocolInfo() const;
+
+private:
+  unsigned char * m_pData;
+  ssize_t m_nDataSize;
+  ProtocolInfo * m_pProtocolInfo;
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Dispatcher.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Dispatcher.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Dispatcher.cpp	(revision 22)
@@ -0,0 +1,151 @@
+#include "Dispatcher.h"
+#include "DispatcherFactory.h"
+#include "DissectorFactory.h"
+#include "Logger/Logger.h"
+
+Dispatcher::Dispatcher(std::string sName) 
+  :m_sName(sName) {
+}
+
+Dispatcher::~Dispatcher() {
+}
+
+const std::string& Dispatcher::GetName() const {
+  return m_sName;
+}
+
+bool Dispatcher::Dispatch(DispatchInfo & info, ComponentFilter & filter) {
+
+  // Dissect packet
+  Dissector * pDissector = DissectorFactory::Instance().Create(GetName());
+  
+  if(!pDissector) {
+    Logger::Instance().LogError("Unable to dispatch packet: No dissector for " + GetName());
+    
+    // Return what we have so far
+    return false; 
+  }
+
+  DispatchInfo * pUnprocessed = 0;
+  ComponentFilter * pUnprocessedFilter = 0;
+  if (pDissector->CreatesUnprocessedData())
+  {
+	  // create copies (for handling unprocessed data)
+	  pUnprocessed = new DispatchInfo();
+	  ProtocolInfo * pProtocolInfo = info.GetProtocolInfo();
+	  if (pProtocolInfo)
+	  {
+		int nCount = pProtocolInfo->Count();
+		for (int i = 0; i < nCount; i++)
+			pUnprocessed->AddProtocolInfo((*pProtocolInfo)[i]->Clone());
+	  }
+	  pUnprocessedFilter = new ComponentFilter(filter);
+  }
+
+  if (!pDissector->Dissect(info.GetData(), info.GetDataSize())) // no information for higher levels
+  {
+	  delete pDissector;
+	  delete pUnprocessed;
+	  delete pUnprocessedFilter;
+	  return false;
+  }
+
+  // Reassembly
+  bool bRes = true;
+  if(pDissector->NeedReassembly()) {
+    ProtocolInfo * pProtocolInfo = info.GetProtocolInfo();
+    std::list<Dissector *>::iterator it; 
+    for(it = m_fragments.begin(); (it != m_fragments.end()) && 
+		!((*it)->Reassemble(pDissector, pProtocolInfo)); ++it);
+    if(it == m_fragments.end()) {
+      if (!pDissector->FinishDissection())
+	  {
+	    // Fragment belongs to a new packet
+		info.DetachProtocolInfo();
+		pDissector->SetProtocolInfo(pProtocolInfo);
+		m_fragments.push_front(pDissector);
+		pDissector = 0;
+	  }
+	  // otherwise the fragment has been assembled
+    }
+    else {
+      // Fragment has been assembled. Pending packet may be complete
+      if(!(*it)->NeedReassembly()) {
+        pDissector = (*it);
+        m_fragments.erase(it);
+      }
+      else {
+	pDissector = 0;
+      }
+    }
+    if (pDissector && !pDissector->IsPacketValid()) {
+      delete pDissector;
+      pDissector = 0;
+      bRes = false;
+    }
+  }
+  
+  if(!pDissector) {
+    // Not complete packet or error...
+	delete pUnprocessed;
+	delete pUnprocessedFilter;
+    return bRes;
+  }
+
+  pDissector->SaveResult(info);
+  // Check filter
+  ProtocolInfoElement * pProtocol = pDissector->GetLayerInfo();
+  if (pProtocol)
+  {
+	  if (!filter.Match(pProtocol))
+	  {
+		  Logger::Instance().LogDebug("Message discarded by filter");
+		  delete pDissector;
+		  delete pUnprocessed;
+	      delete pUnprocessedFilter;
+		  return false;
+	  }
+	  filter.MoveToNextLayer();
+  }
+
+  // Transfer to upper layer
+  const EProtocolType upperLayerType = pDissector->GetUpperLayerType();
+  
+  bRes = false;
+  if (upperLayerType == EProtocolType_None) // all headers have been removed
+  {
+	  filter.EnqueueMessage(info.GetData(), info.GetDataSize());
+	  std::stringstream ss;
+	  ss << "Captured message enqueued to the TE (len " << info.GetDataSize() << ")";
+      Logger::Instance().LogInfo(ss.str());
+	  bRes = true;
+  }
+  else
+  {
+	Dispatcher * pUpperLayer = DispatcherFactory::Instance().Get(upperLayerType);
+	if(pUpperLayer)
+		bRes = pUpperLayer->Dispatch(info, filter);
+  }
+  if (bRes && pDissector->ContainsUnprocessedData())
+  {
+	std::pair<const unsigned char *, ssize_t> res = pDissector->GetUnprocessedData();
+	pUnprocessed->SetData(res.first, res.second);
+    bRes = Dispatch(*pUnprocessed, *pUnprocessedFilter);
+  }
+
+  delete pDissector;
+  delete pUnprocessed;
+  delete pUnprocessedFilter;
+  return bRes;
+}
+
+void Dispatcher::AddExplicitUpperLayer(EProtocolType upperLayer/*, Filter */) {
+  Dispatcher * pUpperLayer = DispatcherFactory::Instance().Get(upperLayer);
+  if(pUpperLayer) { 
+    // TODO: store Upper Layer Filter
+    m_upperLayers.push_back(pUpperLayer);
+  }
+  else {
+    Logger::Instance().LogWarning("No dispatcher for requested upper layer");
+  }
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Dispatcher.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Dispatcher.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Dispatcher.h	(revision 22)
@@ -0,0 +1,28 @@
+#ifndef DISPATCHER_H
+#define DISPATCHER_H
+
+#include <map>
+#include <list>
+#include <string>
+
+#include "Dissector.h"
+#include "DispatchInfo.h"
+#include "Filter.h"
+
+class Dispatcher {
+
+ public:
+  Dispatcher(std::string sName="");
+  virtual ~Dispatcher();
+  virtual bool Dispatch(DispatchInfo & info, ComponentFilter & filter);
+  virtual void AddExplicitUpperLayer(EProtocolType sUpperLayer);
+
+ protected:
+  virtual const std::string& GetName() const;
+  std::string m_sName;
+  std::list<Dissector *> m_fragments;
+  std::list<Dispatcher *> m_upperLayers;
+  
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DispatcherFactory.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DispatcherFactory.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DispatcherFactory.cpp	(revision 22)
@@ -0,0 +1,19 @@
+#include "DispatcherFactory.h"
+#include "EthernetDispatcher.h"
+#include "IpDispatcher.h"
+#include "UdpDispatcher.h"
+#include "TcpDispatcher.h"
+#include "SipDispatcher.h"
+
+DispatcherFactory::DispatcherFactory() {
+  Register(EProtocolType_Ethernet, &(EthernetDispatcher::Instance()));
+  Register(EProtocolType_IPv4, &(IpDispatcher::Instance()));
+  Register(EProtocolType_Udp, &(UdpDispatcher::Instance()));
+  Register(EProtocolType_Tcp, &(TcpDispatcher::Instance()));
+  Register(EProtocolType_Sip, &(SipDispatcher::Instance()));
+}
+
+DispatcherFactory::~DispatcherFactory() {
+
+}
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DispatcherFactory.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DispatcherFactory.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DispatcherFactory.h	(revision 22)
@@ -0,0 +1,25 @@
+#ifndef DISPATCHER_FACTORY_H
+#define DISPATCHER_FACTORY_H
+
+#include "Helper/Singleton.h"
+#include "Helper/Factory.h"
+#include "Dispatcher.h"
+
+/**
+ * A singleton factory class for instantiating packet filters.
+ */
+class DispatcherFactory  : public SingletonFactory<Dispatcher, EProtocolType>, public Singleton<DispatcherFactory> {
+
+ protected:
+  //Singleton
+  friend class Singleton<DispatcherFactory>;
+
+  //Singleton
+  DispatcherFactory();
+
+ public:
+  virtual ~DispatcherFactory();
+
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Dissector.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Dissector.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Dissector.cpp	(revision 22)
@@ -0,0 +1,167 @@
+#include "Dissector.h"
+#include "Logger/Logger.h"
+
+Dissector::Dissector() :
+	m_pPayload(0),
+	m_nPayloadSize(0),
+	m_pLayerInfo(0),
+	m_pUnprocessedData(0),
+	m_nUnprocessedSize(0),
+	m_pProtocolInfo(0)
+{
+}
+
+Dissector::~Dissector()
+{
+	delete[] m_pPayload;
+	delete[] m_pUnprocessedData;
+	delete m_pLayerInfo;
+	delete m_pProtocolInfo;
+}
+
+bool Dissector::IsPacketValid() const
+{ 
+	return true; 
+}
+
+bool Dissector::FinishDissection()
+{ 
+	return false; 
+}
+
+bool Dissector::Reassemble(Dissector * pDissector, ProtocolInfo * pProtocolInfo)
+{
+  Logger::Instance().LogError("Dissector does not support reassembly");
+  return false;
+}
+
+void Dissector::SaveResult(DispatchInfo & info) const
+{
+	info.SetData(m_pPayload, m_nPayloadSize);
+	if (m_pLayerInfo)
+		info.AddProtocolInfo(m_pLayerInfo->Clone());
+}
+
+void Dissector::SavePayload(const unsigned char * pData, ssize_t nPayloadSize)
+{
+	AllocPayload(nPayloadSize);
+	if (nPayloadSize > 0)
+		memcpy(m_pPayload, pData, m_nPayloadSize);
+}
+
+void Dissector::AllocPayload(ssize_t nPayloadSize)
+{
+	delete[] m_pPayload;
+	if (nPayloadSize > 0)
+	{
+		m_nPayloadSize = nPayloadSize;
+		m_pPayload = new unsigned char[nPayloadSize];
+	}
+	else
+	{
+		m_nPayloadSize = 0;
+		m_pPayload = 0;
+	}
+}
+
+void Dissector::SetPayloadAt(const unsigned char * pSrcData, ssize_t nSrcSize, int nOffset)
+{
+	memcpy(&m_pPayload[nOffset], pSrcData, nSrcSize);
+}
+
+void Dissector::AppendPayload(Dissector * pSrc)
+{
+	int nTgtSize = m_nPayloadSize + pSrc->m_nPayloadSize;
+	unsigned char * pTmp = 0;
+	if (nTgtSize)
+	{
+		pTmp = new unsigned char [m_nPayloadSize + pSrc->m_nPayloadSize];
+		if (m_nPayloadSize)
+			memcpy(pTmp, m_pPayload, m_nPayloadSize);
+		if (pSrc->m_nPayloadSize)
+			memcpy(&pTmp[m_nPayloadSize], pSrc->m_pPayload, pSrc->m_nPayloadSize);
+	}
+	delete m_pPayload;
+	m_nPayloadSize = nTgtSize;
+	m_pPayload = pTmp;
+}
+unsigned char * Dissector::GetPayload() const
+{
+	return m_pPayload;
+}
+
+ssize_t Dissector::GetPayloadSize() const
+{
+	return m_nPayloadSize;
+}
+
+std::pair<unsigned char *, ssize_t> Dissector::DetachData()
+{
+	std::pair<unsigned char *, ssize_t> res(m_pPayload, m_nPayloadSize);
+	m_pPayload = 0;
+	m_nPayloadSize = 0;
+	return res;
+}
+
+void Dissector::SaveLayerInfo()
+{
+	delete m_pLayerInfo;
+	m_pLayerInfo = CreateLayerInfo();
+}
+
+ProtocolInfoElement * Dissector::GetLayerInfo() const
+{
+	return m_pLayerInfo;
+}
+
+void Dissector::SeparateUnprocessedData(int nNewPayloadSize)
+{
+	if (nNewPayloadSize >= m_nPayloadSize)
+		return;
+	delete [] m_pUnprocessedData;
+	m_nUnprocessedSize = m_nPayloadSize - nNewPayloadSize;
+	m_pUnprocessedData = new unsigned char[m_nUnprocessedSize];
+	memcpy(m_pUnprocessedData, &m_pPayload[nNewPayloadSize], m_nUnprocessedSize);
+	unsigned char * pTmp = 0;
+	if (nNewPayloadSize != 0)
+	{
+		pTmp = new unsigned char[nNewPayloadSize];
+		memcpy(pTmp, m_pPayload, nNewPayloadSize);
+	}
+	delete [] m_pPayload;
+	m_pPayload = pTmp;
+	m_nPayloadSize = nNewPayloadSize;
+}
+
+bool Dissector::CreatesUnprocessedData() const
+{
+	return false;
+}
+
+bool Dissector::ContainsUnprocessedData()
+{
+	return m_nUnprocessedSize > 0;
+}
+
+std::pair<const unsigned char *, ssize_t> Dissector::GetUnprocessedData() const
+{
+	std::pair<unsigned char *, ssize_t> res(m_pUnprocessedData, m_nUnprocessedSize);
+	return res;
+}
+
+ProtocolInfo * Dissector::GetProtocolInfo() const
+{
+	return m_pProtocolInfo;
+}
+void Dissector::SetProtocolInfo(ProtocolInfo * pInfo)
+{
+	delete m_pProtocolInfo;
+	m_pProtocolInfo = pInfo;
+}
+
+bool Dissector::MatchProtocolInfo(ProtocolInfo * pInfo) const
+{
+	if (!m_pProtocolInfo || !pInfo)
+		return !m_pProtocolInfo && !pInfo;
+	return m_pProtocolInfo->Match(*pInfo);
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Dissector.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Dissector.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Dissector.h	(revision 22)
@@ -0,0 +1,50 @@
+#ifndef DISSECTOR_H
+#define DISSECTOR_H
+
+#include <string>
+#include <list>
+#include "DispatchInfo.h"
+
+#ifdef _MSC_VER
+typedef int ssize_t;
+#endif
+
+class Dissector {
+  
+ public:
+  Dissector();
+  virtual ~Dissector();
+  virtual Dissector * Clone() const = 0;
+  virtual bool Dissect(const unsigned char * pData, const ssize_t nDataLen) = 0;
+  virtual bool NeedReassembly() const = 0;
+  virtual bool Reassemble(Dissector * pDissector, ProtocolInfo * pProtocolInfo);
+  virtual const EProtocolType GetUpperLayerType() const = 0;
+  virtual void SaveResult(DispatchInfo & info) const;
+  virtual bool IsPacketValid() const;
+  virtual bool FinishDissection();
+  virtual bool CreatesUnprocessedData() const;
+  bool ContainsUnprocessedData();
+  std::pair<const unsigned char *, ssize_t> GetUnprocessedData() const;
+  void SetProtocolInfo(ProtocolInfo * pInfo);
+  ProtocolInfoElement * GetLayerInfo() const;
+ protected:
+  void SaveLayerInfo();
+  virtual ProtocolInfoElement * CreateLayerInfo() = 0;
+  void SavePayload(const unsigned char * pData, ssize_t nPayloadSize);
+  void AllocPayload(ssize_t nPayloadSize);
+  void SetPayloadAt(const unsigned char * pSrcData, ssize_t nSrcSize, int nOffset);
+  void AppendPayload(Dissector * pSrc);
+  unsigned char * GetPayload() const;
+  ssize_t GetPayloadSize() const;
+  std::pair<unsigned char *, ssize_t> DetachData();  
+  void SeparateUnprocessedData(int nNewPayloadSize);
+  ProtocolInfo * GetProtocolInfo() const;
+  bool MatchProtocolInfo(ProtocolInfo * pInfo) const;
+ private:
+  unsigned char * m_pPayload, * m_pUnprocessedData;
+  ssize_t m_nPayloadSize, m_nUnprocessedSize;
+  ProtocolInfoElement * m_pLayerInfo;
+  ProtocolInfo * m_pProtocolInfo;
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DissectorFactory.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DissectorFactory.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DissectorFactory.cpp	(revision 22)
@@ -0,0 +1,20 @@
+#include "DissectorFactory.h"
+
+#include "EthernetDissector.h"
+#include "IpDissector.h"
+#include "UdpDissector.h"
+#include "TcpDissector.h"
+#include "SipDissector.h"
+
+DissectorFactory::DissectorFactory() {
+  Register("Ethernet", new EthernetDissector);
+  Register("IP", new IpDissector);
+  Register("UDP", new UdpDissector);
+  Register("TCP", new TcpDissector);
+  Register("SIP", new SipDissector);
+}
+
+DissectorFactory::~DissectorFactory() {
+
+}
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DissectorFactory.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DissectorFactory.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/DissectorFactory.h	(revision 22)
@@ -0,0 +1,25 @@
+#ifndef DISSECTOR_FACTORY_H
+#define DISSECTOR_FACTORY_H
+
+#include "Helper/Singleton.h"
+#include "Helper/Factory.h"
+#include "Dissector.h"
+
+/**
+ * A singleton factory class for instantiating dissectors.
+ */
+class DissectorFactory  : public Factory<Dissector>, public Singleton<DissectorFactory> {
+
+ protected:
+  //Singleton
+  friend class Singleton<DissectorFactory>;
+
+  //Singleton
+  DissectorFactory();
+
+ public:
+  virtual ~DissectorFactory();
+
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/EthernetDispatcher.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/EthernetDispatcher.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/EthernetDispatcher.cpp	(revision 22)
@@ -0,0 +1,11 @@
+
+#include "EthernetDispatcher.h"
+
+EthernetDispatcher::EthernetDispatcher() 
+  :Dispatcher("Ethernet") {
+  
+}
+
+EthernetDispatcher::~EthernetDispatcher() {
+
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/EthernetDispatcher.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/EthernetDispatcher.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/EthernetDispatcher.h	(revision 22)
@@ -0,0 +1,21 @@
+#ifndef ETHERNET_DISPATCHER_H
+#define ETHERNET_DISPATCHER_H
+
+#include "Helper/Singleton.h"
+#include "Dispatcher.h"
+
+class EthernetDispatcher : public Dispatcher, public Singleton<EthernetDispatcher> {
+  
+ protected:
+  //Singleton
+  EthernetDispatcher();
+  
+  //Singleton
+  friend class Singleton<EthernetDispatcher>;
+
+ public:
+  ~EthernetDispatcher();
+
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/EthernetDissector.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/EthernetDissector.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/EthernetDissector.cpp	(revision 22)
@@ -0,0 +1,46 @@
+#include "EthernetDissector.h"
+#include "Logger/Logger.h"
+
+EthernetDissector::EthernetDissector() 
+{
+}
+
+EthernetDissector::~EthernetDissector() {
+  delete m_ethHdr;
+}
+
+EthernetDissector * EthernetDissector::Clone() const {
+  return new EthernetDissector();
+}
+
+bool EthernetDissector::Dissect(const unsigned char * pData, const ssize_t nLen) {
+ 
+  m_ethHdr = new EthernetHeader;
+  memcpy(m_ethHdr, pData, sizeof(EthernetHeader));
+  pData += sizeof(EthernetHeader);
+
+  SavePayload(pData, nLen - sizeof(EthernetHeader));
+  return true;
+}
+
+bool EthernetDissector::NeedReassembly() const {
+  return false;
+}
+
+const EProtocolType EthernetDissector::GetUpperLayerType() const 
+{
+	EProtocolType res = EProtocolType_Unknown;
+	switch(m_ethHdr->type)
+	{
+		case 8:
+			res = EProtocolType_IPv4;
+			break;
+	}
+	return res;
+}
+
+
+ProtocolInfoElement * EthernetDissector::CreateLayerInfo()
+{
+	return 0;
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/EthernetDissector.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/EthernetDissector.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/EthernetDissector.h	(revision 22)
@@ -0,0 +1,29 @@
+#ifndef ETHERNET_DISSECTOR_H
+#define ETHERNET_DISSECTOR_H
+
+#include "Dissector.h"
+#include <map>
+#include <string>
+
+class EthernetDissector : public Dissector {
+
+ public:
+  EthernetDissector();
+  virtual ~EthernetDissector();
+  virtual EthernetDissector * Clone() const;
+  virtual bool Dissect(const unsigned char * pData, const ssize_t nDataLen);
+  virtual bool NeedReassembly() const;
+  virtual const EProtocolType GetUpperLayerType() const;
+
+ private:
+  struct EthernetHeader {
+    unsigned char destination[6];
+    unsigned char source[6];
+    unsigned short type;
+  };
+  EthernetHeader * m_ethHdr;
+protected:
+  ProtocolInfoElement * CreateLayerInfo();
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Filter.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Filter.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Filter.cpp	(revision 22)
@@ -0,0 +1,290 @@
+#include "Filter.h"
+#include <sstream>
+#ifndef DISPATCH_DEBUG
+#include "LowerTestAdapter/LowerTestAdapter.h"
+#endif
+
+Filter::Filter() :
+	m_matchType(EFilterMatch_None),
+	m_pNextLayer(0),
+	m_bAcceptAll(false)
+{
+}
+
+Filter::Filter(const Filter & src) :
+	m_matchType(src.m_matchType),
+	m_pNextLayer(src.m_pNextLayer ? new FilterSet(*src.m_pNextLayer) : 0),
+	m_bAcceptAll(src.m_bAcceptAll)
+{
+}
+
+Filter::~Filter()
+{
+	delete m_pNextLayer;
+}
+
+EFilterMatch Filter::GetMatchType() const
+{
+	return m_matchType;
+}
+
+void Filter::SetMatchType(EFilterMatch matchType)
+{
+	m_matchType = matchType;
+	if (m_pNextLayer)
+		m_pNextLayer->SetMatchType(matchType);
+}
+
+void Filter::AddNextLayerFilter(const Filter & filter)
+{
+	if (!m_pNextLayer)
+		m_pNextLayer = new FilterSet();
+	m_pNextLayer->AddFilter(filter);
+}
+
+void Filter::ClearNextLayerFilters()
+{
+	delete m_pNextLayer;
+	m_pNextLayer = 0;
+}
+
+std::string Filter::GetSourcePcapFilter() const
+{
+	return "";
+}
+
+std::string Filter::GetDestinationPcapFilter() const
+{
+	return "";
+}
+
+void Filter::SetAllPacketsAccepted(bool bAccept)
+{
+	m_bAcceptAll = bAccept;
+}
+
+bool Filter::AreAllPacketsAccepted()
+{
+	return m_bAcceptAll;
+}
+
+FilterSet * Filter::DetachFilterSet()
+{
+	FilterSet * pRes = m_pNextLayer;
+	m_pNextLayer = 0;
+	return pRes;
+}
+
+FilterSet::FilterSet()
+{
+}
+
+FilterSet::FilterSet(const FilterSet & src)
+{
+	for (const_iterator it = src.begin(); it != src.end(); ++it)
+		push_back((*it)->Clone());
+}
+
+FilterSet::~FilterSet()
+{
+	for (iterator it = begin(); it != end(); ++it)
+		delete *it;
+}
+
+void FilterSet::AddFilter(const Filter & filter)
+{
+	push_back(filter.Clone());
+}
+
+bool FilterSet::Match(const ProtocolInfoElement * pProtocolInfo)
+{
+	bool bSenderMatch = false;
+	bool bRcvMatch = false;
+	iterator it = begin();
+	bool bEmptyFilterSet = true;
+
+	std::cerr << "FilterSet::Match() "
+		  << pProtocolInfo->GetId() << " "
+		  << std::endl;
+
+	while (it != end())
+	{
+	  bEmptyFilterSet = false;
+		if (!(*it)->Match(pProtocolInfo)) // remove filter element
+		{
+		  	delete (*it);
+		  	it = erase(it);
+			std::cerr << "no match" << std::endl;
+		}
+		else
+		{
+			EFilterMatch matchType = (*it)->GetMatchType();
+			bSenderMatch |= matchType == EFilterMatch_Sender;
+			bRcvMatch |= matchType == EFilterMatch_Receiver;
+			++it;
+			std::cerr << "match " 
+				  << bSenderMatch << " "
+				  << bRcvMatch << std::endl;
+		}
+	}
+	if( (pProtocolInfo->GetId() == EProtocolType_Udp) 
+	    || (pProtocolInfo->GetId() == EProtocolType_Tcp)) {
+	  return (bSenderMatch || bRcvMatch) || bEmptyFilterSet; 
+	}
+	
+	return (bSenderMatch && bRcvMatch) || bEmptyFilterSet; 
+}
+
+void FilterSet::MoveToNextLayer()
+{
+	std::vector<FilterSet *> tmp;
+	for (iterator it = begin(); it != end(); ++it)
+		tmp.push_back((*it)->DetachFilterSet());
+
+	clear();
+	for (unsigned int i = 0; i < tmp.size(); ++i)
+	{
+		FilterSet * pFs = tmp[i];
+		if (pFs)
+		{
+			for (iterator it = pFs->begin(); it != pFs->end(); ++it)
+				push_back(*it);
+			pFs->clear();
+			delete pFs;
+		}
+	}
+}
+
+void FilterSet::SetMatchType(EFilterMatch matchType)
+{
+	for (iterator it = begin(); it != end(); ++it)
+		(*it)->SetMatchType(matchType);
+}
+
+std::string FilterSet::GetPcapFilter() const
+{
+	std::stringstream ss;
+	for (const_iterator it = begin(); it != end(); ++it)
+	{
+		std::string sSource = (*it)->GetSourcePcapFilter();
+		int nDestCount = 0;
+		for (const_iterator it2 = begin(); it2 != end(); ++it2)
+		{
+			if (it2 == it)
+				continue;
+			std::string sDest = (*it2)->GetDestinationPcapFilter();
+			if (!sDest.empty())
+			{
+				++nDestCount;
+				if (ss.tellp() > 0)
+					ss << " or ";
+				ss << "(";
+				if (sSource.empty())
+					ss << sDest;
+				else
+					ss << "(" << sSource << ") and (" << sDest << ")";
+				ss << ")";
+			}
+		}
+		if (nDestCount == 0 && !sSource.empty())
+		{
+			if (ss.tellp() > 0)
+				ss << " or ";
+			ss << "(" << sSource << ")";
+		}
+	}
+	return ss.str();
+}
+
+
+ComponentFilter::ComponentFilter()
+{
+}
+
+ComponentFilter::ComponentFilter(const ComponentFilter & src)
+{
+	for (const_iterator it = src.begin(); it != src.end(); ++it)
+		RegisterComponent(it->first, *it->second);
+}
+
+ComponentFilter::~ComponentFilter()
+{
+	for (iterator it = begin(); it != end(); ++it)
+		delete it->second;
+}
+
+void ComponentFilter::RegisterItem(const t3devlib::ComponentId * pId, const FilterSet & filter)
+{
+	push_back(std::pair<const t3devlib::ComponentId *, FilterSet *>(pId, new FilterSet(filter)));
+}
+
+void ComponentFilter::RegisterComponent(const t3devlib::ComponentId * pId, const FilterSet & filter)
+{
+	UnregisterComponent(pId);
+	RegisterItem(pId, filter);
+}
+
+void ComponentFilter::UnregisterComponent(const t3devlib::ComponentId * pId)
+{
+	iterator it = begin();
+	while (it != end())
+	{
+		if (it->first == pId)
+		{
+			delete it->second;
+			it = erase(it);
+		}
+		else
+			++it;
+	}
+}
+
+bool ComponentFilter::Match(const ProtocolInfoElement * pProtocolInfo)
+{
+	iterator it = begin();
+	while (it != end())
+	{
+		if (!it->second->Match(pProtocolInfo)) // remove element
+		{
+			delete it->second;
+			it = erase(it);
+		}
+		else
+			++it;
+	}
+	return begin() != end();	
+}
+void ComponentFilter::MoveToNextLayer()
+{
+	for (iterator it = begin(); it != end(); ++it)
+		it->second->MoveToNextLayer();
+}
+void ComponentFilter::Clear()
+{
+	for (iterator it = begin(); it != end(); ++it)
+		delete it->second;
+	clear();
+}
+void ComponentFilter::EnqueueMessage(const unsigned char * pData, int nDataLength)
+{
+#ifndef DISPATCH_DEBUG
+	for (iterator it = begin(); it != end(); ++it)
+		LowerTestAdapter::Instance().EnqueueMessage(it->first, pData, nDataLength);
+#endif
+}
+
+std::string ComponentFilter::GetPcapFilter() const
+{
+	std::stringstream ss;
+	for (const_iterator it = begin(); it != end(); ++it)
+	{
+		std::string sTmp = it->second->GetPcapFilter();
+		if (!sTmp.empty())
+		{
+			if (ss.tellp() > 0)
+				ss << " or ";
+			ss << "(" << sTmp << ")";
+		}
+	}
+	return ss.str();
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Filter.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Filter.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Filter.h	(revision 22)
@@ -0,0 +1,68 @@
+#ifndef FILTER_H
+#define FILTER_H
+
+#include "ProtocolInfo.h"
+#include <list>
+
+enum EFilterMatch { EFilterMatch_None, EFilterMatch_Receiver, EFilterMatch_Sender };
+
+class FilterSet;
+
+class Filter 
+{
+public:
+	Filter();
+	Filter(const Filter & src);
+	virtual ~Filter();
+	virtual Filter * Clone() const = 0;
+	virtual bool Match(const ProtocolInfoElement * pProtocolInfo) = 0;
+	EFilterMatch GetMatchType() const;
+	void AddNextLayerFilter(const Filter & filter);
+	void ClearNextLayerFilters();
+	FilterSet * DetachFilterSet();
+	virtual std::string GetSourcePcapFilter() const;
+	virtual std::string GetDestinationPcapFilter() const;
+	void SetAllPacketsAccepted(bool bAccept);
+	bool AreAllPacketsAccepted();
+	friend class FilterSet;
+protected:
+	void SetMatchType(EFilterMatch matchType);
+private:
+	EFilterMatch m_matchType;
+	FilterSet * m_pNextLayer;
+	bool m_bAcceptAll;
+};
+
+class FilterSet : std::list<Filter *>
+{
+public:
+	FilterSet();
+	FilterSet(const FilterSet & src);
+	~FilterSet();
+	void AddFilter(const Filter & filter);
+	bool Match(const ProtocolInfoElement * pProtocolInfo);
+	void MoveToNextLayer();
+	std::string GetPcapFilter() const;
+protected:
+	void SetMatchType(EFilterMatch matchType);
+	friend class Filter;
+};
+
+class ComponentFilter : std::list< std::pair <const t3devlib::ComponentId *, FilterSet *> >
+{
+public:
+	ComponentFilter();
+	ComponentFilter(const ComponentFilter & src);
+	~ComponentFilter();
+	void RegisterComponent(const t3devlib::ComponentId * pId, const FilterSet & pFilter);
+	void UnregisterComponent(const t3devlib::ComponentId * pId);
+	void Clear();
+	bool Match(const ProtocolInfoElement * pProtocolInfo);
+	void MoveToNextLayer();
+	void EnqueueMessage(const unsigned char * pData, int nDataLength);
+	std::string GetPcapFilter() const;
+private:
+	void RegisterItem(const t3devlib::ComponentId * pId, const FilterSet & filter);
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpDispatcher.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpDispatcher.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpDispatcher.cpp	(revision 22)
@@ -0,0 +1,10 @@
+#include "IpDispatcher.h"
+
+IpDispatcher::IpDispatcher() 
+  :Dispatcher("IP") {
+  
+}
+
+IpDispatcher::~IpDispatcher() {
+
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpDispatcher.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpDispatcher.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpDispatcher.h	(revision 22)
@@ -0,0 +1,21 @@
+#ifndef IP_DISPATCHER_H
+#define IP_DISPATCHER_H
+
+#include "Helper/Singleton.h"
+#include "Dispatcher.h"
+
+class IpDispatcher : public Dispatcher, public Singleton<IpDispatcher> {
+  
+ protected:
+  //Singleton
+  IpDispatcher();
+  
+  //Singleton
+  friend class Singleton<IpDispatcher>;
+
+ public:
+  ~IpDispatcher();
+
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpDissector.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpDissector.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpDissector.cpp	(revision 22)
@@ -0,0 +1,146 @@
+#include "IpDissector.h"
+#ifdef WIN32
+#include <Winsock2.h>
+#else
+#include <netinet/in.h>
+#endif
+
+IpDissector::IpDissector() :
+	m_ipHdr(0)
+{
+}
+
+IpDissector::~IpDissector() {
+  delete m_ipHdr;
+}
+
+IpDissector * IpDissector::Clone() const {
+  return new IpDissector();
+}
+
+bool IpDissector::Dissect(const unsigned char * pData, ssize_t nDataLen) {
+  if (!m_ipHdr)
+	  m_ipHdr = new IpHeader;
+  memcpy(m_ipHdr, pData, sizeof(IpHeader));
+  pData += sizeof(IpHeader);
+#if BYTE_ORDER == LITTLE_ENDIAN
+  m_ipHdr->totalLength = ntohs(m_ipHdr->totalLength);
+#endif
+  SavePayload(pData, m_ipHdr->totalLength - m_ipHdr->headerLength*4);
+  SaveLayerInfo();
+  return true;
+}
+
+bool IpDissector::NeedReassembly() const {
+  if(m_ipHdr->moreFragment || m_ipHdr->fragOffset || m_ipHdr->fragOffset1)
+    return true;
+  return false;
+}
+
+bool IpDissector::Reassemble(Dissector * pDissector, ProtocolInfo * pProtocolInfo) {
+  if(!NeedReassembly())
+    return false;
+  
+  if(m_holes.size() == 0) 
+    {
+      // No hole defined even thougth reassembly is needed
+      // It means that Reassemble is called for first time
+      // Initialize reassembly structure and add self
+      m_holes.push_back(std::pair<unsigned short, unsigned short>(0, (unsigned short)(- 1)));
+      Reassemble(this, pProtocolInfo);
+    }
+  
+  // Inspect potential fragment
+  IpDissector * pIpDissector = dynamic_cast<IpDissector *>(pDissector);
+  if((pIpDissector->m_ipHdr) && (pIpDissector->m_ipHdr->id == m_ipHdr->id))
+    {
+      // Build First and Last values
+      unsigned short nFirstFragmentByte = pIpDissector->m_ipHdr->fragOffset;
+      nFirstFragmentByte = nFirstFragmentByte << 8;
+      nFirstFragmentByte += pIpDissector->m_ipHdr->fragOffset1;
+      nFirstFragmentByte *= 8;
+
+      unsigned short nLastFragmentByte = nFirstFragmentByte 
+	+ pIpDissector->m_ipHdr->totalLength
+	- pIpDissector->m_ipHdr->headerLength * 4;
+
+      // Compare to missing data
+      std::list<std::pair<unsigned short, unsigned short> >::iterator it;
+      int nPayloadSize = GetPayloadSize();
+      for(it = m_holes.begin(); it != m_holes.end(); ++it) 
+	{
+	  if(nFirstFragmentByte > (*it).second) 
+	    continue;
+	  if(nLastFragmentByte < (*it).first) 
+	    continue;
+	  if(!pIpDissector->m_ipHdr->moreFragment) 
+	    {
+	      // Last fragment received
+	      (*it).second = nLastFragmentByte;
+	      nPayloadSize = nLastFragmentByte;
+	    }
+	
+	  if(nFirstFragmentByte > (*it).first)
+	    m_holes.push_back(std::pair<unsigned short, unsigned short>((*it).first, nFirstFragmentByte - 1));
+	  if(nLastFragmentByte < (*it).second)
+	    m_holes.push_back(std::pair<unsigned short, unsigned short>(nLastFragmentByte + 1, (*it).second));
+	  m_holes.erase(it);
+	  std::pair<const unsigned char *, const ssize_t> data = pIpDissector->DetachData();
+	  m_fragments[nFirstFragmentByte] = data.first;
+	  m_fragmentSizes[nFirstFragmentByte] = data.second;
+
+      // received fragment is not needed anymore
+      if(pIpDissector != this) 
+	    delete pIpDissector;
+
+      // check if packet is now complete
+      if(m_holes.size() == 0) 
+	  {
+        m_ipHdr->moreFragment = 0;
+	    m_ipHdr->fragOffset = 0;
+	    m_ipHdr->fragOffset1 = 0;	
+	  
+	    // Reassembly !
+	    ssize_t nOffset = 0;
+	    AllocPayload(nPayloadSize); // payloadSize is valid since last fragment has been received
+	    while((nOffset != nPayloadSize) && (m_fragments.find(nOffset) != m_fragments.end())) 
+	      {
+		SetPayloadAt(m_fragments[nOffset], m_fragmentSizes[nOffset], nOffset);
+		// Clean up
+		delete m_fragments[nOffset];
+		nOffset += m_fragmentSizes[nOffset];
+	      }
+	    m_fragments.clear();
+	    m_fragmentSizes.clear();
+	  }
+	  return true;
+	}
+    }
+  return false;
+}
+
+const EProtocolType IpDissector::GetUpperLayerType() const 
+{
+	EProtocolType res = EProtocolType_Unknown;
+	switch(m_ipHdr->protocol)
+	{
+	case 6:
+		res = EProtocolType_Tcp;
+		break;
+	case 17:
+		res = EProtocolType_Udp;
+		break;
+	}
+	return res;
+}
+
+ProtocolInfoElement * IpDissector::CreateLayerInfo()
+{
+	IPv4Info * pRes = new IPv4Info();
+	unsigned int nSrcAddr, nDstAddr;
+	memcpy(&nSrcAddr, m_ipHdr->srcAddr, sizeof(int));
+	memcpy(&nDstAddr, m_ipHdr->destAddr, sizeof(int));
+	pRes->SetSourceAddress(nSrcAddr);
+	pRes->SetDestinationAddress(nDstAddr);
+	return pRes;
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpDissector.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpDissector.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpDissector.h	(revision 22)
@@ -0,0 +1,61 @@
+#ifndef IP_DISSECTOR_H
+#define IP_DISSECTOR_H
+
+#include "Dissector.h"
+#include <map>
+#include <list>
+#include <string>
+
+class IpDissector : public Dissector {
+
+ public:
+  IpDissector();
+  virtual ~IpDissector();
+  virtual IpDissector * Clone() const;
+  virtual bool Dissect(const unsigned char * pData, const ssize_t nDataLen);
+  virtual bool NeedReassembly() const;
+  virtual bool Reassemble(Dissector * pDissector, ProtocolInfo * pProtocolInfo);
+  virtual const EProtocolType GetUpperLayerType() const;
+
+ private:
+  struct IpHeader {
+#if BYTE_ORDER == LITTLE_ENDIAN
+    unsigned char headerLength:4,    // 4-bit header length (in 32-bit words)
+      version:4;                     // 4-bit IPv4 version
+#else
+#if BYTE_ORDER == BIG_ENDIAN
+    unsigned char version:4,         // 4-bit IPv4 version
+      headerLength:4;                // 4-bit header length (in 32-bit words)
+#endif
+#endif
+    unsigned char  tos;              // IP type of service
+    unsigned short totalLength;      // Total length
+    unsigned short id;               // Unique identifier 
+    
+    unsigned char  fragOffset   :5;  // Fragment offset field
+    
+    unsigned char  moreFragment :1;
+    unsigned char  dontFragment :1;
+    unsigned char  reservedZero :1;
+    
+    unsigned char  fragOffset1;      // Fragment offset
+    
+    unsigned char  ttl;              // Time to live
+    unsigned char  protocol;         // Protocol(TCP,UDP etc)
+    unsigned short checksum;         // IP checksum
+    unsigned char  srcAddr[4];       // Source address
+    unsigned char  destAddr[4];      // Source address
+  };
+
+ private:
+  IpHeader * m_ipHdr;
+
+  // Reassembly
+  std::list<std::pair<unsigned short, unsigned short> > m_holes;
+  std::map<unsigned short, const unsigned char *> m_fragments;
+  std::map<unsigned short, ssize_t> m_fragmentSizes;
+ protected:
+  ProtocolInfoElement * CreateLayerInfo();
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpFilter.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpFilter.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpFilter.cpp	(revision 22)
@@ -0,0 +1,75 @@
+#include "IpFilter.h"
+#include "Capture/TcpipDefs.h"
+
+IpFilter::IpFilter() : 
+	m_nAddr(0)
+{
+}
+
+IpFilter::IpFilter(const IpFilter & src) :
+	Filter(src),
+	m_nAddr(src.m_nAddr),
+	m_sAddr(src.m_sAddr)
+{
+}
+
+IpFilter::~IpFilter()
+{
+}
+
+Filter * IpFilter::Clone() const
+{
+	return new IpFilter(*this);
+}
+
+bool IpFilter::SetAddress(const std::string sAddr)
+{	
+	struct sockaddr_in tgtAddr;
+	memset(&tgtAddr, 0, sizeof tgtAddr);
+
+	struct hostent * host;
+	host = gethostbyname(sAddr.c_str());
+	if (!host)
+		return false;
+	m_sAddr = sAddr;
+	m_nAddr = ((struct in_addr *)(host->h_addr))->s_addr;
+	return true;
+}
+
+bool IpFilter::Match(const ProtocolInfoElement * pProtocolInfo)
+{
+	if (pProtocolInfo->GetId() != EProtocolType_IPv4)
+		return false;
+	if (AreAllPacketsAccepted())
+		return true;
+	const IPv4Info * pIPv4 = dynamic_cast<const IPv4Info *>(pProtocolInfo);
+	EFilterMatch matchType = GetMatchType();
+	if (matchType == EFilterMatch_Receiver)
+		return m_nAddr == pIPv4->GetDestinationAddress();
+	else if (matchType == EFilterMatch_Sender)
+		return m_nAddr == pIPv4->GetSourceAddress();
+	else
+	{
+		if (m_nAddr == pIPv4->GetDestinationAddress())
+			SetMatchType(EFilterMatch_Receiver);
+		else if (m_nAddr == pIPv4->GetSourceAddress())
+			SetMatchType(EFilterMatch_Sender);
+		return matchType != GetMatchType();
+	}
+}
+
+std::string IpFilter::GetSourcePcapFilter() const
+{
+	std::string sRes = "src host ";
+	sRes += m_sAddr;
+	return sRes;
+}
+
+std::string IpFilter::GetDestinationPcapFilter() const
+{
+	std::string sRes = "dst host ";
+	sRes += m_sAddr;
+	return sRes;
+}
+
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpFilter.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpFilter.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/IpFilter.h	(revision 22)
@@ -0,0 +1,22 @@
+#ifndef IP_FILTER_H
+#define IP_FILTER_H
+
+#include "Filter.h"
+
+class IpFilter : public Filter
+{
+public:
+	IpFilter();
+	IpFilter(const IpFilter & src);
+	virtual ~IpFilter();
+	virtual Filter * Clone() const;
+	virtual bool Match(const ProtocolInfoElement * pProtocolInfo);
+	bool SetAddress(const std::string sAddr);
+	virtual std::string IpFilter::GetSourcePcapFilter() const;
+	virtual std::string IpFilter::GetDestinationPcapFilter() const;
+private:
+	unsigned int m_nAddr;
+	std::string m_sAddr;
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Makefile
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Makefile	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/Makefile	(revision 22)
@@ -0,0 +1,27 @@
+
+CC=		g++
+CPPFLAGS=	-g -I. -I.. -I/sw/include -DDISPATCH_DEBUG
+LDFLAGS=	-L/sw/lib -lboost_thread
+
+BIN=		test
+SOURCES=	tmp/test.cpp \
+		DispatchInfo.cpp \
+		$(wildcard *Dispatcher.cpp) \
+		$(wildcard *Dissector.cpp) \
+		$(wildcard *Factory.cpp) \
+		$(wildcard ../Logger/*.cpp) 
+
+OBJECTS=	$(SOURCES:.cpp=.o) 
+
+all: 		$(BIN) 
+
+.cpp.o:
+	$(CC) $(CPPFLAGS) -c $< -o $@
+
+test:	${OBJECTS}
+	$(CC) $(LDFLAGS) -o $@ $^
+
+clean:
+	rm *.o tmp/*.o test
+
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/PortFilter.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/PortFilter.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/PortFilter.cpp	(revision 22)
@@ -0,0 +1,48 @@
+#include "PortFilter.h"
+
+PortFilter::PortFilter() :
+	m_nPort(0)
+{
+}
+
+PortFilter::PortFilter(const PortFilter & src) :
+	Filter(src),
+	m_nPort(src.m_nPort)
+{
+}
+
+PortFilter::~PortFilter()
+{
+}
+
+Filter * PortFilter::Clone() const
+{
+	return new PortFilter(*this);
+}
+
+bool PortFilter::Match(const ProtocolInfoElement * pProtocolInfo)
+{
+	if (pProtocolInfo->GetId() != EProtocolType_Udp &&
+		pProtocolInfo->GetId() != EProtocolType_Tcp)
+		return false;
+	if (AreAllPacketsAccepted())
+		return true;
+	const TransportLayerInfo * pTransInfo = dynamic_cast<const TransportLayerInfo *>(pProtocolInfo);
+
+	std::cout << "PortFilter::Match() "
+		  << m_nPort << " "
+		  << pTransInfo->GetDestinationPort() << " "
+		  << pTransInfo->GetSourcePort() << " "
+		  << std::endl;
+
+	return m_nPort == pTransInfo->GetDestinationPort() || 
+		m_nPort == pTransInfo->GetSourcePort();
+}
+
+void PortFilter::SetPortNumber(unsigned short nPort)
+{
+	m_nPort = nPort;
+}
+
+
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/PortFilter.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/PortFilter.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/PortFilter.h	(revision 22)
@@ -0,0 +1,20 @@
+#ifndef PORT_FILTER_H
+#define PORT_FILTER_H
+
+#include "Filter.h"
+
+class PortFilter : public Filter
+{
+public:
+	PortFilter();
+	PortFilter(const PortFilter & src);
+	virtual ~PortFilter();
+	virtual Filter * Clone() const;
+	virtual bool Match(const ProtocolInfoElement * pProtocolInfo);
+	void SetPortNumber(unsigned short nPort);
+private:
+	unsigned short m_nPort;
+};
+
+#endif
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/ProtocolInfo.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/ProtocolInfo.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/ProtocolInfo.cpp	(revision 22)
@@ -0,0 +1,137 @@
+#include "ProtocolInfo.h"
+
+ProtocolInfoElement::ProtocolInfoElement()
+{
+}
+ProtocolInfoElement::~ProtocolInfoElement()
+{
+}
+bool ProtocolInfoElement::Match (const ProtocolInfoElement & toCompare) const
+{
+	return GetId() == toCompare.GetId();
+}
+
+ProtocolInfo::ProtocolInfo()
+{
+}
+
+ProtocolInfo::~ProtocolInfo()
+{
+	int nLen = size();
+	for (int i = 0; i < nLen; ++i)
+		delete (*this)[i];
+}
+void ProtocolInfo::AddItem(ProtocolInfoElement * info)
+{
+	push_back(info);
+}
+
+bool ProtocolInfo::Match(ProtocolInfo & info) const
+{
+	size_t nLen = size();
+	if (nLen != info.size())
+		return false;
+	for (unsigned int i = 0; i < nLen; ++i)
+		if (!(*this)[i]->Match(*info[i]))
+			return false;
+	return true;
+}
+
+size_t ProtocolInfo::Count()
+{
+	return size();
+}
+const ProtocolInfoElement * ProtocolInfo::operator[] ( int nIndex ) const
+{
+	return std::vector<ProtocolInfoElement *>::operator[](nIndex);
+}
+
+
+IPv4Info::IPv4Info() :
+	m_nSrcAddr(0),
+	m_nDstAddr(0)
+{
+}
+
+IPv4Info::IPv4Info(const IPv4Info & src) :
+	m_nSrcAddr(src.m_nSrcAddr),
+	m_nDstAddr(src.m_nDstAddr)
+{
+}
+
+IPv4Info::~IPv4Info()
+{
+}
+bool IPv4Info::Match (const ProtocolInfoElement & toCompare) const
+{
+	if (!ProtocolInfoElement::Match(toCompare))
+		return false;
+	const IPv4Info & tmp = dynamic_cast<const IPv4Info &>(toCompare);
+	return m_nSrcAddr == tmp.m_nSrcAddr && m_nDstAddr == tmp.m_nDstAddr;
+}
+
+ProtocolInfoElement * IPv4Info::Clone() const
+{
+	return new IPv4Info(*this);
+}
+
+TransportLayerInfo::TransportLayerInfo() :
+	m_nSrcPort(0),
+	m_nDstPort(0)
+{
+}
+
+TransportLayerInfo::TransportLayerInfo(const TransportLayerInfo & src) :
+	m_nSrcPort(src.m_nSrcPort),
+	m_nDstPort(src.m_nDstPort)
+{
+}
+
+TransportLayerInfo::~TransportLayerInfo()
+{
+}
+bool TransportLayerInfo::Match (const ProtocolInfoElement & toCompare) const
+{
+	if (!ProtocolInfoElement::Match(toCompare))
+		return false;
+	const TransportLayerInfo & tmp = dynamic_cast<const TransportLayerInfo &>(toCompare);
+	return m_nSrcPort == tmp.m_nSrcPort && m_nDstPort == tmp.m_nDstPort;
+}
+
+TcpInfo::TcpInfo() 
+{
+}
+
+TcpInfo::TcpInfo(const TcpInfo & src) :
+	TransportLayerInfo(src)
+{
+}
+
+TcpInfo::~TcpInfo()
+{
+}
+
+ProtocolInfoElement * TcpInfo::Clone() const
+{
+	return new TcpInfo(*this);
+}
+
+
+UdpInfo::UdpInfo() 
+{
+}
+
+UdpInfo::UdpInfo(const UdpInfo & src) :
+	TransportLayerInfo(src)
+{
+}
+
+UdpInfo::~UdpInfo()
+{
+}
+
+ProtocolInfoElement * UdpInfo::Clone() const
+{
+	return new UdpInfo(*this);
+}
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/ProtocolInfo.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/ProtocolInfo.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/ProtocolInfo.h	(revision 22)
@@ -0,0 +1,104 @@
+#ifndef PROTOCOL_INFO_H
+#define PROTOCOL_INFO_H
+
+#include <list>
+#include <vector>
+
+#ifdef DISPATCH_DEBUG
+// TODO: For debugging only !!!
+namespace t3devlib
+{
+	typedef int ComponentId;
+}
+#else
+#include <t3devlib/t3devlib.h>
+#endif
+
+enum EProtocolType 
+{ 
+	EProtocolType_None,
+	EProtocolType_Unknown,
+	EProtocolType_Ethernet,
+	EProtocolType_IPv4, 
+	EProtocolType_Udp,
+	EProtocolType_Tcp,
+	EProtocolType_Sip,
+	EProtocolType_Dns
+};
+
+class ProtocolInfoElement 
+{
+protected:
+	ProtocolInfoElement();
+public:
+	virtual ~ProtocolInfoElement();
+	virtual EProtocolType GetId() const = 0;
+	virtual bool Match(const ProtocolInfoElement & toCompare) const;
+	virtual ProtocolInfoElement * Clone() const = 0;
+};
+
+class ProtocolInfo : private std::vector<ProtocolInfoElement *>
+{
+public:
+	ProtocolInfo();
+	~ProtocolInfo();
+	void AddItem(ProtocolInfoElement * info);
+	size_t Count();
+	const ProtocolInfoElement * operator[] ( int nIndex ) const;
+    bool Match(ProtocolInfo & info) const;
+};
+
+class IPv4Info : public ProtocolInfoElement
+{
+private:
+	unsigned int m_nSrcAddr, m_nDstAddr;
+public:
+	IPv4Info();
+	IPv4Info(const IPv4Info & src);
+	virtual ~IPv4Info();
+	virtual EProtocolType GetId() const { return EProtocolType_IPv4; }
+	virtual bool Match(const ProtocolInfoElement & toCompare) const;
+	unsigned int GetSourceAddress() const { return m_nSrcAddr; }
+	unsigned int GetDestinationAddress() const { return m_nDstAddr; }
+	void SetSourceAddress(unsigned int nAddr) { m_nSrcAddr = nAddr; }
+	void SetDestinationAddress(unsigned int nAddr) { m_nDstAddr = nAddr; }
+	virtual ProtocolInfoElement * Clone() const;
+ };
+
+class TransportLayerInfo : public ProtocolInfoElement
+{
+private:
+	unsigned short m_nSrcPort, m_nDstPort;
+protected:
+	TransportLayerInfo();
+	TransportLayerInfo(const TransportLayerInfo & src);
+public:		
+	virtual ~TransportLayerInfo();
+	virtual bool Match(const ProtocolInfoElement & toCompare) const;
+	unsigned short GetSourcePort() const { return m_nSrcPort; }
+	unsigned short GetDestinationPort() const { return m_nDstPort; }
+	void SetSourcePort(unsigned short nPort) { m_nSrcPort = nPort; }
+	void SetDestinationPort(unsigned short nPort) { m_nDstPort = nPort; }
+ };
+
+class TcpInfo : public TransportLayerInfo
+{
+public:
+	TcpInfo();
+	TcpInfo(const TcpInfo & src);
+	virtual ~TcpInfo();
+	virtual EProtocolType GetId() const { return EProtocolType_Tcp; }
+	virtual ProtocolInfoElement * Clone() const;
+};
+
+class UdpInfo : public TransportLayerInfo
+{
+public:
+	UdpInfo();
+	UdpInfo(const UdpInfo & src);
+	virtual ~UdpInfo();
+	virtual EProtocolType GetId() const { return EProtocolType_Udp; }
+	virtual ProtocolInfoElement * Clone() const;
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/README.txt
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/README.txt	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/README.txt	(revision 22)
@@ -0,0 +1,257 @@
+README:
+======
+
+For each protocol layer:
+  - Dispatcher instanciates a new Dissector for this layer.
+  - Dispatcher asks Dissector to parse the captured packet.
+  - Dissector determines if packet must be reassembled.
+  - If reassembly is required, packet is tranfered to reassembly,
+    which may result in a complete packet
+  - If packet is complete, then dispatch filters are querried to
+    eliminate components for which this packet is not suitable
+  - Upper layer dispatcher is selected based on Dissector information
+    (Implicitely registered Upper Layers) or based on Upper Layer 
+    Filters (Explicitely registered Upper Layers). Packet and component
+    list are transmitted to first available Upper Layer Dispatcher.
+  - If no Upper Layer Dispatcher is available, then payload and
+    component list are returned.
+
+
+Dispatchers are Singletons, and all inherit from Dispatcher class.
+
+	    Dispatcher
+	      ^---EthernetDispatcher
+	      |---IpDispatcher
+	      |---TcpDispatcher
+	      |---UdpDispatcher
+	      |---SipDispatcher
+	      |---...
+
+Dispatcher instances can be retrieved via pseudo-factory DispatcherFactory
+using method Get("<Layer>"). 
+Example: DispatcherFactory::Instance().Get("UDP");
+
+
+Dissectors all inherits from Dissectors	   
+
+	    Dissector
+	      ^---EthernetDissector
+	      |---IpDissector
+	      |---TcpDissector
+	      |---UdpDissector
+	      |---SipDissector
+	      |---...
+
+Dissectors are created via DissectorFactory using method Create(<Layer>).
+Example: DissectorFactory::Instance().Create("Ethernet");
+
+
+TODO:
+====
+
+* Implement Dispatch filters:
+  => Dispatch filters are created using Dispatcher's RegisterFilter()
+     method. 
+  => Each Dispatch filter should be associated with a ComponentId.
+  => the Match() method should receive a Dissector as parameter.
+  => if none of a ComponentId filters matches, then this ComponentId
+     should be removed from Dispatcher's ComponentId list.
+  => if a ComponentId has no associated filter, then this ComponentId
+     remains in the list.
+  => if Dispatcher's ComponentId list gets empty, then it means that
+     captured packet does not match any Component filter... Oooops
+  => All filters are always processed, thus Dispatch filter 
+     registration order has no impact.
+  => Example:
+
+     Configuration:
+	Components: CompA, CompB, CompC
+
+	Dispatcher: IP
+	Filters: 
+		 - CompA, addr, @1
+		 - CompB, addr, @1
+		 - CompB, addr, @2
+
+	Dispatcher: UDP/TCP
+	Filters: 
+b		 - CompA, port, 5060
+		 - CompB, port, 53
+		 - CompB, port, 5060
+		 - CompC, port, 80
+		 		 
+
+     Captured Packets:
+	      a/ SIP (addr=@1, port=5060)
+	      b/ DNS (addr=@1, port=53)
+	      c/ SIP (addr=@2, port=5060)
+	      d/ HTTP (addr=@1, port=80)
+
+     Results:
+	      a/ Init: CompA, CompB, CompC
+		 Eth:  CompA, CompB, CompC
+		 IP:   CompA, CompB, CompC
+		 UDP:  CompA, CompB
+		 Enqueued on CompA and CompB
+	
+	      b/ Init: CompA, CompB, CompC
+		 Eth:  CompA, CompB, CompC
+		 IP:   CompA, CompB, CompC
+		 UDP:  CompB
+		 Enqueued on CompB
+
+	      c/ Init: CompA, CompB, CompC
+		 Eth:  CompA, CompB, CompC
+		 IP:   CompB, CompC
+		 UDP:  CompB
+		 Enqueued on CompB
+		 
+	      d/ Init: CompA, CompB, CompC
+		 Eth:  CompA, CompB, CompC
+		 IP:   CompA, CompB, CompC
+		 TCP:  CompC
+
+* Implement UpperLayer filters:
+  => Explicit Upper Layers are registered using Dispatcher's method 
+     AddExplicitUpperLayer().
+  => Upper Layers can be selected using Upper Layer filters
+  => Dispatcher will transmit current packet to first registered
+     Upper Layer having a matching UL filter. IMPORTANT: null filter
+     (=no filter) always match. As a consequence, registration order
+     is important
+  => Example 1:
+     
+     Configuration:
+	Dispatcher: Ethernet
+	Implicitely registered Upper Layers: IP
+
+	Dispatcher: IP
+	Implicitely registered Upper Layers: TCP, UDP
+
+     Captured Packets:
+	      a/ Eth-IP-UDP-SIP
+	      b/ Eth-IP-TCP-SIP
+	      c/ Eth-IP-UDP-DNS
+
+     Results:
+		a/ Dispatchers called:
+			    - Eth
+			    - IP
+			    - UDP
+		   SIP dispatcher no called!
+
+		b/ Dispatchers called:
+			    - Eth
+			    - IP
+			    - TCP
+		   SIP dispatcher no called!
+		   (SIP messages not Reassembled !!!)
+
+		c/ Dispatchers called:
+			    - Eth
+			    - IP
+			    - TCP
+		   DNS dispatcher no called!
+		
+  => Example 2:
+     
+     Configuration:
+	Dispatcher: Ethernet
+	Implicitely registered Upper Layers: IP
+
+	Dispatcher: IP
+	Implicitely registered Upper Layers: TCP, UDP
+
+	Dispatcher: UDP
+	Explicitely registered Upper Layers:
+		    - SIP (Filter: none)
+		    - DNS (Filter: port=53)
+
+	Dispatcher: TCP
+	Explicitely registered Upper Layers:
+		    - SIP (Filter: none)
+
+     Captured Packets:
+	      a/ Eth-IP-UDP-SIP
+	      b/ Eth-IP-TCP-SIP
+	      c/ Eth-IP-UDP-DNS
+
+     Results:
+		a/ Dispatchers called:
+			    - Eth
+			    - IP
+			    - UDP
+			    - SIP
+
+		b/ Dispatchers called:
+			    - Eth
+ 			    - IP
+			    - TCP
+			    - SIP
+		   SIP dispatcher called => SIP messages Reassembled !!!
+
+		c/ Dispatchers called:
+			    - Eth
+			    - IP
+			    - UDP
+			    - SIP
+		   DNS dispatcher no called!
+		   SIP dispatcher called!!!
+		   => first dispatcher with matching filter
+		      has been called... Oooops
+		   
+		
+  => Example 3:
+     
+     Configuration:
+	Dispatcher: Ethernet
+	Implicitely registered Upper Layers: IP
+
+	Dispatcher: IP
+	Implicitely registered Upper Layers: TCP, UDP
+
+	Dispatcher: UDP
+	Explicitely registered Upper Layers:
+		    - SIP (Filter: none)
+		    - DNS (Filter: port=53)
+
+	Dispatcher: TCP
+	Explicitely registered Upper Layers:
+		    - SIP (Filter: none)
+
+     Captured Packets:
+	      a/ Eth-IP-UDP-SIP
+	      b/ Eth-IP-TCP-SIP
+	      c/ Eth-IP-UDP-DNS
+
+     Results:
+		a/ Dispatchers called:
+			    - Eth
+			    - IP
+			    - UDP
+			    - SIP
+
+		b/ Dispatchers called:
+			    - Eth
+			    - IP
+			    - TCP
+			    - SIP
+		   DNS dispatcher no called (filter does not match)
+		   SIP dispatcher called => SIP messages Reassembled !!!
+
+		c/ Dispatchers called:
+			    - Eth
+			    - IP
+			    - UDP
+			    - DNS
+		   DNS dispatcher called, OK!
+
+* Implement Sip Dissector:
+  => SipDissector should be able to partially parse SIP message in
+     order to get its length and determine if it is complete or need 
+     reassembly.
+  => Reassemble should proceed to SIP message reassembly (simple 
+     concatenation, as TCP guaranties packet order).
+  => Refer to IpDissector for example of reassembly.
+
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SampleData.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SampleData.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SampleData.h	(revision 22)
@@ -0,0 +1,411 @@
+  // Ethernet Frame containing UDP DNS Query
+  unsigned char psDnsQuery[72] = {
+    0x00, 0x40, 0x63, 0xe0, 0xed, 0xf9, 0x00, 0x17, 0xf2, 0xc4, 
+    0xb3, 0x1c, 0x08, 0x00, 0x45, 0x00, 0x00, 0x3a, 0xe6, 0x28,
+    0x00, 0x00, 0x40, 0x11, 0x13, 0x26, 0xc0, 0xa8, 0x00, 0x05,
+    0xc0, 0xa8, 0x00, 0x0f, 0xdb, 0x53, 0x00, 0x35, 0x00, 0x26,
+    0x81, 0x9c, 0x88, 0x20, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77, 0x04, 0x65,
+    0x74, 0x73, 0x69, 0x03, 0x6f, 0x72, 0x67, 0x00, 0x00, 0x01,
+    0x00, 0x01};
+
+  // Ethernet Frame containing 1st IP fragment of an Echo Request
+  unsigned char psFragmemt_1_1[1410] = {
+    0x00, 0x40, 0x63, 0xe0, 0xed, 0xf9, 0x00, 0x17, 0xf2, 0xc4, 0xb3, 0x1c, 0x08, 0x00, 0x45, 0x00,
+    0x05, 0x74, 0xce, 0x9c, 0x20, 0x00, 0x40, 0x01, 0x05, 0x88, 0xc0, 0xa8, 0x00, 0x05, 0xc0, 0xa8,
+    0x00, 0x0f, 0x08, 0x00, 0x0c, 0x6b, 0xc6, 0x4a, 0x00, 0x00, 0x06, 0x0b, 0x6c, 0x4a, 0x9c, 0x16,
+    0x0b, 0x00, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+    0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+    0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+    0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
+    0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,
+    0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
+    0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
+    0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
+    0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5,
+    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+    0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5,
+    0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5,
+    0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5,
+    0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+    0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+    0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+    0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+    0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
+    0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,
+    0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
+    0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
+    0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
+    0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5,
+    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+    0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5,
+    0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5,
+    0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5,
+    0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+    0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+    0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+    0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+    0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
+    0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,
+    0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
+    0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
+    0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
+    0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5,
+    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+    0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5,
+    0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5,
+    0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5,
+    0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+    0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+    0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+    0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+    0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
+    0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,
+    0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
+    0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
+    0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
+    0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5,
+    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+    0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5,
+    0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5,
+    0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5,
+    0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+    0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+    0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+    0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+    0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
+    0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,
+    0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
+    0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
+    0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
+    0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5,
+    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+    0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5,
+    0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5,
+    0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5,
+    0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+    0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+    0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+    0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+    0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
+    0x56, 0x57
+  };
+
+  // Ethernet Frame containing 2nd IP fragment of an Echo Request
+  unsigned char psFragmemt_1_2[1410] = {
+    0x00, 0x40, 0x63, 0xe0, 0xed, 0xf9, 0x00, 0x17, 0xf2, 0xc4, 0xb3, 0x1c, 0x08, 0x00, 0x45, 0x00,
+    0x05, 0x74, 0xce, 0x9c, 0x20, 0xac, 0x40, 0x01, 0x04, 0xdc, 0xc0, 0xa8, 0x00, 0x05, 0xc0, 0xa8,
+    0x00, 0x0f, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,
+    0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
+    0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
+    0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
+    0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5,
+    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+    0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5,
+    0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5,
+    0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5,
+    0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+    0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+    0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+    0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+    0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
+    0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,
+    0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
+    0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
+    0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
+    0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5,
+    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+    0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5,
+    0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5,
+    0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5,
+    0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+    0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+    0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+    0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+    0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
+    0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,
+    0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
+    0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
+    0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
+    0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5,
+    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+    0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5,
+    0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5,
+    0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5,
+    0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+    0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+    0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+    0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+    0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
+    0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,
+    0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
+    0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
+    0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
+    0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5,
+    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+    0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5,
+    0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5,
+    0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5,
+    0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+    0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+    0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+    0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+    0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
+    0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,
+    0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
+    0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
+    0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
+    0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5,
+    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+    0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5,
+    0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5,
+    0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5,
+    0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+    0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+    0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+    0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+    0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
+    0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,
+    0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
+    0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
+    0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
+    0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5,
+    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+    0xb6, 0xb7
+  };
+
+  // Ethernet Frame containing 3rd (and last) IP fragment of an Echo Request
+  unsigned char psFragmemt_1_3[290] = {
+    0x00, 0x40, 0x63, 0xe0, 0xed, 0xf9, 0x00, 0x17, 0xf2, 0xc4, 0xb3, 0x1c, 0x08, 0x00, 0x45, 0x00,
+    0x01, 0x14, 0xce, 0x9c, 0x01, 0x58, 0x40, 0x01, 0x28, 0x90, 0xc0, 0xa8, 0x00, 0x05, 0xc0, 0xa8,
+    0x00, 0x0f, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5,
+    0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5,
+    0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5,
+    0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+    0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
+    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+    0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+    0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+    0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
+    0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,
+    0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
+    0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
+    0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
+    0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5,
+    0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+    0xb6, 0xb7
+  };
+
+  // Assembled Echo Request contained in precedent fragments  
+  unsigned char psPayload_1[3008] = {
+    0x08, 0x00, 0x0c, 0x6b, 0xc6, 0x4a, 0x00, 0x00, 0x06, 0x0b, 0x6c, 0x4a, 0x9c, 0x16, 0x0b, 0x00,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7
+  };
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SipDispatcher.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SipDispatcher.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SipDispatcher.cpp	(revision 22)
@@ -0,0 +1,10 @@
+#include "SipDispatcher.h"
+
+SipDispatcher::SipDispatcher() 
+  :Dispatcher("SIP") {
+  
+}
+
+SipDispatcher::~SipDispatcher() {
+
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SipDispatcher.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SipDispatcher.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SipDispatcher.h	(revision 22)
@@ -0,0 +1,21 @@
+#ifndef SIP_DISPATCHER_H
+#define SIP_DISPATCHER_H
+
+#include "Helper/Singleton.h"
+#include "Dispatcher.h"
+
+class SipDispatcher : public Dispatcher, public Singleton<SipDispatcher> {
+  
+ protected:
+  //Singleton
+  SipDispatcher();
+  
+  //Singleton
+  friend class Singleton<SipDispatcher>;
+
+ public:
+  ~SipDispatcher();
+
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SipDissector.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SipDissector.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SipDissector.cpp	(revision 22)
@@ -0,0 +1,109 @@
+#include "SipDissector.h"
+#include "Logger/Logger.h"
+#include <boost/regex.hpp>
+
+SipDissector::SipDissector() :
+	m_nMessageLength(HEADER_NOT_PARSED)
+{
+}
+
+SipDissector::~SipDissector() 
+{
+}
+
+SipDissector * SipDissector::Clone() const 
+{
+  return new SipDissector();
+}
+
+bool SipDissector::IsPacketValid() const
+{
+  return m_nMessageLength != PARSING_ERROR;
+}
+
+bool SipDissector::FinishDissection()
+{
+  if (m_nMessageLength == PARSING_ERROR) {
+    return true;
+  }
+	// detect SIP header
+	int i = 0;
+	ssize_t nDataLen = GetPayloadSize();
+	const unsigned char * pData = GetPayload();
+	std::string s(reinterpret_cast<const char *>(pData), nDataLen);
+	if (m_nMessageLength == HEADER_NOT_PARSED)
+	{
+		int nIndex = s.find("\r\n");
+		if (nIndex > -1)
+		{
+			std::string sTmp = s.substr(0, nIndex);
+			boost::regex rgx1("(\\A.* SIP/[0-9]+[\\.][0-9]+)|(\\ASIP/[0-9]+[\\.][0-9]+ .*)", boost::regex::perl|boost::regex::icase);
+			if (!boost::regex_match(sTmp, rgx1))
+			{
+			  Logger::Instance().LogError("Invalid SIP message");
+			  m_nMessageLength = PARSING_ERROR;
+			  return true;
+			}
+			else
+			  m_nMessageLength = LENGTH_NOT_PARSED;
+		}
+	}
+	if (m_nMessageLength == LENGTH_NOT_PARSED)
+	{
+		int nIndex = s.find("\r\n\r\n");
+		if (nIndex > -1)
+		{
+			std::string sTmp = s.substr(0, nIndex);
+			boost::regex rgxContentLength("^(?:(?:Content-Length)|l)[ \\t]*[:]\\s*([0-9]+)$",
+				boost::regex::perl|boost::regex::icase);
+			boost::smatch matches;
+			if (boost::regex_search(sTmp, matches, rgxContentLength))
+			{
+				std::string sLen(matches[1].first, matches[1].second);
+				m_nMessageLength = sTmp.length() + 4 + boost::lexical_cast<int>(sLen);
+			}
+		}
+	}
+	if (m_nMessageLength >= 0 && m_nMessageLength < nDataLen) 
+		// unlikely case: two or more messages came in one packet
+		SeparateUnprocessedData(m_nMessageLength);
+
+	return m_nMessageLength >= 0 && m_nMessageLength <= nDataLen;
+}
+
+
+bool SipDissector::Dissect(const unsigned char * pData, const ssize_t nDataLength) 
+{
+  SavePayload(pData, nDataLength);
+  return true;
+}
+
+bool SipDissector::NeedReassembly() const 
+{
+  return m_nMessageLength < 0 || m_nMessageLength > GetPayloadSize();
+}
+
+bool SipDissector::Reassemble(Dissector * pDissector, ProtocolInfo * pProtocolInfo) 
+{
+  if (!MatchProtocolInfo(pProtocolInfo)) {
+    return false; // Different addresses or ports than expected
+  }
+  AppendPayload(pDissector);
+  FinishDissection();
+  return true;
+}
+
+const EProtocolType SipDissector::GetUpperLayerType() const 
+{
+  return EProtocolType_None;
+}
+
+ProtocolInfoElement * SipDissector::CreateLayerInfo()
+{
+	return 0;
+}
+
+bool SipDissector::CreatesUnprocessedData() const
+{
+  return true;
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SipDissector.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SipDissector.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/SipDissector.h	(revision 22)
@@ -0,0 +1,29 @@
+#ifndef SIP_DISSECTOR_H
+#define SIP_DISSECTOR_H
+
+#include "Dissector.h"
+#include <string>
+
+class SipDissector : public Dissector {
+
+ public:
+  SipDissector();
+  virtual ~SipDissector();
+  virtual SipDissector * Clone() const;
+  virtual bool Dissect(const unsigned char * pData, const ssize_t nDataLen);
+  virtual bool NeedReassembly() const;
+  virtual bool Reassemble(Dissector * pDissector, ProtocolInfo * pProtocolInfo);
+  virtual const EProtocolType GetUpperLayerType() const;
+  virtual bool IsPacketValid() const;
+  virtual bool FinishDissection();
+  virtual bool CreatesUnprocessedData() const;
+ protected:
+  ProtocolInfoElement * CreateLayerInfo();
+ private:
+  static const int HEADER_NOT_PARSED = -1;
+  static const int LENGTH_NOT_PARSED = -2;
+  static const int PARSING_ERROR = -3;
+  int m_nMessageLength;
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/TcpDispatcher.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/TcpDispatcher.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/TcpDispatcher.cpp	(revision 22)
@@ -0,0 +1,10 @@
+#include "TcpDispatcher.h"
+
+TcpDispatcher::TcpDispatcher() 
+  :Dispatcher("TCP") {
+  
+}
+
+TcpDispatcher::~TcpDispatcher() {
+
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/TcpDispatcher.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/TcpDispatcher.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/TcpDispatcher.h	(revision 22)
@@ -0,0 +1,21 @@
+#ifndef TCP_DISPATCHER_H
+#define TCP_DISPATCHER_H
+
+#include "Helper/Singleton.h"
+#include "Dispatcher.h"
+
+class TcpDispatcher : public Dispatcher, public Singleton<TcpDispatcher> {
+  
+ protected:
+  //Singleton
+  TcpDispatcher();
+  
+  //Singleton
+  friend class Singleton<TcpDispatcher>;
+
+ public:
+  ~TcpDispatcher();
+
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/TcpDissector.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/TcpDissector.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/TcpDissector.cpp	(revision 22)
@@ -0,0 +1,69 @@
+#include "TcpDissector.h"
+#include "Logger/Logger.h"
+#ifdef WIN32
+#include <Winsock2.h>
+#else
+#include <netinet/in.h>
+#endif
+
+TcpDissector::TcpDissector() :
+  m_tcpHdr(0)
+{
+}
+
+TcpDissector::~TcpDissector() 
+{
+	delete m_tcpHdr;
+}
+
+TcpDissector * TcpDissector::Clone() const 
+{
+  return new TcpDissector();
+}
+
+bool TcpDissector::Dissect(const unsigned char * pData, const ssize_t nDataLen) 
+{
+  if (!m_tcpHdr)
+    m_tcpHdr = new TcpHeader;
+  memcpy(m_tcpHdr, pData, sizeof(TcpHeader));
+#if BYTE_ORDER == LITTLE_ENDIAN
+  m_tcpHdr->destPort = ntohs(m_tcpHdr->destPort);
+  m_tcpHdr->srcPort = ntohs(m_tcpHdr->srcPort);
+#endif
+  int nOffset = m_tcpHdr->dataOffset;
+  nOffset *= 4;
+  pData += nOffset;
+
+  ssize_t nLen = nDataLen - nOffset;
+  if (nLen > 0)
+  {
+	SavePayload(pData, nLen);
+	SaveLayerInfo();
+  }
+  if (nLen == 0)
+	  Logger::Instance().LogDebug("TCP control packet discarded");
+  return nLen > 0;
+  // TODO: This implementation is not sufficient for all cases. It doesn't handle
+  // out-of-order messages and packet loss issues.
+}
+
+bool TcpDissector::NeedReassembly() const {
+  return false;
+}
+
+bool TcpDissector::Reassemble(Dissector * pDissector, ProtocolInfo * pProtocolInfo) {
+  // Fragmentation has to be solved in application layere protocols
+  return Dissector::Reassemble(pDissector, pProtocolInfo);
+}
+
+const EProtocolType TcpDissector::GetUpperLayerType() const {
+	return EProtocolType_Sip;
+}
+
+ProtocolInfoElement * TcpDissector::CreateLayerInfo()
+{
+	TcpInfo * pRes = new TcpInfo();
+	pRes->SetSourcePort(m_tcpHdr->srcPort);
+	pRes->SetDestinationPort(m_tcpHdr->destPort);
+	return pRes;
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/TcpDissector.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/TcpDissector.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/TcpDissector.h	(revision 22)
@@ -0,0 +1,49 @@
+#ifndef TCP_DISSECTOR_H
+#define TCP_DISSECTOR_H
+
+#include "Dissector.h"
+#include <string>
+
+class TcpDissector : public Dissector {
+
+ public:
+  TcpDissector();
+  virtual ~TcpDissector();
+  virtual TcpDissector * Clone() const;
+  virtual bool Dissect(const unsigned char * pData, const ssize_t nDataLen);
+  virtual bool NeedReassembly() const;
+  virtual bool Reassemble(Dissector * pDissector, ProtocolInfo * pProtocolInfo);
+  virtual const EProtocolType GetUpperLayerType() const;
+
+ private:
+  struct TcpHeader {
+    unsigned short srcPort;          // source port 
+    unsigned short destPort;         // destination port 
+    unsigned int   sequence;         // sequence number - 32 bits 
+    unsigned int   acknowledge;      // acknowledgement number - 32 bits 
+    
+    unsigned char  ns   :1;          //Nonce Sum Flag Added in RFC 3540.
+    unsigned char  reservedPart1:3;  //according to rfc
+    unsigned char  dataOffset:4;     //number of dwords in the TCP header. 
+    
+    unsigned char  fin  :1;          //Finish Flag
+    unsigned char  syn  :1;          //Synchronise Flag
+    unsigned char  rst  :1;          //Reset Flag
+    unsigned char  psh  :1;          //Push Flag 
+    unsigned char  ack  :1;          //Acknowledgement Flag 
+    unsigned char  urg  :1;          //Urgent Flag
+    
+    unsigned char  ecn  :1;          //ECN-Echo Flag
+    unsigned char  cwr  :1;          //Congestion Window Reduced Flag
+        
+    unsigned short window;           // window 
+    unsigned short checksum;         // checksum 
+    unsigned short urgentPointer;    // urgent pointer 
+  };
+
+  TcpHeader * m_tcpHdr;
+ protected:
+  ProtocolInfoElement * CreateLayerInfo();
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/UdpDispatcher.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/UdpDispatcher.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/UdpDispatcher.cpp	(revision 22)
@@ -0,0 +1,10 @@
+#include "UdpDispatcher.h"
+
+UdpDispatcher::UdpDispatcher() 
+  :Dispatcher("UDP") {
+  
+}
+
+UdpDispatcher::~UdpDispatcher() {
+
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/UdpDispatcher.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/UdpDispatcher.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/UdpDispatcher.h	(revision 22)
@@ -0,0 +1,21 @@
+#ifndef UDP_DISPATCHER_H
+#define UDP_DISPATCHER_H
+
+#include "Helper/Singleton.h"
+#include "Dispatcher.h"
+
+class UdpDispatcher : public Dispatcher, public Singleton<UdpDispatcher> {
+  
+ protected:
+  //Singleton
+  UdpDispatcher();
+  
+  //Singleton
+  friend class Singleton<UdpDispatcher>;
+
+ public:
+  ~UdpDispatcher();
+
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/UdpDissector.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/UdpDissector.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/UdpDissector.cpp	(revision 22)
@@ -0,0 +1,53 @@
+#include "UdpDissector.h"
+#include "Logger/Logger.h"
+#ifdef WIN32
+#include <Winsock2.h>
+#else
+#include <netinet/in.h>
+#endif
+
+UdpDissector::UdpDissector() :
+	m_udpHdr(0)
+{
+}
+
+UdpDissector::~UdpDissector() 
+{
+	delete m_udpHdr;
+}
+
+UdpDissector * UdpDissector::Clone() const {
+  return new UdpDissector();
+}
+
+bool UdpDissector::Dissect(const unsigned char * pData, const ssize_t nDataLen) {
+  if (!m_udpHdr)
+    m_udpHdr = new UdpHeader;
+  memcpy(m_udpHdr, pData, sizeof(UdpHeader));
+#if BYTE_ORDER == LITTLE_ENDIAN
+  m_udpHdr->destPort = ntohs(m_udpHdr->destPort);
+  m_udpHdr->srcPort = ntohs(m_udpHdr->srcPort);
+#endif
+  pData += sizeof(UdpHeader);
+
+  SavePayload(pData, nDataLen - sizeof(UdpHeader));
+  SaveLayerInfo();
+  return true;
+}
+
+bool UdpDissector::NeedReassembly() const {
+  return false;
+}
+
+const EProtocolType UdpDissector::GetUpperLayerType() const 
+{
+	return EProtocolType_None;
+}
+
+ProtocolInfoElement * UdpDissector::CreateLayerInfo()
+{
+	UdpInfo * pRes = new UdpInfo();
+	pRes->SetSourcePort(m_udpHdr->srcPort);
+	pRes->SetDestinationPort(m_udpHdr->destPort);
+	return pRes;
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/UdpDissector.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/UdpDissector.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/UdpDissector.h	(revision 22)
@@ -0,0 +1,31 @@
+#ifndef UDP_DISSECTOR_H
+#define UDP_DISSECTOR_H
+
+#include "Dissector.h"
+#include <string>
+
+class UdpDissector : public Dissector {
+
+ public:
+  UdpDissector();
+  virtual ~UdpDissector();
+  virtual UdpDissector * Clone() const;
+  virtual bool Dissect(const unsigned char * pData, const ssize_t nDataLen);
+  virtual bool NeedReassembly() const;
+  virtual const EProtocolType GetUpperLayerType() const;
+
+ private:
+  struct UdpHeader {
+    unsigned short srcPort;         // Source port no.
+    unsigned short destPort;        // Dest. port no.
+    unsigned short length;          // UDP packet length
+    unsigned short checksum;        // UDP checksum (optional)
+  };
+
+ private:
+  UdpHeader * m_udpHdr;
+ protected:
+  ProtocolInfoElement * CreateLayerInfo();
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/tmp/test.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/tmp/test.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Dispatcher/tmp/test.cpp	(revision 22)
@@ -0,0 +1,83 @@
+#include <iostream>
+#include <list>
+#include "DispatcherFactory.h"
+#include "SampleData.h"
+
+int main() {
+
+  // Components
+  ComponentId componentA = 111111;
+  ComponentId componentB = 222222;
+
+  std::list<const ComponentId *> components;
+  components.push_back(&componentA);
+  components.push_back(&componentB);
+
+  // Setup Dispatchers (Eth - IP - UDP/TCP automatically set)
+  DispatcherFactory::Instance().Get("UDP")->AddExplicitUpperLayer("DNS"/*, Filter("port", 53) */);
+  DispatcherFactory::Instance().Get("UDP")->AddExplicitUpperLayer("SIP");
+  DispatcherFactory::Instance().Get("TCP")->AddExplicitUpperLayer("SIP");
+
+  // Component A filters
+//   ip.RegisterFilter(&componentA, "addr", "10.0.0.1");
+//   udp.RegisterFilter(&componentA, "port", 5060);
+//   tcp.RegisterFilter(&componentA, "port", 5060);
+//   udp.RegisterFilter(&componentA, "port", 5080);
+//   tcp.RegisterFilter(&componentA, "port", 5080);
+
+  // Component B filters
+//   ip.RegisterFilter(&componentB, "addr", "10.0.0.2");
+//   udp.RegisterFilter(&componentB, "port", 5060);
+//   tdp.RegisterFilter(&componentB, "port", 5060);
+
+
+  // Get root dispatcher
+  Dispatcher *eth = DispatcherFactory::Instance().Get("Ethernet"); 
+
+  ////////////////////////////////////////////////////////////////
+  // Dispatch DNS Query
+  {
+    std::cout << std::endl << "Dispatch DNS Query" << std::endl;
+
+    DispatchInfo * di = eth->Dispatch(new DispatchInfo(psDnsQuery, 72, components));
+
+    std::cout << "Selected components:" << std::endl;
+    std::list<const ComponentId *>::const_iterator it;    
+    for(it = di->GetComponents().begin();
+	it != di->GetComponents().end();
+	++it) {
+      std::cout << "---> " << *(*it) << std::endl;
+    }    
+  }
+
+  ////////////////////////////////////////////////////////////////
+  // Dispatch Fragments
+  {
+    std::cout << std::endl << "Dispatch IP fragments" << std::endl;
+
+    eth->Dispatch(new DispatchInfo(psFragmemt_1_1, 1410, components));
+    eth->Dispatch(new DispatchInfo(psFragmemt_1_2, 1410, components));
+    DispatchInfo * di = eth->Dispatch(new DispatchInfo(psFragmemt_1_3, 290, components));
+
+    std::cout << "Selected components:" << std::endl;
+    std::list<const ComponentId *>::const_iterator it;    
+    for(it = di->GetComponents().begin();
+	it != di->GetComponents().end();
+	++it) {
+      std::cout << "---> " << *(*it) << std::endl;
+    }    
+  
+    // Check that fragments have been correctly reassembled
+    if(memcmp(psPayload_1, di->GetData(), di->GetDataSize())) {
+      std::cout << "OK !" << std::endl;
+    }
+    else {
+      std::cout << "ERROR" << std::endl;
+    }
+  }
+
+  ////////////////////////////////////////////////////////////////
+
+  return 0;
+}
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Decoders.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Decoders.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Decoders.h	(revision 22)
@@ -0,0 +1,293 @@
+/**
+ * @file Decoders.h
+ * Provides a set of TTCN-3 recoder decoder  methods
+ * @author Yann garcia
+ * @version 1.0
+ * @date 20/07/2009
+ */
+
+#ifndef STF_370_Decoders
+#define STF_370_Decoders
+
+#include <string>
+#include <iostream>
+#include <iomanip>
+
+#include "Singleton.h"
+
+/*! Class Decoders
+ * \brief This class provides a set of convesion methods. It shall be used with Singleton class.
+ */
+class Decoders : public Singleton<Decoders>
+{
+private:
+  //! Singleton implementation
+  friend class Singleton<Decoders>;
+  
+  //! Convertion map from char to int.
+  std::map<char, int> m_char2digits;
+  
+  //! Decoders.
+ /*! Default ctor.
+  */
+  Decoders()
+  {
+    m_char2digits['0'] = 0x00;
+    m_char2digits['1'] = 0x01;
+    m_char2digits['2'] = 0x02;
+    m_char2digits['3'] = 0x03;
+    m_char2digits['4'] = 0x04;
+    m_char2digits['5'] = 0x05;
+    m_char2digits['6'] = 0x06;
+    m_char2digits['7'] = 0x07;
+    m_char2digits['8'] = 0x08;
+    m_char2digits['9'] = 0x09;
+    m_char2digits['a'] = 0x0a;
+    m_char2digits['b'] = 0x0b;
+    m_char2digits['c'] = 0x0c;
+    m_char2digits['d'] = 0x0d;
+    m_char2digits['e'] = 0x0e;
+    m_char2digits['f'] = 0x0f;
+  };
+
+public:
+  //! DecodeByte.
+  /*! Decode a byte, one byte without length.
+   * @param frame: The hexadecimal string
+   * @param [out/out] poffset: The current decoder index
+   * @return The message type.
+   */
+  unsigned char DecodeByte(std::string frame, int *poffset)
+  {
+    // Sanity checks.
+    if (frame.length() < (*poffset + 2))
+    {
+      return 0xff;
+    }
+    
+    // Extract the length.
+    try
+    {
+      return static_cast<unsigned char>(m_char2digits[tolower(frame[(*poffset)++])] << 4 | m_char2digits[tolower(frame[(*poffset)++])]);
+    }
+    catch (const std::exception& e)
+    {
+      return 0xff;
+    }
+  };
+  
+  //! DecodeLengthPlusString.
+  /*! Decode a bytes sequence <length> + <string>, with <length> on 2 bytes.
+   * @param frame: The hexadecimal string
+   * @param [out/out] poffset: The current decoder index
+   * @param [out] pLength: The length of the decoded string.
+   * @return The real string on success, an empty string otherwise. On error, *pLength is set to -1.
+   */
+  std::string DecodeLengthPlusString(std::string frame, int *pOffset, int *pLength)
+  {
+    *pLength = -1;
+    
+    // Sanity checks.
+    if (frame.length() < (*pOffset + 2 * sizeof(short)))
+    {
+      std::cerr << "DecodeLengthPlusString: bad offset value: " << *pOffset << std::endl;
+      return std::string("");
+    }
+    
+    try
+    {
+      // Extract the length.
+      int ended = *pOffset + 2 * sizeof(short);
+      //std::clog << "DecodeLengthPlusString: ended: " << ended << std::endl;
+      *pLength = 0;
+      for (std::string::const_iterator it = frame.begin() + *pOffset; it != frame.begin() + ended; ++it)
+      {
+        if ((*it == '0') && (*(it + 1) == '0'))
+        {
+          it += 1;
+        }
+        else
+        {
+          *pLength <<= 8;
+          *pLength |= static_cast<unsigned char>(m_char2digits[tolower(*it++)] << 4 | m_char2digits[tolower(*it)]);
+        }
+        *pOffset += 2;
+      }
+      
+      //std::cout << "DecodeLengthPlusString: length value:" << *pLength << " - " << *pOffset << std::endl;
+      if (*pLength == 0)
+      {
+        std::cerr << "DecodeLengthPlusString: length is null" << std::endl;
+        return std::string("");
+      }
+      
+      std::ostringstream hexStream;
+      //hexStream << std:setw(2);
+      ended = *pOffset + 2 * *pLength;
+      for (std::string::const_iterator it = frame.begin() + *pOffset; it != frame.begin() + ended; ++it)
+      {
+        hexStream << static_cast<char>(m_char2digits[tolower(*it++)] << 4 | m_char2digits[tolower(*it)]);
+        *pOffset += 2;
+      }
+        
+      return hexStream.str();
+    }
+    catch (const std::exception& e)
+    {
+      *pLength = -1;
+      return std::string("");
+    }
+  };
+  
+  //! DecodeUInt16.
+  /*! Decode a bytes sequence <Integer> on 2 bytes.
+   * @param frame: The hexadecimal string
+   * @param [out/out] pOffset: The current decoder index
+   * @return The number of parameters value on success, -1 otherwise.
+   */
+  int DecodeUInt16(std::string frame, int *pOffset)
+  {
+    // Sanity checks.
+    if (frame.length() < (*pOffset + 2 * sizeof(short)))
+    {
+      std::cerr << "DecodeUInt16: bad offset value: " << *pOffset << std::endl;
+      return -1;
+    }
+    
+    try
+    {
+      // Extract the length.
+      int ended = *pOffset + 2 * sizeof(short);
+      //std::clog << "DecodeUInt16: ended: " << ended << std::endl;
+      int conv = 0;
+      for (std::string::const_iterator it = frame.begin() + *pOffset; it != frame.begin() + ended; ++it)
+      {
+        if ((*it == '0') && (*(it + 1) == '0'))
+        {
+          it += 1;
+        }
+        else
+        {
+          conv <<= 8;
+          conv |= static_cast<unsigned char>(m_char2digits[tolower(*it++)] << 4 | m_char2digits[tolower(*it)]);
+        }
+        *pOffset += 2;
+      }
+      
+        
+      return conv;
+    }
+    catch (const std::exception& e)
+    {
+      return -1;
+    }
+  };
+  
+  //! DecodeParamsNum.
+  /*! Decode a bytes sequence <Integer> on 2 bytes.
+   * @param frame: The hexadecimal string
+   * @param [out/out] pOffset: The current decoder index
+   * @return The number of parameters value on success, -1 otherwise.
+   */
+  int DecodeParamsNum(std::string frame, int *pOffset)
+  {
+    return DecodeUInt16(frame, pOffset);
+  };
+  
+  //! DecodeInteger.
+  /*! Decode a bytes sequence <Integer> on 8 bytes.
+   * @param frame: The hexadecimal string
+   * @param [out/out] pOffset: The current decoder index
+   * @return The integer value on success, -1 otherwise.
+   */
+  int DecodeInteger(std::string frame, int *pOffset)
+  {
+    // Sanity checks.
+    if (frame.length() < (*pOffset + 2 * sizeof(long long)))
+    {
+      return -1;
+    }
+    
+    // Extract the length.
+    try
+    {
+      int ended = *pOffset + 2 * sizeof(long long);
+      int conv = 0;
+      for (std::string::const_iterator it = frame.begin() + *pOffset; it != frame.begin() + ended; ++it)
+      {
+        conv <<= 8;
+        conv |= static_cast<unsigned char>(m_char2digits[tolower(*it++)] << 4 | m_char2digits[tolower(*it)]);
+
+        *pOffset += 2;
+      }
+      
+      return conv;
+    }
+    catch (const std::exception& e)
+    {
+      return -1;
+    }
+  };
+  
+  //! DecodeUInt32.
+  /*! Decode a bytes sequence <Integer> on 4 bytes.
+   * @param frame: The hexadecimal string
+   * @param [out/out] pOffset: The current decoder index
+   * @return The integer value on success, -1 otherwise.
+   */
+  int DecodeUInt32(std::string frame, int *pOffset)
+  {
+    // Sanity checks.
+    if (frame.length() < (*pOffset + 2 * sizeof(int)))
+    {
+      return -1;
+    }
+    
+    // Extract the length.
+    try
+    {
+      int ended = *pOffset + 2 * sizeof(int);
+      int conv = 0;
+      for (std::string::const_iterator it = frame.begin() + *pOffset; it != frame.begin() + ended; ++it)
+      {
+        conv <<= 8;
+        conv |= static_cast<unsigned char>(m_char2digits[tolower(*it++)] << 4 | m_char2digits[tolower(*it)]);
+
+        *pOffset += 2;
+      }
+      
+      return conv;
+    }
+    catch (const std::exception& e)
+    {
+      return -1;
+    }
+  };
+  
+  //! DecodeEnumerated.
+  /*! Decode a bytes sequence <length> + <Integer>.
+   * @param frame: The hexadecimal string
+   * @param [out/out] pOffset: The current decoder index
+   * @return The byte value on success, 0xff otherwise.
+   */
+  unsigned char DecodeEnumerated(std::string frame, int *pOffset)
+  {
+    // Sanity checks.
+    if (frame.length() < (*pOffset + 2))
+    {
+      return 0xff;
+    }
+    
+    // Extract the length.
+    try
+    {
+      return static_cast<unsigned char>(m_char2digits[tolower(frame[(*pOffset)++])] << 4 | m_char2digits[tolower(frame[(*pOffset)++])]);
+    }
+    catch (const std::exception& e)
+    {
+      return 0xff;
+    }
+  };
+};
+
+#endif //  STF_370_Decoders
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Exceptions.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Exceptions.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Exceptions.h	(revision 22)
@@ -0,0 +1,53 @@
+/**
+ * @file Exceptions.h
+ * Provides specific exceptions.
+ * @author Yann garcia
+ * @version 1.0
+ * @date 25/07/2009
+ */
+
+#ifndef STF_370_Exceptions
+#define STF_370_Exceptions
+
+// standard exceptions
+#include <iostream>
+#include <string>
+#include <exception>
+
+class LowerTestAdapterException: public std::exception
+{
+private:
+  std::string m_message;
+
+public:
+  LowerTestAdapterException(const char* message)
+  {
+	  m_message.assign(message);
+  }
+  ~LowerTestAdapterException() throw() {};
+
+  virtual const char* what() const throw()
+  {
+    return m_message.c_str();
+  }
+};
+
+class UpperTestAdapterException: public std::exception
+{
+private:
+  std::string m_message;
+
+public:
+  UpperTestAdapterException(const char* message)
+  {
+	  m_message.assign(message);
+  }
+  ~UpperTestAdapterException() throw() {};
+
+  virtual const char* what() const throw()
+  {
+    return m_message.c_str();
+  }
+};
+
+#endif // STF_370_Exceptions
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Factory.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Factory.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Factory.h	(revision 22)
@@ -0,0 +1,62 @@
+/**
+ * @file Factory.h
+ * Defines the Factory class template
+ * @author Alexandre Berge
+ * @version 1.0
+ * @date 24/07/2009
+ */
+#ifndef FACTORY_H
+#define FACTORY_H
+
+#include <map>
+#include <string>
+
+template <class Object, class Key=std::string> class Factory  {
+  
+  public:
+  void Register(Key key, Object *obj) {
+    if(m_map.find(key) == m_map.end()) {
+      m_map[key] = obj;  
+    }
+  }
+  
+  Object * Create(const Key& key) {
+    Object * tmp = 0;
+    typename std::map<Key, Object*>::iterator it = m_map.find(key);
+    
+    if(it != m_map.end()) 
+      tmp = ((*it).second)->Clone();
+    
+    return tmp;
+  }
+  
+  private:
+  std::map<Key, Object *> m_map;
+  
+};
+
+template  <class Object, class Key=std::string> class SingletonFactory {
+  
+  public:
+  void Register(Key key, Object *obj) {
+    if(m_map.find(key) == m_map.end()) {
+      m_map[key] = obj;  
+    }
+  }
+  
+  Object * Get(const Key& key) {
+    Object * tmp = 0;
+    typename std::map<Key, Object*>::iterator it = m_map.find(key);
+    
+    if(it != m_map.end()) 
+    tmp = (*it).second;
+    
+    return tmp;
+  }
+
+  private:
+  std::map<Key, Object *> m_map;
+  
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/GeneralConfigurationParams.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/GeneralConfigurationParams.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/GeneralConfigurationParams.h	(revision 22)
@@ -0,0 +1,121 @@
+/**
+ * @file GeneralConfigurationParams.h
+ * Provides a class storage for TTCN-3 message GeneralConfigureReq
+ * @author Yann garcia
+ * @version 1.0
+ * @date 24/07/2009
+ */
+
+#ifndef STF_370_GeneralConfigurationParams
+#define STF_370_GeneralConfigurationParams
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <vector>
+#include <map>
+#include <iostream>
+#include <iomanip>
+
+/*! Class EutIPInterface
+ * \brief This class provides a storage for EUTS IP interface.
+ */
+class EutIPInterface
+{
+private:
+  std::string m_eut;
+  std::string m_eutAddress;
+  int m_eutPort;
+public:
+  std::string& Eut() { return m_eut; };
+  std::string& EutAddress() { return m_eutAddress; };
+  int EutPort() { return m_eutPort; };
+public:
+  EutIPInterface(
+    std::string eut,
+    std::string eutAddress,
+    int eutPort)
+  {
+    m_eut = eut;
+    m_eutAddress = eutAddress;
+    m_eutPort = eutPort;
+  };
+  ~EutIPInterface() { std::clog << "~EutIPInterface" << std::endl; };
+ };
+ 
+/*! Class GeneralConfigurationParams
+ * \brief This class provides a class storage for TTCN-3 message GeneralConfigureReq.
+ */
+class GeneralConfigurationParams
+{
+private:
+  std::string m_captureModuleAddress; /**< IP address of the TrafficCapture process */
+  int m_captureModulePort; /**< Port number of the TrafficCapture listener */
+  std::vector<std::string> m_ifaces; /**<  */
+  unsigned char m_mode; /**< Capture mode: offline or online */
+  int m_pcapTimeStampSeconds; /**< Pcap time stamps description */
+  int m_pcapTimeStampMicroseconds; /**< Pcap time stamps description */
+  unsigned char m_record; /**< Record mode (online mode only) */
+  std::string m_pcapMergeTool; /**< Full path file name of the PCAP meger tool (offline mode only) */
+  std::string m_fileToPlay; /**< PCAP file to play (offline mode only) */
+  std::vector<std::string> m_mergerFileList; /**< List of the PCAP file to merge (offline mode only) */
+  std::string m_mergerFilePath; /**< Directory path where the PCAP file to merge to merge are located (offline mode only) */
+  std::vector<boost::shared_ptr<EutIPInterface> > m_eutIpInterfaceList; /**< List of the IP addresses/port numbers of the EUT equipments (online mode only) */
+  
+public:
+  std::string& CaptureModuleAddress() { return m_captureModuleAddress; }; /**< Gets the IP address of the TrafficCapture process */
+  int CaptureModulePort() { return m_captureModulePort; }; /**< Gets the port number of the TrafficCapture listener */
+  std::vector<std::string>& Ifaces() { return m_ifaces; }; /**< Gets the list of the network interfaces to monitor */
+  unsigned char Mode() { return m_mode; }; /**< Gets the capture mode */
+  int PcapTimeStampSeconds() { return m_pcapTimeStampSeconds; }; /**< Gets the Pcap time stamps description */
+  int PcapTimeStampMicroseconds() { return m_pcapTimeStampMicroseconds; }; /**< Gets the Pcap time stamps description */
+  unsigned char Record() { return m_record; }; /**< Gets the record mode */
+  std::string& PcapMergeTool() { return m_pcapMergeTool; }; /**< Gets the full path file name of the PCAP meger tool */
+  std::string& FileToPlay() { return m_fileToPlay; }; /**< Gets the PCAP file to play */
+  std::vector<std::string>& MergerFileList() { return m_mergerFileList; }; /**< Gets the list of the PCAP file to merge */
+  std::string& MergerFilePath() { return m_mergerFilePath; }; /**< Gets the directory path where the PCAP file to merge to merge are located */
+  std::vector<boost::shared_ptr<EutIPInterface> >& EutIpInterfaceList() { return m_eutIpInterfaceList; }; /**< Gets the list of the IP addresses/port numbers of the EUT equipments */
+  
+public:
+  GeneralConfigurationParams() {};
+  ~GeneralConfigurationParams() { std::clog << "~GeneralConfigurationParams" << std::endl; };
+  
+  void Initialize(
+      std::string captureModuleAddress,
+      int captureModulePort,
+      std::vector<std::string> ifaces,
+      unsigned char mode,
+      unsigned char record,
+      std::vector<boost::shared_ptr<EutIPInterface> > eutIpInterfaceList) {
+    m_captureModuleAddress = captureModuleAddress;
+    m_captureModulePort = captureModulePort;
+    m_ifaces = ifaces;
+    m_mode = mode;
+    m_pcapTimeStampSeconds = 0;
+    m_pcapTimeStampMicroseconds = 0;
+    m_record = record;
+    m_eutIpInterfaceList = eutIpInterfaceList;
+  }; // ConnectToCaptureServerParams ctor
+  void Initialize(
+      std::string captureModuleAddress,
+      int captureModulePort,
+      unsigned char mode,
+      int pcapTimeStampSeconds,
+      int pcapTimeStampMicroseconds,
+      std::string pcapMergeTool,
+      std::string fileToPlay,
+      std::vector<std::string>& mergerFileList,
+      std::string mergerFilePath) {
+    m_captureModuleAddress = captureModuleAddress;
+    m_captureModulePort = captureModulePort;
+    m_mode = mode;
+    m_pcapTimeStampSeconds = pcapTimeStampSeconds;
+    m_pcapTimeStampMicroseconds = pcapTimeStampMicroseconds;
+    m_record = 0xff;
+    m_pcapMergeTool = pcapMergeTool;
+    m_fileToPlay = fileToPlay;
+    m_mergerFileList = mergerFileList;
+    m_mergerFilePath = mergerFilePath;
+  }; // ConnectToCaptureServerParams ctor
+};
+
+#endif // STF_370_GeneralConfigurationParams
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Singleton.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Singleton.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Singleton.h	(revision 22)
@@ -0,0 +1,35 @@
+/**
+ * @file Singleton.h
+ * Defines the Singleton class template
+ * @author Alexandre Berge
+ * @version 1.0
+ * @date 16/07/2009
+ */
+#ifndef SINGLETON_H
+#define SINGLETON_H
+template <class T> 
+/**
+ * Template class for singleton objects.
+ */
+class Singleton
+{
+ public:
+ /**
+  * The methods returns the singleton instance of this class.
+  * @return Class instance
+  */
+  static T& Instance() {
+    static T m_instance;
+    return m_instance;
+  }
+ 
+ protected:
+  Singleton() {};
+  virtual ~Singleton() {}; 
+
+ private:
+  Singleton(Singleton const&);  
+  Singleton& operator=(Singleton const&); 
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Socket.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Socket.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Socket.cpp	(revision 22)
@@ -0,0 +1,159 @@
+#include "Socket.h"
+
+#include <sys/types.h>
+#include <iostream>
+#include <unistd.h>
+
+#ifdef WIN32
+#include <WinSock2.h>
+#define socklen_t int
+#else
+#include <sys/socket.h>
+#include <sys/errno.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#endif
+
+#ifdef WIN32
+int Socket::m_nbSockets = 0;
+#endif
+
+Socket::Socket() throw (std::string) {
+
+#ifdef WIN32
+  if(m_nbSockets++ == 0) {
+    WSADATA info;
+    if (WSAStartup(MAKEWORD(2,0), &info)) {
+      std::string err_msg("Could not start WSA");
+      throw err_msg;
+    }  
+  }
+#endif
+
+  m_socket = 0;
+
+  int s = socket(AF_INET, SOCK_STREAM, 0);
+  if (s == -1) {
+    std::string err_msg("Unable to create socket");
+    throw err_msg;
+  }
+
+  m_socket = s;
+}
+
+Socket::Socket(const int s) {
+  m_socket = s;
+}
+
+Socket::~Socket() {
+  if (m_socket)
+    close(m_socket);
+
+#ifdef WIN32
+  if (--m_nbSockets == 0) {
+    WSACleanup();
+  }
+#endif
+}
+
+int Socket::Send(const char *data, const int length) throw (std::string) {
+  int nb_sent = send(m_socket, data, length, 0);
+  //std::clog << "Socket::Send: " << nb_sent << std::endl;
+
+  if (nb_sent == -1) {
+    std::string err_msg("Unable to send data");
+    throw err_msg;
+  }
+
+  return nb_sent;
+}
+ 
+int Socket::Receive(const ssize_t buf_len, char * buf) throw (std::string) {
+
+  ssize_t nb_received = recv(m_socket, buf, buf_len, 0);
+
+  if (nb_received == -1) {
+    std::string err_msg("Unable to receive data");
+    throw err_msg;
+  }
+
+  return nb_received;
+}
+
+//////////////////////////////
+SocketClient::SocketClient(const std::string &host, const int port) throw (std::string) 
+  :Socket()
+{
+  //std::clog << "SocketClient::SocketClient: " << host << " - " << port << std::endl;
+
+  std::string err_msg;
+  sockaddr_in sa;
+  int err;
+
+  struct hostent *hs;
+  hs = gethostbyname(host.c_str());
+
+  if (!hs) {
+    std::cerr << "SocketClient::SocketClient: gethostbyname failed" << std::endl;
+    err_msg = strerror(errno);
+    throw err_msg;
+  }
+
+  sa.sin_family = AF_INET;
+  sa.sin_port = htons(port);
+  sa.sin_addr = *((in_addr *)hs->h_addr);
+  memset(&(sa.sin_zero), 0, 8); 
+
+
+  err = connect(m_socket, (sockaddr *) &sa, sizeof(sockaddr));
+
+  if (err == -1) {
+    std::cerr << "SocketClient::SocketClient: connect failed" << std::endl;
+    err_msg = strerror(errno);
+    throw err_msg;
+  }
+}
+
+//////////////////////////////
+SocketServer::SocketServer(const int port) throw (std::string) 
+  :Socket()
+{
+  std::string err_msg;
+  sockaddr_in sa;
+  int err;
+
+  memset(&sa, 0, sizeof(sockaddr_in)); 
+  sa.sin_family = AF_INET;
+  sa.sin_port = htons(port);
+  
+  err = bind(m_socket, (sockaddr *)&sa, sizeof(sockaddr_in));
+  if (err == -1) {
+    err_msg = strerror(errno);
+    throw err_msg;
+  }
+  
+  err = listen(m_socket, MAX_CLIENTS);
+  if (err == -1) {
+    std::string err_msg("Unable to receive data");
+    throw err_msg;
+  }
+  
+}
+
+Socket* SocketServer::Accept() throw (std::string) {
+  std::string err_msg;
+  sockaddr_in sa;
+  socklen_t sa_size = (socklen_t)sizeof(sockaddr_in);
+  int client_socket;
+
+  client_socket = accept(m_socket, (sockaddr *)&sa, &sa_size);
+
+  if (client_socket == -1) {
+    err_msg = "Accept failed";
+    throw err_msg;
+  }
+
+  std::cerr << "Connection from " << sa.sin_addr.s_addr << std::endl;
+
+  return new Socket(client_socket);
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Socket.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Socket.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Helper/Socket.h	(revision 22)
@@ -0,0 +1,48 @@
+#ifndef STF370_Socket_h
+#define STF370_Socket_h
+
+#include <string>
+
+#define MAX_CLIENTS 10
+	
+class Socket {
+
+ public:
+  Socket() throw (std::string);
+  Socket(const int socket);
+  int Send(const char *data, const int length) throw (std::string);
+  int Receive(const ssize_t buf_len, char * buf) throw (std::string);
+  virtual ~Socket();
+
+ protected:
+  int m_socket;
+
+ private:
+
+#ifdef WIN32
+  static int m_nbSockets;
+#endif
+
+};
+
+
+
+class SocketClient : public Socket {
+
+ public:
+  SocketClient(const std::string &host, const int port) throw (std::string);
+
+};
+
+
+
+class SocketServer : public Socket {
+
+ public:
+  SocketServer(const int port) throw (std::string);
+  Socket* Accept() throw (std::string);
+
+};
+
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Logger/Logger.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Logger/Logger.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Logger/Logger.cpp	(revision 22)
@@ -0,0 +1,45 @@
+#include "Logger.h"
+#include <iostream>
+
+Logger::Logger(void)
+{
+  m_nLogMode = LOG_ALL;
+}
+
+Logger::~Logger(void)
+{
+}
+
+void Logger::LogLine(const std::string sText)
+{
+  boost::mutex::scoped_lock lock(m_mutex);
+  std::clog << sText << std::endl;
+}
+
+void Logger::LogInfo(const std::string sInfo)
+{
+  if ((m_nLogMode & LOG_INFO) != 0)
+    LogLine(sInfo);
+}
+void Logger::LogError(const std::string sError)
+{
+  if ((m_nLogMode & LOG_ERRORS) != 0)
+    LogLine(sError);
+}
+void Logger::LogWarning(const std::string sWarning)
+{
+  if ((m_nLogMode & LOG_WARNINGS) != 0)
+    LogLine(sWarning);
+}
+
+void Logger::LogCapture(const std::string sData)
+{
+  if ((m_nLogMode & LOG_CAPTURE) != 0)
+    LogLine(sData);
+}
+
+void Logger::LogDebug(const std::string sDebugInfo)
+{
+  if ((m_nLogMode & LOG_DEBUG) != 0)
+    LogLine(sDebugInfo);
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Logger/Logger.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Logger/Logger.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Logger/Logger.h	(revision 22)
@@ -0,0 +1,124 @@
+/**
+ * @file Logger.h
+ * Defines the Logger class
+ * @author Tomas Urban
+ * @version 0.2
+ * @date 23/07/2009
+ */
+#ifndef LOGGER_H
+#define LOGGER_H
+
+#include <boost/thread/mutex.hpp>
+#include "Helper/Singleton.h"
+
+/** 
+ * Singleton class for logging. The class uses std::clog as the output channel. All logging
+ * operations are thread safe.
+ */
+class Logger : public Singleton<Logger>
+{
+private:
+	friend class Singleton<Logger>;
+	Logger(void);
+	int m_nLogMode; // Logging mode
+	boost::mutex m_mutex; // Logging lock
+	void LogLine(const std::string sText);
+public:	
+	~Logger(void);	
+
+	/**
+	 * No logging operations are with exeption allowed when this mode is set. It should not be combined
+	 * with other modes.
+	 */
+	static const int LOG_NOTHING = 0x00;
+	/**
+	  * Important information statements are allowed to be printed to the log when this 
+	  * mode is active. This mode can be combined with other modes. It is one of the default 
+	  * modes.
+	 */
+	static const int LOG_INFO = 0x01;
+	/**
+	  * Critical errors are allowed to be printed to the log when this mode is active. This
+	  * mode can be combined with other modes. It is one of the default modes.
+	 */
+	static const int LOG_ERRORS = 0x02;
+	/**
+	  * Minor warnings are allowed to be printed to the log when this mode is active. This
+	  * mode can be combined with other modes.
+	 */
+	static const int LOG_WARNINGS = 0x04;
+	/**
+	  * Hexa dump of captured messages is allowed to be printed to the log when this mode 
+	  * is active. This mode can be combined with other modes.
+	 */
+	static const int LOG_CAPTURE = 0x08;
+	/**
+	  * Debugging statements are allowed to be printed to the log when this mode is active. This
+	  * mode can be combined with other modes.
+	 */
+	static const int LOG_DEBUG = 0x10;
+	/**
+	 * All logging operations are allowed with this mode. It should not be combined with other
+	 * modes.
+	 */
+	static const int LOG_ALL = LOG_INFO | LOG_ERRORS | LOG_WARNINGS | LOG_CAPTURE | LOG_DEBUG;
+	/**
+	 * Sets the logging mode. Individual logging methods are allowed to write to the logging output
+	 * only if the particular logging mode is active.
+     *
+	 * @param nMode Logging mode to be activated. Several modes can be combined using the bitwise or 
+	 *        operator. The following modes are provided:\n
+	 *        #LOG_INFO\n
+	 *        #LOG_ERRORS\n
+	 *        #LOG_WARNINGS\n
+	 *        #LOG_CAPTURE\n
+	 *        #LOG_DEBUG\n
+	 *        #LOG_NOTHING\n
+	 *        #LOG_ALL
+	 */
+	void SetLoggingMode(int nMode) { m_nLogMode = nMode; }
+	/**
+	 * Returns the active logging mode. Individual logging methods are allowed to write to the
+	 * logging output only if the particular logging mode is active.
+	 *
+	 * @return active logging mode
+	 */
+	int GetLoggingMode() const { return m_nLogMode; }
+	/**
+	 * Adds an informative statement to the log. #LOG_INFO mode has to be active, otherwise the
+	 * method is not executed.
+	 *
+	 * @param sInfo information to be logged
+	 */
+	void LogInfo(const std::string sInfo);
+	/**
+	 * Adds an error statement to the log. #LOG_ERRORS mode has to be active, otherwise the
+	 * method is not executed.
+	 *
+	 * @param sError error to be logged
+	 */
+	void LogError(const std::string sError);
+	/**
+	 * Adds a warning to the log. #LOG_WARNINGS mode has to be active, otherwise the
+	 * method is not executed.
+	 *
+	 * @param sWarning warning to be logged
+	 */
+	void LogWarning(const std::string sWarning);
+	/**
+	 * Writes binary dump of captured data to the log. #LOG_CAPTURE mode has to be active, 
+	 * otherwise the method is not executed.
+	 *
+	 * @param sData captured data to be logged
+	 */
+	void LogCapture(const std::string sData);
+	/**
+	 * Adds a debugging statement to the log. #LOG_DEBUG mode has to be active, otherwise the
+	 * method is not executed.
+	 *
+	 * @param sDebugData information to be logged
+	 */
+	void LogDebug(const std::string sDebugData);
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/LowerTestAdapter/LowerTestAdapter.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/LowerTestAdapter/LowerTestAdapter.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/LowerTestAdapter/LowerTestAdapter.cpp	(revision 22)
@@ -0,0 +1,255 @@
+#include "LowerTestAdapter.h"
+
+#include <iostream>
+#include <sys/time.h> 
+
+#include "Helper/Singleton.h"
+#include "Logger/Logger.h"
+#include "Messages/CommonTrafficCaptureMessages.h"
+#include "Messages/TrafficCaptureMessageFactory.h"
+#include "Messages/CapturedData.h"
+#include "Dispatcher/EthernetDispatcher.h"
+#include "Ports/MessagesIdentifiers.h"
+
+LowerTestAdapter::LowerTestAdapter() 
+  :m_dataPort(0),
+   m_adapterConfigPort(0) {
+  
+  Logger::Instance().LogInfo("LowerTester creation");
+}
+
+LowerTestAdapter::~LowerTestAdapter() {
+}
+
+void LowerTestAdapter::RegisterDataPort(DataPort *pPort) {
+  m_dataPort = pPort;
+}
+
+void LowerTestAdapter::RegisterAdapterConfigPort(AdapterConfigPort *pPort) {
+  m_adapterConfigPort = pPort;
+}
+
+void LowerTestAdapter::RegisterFilter(const ComponentId *pComponent, const FilterSet & filter) {
+
+    m_filter.RegisterComponent(pComponent, filter);
+}
+
+void LowerTestAdapter::InitializeCapture(boost::shared_ptr<GeneralConfigurationParams> configParams)  throw (LowerTestAdapterException) {
+
+  clog << ">>> LowerTestAdapter::InitializeCapture" << endl;
+  
+  // Process OpenDevice message
+  OpenDeviceRequest rq;
+  // Set capture mode.
+  ECaptureMode ecMode;
+  clog << "LowerTestAdapter::InitializeCapture: Prepare mode:" << static_cast<int>(configParams.get()->Mode()) << endl;
+  switch (configParams.get()->Mode()) {
+    case 0x00:
+      ecMode = ECaptureMode_Live;
+      break;
+    case 0x01:
+      ecMode = ECaptureMode_Offline;
+      break;
+    default:
+      clog << "LowerTestAdapter::InitializeCapture: set live" << endl;
+      ecMode = ECaptureMode_Live;
+  }
+  clog << "LowerTestAdapter::InitializeCapture: Set mode:" << ecMode << endl;
+  rq.SetCaptureMode(ecMode);
+  // Set capture type.
+  rq.SetCaptureType(ECaptureType_PCAP);
+  
+  // Process merge operation first.
+  if ((ecMode == ECaptureMode_Offline) && (configParams.get()->MergerFileList().size() != 0))
+  {
+    clog << "LowerTestAdapter::InitializeCapture: process merge operation first" << endl;
+    MergePcapFilesRequest mergeReq;
+    // Populate Merge message.
+    mergeReq.SetMergeSource(configParams.get()->MergerFilePath(), configParams.get()->MergerFileList());
+    // Populate Merge tool path.
+    mergeReq.SetMergecapDirectory(configParams.get()->PcapMergeTool());
+    // Send parameters to the TrafficCapture process.
+    std::clog << "LowerTestAdapter::InitializeCapture: Merge tool path" << std::endl;
+    m_captureSocket->Send(mergeReq.GetEncodedMessage(), mergeReq.GetEncodedDataLength());
+    // TODO: Process the response !!!
+  }
+   // Continue with OpenDevice reauest processing
+  if (ecMode == ECaptureMode_Live)
+  {
+    std::vector<std::string> ifaces = configParams.get()->Ifaces();
+    // Sanity check.
+    if (ifaces.size() == 0)
+    {
+      std::cerr << "LowerTestAdapter::InitializeCapture: Ifaces are not well configured" << std::endl;
+      throw LowerTestAdapterException("LowerTestAdapter::InitializeCapture: Ifaces are not well configured");
+    }
+    // Set interfaces.
+    for(vector<string>::iterator it = ifaces.begin() ; it != ifaces.end(); ++it)
+    {
+      std::clog << "LowerTestAdapter::InitializeCapture: set iface: " << *it << std::endl;
+      rq.SetParameters(*it);
+    }
+  }
+  else // Off line mode
+  {
+    // Check file to play
+    if ((configParams.get()->MergerFileList().size() == 0) && (configParams.get()->FileToPlay().length() != 0))
+    {
+      rq.SetParameters(configParams.get()->FileToPlay());
+    }
+    else
+    {
+      // TODO: To be continued.
+      std::cerr << "LowerTestAdapter::InitializeCapture: Offline mode is not properly configure" << std::endl;
+    }
+    // Set timestamp offset if not 0
+    if ((configParams.get()->PcapTimeStampSeconds() != 0) || (configParams.get()->PcapTimeStampMicroseconds() != 0))
+    {
+      struct timeval timestamp = { 
+        (time_t)(configParams.get()->PcapTimeStampSeconds()), 
+        configParams.get()->PcapTimeStampMicroseconds() };
+      std::clog << "LowerTestAdapter::InitializeCapture: timestamp={" << timestamp.tv_sec << ", " << timestamp.tv_usec << "}" << std::endl;
+      rq.SetTimestamp(timestamp);
+    }
+  }
+  // Send parameters to the TrafficCapture process.
+  std::clog << "LowerTestAdapter::InitializeCapture: Open device" << std::endl;
+  SendMessage(&rq);
+}
+
+void LowerTestAdapter::SendMessage(TrafficCaptureMessage * pMsg)
+{
+  m_captureSocket->Send(pMsg->GetEncodedMessage(), pMsg->GetEncodedDataLength());
+}
+
+void LowerTestAdapter::StartCapture() {
+  std::stringstream ss;
+
+  // Set capture filter
+  SetFilterRequest filterReq;
+  filterReq.SetFilter(m_filter.GetPcapFilter());
+  ss << "Capture Filter: " << m_filter.GetPcapFilter();
+  Logger::Instance().LogDebug(ss.str());
+  SendMessage(&filterReq);
+
+  // Start capture
+  StartCaptureRequest rq;
+  std::clog << "LowerTestAdapter::StartCapture" << std::endl;
+  SendMessage(&rq);
+}
+
+void LowerTestAdapter::StopCapture() {
+
+  StopCaptureRequest rq;
+  std::clog << "LowerTestAdapter::StopCapture" << std::endl;
+  SendMessage(&rq);
+  Logger::Instance().LogDebug("Filter clean-up");
+  m_filter.Clear();
+}
+
+void LowerTestAdapter::ConnectToCaptureServer(boost::shared_ptr<GeneralConfigurationParams> configParams)  throw (LowerTestAdapterException) {
+
+  clog << ">>> LowerTestAdapter::ConnectToCaptureServer: " << configParams.get()->CaptureModuleAddress() << " - " << configParams.get()->CaptureModulePort() << endl;
+  
+  // Sanity checks.
+  if (configParams.get()->CaptureModuleAddress().length() == 0)
+  {
+    cerr << ">>> LowerTestAdapter::ConnectToCaptureServer: " << configParams.get()->CaptureModuleAddress() << " - " << configParams.get()->CaptureModulePort() << endl;
+    throw LowerTestAdapterException("LowerTestAdapter::ConnectToCaptureServer: information is missing");
+  }
+  
+  m_captureSocket = new SocketClient(configParams.get()->CaptureModuleAddress(), configParams.get()->CaptureModulePort());
+  m_captureThread = new boost::thread(&Run);
+
+  InitializeCapture(configParams);
+}
+
+void LowerTestAdapter::EnqueueMessage(const ComponentId * pComp, const unsigned char * pData, int nDataLen) {
+  t3devlib::Bitstring bsCapturedBits;
+  bsCapturedBits.Append(pData, nDataLen * 8);
+  // Enqueue captured packet to monitor ports
+  m_dataPort->EnqueueMsg(m_dataPort->GetConnectedPort(pComp), bsCapturedBits);
+}
+
+void LowerTestAdapter::ProcessCapturedData(const unsigned char * pCapturedData, unsigned int nDataLen) {
+  DispatchInfo msgInfo;
+  msgInfo.SetData(pCapturedData, nDataLen);
+  ComponentFilter filterCopy (m_filter);
+  bool bEnqueued = EthernetDispatcher::Instance().Dispatch(msgInfo, filterCopy);
+
+  if(!bEnqueued) {
+    std::stringstream ss;
+    ss << "Captured packet not selected by any Monitor port";
+    Logger::Instance().LogWarning(ss.str());
+  }
+}
+
+void LowerTestAdapter::ProcessResponse(const std::string& message, bool result) {
+  Logger::Instance().LogInfo("LowerTestAdapter::ProcessResponse");
+  
+  m_adapterConfigPort->ProcessResponse (message, result);
+}
+
+void LowerTestAdapter::Run() {
+  Logger::Instance().LogInfo("LowerTester dispatch thread created");
+
+  //Main loop
+  while(true) {
+
+    // Receive message header
+    TMessageHeader msgHeader;
+    int nb = Singleton<LowerTestAdapter>::Instance()
+      .m_captureSocket->Receive(sizeof(TMessageHeader), 
+        reinterpret_cast<char*>(&msgHeader));
+
+    // Receive payload
+    char *psPayload = new char[msgHeader.nMsgLen];
+    nb = LowerTestAdapter::Instance()
+      .m_captureSocket->Receive(msgHeader.nMsgLen, psPayload);
+
+    // Analyze message
+    TrafficCaptureMessage *pMsg 
+      = TrafficCaptureMessageFactory::Instance().CreateMessage(msgHeader.nMsgType, psPayload, msgHeader.nMsgLen);
+    if (pMsg == NULL)
+    {
+      Logger::Instance().LogError("LowerTestAdapter::Run: Create TrafficCaptureMessage failed");
+      continue;
+    }
+
+    clog << "LowerTestAdapter::Run: receive response=" << pMsg->GetId() << endl;
+    string message("");
+    switch (pMsg->GetId()) {
+    case CAPTURED_PACKET_IND:
+      {
+        CapturedData * pCapturedData = dynamic_cast<CapturedData*>(pMsg);
+        const unsigned char * pData = reinterpret_cast<const unsigned char *>(pCapturedData->GetData());    
+        LowerTestAdapter::Instance().ProcessCapturedData(pData, pCapturedData->GetDataLength());
+      }
+      break;
+    case START_CAPTURE_REP:
+      message.assign(MessagesIdentifiers::StartTrafficCaptureRsp);
+      break;
+    case STOP_CAPTURE_REP:
+      message.assign(MessagesIdentifiers::StopTrafficCaptureRsp);
+      break;
+    case OPEN_DEVICE_REP:
+      message.assign(MessagesIdentifiers::GeneralConfigurationRsp);
+      break;
+    case SET_FILTER_REP:
+      //message.assign(MessagesIdentifiers::SetFilterRsp);
+      break;
+    case MERGE_FILES_REP:
+      break;
+    default:
+      break;
+    }
+    
+    if (message.length() != 0)
+    {
+      clog << "LowerTestAdapter::Run: Call LowerTestAdapter::Instance().ProcessResponse: " << message << " - " << ((CommonReplyMessage *)pMsg)->GetResult() << endl;
+      LowerTestAdapter::Instance().ProcessResponse(message, ((CommonReplyMessage *)pMsg)->GetResult());
+    }
+    TrafficCaptureMessageFactory::Instance().DisposeMessage(pMsg);
+  }
+}
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/LowerTestAdapter/LowerTestAdapter.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/LowerTestAdapter/LowerTestAdapter.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/LowerTestAdapter/LowerTestAdapter.h	(revision 22)
@@ -0,0 +1,117 @@
+#ifndef LowerTestAdapter_h
+#define LowerTestAdapter_h
+
+#include <boost/algorithm/string.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include "Helper/Singleton.h"
+#include "Helper/Socket.h"
+#include "Helper/GeneralConfigurationParams.h"
+#include "Helper/Exceptions.h"
+#include "Ports/AdapterConfigPort.h"
+#include "Ports/DataPort.h"
+#include "Messages/TrafficCaptureMessage.h"
+#include "Dispatcher/Filter.h"
+
+using namespace t3devlib;
+
+class LowerTestAdapter : public Singleton<LowerTestAdapter>
+{
+ private:
+  //! Singleton pattern implementation.
+  friend class Singleton<LowerTestAdapter>;
+  
+  //! LowerTestAdapter.
+  /*! Default ctor. Shall be declared in private part due to Singleton pattern implementation.
+   */
+  LowerTestAdapter();
+  void SendMessage(TrafficCaptureMessage * pMsg);
+
+ public:
+  ~LowerTestAdapter();
+  /** Register Data port to Lower Test Adapter
+   * @param pPort: Pointer to Monitor port
+   */
+  void RegisterDataPort(DataPort *pPort);
+
+  /** Register AdapterConfigPort port to Lower Test Adapter
+   * @param pPort: Pointer to Adapter port
+   */
+  void RegisterAdapterConfigPort(AdapterConfigPort *pPort);
+
+  /** Register a filter for a component
+   * @param pComponent: Pointer to a ComponentId for which the filter is defined
+   * @param filter: Filter details
+   */
+  void RegisterFilter(const ComponentId *pComponent, const FilterSet & filter);
+
+  //! ConnectToCaptureServer
+  /*! Configure and connect to the TrafficCapture process
+   * @param sServerAddress: IP address to the TrafficCapture process (it acts as a sever)
+   * @param iServerPort: Port number
+   * @param filter: Global traffic capture filtering
+   * @param ifaces: Netwotrk interfaces to monitor
+   * @param mode: Traffic capture mode: on-line / off-line
+   * @param record: Indicate if the TrafficCapture process should record the traffic
+   * @param fileToPlay: In offline mode, this is the Pcap file name to play. It should be set to an empty string in real-line mode.
+   */
+  void ConnectToCaptureServer(boost::shared_ptr<GeneralConfigurationParams> configParams) throw (LowerTestAdapterException);
+  //void ConnectToCaptureServer(const string& sServerAddress, const int iServerPort, const string& filter, const string& ifaces, unsigned char mode, unsigned char record, const string fileToPlay);
+
+  //! ! StartCapture
+  /*! Start the traffic capture
+    */
+  void StartCapture();
+
+  //! StopCapture
+  /*! Stop the traffic capture
+    */
+  void StopCapture();
+  
+  //! EnqueueMessage
+  /*! Enqueues captured data to the component data port
+   * @param pComp: pointer to the target component
+   * @param pData: pointer to a buffer containing captured data
+   * @param nDataLen: length of captured data (in bytes)
+   */
+  void EnqueueMessage(const ComponentId * pComp, const unsigned char * pData, int nDataLen);
+
+ private:
+  //! ! ProcessResponse
+  /*! Process the TrafficCapture response message result to send it to TTCN-3 script.
+   * @param result: result code
+   */
+  void ProcessResponse(const std::string& message, bool result);
+  /* Main function for thread in charge of communication with 
+   * TrafficCapture
+   */
+  static void Run();
+
+  //! InitializeCapture
+  /*! Configure and connect to the TrafficCapture process
+   * @param filter: Global traffic capture filtering
+   * @param ifaces: Netwotrk interfaces to monitor
+   * @param mode: Traffic capture mode: on-line / off-line
+   * @param record: Indicate if the TrafficCapture process should record the traffic
+   * @param fileToPlay: In offline mode, this is the Pcap file name to play. It should be set to an empty string in real-line mode.
+   */
+  void InitializeCapture(boost::shared_ptr<GeneralConfigurationParams> configParams) throw (LowerTestAdapterException);
+  //void InitializeCapture(const string& filter, const string& ifaces, unsigned char mode, unsigned char record, const string fileToPlay);
+
+  /** This method is called whenever a captured packet is received 
+   * from TrafficCapture. It dispatches the packet to Monitor port 
+   * if associated filter matches.
+   * @param pCapturedData: Pointer to a buffer containing captured data
+   * @param nDataLen: Number of bytes in the buffer containing captured data
+   */
+  void ProcessCapturedData(const unsigned char * pCaptureData, unsigned int nDataLen);
+
+  Socket * m_captureSocket;
+  boost::thread * m_captureThread;
+  DataPort * m_dataPort; // created and deleted by t3dk
+  AdapterConfigPort * m_adapterConfigPort; // created and deleted by t3dk
+  ComponentFilter m_filter;
+};
+
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/CapturedData.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/CapturedData.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/CapturedData.cpp	(revision 22)
@@ -0,0 +1,117 @@
+/**
+ * @file CapturedData.cpp
+ * @author Tomas Urban
+ * @version 0.1
+ * @date 16/07/2009
+ */
+#include "CapturedData.h"
+#include <sstream>
+#include <iomanip>
+#include <ctime>
+
+CapturedData::CapturedData(void) :
+	m_nCapturedLen(0),
+	m_pCapturedData(0),
+	m_captureType(ECaptureType_PCAP)
+{
+	m_timestamp.tv_sec = 0;
+	m_timestamp.tv_usec = 0;
+}
+
+CapturedData::~CapturedData(void)
+{
+	delete m_pCapturedData;
+}
+
+void CapturedData::SetData (int nLen, const char * pData)
+{
+	DisposeEncodedData();
+	delete m_pCapturedData;
+	if (nLen > 0)
+	{
+		m_nCapturedLen = nLen;
+		m_pCapturedData = new char[nLen];
+		memcpy(m_pCapturedData, pData, nLen);
+	}
+	else
+	{
+		m_nCapturedLen = 0;
+		m_pCapturedData = NULL;
+	}
+}
+
+void CapturedData::SetTimestamp(timeval timestamp) 
+{
+	DisposeEncodedData();
+	m_timestamp = timestamp;
+}
+void CapturedData::SetCaptureType(ECaptureType captureType)
+{ 
+	DisposeEncodedData();
+	m_captureType = captureType; 
+}
+
+unsigned int CapturedData::CalculateDataLength()
+{
+	return TrafficCaptureMessage::CalculateDataLength() +
+		1 + // capture type
+		TIME_SIZE + // timestamp
+		sizeof(m_nCapturedLen) + m_nCapturedLen; // captured packet
+}
+
+void CapturedData::EncodePayload(unsigned int & nOffset)
+{
+	TrafficCaptureMessage::EncodePayload(nOffset);
+	EncodeUChar(static_cast<unsigned char>(m_captureType), nOffset);
+	EncodeTime(m_timestamp, nOffset);
+	EncodeUInt(m_nCapturedLen, nOffset);
+	EncodeData(m_pCapturedData, m_nCapturedLen, nOffset);
+}
+
+bool CapturedData::DecodePayload(const char * pPayload, unsigned int nPayloadLength, unsigned int & nOffset)
+{
+	delete m_pCapturedData;
+	m_pCapturedData = NULL;
+	if (!TrafficCaptureMessage::DecodePayload(pPayload, nPayloadLength, nOffset))
+		return false;
+	unsigned char c;
+	if (!DecodeUChar(c, pPayload, nPayloadLength, nOffset))
+		return false;
+	m_captureType = static_cast<ECaptureType>(c);
+	if (!DecodeTime(m_timestamp, pPayload, nPayloadLength, nOffset))
+		return false;
+	if (!DecodeUInt(m_nCapturedLen, pPayload, nPayloadLength, nOffset))
+	{
+		m_nCapturedLen = 0;
+		return false;
+	}
+	if (m_nCapturedLen)
+	{
+		m_pCapturedData = new char [m_nCapturedLen];
+		if (!DecodeData(m_pCapturedData, m_nCapturedLen, pPayload, nPayloadLength, nOffset))
+			return false;
+	}
+	return true;
+}
+std::string CapturedData::ToString()
+{
+	std::stringstream ss;
+	ss << "Data captured\n";
+	time_t t = m_timestamp.tv_sec;
+	struct tm * ts;
+    char szBuf[80];
+	ts = localtime(&t);
+	strftime(szBuf, sizeof(szBuf), "%Y-%m-%d %H:%M:%S", ts);
+	ss << "Timestamp: " << szBuf << "." << m_timestamp.tv_usec << "\n";
+	ss << "Length: " << m_nCapturedLen << "\n";
+	for (unsigned int i = 0; i < m_nCapturedLen; i++)
+	{
+		if (i > 0)			
+			ss << (i % 16 == 0 ? "\n" : " ");
+		ss << std::hex << std::setfill('0') << std::setw(2) << 
+			(short)(unsigned char)m_pCapturedData[i];        
+	}
+	ss << "\n\n";
+	return ss.str();
+}
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/CapturedData.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/CapturedData.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/CapturedData.h	(revision 22)
@@ -0,0 +1,75 @@
+/**
+ * @file CapturedData.h
+ * This header file defines the CapturedData class.
+ * @author Tomas Urban
+ * @version 0.1
+ * @date 16/07/2009
+ */
+#ifndef CAPTURED_DATA_H
+#define CAPTURED_DATA_H
+
+#include "TrafficCaptureMessage.h"
+#include "TrafficCaptureMessageId.h"
+
+/**
+ * This class describes a message used for passing captured data to the lower tester.
+ */
+class CapturedData : public TrafficCaptureMessage
+{
+private:
+	char * m_pCapturedData;
+	unsigned int m_nCapturedLen;
+	struct timeval m_timestamp;
+	ECaptureType m_captureType;
+protected:
+	virtual unsigned int CalculateDataLength();
+	virtual void EncodePayload(unsigned int & nOffset);
+	virtual bool DecodePayload(const char * pPayload, unsigned int nPayloadLength, unsigned int & nOffset);
+public:
+	CapturedData(void);
+	virtual ~CapturedData(void);
+	virtual unsigned short GetId() const { return CAPTURED_PACKET_IND; }
+	/**
+	 * Stores captured data.
+	 * @param nLen Length of the captured data
+	 * @param pData Buffer containing the captured data
+	 */
+	void SetData (int nLen, const char * pData);
+	/**
+	 * Returns the length of captured data.
+	 * @return Length of the captured data
+	 */
+	int GetDataLength() const { return m_nCapturedLen; };
+	/**
+	 * Return a pointer to the buffer containing captured data.
+	 * @return Pointer to captured data
+	 */
+	const char * GetData() const { return m_pCapturedData; }
+	/**
+	 * Sets the time when capture has occurred.
+	 * @param timestamp Time of capture
+	 */
+	void SetTimestamp(struct timeval timestamp);
+	/**
+	 * Returns time of capture.
+	 * @return Time of capture
+	 */
+	struct timeval GetTimestamp() const { return m_timestamp; }
+	/**
+	 * Sets a type of device that captured the data
+	 * @param captureType Type of capturing device
+	 */
+	void SetCaptureType(ECaptureType captureType);
+	/**
+	 * Returns a type of device that captured the data
+	 * @return Type of capturing device
+	 */
+	ECaptureType GetCaptureType() const { return m_captureType; }
+	/**
+	 * Converts the object to a string. Used for logging purposes
+	 * @return String representation of the object.
+	 */
+	std::string ToString();
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/CommonTrafficCaptureMessages.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/CommonTrafficCaptureMessages.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/CommonTrafficCaptureMessages.cpp	(revision 22)
@@ -0,0 +1,241 @@
+/**
+ * @file CommonTrafficCaptureMessages.cpp
+ * @author Tomas Urban
+ * @version 0.3
+ * @date 23/07/2009
+ */
+#include "CommonTrafficCaptureMessages.h"
+
+OpenDeviceRequest::OpenDeviceRequest() :
+	m_captureType(ECaptureType_PCAP),
+	m_captureMode(ECaptureMode_Live)
+{
+	m_timestamp.tv_sec = 0;
+	m_timestamp.tv_usec = 0;
+}
+
+void OpenDeviceRequest::SetCaptureType(ECaptureType captureType)
+{
+	DisposeEncodedData();
+	m_captureType = captureType;
+}
+
+void OpenDeviceRequest::SetCaptureMode(ECaptureMode captureMode)
+{
+	DisposeEncodedData();
+	m_captureMode = captureMode;
+}
+
+void OpenDeviceRequest::SetTimestamp(struct timeval timestamp)
+{
+	DisposeEncodedData();
+	m_timestamp = timestamp;
+}
+
+void OpenDeviceRequest::SetParameters(const std::string & sParams)
+{
+	DisposeEncodedData();
+	m_sParams = sParams;
+}
+
+void OpenDeviceRequest::SetCaptureFile(const std::string & sFile)
+{
+	DisposeEncodedData();
+	m_sCaptureFile = sFile;
+}
+
+unsigned int OpenDeviceRequest::CalculateDataLength()
+{
+	return TrafficCaptureMessage::CalculateDataLength() +
+		1 + // capture type
+		1 + // capture mode
+		TIME_SIZE + // timestamp is forced to 32bits
+		CalculateStringLength(m_sParams) + // parameters
+		CalculateStringLength(m_sCaptureFile); // file name for saving captured data
+}
+
+void OpenDeviceRequest::EncodePayload(unsigned int & nOffset)
+{
+	TrafficCaptureMessage::EncodePayload(nOffset);
+	EncodeUChar(static_cast<unsigned char>(m_captureType), nOffset);
+	EncodeUChar(static_cast<unsigned char>(m_captureMode), nOffset);
+	EncodeTime(m_timestamp, nOffset);	
+	EncodeString(m_sParams, nOffset);
+	EncodeString(m_sCaptureFile, nOffset);
+}
+
+bool OpenDeviceRequest::DecodePayload(const char * pPayload, unsigned int nPayloadLength, 
+									  unsigned int & nOffset)
+{
+	if (!TrafficCaptureMessage::DecodePayload(pPayload, nPayloadLength, nOffset))
+		return false;
+	unsigned char c;
+	if (!DecodeUChar(c, pPayload, nPayloadLength, nOffset))
+		return false;
+	m_captureType = static_cast<ECaptureType>(c);
+	if (!DecodeUChar(c, pPayload, nPayloadLength, nOffset))
+		return false;
+	m_captureMode = static_cast<ECaptureMode>(c);
+	if (!DecodeTime(m_timestamp, pPayload, nPayloadLength, nOffset))
+		return false;
+	if (!DecodeString(m_sParams, pPayload, nPayloadLength, nOffset))
+		return false;
+	if (!DecodeString(m_sCaptureFile, pPayload, nPayloadLength, nOffset))
+		return false;
+	return true;
+}
+
+OpenDeviceReply::OpenDeviceReply() :
+	m_result(ECaptureInit_Failed)
+{
+}
+
+void OpenDeviceReply::SetResult(ECaptureInitResult result)
+{
+	DisposeEncodedData();
+	m_result = result;
+}
+
+unsigned int OpenDeviceReply::CalculateDataLength()
+{
+	return TrafficCaptureMessage::CalculateDataLength() +
+		1; // operation result
+}
+
+void OpenDeviceReply::EncodePayload(unsigned int & nOffset)
+{
+	TrafficCaptureMessage::EncodePayload(nOffset);
+	EncodeUChar(static_cast<unsigned char>(m_result), nOffset);
+}
+
+bool OpenDeviceReply::DecodePayload(const char * pPayload, unsigned int nPayloadLength, 
+									  unsigned int & nOffset)
+{
+	if (!TrafficCaptureMessage::DecodePayload(pPayload, nPayloadLength, nOffset))
+		return false;
+	unsigned char c;
+	if (!DecodeUChar(c, pPayload, nPayloadLength, nOffset))
+		return false;
+	m_result = static_cast<ECaptureInitResult>(c);
+	return true;
+}
+
+
+void SetFilterRequest::SetFilter(const std::string & sFilter)
+{
+	DisposeEncodedData();
+	m_sFilter = sFilter;
+}
+
+unsigned int SetFilterRequest::CalculateDataLength()
+{
+	return TrafficCaptureMessage::CalculateDataLength() +
+		CalculateStringLength(m_sFilter);
+}
+
+void SetFilterRequest::EncodePayload(unsigned int & nOffset)
+{
+	TrafficCaptureMessage::EncodePayload(nOffset);
+	EncodeString(m_sFilter, nOffset);
+}
+
+bool SetFilterRequest::DecodePayload(const char * pPayload, unsigned int nPayloadLength, 
+									  unsigned int & nOffset)
+{
+	if (!TrafficCaptureMessage::DecodePayload(pPayload, nPayloadLength, nOffset))
+		return false;
+	if (!DecodeString(m_sFilter, pPayload, nPayloadLength, nOffset))
+		return false;
+	return true;
+}
+
+void MergePcapFilesRequest::SetMergeSource(const std::string & sMergePath, 
+										   const std::vector<std::string> & vsMergeFiles)
+{
+	DisposeEncodedData();
+	m_sMergePath = sMergePath;
+	m_vsMergeFiles = vsMergeFiles;
+}
+
+
+void MergePcapFilesRequest::SetMergecapDirectory(const std::string & sPath)
+{
+	DisposeEncodedData();
+	m_sMergecapPath = sPath;
+}
+
+unsigned int MergePcapFilesRequest::CalculateDataLength()
+{
+	int nLen = TrafficCaptureMessage::CalculateDataLength() +
+		CalculateStringLength(m_sMergecapPath) +
+		CalculateStringLength(m_sMergePath) +
+		sizeof(unsigned int);
+	int nCount = m_vsMergeFiles.size();
+	for (int i = 0; i < nCount; ++i)
+		nLen += CalculateStringLength(m_vsMergeFiles[i]);
+	return nLen;
+}
+
+void MergePcapFilesRequest::EncodePayload(unsigned int & nOffset)
+{
+	TrafficCaptureMessage::EncodePayload(nOffset);
+	EncodeString(m_sMergecapPath, nOffset);
+	EncodeString(m_sMergePath, nOffset);
+	unsigned int nCount = m_vsMergeFiles.size();
+	EncodeUInt(nCount, nOffset);
+	for (unsigned int i = 0; i < nCount; ++i)
+		EncodeString(m_vsMergeFiles[i], nOffset);
+}
+
+bool MergePcapFilesRequest::DecodePayload(const char * pPayload, unsigned int nPayloadLength, 
+									  unsigned int & nOffset)
+{
+	if (!TrafficCaptureMessage::DecodePayload(pPayload, nPayloadLength, nOffset))
+		return false;
+	if (!DecodeString(m_sMergecapPath, pPayload, nPayloadLength, nOffset))
+		return false;
+	if (!DecodeString(m_sMergePath, pPayload, nPayloadLength, nOffset))
+		return false;
+	unsigned int nCount = 0;
+	if (!DecodeUInt(nCount, pPayload, nPayloadLength, nOffset))
+		return false;
+	m_vsMergeFiles.clear();
+	for (unsigned int i = 0; i < nCount; ++i)
+	{
+		m_vsMergeFiles.push_back("");
+		if (!DecodeString(m_vsMergeFiles[i], pPayload, nPayloadLength, nOffset))
+			return false;
+	}
+	return true;
+}
+
+void MergePcapFilesReply::SetMergeFile(const std::string & sMergeFile)
+{
+	DisposeEncodedData();
+	m_sMergeFile = sMergeFile;
+}
+
+unsigned int MergePcapFilesReply::CalculateDataLength()
+{
+	int nLen =  TrafficCaptureMessage::CalculateDataLength();
+	if (GetResult())
+		nLen += CalculateStringLength(m_sMergeFile);
+	return nLen;
+}
+
+void MergePcapFilesReply::EncodePayload(unsigned int & nOffset)
+{
+	TrafficCaptureMessage::EncodePayload(nOffset);
+	if (GetResult())
+		EncodeString(m_sMergeFile, nOffset);
+}
+
+bool MergePcapFilesReply::DecodePayload(const char * pPayload, unsigned int nPayloadLength, 
+									  unsigned int & nOffset)
+{
+	if (!TrafficCaptureMessage::DecodePayload(pPayload, nPayloadLength, nOffset))
+		return false;
+	if (GetResult() && !DecodeString(m_sMergeFile, pPayload, nPayloadLength, nOffset))
+		return false;
+	return true;
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/CommonTrafficCaptureMessages.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/CommonTrafficCaptureMessages.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/CommonTrafficCaptureMessages.h	(revision 22)
@@ -0,0 +1,279 @@
+/**
+ * @file CommonTrafficCaptureMessages.h
+ * This header file defines simple data message used in communication with the 
+ * TrafficCapture application.
+ * @author Tomas Urban
+ * @version 0.3
+ * @date 23/07/2009
+ */
+#ifndef COMMON_TRAFFIC_CAPTURE_MESSAGES_H
+#define COMMON_TRAFFIC_CAPTURE_MESSAGES_H
+#include "TrafficCaptureMessageId.h"
+#include "TrafficCaptureMessage.h"
+#include <vector>
+
+/**
+ * This class describes a request containing command to start message capture.
+ */
+class StartCaptureRequest : public TrafficCaptureMessage
+{
+public:
+	StartCaptureRequest() {}
+	virtual ~StartCaptureRequest() {}
+	virtual unsigned short GetId() const { return START_CAPTURE_REQ; }
+};
+
+/**
+ * This class describes a reply to a request for starting message capture.
+ */
+class StartCaptureReply : public CommonReplyMessage
+{
+public:
+	StartCaptureReply() {}
+	virtual ~StartCaptureReply() {}
+	virtual unsigned short GetId() const { return START_CAPTURE_REP; }
+};
+
+/**
+ * This class describes a request containing command to stop message capture.
+ */
+class StopCaptureRequest : public TrafficCaptureMessage
+{
+public:
+	StopCaptureRequest() {}
+	virtual ~StopCaptureRequest() {}
+	virtual unsigned short GetId() const { return STOP_CAPTURE_REQ; }
+};
+
+/**
+ * This class describes a reply to a request for stopping message capture.
+ */
+class StopCaptureReply : public CommonReplyMessage
+{
+public:
+	StopCaptureReply() {}
+	virtual ~StopCaptureReply() {}
+	virtual unsigned short GetId() const { return STOP_CAPTURE_REP; }
+};
+
+/**
+ * This class describes a request used for initialization of traffic capture.
+ */
+class OpenDeviceRequest : public TrafficCaptureMessage
+{
+private:
+	ECaptureType m_captureType;
+	ECaptureMode m_captureMode;
+	timeval m_timestamp;
+	std::string m_sParams;
+	std::string m_sCaptureFile;	
+protected:
+	virtual unsigned int CalculateDataLength();
+	virtual void EncodePayload(unsigned int & nOffset);
+	virtual bool DecodePayload(const char * pPayload, unsigned int nPayloadLength, unsigned int & nOffset);
+public:
+	OpenDeviceRequest();
+	virtual ~OpenDeviceRequest() {}
+	virtual unsigned short GetId() const { return OPEN_DEVICE_REQ; }
+	/**
+	 * Returns the requested capture type.
+	 * @return Requested capture type
+	 */
+	ECaptureType GetCaptureType() const { return m_captureType; }
+	/**
+	 * Sets the requested capture type.
+	 * @param captureType Requested capture type
+	 */
+	void SetCaptureType(ECaptureType captureType);
+	/**
+	 * Returns the requested capture mode.
+	 * @return Requested capture mode
+	 */
+	ECaptureMode GetCaptureMode() const { return m_captureMode; }
+	/**
+	 * Sets the requested capture mode.
+	 * @param captureMode Requested capture mode
+	 */
+	void SetCaptureMode(ECaptureMode captureMode);
+	/**
+	 * Returns the requested timestamp for time-based filter. If the returned value is equal to zero,
+	 * no time-based filtering will occur.
+	 * @return Timestamp for time-based filter
+	 */
+	struct timeval GetTimestamp() const { return m_timestamp; }
+	/**
+	 * Sets the timestamp for time-based filter. If the timestamp value is equal to zero, no
+	 * time-based filtering will occur.
+	 * @param timestamp Timestamp for time-based filter
+	 */
+	void SetTimestamp(struct timeval timestamp);
+	/**
+	 * Returns the parameter string used for initializing capturing device.
+	 * @return Start-up parameters for capturing device
+	 */
+	std::string GetParameters() const { return m_sParams; }
+	/**
+	 * Sets the parameter string used for initializing capturing devices. The string format
+	 * is device specific. Please check the documentation of supported devices for more details.
+	 * @param sParams Start-up parameters for capturing device
+	 */
+	void SetParameters(const std::string & sParams);
+	/**
+	 * Returns the name of the file into which captured packets should be saved. Only devices
+	 * using live capture are capable of saving data into files.
+	 * @return Path to the capture file or empty string if no data should be saved
+	 */
+	std::string GetCaptureFile() const { return m_sCaptureFile; }
+	/**
+	 * Sets the name of the file into which captured packets should be saved. Only devices
+	 * using live capture are capable of saving data into files.
+	 * @param sFile Path to the capture file or empty string if no data should be saved
+	 */
+	void SetCaptureFile(const std::string & sFile);
+};
+
+/**
+ * This class describes a reply to a traffic capture initialization request.
+ */
+class OpenDeviceReply : public TrafficCaptureMessage
+{
+private:	
+	ECaptureInitResult m_result;
+protected:
+	virtual unsigned int CalculateDataLength();
+	virtual void EncodePayload(unsigned int & nOffset);
+	virtual bool DecodePayload(const char * pPayload, unsigned int nPayloadLength, unsigned int & nOffset);
+public:
+	OpenDeviceReply();
+	virtual ~OpenDeviceReply() {}
+	virtual unsigned short GetId() const { return OPEN_DEVICE_REP; }
+	/**
+	 * The method returns the result of the operation.
+	 * @return Operation result
+	 */
+	ECaptureInitResult GetResult() const { return m_result; }
+	/**
+	 * The method sets the result of the operation. The default value is #ECaptureInit_Failed.
+	 * @param result Operation result
+	 */
+	void SetResult(ECaptureInitResult result);
+};
+
+/**
+ * This class describes a request used for setting a data filter.
+ */
+class SetFilterRequest : public TrafficCaptureMessage
+{
+private:
+	std::string m_sFilter;
+protected:
+	virtual unsigned int CalculateDataLength();
+	virtual void EncodePayload(unsigned int & nOffset);
+	virtual bool DecodePayload(const char * pPayload, unsigned int nPayloadLength, unsigned int & nOffset);
+public:
+	SetFilterRequest() {}
+	virtual ~SetFilterRequest() {}
+	virtual unsigned short GetId() const { return SET_FILTER_REQ; }
+
+	/**
+	 * Gets requested filter parameters. If the string is empty, no filter shall be applied.
+	 * @return Filter parameters
+	 */
+	std::string GetFilter() const { return m_sFilter; }
+	/**
+	 * Sets filter parameters. If no filtering should occur, the string shall be empty. The string format
+	 * is device specific. Please check the documentation of supported devices for more details.
+	 * @param sFilter Filter parameters
+	 */
+	void SetFilter(const std::string & sFilter);
+};
+
+/**
+ * This class describes a reply to a filtering request.
+ */
+class SetFilterReply : public CommonReplyMessage
+{
+public:
+	SetFilterReply() {}
+	virtual ~SetFilterReply() {}
+	virtual unsigned short GetId() const { return SET_FILTER_REP; }
+};
+
+/**
+ * This class describes a merging request. This request is used for merging several pcap files
+ * into one. If the operation is successful, the path to the file containing merged data is
+ * returned by a subsequent response.
+ */
+class MergePcapFilesRequest : public TrafficCaptureMessage
+{
+private:
+	std::string m_sMergePath, m_sMergecapPath;
+	std::vector<std::string> m_vsMergeFiles;
+protected:
+	virtual unsigned int CalculateDataLength();
+	virtual void EncodePayload(unsigned int & nOffset);
+	virtual bool DecodePayload(const char * pPayload, unsigned int nPayloadLength, unsigned int & nOffset);
+public:
+	MergePcapFilesRequest() {}
+	virtual ~MergePcapFilesRequest() {}
+	virtual unsigned short GetId() const { return MERGE_FILES_REQ; }
+	/**
+	 * Sets the path to the directory where the mergecap tool is installed.
+	 * @param sPath Path to mergecap installation directory
+	 */
+	void SetMergecapDirectory(const std::string & sPath);
+	/**
+	 * Returns path to the directory where the mergecap tool is installed.
+	 * @return Path to mergecap installation directory
+	 */
+	std::string GetMergecapDirectory() {return m_sMergecapPath; }
+	/**
+	 * Sets the source data for the file merging operation.
+	 * @param sMergePath Path to the directory containing files to merge. This directory
+	 * is also used for storing the merged file.
+	 * @param vsMergeFiles Vector containing files to merge
+	 **/
+	void SetMergeSource(const std::string & sMergePath, const std::vector<std::string> & vsMergeFiles);
+	/**
+	 * Returns the path to the directory containing files to merge. This directory
+	 * will be also used for storing the merged file.
+	 * @return Path of files to merge
+	 */
+	std::string GetMergePath() const { return m_sMergePath; }
+	/**
+	 * Returns a vector containing files to merge.
+	 * @return Files to merge
+	 */
+	std::vector<std::string> GetFilesToMerge() const { return m_vsMergeFiles; }
+};
+
+/**
+ * This class describes a reply to a merging request.
+ */
+class MergePcapFilesReply : public CommonReplyMessage
+{
+private:
+	std::string m_sMergeFile;
+protected:
+	virtual unsigned int CalculateDataLength();
+	virtual void EncodePayload(unsigned int & nOffset);
+	virtual bool DecodePayload(const char * pPayload, unsigned int nPayloadLength, unsigned int & nOffset);
+public:
+	MergePcapFilesReply() {}
+	virtual ~MergePcapFilesReply() {}
+	virtual unsigned short GetId() const { return MERGE_FILES_REP; }
+	/**
+	 * Sets a path to the merge file. The path shall be set only in case of successful reply.
+	 * @param sMergeFile Path to the merge file
+	 */
+	void SetMergeFile(const std::string & sMergeFile);
+	/**
+	 * Return a path to the merge file. In case of successful reply, this path shall be used as
+	 * a parameter in a subsequent #OpenDeviceRequest for opening an offline pcap device. Refer to
+	 * #OpenDeviceRequest::SetParameters() for more details.
+	 * @return Path to the merge file
+	 */
+	std::string GetMergeFile() { return m_sMergeFile; }
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessage.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessage.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessage.cpp	(revision 22)
@@ -0,0 +1,236 @@
+/**
+ * @file TrafficCaptureMessage.cpp
+ * @author Tomas Urban
+ * @version 0.2
+ * @date 23/07/2009
+ */
+#include "TrafficCaptureMessage.h"
+#include <string.h>
+
+TrafficCaptureMessage::TrafficCaptureMessage(void)
+{
+	m_pData = 0;
+	m_nDataLen = 0;
+}
+
+TrafficCaptureMessage::~TrafficCaptureMessage(void)
+{
+	DisposeEncodedData();
+}
+
+void TrafficCaptureMessage::DisposeEncodedData()
+{
+	delete m_pData;
+	m_pData = 0;
+	m_nDataLen = 0;
+}
+
+void TrafficCaptureMessage::EncodeData(const void * pData, size_t nSize, unsigned int & nOffset)
+{
+	if (!pData || !nSize)
+		return;
+	memcpy(&m_pData[nOffset], pData, nSize);
+	nOffset += nSize;
+}
+
+void TrafficCaptureMessage::EncodeUChar(unsigned char nValue, unsigned int & nOffset)
+{
+	EncodeData(&nValue, sizeof(unsigned char), nOffset);
+}
+
+void TrafficCaptureMessage::EncodeUShort(unsigned short nValue, unsigned int & nOffset)
+{
+	EncodeData(&nValue, sizeof(unsigned short), nOffset);
+}
+
+void TrafficCaptureMessage::EncodeInt(int nValue, unsigned int & nOffset)
+{
+	EncodeData(&nValue, sizeof(int), nOffset);
+}
+void TrafficCaptureMessage::EncodeUInt(unsigned int nValue, unsigned int & nOffset)
+{
+	EncodeData(&nValue, sizeof(unsigned int), nOffset);
+}
+
+void TrafficCaptureMessage::EncodeTime(struct timeval & timestamp, unsigned int & nOffset)
+{
+	unsigned long long nSec = timestamp.tv_sec;
+	EncodeData(&nSec, sizeof(unsigned long long), nOffset);
+	EncodeUInt(timestamp.tv_usec, nOffset);
+}
+
+void TrafficCaptureMessage::EncodeBool(bool bValue, unsigned int & nOffset)
+{
+	m_pData[nOffset++] = (char)bValue;
+}
+
+void TrafficCaptureMessage::EncodeString(const std::string & sValue, unsigned int & nOffset)
+{
+	unsigned int nLen = sValue.length();
+	EncodeUInt(nLen, nOffset);
+	EncodeData(sValue.c_str(), nLen, nOffset);
+}
+
+unsigned int TrafficCaptureMessage::CalculateDataLength()
+{
+	return 
+		sizeof(unsigned short) // 2 byte id
+		+ sizeof(m_nDataLen); // 4 byte length
+}
+
+unsigned int TrafficCaptureMessage::CalculateStringLength(const std::string & sValue)
+{
+	return sizeof(unsigned int) + sValue.length();
+}
+
+void TrafficCaptureMessage::EncodePayload(unsigned int & nOffset)
+{
+}
+
+void TrafficCaptureMessage::Encode()
+{
+	m_nDataLen = CalculateDataLength();
+	m_pData = new char[m_nDataLen];
+	unsigned int nOffset = 0;
+	EncodeUShort(GetId(), nOffset);
+	unsigned int nPayloadLen = m_nDataLen - sizeof(unsigned short) - sizeof (m_nDataLen);
+	EncodeUInt(nPayloadLen, nOffset);
+	EncodePayload(nOffset);
+}
+
+const char * TrafficCaptureMessage::GetEncodedMessage()
+{
+	if (!m_pData)
+		Encode();
+	return m_pData;
+}
+
+unsigned int TrafficCaptureMessage::GetEncodedDataLength()
+{
+	if (!m_pData)
+		Encode();
+	return m_nDataLen;
+}
+
+bool TrafficCaptureMessage::DecodeData(void * pValue, size_t nValueSize, const char * pData, 
+									   unsigned int nDataLen, unsigned int & nOffset)
+{
+	if (nOffset + nValueSize > nDataLen)
+		return false;
+	memcpy(pValue, &pData[nOffset], nValueSize);
+	nOffset += nValueSize;
+	return true;
+}
+
+bool TrafficCaptureMessage::DecodeUChar(unsigned char & nValue, const char * pData, unsigned int nDataLen, 
+										 unsigned int & nOffset)
+{
+	return DecodeData(&nValue, sizeof(unsigned char), pData, nDataLen, nOffset);
+}
+
+bool TrafficCaptureMessage::DecodeUShort(unsigned short & nValue, const char * pData, unsigned int nDataLen, 
+										 unsigned int & nOffset)
+{
+	return DecodeData(&nValue, sizeof(unsigned short), pData, nDataLen, nOffset);
+}
+bool TrafficCaptureMessage::DecodeInt(int & nValue, const char * pData, unsigned int nDataLen, 
+									  unsigned int & nOffset)
+{
+	return DecodeData(&nValue, sizeof(int), pData, nDataLen, nOffset);
+}
+bool TrafficCaptureMessage::DecodeUInt(unsigned int & nValue, const char * pData, unsigned int nDataLen, 
+									   unsigned int & nOffset)
+{
+	return DecodeData(&nValue, sizeof(unsigned int), pData, nDataLen, nOffset);
+}
+
+bool TrafficCaptureMessage::DecodeTime(struct timeval & timestamp, const char * pData, unsigned int nDataLen, 
+									   unsigned int & nOffset)
+{
+	unsigned long long nSec;
+	if (!DecodeData(&nSec, sizeof(unsigned long long), pData, nDataLen, nOffset))
+		return false;
+#ifdef WIN32
+	timestamp.tv_sec = static_cast<int>(nSec);
+#else
+	timestamp.tv_sec = nSec;
+#endif	
+	int nMicrosec;
+	if (!DecodeInt(nMicrosec, pData, nDataLen, nOffset))
+		return false;
+	timestamp.tv_usec = nMicrosec;
+	return true;
+}
+
+bool TrafficCaptureMessage::DecodeBool(bool & bValue, const char * pData, unsigned int nDataLen, 
+									   unsigned int & nOffset)
+{
+	if (nOffset + 1 > nDataLen)
+		return false;
+	bValue = pData[nOffset++] != 0;
+	return true;
+}
+
+bool TrafficCaptureMessage::DecodeString(std::string & sValue, const char * pData, 
+										 unsigned int nDataLen, unsigned int & nOffset)
+{
+	unsigned int nLen;
+	if (!DecodeUInt(nLen, pData, nDataLen, nOffset))
+		return false;
+	char * pszTmp = new char [nLen + 1];
+	bool bRes = DecodeData(pszTmp, nLen, pData, nDataLen, nOffset);
+	if (bRes)
+	{
+		pszTmp[nLen] = '\0';
+		sValue = pszTmp;
+	}
+	delete pszTmp;
+	return bRes;
+}
+
+bool TrafficCaptureMessage::DecodePayload(const char * pPayload, unsigned int nPayloadLength, 
+										  unsigned int & nOffset)
+{
+	return true;
+}
+
+bool TrafficCaptureMessage::DecodePayload(const char * pPayload, unsigned int nPayloadLength)
+{
+	unsigned int nOffset = 0;
+	bool bRes = DecodePayload(pPayload, nPayloadLength, nOffset);
+	bRes &= nPayloadLength == nOffset; // verify that there's no unprocessed data left
+	return bRes;
+}
+
+CommonReplyMessage::CommonReplyMessage() :
+	m_bResult(false)
+{
+}
+
+unsigned int CommonReplyMessage::CalculateDataLength()
+{
+	return TrafficCaptureMessage::CalculateDataLength() + 1; // bool is encoded into 1 byte
+}
+
+void CommonReplyMessage::EncodePayload(unsigned int & nOffset)
+{
+	TrafficCaptureMessage::EncodePayload(nOffset);
+	EncodeBool(m_bResult, nOffset);
+}
+
+bool CommonReplyMessage::DecodePayload(const char * pPayload, unsigned int nPayloadLength, 
+									   unsigned int & nOffset)
+{
+	if (!TrafficCaptureMessage::DecodePayload(pPayload, nPayloadLength, nOffset))
+		return false;
+	if (!DecodeBool(m_bResult, pPayload, nPayloadLength, nOffset))
+		return false;
+	return true;
+}
+
+void CommonReplyMessage::SetResult(bool bResult)
+{
+	DisposeEncodedData();
+	m_bResult = bResult;
+}
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessage.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessage.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessage.h	(revision 22)
@@ -0,0 +1,323 @@
+/**
+ * @file TrafficCaptureMessage.h
+ * This header file contains basic definition for TCP/IP based communication with the
+ * TrafficCapture application.
+ * @author Tomas Urban
+ * @version 0.1
+ * @date 16/07/2009
+ */
+#ifndef TRAFFIC_CAPTURE_MESSAGE_H
+#define TRAFFIC_CAPTURE_MESSAGE_H
+#include <string>
+
+#ifdef WIN32
+#include <Winsock2.h>
+#else
+#include <sys/time.h>
+#endif
+
+/**
+ * The enumeration contains means which can be used for traffic capture.
+ */
+enum ECaptureType 
+{ 
+	ECaptureType_PCAP /**< PCAP library (for capturing network traffic on link-layer lever) */
+};
+/**
+ * The enumeration defines the mode in which traffic capture occurs.
+ */
+enum ECaptureMode 
+{ 
+	ECaptureMode_Live, /**< Traffic capture occurs in real time */
+	ECaptureMode_Offline /**< Traffic capture is based on saved data from previous sessions */
+};
+
+/**
+ * The enumeration defines results of traffic capture initialization.
+ */
+enum ECaptureInitResult 
+{ 
+	ECaptureInit_Successful, /**< Init succeeded */
+	ECaptureInit_Failed, /**< Init completely failed, nothing can be captured */
+	ECaptureInit_PartiallySuccessful /**< Init wasn't completely successful, but there' at least one device available for capture */
+};
+
+#pragma pack(1)
+/**
+ * Common message header of data message used in communication with the TrafficCapture
+ * application. It is usually used for reading the header data from the socket input stream.
+ */
+struct TMessageHeader
+{	
+	unsigned short nMsgType; /**< Contains message type */
+	unsigned int nMsgLen; /**< Contains length of the payload */
+
+};
+#pragma pack()
+
+/**
+ * Abstract superclass for all data messages used in communication with the TrafficCapture
+ * application. It defines methods for handling the content of message header and common
+ * encoding and decoding methods.\n
+ * The implementation solution for message classes uses strategy and factory patterns.
+ * Child classes containing definitions of real messages should implement the following:\n
+ * 1. #GetId() method returning the message ID\n
+ * 2. Member variables and methods for setting and getting message properties\n
+ * 3. Methods for encoding and decoding message properties\n\n
+ * There are two basic use cases how instances of can be used.\n
+ * 1. When sending a message:\n
+ * a. Create an instance of the class using its constructor\n
+ * b. Initialize message values\n
+ * c. Write the message to a socket stream using the #GetEncodedMessage() and 
+ * #GetEncodedDataLength() methods\n\n
+ * 2. When receiving a message:\n
+ * a. Read the message header from a socket stream\n
+ * b. Using the length information contained in the header, read the payload from the
+ * socket stream\n
+ * c. Instantiate the message using TrafficCaptureMessageFactory. The message instantiated
+ * this way will be automatically decoded.\n
+ * d. Read value data from the message
+ */
+class TrafficCaptureMessage
+{
+private:
+	char * m_pData;
+	unsigned int m_nDataLen;
+	void Encode();
+protected:
+	TrafficCaptureMessage(void);
+	/**
+	 * This constant contains the size of encoded timestamp. It is usually used
+	 * in the #CalculateDataLength() method.
+	 */
+	static const size_t TIME_SIZE = 12;
+	/**
+	 * Disposes the encoded data. This method is called by set operations of child
+	 * classes.
+	 */
+	void DisposeEncodedData();
+	/**
+	 * The method calculates the size of the buffer needed for storing encoded data.
+	 * If a child class introduces new data fields which increase the encoding size, 
+	 * the number returned by this method has to be increased accordingly.
+	 * @return Number of bytes needed for storing the encoded message
+	 */
+	virtual unsigned int CalculateDataLength();
+	/**
+	 * Returns number of bytes needed for storing the string. Encoded string is 
+	 * composed of a 2-byte length field followed by a byte buffer of variable size
+	 * containg string data (without terminating zero). This method is usually used
+	 * inside the #CalculateDataLength() method
+	 * @param sValue String whose length should be calculated
+	 * @return Number of bytes needed for storing the encoded string
+	 */
+	unsigned int CalculateStringLength(const std::string & sValue);
+	/**
+	 * The method encodes message payload. This method shall be overriden if a child
+	 * class introduces new data fields. These fields shall be encoded using the 
+	 * encoding methods provided by this class.
+	 * @param nOffset Contains the writing position in the underlying data buffer.
+	 * The parameter is required for encoding methods provided by this class. It's value
+	 * should never be changed manually.
+	 */
+	virtual void EncodePayload(unsigned int & nOffset);
+	/**
+	 * Writes raw binary data to a buffer containing encoded data.
+	 * @param pData Binary data to write
+	 * @param nSize Size of the binary data
+	 * @param nOffset Writing position
+	 */
+	void EncodeData(const void * pData, size_t nSize, unsigned int & nOffset);
+	/**
+	 * Writes a single unsigned byte to a buffer containing encoded data.
+	 * @param nValue Value to write
+	 * @param nOffset Writing position
+	 */
+	void EncodeUChar(unsigned char nValue, unsigned int & nOffset);
+	/**
+	 * Writes an unsigned short number (2 bytes) to a buffer containing encoded data.
+	 * @param nValue Value to write
+	 * @param nOffset Writing position
+	 */
+	void EncodeUShort(unsigned short nValue, unsigned int & nOffset);
+	/**
+	 * Writes a signed int number (4 bytes) to a buffer containing encoded data.
+	 * @param nValue Value to write
+	 * @param nOffset Writing position
+	 */
+	void EncodeInt(int nValue, unsigned int & nOffset);
+	/**
+	 * Writes an unsigned int number (4 bytes) to a buffer containing encoded data.
+	 * @param nValue Value to write
+	 * @param nOffset Writing position
+	 */
+	void EncodeUInt(unsigned int nValue, unsigned int & nOffset);
+	/**
+	 * Writes a time_t value to a buffer containing encoded data. 
+	 * @param timestamp Timestamp to write
+	 * @param nOffset Writing position
+	 */
+	void EncodeTime(struct timeval & timestamp, unsigned int & nOffset);
+	/**
+	 * Writes a bool value to a buffer containing encoded data. The encoding size
+	 * is 1 byte.
+	 * @param bValue Value to write
+	 * @param nOffset Writing position
+	 */
+	void EncodeBool(bool bValue, unsigned int & nOffset);
+	/**
+	 * Writes a string value to a buffer containing encoded data. Encoded string is
+	 * composed of a 2-byte length field followed by a byte buffer of variable size
+	 * containg string data (without terminating zero).
+	 * @param sValue String to write
+	 * @param nOffset Writing position
+	 */
+	void EncodeString(const std::string & sValue, unsigned int & nOffset);
+	/**
+	 * The method decodes message payload. This method shall be overriden if a child
+	 * class introduces new data fields. These fields can be decoded using the 
+	 * decoding methods provided by this class.
+	 * @param pPayload Pointer to the byte buffer containing encoded payload data
+	 * @param nPayloadLength Length of the payload data
+	 * @param nOffset Contains the reading position in the payload data buffer.
+	 * The parameter is required for decoding methods provided by this class.
+	 * @return \c true if decoding was successful, \c false otherwise
+	 */
+	virtual bool DecodePayload(const char * pPayload, unsigned int nPayloadLength, unsigned int & nOffset);
+	/**
+	 * Reads raw binary data from a data buffer and copies it to a target buffer.
+	 * @param pValue Target buffer
+	 * @param nValueSize Size of the target buffer
+	 * @param pData Buffer containing encoded payload data
+	 * @param nDataLen Length of the payload data
+	 * @param nOffset Reading position
+	 * @return \c true if decoding was successful, \c false otherwise 
+	 */
+	bool DecodeData(void * pValue, size_t nValueSize, const char * pData, unsigned int nDataLen, 
+		unsigned int & nOffset);
+	/**
+	 * Reads a single unsigned byte from a data buffer.
+	 * @param nValue Target value
+	 * @param pData Buffer containing encoded payload data
+	 * @param nDataLen Length of the payload data
+	 * @param nOffset Reading position
+	 * @return \c true if decoding was successful, \c false otherwise
+	 */
+	bool DecodeUChar(unsigned char & nValue, const char * pData, unsigned int nDataLen, unsigned int & nOffset);
+	/**
+	 * Reads an unsigned short number (2 bytes) from a data buffer.
+	 * @param nValue Target value
+	 * @param pData Buffer containing encoded payload data
+	 * @param nDataLen Length of the payload data
+	 * @param nOffset Reading position
+	 * @return \c true if decoding was successful, \c false otherwise
+	 */
+	bool DecodeUShort(unsigned short & nValue, const char * pData, unsigned int nDataLen, unsigned int & nOffset);
+	/**
+	 * Reads a signed int number (4 bytes) from a data buffer.
+	 * @param nValue Target value
+	 * @param pData Buffer containing encoded payload data
+	 * @param nDataLen Length of the payload data
+	 * @param nOffset Reading position
+	 * @return \c true if decoding was successful, \c false otherwise
+	 */
+	bool DecodeInt(int & nValue, const char * pData, unsigned int nDataLen, unsigned int & nOffset);
+	/**
+	 * Reads an unsigned int number (4 bytes) from a data buffer.
+	 * @param nValue Target value
+	 * @param pData Buffer containing encoded payload data
+	 * @param nDataLen Length of the payload data
+	 * @param nOffset Reading position
+	 * @return \c true if decoding was successful, \c false otherwise
+	 */
+	bool DecodeUInt(unsigned int & nValue, const char * pData, unsigned int nDataLen, unsigned int & nOffset);
+	/**
+	 * Reads a timestamp from a data buffer.
+	 * @param timestamp Target timestamp
+	 * @param pData Buffer containing encoded payload data
+	 * @param nDataLen Length of the payload data
+	 * @param nOffset Reading position
+	 * @return \c true if decoding was successful, \c false otherwise
+	 */
+	bool DecodeTime(struct timeval & timestamp, const char * pData, unsigned int nDataLen, unsigned int & nOffset);
+	/**
+	 * Reads a bool value from a data buffer.
+	 * @param bValue Target value
+	 * @param pData Buffer containing encoded payload data
+	 * @param nDataLen Length of the payload data
+	 * @param nOffset Reading position
+	 * @return \c true if decoding was successful, \c false otherwise
+	 */
+	bool DecodeBool(bool & bValue, const char * pData, unsigned int nDataLen, unsigned int & nOffset);
+	/**
+	 * Reads a string value from a data buffer. The encoded string value is
+	 * composed of a 2-byte length field followed by a byte buffer of variable size
+	 * containg string data (without terminating zero).
+	 * @param sValue Target string
+	 * @param pData Buffer containing encoded payload data
+	 * @param nDataLen Length of the payload data
+	 * @param nOffset Reading position
+	 * @return \c true if decoding was successful, \c false otherwise
+	 */
+	bool DecodeString(std::string & sValue, const char * pData, unsigned int nDataLen, unsigned int & nOffset);
+public:	
+	virtual ~TrafficCaptureMessage(void);
+	/**
+	 * Returns message identification number. It is not defined by parent abstract classes level;
+	 * thus it has to be overridden in child classes. The identification numbers returned by 
+	 * individual child classes shall be distinct.
+	 * @return Message identification number
+	 */
+	virtual unsigned short GetId() const = 0;
+	/**
+	 * Encodes the message to a byte buffer and return a pointer to it. The length of the buffer
+	 * can be obtained calling the #GetEncodedDataLength() method. The pointer to the encoded
+	 * data is valid as long as the instance that created it stays alive and unchanged.
+	 * @return Pointer to the byte buffer containing encoded message
+	 */
+	const char * GetEncodedMessage();
+	/**
+	 * This method returns the length of the encoded message data. It is usually used with the
+	 * #GetEncodedMessage() method when writing the message to a socket stream.
+	 * @return Length of encoded data
+	 */
+	unsigned int GetEncodedDataLength();
+	/**
+	 * Initializes message data from a byte buffer containing encoded data for this message.
+	 * This method is used by the TrafficCaptureMessageFactory when creating a message received
+	 * from a remote host.
+	 * @param pPayload Pointer to the byte buffer with encoded payload
+	 * @param nPayloadLength Length of the encoded payload
+	 * @return \c true if decoding was successful, \c false otherwise
+	 */
+	bool DecodePayload(const char * pPayload, unsigned int nPayloadLength);
+};
+
+/**
+ * Common abstract class for reply messages. It defines a \c bool data field containing 
+ * operation success.
+ */
+class CommonReplyMessage : public TrafficCaptureMessage
+{
+private:
+	bool m_bResult;
+protected:
+	CommonReplyMessage();
+	virtual unsigned int CalculateDataLength();
+	virtual void EncodePayload(unsigned int & nOffset);
+	virtual bool DecodePayload(const char * pPayload, unsigned int nPayloadLength, unsigned int & nOffset);
+public:
+	virtual ~CommonReplyMessage() {}
+	/**
+	 * The method returns the result of the operation.
+	 * @return Operation result
+	 */
+	bool GetResult() const { return m_bResult; }
+	/**
+	 * The method sets the result of the operation. The default value is false.
+	 * @param bResult Operation result
+	 */
+	void SetResult(bool bResult);
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessageFactory.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessageFactory.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessageFactory.cpp	(revision 22)
@@ -0,0 +1,95 @@
+/**
+ * @file TrafficCaptureMessageFactory.cpp
+ * @author Tomas Urban
+ * @version 0.2
+ * @date 23/07/2009
+ */
+#include "TrafficCaptureMessageFactory.h"
+#include "CommonTrafficCaptureMessages.h"
+#include "CapturedData.h"
+#include "Logger/Logger.h"
+
+TrafficCaptureMessageFactory::TrafficCaptureMessageFactory(void)
+{
+}
+
+TrafficCaptureMessageFactory::~TrafficCaptureMessageFactory(void)
+{
+}
+
+TrafficCaptureMessage * TrafficCaptureMessageFactory::CreateMessage(unsigned short nId, const char * pPayload, 
+	unsigned int nPayloadLength)
+{
+	TrafficCaptureMessage * pInstance = 0;
+	std::string s;
+	switch(nId)
+	{
+	case CAPTURED_PACKET_IND:
+		s = "CapturedData";
+		pInstance = new CapturedData();
+		break;
+	case SET_FILTER_REQ:
+		s = "SetFilterRequest";
+		pInstance = new SetFilterRequest();
+		break;
+	case START_CAPTURE_REQ:
+		s = "StartCaptureRequest";
+		pInstance = new StartCaptureRequest();
+		break;
+	case START_CAPTURE_REP:
+		s = "StartCaptureReply";
+		pInstance = new StartCaptureReply();
+		break;
+	case STOP_CAPTURE_REQ:
+		s = "StopCaptureRequest";
+		pInstance = new StopCaptureRequest();
+		break;
+	case STOP_CAPTURE_REP:
+		s = "StopCaptureReply";
+		pInstance = new StopCaptureReply();
+		break;
+	case OPEN_DEVICE_REQ:
+		s = "OpenDeviceRequest";
+		pInstance = new OpenDeviceRequest();
+		break;
+	case OPEN_DEVICE_REP:
+		s = "OpenDeviceReply";
+		pInstance = new OpenDeviceReply();
+		break;
+	case SET_FILTER_REP:
+		s = "SetFilterReply";
+		pInstance = new SetFilterReply();
+		break;
+	case MERGE_FILES_REQ:
+		s = "MergePcapFilesRequest";
+		pInstance = new MergePcapFilesRequest();
+		break;
+	case MERGE_FILES_REP:
+		s = "MergePcapFilesReply";
+		pInstance = new MergePcapFilesReply();
+		break;
+	}
+	if (pInstance)
+	{
+		std::string sMsg = "Message instance created: ";
+		sMsg += s;
+		Logger::Instance().LogDebug(sMsg);
+		Logger::Instance().LogDebug("Deserializing message...");
+		if (!pInstance->DecodePayload(pPayload, nPayloadLength))
+		{
+			Logger::Instance().LogDebug("Message deserialization failed");
+			delete pInstance;
+			pInstance = 0;
+		}
+		else
+			Logger::Instance().LogDebug("Deserializing completed successfully");
+	}
+	else
+		Logger::Instance().LogDebug("Message instantiation failed: unknown message");
+	return pInstance;
+}
+
+void TrafficCaptureMessageFactory::DisposeMessage(TrafficCaptureMessage * pInstance)
+{
+	delete pInstance;
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessageFactory.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessageFactory.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessageFactory.h	(revision 22)
@@ -0,0 +1,44 @@
+/**
+ * @file TrafficCaptureMessageFactory.h
+ * This header file defines the TrafficCaptureMessageFactory.
+ * @author Tomas Urban
+ * @version 0.2
+ * @date 23/07/2009
+ */
+#ifndef TRAFFIC_CAPTURE_MESSAGE_FACTORY_H
+#define TRAFFIC_CAPTURE_MESSAGE_FACTORY_H
+#include "TrafficCaptureMessage.h"
+#include "Helper/Singleton.h"
+
+/**
+ * A singleton factory class for instantiating received data messages.
+ */
+class TrafficCaptureMessageFactory  : public Singleton<TrafficCaptureMessageFactory>
+{
+private:
+	friend class Singleton<TrafficCaptureMessageFactory>;
+	TrafficCaptureMessageFactory(void);
+public:
+	~TrafficCaptureMessageFactory(void);
+	/**
+	 * The factory method for creating message instances from data received via TCP/IP
+	 * connection. The objects returned by this method are allocated on the heap, so they
+	 * have to be disposed when they are not needed anymore by the \c delete operator or
+	 * calling the #DisposeMessage method. When creating the message instances, the 
+	 * factory decodes the payload. Thus, the created object are fully initialized.
+	 * @param nId Message identification number
+	 * @param pPayload Buffer containing encoded payload data
+	 * @param nPayloadLength Lenght of the payload data
+	 * @return Created message instance or \c NULL if any error has ocurred (e.g. unknown
+	 * message code, decoding failure).
+	 */
+	TrafficCaptureMessage * CreateMessage(unsigned short nId, const char * pPayload, 
+		unsigned int nPayloadLength);
+	/**
+	 * This method is used for disposing instances allocated by the #CreateMessage method.
+	 * @param pInstance Message instance to be disposed
+	 */
+	void DisposeMessage(TrafficCaptureMessage * pInstance);
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessageId.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessageId.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Messages/TrafficCaptureMessageId.h	(revision 22)
@@ -0,0 +1,23 @@
+/**
+ * @file TrafficCaptureMessageId.h
+ * This header file defines identification codes used in data messages
+ * @author Tomas Urban
+ * @version 0.2
+ * @date 23/07/2009
+ */
+#ifndef TRAFFIC_CAPTURE_MESSAGE_ID_H
+#define TRAFFIC_CAPTURE_MESSAGE_ID_H
+
+#define CAPTURED_PACKET_IND     0x0001 /**< ID of CaptureData */
+#define SET_FILTER_REQ          0x0002 /**< ID of SetFilterRequest */
+#define START_CAPTURE_REQ       0x0003 /**< ID of StartCaptureRequest */
+#define START_CAPTURE_REP       0x0004 /**< ID of StartCaptureReply */
+#define STOP_CAPTURE_REQ        0x0005 /**< ID of StopCaptureRequest */
+#define STOP_CAPTURE_REP        0x0006 /**< ID of StopCaptureReply */
+#define OPEN_DEVICE_REQ			0x0007 /**< ID of OpenDeviceRequest */
+#define OPEN_DEVICE_REP         0x0008 /**< ID of OpenDeviceReply */
+#define SET_FILTER_REP          0x0009 /**< ID of SetFilterReply */
+#define MERGE_FILES_REQ         0x000A /**< ID of MergePcapFilesRequest */
+#define MERGE_FILES_REP         0x000B /**< ID of MergePcapFilesReply */
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketDissector.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketDissector.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketDissector.cpp	(revision 22)
@@ -0,0 +1,143 @@
+#include "PacketDissector.h"
+#include "Logger/Logger.h"
+#include <iostream>
+#include <sstream>
+
+unsigned char * strIntToBin(const string& sInt) {
+  int * pBin = new int(0);
+  istringstream is(sInt);
+
+  if(sInt.substr(0, 2) == "0x")
+    is >> hex;
+
+  if(!(is >> *pBin)) {
+    stringstream ss;
+    ss << "Bad filter: not an integer " << sInt;
+    Logger::Instance().LogError(ss.str());
+  }
+  return reinterpret_cast<unsigned char *>(pBin);
+}
+
+unsigned char * strIpToBin(const string& sIp) {
+
+  unsigned char * pBin = new unsigned char[4];
+  int previousPos = 0;
+  int pos;
+  
+  for(int i=0; i < 4; i++) {
+    pos = sIp.find(".", previousPos);
+    if(pos == string::npos && i != 3) {
+      stringstream ss;
+      ss << "Bad filter: invalid IP address " << sIp;
+      Logger::Instance().LogError(ss.str());
+      return pBin;
+    }
+    pBin[i] = *strIntToBin(sIp.substr(previousPos, pos - previousPos));
+    previousPos = pos + 1;
+  }
+
+  return pBin;
+}
+
+PacketDissector::PacketDissector(const char* psPacket) 
+  :m_ethHdr(0),
+   m_ipHdr(0),
+   m_tcpHdr(0),
+   m_udpHdr(0),
+   m_payload(0) {
+
+  m_ethHdr = new EthernetHeader;
+  memcpy(m_ethHdr, psPacket, sizeof(EthernetHeader));
+  psPacket += sizeof(EthernetHeader);
+  
+  switch (m_ethHdr->type) {
+  case ETH_TYPE_IP:
+    m_ipHdr = new IpHeader;
+    memcpy(m_ipHdr, psPacket, sizeof(IpHeader));
+    psPacket += sizeof(IpHeader);
+
+    switch (m_ipHdr->protocol) {
+    case IP_PROTO_TCP:
+      m_tcpHdr = new TcpHeader;
+      memcpy(m_tcpHdr, psPacket, sizeof(TcpHeader));
+      psPacket += sizeof(TcpHeader);
+      memcpy(m_payload, psPacket, (m_tcpHdr->dataOffset - 5) * 4);
+      break;
+    case IP_PROTO_UDP:
+      m_udpHdr = new UdpHeader;
+      memcpy(m_udpHdr, psPacket, sizeof(UdpHeader));
+      psPacket += sizeof(UdpHeader);
+      memcpy(m_payload, psPacket, m_udpHdr->length - 8);
+      break;
+    default:
+      Logger::Instance().LogError("Bad filter: protocol not supported");
+      break;
+    }
+    break;
+  default:
+    Logger::Instance().LogError("Bad filter: message type not supported");
+    break;
+  }
+}
+
+PacketDissector::~PacketDissector() {
+
+  delete m_ethHdr;
+  delete m_ipHdr;
+  delete m_tcpHdr;
+  delete m_udpHdr;
+  delete m_payload;
+}
+
+bool PacketDissector::Match(const HeaderId& headerId, const FieldId& fieldId, const string& sValue) const {
+  if(m_ipHdr && headerId == e_Ip) {
+    switch(fieldId) {
+    case e_Addr:
+      return (!memcmp(&(m_ipHdr->srcAddr), strIpToBin(sValue), 4) 
+	      || !memcmp(&(m_ipHdr->destAddr), strIpToBin(sValue), 4));
+    case e_Src:
+      return !memcmp(&(m_ipHdr->srcAddr), strIpToBin(sValue), 4);
+    case e_Dst:
+      return !memcmp(&(m_ipHdr->destAddr), strIpToBin(sValue), 4);
+    case e_Proto:
+      return !memcmp(&(m_ipHdr->protocol), strIntToBin(sValue), 1);
+    default:
+      Logger::Instance().LogError("Bad filter: invalid field for IP header");
+      return false;      
+    }
+  }
+  
+  if(m_tcpHdr && headerId == e_Tcp) {
+    switch(fieldId) {
+    case e_Port:
+      return (!memcmp(&(m_tcpHdr->srcPort), strIntToBin(sValue), 2)
+	      || !memcmp(&(m_tcpHdr->destPort), strIntToBin(sValue), 2));
+    case e_SrcPort:
+      return !memcmp(&(m_tcpHdr->srcPort), strIntToBin(sValue), 2);
+    case e_DstPort:
+      return !memcmp(&(m_tcpHdr->destPort), strIntToBin(sValue), 2);
+    default:
+      Logger::Instance().LogError("Bad filter: invalid field for TCP header");
+      return false;
+    }
+  }
+
+  if(m_udpHdr && headerId == e_Udp) {
+    switch(fieldId) {
+    case e_Port:
+      return (!memcmp(&(m_udpHdr->srcPort), strIntToBin(sValue), 2)
+	      || !memcmp(&(m_tcpHdr->destPort), strIntToBin(sValue), 2));
+    case e_SrcPort:
+      return !memcmp(&(m_udpHdr->srcPort), strIntToBin(sValue), 2);
+    case e_DstPort:
+      return !memcmp(&(m_udpHdr->destPort), strIntToBin(sValue), 2);
+    default:
+      Logger::Instance().LogError("Bad filter: invalid field for UPD header");
+      return false;
+    }
+  }
+
+  Logger::Instance().LogError("Bad filter: no support for this header type");
+  return false;
+}
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketDissector.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketDissector.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketDissector.h	(revision 22)
@@ -0,0 +1,116 @@
+#ifndef STF370_PacketFilterDissector_h
+#define STF370_PacketFilterDissector_h
+
+#include <string>
+ 
+using namespace std;
+
+struct EthernetHeader {
+  unsigned char destination[6];
+  unsigned char source[6];
+  unsigned short type;
+};
+
+struct IpHeader {
+#if BYTE_ORDER == LITTLE_ENDIAN
+  unsigned char headerLength:4,    // 4-bit header length (in 32-bit words)
+    version:4;                     // 4-bit IPv4 version
+#else
+#if BYTE_ORDER == BIG_ENDIAN
+  unsigned char version:4,         // 4-bit IPv4 version
+    headerLength:4;                // 4-bit header length (in 32-bit words)
+#endif
+#endif
+  unsigned char  tos;              // IP type of service
+  unsigned short totalLength;      // Total length
+  unsigned short id;               // Unique identifier 
+    
+  unsigned char  fragOffset   :5;  // Fragment offset field
+    
+  unsigned char  moreFragment :1;
+  unsigned char  dontFragment :1;
+  unsigned char  reservedZero :1;
+    
+  unsigned char  fragOffset1;      //fragment offset
+    
+  unsigned char  ttl;              // Time to live
+  unsigned char  protocol;         // Protocol(TCP,UDP etc)
+  unsigned short checksum;         // IP checksum
+  unsigned char  srcAddr[4];       // Source address
+  unsigned char  destAddr[4];      // Source address
+};
+
+struct UdpHeader
+{
+  unsigned short srcPort;         // Source port no.
+  unsigned short destPort;        // Dest. port no.
+  unsigned short length;          // UDP packet length
+  unsigned short checksum;        // UDP checksum (optional)
+};
+
+struct TcpHeader 
+{
+  unsigned short srcPort;          // source port 
+  unsigned short destPort;         // destination port 
+  unsigned int   sequence;         // sequence number - 32 bits 
+  unsigned int   acknowledge;      // acknowledgement number - 32 bits 
+        
+  unsigned char  ns   :1;          //Nonce Sum Flag Added in RFC 3540.
+  unsigned char  reservedPart1:3;  //according to rfc
+  unsigned char  dataOffset:4;     //number of dwords in the TCP header. 
+    
+  unsigned char  fin  :1;          //Finish Flag
+  unsigned char  syn  :1;          //Synchronise Flag
+  unsigned char  rst  :1;          //Reset Flag
+  unsigned char  psh  :1;          //Push Flag 
+  unsigned char  ack  :1;          //Acknowledgement Flag 
+  unsigned char  urg  :1;          //Urgent Flag
+    
+  unsigned char  ecn  :1;          //ECN-Echo Flag
+  unsigned char  cwr  :1;          //Congestion Window Reduced Flag
+        
+  unsigned short window;           // window 
+  unsigned short checksum;         // checksum 
+  unsigned short urgentPointer;    // urgent pointer 
+};
+
+
+#define ETH_TYPE_IP     8
+#define IP_PROTO_TCP    6
+#define IP_PROTO_UDP    17
+
+enum HeaderId {
+  e_NoHeader,
+  e_Ethernet,
+  e_Ip,
+  e_Tcp,
+  e_Udp
+};
+
+enum FieldId {
+  e_NoField,
+  e_Addr,
+  e_Src,
+  e_Dst,
+  e_Port,
+  e_SrcPort,
+  e_DstPort,
+  e_Proto
+};
+
+class PacketDissector {
+
+ public:
+  PacketDissector(const char* psPacket = "");
+  virtual ~PacketDissector();
+  bool Match(const HeaderId& header, const FieldId& sField, const string& sValue) const;
+
+ private:
+  EthernetHeader *m_ethHdr;
+  IpHeader *m_ipHdr;
+  UdpHeader *m_udpHdr;
+  TcpHeader *m_tcpHdr;
+  char *m_payload;
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketFilter.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketFilter.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketFilter.cpp	(revision 22)
@@ -0,0 +1,149 @@
+#include "PacketFilter.h"
+#include "Logger/Logger.h"
+
+PacketFilter::PacketFilter(const string& sFilter) 
+  :m_left(0),
+   m_right(0),
+   m_expr(0),
+   m_operator(FO_NONE),
+   m_valid(false) {
+  int level = 0;
+  string::const_iterator it = sFilter.end();
+  string::const_iterator rightIt = sFilter.end();
+  string::const_iterator leftIt = sFilter.begin();
+
+  //Remove left space
+  while((leftIt != sFilter.end()) && *leftIt == ' ')
+    leftIt++;
+
+  Logger::Instance().LogDebug(sFilter);
+
+  while (it > sFilter.begin()) {
+    switch (*it) {
+
+    case ' ':
+      if(!m_right) {
+	//remove right space
+	rightIt = it;
+      }
+      --it;
+      break;
+
+    case ')':
+      level = 0;
+      for(--it; (it != sFilter.begin()) && !((*it == '(') && (level == 0)); --it) {
+	switch (*it) {
+	case '(':
+	  level --;
+	  break;
+	case ')': 
+	  level ++;
+	  break;
+	default:
+	  break;
+	}
+      }
+      m_right = new PacketFilter(sFilter.substr(it - leftIt + 1,
+						rightIt - it - 2));
+      rightIt = --it;
+      break;
+
+    case '(':
+      Logger::Instance().LogError("No matching parenthesis for '('");
+      return;
+
+    case '&':
+      if( *(--it) != '&') {
+	Logger::Instance().LogError("Unknown operator '&'");
+	return;
+      }
+      m_operator = FO_AND;
+      m_left = new PacketFilter(sFilter.substr(0, it - leftIt));
+      if(!m_right) {
+	m_right = new PacketFilter(sFilter.substr(it - leftIt + 2,
+						  string::npos));
+      }
+      it = sFilter.begin();
+      break;
+
+    case '|':
+      if( *(--it) != '|') {
+	Logger::Instance().LogError("Unknown operator '|'");
+	return;
+      }
+      m_operator = FO_OR;
+      m_left = new PacketFilter(sFilter.substr(0, it - leftIt));
+      if(!m_right) {
+	m_right = new PacketFilter(sFilter.substr(it - leftIt + 2,
+						  string::npos));
+      }
+      it = sFilter.begin();
+      break;
+
+
+    default:
+      --it;
+    }
+  }
+
+  if(!m_right) {
+    // simple expression
+    m_expr = new PacketFilterExpression(sFilter);
+  }
+  m_valid = true;
+}
+
+PacketFilter::~PacketFilter() {
+  delete m_left;
+  delete m_right;
+  delete m_expr;
+}
+
+const string& PacketFilter::GetFilter() const {
+  string *s = new string("");
+
+  if(m_left) {
+    if(m_operator != FO_NONE) 
+      *s += "("; 
+    *s += m_left->GetFilter();
+    if(m_operator != FO_NONE) 
+      *s += ")";
+  }
+
+  if(m_operator == FO_AND) 
+    *s += "&&";
+
+  if(m_operator == FO_OR) 
+    *s += "||";
+
+  if(m_right) {
+    if(m_operator != FO_NONE) 
+      *s += "("; 
+    *s += m_right->GetFilter();
+    if(m_operator != FO_NONE) 
+      *s += ")";
+  }
+  else
+    *s += m_expr->GetExpression();
+
+  return *s;
+}
+
+bool PacketFilter::Match(const PacketDissector& packet) const {
+
+  if(m_operator == FO_NONE) {
+    if(m_right)
+      return m_right->Match(packet);
+    else {
+      if(m_expr) {
+	return m_expr->Match(packet);
+      }	
+    }
+  }
+
+  if(m_operator == FO_AND)
+    return m_left->Match(packet) && m_right->Match(packet);
+
+  if(m_operator == FO_OR)
+    return m_left->Match(packet) || m_right->Match(packet);
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketFilter.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketFilter.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketFilter.h	(revision 22)
@@ -0,0 +1,33 @@
+#ifndef STF370_PacketFilter_h
+#define STF370_PacketFilter_h
+
+#include <string>
+#include "PacketFilterExpression.h"
+#include "PacketDissector.h"
+
+using namespace std;
+
+enum FilterOperator {
+  FO_NONE,
+  FO_AND,
+  FO_OR
+};
+	
+class PacketFilter {
+
+ public:
+  PacketFilter(const string& sFilter = "");
+  virtual ~PacketFilter();
+  const string& GetFilter() const;
+  bool Match(const PacketDissector& packet) const;
+
+ private:
+  PacketFilter *m_right;
+  PacketFilter *m_left;
+  FilterOperator m_operator;
+  PacketFilterExpression *m_expr;
+  bool m_valid;
+
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketFilterExpression.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketFilterExpression.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketFilterExpression.cpp	(revision 22)
@@ -0,0 +1,115 @@
+#include "PacketFilterExpression.h"
+#include "Logger/Logger.h"
+
+string& trim(const string& sOriginal) {
+  
+  string::const_iterator leftIt = sOriginal.begin();
+  string::const_iterator rightIt = sOriginal.end();
+  
+  while(leftIt != sOriginal.end() && (*leftIt) == ' ')
+    leftIt++;
+
+  rightIt--;
+  while(rightIt != sOriginal.begin() && (*rightIt) == ' ')
+    rightIt--;
+  
+  string *result = new string(sOriginal.substr(leftIt - sOriginal.begin(), rightIt - leftIt + 1));
+  
+  return *result;
+}
+
+PacketFilterExpression::PacketFilterExpression(const string& sExpression)
+  :m_operator(EO_NONE),
+   m_headerId(e_NoHeader),
+   m_fieldId(e_NoField),
+   m_value(""),
+   m_leftPart("") {
+  
+  int pos;
+  string sHeaderName, sFieldName;
+  
+  if((pos = sExpression.find("==")) != string::npos) 
+    m_operator = EO_EQUAL;
+  else if((pos = sExpression.find("!=")) != string::npos) 
+    m_operator = EO_DIFFERENT;
+
+  if(m_operator != EO_NONE) {
+    m_value = trim(sExpression.substr(pos + 2, string::npos));
+    m_leftPart = sExpression.substr(0, pos);
+    if((pos = m_leftPart.find(".")) != string::npos) {
+      sHeaderName = m_leftPart.substr(0, pos);
+      if(trim(sHeaderName) == "ip") {
+	m_headerId = e_Ip;
+      }
+      else if(trim(sHeaderName) == "tcp") {
+	m_headerId = e_Tcp;
+      }
+      else if(trim(sHeaderName) == "udp") {
+	m_headerId = e_Udp;
+      }
+      else {
+	Logger::Instance().LogError("Bad filter: unsupported protocol for IP header");
+      }
+    
+      sFieldName = m_leftPart.substr(pos + 1, string::npos);
+      if(trim(sFieldName) == "addr") {
+	m_fieldId = e_Addr;
+      }
+      else if(trim(sFieldName) == "src") {
+	m_fieldId = e_Src;
+      }
+      else if(trim(sFieldName) == "dst") {
+	m_fieldId = e_Dst;
+      }
+      else if(trim(sFieldName) == "port") {
+	m_fieldId = e_Port;
+      }
+      else if(trim(sFieldName) == "srcport") {
+	m_fieldId = e_SrcPort;
+      }
+      else if(trim(sFieldName) == "dstport") {
+	m_fieldId = e_DstPort;
+      }
+      else if(trim(sFieldName) == "proto") {
+	m_fieldId = e_Proto;
+      }
+      else {
+	Logger::Instance().LogError("Bad filter: unsupported field name");
+      }
+    }
+    else {
+      	Logger::Instance().LogError("Bad filter: left part should be header.field");
+    }
+  }
+  else {
+    m_value = trim(sExpression);
+  }
+}
+
+PacketFilterExpression::~PacketFilterExpression() {
+
+}
+
+const string& PacketFilterExpression::GetExpression() const {
+  string *s = new string("");
+  
+  if(m_operator != EO_NONE)
+    *s += m_leftPart;
+  
+  if(m_operator == EO_EQUAL) 
+    *s += "==";
+  
+  if(m_operator == EO_DIFFERENT) 
+    *s += "!=";
+  
+  *s += m_value;
+  
+  return *s;
+}
+
+bool PacketFilterExpression::Match(const PacketDissector& packet) const {
+  
+  return packet.Match(m_headerId, m_fieldId, m_value);
+  
+}
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketFilterExpression.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketFilterExpression.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/PacketFilter/PacketFilterExpression.h	(revision 22)
@@ -0,0 +1,31 @@
+#ifndef STF370_PacketFilterExpression_h
+#define STF370_PacketFilterExpression_h
+
+#include <string>
+#include "PacketDissector.h"
+ 
+using namespace std;
+
+enum ExpressionOperator {
+  EO_NONE,
+  EO_EQUAL,
+  EO_DIFFERENT
+};
+	
+class PacketFilterExpression {
+
+ public:
+  PacketFilterExpression(const string& sExpression = "");
+  virtual ~PacketFilterExpression();
+  const string& GetExpression() const;
+  bool Match(const PacketDissector& packet) const;
+
+ private:
+  HeaderId m_headerId;
+  FieldId m_fieldId;
+  string m_leftPart;
+  string m_value;
+  ExpressionOperator m_operator;
+};
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/AdapterConfigPort.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/AdapterConfigPort.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/AdapterConfigPort.cpp	(revision 22)
@@ -0,0 +1,479 @@
+#include "AdapterConfigPort.h"
+
+#include <iostream>
+#include <boost/shared_ptr.hpp>
+#include <boost/algorithm/string.hpp>
+#include "Logger/Logger.h"
+#include "Helper/Decoders.h"
+#include "Helper/GeneralConfigurationParams.h"
+#include "LowerTestAdapter.h"
+#include "UpperTestAdapter.h"
+#include "Ports/MessagesIdentifiers.h"
+#include "Dispatcher/IpFilter.h"
+#include "Dispatcher/PortFilter.h"
+#include "Dispatcher/IpFilter.h"
+#include "Dispatcher/PortFilter.h"
+
+using namespace t3devlib;
+using namespace boost;
+using namespace std;
+
+AdapterConfigPort::AdapterConfigPort (PortId& portId) 
+:Port(portId) {
+  LowerTestAdapter::Instance().RegisterAdapterConfigPort(this);  
+  Logger::Instance().LogInfo("AdapterConfigPort::AdapterConfigPort");
+}
+
+AdapterConfigPort::~AdapterConfigPort() {
+  Logger::Instance().LogInfo("AdapterConfigPort::~AdapterConfigPort");
+  m_connectedPorts.clear();
+}
+
+bool AdapterConfigPort::Map (const PortId& connectedPortId) {
+  
+    if(string(connectedPortId.GetComponentId().GetType().GetObjectName()) == MTC) {
+    // MTC
+    Logger::Instance().LogInfo("MTC.AdapterConfigPort mapped");
+    m_mtcPortId = &connectedPortId;
+  }
+  else {
+    m_connectedPorts.push_back(&connectedPortId);
+  }
+  
+  return true; 
+} 
+ 
+bool AdapterConfigPort::Unmap (const PortId& connectedPortId) { 
+
+  //TODO: unregister filter; remove from m_connectedPorts
+  return true; 
+}
+
+bool AdapterConfigPort::Send (const ComponentId& from, const Bitstring& bsMsg) {
+
+  stringstream ss;
+  ss << "AdapterConfigPort::Send: " << from;
+  Logger::Instance().LogInfo(ss.str());
+  
+  unsigned char processDone = 0x00; // Processing result code - Set to 0 on success, set to 2 otherwise.
+  const char *response = 0;
+  
+  if(string(from.GetType().GetObjectName()) == MTC) {
+    // This is the Global adapter port.
+    ss.str("");
+    ss << "##### bsMsg(HEXA value): " << bsMsg;
+    //Logger::Instance().LogDebug(ss.str());
+    // Retrieve and convert parameters.
+    Logger::Instance().LogInfo("AdapterConfigPort::Send: Gathering and converting parameters");
+    // Check the message type.
+    string frame = bsMsg.GetValueHexa();
+    int offset = 0;
+    int messageType = static_cast<int>(Decoders::Instance().DecodeByte(frame, &offset));
+    ss.str("");
+    ss << "AdapterConfigPort::Send: messageType=" << messageType << " - " << offset;
+    Logger::Instance().LogDebug(ss.str());
+    if (messageType == MessagesIdentifiers::GetIdx(MessagesIdentifiers::GeneralConfigurationReq)) // GlobalConfigureReq
+    {
+      processDone = ProcessGeneralConfigurationReq(frame, offset);
+      response = MessagesIdentifiers::GeneralConfigurationRsp;
+    }
+    else if (messageType == MessagesIdentifiers::GetIdx(MessagesIdentifiers::StartTrafficCaptureReq)) // StartCaptureReq
+    {
+      processDone = ProcessStartCaptureReq(frame, offset);
+      response = MessagesIdentifiers::StartTrafficCaptureRsp;
+    }
+    else if (messageType == MessagesIdentifiers::GetIdx(MessagesIdentifiers::StopTrafficCaptureReq)) // StopCaptureReq
+    {
+      processDone = ProcessStopCaptureReq(frame, offset);
+      response = MessagesIdentifiers::StopTrafficCaptureRsp;
+    }
+    else
+    {
+      // Unknown message.
+      cerr << "AdapterConfigPort::Send: Unknown message" << endl;
+      processDone = 0x01; // e_error
+    }
+    
+    if (processDone != 0x00) // e_success
+    {
+      Logger::Instance().LogError("AdapterConfigPort::Send: processDone flags set");
+      ProcessResponse(response, processDone);
+    }
+  }
+  else // not MTC
+  {
+    // TODO: Support of Interface configuration port
+    Logger::Instance().LogDebug("Processing component-specific configuration request");
+    string frame = bsMsg.GetValueHexa();
+    int offset = 0;
+    int messageType = static_cast<int>(Decoders::Instance().DecodeByte(frame, &offset));
+  if (messageType == MessagesIdentifiers::GetIdx(MessagesIdentifiers::SetFilterReq))
+    {
+      processDone = ProcessSetFilterReq(frame, offset, from);
+    ProcessResponse(MessagesIdentifiers::SetFilterRsp, processDone, &GetConnectedPort(&from));
+    }
+    else
+    {
+      // Unknown message.
+      //Logger::Instance().LogError("AdapterConfigPort::Send: Unknown message");
+      processDone = 0x01; // e_unsuccess
+    }
+  }
+  
+  return true;
+}
+
+const t3devlib::PortId& AdapterConfigPort::GetConnectedPort(const ComponentId *pComponentId) {
+  std::list<const PortId *>::iterator it;
+  for(it = m_connectedPorts.begin(); it != m_connectedPorts.end(); it++) {
+    if(&((*it)->GetComponentId()) == pComponentId) {
+      return **it;
+    }
+  }
+}
+
+const t3devlib::ComponentId* AdapterConfigPort::Filter() {
+  // FOR DEBUG ONLY: round robin
+  const PortId * pPortId = m_connectedPorts.front();
+  m_connectedPorts.pop_front();
+  m_connectedPorts.push_back(pPortId);
+  return &(pPortId->GetComponentId());
+}
+
+unsigned char AdapterConfigPort::ProcessGeneralConfigurationReq(const string & frame, int offset) {
+  
+  unsigned char processDone = 0x00;
+  
+  stringstream ss;
+  int length = -1;
+  boost::shared_ptr<GeneralConfigurationParams> configParams(new GeneralConfigurationParams);
+  try
+  {
+    // CaptureTraffic IP address.
+    string captureProcessIpAddress = Decoders::Instance().DecodeLengthPlusString(frame, &offset, &length);
+    /*ss.str("");
+    ss << "AdapterConfigPort::Send: captureProcessIpAddress=" << captureProcessIpAddress << " - " << offset  << " - " << length;
+    Logger::Instance().LogDebug(ss.str());*/
+    
+    // CaptureTraffic port number.
+    int captureProcessPort = Decoders::Instance().DecodeInteger(frame, &offset);
+    /*ss.str("");
+    ss << "AdapterConfigPort::Send: captureProcessPort=" << captureProcessPort << " - " << offset;
+    Logger::Instance().LogDebug(ss.str());*/
+    cout << "AdapterConfigPort::Send: captureProcessPort=" << captureProcessPort << " - " << offset << endl;
+    
+    // Capture mode.
+    // 1. Retrieve the union record to use.
+    unsigned char mode = Decoders::Instance().DecodeByte(frame, &offset);
+    /*ss.str("");
+    ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: mode=" << static_cast<int>(mode) << " - " << offset;
+    Logger::Instance().LogDebug(ss.str());*/
+    cout  << "AdapterConfigPort::ProcessGeneralConfigurationReq: mode=" << static_cast<int>(mode) << " - " << offset << endl;
+    boost::shared_ptr<GeneralConfigurationParams> configParams(new GeneralConfigurationParams);
+    if (mode == 0x00) // LiveCapture
+    {
+      // List of Ethernet interfaces.
+      int ifacesNum = Decoders::Instance().DecodeParamsNum(frame, &offset);
+      /*ss.str("");
+      ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: ifacesNum=" << ifacesNum << " - " << offset;
+      //Logger::Instance().LogDebug(ss.str());*/
+      clog << "AdapterConfigPort::ProcessGeneralConfigurationReq: ifacesNum=" << ifacesNum << " - " << offset << endl;
+      vector<string> ifacesList;
+      for (int i = 0; i < ifacesNum; i++)
+      {
+        string iface = Decoders::Instance().DecodeLengthPlusString(frame, &offset, &length);
+        /*ss.str("");
+        ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: iface=" << iface << " - " << offset << " - " << length;
+        //Logger::Instance().LogDebug(ss.str());*/
+        clog << "AdapterConfigPort::ProcessGeneralConfigurationReq: iface= " << iface << " - " << offset << " - " << length << endl;
+        ifacesList.push_back(iface);
+      }
+      
+      // Record mode.
+      unsigned char record = Decoders::Instance().DecodeEnumerated(frame, &offset);
+      /*ss.str("");
+      ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: record=" << static_cast<int>(record) << " - " << offset;
+      //Logger::Instance().LogDebug(ss.str());*/
+      
+      // Get number of IP interfaces for EUTs
+      int parmsNum = Decoders::Instance().DecodeParamsNum(frame, &offset);
+      /*ss.str("");
+      ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: EUTs parms number=" << parmsNum << " - " << offset << " - " << length;
+      //Logger::Instance().LogDebug(ss.str());*/
+      vector<shared_ptr<EutIPInterface> > eutIpInterfaceList;
+      for (int i = 0; i < parmsNum; i++)
+      {
+        EutIPInterface *eut = new EutIPInterface(
+          Decoders::Instance().DecodeLengthPlusString(frame, &offset, &length), // EUT name
+          Decoders::Instance().DecodeLengthPlusString(frame, &offset, &length), // EUT IP address
+          Decoders::Instance().DecodeInteger(frame, &offset) ); // EUT port number
+        /*ss.str("");
+        ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: EUT=" << eut->Eut() << " - " << offset << " - " << length;
+        //Logger::Instance().LogDebug(ss.str());*/
+        clog << "AdapterConfigPort::ProcessGeneralConfigurationReq: EUT=" << eut->Eut() << " - " << offset << " - " << length << endl;
+        /*ss.str("");
+        ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: Add EUT item: " << eut->Eut() << " - " << eut->EutAddress() << " - " << eut->EutPort();
+        //Logger::Instance().LogDebug(ss.str());*/
+        eutIpInterfaceList.push_back(shared_ptr<EutIPInterface>(eut));
+      }
+      
+      // Create the GeneralConfigurationParams instance.
+      configParams.get()->Initialize(
+          captureProcessIpAddress, 
+          captureProcessPort, 
+          ifacesList,
+          mode,
+          record,
+          eutIpInterfaceList);
+    }
+    else // OfflineCapture
+    {
+      // Time stamp offset.
+      int seconds = Decoders::Instance().DecodeUInt32(frame, &offset);
+      int microseconds = Decoders::Instance().DecodeUInt32(frame, &offset);
+      /*ss.str("");
+      ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: pcapTimeStamp=" << seconds << " - " << microseconds << " - "<< offset;
+      Logger::Instance().LogDebug(ss.str());*/
+      clog << "AdapterConfigPort::ProcessGeneralConfigurationReq: pcapTimeStamp=" << seconds << " - " << microseconds << " - "<< offset << endl;
+      
+      // Sessions path if mode is offline
+      string sessionsPath = Decoders::Instance().DecodeLengthPlusString(frame, &offset, &length);
+      /*ss.str("");
+      ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: sessionsPath=" << sessionsPath << " - " << offset << " - " << length;
+      Logger::Instance().LogDebug(ss.str());*/
+      clog  << "AdapterConfigPort::ProcessGeneralConfigurationReq: sessionsPath=" << sessionsPath << " - " << offset << " - " << length << endl;
+      string fileToPlay = "";
+      if (sessionsPath.length() != 0)
+      {
+        // Build the file name
+        ss.str("");
+        ss << sessionsPath << "/" << GetTestcaseId().GetObjectName() << ".pcap";
+        fileToPlay = string(ss.str());
+        replace_first(fileToPlay, "TC_", "TD_");
+      }
+      /*ss.str("");
+      ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: fileToPlay=" << fileToPlay << " - " << offset << " - " << length;
+      Logger::Instance().LogDebug(ss.str());*/
+      clog << "AdapterConfigPort::ProcessGeneralConfigurationReq: fileToPlay=" << fileToPlay << " - " << offset << " - " << length << endl;
+      
+      // List of files to merge
+      int parmsNum = Decoders::Instance().DecodeParamsNum(frame, &offset);
+      /*ss.str("");
+      ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: parmsNum=" << parmsNum;
+      //Logger::Instance().LogDebug(ss.str());*/
+      clog << "AdapterConfigPort::ProcessGeneralConfigurationReq: parmsNum=" << parmsNum << " - " << offset << " - " << length << endl;
+      vector<string> mergeFileList;
+      for (int i = 0; i < parmsNum; i++)
+      {
+        string str = Decoders::Instance().DecodeLengthPlusString(frame, &offset, &length);
+        /*ss.str("");
+        ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: str=" << str << " - " << offset << " - " << length;
+        //Logger::Instance().LogDebug(ss.str());*/
+        clog << "AdapterConfigPort::ProcessGeneralConfigurationReq: str=" << str << " - " << offset << " - " << length << endl;
+        mergeFileList.push_back(str);
+      }
+      
+      // Pcap file to play if mode is offline
+      string mergeFilePath = Decoders::Instance().DecodeLengthPlusString(frame, &offset, &length);
+      /*ss.str("");
+      ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: mergeFilePath=" << mergeFilePath;
+      //Logger::Instance().LogDebug(ss.str());*/
+      clog << "AdapterConfigPort::ProcessGeneralConfigurationReq: mergeFilePath=" << mergeFilePath << " - " << offset << " - " << length << endl;
+      
+      // PCAP merge tool
+      string pcapMergeTool = Decoders::Instance().DecodeLengthPlusString(frame, &offset, &length);
+      /*ss.str("");
+      ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: pcapMergeTool=" << pcapMergeTool;
+      //Logger::Instance().LogDebug(ss.str());*/
+      clog << "AdapterConfigPort::ProcessGeneralConfigurationReq: pcapMergeTool=" << pcapMergeTool << " - " << offset << " - " << length << endl;
+
+      vector<shared_ptr<EutIPInterface> > eutIpInterfaceList;
+      
+      // Create the GeneralConfigurationParams instance.
+      configParams.get()->Initialize(
+          captureProcessIpAddress, 
+          captureProcessPort, 
+          mode,
+          seconds,
+          microseconds,
+          pcapMergeTool,
+          fileToPlay,
+          mergeFileList,
+          mergeFilePath);
+    }
+    
+    // All parameters are gathered, initialize the UpperTestAdapter
+    /*ss.str("");
+    ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: Call UpperTestAdapter::Initialize" ;
+    //Logger::Instance().LogDebug(ss.str());*/
+    clog << "AdapterConfigPort::ProcessGeneralConfigurationReq: Call UpperTestAdapter::Initialize" << endl;
+    if (!Singleton<UpperTestAdapter::UpperTestAdapter>::Instance().Initialize(configParams))
+    {
+      cerr << "AdapterConfigPort::ProcessGeneralConfigurationReq: UpperTestAdapter initialization failed" << endl;
+      processDone = 0x01; // e_error
+    }
+    // And start TrafficCapture initialization (MergePcapFilesRequest & OpenDeviceRequest message exhanged between Adapter and TrafficCapture).
+    /*ss.str("");
+    ss << "AdapterConfigPort::ProcessGeneralConfigurationReq: Call ConnectToCaptureServer";
+    //Logger::Instance().LogDebug(ss.str());*/
+    clog << "AdapterConfigPort::ProcessGeneralConfigurationReq: Call ConnectToCaptureServer" << endl;
+    LowerTestAdapter::Instance().ConnectToCaptureServer(configParams);
+    // Free pointer.
+    configParams.reset();
+  }
+  catch (std::exception &e)
+    {
+      cerr << "AdapterConfigPort::ProcessGeneralConfigurationReq: " << e.what() << endl;
+      processDone = 0x01; // e_error
+    }
+  
+  return processDone;
+}
+
+unsigned char AdapterConfigPort::ProcessStartCaptureReq(const string & frame, int offset) {
+  
+  unsigned char processDone = 0x00; // e_success
+  
+  int length = -1;
+  
+  try
+  {
+    clog << "AdapterConfigPort::ProcessStartCaptureReq: Call StartCapture" << endl;
+    LowerTestAdapter::Instance().StartCapture();
+  }
+  catch (std::exception &e)
+    {
+      cerr << "AdapterConfigPort::ProcessStartCaptureReq: " << e.what() << endl;
+      processDone = 0x01; // e_error
+    }
+  
+  return processDone;
+}
+
+unsigned char AdapterConfigPort::ProcessStopCaptureReq(const string & frame, int offset) {
+  
+  unsigned char processDone = 0x00;
+  
+  int length = -1;
+  
+  try
+  {
+    clog << "AdapterConfigPort::ProcessStopCaptureReq: Call StopCaptureReq" << endl;
+    LowerTestAdapter::Instance().StopCapture();
+  }
+  catch (std::exception &e)
+    {
+      cerr << "AdapterConfigPort::ProcessStopCaptureReq: " << e.what() << endl;
+      processDone = 0x02; // e_error
+    }
+  
+  return processDone;
+}
+
+unsigned char AdapterConfigPort::ProcessSetFilterReq(const string & frame, int offset, const ComponentId& from) {
+  
+  unsigned char processDone = 0x00;
+  int length = -1;
+
+  try
+  {
+    FilterSet fs;
+    //Logger::Instance().LogDebug("AdapterConfigPort::SetFilterReq: Call RegisterFilter");
+  // Discard ProtocolFilter (not used at the moment for filtering)
+  Decoders::Instance().DecodeByte(frame, &offset);
+  // InterfaceInfoList: get number of elements
+    int nIfaceCount = Decoders::Instance().DecodeByte(frame, &offset);
+  for (int i = 0; processDone == 0x00 && i < nIfaceCount; ++i)
+  {
+    // InterfaceInfo; union item id
+    unsigned char mode = Decoders::Instance().DecodeByte(frame, &offset);
+    if (mode == 0x00) // IpInterfaceInfoList
+    {
+      int nItemCount = Decoders::Instance().DecodeByte(frame, &offset);
+      for (int j = 0; processDone == 0x00 && j < nItemCount; j++)
+      {
+        // domainName (not used)
+        Decoders::Instance().DecodeLengthPlusString(frame, &offset, &length);
+        std::string sAddr = Decoders::Instance().DecodeLengthPlusString(frame, &offset, &length);
+        IpFilter ipFilter;
+        if (!ipFilter.SetAddress(sAddr))
+        {
+          //Logger::Instance().LogError("Unknown interface info format");
+          processDone = 0x01;
+          break;
+        }
+        int nPortCount = Decoders::Instance().DecodeParamsNum(frame, &offset);
+        for (int k = 0; processDone == 0x00 && k < nPortCount; k++)
+        {
+          int nPort = Decoders::Instance().DecodeInteger(frame, &offset);
+          PortFilter portFilter;
+          portFilter.SetPortNumber(static_cast<unsigned short>(nPort));
+          ipFilter.AddNextLayerFilter(portFilter);
+        }
+        fs.AddFilter(ipFilter);
+      }
+    }
+    else
+    {
+      //Logger::Instance().LogWarning("Unknown interface info format");
+      processDone = 0x01;
+    }
+  }
+    LowerTestAdapter::Instance().RegisterFilter(&from, fs);
+
+  }
+  catch (std::exception &e)
+    {
+      cerr << "AdapterConfigPort::SetFilterReq: " << e.what() << endl;
+      processDone = 0x01; // e_error
+    }
+  
+  return processDone;
+}
+
+bool AdapterConfigPort::ProcessResponse (const std::string& message, unsigned char result, const PortId *to)
+{
+  stringstream ss;
+  ss << "AdapterConfigPort::ProcessResponse: " << message << " - " << static_cast<int>(result);
+  //Logger::Instance().LogInfo(ss.str());
+
+  // Prepare the response.
+  Bitstring buffer;
+  // Get message index
+  unsigned char idx = MessagesIdentifiers::GetIdx(message);
+  if (idx == 0xff) {
+    std::string errmsg ("unsupported response message value '");
+    errmsg += message;
+    errmsg += '\n';
+    //Logger::Instance().LogError(errmsg);
+    throw errmsg;
+  }
+  // Set message index
+  Unsigned messageType(8); // 1 octet length
+  ss.str("");
+  ss << "AdapterConfigPort::ProcessResponse: messageType=" << static_cast<int>(idx);
+  //Logger::Instance().LogDebug(ss.str());
+  messageType.SetValue(idx);
+  buffer.Append(messageType);
+  // Set status
+  Unsigned responseBuffer(8, result); // 1 octet length
+  buffer.Append(responseBuffer);
+  ss.str("");
+  ss << "AdapterConfigPort::ProcessResponse: responseBuffer=" << responseBuffer;
+  //Logger::Instance().LogDebug(ss.str());
+  // Set reason
+  Unsigned reasonLength(2 * 8, 0); // omitted - 2 octets length
+  buffer.Append(reasonLength);
+  // Send the response.
+  ss.str("");
+  ss << "AdapterConfigPort::ProcessResponse: buffer=" << buffer;
+  //Logger::Instance().LogDebug(ss.str());
+
+  if(!to) {
+    to = m_mtcPortId;
+  }
+
+  EnqueueMsg (*to, buffer);
+
+  return true;
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/AdapterConfigPort.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/AdapterConfigPort.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/AdapterConfigPort.h	(revision 22)
@@ -0,0 +1,33 @@
+#ifndef AdapterConfigPort_h
+#define AdapterConfigPort_h
+
+#include <t3devlib/t3devlib.h>
+
+#define MTC "ImsTestCoordinator"
+
+class AdapterConfigPort : public t3devlib::Port
+{
+ public:
+  AdapterConfigPort (t3devlib::PortId& PortId);
+  ~AdapterConfigPort();
+  const t3devlib::ComponentId* Filter();
+  const t3devlib::PortId& GetConnectedPort(const t3devlib::ComponentId *pComponentId);
+  bool ProcessResponse (const std::string& message, unsigned char result, const t3devlib::PortId *to=0);
+  
+ protected:
+  bool Map (const t3devlib::PortId& connectedPortId);
+  bool Unmap (const t3devlib::PortId& connectedPortId);
+  bool Send (const t3devlib::ComponentId& from, const t3devlib::Bitstring& bsMsg);
+  
+ private:
+  unsigned char ProcessGeneralConfigurationReq(const std::string & frame, int offset);
+  unsigned char ProcessStartCaptureReq(const std::string & frame, int offset);
+  unsigned char ProcessStopCaptureReq(const std::string & frame, int offset);
+  unsigned char ProcessSetFilterReq(const std::string & frame, int offset, const t3devlib::ComponentId& from);
+  
+ private:
+  std::list<const t3devlib::PortId *> m_connectedPorts;
+  const t3devlib::PortId *m_mtcPortId;
+};
+
+#endif // AdapterConfigPort_h
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/DataPort.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/DataPort.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/DataPort.cpp	(revision 22)
@@ -0,0 +1,45 @@
+#include "DataPort.h"
+
+#include <iostream>
+
+#include "Logger/Logger.h"
+#include "LowerTestAdapter.h"
+
+using namespace t3devlib;
+using namespace std;
+
+DataPort::DataPort (PortId& portId) 
+:Port(portId) {
+  Logger::Instance().LogInfo("DataPort::DataPort");
+  LowerTestAdapter::Instance().RegisterDataPort(this);  
+}
+
+DataPort::~DataPort() {
+    Logger::Instance().LogInfo("~DataPort::DataPort");
+}
+
+bool DataPort::Map (const PortId& connectedPortId) {
+
+  m_connectedPorts.push_back(&connectedPortId);
+  return true; 
+} 
+ 
+bool DataPort::Unmap (const PortId& connectedPortId) { 
+
+  //TODO: remove from m_connectedPorts
+  return true; 
+}
+
+bool DataPort::Send (const ComponentId& from,const Bitstring& bsMsg) {
+
+  return true;
+}
+
+const t3devlib::PortId& DataPort::GetConnectedPort(const ComponentId *pComponentId) {
+  std::list<const PortId *>::iterator it;
+  for(it = m_connectedPorts.begin(); it != m_connectedPorts.end(); it++) {
+    if(&((*it)->GetComponentId()) == pComponentId) {
+      return **it;
+    }
+  }
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/DataPort.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/DataPort.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/DataPort.h	(revision 22)
@@ -0,0 +1,24 @@
+#ifndef DataPort_h
+#define DataPort_h
+
+#include <t3devlib/t3devlib.h>
+
+class DataPort : public t3devlib::Port
+{
+ public:
+  DataPort(t3devlib::PortId& portId);
+  const t3devlib::PortId& GetConnectedPort() const;
+  const t3devlib::PortId& GetConnectedPort(const t3devlib::ComponentId *pComponentId);
+  ~DataPort();
+  
+ protected:
+  bool Map(const t3devlib::PortId& connectedPortId);
+  bool Unmap(const t3devlib::PortId& connectedPortId);
+  bool Send(const t3devlib::ComponentId& from, const t3devlib::Bitstring& bsMsg);
+
+ private:
+  std::list<const t3devlib::PortId *> m_connectedPorts;
+};
+
+
+#endif //DataPort_h
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/EquipmentAccessPort.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/EquipmentAccessPort.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/EquipmentAccessPort.cpp	(revision 22)
@@ -0,0 +1,125 @@
+#include "EquipmentAccessPort.h"
+#include <iostream>
+
+#include "Helper/Singleton.h"
+#include "Logger/Logger.h"
+#include "Helper/Decoders.h"
+#include "UpperTestAdapter.h"
+#include "Ports/MessagesIdentifiers.h"
+
+using namespace std;
+using namespace t3devlib;
+using namespace UpperTestAdapter;
+
+EquipmentAccessPort::EquipmentAccessPort (PortId& portId) : Port (portId)
+{
+  stringstream ss;
+  ss << "EquipmentAccessPort ctor()" << portId;
+  Logger::Instance().LogDebug(ss.str());
+}
+
+EquipmentAccessPort::~EquipmentAccessPort()
+{
+  Logger::Instance().LogDebug("EquipmentAccessPort dtor() not implemented");
+}
+
+bool EquipmentAccessPort::Map (const PortId& connected_port_id)
+{
+  stringstream ss;
+  ss << "EquipmentAccessPort::Map(): " << connected_port_id << " - " << connected_port_id.GetComponentId();
+  Logger::Instance().LogDebug(ss.str());
+
+  Singleton<UpperTestAdapter::UpperTestAdapter>::Instance().RegisterEquipmentAccessPort((PortId *)&connected_port_id, &connected_port_id.GetComponentId());
+  
+  return true; 
+} 
+ 
+bool EquipmentAccessPort::Unmap (const PortId& connected_port_id)
+{ 
+  //TODO: unregister filter; remove from m_connectedPorts
+  Logger::Instance().LogError("EquipmentAccessPort::Unmap() not implemented");
+  return true; 
+}
+
+bool EquipmentAccessPort::Send (const ComponentId& from,const Bitstring& msg)
+{
+  stringstream ss;
+  ss << "EquipmentAccessPort Send: " << from;
+  Logger::Instance().LogInfo(ss.str());
+
+  unsigned char processDone = 0x00; // Processing result code - Set to 0 on success, set to 2 otherwise.
+
+  // Retrieve and convert parameters.
+  ss.str("");
+  ss << "##### bsMsg(HEXA value): " << msg.GetValueHexa();
+  Logger::Instance().LogInfo(ss.str());
+  int length;
+  string frame = msg.GetValueHexa();
+  int offset = 0;
+  
+  int messageType = static_cast<int>(Decoders::Instance().DecodeByte(frame, &offset));
+  ss.str("");
+  ss << "EquipmentAccessPort::Send: messageType=" << messageType << " - " << offset;
+  Logger::Instance().LogDebug(ss.str());
+  // Trigger command.
+  string trigger = Decoders::Instance().DecodeLengthPlusString(frame, &offset, &length);
+  ss.str("");
+  ss << "EquipmentAccessPort::Send: trigger=" << trigger << " - " << offset  << " - " << length;
+  Logger::Instance().LogDebug(ss.str());
+  
+  // Number of items in the parameters list.
+  short paramsNum = Decoders::Instance().DecodeParamsNum(frame, &offset);
+  ss.str("");
+  ss << "EquipmentAccessPort::Send: paramsNum=" << paramsNum << " - " << offset  << " - " << length;
+  Logger::Instance().LogDebug(ss.str());
+  
+  // Extract parameters.
+  std::vector<string> parameterList;
+  for (short counter = 0; counter < paramsNum; counter++)
+  {
+    parameterList.push_back(Decoders::Instance().DecodeLengthPlusString(frame, &offset, &length));
+    ss.str("");
+    ss << "EquipmentAccessPort::Send: parameter added: " << parameterList[parameterList.size() - 1] << " - " << offset << " - " << length;
+    Logger::Instance().LogDebug(ss.str());
+  }
+  
+  int result = Singleton<UpperTestAdapter::UpperTestAdapter>::Instance().ProcessTriggerCommand(from, trigger, parameterList);
+  
+  // Prepare the response.
+  Bitstring buffer;
+  // Get message index
+  unsigned char idx = MessagesIdentifiers::GetIdx(MessagesIdentifiers::EquipmentOperationRsp);
+  if (idx == 0xff) {
+    std::string errmsg ("unsupported response message value EquipmentOperationRsp'\n");
+    throw errmsg;
+    Logger::Instance().LogError(errmsg);
+  }
+  // Set message index
+  Unsigned fieldLength(8); // 1 octet length
+  fieldLength.SetValue(idx);
+  buffer.Append(fieldLength);
+  //Set status
+  Unsigned responseBuffer(8, result);
+  buffer.Append(responseBuffer);
+  // Set reason
+  Unsigned reasonLength(2 * 8, 0); // omitted
+  buffer.Append(reasonLength);
+  // Send the response.
+  ss.str("");
+  ss << "EquipmentAccessPort::Send: buffer=" << buffer;
+  Logger::Instance().LogDebug(ss.str());
+  PortId *port = Singleton<UpperTestAdapter::UpperTestAdapter>::Instance().GetEquipmentAccessPortIdFromComponent(from);
+  ss.str("");
+  ss << "EquipmentAccessPort::Send: Send response to " << port << " - " << *port;
+  Logger::Instance().LogInfo(ss.str());
+  clog << "EquipmentAccessPort::Send: Call EnqueueMsg" << std::endl;
+  EnqueueMsg (*port, buffer);
+  
+  return true;
+}
+
+void EquipmentAccessPort::ProcessTriggerCommandsComplete(const ComponentId &to)
+{
+  //std::cerr << "EquipmentAccessPort::ProcessTriggerCommandsComplete() not implemented" << std::endl;
+}
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/EquipmentAccessPort.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/EquipmentAccessPort.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/EquipmentAccessPort.h	(revision 22)
@@ -0,0 +1,48 @@
+/*! file EquipmentAccessPort.h
+ \brief This file provides support of TTCN-3 EquipmentAccessPort.
+ */
+
+#ifndef EquipmentAccessPort_h
+#define EquipmentAccessPort_h
+
+#include <t3devlib/t3devlib.h>
+
+/*! Class EquipmentAccessPort
+ * \brief This class implements the functionalities TTCN-3 EquipmentAccessPort management.
+ */
+class EquipmentAccessPort : public t3devlib::Port
+{
+public:
+  //! Specialized ctor.
+  /*! Specialized ctor.
+   * @param id Port identifier.
+   */
+  EquipmentAccessPort (t3devlib::PortId& id);
+  //! Default dtor.
+  /*! Default dtor.
+   */
+  ~EquipmentAccessPort();
+
+public:
+  //! ProcessTriggerCommandsComplete.
+  /*! Callback method called when UpperTester::InvokeProcessTriggerCommand() method is achieved.
+   * @param to: reference to the component.
+   */
+	void ProcessTriggerCommandsComplete(const t3devlib::ComponentId &to);
+	
+protected:
+  //! Map the port.
+  bool Map (const t3devlib::PortId& port_id);
+  //! Unmap the port.
+  bool Unmap (const t3devlib::PortId& port_id);
+  //! Send
+  /*! Send a message to the port
+   * @param from: identify the component
+   * @param msg: encoded TTCN-3 message
+   * @return true on success, false otherwise
+   */
+  bool Send (const t3devlib::ComponentId& from, const t3devlib::Bitstring& msg);
+
+};
+
+#endif // EquipmentAccessPort_h
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/MessagesIdentifiers.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/MessagesIdentifiers.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/MessagesIdentifiers.cpp	(revision 22)
@@ -0,0 +1,28 @@
+#include "MessagesIdentifiers.h"
+
+const char* MessagesIdentifiers::GeneralConfigurationReq = "GeneralConfigurationReq";
+const char* MessagesIdentifiers::GeneralConfigurationRsp = "GeneralConfigurationRsp";
+const char* MessagesIdentifiers::SetFilterReq = "SetFilterReq";
+const char* MessagesIdentifiers::SetFilterRsp = "SetFilterRsp";
+const char* MessagesIdentifiers::StartTrafficCaptureReq = "StartTrafficCaptureReq";
+const char* MessagesIdentifiers::StartTrafficCaptureRsp = "StartTrafficCaptureRsp";
+const char* MessagesIdentifiers::StopTrafficCaptureReq = "StopTrafficCaptureReq";
+const char* MessagesIdentifiers::StopTrafficCaptureRsp = "StopTrafficCaptureRsp";
+const char* MessagesIdentifiers::EquipmentOperationReq = "EquipmentOperationReq";
+const char* MessagesIdentifiers::EquipmentOperationRsp = "EquipmentOperationRsp";
+const int MessagesIdentifiers::Size = 10;
+  
+const char* MessagesIdentifiers::Messages[] = { 
+  "GeneralConfigurationReq",  //0
+  "GeneralConfigurationRsp",  //1
+  "SetFilterReq",             //2
+  "SetFilterRsp",             //3
+  "StartTrafficCaptureReq",   //4
+  "StartTrafficCaptureRsp",   //5
+  "StopTrafficCaptureReq",    //6
+  "StopTrafficCaptureRsp",    //7
+  "EquipmentOperationReq",    //8
+  "EquipmentOperationRsp",    //9
+  ""
+};
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/MessagesIdentifiers.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/MessagesIdentifiers.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/Ports/MessagesIdentifiers.h	(revision 22)
@@ -0,0 +1,55 @@
+#ifndef MessagesIdentifiers_h
+#define MessagesIdentifiers_h
+
+#include <t3devlib/t3devlib.h>
+
+class MessagesIdentifiers
+{
+ public:
+    static const char* GeneralConfigurationReq;
+    static const char* GeneralConfigurationRsp;
+    static const char* SetFilterReq;
+    static const char* SetFilterRsp;
+    static const char* StartTrafficCaptureReq;
+    static const char* StartTrafficCaptureRsp;
+    static const char* StopTrafficCaptureReq;
+    static const char* StopTrafficCaptureRsp;
+    static const char* EquipmentOperationReq;
+    static const char* EquipmentOperationRsp;
+    static const int Size;
+    static const char* Messages[];
+    
+    static unsigned char GetIdx(const std::string& message)
+    {
+      // Sanity check.
+      if (message.length() == 0)
+      {
+        return 0xff;
+      }
+      
+      // Get index
+      const char ** ppEnum = MessagesIdentifiers::Messages;
+      int i = 0;
+      while (*(ppEnum[i]) && strcmp(ppEnum[i], message.c_str()) != 0)
+        i++;
+      if (*(ppEnum[i]) == 0) { // Not found.
+        return 0xff;
+      }
+
+      return static_cast<unsigned char>(i);
+    };
+    
+    static std::string GetMessage(int idx)
+    {
+      // Sanity check.
+      if (idx >=MessagesIdentifiers::Size)
+      {
+        return std::string("");
+      }
+      
+      return std::string(Messages[idx]);
+    }
+ };
+
+#endif // MessagesIdentifiers_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/App.config
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/App.config	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/App.config	(revision 22)
@@ -0,0 +1,24 @@
+﻿<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+  <configSections>
+    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
+  </configSections>
+  <log4net>
+    <appender name="UserGuides" type="log4net.Appender.TraceAppender" >
+      <layout type="log4net.Layout.PatternLayout">
+        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
+      </layout>
+    </appender>
+    <!-- Setup the root category, add the appenders and set the default level -->
+    <root>
+      <level value="ALL" />
+      <appender-ref ref="UserGuides" />
+    </root>
+  </log4net>
+  <appSettings>
+    <add key="IpAddress" value="127.0.0.1" />
+    <add key="IpPort" value="6610" /> <!-- 6611 -->
+    <add key="Title" value="User A" /> <!-- User B -->
+    <add key="MessagesFile" value="FILE://D:/cygwin/home/yann/dev/g++/STF 370/adapter/src/UEUserGuide/UserGuidesMessages.xml" />
+  </appSettings>
+</configuration>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Frameworks/Log4net/log4net.xml
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Frameworks/Log4net/log4net.xml	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Frameworks/Log4net/log4net.xml	(revision 22)
@@ -0,0 +1,28655 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>log4net</name>
+    </assembly>
+    <members>
+        <member name="T:log4net.Appender.AdoNetAppender">
+            <summary>
+            Appender that logs to a database.
+            </summary>
+            <remarks>
+            <para>
+            <see cref="T:log4net.Appender.AdoNetAppender"/> appends logging events to a table within a
+            database. The appender can be configured to specify the connection 
+            string by setting the <see cref="P:log4net.Appender.AdoNetAppender.ConnectionString"/> property. 
+            The connection type (provider) can be specified by setting the <see cref="P:log4net.Appender.AdoNetAppender.ConnectionType"/>
+            property. For more information on database connection strings for
+            your specific database see <a href="http://www.connectionstrings.com/">http://www.connectionstrings.com/</a>.
+            </para>
+            <para>
+            Records are written into the database either using a prepared
+            statement or a stored procedure. The <see cref="P:log4net.Appender.AdoNetAppender.CommandType"/> property
+            is set to <see cref="F:System.Data.CommandType.Text"/> (<c>System.Data.CommandType.Text</c>) to specify a prepared statement
+            or to <see cref="F:System.Data.CommandType.StoredProcedure"/> (<c>System.Data.CommandType.StoredProcedure</c>) to specify a stored
+            procedure.
+            </para>
+            <para>
+            The prepared statement text or the name of the stored procedure
+            must be set in the <see cref="P:log4net.Appender.AdoNetAppender.CommandText"/> property.
+            </para>
+            <para>
+            The prepared statement or stored procedure can take a number
+            of parameters. Parameters are added using the <see cref="M:log4net.Appender.AdoNetAppender.AddParameter(log4net.Appender.AdoNetAppenderParameter)"/>
+            method. This adds a single <see cref="T:log4net.Appender.AdoNetAppenderParameter"/> to the
+            ordered list of parameters. The <see cref="T:log4net.Appender.AdoNetAppenderParameter"/>
+            type may be subclassed if required to provide database specific
+            functionality. The <see cref="T:log4net.Appender.AdoNetAppenderParameter"/> specifies
+            the parameter name, database type, size, and how the value should
+            be generated using a <see cref="T:log4net.Layout.ILayout"/>.
+            </para>
+            </remarks>
+            <example>
+            An example of a SQL Server table that could be logged to:
+            <code lang="SQL">
+            CREATE TABLE [dbo].[Log] ( 
+              [ID] [int] IDENTITY (1, 1) NOT NULL ,
+              [Date] [datetime] NOT NULL ,
+              [Thread] [varchar] (255) NOT NULL ,
+              [Level] [varchar] (20) NOT NULL ,
+              [Logger] [varchar] (255) NOT NULL ,
+              [Message] [varchar] (4000) NOT NULL 
+            ) ON [PRIMARY]
+            </code>
+            </example>
+            <example>
+            An example configuration to log to the above table:
+            <code lang="XML" escaped="true">
+            <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
+              <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
+              <connectionString value="data source=SQLSVR;initial catalog=test_log4net;integrated security=false;persist security info=True;User ID=sa;Password=sa"/>
+              <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)"/>
+              <parameter>
+                <parameterName value="@log_date"/>
+                <dbType value="DateTime"/>
+                <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}"/>
+              </parameter>
+              <parameter>
+                <parameterName value="@thread"/>
+                <dbType value="String"/>
+                <size value="255"/>
+                <layout type="log4net.Layout.PatternLayout" value="%thread"/>
+              </parameter>
+              <parameter>
+                <parameterName value="@log_level"/>
+                <dbType value="String"/>
+                <size value="50"/>
+                <layout type="log4net.Layout.PatternLayout" value="%level"/>
+              </parameter>
+              <parameter>
+                <parameterName value="@logger"/>
+                <dbType value="String"/>
+                <size value="255"/>
+                <layout type="log4net.Layout.PatternLayout" value="%logger"/>
+              </parameter>
+              <parameter>
+                <parameterName value="@message"/>
+                <dbType value="String"/>
+                <size value="4000"/>
+                <layout type="log4net.Layout.PatternLayout" value="%message"/>
+              </parameter>
+            </appender>
+            </code>
+            </example>
+            <author>Julian Biddle</author>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+            <author>Lance Nehring</author>
+        </member>
+        <member name="T:log4net.Appender.BufferingAppenderSkeleton">
+            <summary>
+            Abstract base class implementation of <see cref="T:log4net.Appender.IAppender"/> that 
+            buffers events in a fixed size buffer.
+            </summary>
+            <remarks>
+            <para>
+            This base class should be used by appenders that need to buffer a 
+            number of events before logging them. For example the <see cref="T:log4net.Appender.AdoNetAppender"/> 
+            buffers events and then submits the entire contents of the buffer to 
+            the underlying database in one go.
+            </para>
+            <para>
+            Subclasses should override the <see cref="M:log4net.Appender.BufferingAppenderSkeleton.SendBuffer(log4net.Core.LoggingEvent[])"/>
+            method to deliver the buffered events.
+            </para>
+            <para>The BufferingAppenderSkeleton maintains a fixed size cyclic 
+            buffer of events. The size of the buffer is set using 
+            the <see cref="P:log4net.Appender.BufferingAppenderSkeleton.BufferSize"/> property.
+            </para>
+            <para>A <see cref="T:log4net.Core.ITriggeringEventEvaluator"/> is used to inspect 
+            each event as it arrives in the appender. If the <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Evaluator"/> 
+            triggers, then the current buffer is sent immediately 
+            (see <see cref="M:log4net.Appender.BufferingAppenderSkeleton.SendBuffer(log4net.Core.LoggingEvent[])"/>). Otherwise the event 
+            is stored in the buffer. For example, an evaluator can be used to 
+            deliver the events immediately when an ERROR event arrives.
+            </para>
+            <para>
+            The buffering appender can be configured in a <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Lossy"/> mode. 
+            By default the appender is NOT lossy. When the buffer is full all 
+            the buffered events are sent with <see cref="M:log4net.Appender.BufferingAppenderSkeleton.SendBuffer(log4net.Core.LoggingEvent[])"/>.
+            If the <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Lossy"/> property is set to <c>true</c> then the 
+            buffer will not be sent when it is full, and new events arriving 
+            in the appender will overwrite the oldest event in the buffer. 
+            In lossy mode the buffer will only be sent when the <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Evaluator"/>
+            triggers. This can be useful behavior when you need to know about 
+            ERROR events but not about events with a lower level, configure an 
+            evaluator that will trigger when an ERROR event arrives, the whole 
+            buffer will be sent which gives a history of events leading up to
+            the ERROR event.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Appender.AppenderSkeleton">
+            <summary>
+            Abstract base class implementation of <see cref="T:log4net.Appender.IAppender"/>. 
+            </summary>
+            <remarks>
+            <para>
+            This class provides the code for common functionality, such 
+            as support for threshold filtering and support for general filters.
+            </para>
+            <para>
+            Appenders can also implement the <see cref="T:log4net.Core.IOptionHandler"/> interface. Therefore
+            they would require that the <see cref="M:log4net.Core.IOptionHandler.ActivateOptions"/> method
+            be called after the appenders properties have been configured.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Appender.IAppender">
+            <summary>
+            Implement this interface for your own strategies for printing log statements.
+            </summary>
+            <remarks>
+            <para>
+            Implementors should consider extending the <see cref="T:log4net.Appender.AppenderSkeleton"/>
+            class which provides a default implementation of this interface.
+            </para>
+            <para>
+            Appenders can also implement the <see cref="T:log4net.Core.IOptionHandler"/> interface. Therefore
+            they would require that the <see cref="M:log4net.Core.IOptionHandler.ActivateOptions"/> method
+            be called after the appenders properties have been configured.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Appender.IAppender.Close">
+            <summary>
+            Closes the appender and releases resources.
+            </summary>
+            <remarks>
+            <para>
+            Releases any resources allocated within the appender such as file handles, 
+            network connections, etc.
+            </para>
+            <para>
+            It is a programming error to append to a closed appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.IAppender.DoAppend(log4net.Core.LoggingEvent)">
+            <summary>
+            Log the logging event in Appender specific way.
+            </summary>
+            <param name="loggingEvent">The event to log</param>
+            <remarks>
+            <para>
+            This method is called to log a message into this appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.IAppender.Name">
+            <summary>
+            Gets or sets the name of this appender.
+            </summary>
+            <value>The name of the appender.</value>
+            <remarks>
+            <para>The name uniquely identifies the appender.</para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.IBulkAppender">
+            <summary>
+            Interface for appenders that support bulk logging.
+            </summary>
+            <remarks>
+            <para>
+            This interface extends the <see cref="T:log4net.Appender.IAppender"/> interface to
+            support bulk logging of <see cref="T:log4net.Core.LoggingEvent"/> objects. Appenders
+            should only implement this interface if they can bulk log efficiently.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Appender.IBulkAppender.DoAppend(log4net.Core.LoggingEvent[])">
+            <summary>
+            Log the array of logging events in Appender specific way.
+            </summary>
+            <param name="loggingEvents">The events to log</param>
+            <remarks>
+            <para>
+            This method is called to log an array of events into this appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.IOptionHandler">
+            <summary>
+            Interface used to delay activate a configured object.
+            </summary>
+            <remarks>
+            <para>
+            This allows an object to defer activation of its options until all
+            options have been set. This is required for components which have
+            related options that remain ambiguous until all are set.
+            </para>
+            <para>
+            If a component implements this interface then the <see cref="M:log4net.Core.IOptionHandler.ActivateOptions"/> method 
+            must be called by the container after its all the configured properties have been set 
+            and before the component can be used.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Core.IOptionHandler.ActivateOptions">
+            <summary>
+            Activate the options that were previously set with calls to properties.
+            </summary>
+            <remarks>
+            <para>
+            This allows an object to defer activation of its options until all
+            options have been set. This is required for components which have
+            related options that remain ambiguous until all are set.
+            </para>
+            <para>
+            If a component implements this interface then this method must be called
+            after its properties have been set before the component can be used.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AppenderSkeleton.c_renderBufferSize">
+            <summary>
+            Initial buffer size
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AppenderSkeleton.c_renderBufferMaxCapacity">
+            <summary>
+            Maximum buffer size before it is recycled
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>Empty default constructor</para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.Finalize">
+            <summary>
+            Finalizes this appender by calling the implementation's 
+            <see cref="M:log4net.Appender.AppenderSkeleton.Close"/> method.
+            </summary>
+            <remarks>
+            <para>
+            If this appender has not been closed then the <c>Finalize</c> method
+            will call <see cref="M:log4net.Appender.AppenderSkeleton.Close"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.ActivateOptions">
+            <summary>
+            Initialize the appender based on the options set
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Appender.AppenderSkeleton.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Appender.AppenderSkeleton.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Appender.AppenderSkeleton.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.Close">
+            <summary>
+            Closes the appender and release resources.
+            </summary>
+            <remarks>
+            <para>
+            Release any resources allocated within the appender such as file handles, 
+            network connections, etc.
+            </para>
+            <para>
+            It is a programming error to append to a closed appender.
+            </para>
+            <para>
+            This method cannot be overridden by subclasses. This method 
+            delegates the closing of the appender to the <see cref="M:log4net.Appender.AppenderSkeleton.OnClose"/>
+            method which must be overridden in the subclass.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)">
+            <summary>
+            Performs threshold checks and invokes filters before 
+            delegating actual logging to the subclasses specific 
+            <see cref="M:log4net.Appender.AppenderSkeleton.Append(log4net.Core.LoggingEvent)"/> method.
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            This method cannot be overridden by derived classes. A
+            derived class should override the <see cref="M:log4net.Appender.AppenderSkeleton.Append(log4net.Core.LoggingEvent)"/> method
+            which is called by this method.
+            </para>
+            <para>
+            The implementation of this method is as follows:
+            </para>
+            <para>
+            <list type="bullet">
+            	<item>
+            		<description>
+            		Checks that the severity of the <paramref name="loggingEvent"/>
+            		is greater than or equal to the <see cref="P:log4net.Appender.AppenderSkeleton.Threshold"/> of this
+            		appender.</description>
+            	</item>
+            	<item>
+            		<description>
+            		Checks that the <see cref="T:log4net.Filter.IFilter"/> chain accepts the 
+            		<paramref name="loggingEvent"/>.
+            		</description>
+            	</item>
+            	<item>
+            		<description>
+            		Calls <see cref="M:log4net.Appender.AppenderSkeleton.PreAppendCheck"/> and checks that 
+            		it returns <c>true</c>.</description>
+            	</item>
+            </list>
+            </para>
+            <para>
+            If all of the above steps succeed then the <paramref name="loggingEvent"/>
+            will be passed to the abstract <see cref="M:log4net.Appender.AppenderSkeleton.Append(log4net.Core.LoggingEvent)"/> method.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent[])">
+            <summary>
+            Performs threshold checks and invokes filters before 
+            delegating actual logging to the subclasses specific 
+            <see cref="M:log4net.Appender.AppenderSkeleton.Append(log4net.Core.LoggingEvent[])"/> method.
+            </summary>
+            <param name="loggingEvents">The array of events to log.</param>
+            <remarks>
+            <para>
+            This method cannot be overridden by derived classes. A
+            derived class should override the <see cref="M:log4net.Appender.AppenderSkeleton.Append(log4net.Core.LoggingEvent[])"/> method
+            which is called by this method.
+            </para>
+            <para>
+            The implementation of this method is as follows:
+            </para>
+            <para>
+            <list type="bullet">
+            	<item>
+            		<description>
+            		Checks that the severity of the <paramref name="loggingEvent"/>
+            		is greater than or equal to the <see cref="P:log4net.Appender.AppenderSkeleton.Threshold"/> of this
+            		appender.</description>
+            	</item>
+            	<item>
+            		<description>
+            		Checks that the <see cref="T:log4net.Filter.IFilter"/> chain accepts the 
+            		<paramref name="loggingEvent"/>.
+            		</description>
+            	</item>
+            	<item>
+            		<description>
+            		Calls <see cref="M:log4net.Appender.AppenderSkeleton.PreAppendCheck"/> and checks that 
+            		it returns <c>true</c>.</description>
+            	</item>
+            </list>
+            </para>
+            <para>
+            If all of the above steps succeed then the <paramref name="loggingEvents"/>
+            will be passed to the <see cref="M:log4net.Appender.AppenderSkeleton.Append(log4net.Core.LoggingEvent[])"/> method.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.FilterEvent(log4net.Core.LoggingEvent)">
+            <summary>
+            Test if the logging event should we output by this appender
+            </summary>
+            <param name="loggingEvent">the event to test</param>
+            <returns><c>true</c> if the event should be output, <c>false</c> if the event should be ignored</returns>
+            <remarks>
+            <para>
+            This method checks the logging event against the threshold level set
+            on this appender and also against the filters specified on this
+            appender.
+            </para>
+            <para>
+            The implementation of this method is as follows:
+            </para>
+            <para>
+            <list type="bullet">
+            	<item>
+            		<description>
+            		Checks that the severity of the <paramref name="loggingEvent"/>
+            		is greater than or equal to the <see cref="P:log4net.Appender.AppenderSkeleton.Threshold"/> of this
+            		appender.</description>
+            	</item>
+            	<item>
+            		<description>
+            		Checks that the <see cref="T:log4net.Filter.IFilter"/> chain accepts the 
+            		<paramref name="loggingEvent"/>.
+            		</description>
+            	</item>
+            </list>
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.AddFilter(log4net.Filter.IFilter)">
+            <summary>
+            Adds a filter to the end of the filter chain.
+            </summary>
+            <param name="filter">the filter to add to this appender</param>
+            <remarks>
+            <para>
+            The Filters are organized in a linked list.
+            </para>
+            <para>
+            Setting this property causes the new filter to be pushed onto the 
+            back of the filter chain.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.ClearFilters">
+            <summary>
+            Clears the filter list for this appender.
+            </summary>
+            <remarks>
+            <para>
+            Clears the filter list for this appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.IsAsSevereAsThreshold(log4net.Core.Level)">
+            <summary>
+            Checks if the message level is below this appender's threshold.
+            </summary>
+            <param name="level"><see cref="T:log4net.Core.Level"/> to test against.</param>
+            <remarks>
+            <para>
+            If there is no threshold set, then the return value is always <c>true</c>.
+            </para>
+            </remarks>
+            <returns>
+            <c>true</c> if the <paramref name="level"/> meets the <see cref="P:log4net.Appender.AppenderSkeleton.Threshold"/> 
+            requirements of this appender.
+            </returns>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.OnClose">
+            <summary>
+            Is called when the appender is closed. Derived classes should override 
+            this method if resources need to be released.
+            </summary>
+            <remarks>
+            <para>
+            Releases any resources allocated within the appender such as file handles, 
+            network connections, etc.
+            </para>
+            <para>
+            It is a programming error to append to a closed appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            Subclasses of <see cref="T:log4net.Appender.AppenderSkeleton"/> should implement this method 
+            to perform actual logging.
+            </summary>
+            <param name="loggingEvent">The event to append.</param>
+            <remarks>
+            <para>
+            A subclass must implement this method to perform
+            logging of the <paramref name="loggingEvent"/>.
+            </para>
+            <para>This method will be called by <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/>
+            if all the conditions listed for that method are met.
+            </para>
+            <para>
+            To restrict the logging of events in the appender
+            override the <see cref="M:log4net.Appender.AppenderSkeleton.PreAppendCheck"/> method.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.Append(log4net.Core.LoggingEvent[])">
+            <summary>
+            Append a bulk array of logging events.
+            </summary>
+            <param name="loggingEvents">the array of logging events</param>
+            <remarks>
+            <para>
+            This base class implementation calls the <see cref="M:log4net.Appender.AppenderSkeleton.Append(log4net.Core.LoggingEvent)"/>
+            method for each element in the bulk array.
+            </para>
+            <para>
+            A sub class that can better process a bulk array of events should
+            override this method in addition to <see cref="M:log4net.Appender.AppenderSkeleton.Append(log4net.Core.LoggingEvent)"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.PreAppendCheck">
+            <summary>
+            Called before <see cref="M:log4net.Appender.AppenderSkeleton.Append(log4net.Core.LoggingEvent)"/> as a precondition.
+            </summary>
+            <remarks>
+            <para>
+            This method is called by <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/>
+            before the call to the abstract <see cref="M:log4net.Appender.AppenderSkeleton.Append(log4net.Core.LoggingEvent)"/> method.
+            </para>
+            <para>
+            This method can be overridden in a subclass to extend the checks 
+            made before the event is passed to the <see cref="M:log4net.Appender.AppenderSkeleton.Append(log4net.Core.LoggingEvent)"/> method.
+            </para>
+            <para>
+            A subclass should ensure that they delegate this call to
+            this base class if it is overridden.
+            </para>
+            </remarks>
+            <returns><c>true</c> if the call to <see cref="M:log4net.Appender.AppenderSkeleton.Append(log4net.Core.LoggingEvent)"/> should proceed.</returns>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.RenderLoggingEvent(log4net.Core.LoggingEvent)">
+            <summary>
+            Renders the <see cref="T:log4net.Core.LoggingEvent"/> to a string.
+            </summary>
+            <param name="loggingEvent">The event to render.</param>
+            <returns>The event rendered as a string.</returns>
+            <remarks>
+            <para>
+            Helper method to render a <see cref="T:log4net.Core.LoggingEvent"/> to 
+            a string. This appender must have a <see cref="P:log4net.Appender.AppenderSkeleton.Layout"/>
+            set to render the <paramref name="loggingEvent"/> to 
+            a string.
+            </para>
+            <para>If there is exception data in the logging event and 
+            the layout does not process the exception, this method 
+            will append the exception text to the rendered string.
+            </para>
+            <para>
+            Where possible use the alternative version of this method
+            <see cref="M:log4net.Appender.AppenderSkeleton.RenderLoggingEvent(System.IO.TextWriter,log4net.Core.LoggingEvent)"/>.
+            That method streams the rendering onto an existing Writer
+            which can give better performance if the caller already has
+            a <see cref="T:System.IO.TextWriter"/> open and ready for writing.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AppenderSkeleton.RenderLoggingEvent(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Renders the <see cref="T:log4net.Core.LoggingEvent"/> to a string.
+            </summary>
+            <param name="loggingEvent">The event to render.</param>
+            <param name="writer">The TextWriter to write the formatted event to</param>
+            <remarks>
+            <para>
+            Helper method to render a <see cref="T:log4net.Core.LoggingEvent"/> to 
+            a string. This appender must have a <see cref="P:log4net.Appender.AppenderSkeleton.Layout"/>
+            set to render the <paramref name="loggingEvent"/> to 
+            a string.
+            </para>
+            <para>If there is exception data in the logging event and 
+            the layout does not process the exception, this method 
+            will append the exception text to the rendered string.
+            </para>
+            <para>
+            Use this method in preference to <see cref="M:log4net.Appender.AppenderSkeleton.RenderLoggingEvent(log4net.Core.LoggingEvent)"/>
+            where possible. If, however, the caller needs to render the event
+            to a string then <see cref="M:log4net.Appender.AppenderSkeleton.RenderLoggingEvent(log4net.Core.LoggingEvent)"/> does
+            provide an efficient mechanism for doing so.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AppenderSkeleton.m_layout">
+            <summary>
+            The layout of this appender.
+            </summary>
+            <remarks>
+            See <see cref="P:log4net.Appender.AppenderSkeleton.Layout"/> for more information.
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AppenderSkeleton.m_name">
+            <summary>
+            The name of this appender.
+            </summary>
+            <remarks>
+            See <see cref="P:log4net.Appender.AppenderSkeleton.Name"/> for more information.
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AppenderSkeleton.m_threshold">
+            <summary>
+            The level threshold of this appender.
+            </summary>
+            <remarks>
+            <para>
+            There is no level threshold filtering by default.
+            </para>
+            <para>
+            See <see cref="P:log4net.Appender.AppenderSkeleton.Threshold"/> for more information.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AppenderSkeleton.m_errorHandler">
+            <summary>
+            It is assumed and enforced that errorHandler is never null.
+            </summary>
+            <remarks>
+            <para>
+            It is assumed and enforced that errorHandler is never null.
+            </para>
+            <para>
+            See <see cref="P:log4net.Appender.AppenderSkeleton.ErrorHandler"/> for more information.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AppenderSkeleton.m_headFilter">
+            <summary>
+            The first filter in the filter chain.
+            </summary>
+            <remarks>
+            <para>
+            Set to <c>null</c> initially.
+            </para>
+            <para>
+            See <see cref="T:log4net.Filter.IFilter"/> for more information.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AppenderSkeleton.m_tailFilter">
+            <summary>
+            The last filter in the filter chain.
+            </summary>
+            <remarks>
+            See <see cref="T:log4net.Filter.IFilter"/> for more information.
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AppenderSkeleton.m_closed">
+            <summary>
+            Flag indicating if this appender is closed.
+            </summary>
+            <remarks>
+            See <see cref="M:log4net.Appender.AppenderSkeleton.Close"/> for more information.
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AppenderSkeleton.m_recursiveGuard">
+            <summary>
+            The guard prevents an appender from repeatedly calling its own DoAppend method
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AppenderSkeleton.m_renderWriter">
+            <summary>
+            StringWriter used to render events
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.AppenderSkeleton.Threshold">
+            <summary>
+            Gets or sets the threshold <see cref="T:log4net.Core.Level"/> of this appender.
+            </summary>
+            <value>
+            The threshold <see cref="T:log4net.Core.Level"/> of the appender. 
+            </value>
+            <remarks>
+            <para>
+            All log events with lower level than the threshold level are ignored 
+            by the appender.
+            </para>
+            <para>
+            In configuration files this option is specified by setting the
+            value of the <see cref="P:log4net.Appender.AppenderSkeleton.Threshold"/> option to a level
+            string, such as "DEBUG", "INFO" and so on.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AppenderSkeleton.ErrorHandler">
+            <summary>
+            Gets or sets the <see cref="T:log4net.Core.IErrorHandler"/> for this appender.
+            </summary>
+            <value>The <see cref="T:log4net.Core.IErrorHandler"/> of the appender</value>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Appender.AppenderSkeleton"/> provides a default 
+            implementation for the <see cref="P:log4net.Appender.AppenderSkeleton.ErrorHandler"/> property. 
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AppenderSkeleton.FilterHead">
+            <summary>
+            The filter chain.
+            </summary>
+            <value>The head of the filter chain filter chain.</value>
+            <remarks>
+            <para>
+            Returns the head Filter. The Filters are organized in a linked list
+            and so all Filters on this Appender are available through the result.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AppenderSkeleton.Layout">
+            <summary>
+            Gets or sets the <see cref="T:log4net.Layout.ILayout"/> for this appender.
+            </summary>
+            <value>The layout of the appender.</value>
+            <remarks>
+            <para>
+            See <see cref="P:log4net.Appender.AppenderSkeleton.RequiresLayout"/> for more information.
+            </para>
+            </remarks>
+            <seealso cref="P:log4net.Appender.AppenderSkeleton.RequiresLayout"/>
+        </member>
+        <member name="P:log4net.Appender.AppenderSkeleton.Name">
+            <summary>
+            Gets or sets the name of this appender.
+            </summary>
+            <value>The name of the appender.</value>
+            <remarks>
+            <para>
+            The name uniquely identifies the appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AppenderSkeleton.RequiresLayout">
+            <summary>
+            Tests if this appender requires a <see cref="P:log4net.Appender.AppenderSkeleton.Layout"/> to be set.
+            </summary>
+            <remarks>
+            <para>
+            In the rather exceptional case, where the appender 
+            implementation admits a layout but can also work without it, 
+            then the appender should return <c>true</c>.
+            </para>
+            <para>
+            This default implementation always returns <c>true</c>.
+            </para>
+            </remarks>
+            <returns>
+            <c>true</c> if the appender requires a layout object, otherwise <c>false</c>.
+            </returns>
+        </member>
+        <member name="F:log4net.Appender.BufferingAppenderSkeleton.DEFAULT_BUFFER_SIZE">
+            <summary>
+            The default buffer size.
+            </summary>
+            <remarks>
+            The default size of the cyclic buffer used to store events.
+            This is set to 512 by default.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingAppenderSkeleton.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.BufferingAppenderSkeleton"/> class.
+            </summary>
+            <remarks>
+            <para>
+            Protected default constructor to allow subclassing.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingAppenderSkeleton.#ctor(System.Boolean)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.BufferingAppenderSkeleton"/> class.
+            </summary>
+            <param name="eventMustBeFixed">the events passed through this appender must be
+            fixed by the time that they arrive in the derived class' <c>SendBuffer</c> method.</param>
+            <remarks>
+            <para>
+            Protected constructor to allow subclassing.
+            </para>
+            <para>
+            The <paramref name="eventMustBeFixed"/> should be set if the subclass
+            expects the events delivered to be fixed even if the 
+            <see cref="P:log4net.Appender.BufferingAppenderSkeleton.BufferSize"/> is set to zero, i.e. when no buffering occurs.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingAppenderSkeleton.Flush">
+            <summary>
+            Flush the currently buffered events
+            </summary>
+            <remarks>
+            <para>
+            Flushes any events that have been buffered.
+            </para>
+            <para>
+            If the appender is buffering in <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Lossy"/> mode then the contents
+            of the buffer will NOT be flushed to the appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingAppenderSkeleton.Flush(System.Boolean)">
+            <summary>
+            Flush the currently buffered events
+            </summary>
+            <param name="flushLossyBuffer">set to <c>true</c> to flush the buffer of lossy events</param>
+            <remarks>
+            <para>
+            Flushes events that have been buffered. If <paramref name="flushLossyBuffer"/> is
+            <c>false</c> then events will only be flushed if this buffer is non-lossy mode.
+            </para>
+            <para>
+            If the appender is buffering in <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Lossy"/> mode then the contents
+            of the buffer will only be flushed if <paramref name="flushLossyBuffer"/> is <c>true</c>.
+            In this case the contents of the buffer will be tested against the 
+            <see cref="P:log4net.Appender.BufferingAppenderSkeleton.LossyEvaluator"/> and if triggering will be output. All other buffered
+            events will be discarded.
+            </para>
+            <para>
+            If <paramref name="flushLossyBuffer"/> is <c>true</c> then the buffer will always
+            be emptied by calling this method.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingAppenderSkeleton.ActivateOptions">
+            <summary>
+            Initialize the appender based on the options set
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Appender.BufferingAppenderSkeleton.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Appender.BufferingAppenderSkeleton.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Appender.BufferingAppenderSkeleton.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingAppenderSkeleton.OnClose">
+            <summary>
+            Close this appender instance.
+            </summary>
+            <remarks>
+            <para>
+            Close this appender instance. If this appender is marked
+            as not <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Lossy"/> then the remaining events in 
+            the buffer must be sent when the appender is closed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingAppenderSkeleton.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            This method is called by the <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/> method. 
+            </summary>
+            <param name="loggingEvent">the event to log</param>
+            <remarks>
+            <para>
+            Stores the <paramref name="loggingEvent"/> in the cyclic buffer.
+            </para>
+            <para>
+            The buffer will be sent (i.e. passed to the <see cref="M:log4net.Appender.BufferingAppenderSkeleton.SendBuffer(log4net.Core.LoggingEvent[])"/> 
+            method) if one of the following conditions is met:
+            </para>
+            <list type="bullet">
+            	<item>
+            		<description>The cyclic buffer is full and this appender is
+            		marked as not lossy (see <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Lossy"/>)</description>
+            	</item>
+            	<item>
+            		<description>An <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Evaluator"/> is set and
+            		it is triggered for the <paramref name="loggingEvent"/>
+            		specified.</description>
+            	</item>
+            </list>
+            <para>
+            Before the event is stored in the buffer it is fixed
+            (see <see cref="M:log4net.Core.LoggingEvent.FixVolatileData(log4net.Core.FixFlags)"/>) to ensure that
+            any data referenced by the event will be valid when the buffer
+            is processed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingAppenderSkeleton.SendFromBuffer(log4net.Core.LoggingEvent,log4net.Util.CyclicBuffer)">
+            <summary>
+            Sends the contents of the buffer.
+            </summary>
+            <param name="firstLoggingEvent">The first logging event.</param>
+            <param name="buffer">The buffer containing the events that need to be send.</param>
+            <remarks>
+            <para>
+            The subclass must override <see cref="M:log4net.Appender.BufferingAppenderSkeleton.SendBuffer(log4net.Core.LoggingEvent[])"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingAppenderSkeleton.SendBuffer(log4net.Core.LoggingEvent[])">
+            <summary>
+            Sends the events.
+            </summary>
+            <param name="events">The events that need to be send.</param>
+            <remarks>
+            <para>
+            The subclass must override this method to process the buffered events.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.BufferingAppenderSkeleton.m_bufferSize">
+            <summary>
+            The size of the cyclic buffer used to hold the logging events.
+            </summary>
+            <remarks>
+            Set to <see cref="F:log4net.Appender.BufferingAppenderSkeleton.DEFAULT_BUFFER_SIZE"/> by default.
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.BufferingAppenderSkeleton.m_cb">
+            <summary>
+            The cyclic buffer used to store the logging events.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.BufferingAppenderSkeleton.m_evaluator">
+            <summary>
+            The triggering event evaluator that causes the buffer to be sent immediately.
+            </summary>
+            <remarks>
+            The object that is used to determine if an event causes the entire
+            buffer to be sent immediately. This field can be <c>null</c>, which 
+            indicates that event triggering is not to be done. The evaluator
+            can be set using the <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Evaluator"/> property. If this appender
+            has the <see cref="F:log4net.Appender.BufferingAppenderSkeleton.m_lossy"/> (<see cref="P:log4net.Appender.BufferingAppenderSkeleton.Lossy"/> property) set to 
+            <c>true</c> then an <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Evaluator"/> must be set.
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.BufferingAppenderSkeleton.m_lossy">
+            <summary>
+            Indicates if the appender should overwrite events in the cyclic buffer 
+            when it becomes full, or if the buffer should be flushed when the 
+            buffer is full.
+            </summary>
+            <remarks>
+            If this field is set to <c>true</c> then an <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Evaluator"/> must 
+            be set.
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.BufferingAppenderSkeleton.m_lossyEvaluator">
+            <summary>
+            The triggering event evaluator filters discarded events.
+            </summary>
+            <remarks>
+            The object that is used to determine if an event that is discarded should
+            really be discarded or if it should be sent to the appenders. 
+            This field can be <c>null</c>, which indicates that all discarded events will
+            be discarded. 
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.BufferingAppenderSkeleton.m_fixFlags">
+            <summary>
+            Value indicating which fields in the event should be fixed
+            </summary>
+            <remarks>
+            By default all fields are fixed
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.BufferingAppenderSkeleton.m_eventMustBeFixed">
+            <summary>
+            The events delivered to the subclass must be fixed.
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.BufferingAppenderSkeleton.Lossy">
+            <summary>
+            Gets or sets a value that indicates whether the appender is lossy.
+            </summary>
+            <value>
+            <c>true</c> if the appender is lossy, otherwise <c>false</c>. The default is <c>false</c>.
+            </value>
+            <remarks>
+            <para>
+            This appender uses a buffer to store logging events before 
+            delivering them. A triggering event causes the whole buffer
+            to be send to the remote sink. If the buffer overruns before
+            a triggering event then logging events could be lost. Set
+            <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Lossy"/> to <c>false</c> to prevent logging events 
+            from being lost.
+            </para>
+            <para>If <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Lossy"/> is set to <c>true</c> then an
+            <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Evaluator"/> must be specified.</para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.BufferingAppenderSkeleton.BufferSize">
+            <summary>
+            Gets or sets the size of the cyclic buffer used to hold the 
+            logging events.
+            </summary>
+            <value>
+            The size of the cyclic buffer used to hold the logging events.
+            </value>
+            <remarks>
+            <para>
+            The <see cref="P:log4net.Appender.BufferingAppenderSkeleton.BufferSize"/> option takes a positive integer
+            representing the maximum number of logging events to collect in 
+            a cyclic buffer. When the <see cref="P:log4net.Appender.BufferingAppenderSkeleton.BufferSize"/> is reached,
+            oldest events are deleted as new events are added to the
+            buffer. By default the size of the cyclic buffer is 512 events.
+            </para>
+            <para>
+            If the <see cref="P:log4net.Appender.BufferingAppenderSkeleton.BufferSize"/> is set to a value less than
+            or equal to 1 then no buffering will occur. The logging event
+            will be delivered synchronously (depending on the <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Lossy"/>
+            and <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Evaluator"/> properties). Otherwise the event will
+            be buffered.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.BufferingAppenderSkeleton.Evaluator">
+            <summary>
+            Gets or sets the <see cref="T:log4net.Core.ITriggeringEventEvaluator"/> that causes the 
+            buffer to be sent immediately.
+            </summary>
+            <value>
+            The <see cref="T:log4net.Core.ITriggeringEventEvaluator"/> that causes the buffer to be
+            sent immediately.
+            </value>
+            <remarks>
+            <para>
+            The evaluator will be called for each event that is appended to this 
+            appender. If the evaluator triggers then the current buffer will 
+            immediately be sent (see <see cref="M:log4net.Appender.BufferingAppenderSkeleton.SendBuffer(log4net.Core.LoggingEvent[])"/>).
+            </para>
+            <para>If <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Lossy"/> is set to <c>true</c> then an
+            <see cref="P:log4net.Appender.BufferingAppenderSkeleton.Evaluator"/> must be specified.</para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.BufferingAppenderSkeleton.LossyEvaluator">
+            <summary>
+            Gets or sets the value of the <see cref="T:log4net.Core.ITriggeringEventEvaluator"/> to use.
+            </summary>
+            <value>
+            The value of the <see cref="T:log4net.Core.ITriggeringEventEvaluator"/> to use.
+            </value>
+            <remarks>
+            <para>
+            The evaluator will be called for each event that is discarded from this 
+            appender. If the evaluator triggers then the current buffer will immediately 
+            be sent (see <see cref="M:log4net.Appender.BufferingAppenderSkeleton.SendBuffer(log4net.Core.LoggingEvent[])"/>).
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.BufferingAppenderSkeleton.OnlyFixPartialEventData">
+            <summary>
+            Gets or sets a value indicating if only part of the logging event data
+            should be fixed.
+            </summary>
+            <value>
+            <c>true</c> if the appender should only fix part of the logging event 
+            data, otherwise <c>false</c>. The default is <c>false</c>.
+            </value>
+            <remarks>
+            <para>
+            Setting this property to <c>true</c> will cause only part of the
+            event data to be fixed and serialized. This will improve performance.
+            </para>
+            <para>
+            See <see cref="M:log4net.Core.LoggingEvent.FixVolatileData(log4net.Core.FixFlags)"/> for more information.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.BufferingAppenderSkeleton.Fix">
+            <summary>
+            Gets or sets a the fields that will be fixed in the event
+            </summary>
+            <value>
+            The event fields that will be fixed before the event is buffered
+            </value>
+            <remarks>
+            <para>
+            The logging event needs to have certain thread specific values 
+            captured before it can be buffered. See <see cref="P:log4net.Core.LoggingEvent.Fix"/>
+            for details.
+            </para>
+            </remarks>
+            <seealso cref="P:log4net.Core.LoggingEvent.Fix"/>
+        </member>
+        <member name="M:log4net.Appender.AdoNetAppender.#ctor">
+            <summary> 
+            Initializes a new instance of the <see cref="T:log4net.Appender.AdoNetAppender"/> class.
+            </summary>
+            <remarks>
+            Public default constructor to initialize a new instance of this class.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AdoNetAppender.ActivateOptions">
+            <summary>
+            Initialize the appender based on the options set
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Appender.AdoNetAppender.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Appender.AdoNetAppender.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Appender.AdoNetAppender.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AdoNetAppender.OnClose">
+            <summary>
+            Override the parent method to close the database
+            </summary>
+            <remarks>
+            <para>
+            Closes the database command and database connection.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AdoNetAppender.SendBuffer(log4net.Core.LoggingEvent[])">
+            <summary>
+            Inserts the events into the database.
+            </summary>
+            <param name="events">The events to insert into the database.</param>
+            <remarks>
+            <para>
+            Insert all the events specified in the <paramref name="events"/>
+            array into the database.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AdoNetAppender.AddParameter(log4net.Appender.AdoNetAppenderParameter)">
+            <summary>
+            Adds a parameter to the command.
+            </summary>
+            <param name="parameter">The parameter to add to the command.</param>
+            <remarks>
+            <para>
+            Adds a parameter to the ordered list of command parameters.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AdoNetAppender.SendBuffer(System.Data.IDbTransaction,log4net.Core.LoggingEvent[])">
+            <summary>
+            Writes the events to the database using the transaction specified.
+            </summary>
+            <param name="dbTran">The transaction that the events will be executed under.</param>
+            <param name="events">The array of events to insert into the database.</param>
+            <remarks>
+            <para>
+            The transaction argument can be <c>null</c> if the appender has been
+            configured not to use transactions. See <see cref="P:log4net.Appender.AdoNetAppender.UseTransactions"/>
+            property for more information.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AdoNetAppender.GetLogStatement(log4net.Core.LoggingEvent)">
+            <summary>
+            Formats the log message into database statement text.
+            </summary>
+            <param name="logEvent">The event being logged.</param>
+            <remarks>
+            This method can be overridden by subclasses to provide 
+            more control over the format of the database statement.
+            </remarks>
+            <returns>
+            Text that can be passed to a <see cref="T:System.Data.IDbCommand"/>.
+            </returns>
+        </member>
+        <member name="M:log4net.Appender.AdoNetAppender.InitializeDatabaseConnection">
+            <summary>
+            Connects to the database.
+            </summary>		
+        </member>
+        <member name="M:log4net.Appender.AdoNetAppender.ResolveConnectionType">
+            <summary>
+            Retrieves the class type of the ADO.NET provider.
+            </summary>
+            <remarks>
+            <para>
+            Gets the Type of the ADO.NET provider to use to connect to the
+            database. This method resolves the type specified in the 
+            <see cref="P:log4net.Appender.AdoNetAppender.ConnectionType"/> property.
+            </para>
+            <para>
+            Subclasses can override this method to return a different type
+            if necessary.
+            </para>
+            </remarks>
+            <returns>The <see cref="T:System.Type"/> of the ADO.NET provider</returns>
+        </member>
+        <member name="M:log4net.Appender.AdoNetAppender.InitializeDatabaseCommand">
+            <summary>
+            Prepares the database command and initialize the parameters.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppender.m_usePreparedCommand">
+            <summary>
+            Flag to indicate if we are using a command object
+            </summary>
+            <remarks>
+            <para>
+            Set to <c>true</c> when the appender is to use a prepared
+            statement or stored procedure to insert into the database.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppender.m_parameters">
+            <summary>
+            The list of <see cref="T:log4net.Appender.AdoNetAppenderParameter"/> objects.
+            </summary>
+            <remarks>
+            <para>
+            The list of <see cref="T:log4net.Appender.AdoNetAppenderParameter"/> objects.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppender.m_securityContext">
+            <summary>
+            The security context to use for privileged calls
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppender.m_dbConnection">
+            <summary>
+            The <see cref="T:System.Data.IDbConnection"/> that will be used
+            to insert logging events into a database.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppender.m_dbCommand">
+            <summary>
+            The database command.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppender.m_connectionString">
+            <summary>
+            Database connection string.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppender.m_connectionType">
+            <summary>
+            String type name of the <see cref="T:System.Data.IDbConnection"/> type name.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppender.m_commandText">
+            <summary>
+            The text of the command.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppender.m_commandType">
+            <summary>
+            The command type.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppender.m_useTransactions">
+            <summary>
+            Indicates whether to use transactions when writing to the database.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppender.m_reconnectOnError">
+            <summary>
+            Indicates whether to use transactions when writing to the database.
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.AdoNetAppender.ConnectionString">
+            <summary>
+            Gets or sets the database connection string that is used to connect to 
+            the database.
+            </summary>
+            <value>
+            The database connection string used to connect to the database.
+            </value>
+            <remarks>
+            <para>
+            The connections string is specific to the connection type.
+            See <see cref="P:log4net.Appender.AdoNetAppender.ConnectionType"/> for more information.
+            </para>
+            </remarks>
+            <example>Connection string for MS Access via ODBC:
+            <code>"DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb"</code>
+            </example>
+            <example>Another connection string for MS Access via ODBC:
+            <code>"Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;"</code>
+            </example>
+            <example>Connection string for MS Access via OLE DB:
+            <code>"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;"</code>
+            </example>
+        </member>
+        <member name="P:log4net.Appender.AdoNetAppender.ConnectionType">
+            <summary>
+            Gets or sets the type name of the <see cref="T:System.Data.IDbConnection"/> connection
+            that should be created.
+            </summary>
+            <value>
+            The type name of the <see cref="T:System.Data.IDbConnection"/> connection.
+            </value>
+            <remarks>
+            <para>
+            The type name of the ADO.NET provider to use.
+            </para>
+            <para>
+            The default is to use the OLE DB provider.
+            </para>
+            </remarks>
+            <example>Use the OLE DB Provider. This is the default value.
+            <code>System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</code>
+            </example>
+            <example>Use the MS SQL Server Provider. 
+            <code>System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</code>
+            </example>
+            <example>Use the ODBC Provider. 
+            <code>Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral</code>
+            This is an optional package that you can download from 
+            <a href="http://msdn.microsoft.com/downloads">http://msdn.microsoft.com/downloads</a> 
+            search for <b>ODBC .NET Data Provider</b>.
+            </example>
+            <example>Use the Oracle Provider. 
+            <code>System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</code>
+            This is an optional package that you can download from 
+            <a href="http://msdn.microsoft.com/downloads">http://msdn.microsoft.com/downloads</a> 
+            search for <b>.NET Managed Provider for Oracle</b>.
+            </example>
+        </member>
+        <member name="P:log4net.Appender.AdoNetAppender.CommandText">
+            <summary>
+            Gets or sets the command text that is used to insert logging events
+            into the database.
+            </summary>
+            <value>
+            The command text used to insert logging events into the database.
+            </value>
+            <remarks>
+            <para>
+            Either the text of the prepared statement or the
+            name of the stored procedure to execute to write into
+            the database.
+            </para>
+            <para>
+            The <see cref="P:log4net.Appender.AdoNetAppender.CommandType"/> property determines if
+            this text is a prepared statement or a stored procedure.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AdoNetAppender.CommandType">
+            <summary>
+            Gets or sets the command type to execute.
+            </summary>
+            <value>
+            The command type to execute.
+            </value>
+            <remarks>
+            <para>
+            This value may be either <see cref="F:System.Data.CommandType.Text"/> (<c>System.Data.CommandType.Text</c>) to specify
+            that the <see cref="P:log4net.Appender.AdoNetAppender.CommandText"/> is a prepared statement to execute, 
+            or <see cref="F:System.Data.CommandType.StoredProcedure"/> (<c>System.Data.CommandType.StoredProcedure</c>) to specify that the
+            <see cref="P:log4net.Appender.AdoNetAppender.CommandText"/> property is the name of a stored procedure
+            to execute.
+            </para>
+            <para>
+            The default value is <see cref="F:System.Data.CommandType.Text"/> (<c>System.Data.CommandType.Text</c>).
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AdoNetAppender.UseTransactions">
+            <summary>
+            Should transactions be used to insert logging events in the database.
+            </summary>
+            <value>
+            <c>true</c> if transactions should be used to insert logging events in
+            the database, otherwise <c>false</c>. The default value is <c>true</c>.
+            </value>
+            <remarks>
+            <para>
+            Gets or sets a value that indicates whether transactions should be used
+            to insert logging events in the database.
+            </para>
+            <para>
+            When set a single transaction will be used to insert the buffered events
+            into the database. Otherwise each event will be inserted without using
+            an explicit transaction.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AdoNetAppender.SecurityContext">
+            <summary>
+            Gets or sets the <see cref="P:log4net.Appender.AdoNetAppender.SecurityContext"/> used to call the NetSend method.
+            </summary>
+            <value>
+            The <see cref="P:log4net.Appender.AdoNetAppender.SecurityContext"/> used to call the NetSend method.
+            </value>
+            <remarks>
+            <para>
+            Unless a <see cref="P:log4net.Appender.AdoNetAppender.SecurityContext"/> specified here for this appender
+            the <see cref="P:log4net.Core.SecurityContextProvider.DefaultProvider"/> is queried for the
+            security context to use. The default behavior is to use the security context
+            of the current thread.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AdoNetAppender.ReconnectOnError">
+            <summary>
+            Should this appender try to reconnect to the database on error.
+            </summary>
+            <value>
+            <c>true</c> if the appender should try to reconnect to the database after an
+            error has occurred, otherwise <c>false</c>. The default value is <c>false</c>, 
+            i.e. not to try to reconnect.
+            </value>
+            <remarks>
+            <para>
+            The default behaviour is for the appender not to try to reconnect to the
+            database if an error occurs. Subsequent logging events are discarded.
+            </para>
+            <para>
+            To force the appender to attempt to reconnect to the database set this
+            property to <c>true</c>.
+            </para>
+            <note>
+            When the appender attempts to connect to the database there may be a
+            delay of up to the connection timeout specified in the connection string.
+            This delay will block the calling application's thread. 
+            Until the connection can be reestablished this potential delay may occur multiple times.
+            </note>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AdoNetAppender.Connection">
+            <summary>
+            Gets or sets the underlying <see cref="T:System.Data.IDbConnection"/>.
+            </summary>
+            <value>
+            The underlying <see cref="T:System.Data.IDbConnection"/>.
+            </value>
+            <remarks>
+            <see cref="T:log4net.Appender.AdoNetAppender"/> creates a <see cref="T:System.Data.IDbConnection"/> to insert 
+            logging events into a database.  Classes deriving from <see cref="T:log4net.Appender.AdoNetAppender"/> 
+            can use this property to get or set this <see cref="T:System.Data.IDbConnection"/>.  Use the 
+            underlying <see cref="T:System.Data.IDbConnection"/> returned from <see cref="P:log4net.Appender.AdoNetAppender.Connection"/> if 
+            you require access beyond that which <see cref="T:log4net.Appender.AdoNetAppender"/> provides.
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.AdoNetAppenderParameter">
+            <summary>
+            Parameter type used by the <see cref="T:log4net.Appender.AdoNetAppender"/>.
+            </summary>
+            <remarks>
+            <para>
+            This class provides the basic database parameter properties
+            as defined by the <see cref="T:System.Data.IDbDataParameter"/> interface.
+            </para>
+            <para>This type can be subclassed to provide database specific
+            functionality. The two methods that are called externally are
+            <see cref="M:log4net.Appender.AdoNetAppenderParameter.Prepare(System.Data.IDbCommand)"/> and <see cref="M:log4net.Appender.AdoNetAppenderParameter.FormatValue(System.Data.IDbCommand,log4net.Core.LoggingEvent)"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AdoNetAppenderParameter.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.AdoNetAppenderParameter"/> class.
+            </summary>
+            <remarks>
+            Default constructor for the AdoNetAppenderParameter class.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AdoNetAppenderParameter.Prepare(System.Data.IDbCommand)">
+            <summary>
+            Prepare the specified database command object.
+            </summary>
+            <param name="command">The command to prepare.</param>
+            <remarks>
+            <para>
+            Prepares the database command object by adding
+            this parameter to its collection of parameters.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AdoNetAppenderParameter.FormatValue(System.Data.IDbCommand,log4net.Core.LoggingEvent)">
+            <summary>
+            Renders the logging event and set the parameter value in the command.
+            </summary>
+            <param name="command">The command containing the parameter.</param>
+            <param name="loggingEvent">The event to be rendered.</param>
+            <remarks>
+            <para>
+            Renders the logging event using this parameters layout
+            object. Sets the value of the parameter on the command object.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppenderParameter.m_parameterName">
+            <summary>
+            The name of this parameter.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppenderParameter.m_dbType">
+            <summary>
+            The database type for this parameter.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppenderParameter.m_inferType">
+            <summary>
+            Flag to infer type rather than use the DbType
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppenderParameter.m_precision">
+            <summary>
+            The precision for this parameter.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppenderParameter.m_scale">
+            <summary>
+            The scale for this parameter.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppenderParameter.m_size">
+            <summary>
+            The size for this parameter.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AdoNetAppenderParameter.m_layout">
+            <summary>
+            The <see cref="T:log4net.Layout.IRawLayout"/> to use to render the
+            logging event into an object for this parameter.
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.AdoNetAppenderParameter.ParameterName">
+            <summary>
+            Gets or sets the name of this parameter.
+            </summary>
+            <value>
+            The name of this parameter.
+            </value>
+            <remarks>
+            <para>
+            The name of this parameter. The parameter name
+            must match up to a named parameter to the SQL stored procedure
+            or prepared statement.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AdoNetAppenderParameter.DbType">
+            <summary>
+            Gets or sets the database type for this parameter.
+            </summary>
+            <value>
+            The database type for this parameter.
+            </value>
+            <remarks>
+            <para>
+            The database type for this parameter. This property should
+            be set to the database type from the <see cref="P:log4net.Appender.AdoNetAppenderParameter.DbType"/>
+            enumeration. See <see cref="P:System.Data.IDataParameter.DbType"/>.
+            </para>
+            <para>
+            This property is optional. If not specified the ADO.NET provider 
+            will attempt to infer the type from the value.
+            </para>
+            </remarks>
+            <seealso cref="P:System.Data.IDataParameter.DbType"/>
+        </member>
+        <member name="P:log4net.Appender.AdoNetAppenderParameter.Precision">
+            <summary>
+            Gets or sets the precision for this parameter.
+            </summary>
+            <value>
+            The precision for this parameter.
+            </value>
+            <remarks>
+            <para>
+            The maximum number of digits used to represent the Value.
+            </para>
+            <para>
+            This property is optional. If not specified the ADO.NET provider 
+            will attempt to infer the precision from the value.
+            </para>
+            </remarks>
+            <seealso cref="P:System.Data.IDbDataParameter.Precision"/>
+        </member>
+        <member name="P:log4net.Appender.AdoNetAppenderParameter.Scale">
+            <summary>
+            Gets or sets the scale for this parameter.
+            </summary>
+            <value>
+            The scale for this parameter.
+            </value>
+            <remarks>
+            <para>
+            The number of decimal places to which Value is resolved.
+            </para>
+            <para>
+            This property is optional. If not specified the ADO.NET provider 
+            will attempt to infer the scale from the value.
+            </para>
+            </remarks>
+            <seealso cref="P:System.Data.IDbDataParameter.Scale"/>
+        </member>
+        <member name="P:log4net.Appender.AdoNetAppenderParameter.Size">
+            <summary>
+            Gets or sets the size for this parameter.
+            </summary>
+            <value>
+            The size for this parameter.
+            </value>
+            <remarks>
+            <para>
+            The maximum size, in bytes, of the data within the column.
+            </para>
+            <para>
+            This property is optional. If not specified the ADO.NET provider 
+            will attempt to infer the size from the value.
+            </para>
+            </remarks>
+            <seealso cref="P:System.Data.IDbDataParameter.Size"/>
+        </member>
+        <member name="P:log4net.Appender.AdoNetAppenderParameter.Layout">
+            <summary>
+            Gets or sets the <see cref="T:log4net.Layout.IRawLayout"/> to use to 
+            render the logging event into an object for this 
+            parameter.
+            </summary>
+            <value>
+            The <see cref="T:log4net.Layout.IRawLayout"/> used to render the
+            logging event into an object for this parameter.
+            </value>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Layout.IRawLayout"/> that renders the value for this
+            parameter.
+            </para>
+            <para>
+            The <see cref="T:log4net.Layout.RawLayoutConverter"/> can be used to adapt
+            any <see cref="T:log4net.Layout.ILayout"/> into a <see cref="T:log4net.Layout.IRawLayout"/>
+            for use in the property.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.AnsiColorTerminalAppender">
+            <summary>
+            Appends logging events to the terminal using ANSI color escape sequences.
+            </summary>
+            <remarks>
+            <para>
+            AnsiColorTerminalAppender appends log events to the standard output stream
+            or the error output stream using a layout specified by the 
+            user. It also allows the color of a specific level of message to be set.
+            </para>
+            <note>
+            This appender expects the terminal to understand the VT100 control set 
+            in order to interpret the color codes. If the terminal or console does not
+            understand the control codes the behavior is not defined.
+            </note>
+            <para>
+            By default, all output is written to the console's standard output stream.
+            The <see cref="P:log4net.Appender.AnsiColorTerminalAppender.Target"/> property can be set to direct the output to the
+            error stream.
+            </para>
+            <para>
+            NOTE: This appender writes each message to the <c>System.Console.Out</c> or 
+            <c>System.Console.Error</c> that is set at the time the event is appended.
+            Therefore it is possible to programmatically redirect the output of this appender 
+            (for example NUnit does this to capture program output). While this is the desired
+            behavior of this appender it may have security implications in your application. 
+            </para>
+            <para>
+            When configuring the ANSI colored terminal appender, a mapping should be
+            specified to map a logging level to a color. For example:
+            </para>
+            <code lang="XML" escaped="true">
+            <mapping>
+            	<level value="ERROR"/>
+            	<foreColor value="White"/>
+            	<backColor value="Red"/>
+                <attributes value="Bright,Underscore"/>
+            </mapping>
+            <mapping>
+            	<level value="DEBUG"/>
+            	<backColor value="Green"/>
+            </mapping>
+            </code>
+            <para>
+            The Level is the standard log4net logging level and ForeColor and BackColor can be any
+            of the following values:
+            <list type="bullet">
+            <item><term>Blue</term><description></description></item>
+            <item><term>Green</term><description></description></item>
+            <item><term>Red</term><description></description></item>
+            <item><term>White</term><description></description></item>
+            <item><term>Yellow</term><description></description></item>
+            <item><term>Purple</term><description></description></item>
+            <item><term>Cyan</term><description></description></item>
+            </list>
+            These color values cannot be combined together to make new colors.
+            </para>
+            <para>
+            The attributes can be any combination of the following:
+            <list type="bullet">
+            <item><term>Bright</term><description>foreground is brighter</description></item>
+            <item><term>Dim</term><description>foreground is dimmer</description></item>
+            <item><term>Underscore</term><description>message is underlined</description></item>
+            <item><term>Blink</term><description>foreground is blinking (does not work on all terminals)</description></item>
+            <item><term>Reverse</term><description>foreground and background are reversed</description></item>
+            <item><term>Hidden</term><description>output is hidden</description></item>
+            <item><term>Strikethrough</term><description>message has a line through it</description></item>
+            </list>
+            While any of these attributes may be combined together not all combinations
+            work well together, for example setting both <i>Bright</i> and <i>Dim</i> attributes makes
+            no sense.
+            </para>
+            </remarks>
+            <author>Patrick Wagstrom</author>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.ConsoleOut">
+            <summary>
+            The <see cref="P:log4net.Appender.AnsiColorTerminalAppender.Target"/> to use when writing to the Console 
+            standard output stream.
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="P:log4net.Appender.AnsiColorTerminalAppender.Target"/> to use when writing to the Console 
+            standard output stream.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.ConsoleError">
+            <summary>
+            The <see cref="P:log4net.Appender.AnsiColorTerminalAppender.Target"/> to use when writing to the Console 
+            standard error output stream.
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="P:log4net.Appender.AnsiColorTerminalAppender.Target"/> to use when writing to the Console 
+            standard error output stream.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.PostEventCodes">
+            <summary>
+            Ansi code to reset terminal
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.AnsiColorTerminalAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.AnsiColorTerminalAppender"/> class.
+            </summary>
+            <remarks>
+            The instance of the <see cref="T:log4net.Appender.AnsiColorTerminalAppender"/> class is set up to write 
+            to the standard output stream.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AnsiColorTerminalAppender.AddMapping(log4net.Appender.AnsiColorTerminalAppender.LevelColors)">
+            <summary>
+            Add a mapping of level to color
+            </summary>
+            <param name="mapping">The mapping to add</param>
+            <remarks>
+            <para>
+            Add a <see cref="T:log4net.Appender.AnsiColorTerminalAppender.LevelColors"/> mapping to this appender.
+            Each mapping defines the foreground and background colours
+            for a level.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AnsiColorTerminalAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            This method is called by the <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/> method.
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            Writes the event to the console.
+            </para>
+            <para>
+            The format of the output will depend on the appender's layout.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AnsiColorTerminalAppender.ActivateOptions">
+            <summary>
+            Initialize the options for this appender
+            </summary>
+            <remarks>
+            <para>
+            Initialize the level to color mappings set on this appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.m_writeToErrorStream">
+            <summary>
+            Flag to write output to the error stream rather than the standard output stream
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.m_levelMapping">
+            <summary>
+            Mapping from level object to color value
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.AnsiColorTerminalAppender.Target">
+            <summary>
+            Target is the value of the console output stream.
+            </summary>
+            <value>
+            Target is the value of the console output stream.
+            This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+            </value>
+            <remarks>
+            <para>
+            Target is the value of the console output stream.
+            This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AnsiColorTerminalAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.AnsiColorTerminalAppender.AnsiAttributes">
+            <summary>
+            The enum of possible display attributes
+            </summary>
+            <remarks>
+            <para>
+            The following flags can be combined together to
+            form the ANSI color attributes.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Appender.AnsiColorTerminalAppender"/>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiAttributes.Bright">
+            <summary>
+            text is bright
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiAttributes.Dim">
+            <summary>
+            text is dim
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiAttributes.Underscore">
+            <summary>
+            text is underlined
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiAttributes.Blink">
+            <summary>
+            text is blinking
+            </summary>
+            <remarks>
+            Not all terminals support this attribute
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiAttributes.Reverse">
+            <summary>
+            text and background colors are reversed
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiAttributes.Hidden">
+            <summary>
+            text is hidden
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiAttributes.Strikethrough">
+            <summary>
+            text is displayed with a strikethrough
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.AnsiColorTerminalAppender.AnsiColor">
+            <summary>
+            The enum of possible foreground or background color values for 
+            use with the color mapping method
+            </summary>
+            <remarks>
+            <para>
+            The output can be in one for the following ANSI colors.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Appender.AnsiColorTerminalAppender"/>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiColor.Black">
+            <summary>
+            color is black
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiColor.Red">
+            <summary>
+            color is red
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiColor.Green">
+            <summary>
+            color is green
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiColor.Yellow">
+            <summary>
+            color is yellow
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiColor.Blue">
+            <summary>
+            color is blue
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiColor.Magenta">
+            <summary>
+            color is magenta
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiColor.Cyan">
+            <summary>
+            color is cyan
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.AnsiColorTerminalAppender.AnsiColor.White">
+            <summary>
+            color is white
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.AnsiColorTerminalAppender.LevelColors">
+            <summary>
+            A class to act as a mapping between the level that a logging call is made at and
+            the color it should be displayed as.
+            </summary>
+            <remarks>
+            <para>
+            Defines the mapping between a level and the color it should be displayed in.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.LevelMappingEntry">
+            <summary>
+            An entry in the <see cref="T:log4net.Util.LevelMapping"/>
+            </summary>
+            <remarks>
+            <para>
+            This is an abstract base class for types that are stored in the
+            <see cref="T:log4net.Util.LevelMapping"/> object.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.LevelMappingEntry.#ctor">
+            <summary>
+            Default protected constructor
+            </summary>
+            <remarks>
+            <para>
+            Default protected constructor
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LevelMappingEntry.ActivateOptions">
+            <summary>
+            Initialize any options defined on this entry
+            </summary>
+            <remarks>
+            <para>
+            Should be overridden by any classes that need to initialise based on their options
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.LevelMappingEntry.Level">
+            <summary>
+            The level that is the key for this mapping 
+            </summary>
+            <value>
+            The <see cref="P:log4net.Util.LevelMappingEntry.Level"/> that is the key for this mapping 
+            </value>
+            <remarks>
+            <para>
+            Get or set the <see cref="P:log4net.Util.LevelMappingEntry.Level"/> that is the key for this
+            mapping subclass.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AnsiColorTerminalAppender.LevelColors.ActivateOptions">
+            <summary>
+            Initialize the options for the object
+            </summary>
+            <remarks>
+            <para>
+            Combine the <see cref="P:log4net.Appender.AnsiColorTerminalAppender.LevelColors.ForeColor"/> and <see cref="P:log4net.Appender.AnsiColorTerminalAppender.LevelColors.BackColor"/> together
+            and append the attributes.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AnsiColorTerminalAppender.LevelColors.ForeColor">
+            <summary>
+            The mapped foreground color for the specified level
+            </summary>
+            <remarks>
+            <para>
+            Required property.
+            The mapped foreground color for the specified level
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AnsiColorTerminalAppender.LevelColors.BackColor">
+            <summary>
+            The mapped background color for the specified level
+            </summary>
+            <remarks>
+            <para>
+            Required property.
+            The mapped background color for the specified level
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AnsiColorTerminalAppender.LevelColors.Attributes">
+            <summary>
+            The color attributes for the specified level
+            </summary>
+            <remarks>
+            <para>
+            Required property.
+            The color attributes for the specified level
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AnsiColorTerminalAppender.LevelColors.CombinedColor">
+            <summary>
+            The combined <see cref="P:log4net.Appender.AnsiColorTerminalAppender.LevelColors.ForeColor"/>, <see cref="P:log4net.Appender.AnsiColorTerminalAppender.LevelColors.BackColor"/> and
+            <see cref="P:log4net.Appender.AnsiColorTerminalAppender.LevelColors.Attributes"/> suitable for setting the ansi terminal color.
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.AppenderCollection">
+            <summary>
+            A strongly-typed collection of <see cref="T:log4net.Appender.IAppender"/> objects.
+            </summary>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.ReadOnly(log4net.Appender.AppenderCollection)">
+            <summary>
+            Creates a read-only wrapper for a <c>AppenderCollection</c> instance.
+            </summary>
+            <param name="list">list to create a readonly wrapper arround</param>
+            <returns>
+            An <c>AppenderCollection</c> wrapper that is read-only.
+            </returns>
+        </member>
+        <member name="F:log4net.Appender.AppenderCollection.EmptyCollection">
+            <summary>
+            An empty readonly static AppenderCollection
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.#ctor">
+            <summary>
+            Initializes a new instance of the <c>AppenderCollection</c> class
+            that is empty and has the default initial capacity.
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.#ctor(System.Int32)">
+            <summary>
+            Initializes a new instance of the <c>AppenderCollection</c> class
+            that has the specified initial capacity.
+            </summary>
+            <param name="capacity">
+            The number of elements that the new <c>AppenderCollection</c> is initially capable of storing.
+            </param>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.#ctor(log4net.Appender.AppenderCollection)">
+            <summary>
+            Initializes a new instance of the <c>AppenderCollection</c> class
+            that contains elements copied from the specified <c>AppenderCollection</c>.
+            </summary>
+            <param name="c">The <c>AppenderCollection</c> whose elements are copied to the new collection.</param>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.#ctor(log4net.Appender.IAppender[])">
+            <summary>
+            Initializes a new instance of the <c>AppenderCollection</c> class
+            that contains elements copied from the specified <see cref="T:log4net.Appender.IAppender"/> array.
+            </summary>
+            <param name="a">The <see cref="T:log4net.Appender.IAppender"/> array whose elements are copied to the new list.</param>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.#ctor(System.Collections.ICollection)">
+            <summary>
+            Initializes a new instance of the <c>AppenderCollection</c> class
+            that contains elements copied from the specified <see cref="T:log4net.Appender.IAppender"/> collection.
+            </summary>
+            <param name="col">The <see cref="T:log4net.Appender.IAppender"/> collection whose elements are copied to the new list.</param>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.#ctor(log4net.Appender.AppenderCollection.Tag)">
+            <summary>
+            Allow subclasses to avoid our default constructors
+            </summary>
+            <param name="tag"></param>
+            <exclude/>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.CopyTo(log4net.Appender.IAppender[])">
+            <summary>
+            Copies the entire <c>AppenderCollection</c> to a one-dimensional
+            <see cref="T:log4net.Appender.IAppender"/> array.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:log4net.Appender.IAppender"/> array to copy to.</param>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.CopyTo(log4net.Appender.IAppender[],System.Int32)">
+            <summary>
+            Copies the entire <c>AppenderCollection</c> to a one-dimensional
+            <see cref="T:log4net.Appender.IAppender"/> array, starting at the specified index of the target array.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:log4net.Appender.IAppender"/> array to copy to.</param>
+            <param name="start">The zero-based index in <paramref name="array"/> at which copying begins.</param>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.Add(log4net.Appender.IAppender)">
+            <summary>
+            Adds a <see cref="T:log4net.Appender.IAppender"/> to the end of the <c>AppenderCollection</c>.
+            </summary>
+            <param name="item">The <see cref="T:log4net.Appender.IAppender"/> to be added to the end of the <c>AppenderCollection</c>.</param>
+            <returns>The index at which the value has been added.</returns>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.Clear">
+            <summary>
+            Removes all elements from the <c>AppenderCollection</c>.
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.Clone">
+            <summary>
+            Creates a shallow copy of the <see cref="T:log4net.Appender.AppenderCollection"/>.
+            </summary>
+            <returns>A new <see cref="T:log4net.Appender.AppenderCollection"/> with a shallow copy of the collection data.</returns>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.Contains(log4net.Appender.IAppender)">
+            <summary>
+            Determines whether a given <see cref="T:log4net.Appender.IAppender"/> is in the <c>AppenderCollection</c>.
+            </summary>
+            <param name="item">The <see cref="T:log4net.Appender.IAppender"/> to check for.</param>
+            <returns><c>true</c> if <paramref name="item"/> is found in the <c>AppenderCollection</c>; otherwise, <c>false</c>.</returns>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.IndexOf(log4net.Appender.IAppender)">
+            <summary>
+            Returns the zero-based index of the first occurrence of a <see cref="T:log4net.Appender.IAppender"/>
+            in the <c>AppenderCollection</c>.
+            </summary>
+            <param name="item">The <see cref="T:log4net.Appender.IAppender"/> to locate in the <c>AppenderCollection</c>.</param>
+            <returns>
+            The zero-based index of the first occurrence of <paramref name="item"/> 
+            in the entire <c>AppenderCollection</c>, if found; otherwise, -1.
+            </returns>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.Insert(System.Int32,log4net.Appender.IAppender)">
+            <summary>
+            Inserts an element into the <c>AppenderCollection</c> at the specified index.
+            </summary>
+            <param name="index">The zero-based index at which <paramref name="item"/> should be inserted.</param>
+            <param name="item">The <see cref="T:log4net.Appender.IAppender"/> to insert.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            <para><paramref name="index"/> is less than zero</para>
+            <para>-or-</para>
+            <para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Appender.AppenderCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.Remove(log4net.Appender.IAppender)">
+            <summary>
+            Removes the first occurrence of a specific <see cref="T:log4net.Appender.IAppender"/> from the <c>AppenderCollection</c>.
+            </summary>
+            <param name="item">The <see cref="T:log4net.Appender.IAppender"/> to remove from the <c>AppenderCollection</c>.</param>
+            <exception cref="T:System.ArgumentException">
+            The specified <see cref="T:log4net.Appender.IAppender"/> was not found in the <c>AppenderCollection</c>.
+            </exception>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.RemoveAt(System.Int32)">
+            <summary>
+            Removes the element at the specified index of the <c>AppenderCollection</c>.
+            </summary>
+            <param name="index">The zero-based index of the element to remove.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            <para><paramref name="index"/> is less than zero</para>
+            <para>-or-</para>
+            <para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Appender.AppenderCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.GetEnumerator">
+            <summary>
+            Returns an enumerator that can iterate through the <c>AppenderCollection</c>.
+            </summary>
+            <returns>An <see cref="T:log4net.Appender.AppenderCollection.Enumerator"/> for the entire <c>AppenderCollection</c>.</returns>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.AddRange(log4net.Appender.AppenderCollection)">
+            <summary>
+            Adds the elements of another <c>AppenderCollection</c> to the current <c>AppenderCollection</c>.
+            </summary>
+            <param name="x">The <c>AppenderCollection</c> whose elements should be added to the end of the current <c>AppenderCollection</c>.</param>
+            <returns>The new <see cref="P:log4net.Appender.AppenderCollection.Count"/> of the <c>AppenderCollection</c>.</returns>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.AddRange(log4net.Appender.IAppender[])">
+            <summary>
+            Adds the elements of a <see cref="T:log4net.Appender.IAppender"/> array to the current <c>AppenderCollection</c>.
+            </summary>
+            <param name="x">The <see cref="T:log4net.Appender.IAppender"/> array whose elements should be added to the end of the <c>AppenderCollection</c>.</param>
+            <returns>The new <see cref="P:log4net.Appender.AppenderCollection.Count"/> of the <c>AppenderCollection</c>.</returns>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.AddRange(System.Collections.ICollection)">
+            <summary>
+            Adds the elements of a <see cref="T:log4net.Appender.IAppender"/> collection to the current <c>AppenderCollection</c>.
+            </summary>
+            <param name="col">The <see cref="T:log4net.Appender.IAppender"/> collection whose elements should be added to the end of the <c>AppenderCollection</c>.</param>
+            <returns>The new <see cref="P:log4net.Appender.AppenderCollection.Count"/> of the <c>AppenderCollection</c>.</returns>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.TrimToSize">
+            <summary>
+            Sets the capacity to the actual number of elements.
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.ToArray">
+            <summary>
+            Return the collection elements as an array
+            </summary>
+            <returns>the array</returns>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.ValidateIndex(System.Int32)">
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            <para><paramref name="index"/> is less than zero</para>
+            <para>-or-</para>
+            <para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Appender.AppenderCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.ValidateIndex(System.Int32,System.Boolean)">
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            <para><paramref name="index"/> is less than zero</para>
+            <para>-or-</para>
+            <para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Appender.AppenderCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="P:log4net.Appender.AppenderCollection.Count">
+            <summary>
+            Gets the number of elements actually contained in the <c>AppenderCollection</c>.
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.AppenderCollection.IsSynchronized">
+            <summary>
+            Gets a value indicating whether access to the collection is synchronized (thread-safe).
+            </summary>
+            <returns>true if access to the ICollection is synchronized (thread-safe); otherwise, false.</returns>
+        </member>
+        <member name="P:log4net.Appender.AppenderCollection.SyncRoot">
+            <summary>
+            Gets an object that can be used to synchronize access to the collection.
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.AppenderCollection.Item(System.Int32)">
+            <summary>
+            Gets or sets the <see cref="T:log4net.Appender.IAppender"/> at the specified index.
+            </summary>
+            <param name="index">The zero-based index of the element to get or set.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            	<para><paramref name="index"/> is less than zero</para>
+            	<para>-or-</para>
+            	<para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Appender.AppenderCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="P:log4net.Appender.AppenderCollection.IsFixedSize">
+            <summary>
+            Gets a value indicating whether the collection has a fixed size.
+            </summary>
+            <value>true if the collection has a fixed size; otherwise, false. The default is false</value>
+        </member>
+        <member name="P:log4net.Appender.AppenderCollection.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the IList is read-only.
+            </summary>
+            <value>true if the collection is read-only; otherwise, false. The default is false</value>
+        </member>
+        <member name="P:log4net.Appender.AppenderCollection.Capacity">
+            <summary>
+            Gets or sets the number of elements the <c>AppenderCollection</c> can contain.
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.AppenderCollection.IAppenderCollectionEnumerator">
+            <summary>
+            Supports type-safe iteration over a <see cref="T:log4net.Appender.AppenderCollection"/>.
+            </summary>
+            <exclude/>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.IAppenderCollectionEnumerator.MoveNext">
+            <summary>
+            Advances the enumerator to the next element in the collection.
+            </summary>
+            <returns>
+            <c>true</c> if the enumerator was successfully advanced to the next element; 
+            <c>false</c> if the enumerator has passed the end of the collection.
+            </returns>
+            <exception cref="T:System.InvalidOperationException">
+            The collection was modified after the enumerator was created.
+            </exception>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.IAppenderCollectionEnumerator.Reset">
+            <summary>
+            Sets the enumerator to its initial position, before the first element in the collection.
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.AppenderCollection.IAppenderCollectionEnumerator.Current">
+            <summary>
+            Gets the current element in the collection.
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.AppenderCollection.Tag">
+            <summary>
+            Type visible only to our subclasses
+            Used to access protected constructor
+            </summary>
+            <exclude/>
+        </member>
+        <member name="F:log4net.Appender.AppenderCollection.Tag.Default">
+            <summary>
+            A value
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.AppenderCollection.Enumerator">
+            <summary>
+            Supports simple iteration over a <see cref="T:log4net.Appender.AppenderCollection"/>.
+            </summary>
+            <exclude/>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.Enumerator.#ctor(log4net.Appender.AppenderCollection)">
+            <summary>
+            Initializes a new instance of the <c>Enumerator</c> class.
+            </summary>
+            <param name="tc"></param>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.Enumerator.MoveNext">
+            <summary>
+            Advances the enumerator to the next element in the collection.
+            </summary>
+            <returns>
+            <c>true</c> if the enumerator was successfully advanced to the next element; 
+            <c>false</c> if the enumerator has passed the end of the collection.
+            </returns>
+            <exception cref="T:System.InvalidOperationException">
+            The collection was modified after the enumerator was created.
+            </exception>
+        </member>
+        <member name="M:log4net.Appender.AppenderCollection.Enumerator.Reset">
+            <summary>
+            Sets the enumerator to its initial position, before the first element in the collection.
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.AppenderCollection.Enumerator.Current">
+            <summary>
+            Gets the current element in the collection.
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.AppenderCollection.ReadOnlyAppenderCollection">
+            <exclude/>
+        </member>
+        <member name="T:log4net.Appender.AspNetTraceAppender">
+            <summary>
+            <para>
+            Appends log events to the ASP.NET <see cref="T:System.Web.TraceContext"/> system.
+            </para>
+            </summary>
+            <remarks>
+            <para>
+            Diagnostic information and tracing messages that you specify are appended to the output 
+            of the page that is sent to the requesting browser. Optionally, you can view this information
+            from a separate trace viewer (Trace.axd) that displays trace information for every page in a 
+            given application.
+            </para>
+            <para>
+            Trace statements are processed and displayed only when tracing is enabled. You can control 
+            whether tracing is displayed to a page, to the trace viewer, or both.
+            </para>
+            <para>
+            The logging event is passed to the <see cref="M:System.Web.TraceContext.Write(System.String)"/> or 
+            <see cref="M:System.Web.TraceContext.Warn(System.String)"/> method depending on the level of the logging event.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Appender.AspNetTraceAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.AspNetTraceAppender"/> class.
+            </summary>
+            <remarks>
+            <para>
+            Default constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.AspNetTraceAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            Write the logging event to the ASP.NET trace
+            </summary>
+            <param name="loggingEvent">the event to log</param>
+            <remarks>
+            <para>
+            Write the logging event to the ASP.NET trace
+            <c>HttpContext.Current.Trace</c> 
+            (<see cref="T:System.Web.TraceContext"/>).
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.AspNetTraceAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.BufferingForwardingAppender">
+            <summary>
+            Buffers events and then forwards them to attached appenders.
+            </summary>
+            <remarks>
+            <para>
+            The events are buffered in this appender until conditions are
+            met to allow the appender to deliver the events to the attached 
+            appenders. See <see cref="T:log4net.Appender.BufferingAppenderSkeleton"/> for the
+            conditions that cause the buffer to be sent.
+            </para>
+            <para>The forwarding appender can be used to specify different 
+            thresholds and filters for the same appender at different locations 
+            within the hierarchy.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Core.IAppenderAttachable">
+            <summary>
+            Interface for attaching appenders to objects.
+            </summary>
+            <remarks>
+            <para>
+            Interface for attaching, removing and retrieving appenders.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Core.IAppenderAttachable.AddAppender(log4net.Appender.IAppender)">
+            <summary>
+            Attaches an appender.
+            </summary>
+            <param name="appender">The appender to add.</param>
+            <remarks>
+            <para>
+            Add the specified appender. The implementation may
+            choose to allow or deny duplicate appenders.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.IAppenderAttachable.GetAppender(System.String)">
+            <summary>
+            Gets an attached appender with the specified name.
+            </summary>
+            <param name="name">The name of the appender to get.</param>
+            <returns>
+            The appender with the name specified, or <c>null</c> if no appender with the
+            specified name is found.
+            </returns>
+            <remarks>
+            <para>
+            Returns an attached appender with the <paramref name="name"/> specified.
+            If no appender with the specified name is found <c>null</c> will be
+            returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.IAppenderAttachable.RemoveAllAppenders">
+            <summary>
+            Removes all attached appenders.
+            </summary>
+            <remarks>
+            <para>
+            Removes and closes all attached appenders
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.IAppenderAttachable.RemoveAppender(log4net.Appender.IAppender)">
+            <summary>
+            Removes the specified appender from the list of attached appenders.
+            </summary>
+            <param name="appender">The appender to remove.</param>
+            <returns>The appender removed from the list</returns>
+            <remarks>
+            <para>
+            The appender removed is not closed.
+            If you are discarding the appender you must call
+            <see cref="M:log4net.Appender.IAppender.Close"/> on the appender removed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.IAppenderAttachable.RemoveAppender(System.String)">
+            <summary>
+            Removes the appender with the specified name from the list of appenders.
+            </summary>
+            <param name="name">The name of the appender to remove.</param>
+            <returns>The appender removed from the list</returns>
+            <remarks>
+            <para>
+            The appender removed is not closed.
+            If you are discarding the appender you must call
+            <see cref="M:log4net.Appender.IAppender.Close"/> on the appender removed.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.IAppenderAttachable.Appenders">
+            <summary>
+            Gets all attached appenders.
+            </summary>
+            <value>
+            A collection of attached appenders.
+            </value>
+            <remarks>
+            <para>
+            Gets a collection of attached appenders.
+            If there are no attached appenders the
+            implementation should return an empty 
+            collection rather than <c>null</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingForwardingAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.BufferingForwardingAppender"/> class.
+            </summary>
+            <remarks>
+            <para>
+            Default constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingForwardingAppender.OnClose">
+            <summary>
+            Closes the appender and releases resources.
+            </summary>
+            <remarks>
+            <para>
+            Releases any resources allocated within the appender such as file handles, 
+            network connections, etc.
+            </para>
+            <para>
+            It is a programming error to append to a closed appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingForwardingAppender.SendBuffer(log4net.Core.LoggingEvent[])">
+            <summary>
+            Send the events.
+            </summary>
+            <param name="events">The events that need to be send.</param>
+            <remarks>
+            <para>
+            Forwards the events to the attached appenders.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingForwardingAppender.AddAppender(log4net.Appender.IAppender)">
+            <summary>
+            Adds an <see cref="T:log4net.Appender.IAppender"/> to the list of appenders of this
+            instance.
+            </summary>
+            <param name="newAppender">The <see cref="T:log4net.Appender.IAppender"/> to add to this appender.</param>
+            <remarks>
+            <para>
+            If the specified <see cref="T:log4net.Appender.IAppender"/> is already in the list of
+            appenders, then it won't be added again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingForwardingAppender.GetAppender(System.String)">
+            <summary>
+            Looks for the appender with the specified name.
+            </summary>
+            <param name="name">The name of the appender to lookup.</param>
+            <returns>
+            The appender with the specified name, or <c>null</c>.
+            </returns>
+            <remarks>
+            <para>
+            Get the named appender attached to this buffering appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingForwardingAppender.RemoveAllAppenders">
+            <summary>
+            Removes all previously added appenders from this appender.
+            </summary>
+            <remarks>
+            <para>
+            This is useful when re-reading configuration information.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingForwardingAppender.RemoveAppender(log4net.Appender.IAppender)">
+            <summary>
+            Removes the specified appender from the list of appenders.
+            </summary>
+            <param name="appender">The appender to remove.</param>
+            <returns>The appender removed from the list</returns>
+            <remarks>
+            The appender removed is not closed.
+            If you are discarding the appender you must call
+            <see cref="M:log4net.Appender.IAppender.Close"/> on the appender removed.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.BufferingForwardingAppender.RemoveAppender(System.String)">
+            <summary>
+            Removes the appender with the specified name from the list of appenders.
+            </summary>
+            <param name="name">The name of the appender to remove.</param>
+            <returns>The appender removed from the list</returns>
+            <remarks>
+            The appender removed is not closed.
+            If you are discarding the appender you must call
+            <see cref="M:log4net.Appender.IAppender.Close"/> on the appender removed.
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.BufferingForwardingAppender.m_appenderAttachedImpl">
+            <summary>
+            Implementation of the <see cref="T:log4net.Core.IAppenderAttachable"/> interface
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.BufferingForwardingAppender.Appenders">
+            <summary>
+            Gets the appenders contained in this appender as an 
+            <see cref="T:System.Collections.ICollection"/>.
+            </summary>
+            <remarks>
+            If no appenders can be found, then an <see cref="T:log4net.Util.EmptyCollection"/> 
+            is returned.
+            </remarks>
+            <returns>
+            A collection of the appenders in this appender.
+            </returns>
+        </member>
+        <member name="T:log4net.Appender.ColoredConsoleAppender">
+            <summary>
+            Appends logging events to the console.
+            </summary>
+            <remarks>
+            <para>
+            ColoredConsoleAppender appends log events to the standard output stream
+            or the error output stream using a layout specified by the 
+            user. It also allows the color of a specific type of message to be set.
+            </para>
+            <para>
+            By default, all output is written to the console's standard output stream.
+            The <see cref="P:log4net.Appender.ColoredConsoleAppender.Target"/> property can be set to direct the output to the
+            error stream.
+            </para>
+            <para>
+            NOTE: This appender writes directly to the application's attached console
+            not to the <c>System.Console.Out</c> or <c>System.Console.Error</c> <c>TextWriter</c>.
+            The <c>System.Console.Out</c> and <c>System.Console.Error</c> streams can be
+            programmatically redirected (for example NUnit does this to capture program output).
+            This appender will ignore these redirections because it needs to use Win32
+            API calls to colorize the output. To respect these redirections the <see cref="T:log4net.Appender.ConsoleAppender"/>
+            must be used.
+            </para>
+            <para>
+            When configuring the colored console appender, mapping should be
+            specified to map a logging level to a color. For example:
+            </para>
+            <code lang="XML" escaped="true">
+            <mapping>
+            	<level value="ERROR"/>
+            	<foreColor value="White"/>
+            	<backColor value="Red, HighIntensity"/>
+            </mapping>
+            <mapping>
+            	<level value="DEBUG"/>
+            	<backColor value="Green"/>
+            </mapping>
+            </code>
+            <para>
+            The Level is the standard log4net logging level and ForeColor and BackColor can be any
+            combination of the following values:
+            <list type="bullet">
+            <item><term>Blue</term><description></description></item>
+            <item><term>Green</term><description></description></item>
+            <item><term>Red</term><description></description></item>
+            <item><term>White</term><description></description></item>
+            <item><term>Yellow</term><description></description></item>
+            <item><term>Purple</term><description></description></item>
+            <item><term>Cyan</term><description></description></item>
+            <item><term>HighIntensity</term><description></description></item>
+            </list>
+            </para>
+            </remarks>
+            <author>Rick Hobbs</author>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Appender.ColoredConsoleAppender.ConsoleOut">
+            <summary>
+            The <see cref="P:log4net.Appender.ColoredConsoleAppender.Target"/> to use when writing to the Console 
+            standard output stream.
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="P:log4net.Appender.ColoredConsoleAppender.Target"/> to use when writing to the Console 
+            standard output stream.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.ColoredConsoleAppender.ConsoleError">
+            <summary>
+            The <see cref="P:log4net.Appender.ColoredConsoleAppender.Target"/> to use when writing to the Console 
+            standard error output stream.
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="P:log4net.Appender.ColoredConsoleAppender.Target"/> to use when writing to the Console 
+            standard error output stream.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ColoredConsoleAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.ColoredConsoleAppender"/> class.
+            </summary>
+            <remarks>
+            The instance of the <see cref="T:log4net.Appender.ColoredConsoleAppender"/> class is set up to write 
+            to the standard output stream.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ColoredConsoleAppender.#ctor(log4net.Layout.ILayout)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.ColoredConsoleAppender"/> class
+            with the specified layout.
+            </summary>
+            <param name="layout">the layout to use for this appender</param>
+            <remarks>
+            The instance of the <see cref="T:log4net.Appender.ColoredConsoleAppender"/> class is set up to write 
+            to the standard output stream.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ColoredConsoleAppender.#ctor(log4net.Layout.ILayout,System.Boolean)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.ColoredConsoleAppender"/> class
+            with the specified layout.
+            </summary>
+            <param name="layout">the layout to use for this appender</param>
+            <param name="writeToErrorStream">flag set to <c>true</c> to write to the console error stream</param>
+            <remarks>
+            When <paramref name="writeToErrorStream"/> is set to <c>true</c>, output is written to
+            the standard error output stream.  Otherwise, output is written to the standard
+            output stream.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ColoredConsoleAppender.AddMapping(log4net.Appender.ColoredConsoleAppender.LevelColors)">
+            <summary>
+            Add a mapping of level to color - done by the config file
+            </summary>
+            <param name="mapping">The mapping to add</param>
+            <remarks>
+            <para>
+            Add a <see cref="T:log4net.Appender.ColoredConsoleAppender.LevelColors"/> mapping to this appender.
+            Each mapping defines the foreground and background colors
+            for a level.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ColoredConsoleAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            This method is called by the <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/> method.
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            Writes the event to the console.
+            </para>
+            <para>
+            The format of the output will depend on the appender's layout.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ColoredConsoleAppender.ActivateOptions">
+            <summary>
+            Initialize the options for this appender
+            </summary>
+            <remarks>
+            <para>
+            Initialize the level to color mappings set on this appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.ColoredConsoleAppender.m_writeToErrorStream">
+            <summary>
+            Flag to write output to the error stream rather than the standard output stream
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.ColoredConsoleAppender.m_levelMapping">
+            <summary>
+            Mapping from level object to color value
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.ColoredConsoleAppender.m_consoleOutputWriter">
+            <summary>
+            The console output stream writer to write to
+            </summary>
+            <remarks>
+            <para>
+            This writer is not thread safe.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.ColoredConsoleAppender.Target">
+            <summary>
+            Target is the value of the console output stream.
+            This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+            </summary>
+            <value>
+            Target is the value of the console output stream.
+            This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+            </value>
+            <remarks>
+            <para>
+            Target is the value of the console output stream.
+            This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.ColoredConsoleAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.ColoredConsoleAppender.Colors">
+            <summary>
+            The enum of possible color values for use with the color mapping method
+            </summary>
+            <remarks>
+            <para>
+            The following flags can be combined together to
+            form the colors.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Appender.ColoredConsoleAppender"/>
+        </member>
+        <member name="F:log4net.Appender.ColoredConsoleAppender.Colors.Blue">
+            <summary>
+            color is blue
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.ColoredConsoleAppender.Colors.Green">
+            <summary>
+            color is green
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.ColoredConsoleAppender.Colors.Red">
+            <summary>
+            color is red
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.ColoredConsoleAppender.Colors.White">
+            <summary>
+            color is white
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.ColoredConsoleAppender.Colors.Yellow">
+            <summary>
+            color is yellow
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.ColoredConsoleAppender.Colors.Purple">
+            <summary>
+            color is purple
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.ColoredConsoleAppender.Colors.Cyan">
+            <summary>
+            color is cyan
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.ColoredConsoleAppender.Colors.HighIntensity">
+            <summary>
+            color is intensified
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.ColoredConsoleAppender.LevelColors">
+            <summary>
+            A class to act as a mapping between the level that a logging call is made at and
+            the color it should be displayed as.
+            </summary>
+            <remarks>
+            <para>
+            Defines the mapping between a level and the color it should be displayed in.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ColoredConsoleAppender.LevelColors.ActivateOptions">
+            <summary>
+            Initialize the options for the object
+            </summary>
+            <remarks>
+            <para>
+            Combine the <see cref="P:log4net.Appender.ColoredConsoleAppender.LevelColors.ForeColor"/> and <see cref="P:log4net.Appender.ColoredConsoleAppender.LevelColors.BackColor"/> together.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.ColoredConsoleAppender.LevelColors.ForeColor">
+            <summary>
+            The mapped foreground color for the specified level
+            </summary>
+            <remarks>
+            <para>
+            Required property.
+            The mapped foreground color for the specified level.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.ColoredConsoleAppender.LevelColors.BackColor">
+            <summary>
+            The mapped background color for the specified level
+            </summary>
+            <remarks>
+            <para>
+            Required property.
+            The mapped background color for the specified level.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.ColoredConsoleAppender.LevelColors.CombinedColor">
+            <summary>
+            The combined <see cref="P:log4net.Appender.ColoredConsoleAppender.LevelColors.ForeColor"/> and <see cref="P:log4net.Appender.ColoredConsoleAppender.LevelColors.BackColor"/> suitable for 
+            setting the console color.
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.ConsoleAppender">
+            <summary>
+            Appends logging events to the console.
+            </summary>
+            <remarks>
+            <para>
+            ConsoleAppender appends log events to the standard output stream
+            or the error output stream using a layout specified by the 
+            user.
+            </para>
+            <para>
+            By default, all output is written to the console's standard output stream.
+            The <see cref="P:log4net.Appender.ConsoleAppender.Target"/> property can be set to direct the output to the
+            error stream.
+            </para>
+            <para>
+            NOTE: This appender writes each message to the <c>System.Console.Out</c> or 
+            <c>System.Console.Error</c> that is set at the time the event is appended.
+            Therefore it is possible to programmatically redirect the output of this appender 
+            (for example NUnit does this to capture program output). While this is the desired
+            behavior of this appender it may have security implications in your application. 
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="F:log4net.Appender.ConsoleAppender.ConsoleOut">
+            <summary>
+            The <see cref="P:log4net.Appender.ConsoleAppender.Target"/> to use when writing to the Console 
+            standard output stream.
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="P:log4net.Appender.ConsoleAppender.Target"/> to use when writing to the Console 
+            standard output stream.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.ConsoleAppender.ConsoleError">
+            <summary>
+            The <see cref="P:log4net.Appender.ConsoleAppender.Target"/> to use when writing to the Console 
+            standard error output stream.
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="P:log4net.Appender.ConsoleAppender.Target"/> to use when writing to the Console 
+            standard error output stream.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ConsoleAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.ConsoleAppender"/> class.
+            </summary>
+            <remarks>
+            The instance of the <see cref="T:log4net.Appender.ConsoleAppender"/> class is set up to write 
+            to the standard output stream.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ConsoleAppender.#ctor(log4net.Layout.ILayout)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.ConsoleAppender"/> class
+            with the specified layout.
+            </summary>
+            <param name="layout">the layout to use for this appender</param>
+            <remarks>
+            The instance of the <see cref="T:log4net.Appender.ConsoleAppender"/> class is set up to write 
+            to the standard output stream.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ConsoleAppender.#ctor(log4net.Layout.ILayout,System.Boolean)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.ConsoleAppender"/> class
+            with the specified layout.
+            </summary>
+            <param name="layout">the layout to use for this appender</param>
+            <param name="writeToErrorStream">flag set to <c>true</c> to write to the console error stream</param>
+            <remarks>
+            When <paramref name="writeToErrorStream"/> is set to <c>true</c>, output is written to
+            the standard error output stream.  Otherwise, output is written to the standard
+            output stream.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ConsoleAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            This method is called by the <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/> method.
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            Writes the event to the console.
+            </para>
+            <para>
+            The format of the output will depend on the appender's layout.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.ConsoleAppender.Target">
+            <summary>
+            Target is the value of the console output stream.
+            This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+            </summary>
+            <value>
+            Target is the value of the console output stream.
+            This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+            </value>
+            <remarks>
+            <para>
+            Target is the value of the console output stream.
+            This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.ConsoleAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.DebugAppender">
+            <summary>
+            Appends log events to the <see cref="T:System.Diagnostics.Debug"/> system.
+            </summary>
+            <remarks>
+            <para>
+            The application configuration file can be used to control what listeners 
+            are actually used. See the MSDN documentation for the 
+            <see cref="T:System.Diagnostics.Debug"/> class for details on configuring the
+            debug system.
+            </para>
+            <para>
+            Events are written using the <see cref="M:System.Diagnostics.Debug.Write(System.String,System.String)"/>
+            method. The event's logger name is passed as the value for the category name to the Write method.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Appender.DebugAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.DebugAppender"/>.
+            </summary>
+            <remarks>
+            <para>
+            Default constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.DebugAppender.#ctor(log4net.Layout.ILayout)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.DebugAppender"/> 
+            with a specified layout.
+            </summary>
+            <param name="layout">The layout to use with this appender.</param>
+            <remarks>
+            <para>
+            Obsolete constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.DebugAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            Writes the logging event to the <see cref="T:System.Diagnostics.Debug"/> system.
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            Writes the logging event to the <see cref="T:System.Diagnostics.Debug"/> system.
+            If <see cref="P:log4net.Appender.DebugAppender.ImmediateFlush"/> is <c>true</c> then the <see cref="M:System.Diagnostics.Debug.Flush"/>
+            is called.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.DebugAppender.m_immediateFlush">
+            <summary>
+            Immediate flush means that the underlying writer or output stream
+            will be flushed at the end of each append operation.
+            </summary>
+            <remarks>
+            <para>
+            Immediate flush is slower but ensures that each append request is 
+            actually written. If <see cref="P:log4net.Appender.DebugAppender.ImmediateFlush"/> is set to
+            <c>false</c>, then there is a good chance that the last few
+            logs events are not actually written to persistent media if and
+            when the application crashes.
+            </para>
+            <para>
+            The default value is <c>true</c>.</para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.DebugAppender.ImmediateFlush">
+            <summary>
+            Gets or sets a value that indicates whether the appender will 
+            flush at the end of each write.
+            </summary>
+            <remarks>
+            <para>The default behavior is to flush at the end of each 
+            write. If the option is set to<c>false</c>, then the underlying 
+            stream can defer writing to physical medium to a later time. 
+            </para>
+            <para>
+            Avoiding the flush operation at the end of each append results 
+            in a performance gain of 10 to 20 percent. However, there is safety
+            trade-off involved in skipping flushing. Indeed, when flushing is
+            skipped, then it is likely that the last few log events will not
+            be recorded on disk when the application exits. This is a high
+            price to pay even for a 20% performance gain.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.DebugAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.EventLogAppender">
+            <summary>
+            Writes events to the system event log.
+            </summary>
+            <remarks>
+            <para>
+            The <c>EventID</c> of the event log entry can be
+            set using the <c>EventLogEventID</c> property (<see cref="P:log4net.Core.LoggingEvent.Properties"/>)
+            on the <see cref="T:log4net.Core.LoggingEvent"/>.
+            </para>
+            <para>
+            There is a limit of 32K characters for an event log message
+            </para>
+            <para>
+            When configuring the EventLogAppender a mapping can be
+            specified to map a logging level to an event log entry type. For example:
+            </para>
+            <code lang="XML">
+            &lt;mapping&gt;
+            	&lt;level value="ERROR" /&gt;
+            	&lt;eventLogEntryType value="Error" /&gt;
+            &lt;/mapping&gt;
+            &lt;mapping&gt;
+            	&lt;level value="DEBUG" /&gt;
+            	&lt;eventLogEntryType value="Information" /&gt;
+            &lt;/mapping&gt;
+            </code>
+            <para>
+            The Level is the standard log4net logging level and eventLogEntryType can be any value
+            from the <see cref="T:System.Diagnostics.EventLogEntryType"/> enum, i.e.:
+            <list type="bullet">
+            <item><term>Error</term><description>an error event</description></item>
+            <item><term>Warning</term><description>a warning event</description></item>
+            <item><term>Information</term><description>an informational event</description></item>
+            </list>
+            </para>
+            </remarks>
+            <author>Aspi Havewala</author>
+            <author>Douglas de la Torre</author>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+            <author>Thomas Voss</author>
+        </member>
+        <member name="M:log4net.Appender.EventLogAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.EventLogAppender"/> class.
+            </summary>
+            <remarks>
+            <para>
+            Default constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.EventLogAppender.#ctor(log4net.Layout.ILayout)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.EventLogAppender"/> class
+            with the specified <see cref="T:log4net.Layout.ILayout"/>.
+            </summary>
+            <param name="layout">The <see cref="T:log4net.Layout.ILayout"/> to use with this appender.</param>
+            <remarks>
+            <para>
+            Obsolete constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.EventLogAppender.AddMapping(log4net.Appender.EventLogAppender.Level2EventLogEntryType)">
+            <summary>
+            Add a mapping of level to <see cref="T:System.Diagnostics.EventLogEntryType"/> - done by the config file
+            </summary>
+            <param name="mapping">The mapping to add</param>
+            <remarks>
+            <para>
+            Add a <see cref="T:log4net.Appender.EventLogAppender.Level2EventLogEntryType"/> mapping to this appender.
+            Each mapping defines the event log entry type for a level.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.EventLogAppender.ActivateOptions">
+            <summary>
+            Initialize the appender based on the options set
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Appender.EventLogAppender.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Appender.EventLogAppender.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Appender.EventLogAppender.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.EventLogAppender.CreateEventSource(System.String,System.String,System.String)">
+            <summary>
+            Create an event log source
+            </summary>
+            <remarks>
+            Uses different API calls under NET_2_0
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.EventLogAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            This method is called by the <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/>
+            method. 
+            </summary>
+            <param name="loggingEvent">the event to log</param>
+            <remarks>
+            <para>Writes the event to the system event log using the 
+            <see cref="P:log4net.Appender.EventLogAppender.ApplicationName"/>.</para>
+            
+            <para>If the event has an <c>EventID</c> property (see <see cref="P:log4net.Core.LoggingEvent.Properties"/>)
+            set then this integer will be used as the event log event id.</para>
+            
+            <para>
+            There is a limit of 32K characters for an event log message
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.EventLogAppender.GetEntryType(log4net.Core.Level)">
+            <summary>
+            Get the equivalent <see cref="T:System.Diagnostics.EventLogEntryType"/> for a <see cref="T:log4net.Core.Level"/> <paramref name="p"/>
+            </summary>
+            <param name="level">the Level to convert to an EventLogEntryType</param>
+            <returns>The equivalent <see cref="T:System.Diagnostics.EventLogEntryType"/> for a <see cref="T:log4net.Core.Level"/> <paramref name="p"/></returns>
+            <remarks>
+            Because there are fewer applicable <see cref="T:System.Diagnostics.EventLogEntryType"/>
+            values to use in logging levels than there are in the 
+            <see cref="T:log4net.Core.Level"/> this is a one way mapping. There is
+            a loss of information during the conversion.
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.EventLogAppender.m_logName">
+            <summary>
+            The log name is the section in the event logs where the messages
+            are stored.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.EventLogAppender.m_applicationName">
+            <summary>
+            Name of the application to use when logging.  This appears in the
+            application column of the event log named by <see cref="F:log4net.Appender.EventLogAppender.m_logName"/>.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.EventLogAppender.m_machineName">
+            <summary>
+            The name of the machine which holds the event log. This is
+            currently only allowed to be '.' i.e. the current machine.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.EventLogAppender.m_levelMapping">
+            <summary>
+            Mapping from level object to EventLogEntryType
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.EventLogAppender.m_securityContext">
+            <summary>
+            The security context to use for privileged calls
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.EventLogAppender.LogName">
+            <summary>
+            The name of the log where messages will be stored.
+            </summary>
+            <value>
+            The string name of the log where messages will be stored.
+            </value>
+            <remarks>
+            <para>This is the name of the log as it appears in the Event Viewer
+            tree. The default value is to log into the <c>Application</c>
+            log, this is where most applications write their events. However
+            if you need a separate log for your application (or applications)
+            then you should set the <see cref="P:log4net.Appender.EventLogAppender.LogName"/> appropriately.</para>
+            <para>This should not be used to distinguish your event log messages
+            from those of other applications, the <see cref="P:log4net.Appender.EventLogAppender.ApplicationName"/>
+            property should be used to distinguish events. This property should be 
+            used to group together events into a single log.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.EventLogAppender.ApplicationName">
+            <summary>
+            Property used to set the Application name.  This appears in the
+            event logs when logging.
+            </summary>
+            <value>
+            The string used to distinguish events from different sources.
+            </value>
+            <remarks>
+            Sets the event log source property.
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.EventLogAppender.MachineName">
+            <summary>
+            This property is used to return the name of the computer to use
+            when accessing the event logs.  Currently, this is the current
+            computer, denoted by a dot "."
+            </summary>
+            <value>
+            The string name of the machine holding the event log that 
+            will be logged into.
+            </value>
+            <remarks>
+            This property cannot be changed. It is currently set to '.'
+            i.e. the local machine. This may be changed in future.
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.EventLogAppender.SecurityContext">
+            <summary>
+            Gets or sets the <see cref="P:log4net.Appender.EventLogAppender.SecurityContext"/> used to write to the EventLog.
+            </summary>
+            <value>
+            The <see cref="P:log4net.Appender.EventLogAppender.SecurityContext"/> used to write to the EventLog.
+            </value>
+            <remarks>
+            <para>
+            The system security context used to write to the EventLog.
+            </para>
+            <para>
+            Unless a <see cref="P:log4net.Appender.EventLogAppender.SecurityContext"/> specified here for this appender
+            the <see cref="P:log4net.Core.SecurityContextProvider.DefaultProvider"/> is queried for the
+            security context to use. The default behavior is to use the security context
+            of the current thread.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.EventLogAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.EventLogAppender.Level2EventLogEntryType">
+            <summary>
+            A class to act as a mapping between the level that a logging call is made at and
+            the color it should be displayed as.
+            </summary>
+            <remarks>
+            <para>
+            Defines the mapping between a level and its event log entry type.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.EventLogAppender.Level2EventLogEntryType.EventLogEntryType">
+            <summary>
+            The <see cref="P:log4net.Appender.EventLogAppender.Level2EventLogEntryType.EventLogEntryType"/> for this entry
+            </summary>
+            <remarks>
+            <para>
+            Required property.
+            The <see cref="P:log4net.Appender.EventLogAppender.Level2EventLogEntryType.EventLogEntryType"/> for this entry
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.FileAppender">
+            <summary>
+            Appends logging events to a file.
+            </summary>
+            <remarks>
+            <para>
+            Logging events are sent to the file specified by
+            the <see cref="P:log4net.Appender.FileAppender.File"/> property.
+            </para>
+            <para>
+            The file can be opened in either append or overwrite mode 
+            by specifying the <see cref="P:log4net.Appender.FileAppender.AppendToFile"/> property.
+            If the file path is relative it is taken as relative from 
+            the application base directory. The file encoding can be
+            specified by setting the <see cref="P:log4net.Appender.FileAppender.Encoding"/> property.
+            </para>
+            <para>
+            The layout's <see cref="P:log4net.Layout.ILayout.Header"/> and <see cref="P:log4net.Layout.ILayout.Footer"/>
+            values will be written each time the file is opened and closed
+            respectively. If the <see cref="P:log4net.Appender.FileAppender.AppendToFile"/> property is <see langword="true"/>
+            then the file may contain multiple copies of the header and footer.
+            </para>
+            <para>
+            This appender will first try to open the file for writing when <see cref="M:log4net.Appender.FileAppender.ActivateOptions"/>
+            is called. This will typically be during configuration.
+            If the file cannot be opened for writing the appender will attempt
+            to open the file again each time a message is logged to the appender.
+            If the file cannot be opened for writing when a message is logged then
+            the message will be discarded by this appender.
+            </para>
+            <para>
+            The <see cref="T:log4net.Appender.FileAppender"/> supports pluggable file locking models via
+            the <see cref="P:log4net.Appender.FileAppender.LockingModel"/> property.
+            The default behavior, implemented by <see cref="T:log4net.Appender.FileAppender.ExclusiveLock"/> 
+            is to obtain an exclusive write lock on the file until this appender is closed.
+            The alternative model, <see cref="T:log4net.Appender.FileAppender.MinimalLock"/>, only holds a
+            write lock while the appender is writing a logging event.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+            <author>Rodrigo B. de Oliveira</author>
+            <author>Douglas de la Torre</author>
+            <author>Niall Daley</author>
+        </member>
+        <member name="T:log4net.Appender.TextWriterAppender">
+            <summary>
+            Sends logging events to a <see cref="T:System.IO.TextWriter"/>.
+            </summary>
+            <remarks>
+            <para>
+            An Appender that writes to a <see cref="T:System.IO.TextWriter"/>.
+            </para>
+            <para>
+            This appender may be used stand alone if initialized with an appropriate
+            writer, however it is typically used as a base class for an appender that
+            can open a <see cref="T:System.IO.TextWriter"/> to write to.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+            <author>Douglas de la Torre</author>
+        </member>
+        <member name="M:log4net.Appender.TextWriterAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.TextWriterAppender"/> class.
+            </summary>
+            <remarks>
+            <para>
+            Default constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TextWriterAppender.#ctor(log4net.Layout.ILayout,System.IO.Stream)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.TextWriterAppender"/> class and
+            sets the output destination to a new <see cref="T:System.IO.StreamWriter"/> initialized 
+            with the specified <see cref="T:System.IO.Stream"/>.
+            </summary>
+            <param name="layout">The layout to use with this appender.</param>
+            <param name="os">The <see cref="T:System.IO.Stream"/> to output to.</param>
+            <remarks>
+            <para>
+            Obsolete constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TextWriterAppender.#ctor(log4net.Layout.ILayout,System.IO.TextWriter)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.TextWriterAppender"/> class and sets
+            the output destination to the specified <see cref="T:System.IO.StreamWriter"/>.
+            </summary>
+            <param name="layout">The layout to use with this appender</param>
+            <param name="writer">The <see cref="T:System.IO.TextWriter"/> to output to</param>
+            <remarks>
+            The <see cref="T:System.IO.TextWriter"/> must have been previously opened.
+            </remarks>
+            <remarks>
+            <para>
+            Obsolete constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TextWriterAppender.PreAppendCheck">
+            <summary>
+            This method determines if there is a sense in attempting to append.
+            </summary>
+            <remarks>
+            <para>
+            This method checked if an output target has been set and if a
+            layout has been set. 
+            </para>
+            </remarks>
+            <returns><c>false</c> if any of the preconditions fail.</returns>
+        </member>
+        <member name="M:log4net.Appender.TextWriterAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            This method is called by the <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/>
+            method. 
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            Writes a log statement to the output stream if the output stream exists 
+            and is writable.  
+            </para>
+            <para>
+            The format of the output will depend on the appender's layout.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TextWriterAppender.Append(log4net.Core.LoggingEvent[])">
+            <summary>
+            This method is called by the <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent[])"/>
+            method. 
+            </summary>
+            <param name="loggingEvents">The array of events to log.</param>
+            <remarks>
+            <para>
+            This method writes all the bulk logged events to the output writer
+            before flushing the stream.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TextWriterAppender.OnClose">
+            <summary>
+            Close this appender instance. The underlying stream or writer is also closed.
+            </summary>
+            <remarks>
+            Closed appenders cannot be reused.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TextWriterAppender.WriteFooterAndCloseWriter">
+            <summary>
+            Writes the footer and closes the underlying <see cref="T:System.IO.TextWriter"/>.
+            </summary>
+            <remarks>
+            <para>
+            Writes the footer and closes the underlying <see cref="T:System.IO.TextWriter"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TextWriterAppender.CloseWriter">
+            <summary>
+            Closes the underlying <see cref="T:System.IO.TextWriter"/>.
+            </summary>
+            <remarks>
+            <para>
+            Closes the underlying <see cref="T:System.IO.TextWriter"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TextWriterAppender.Reset">
+            <summary>
+            Clears internal references to the underlying <see cref="T:System.IO.TextWriter"/> 
+            and other variables.
+            </summary>
+            <remarks>
+            <para>
+            Subclasses can override this method for an alternate closing behavior.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TextWriterAppender.WriteFooter">
+            <summary>
+            Writes a footer as produced by the embedded layout's <see cref="P:log4net.Layout.ILayout.Footer"/> property.
+            </summary>
+            <remarks>
+            <para>
+            Writes a footer as produced by the embedded layout's <see cref="P:log4net.Layout.ILayout.Footer"/> property.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TextWriterAppender.WriteHeader">
+            <summary>
+            Writes a header produced by the embedded layout's <see cref="P:log4net.Layout.ILayout.Header"/> property.
+            </summary>
+            <remarks>
+            <para>
+            Writes a header produced by the embedded layout's <see cref="P:log4net.Layout.ILayout.Header"/> property.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TextWriterAppender.PrepareWriter">
+            <summary>
+            Called to allow a subclass to lazily initialize the writer
+            </summary>
+            <remarks>
+            <para>
+            This method is called when an event is logged and the <see cref="P:log4net.Appender.TextWriterAppender.Writer"/> or
+            <see cref="P:log4net.Appender.TextWriterAppender.QuietWriter"/> have not been set. This allows a subclass to
+            attempt to initialize the writer multiple times.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.TextWriterAppender.m_qtw">
+            <summary>
+            This is the <see cref="T:log4net.Util.QuietTextWriter"/> where logging events
+            will be written to. 
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.TextWriterAppender.m_immediateFlush">
+            <summary>
+            Immediate flush means that the underlying <see cref="T:System.IO.TextWriter"/> 
+            or output stream will be flushed at the end of each append operation.
+            </summary>
+            <remarks>
+            <para>
+            Immediate flush is slower but ensures that each append request is 
+            actually written. If <see cref="P:log4net.Appender.TextWriterAppender.ImmediateFlush"/> is set to
+            <c>false</c>, then there is a good chance that the last few
+            logging events are not actually persisted if and when the application 
+            crashes.
+            </para>
+            <para>
+            The default value is <c>true</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.TextWriterAppender.ImmediateFlush">
+            <summary>
+            Gets or set whether the appender will flush at the end 
+            of each append operation.
+            </summary>
+            <value>
+            <para>
+            The default behavior is to flush at the end of each 
+            append operation.
+            </para>
+            <para>
+            If this option is set to <c>false</c>, then the underlying 
+            stream can defer persisting the logging event to a later 
+            time.
+            </para>
+            </value>
+            <remarks>
+            Avoiding the flush operation at the end of each append results in
+            a performance gain of 10 to 20 percent. However, there is safety
+            trade-off involved in skipping flushing. Indeed, when flushing is
+            skipped, then it is likely that the last few log events will not
+            be recorded on disk when the application exits. This is a high
+            price to pay even for a 20% performance gain.
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.TextWriterAppender.Writer">
+            <summary>
+            Sets the <see cref="T:System.IO.TextWriter"/> where the log output will go.
+            </summary>
+            <remarks>
+            <para>
+            The specified <see cref="T:System.IO.TextWriter"/> must be open and writable.
+            </para>
+            <para>
+            The <see cref="T:System.IO.TextWriter"/> will be closed when the appender 
+            instance is closed.
+            </para>
+            <para>
+            <b>Note:</b> Logging to an unopened <see cref="T:System.IO.TextWriter"/> will fail.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.TextWriterAppender.ErrorHandler">
+            <summary>
+            Gets or set the <see cref="T:log4net.Core.IErrorHandler"/> and the underlying 
+            <see cref="T:log4net.Util.QuietTextWriter"/>, if any, for this appender. 
+            </summary>
+            <value>
+            The <see cref="T:log4net.Core.IErrorHandler"/> for this appender.
+            </value>
+        </member>
+        <member name="P:log4net.Appender.TextWriterAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.TextWriterAppender.QuietWriter">
+            <summary>
+            Gets or sets the <see cref="T:log4net.Util.QuietTextWriter"/> where logging events
+            will be written to. 
+            </summary>
+            <value>
+            The <see cref="T:log4net.Util.QuietTextWriter"/> where logging events are written.
+            </value>
+            <remarks>
+            <para>
+            This is the <see cref="T:log4net.Util.QuietTextWriter"/> where logging events
+            will be written to. 
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Default constructor
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.#ctor(log4net.Layout.ILayout,System.String,System.Boolean)">
+            <summary>
+            Construct a new appender using the layout, file and append mode.
+            </summary>
+            <param name="layout">the layout to use with this appender</param>
+            <param name="filename">the full path to the file to write to</param>
+            <param name="append">flag to indicate if the file should be appended to</param>
+            <remarks>
+            <para>
+            Obsolete constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.#ctor(log4net.Layout.ILayout,System.String)">
+            <summary>
+            Construct a new appender using the layout and file specified.
+            The file will be appended to.
+            </summary>
+            <param name="layout">the layout to use with this appender</param>
+            <param name="filename">the full path to the file to write to</param>
+            <remarks>
+            <para>
+            Obsolete constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.ActivateOptions">
+            <summary>
+            Activate the options on the file appender. 
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Appender.FileAppender.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Appender.FileAppender.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Appender.FileAppender.ActivateOptions"/> must be called again.
+            </para>
+            <para>
+            This will cause the file to be opened.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.Reset">
+            <summary>
+            Closes any previously opened file and calls the parent's <see cref="M:log4net.Appender.TextWriterAppender.Reset"/>.
+            </summary>
+            <remarks>
+            <para>
+            Resets the filename and the file stream.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.PrepareWriter">
+            <summary>
+            Called to initialize the file writer
+            </summary>
+            <remarks>
+            <para>
+            Will be called for each logged message until the file is
+            successfully opened.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            This method is called by the <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/>
+            method. 
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            Writes a log statement to the output stream if the output stream exists 
+            and is writable.  
+            </para>
+            <para>
+            The format of the output will depend on the appender's layout.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.Append(log4net.Core.LoggingEvent[])">
+            <summary>
+            This method is called by the <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent[])"/>
+            method. 
+            </summary>
+            <param name="loggingEvents">The array of events to log.</param>
+            <remarks>
+            <para>
+            Acquires the output file locks once before writing all the events to
+            the stream.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.WriteFooter">
+            <summary>
+            Writes a footer as produced by the embedded layout's <see cref="P:log4net.Layout.ILayout.Footer"/> property.
+            </summary>
+            <remarks>
+            <para>
+            Writes a footer as produced by the embedded layout's <see cref="P:log4net.Layout.ILayout.Footer"/> property.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.WriteHeader">
+            <summary>
+            Writes a header produced by the embedded layout's <see cref="P:log4net.Layout.ILayout.Header"/> property.
+            </summary>
+            <remarks>
+            <para>
+            Writes a header produced by the embedded layout's <see cref="P:log4net.Layout.ILayout.Header"/> property.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.CloseWriter">
+            <summary>
+            Closes the underlying <see cref="T:System.IO.TextWriter"/>.
+            </summary>
+            <remarks>
+            <para>
+            Closes the underlying <see cref="T:System.IO.TextWriter"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.CloseFile">
+            <summary>
+            Closes the previously opened file.
+            </summary>
+            <remarks>
+            <para>
+            Writes the <see cref="P:log4net.Layout.ILayout.Footer"/> to the file and then
+            closes the file.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.SafeOpenFile(System.String,System.Boolean)">
+            <summary>
+            Sets and <i>opens</i> the file where the log output will go. The specified file must be writable.
+            </summary>
+            <param name="fileName">The path to the log file. Must be a fully qualified path.</param>
+            <param name="append">If true will append to fileName. Otherwise will truncate fileName</param>
+            <remarks>
+            <para>
+            Calls <see cref="M:log4net.Appender.FileAppender.OpenFile(System.String,System.Boolean)"/> but guarantees not to throw an exception.
+            Errors are passed to the <see cref="P:log4net.Appender.TextWriterAppender.ErrorHandler"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.OpenFile(System.String,System.Boolean)">
+            <summary>
+            Sets and <i>opens</i> the file where the log output will go. The specified file must be writable.
+            </summary>
+            <param name="fileName">The path to the log file. Must be a fully qualified path.</param>
+            <param name="append">If true will append to fileName. Otherwise will truncate fileName</param>
+            <remarks>
+            <para>
+            If there was already an opened file, then the previous file
+            is closed first.
+            </para>
+            <para>
+            This method will ensure that the directory structure
+            for the <paramref name="fileName"/> specified exists.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.SetQWForFiles(System.IO.Stream)">
+            <summary>
+            Sets the quiet writer used for file output
+            </summary>
+            <param name="fileStream">the file stream that has been opened for writing</param>
+            <remarks>
+            <para>
+            This implementation of <see cref="M:log4net.Appender.FileAppender.SetQWForFiles(System.IO.Stream)"/> creates a <see cref="T:System.IO.StreamWriter"/>
+            over the <paramref name="fileStream"/> and passes it to the 
+            <see cref="M:log4net.Appender.FileAppender.SetQWForFiles(System.IO.TextWriter)"/> method.
+            </para>
+            <para>
+            This method can be overridden by sub classes that want to wrap the
+            <see cref="T:System.IO.Stream"/> in some way, for example to encrypt the output
+            data using a <c>System.Security.Cryptography.CryptoStream</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.SetQWForFiles(System.IO.TextWriter)">
+            <summary>
+            Sets the quiet writer being used.
+            </summary>
+            <param name="writer">the writer over the file stream that has been opened for writing</param>
+            <remarks>
+            <para>
+            This method can be overridden by sub classes that want to
+            wrap the <see cref="T:System.IO.TextWriter"/> in some way.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.ConvertToFullPath(System.String)">
+            <summary>
+            Convert a path into a fully qualified path.
+            </summary>
+            <param name="path">The path to convert.</param>
+            <returns>The fully qualified path.</returns>
+            <remarks>
+            <para>
+            Converts the path specified to a fully
+            qualified path. If the path is relative it is
+            taken as relative from the application base 
+            directory.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.FileAppender.m_appendToFile">
+            <summary>
+            Flag to indicate if we should append to the file
+            or overwrite the file. The default is to append.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.FileAppender.m_fileName">
+            <summary>
+            The name of the log file.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.FileAppender.m_encoding">
+            <summary>
+            The encoding to use for the file stream.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.FileAppender.m_securityContext">
+            <summary>
+            The security context to use for privileged calls
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.FileAppender.m_stream">
+            <summary>
+            The stream to log to. Has added locking semantics
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.FileAppender.m_lockingModel">
+            <summary>
+            The locking model to use
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.FileAppender.File">
+            <summary>
+            Gets or sets the path to the file that logging will be written to.
+            </summary>
+            <value>
+            The path to the file that logging will be written to.
+            </value>
+            <remarks>
+            <para>
+            If the path is relative it is taken as relative from 
+            the application base directory.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.FileAppender.AppendToFile">
+            <summary>
+            Gets or sets a flag that indicates whether the file should be
+            appended to or overwritten.
+            </summary>
+            <value>
+            Indicates whether the file should be appended to or overwritten.
+            </value>
+            <remarks>
+            <para>
+            If the value is set to false then the file will be overwritten, if 
+            it is set to true then the file will be appended to.
+            </para>
+            The default value is true.
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.FileAppender.Encoding">
+            <summary>
+            Gets or sets <see cref="P:log4net.Appender.FileAppender.Encoding"/> used to write to the file.
+            </summary>
+            <value>
+            The <see cref="P:log4net.Appender.FileAppender.Encoding"/> used to write to the file.
+            </value>
+            <remarks>
+            <para>
+            The default encoding set is <see cref="P:System.Text.Encoding.Default"/>
+            which is the encoding for the system's current ANSI code page.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.FileAppender.SecurityContext">
+            <summary>
+            Gets or sets the <see cref="P:log4net.Appender.FileAppender.SecurityContext"/> used to write to the file.
+            </summary>
+            <value>
+            The <see cref="P:log4net.Appender.FileAppender.SecurityContext"/> used to write to the file.
+            </value>
+            <remarks>
+            <para>
+            Unless a <see cref="P:log4net.Appender.FileAppender.SecurityContext"/> specified here for this appender
+            the <see cref="P:log4net.Core.SecurityContextProvider.DefaultProvider"/> is queried for the
+            security context to use. The default behavior is to use the security context
+            of the current thread.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.FileAppender.LockingModel">
+            <summary>
+            Gets or sets the <see cref="P:log4net.Appender.FileAppender.LockingModel"/> used to handle locking of the file.
+            </summary>
+            <value>
+            The <see cref="P:log4net.Appender.FileAppender.LockingModel"/> used to lock the file.
+            </value>
+            <remarks>
+            <para>
+            Gets or sets the <see cref="P:log4net.Appender.FileAppender.LockingModel"/> used to handle locking of the file.
+            </para>
+            <para>
+            There are two built in locking models, <see cref="T:log4net.Appender.FileAppender.ExclusiveLock"/> and <see cref="T:log4net.Appender.FileAppender.MinimalLock"/>.
+            The former locks the file from the start of logging to the end and the 
+            later lock only for the minimal amount of time when logging each message.
+            </para>
+            <para>
+            The default locking model is the <see cref="T:log4net.Appender.FileAppender.ExclusiveLock"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.FileAppender.LockingStream">
+            <summary>
+            Write only <see cref="T:System.IO.Stream"/> that uses the <see cref="T:log4net.Appender.FileAppender.LockingModelBase"/> 
+            to manage access to an underlying resource.
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.LockingStream.BeginWrite(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object)">
+            <summary>
+            True asynchronous writes are not supported, the implementation forces a synchronous write.
+            </summary>
+        </member>
+        <member name="T:log4net.Core.LogException">
+            <summary>
+            Exception base type for log4net.
+            </summary>
+            <remarks>
+            <para>
+            This type extends <see cref="T:System.ApplicationException"/>. It
+            does not add any new functionality but does differentiate the
+            type of exception being thrown.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Core.LogException.#ctor">
+            <summary>
+            Constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Core.LogException"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogException.#ctor(System.String)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="message">A message to include with the exception.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Core.LogException"/> class with
+            the specified message.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogException.#ctor(System.String,System.Exception)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="message">A message to include with the exception.</param>
+            <param name="innerException">A nested exception to include.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Core.LogException"/> class
+            with the specified message and inner exception.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serialization constructor
+            </summary>
+            <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The <see cref="T:System.Runtime.Serialization.StreamingContext"/> that contains contextual information about the source or destination.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Core.LogException"/> class 
+            with serialized data.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.FileAppender.LockingModelBase">
+            <summary>
+            Locking model base class
+            </summary>
+            <remarks>
+            <para>
+            Base class for the locking models available to the <see cref="T:log4net.Appender.FileAppender"/> derived loggers.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.LockingModelBase.OpenFile(System.String,System.Boolean,System.Text.Encoding)">
+            <summary>
+            Open the output file
+            </summary>
+            <param name="filename">The filename to use</param>
+            <param name="append">Whether to append to the file, or overwrite</param>
+            <param name="encoding">The encoding to use</param>
+            <remarks>
+            <para>
+            Open the file specified and prepare for logging. 
+            No writes will be made until <see cref="M:log4net.Appender.FileAppender.LockingModelBase.AcquireLock"/> is called.
+            Must be called before any calls to <see cref="M:log4net.Appender.FileAppender.LockingModelBase.AcquireLock"/>,
+            <see cref="M:log4net.Appender.FileAppender.LockingModelBase.ReleaseLock"/> and <see cref="M:log4net.Appender.FileAppender.LockingModelBase.CloseFile"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.LockingModelBase.CloseFile">
+            <summary>
+            Close the file
+            </summary>
+            <remarks>
+            <para>
+            Close the file. No further writes will be made.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.LockingModelBase.AcquireLock">
+            <summary>
+            Acquire the lock on the file
+            </summary>
+            <returns>A stream that is ready to be written to.</returns>
+            <remarks>
+            <para>
+            Acquire the lock on the file in preparation for writing to it. 
+            Return a stream pointing to the file. <see cref="M:log4net.Appender.FileAppender.LockingModelBase.ReleaseLock"/>
+            must be called to release the lock on the output file.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.LockingModelBase.ReleaseLock">
+            <summary>
+            Release the lock on the file
+            </summary>
+            <remarks>
+            <para>
+            Release the lock on the file. No further writes will be made to the 
+            stream until <see cref="M:log4net.Appender.FileAppender.LockingModelBase.AcquireLock"/> is called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.FileAppender.LockingModelBase.CurrentAppender">
+            <summary>
+            Gets or sets the <see cref="T:log4net.Appender.FileAppender"/> for this LockingModel
+            </summary>
+            <value>
+            The <see cref="T:log4net.Appender.FileAppender"/> for this LockingModel
+            </value>
+            <remarks>
+            <para>
+            The file appender this locking model is attached to and working on
+            behalf of.
+            </para>
+            <para>
+            The file appender is used to locate the security context and the error handler to use.
+            </para>
+            <para>
+            The value of this property will be set before <see cref="M:log4net.Appender.FileAppender.LockingModelBase.OpenFile(System.String,System.Boolean,System.Text.Encoding)"/> is
+            called.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.FileAppender.ExclusiveLock">
+            <summary>
+            Hold an exclusive lock on the output file
+            </summary>
+            <remarks>
+            <para>
+            Open the file once for writing and hold it open until <see cref="M:log4net.Appender.FileAppender.ExclusiveLock.CloseFile"/> is called. 
+            Maintains an exclusive lock on the file during this time.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.ExclusiveLock.OpenFile(System.String,System.Boolean,System.Text.Encoding)">
+            <summary>
+            Open the file specified and prepare for logging.
+            </summary>
+            <param name="filename">The filename to use</param>
+            <param name="append">Whether to append to the file, or overwrite</param>
+            <param name="encoding">The encoding to use</param>
+            <remarks>
+            <para>
+            Open the file specified and prepare for logging. 
+            No writes will be made until <see cref="M:log4net.Appender.FileAppender.ExclusiveLock.AcquireLock"/> is called.
+            Must be called before any calls to <see cref="M:log4net.Appender.FileAppender.ExclusiveLock.AcquireLock"/>,
+            <see cref="M:log4net.Appender.FileAppender.ExclusiveLock.ReleaseLock"/> and <see cref="M:log4net.Appender.FileAppender.ExclusiveLock.CloseFile"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.ExclusiveLock.CloseFile">
+            <summary>
+            Close the file
+            </summary>
+            <remarks>
+            <para>
+            Close the file. No further writes will be made.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.ExclusiveLock.AcquireLock">
+            <summary>
+            Acquire the lock on the file
+            </summary>
+            <returns>A stream that is ready to be written to.</returns>
+            <remarks>
+            <para>
+            Does nothing. The lock is already taken
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.ExclusiveLock.ReleaseLock">
+            <summary>
+            Release the lock on the file
+            </summary>
+            <remarks>
+            <para>
+            Does nothing. The lock will be released when the file is closed.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.FileAppender.MinimalLock">
+            <summary>
+            Acquires the file lock for each write
+            </summary>
+            <remarks>
+            <para>
+            Opens the file once for each <see cref="M:log4net.Appender.FileAppender.MinimalLock.AcquireLock"/>/<see cref="M:log4net.Appender.FileAppender.MinimalLock.ReleaseLock"/> cycle, 
+            thus holding the lock for the minimal amount of time. This method of locking
+            is considerably slower than <see cref="T:log4net.Appender.FileAppender.ExclusiveLock"/> but allows 
+            other processes to move/delete the log file whilst logging continues.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.MinimalLock.OpenFile(System.String,System.Boolean,System.Text.Encoding)">
+            <summary>
+            Prepares to open the file when the first message is logged.
+            </summary>
+            <param name="filename">The filename to use</param>
+            <param name="append">Whether to append to the file, or overwrite</param>
+            <param name="encoding">The encoding to use</param>
+            <remarks>
+            <para>
+            Open the file specified and prepare for logging. 
+            No writes will be made until <see cref="M:log4net.Appender.FileAppender.MinimalLock.AcquireLock"/> is called.
+            Must be called before any calls to <see cref="M:log4net.Appender.FileAppender.MinimalLock.AcquireLock"/>,
+            <see cref="M:log4net.Appender.FileAppender.MinimalLock.ReleaseLock"/> and <see cref="M:log4net.Appender.FileAppender.MinimalLock.CloseFile"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.MinimalLock.CloseFile">
+            <summary>
+            Close the file
+            </summary>
+            <remarks>
+            <para>
+            Close the file. No further writes will be made.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.MinimalLock.AcquireLock">
+            <summary>
+            Acquire the lock on the file
+            </summary>
+            <returns>A stream that is ready to be written to.</returns>
+            <remarks>
+            <para>
+            Acquire the lock on the file in preparation for writing to it. 
+            Return a stream pointing to the file. <see cref="M:log4net.Appender.FileAppender.MinimalLock.ReleaseLock"/>
+            must be called to release the lock on the output file.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.FileAppender.MinimalLock.ReleaseLock">
+            <summary>
+            Release the lock on the file
+            </summary>
+            <remarks>
+            <para>
+            Release the lock on the file. No further writes will be made to the 
+            stream until <see cref="M:log4net.Appender.FileAppender.MinimalLock.AcquireLock"/> is called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.ForwardingAppender">
+            <summary>
+            This appender forwards logging events to attached appenders.
+            </summary>
+            <remarks>
+            <para>
+            The forwarding appender can be used to specify different thresholds
+            and filters for the same appender at different locations within the hierarchy.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Appender.ForwardingAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.ForwardingAppender"/> class.
+            </summary>
+            <remarks>
+            <para>
+            Default constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ForwardingAppender.OnClose">
+            <summary>
+            Closes the appender and releases resources.
+            </summary>
+            <remarks>
+            <para>
+            Releases any resources allocated within the appender such as file handles, 
+            network connections, etc.
+            </para>
+            <para>
+            It is a programming error to append to a closed appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ForwardingAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            Forward the logging event to the attached appenders 
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            Delivers the logging event to all the attached appenders.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ForwardingAppender.Append(log4net.Core.LoggingEvent[])">
+            <summary>
+            Forward the logging events to the attached appenders 
+            </summary>
+            <param name="loggingEvents">The array of events to log.</param>
+            <remarks>
+            <para>
+            Delivers the logging events to all the attached appenders.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ForwardingAppender.AddAppender(log4net.Appender.IAppender)">
+            <summary>
+            Adds an <see cref="T:log4net.Appender.IAppender"/> to the list of appenders of this
+            instance.
+            </summary>
+            <param name="newAppender">The <see cref="T:log4net.Appender.IAppender"/> to add to this appender.</param>
+            <remarks>
+            <para>
+            If the specified <see cref="T:log4net.Appender.IAppender"/> is already in the list of
+            appenders, then it won't be added again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ForwardingAppender.GetAppender(System.String)">
+            <summary>
+            Looks for the appender with the specified name.
+            </summary>
+            <param name="name">The name of the appender to lookup.</param>
+            <returns>
+            The appender with the specified name, or <c>null</c>.
+            </returns>
+            <remarks>
+            <para>
+            Get the named appender attached to this appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ForwardingAppender.RemoveAllAppenders">
+            <summary>
+            Removes all previously added appenders from this appender.
+            </summary>
+            <remarks>
+            <para>
+            This is useful when re-reading configuration information.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ForwardingAppender.RemoveAppender(log4net.Appender.IAppender)">
+            <summary>
+            Removes the specified appender from the list of appenders.
+            </summary>
+            <param name="appender">The appender to remove.</param>
+            <returns>The appender removed from the list</returns>
+            <remarks>
+            The appender removed is not closed.
+            If you are discarding the appender you must call
+            <see cref="M:log4net.Appender.IAppender.Close"/> on the appender removed.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.ForwardingAppender.RemoveAppender(System.String)">
+            <summary>
+            Removes the appender with the specified name from the list of appenders.
+            </summary>
+            <param name="name">The name of the appender to remove.</param>
+            <returns>The appender removed from the list</returns>
+            <remarks>
+            The appender removed is not closed.
+            If you are discarding the appender you must call
+            <see cref="M:log4net.Appender.IAppender.Close"/> on the appender removed.
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.ForwardingAppender.m_appenderAttachedImpl">
+            <summary>
+            Implementation of the <see cref="T:log4net.Core.IAppenderAttachable"/> interface
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.ForwardingAppender.Appenders">
+            <summary>
+            Gets the appenders contained in this appender as an 
+            <see cref="T:System.Collections.ICollection"/>.
+            </summary>
+            <remarks>
+            If no appenders can be found, then an <see cref="T:log4net.Util.EmptyCollection"/> 
+            is returned.
+            </remarks>
+            <returns>
+            A collection of the appenders in this appender.
+            </returns>
+        </member>
+        <member name="T:log4net.Appender.LocalSyslogAppender">
+            <summary>
+            Logs events to a local syslog service.
+            </summary>
+            <remarks>
+            <note>
+            This appender uses the POSIX libc library functions <c>openlog</c>, <c>syslog</c>, and <c>closelog</c>.
+            If these functions are not available on the local system then this appender will not work!
+            </note>
+            <para>
+            The functions <c>openlog</c>, <c>syslog</c>, and <c>closelog</c> are specified in SUSv2 and 
+            POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service.
+            </para>
+            <para>
+            This appender talks to a local syslog service. If you need to log to a remote syslog
+            daemon and you cannot configure your local syslog service to do this you may be
+            able to use the <see cref="T:log4net.Appender.RemoteSyslogAppender"/> to log via UDP.
+            </para>
+            <para>
+            Syslog messages must have a facility and and a severity. The severity
+            is derived from the Level of the logging event.
+            The facility must be chosen from the set of defined syslog 
+            <see cref="T:log4net.Appender.LocalSyslogAppender.SyslogFacility"/> values. The facilities list is predefined
+            and cannot be extended.
+            </para>
+            <para>
+            An identifier is specified with each log message. This can be specified
+            by setting the <see cref="P:log4net.Appender.LocalSyslogAppender.Identity"/> property. The identity (also know 
+            as the tag) must not contain white space. The default value for the
+            identity is the application name (from <see cref="P:log4net.Util.SystemInfo.ApplicationFriendlyName"/>).
+            </para>
+            </remarks>
+            <author>Rob Lyon</author>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Appender.LocalSyslogAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.LocalSyslogAppender"/> class.
+            </summary>
+            <remarks>
+            This instance of the <see cref="T:log4net.Appender.LocalSyslogAppender"/> class is set up to write 
+            to a local syslog service.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.LocalSyslogAppender.AddMapping(log4net.Appender.LocalSyslogAppender.LevelSeverity)">
+            <summary>
+            Add a mapping of level to severity
+            </summary>
+            <param name="mapping">The mapping to add</param>
+            <remarks>
+            <para>
+            Adds a <see cref="T:log4net.Appender.LocalSyslogAppender.LevelSeverity"/> to this appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.LocalSyslogAppender.ActivateOptions">
+            <summary>
+            Initialize the appender based on the options set.
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Appender.LocalSyslogAppender.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Appender.LocalSyslogAppender.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Appender.LocalSyslogAppender.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.LocalSyslogAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            This method is called by the <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/> method.
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            Writes the event to a remote syslog daemon.
+            </para>
+            <para>
+            The format of the output will depend on the appender's layout.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.LocalSyslogAppender.OnClose">
+            <summary>
+            Close the syslog when the appender is closed
+            </summary>
+            <remarks>
+            <para>
+            Close the syslog when the appender is closed
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.LocalSyslogAppender.GetSeverity(log4net.Core.Level)">
+            <summary>
+            Translates a log4net level to a syslog severity.
+            </summary>
+            <param name="level">A log4net level.</param>
+            <returns>A syslog severity.</returns>
+            <remarks>
+            <para>
+            Translates a log4net level to a syslog severity.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.LocalSyslogAppender.GeneratePriority(log4net.Appender.LocalSyslogAppender.SyslogFacility,log4net.Appender.LocalSyslogAppender.SyslogSeverity)">
+            <summary>
+            Generate a syslog priority.
+            </summary>
+            <param name="facility">The syslog facility.</param>
+            <param name="severity">The syslog severity.</param>
+            <returns>A syslog priority.</returns>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.m_facility">
+            <summary>
+            The facility. The default facility is <see cref="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.User"/>.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.m_identity">
+            <summary>
+            The message identity
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.m_handleToIdentity">
+            <summary>
+            Marshaled handle to the identity string. We have to hold on to the
+            string as the <c>openlog</c> and <c>syslog</c> APIs just hold the
+            pointer to the ident and dereference it for each log message.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.m_levelMapping">
+            <summary>
+            Mapping from level object to syslog severity
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.LocalSyslogAppender.openlog(System.IntPtr,System.Int32,log4net.Appender.LocalSyslogAppender.SyslogFacility)">
+            <summary>
+            Open connection to system logger.
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.LocalSyslogAppender.syslog(System.Int32,System.String,System.String)">
+            <summary>
+            Generate a log message.
+            </summary>
+            <remarks>
+            <para>
+            The libc syslog method takes a format string and a variable argument list similar
+            to the classic printf function. As this type of vararg list is not supported
+            by C# we need to specify the arguments explicitly. Here we have specified the
+            format string with a single message argument. The caller must set the format 
+            string to <c>"%s"</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.LocalSyslogAppender.closelog">
+            <summary>
+            Close descriptor used to write to system logger.
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.LocalSyslogAppender.Identity">
+            <summary>
+            Message identity
+            </summary>
+            <remarks>
+            <para>
+            An identifier is specified with each log message. This can be specified
+            by setting the <see cref="P:log4net.Appender.LocalSyslogAppender.Identity"/> property. The identity (also know 
+            as the tag) must not contain white space. The default value for the
+            identity is the application name (from <see cref="P:log4net.Util.SystemInfo.ApplicationFriendlyName"/>).
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.LocalSyslogAppender.Facility">
+            <summary>
+            Syslog facility
+            </summary>
+            <remarks>
+            Set to one of the <see cref="T:log4net.Appender.LocalSyslogAppender.SyslogFacility"/> values. The list of
+            facilities is predefined and cannot be extended. The default value
+            is <see cref="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.User"/>.
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.LocalSyslogAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="P:log4net.Appender.AppenderSkeleton.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="P:log4net.Appender.AppenderSkeleton.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.LocalSyslogAppender.SyslogSeverity">
+            <summary>
+            syslog severities
+            </summary>
+            <remarks>
+            <para>
+            The log4net Level maps to a syslog severity using the
+            <see cref="M:log4net.Appender.LocalSyslogAppender.AddMapping(log4net.Appender.LocalSyslogAppender.LevelSeverity)"/> method and the <see cref="T:log4net.Appender.LocalSyslogAppender.LevelSeverity"/>
+            class. The severity is set on <see cref="P:log4net.Appender.LocalSyslogAppender.LevelSeverity.Severity"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogSeverity.Emergency">
+            <summary>
+            system is unusable
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogSeverity.Alert">
+            <summary>
+            action must be taken immediately
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogSeverity.Critical">
+            <summary>
+            critical conditions
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogSeverity.Error">
+            <summary>
+            error conditions
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogSeverity.Warning">
+            <summary>
+            warning conditions
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogSeverity.Notice">
+            <summary>
+            normal but significant condition
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogSeverity.Informational">
+            <summary>
+            informational
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogSeverity.Debug">
+            <summary>
+            debug-level messages
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.LocalSyslogAppender.SyslogFacility">
+            <summary>
+            syslog facilities
+            </summary>
+            <remarks>
+            <para>
+            The syslog facility defines which subsystem the logging comes from.
+            This is set on the <see cref="P:log4net.Appender.LocalSyslogAppender.Facility"/> property.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Kernel">
+            <summary>
+            kernel messages
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.User">
+            <summary>
+            random user-level messages
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Mail">
+            <summary>
+            mail system
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Daemons">
+            <summary>
+            system daemons
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Authorization">
+            <summary>
+            security/authorization messages
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Syslog">
+            <summary>
+            messages generated internally by syslogd
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Printer">
+            <summary>
+            line printer subsystem
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.News">
+            <summary>
+            network news subsystem
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Uucp">
+            <summary>
+            UUCP subsystem
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Clock">
+            <summary>
+            clock (cron/at) daemon
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Authorization2">
+            <summary>
+            security/authorization  messages (private)
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Ftp">
+            <summary>
+            ftp daemon
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Ntp">
+            <summary>
+            NTP subsystem
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Audit">
+            <summary>
+            log audit
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Alert">
+            <summary>
+            log alert
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Clock2">
+            <summary>
+            clock daemon
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Local0">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Local1">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Local2">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Local3">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Local4">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Local5">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Local6">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.LocalSyslogAppender.SyslogFacility.Local7">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.LocalSyslogAppender.LevelSeverity">
+            <summary>
+            A class to act as a mapping between the level that a logging call is made at and
+            the syslog severity that is should be logged at.
+            </summary>
+            <remarks>
+            <para>
+            A class to act as a mapping between the level that a logging call is made at and
+            the syslog severity that is should be logged at.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.LocalSyslogAppender.LevelSeverity.Severity">
+            <summary>
+            The mapped syslog severity for the specified level
+            </summary>
+            <remarks>
+            <para>
+            Required property.
+            The mapped syslog severity for the specified level
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.MemoryAppender">
+            <summary>
+            Stores logging events in an array.
+            </summary>
+            <remarks>
+            <para>
+            The memory appender stores all the logging events
+            that are appended in an in-memory array.
+            </para>
+            <para>
+            Use the <see cref="M:log4net.Appender.MemoryAppender.GetEvents"/> method to get
+            the current list of events that have been appended.
+            </para>
+            <para>
+            Use the <see cref="M:log4net.Appender.MemoryAppender.Clear"/> method to clear the
+            current list of events.
+            </para>
+            </remarks>
+            <author>Julian Biddle</author>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Appender.MemoryAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.MemoryAppender"/> class.
+            </summary>
+            <remarks>
+            <para>
+            Default constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.MemoryAppender.GetEvents">
+            <summary>
+            Gets the events that have been logged.
+            </summary>
+            <returns>The events that have been logged</returns>
+            <remarks>
+            <para>
+            Gets the events that have been logged.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.MemoryAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            This method is called by the <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/> method. 
+            </summary>
+            <param name="loggingEvent">the event to log</param>
+            <remarks>
+            <para>Stores the <paramref name="loggingEvent"/> in the events list.</para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.MemoryAppender.Clear">
+            <summary>
+            Clear the list of events
+            </summary>
+            <remarks>
+            Clear the list of events
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.MemoryAppender.m_eventsList">
+            <summary>
+            The list of events that have been appended.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.MemoryAppender.m_fixFlags">
+            <summary>
+            Value indicating which fields in the event should be fixed
+            </summary>
+            <remarks>
+            By default all fields are fixed
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.MemoryAppender.OnlyFixPartialEventData">
+            <summary>
+            Gets or sets a value indicating whether only part of the logging event 
+            data should be fixed.
+            </summary>
+            <value>
+            <c>true</c> if the appender should only fix part of the logging event 
+            data, otherwise <c>false</c>. The default is <c>false</c>.
+            </value>
+            <remarks>
+            <para>
+            Setting this property to <c>true</c> will cause only part of the event 
+            data to be fixed and stored in the appender, hereby improving performance. 
+            </para>
+            <para>
+            See <see cref="M:log4net.Core.LoggingEvent.FixVolatileData(System.Boolean)"/> for more information.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.MemoryAppender.Fix">
+            <summary>
+            Gets or sets the fields that will be fixed in the event
+            </summary>
+            <remarks>
+            <para>
+            The logging event needs to have certain thread specific values 
+            captured before it can be buffered. See <see cref="P:log4net.Core.LoggingEvent.Fix"/>
+            for details.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.NetSendAppender">
+            <summary>
+            Logs entries by sending network messages using the 
+            <see cref="M:log4net.Appender.NetSendAppender.NetMessageBufferSend(System.String,System.String,System.String,System.String,System.Int32)"/> native function.
+            </summary>
+            <remarks>
+            <para>
+            You can send messages only to names that are active 
+            on the network. If you send the message to a user name, 
+            that user must be logged on and running the Messenger 
+            service to receive the message.
+            </para>
+            <para>
+            The receiver will get a top most window displaying the 
+            messages one at a time, therefore this appender should 
+            not be used to deliver a high volume of messages.
+            </para>
+            <para>
+            The following table lists some possible uses for this appender :
+            </para>
+            <para>
+            <list type="table">
+                <listheader>
+                    <term>Action</term>
+                    <description>Property Value(s)</description>
+                </listheader>
+                <item>
+                    <term>Send a message to a user account on the local machine</term>
+                    <description>
+                        <para>
+                        <paramref name="Server"/> = &lt;name of the local machine&gt;
+                        </para>
+                        <para>
+                        <paramref name="Recipient"/> = &lt;user name&gt;
+                        </para>
+                    </description>
+                </item>
+                <item>
+                    <term>Send a message to a user account on a remote machine</term>
+                    <description>
+                        <para>
+                        <paramref name="Server"/> = &lt;name of the remote machine&gt;
+                        </para>
+                        <para>
+                        <paramref name="Recipient"/> = &lt;user name&gt;
+                        </para>
+                    </description>
+                </item>
+                <item>
+                    <term>Send a message to a domain user account</term>
+                    <description>
+                        <para>
+                        <paramref name="Server"/> = &lt;name of a domain controller | uninitialized&gt;
+                        </para>
+                        <para>
+                        <paramref name="Recipient"/> = &lt;user name&gt;
+                        </para>
+                    </description>
+                </item>
+                <item>
+                    <term>Send a message to all the names in a workgroup or domain</term>
+                    <description>
+                        <para>
+                        <paramref name="Recipient"/> = &lt;workgroup name | domain name&gt;*
+                        </para>
+                    </description>
+                </item>
+                <item>
+                    <term>Send a message from the local machine to a remote machine</term>
+                    <description>
+                        <para>
+                        <paramref name="Server"/> = &lt;name of the local machine | uninitialized&gt;
+                        </para>
+                        <para>
+                        <paramref name="Recipient"/> = &lt;name of the remote machine&gt;
+                        </para>
+                    </description>
+                </item>
+            </list>
+            </para>
+            <para>
+            <b>Note :</b> security restrictions apply for sending 
+            network messages, see <see cref="M:log4net.Appender.NetSendAppender.NetMessageBufferSend(System.String,System.String,System.String,System.String,System.Int32)"/> 
+            for more information.
+            </para>
+            </remarks>
+            <example>
+            <para>
+            An example configuration section to log information 
+            using this appender from the local machine, named 
+            LOCAL_PC, to machine OPERATOR_PC :
+            </para>
+            <code lang="XML" escaped="true">
+            <appender name="NetSendAppender_Operator" type="log4net.Appender.NetSendAppender">
+                <server value="LOCAL_PC"/>
+                <recipient value="OPERATOR_PC"/>
+                <layout type="log4net.Layout.PatternLayout" value="%-5p %c [%x] - %m%n"/>
+            </appender>
+            </code>
+            </example>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="F:log4net.Appender.NetSendAppender.m_server">
+            <summary>
+            The DNS or NetBIOS name of the server on which the function is to execute.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.NetSendAppender.m_sender">
+            <summary>
+            The sender of the network message.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.NetSendAppender.m_recipient">
+            <summary>
+            The message alias to which the message should be sent.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.NetSendAppender.m_securityContext">
+            <summary>
+            The security context to use for privileged calls
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.NetSendAppender.#ctor">
+            <summary>
+            Initializes the appender.
+            </summary>
+            <remarks>
+            The default constructor initializes all fields to their default values.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.NetSendAppender.ActivateOptions">
+            <summary>
+            Initialize the appender based on the options set.
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Appender.NetSendAppender.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Appender.NetSendAppender.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Appender.NetSendAppender.ActivateOptions"/> must be called again.
+            </para>
+            <para>
+            The appender will be ignored if no <see cref="P:log4net.Appender.NetSendAppender.Recipient"/> was specified.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">The required property <see cref="P:log4net.Appender.NetSendAppender.Recipient"/> was not specified.</exception>
+        </member>
+        <member name="M:log4net.Appender.NetSendAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            This method is called by the <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/> method.
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            Sends the event using a network message.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.NetSendAppender.NetMessageBufferSend(System.String,System.String,System.String,System.String,System.Int32)">
+            <summary>
+            Sends a buffer of information to a registered message alias.
+            </summary>
+            <param name="serverName">The DNS or NetBIOS name of the server on which the function is to execute.</param>
+            <param name="msgName">The message alias to which the message buffer should be sent</param>
+            <param name="fromName">The originator of the message.</param>
+            <param name="buffer">The message text.</param>
+            <param name="bufferSize">The length, in bytes, of the message text.</param>
+            <remarks>
+            <para>
+            The following restrictions apply for sending network messages:
+            </para>
+            <para>
+            <list type="table">
+                <listheader>
+                    <term>Platform</term>
+                    <description>Requirements</description>
+                </listheader>
+                <item>
+                    <term>Windows NT</term>
+                    <description>
+                        <para>
+                        No special group membership is required to send a network message.
+                        </para>
+                        <para>
+                        Admin, Accounts, Print, or Server Operator group membership is required to 
+                        successfully send a network message on a remote server.
+                        </para>
+                    </description>
+                </item>
+                <item>
+                    <term>Windows 2000 or later</term>
+                    <description>
+                        <para>
+                        If you send a message on a domain controller that is running Active Directory, 
+                        access is allowed or denied based on the access control list (ACL) for the securable 
+                        object. The default ACL permits only Domain Admins and Account Operators to send a network message. 
+                        </para>
+                        <para>
+                        On a member server or workstation, only Administrators and Server Operators can send a network message. 
+                        </para>
+                    </description>
+                </item>
+            </list>
+            </para>
+            <para>
+            For more information see <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/security_requirements_for_the_network_management_functions.asp">Security Requirements for the Network Management Functions</a>.
+            </para>
+            </remarks>
+            <returns>
+            <para>
+            If the function succeeds, the return value is zero.
+            </para>
+            </returns>
+        </member>
+        <member name="P:log4net.Appender.NetSendAppender.Sender">
+            <summary>
+            Gets or sets the sender of the message.
+            </summary>
+            <value>
+            The sender of the message.
+            </value>
+            <remarks>
+            If this property is not specified, the message is sent from the local computer.
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.NetSendAppender.Recipient">
+            <summary>
+            Gets or sets the message alias to which the message should be sent.
+            </summary>
+            <value>
+            The recipient of the message.
+            </value>
+            <remarks>
+            This property should always be specified in order to send a message.
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.NetSendAppender.Server">
+            <summary>
+            Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute.
+            </summary>
+            <value>
+            DNS or NetBIOS name of the remote server on which the function is to execute.
+            </value>
+            <remarks>
+            <para>
+            For Windows NT 4.0 and earlier, the string should begin with \\.
+            </para>
+            <para>
+            If this property is not specified, the local computer is used. 
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.NetSendAppender.SecurityContext">
+            <summary>
+            Gets or sets the <see cref="P:log4net.Appender.NetSendAppender.SecurityContext"/> used to call the NetSend method.
+            </summary>
+            <value>
+            The <see cref="P:log4net.Appender.NetSendAppender.SecurityContext"/> used to call the NetSend method.
+            </value>
+            <remarks>
+            <para>
+            Unless a <see cref="P:log4net.Appender.NetSendAppender.SecurityContext"/> specified here for this appender
+            the <see cref="P:log4net.Core.SecurityContextProvider.DefaultProvider"/> is queried for the
+            security context to use. The default behavior is to use the security context
+            of the current thread.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.NetSendAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.OutputDebugStringAppender">
+            <summary>
+            Appends log events to the OutputDebugString system.
+            </summary>
+            <remarks>
+            <para>
+            OutputDebugStringAppender appends log events to the
+            OutputDebugString system.
+            </para>
+            <para>
+            The string is passed to the native <c>OutputDebugString</c> 
+            function.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Appender.OutputDebugStringAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.OutputDebugStringAppender"/> class.
+            </summary>
+            <remarks>
+            <para>
+            Default constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.OutputDebugStringAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            Write the logging event to the output debug string API
+            </summary>
+            <param name="loggingEvent">the event to log</param>
+            <remarks>
+            <para>
+            Write the logging event to the output debug string API
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.OutputDebugStringAppender.OutputDebugString(System.String)">
+            <summary>
+            Stub for OutputDebugString native method
+            </summary>
+            <param name="message">the string to output</param>
+            <remarks>
+            <para>
+            Stub for OutputDebugString native method
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.OutputDebugStringAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.RemoteSyslogAppender">
+            <summary>
+            Logs events to a remote syslog daemon.
+            </summary>
+            <remarks>
+            <para>
+            The BSD syslog protocol is used to remotely log to
+            a syslog daemon. The syslogd listens for for messages
+            on UDP port 514.
+            </para>
+            <para>
+            The syslog UDP protocol is not authenticated. Most syslog daemons
+            do not accept remote log messages because of the security implications.
+            You may be able to use the LocalSyslogAppender to talk to a local
+            syslog service.
+            </para>
+            <para>
+            There is an RFC 3164 that claims to document the BSD Syslog Protocol.
+            This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html.
+            This appender generates what the RFC calls an "Original Device Message",
+            i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation
+            this format of message will be accepted by all current syslog daemon
+            implementations. The daemon will attach the current time and the source
+            hostname or IP address to any messages received.
+            </para>
+            <para>
+            Syslog messages must have a facility and and a severity. The severity
+            is derived from the Level of the logging event.
+            The facility must be chosen from the set of defined syslog 
+            <see cref="T:log4net.Appender.RemoteSyslogAppender.SyslogFacility"/> values. The facilities list is predefined
+            and cannot be extended.
+            </para>
+            <para>
+            An identifier is specified with each log message. This can be specified
+            by setting the <see cref="P:log4net.Appender.RemoteSyslogAppender.Identity"/> property. The identity (also know 
+            as the tag) must not contain white space. The default value for the
+            identity is the application name (from <see cref="P:log4net.Core.LoggingEvent.Domain"/>).
+            </para>
+            </remarks>
+            <author>Rob Lyon</author>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="T:log4net.Appender.UdpAppender">
+             <summary>
+             Sends logging events as connectionless UDP datagrams to a remote host or a 
+             multicast group using an <see cref="T:System.Net.Sockets.UdpClient"/>.
+             </summary>
+             <remarks>
+             <para>
+             UDP guarantees neither that messages arrive, nor that they arrive in the correct order.
+             </para>
+             <para>
+             To view the logging results, a custom application can be developed that listens for logging 
+             events.
+             </para>
+             <para>
+             When decoding events send via this appender remember to use the same encoding
+             to decode the events as was used to send the events. See the <see cref="P:log4net.Appender.UdpAppender.Encoding"/>
+             property to specify the encoding to use.
+             </para>
+             </remarks>
+             <example>
+             This example shows how to log receive logging events that are sent 
+             on IP address 244.0.0.1 and port 8080 to the console. The event is 
+             encoded in the packet as a unicode string and it is decoded as such. 
+             <code lang="C#">
+             IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
+             UdpClient udpClient;
+             byte[] buffer;
+             string loggingEvent;
+             
+             try 
+             {
+                 udpClient = new UdpClient(8080);
+                 
+                 while(true) 
+                 {
+                     buffer = udpClient.Receive(ref remoteEndPoint);
+                     loggingEvent = System.Text.Encoding.Unicode.GetString(buffer);
+                     Console.WriteLine(loggingEvent);
+                 }
+             } 
+             catch(Exception e) 
+             {
+                 Console.WriteLine(e.ToString());
+             }
+             </code>
+             <code lang="Visual Basic">
+             Dim remoteEndPoint as IPEndPoint
+             Dim udpClient as UdpClient
+             Dim buffer as Byte()
+             Dim loggingEvent as String
+             
+             Try 
+                 remoteEndPoint = new IPEndPoint(IPAddress.Any, 0)
+                 udpClient = new UdpClient(8080)
+            
+                 While True
+                     buffer = udpClient.Receive(ByRef remoteEndPoint)
+                     loggingEvent = System.Text.Encoding.Unicode.GetString(buffer)
+                     Console.WriteLine(loggingEvent)
+                 Wend
+             Catch e As Exception
+                 Console.WriteLine(e.ToString())
+             End Try
+             </code>
+             <para>
+             An example configuration section to log information using this appender to the 
+             IP 224.0.0.1 on port 8080:
+             </para>
+             <code lang="XML" escaped="true">
+             <appender name="UdpAppender" type="log4net.Appender.UdpAppender">
+                 <remoteAddress value="224.0.0.1"/>
+                 <remotePort value="8080"/>
+                 <layout type="log4net.Layout.PatternLayout" value="%-5level %logger [%ndc] - %message%newline"/>
+             </appender>
+             </code>
+             </example>
+             <author>Gert Driesen</author>
+             <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Appender.UdpAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.UdpAppender"/> class.
+            </summary>
+            <remarks>
+            The default constructor initializes all fields to their default values.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.UdpAppender.ActivateOptions">
+            <summary>
+            Initialize the appender based on the options set.
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Appender.UdpAppender.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Appender.UdpAppender.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Appender.UdpAppender.ActivateOptions"/> must be called again.
+            </para>
+            <para>
+            The appender will be ignored if no <see cref="P:log4net.Appender.UdpAppender.RemoteAddress"/> was specified or 
+            an invalid remote or local TCP port number was specified.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">The required property <see cref="P:log4net.Appender.UdpAppender.RemoteAddress"/> was not specified.</exception>
+            <exception cref="T:System.ArgumentOutOfRangeException">The TCP port number assigned to <see cref="P:log4net.Appender.UdpAppender.LocalPort"/> or <see cref="P:log4net.Appender.UdpAppender.RemotePort"/> is less than <see cref="F:System.Net.IPEndPoint.MinPort"/> or greater than <see cref="F:System.Net.IPEndPoint.MaxPort"/>.</exception>
+        </member>
+        <member name="M:log4net.Appender.UdpAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            This method is called by the <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/> method.
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            Sends the event using an UDP datagram.
+            </para>
+            <para>
+            Exceptions are passed to the <see cref="P:log4net.Appender.AppenderSkeleton.ErrorHandler"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.UdpAppender.OnClose">
+            <summary>
+            Closes the UDP connection and releases all resources associated with 
+            this <see cref="T:log4net.Appender.UdpAppender"/> instance.
+            </summary>
+            <remarks>
+            <para>
+            Disables the underlying <see cref="T:System.Net.Sockets.UdpClient"/> and releases all managed 
+            and unmanaged resources associated with the <see cref="T:log4net.Appender.UdpAppender"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.UdpAppender.InitializeClientConnection">
+            <summary>
+            Initializes the underlying  <see cref="T:System.Net.Sockets.UdpClient"/> connection.
+            </summary>
+            <remarks>
+            <para>
+            The underlying <see cref="T:System.Net.Sockets.UdpClient"/> is initialized and binds to the 
+            port number from which you intend to communicate.
+            </para>
+            <para>
+            Exceptions are passed to the <see cref="P:log4net.Appender.AppenderSkeleton.ErrorHandler"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.UdpAppender.m_remoteAddress">
+            <summary>
+            The IP address of the remote host or multicast group to which 
+            the logging event will be sent.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.UdpAppender.m_remotePort">
+            <summary>
+            The TCP port number of the remote host or multicast group to 
+            which the logging event will be sent.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.UdpAppender.m_remoteEndPoint">
+            <summary>
+            The cached remote endpoint to which the logging events will be sent.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.UdpAppender.m_localPort">
+            <summary>
+            The TCP port number from which the <see cref="T:System.Net.Sockets.UdpClient"/> will communicate.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.UdpAppender.m_client">
+            <summary>
+            The <see cref="T:System.Net.Sockets.UdpClient"/> instance that will be used for sending the 
+            logging events.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.UdpAppender.m_encoding">
+            <summary>
+            The encoding to use for the packet.
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.UdpAppender.RemoteAddress">
+            <summary>
+            Gets or sets the IP address of the remote host or multicast group to which
+            the underlying <see cref="T:System.Net.Sockets.UdpClient"/> should sent the logging event.
+            </summary>
+            <value>
+            The IP address of the remote host or multicast group to which the logging event 
+            will be sent.
+            </value>
+            <remarks>
+            <para>
+            Multicast addresses are identified by IP class <b>D</b> addresses (in the range 224.0.0.0 to
+            239.255.255.255).  Multicast packets can pass across different networks through routers, so
+            it is possible to use multicasts in an Internet scenario as long as your network provider 
+            supports multicasting.
+            </para>
+            <para>
+            Hosts that want to receive particular multicast messages must register their interest by joining
+            the multicast group.  Multicast messages are not sent to networks where no host has joined
+            the multicast group.  Class <b>D</b> IP addresses are used for multicast groups, to differentiate
+            them from normal host addresses, allowing nodes to easily detect if a message is of interest.
+            </para>
+            <para>
+            Static multicast addresses that are needed globally are assigned by IANA.  A few examples are listed in the table below:
+            </para>
+            <para>
+            <list type="table">
+                <listheader>
+                    <term>IP Address</term>
+                    <description>Description</description>
+                </listheader>
+                <item>
+                    <term>224.0.0.1</term>
+                    <description>
+                        <para>
+                        Sends a message to all system on the subnet.
+                        </para>
+                    </description>
+                </item>
+                <item>
+                    <term>224.0.0.2</term>
+                    <description>
+                        <para>
+                        Sends a message to all routers on the subnet.
+                        </para>
+                    </description>
+                </item>
+                <item>
+                    <term>224.0.0.12</term>
+                    <description>
+                        <para>
+                        The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet.
+                        </para>
+                    </description>
+                </item>
+            </list>
+            </para>
+            <para>
+            A complete list of actually reserved multicast addresses and their owners in the ranges
+            defined by RFC 3171 can be found at the <A href="http://www.iana.org/assignments/multicast-addresses">IANA web site</A>. 
+            </para>
+            <para>
+            The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative 
+            addresses.  These addresses can be reused with other local groups.  Routers are typically 
+            configured with filters to prevent multicast traffic in this range from flowing outside
+            of the local network.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.UdpAppender.RemotePort">
+            <summary>
+            Gets or sets the TCP port number of the remote host or multicast group to which 
+            the underlying <see cref="T:System.Net.Sockets.UdpClient"/> should sent the logging event.
+            </summary>
+            <value>
+            An integer value in the range <see cref="F:System.Net.IPEndPoint.MinPort"/> to <see cref="F:System.Net.IPEndPoint.MaxPort"/> 
+            indicating the TCP port number of the remote host or multicast group to which the logging event 
+            will be sent.
+            </value>
+            <remarks>
+            The underlying <see cref="T:System.Net.Sockets.UdpClient"/> will send messages to this TCP port number
+            on the remote host or multicast group.
+            </remarks>
+            <exception cref="T:System.ArgumentOutOfRangeException">The value specified is less than <see cref="F:System.Net.IPEndPoint.MinPort"/> or greater than <see cref="F:System.Net.IPEndPoint.MaxPort"/>.</exception>
+        </member>
+        <member name="P:log4net.Appender.UdpAppender.LocalPort">
+            <summary>
+            Gets or sets the TCP port number from which the underlying <see cref="T:System.Net.Sockets.UdpClient"/> will communicate.
+            </summary>
+            <value>
+            An integer value in the range <see cref="F:System.Net.IPEndPoint.MinPort"/> to <see cref="F:System.Net.IPEndPoint.MaxPort"/> 
+            indicating the TCP port number from which the underlying <see cref="T:System.Net.Sockets.UdpClient"/> will communicate.
+            </value>
+            <remarks>
+            <para>
+            The underlying <see cref="T:System.Net.Sockets.UdpClient"/> will bind to this port for sending messages.
+            </para>
+            <para>
+            Setting the value to 0 (the default) will cause the udp client not to bind to
+            a local port.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentOutOfRangeException">The value specified is less than <see cref="F:System.Net.IPEndPoint.MinPort"/> or greater than <see cref="F:System.Net.IPEndPoint.MaxPort"/>.</exception>
+        </member>
+        <member name="P:log4net.Appender.UdpAppender.Encoding">
+            <summary>
+            Gets or sets <see cref="P:log4net.Appender.UdpAppender.Encoding"/> used to write the packets.
+            </summary>
+            <value>
+            The <see cref="P:log4net.Appender.UdpAppender.Encoding"/> used to write the packets.
+            </value>
+            <remarks>
+            <para>
+            The <see cref="P:log4net.Appender.UdpAppender.Encoding"/> used to write the packets.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.UdpAppender.Client">
+            <summary>
+            Gets or sets the underlying <see cref="T:System.Net.Sockets.UdpClient"/>.
+            </summary>
+            <value>
+            The underlying <see cref="T:System.Net.Sockets.UdpClient"/>.
+            </value>
+            <remarks>
+            <see cref="T:log4net.Appender.UdpAppender"/> creates a <see cref="T:System.Net.Sockets.UdpClient"/> to send logging events 
+            over a network.  Classes deriving from <see cref="T:log4net.Appender.UdpAppender"/> can use this
+            property to get or set this <see cref="T:System.Net.Sockets.UdpClient"/>.  Use the underlying <see cref="T:System.Net.Sockets.UdpClient"/>
+            returned from <see cref="P:log4net.Appender.UdpAppender.Client"/> if you require access beyond that which 
+            <see cref="T:log4net.Appender.UdpAppender"/> provides.
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.UdpAppender.RemoteEndPoint">
+            <summary>
+            Gets or sets the cached remote endpoint to which the logging events should be sent.
+            </summary>
+            <value>
+            The cached remote endpoint to which the logging events will be sent.
+            </value>
+            <remarks>
+            The <see cref="M:log4net.Appender.UdpAppender.ActivateOptions"/> method will initialize the remote endpoint 
+            with the values of the <see cref="P:log4net.Appender.UdpAppender.RemoteAddress"/> and <see cref="P:log4net.Appender.UdpAppender.RemotePort"/>
+            properties.
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.UdpAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.DefaultSyslogPort">
+            <summary>
+            Syslog port 514
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.RemoteSyslogAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.RemoteSyslogAppender"/> class.
+            </summary>
+            <remarks>
+            This instance of the <see cref="T:log4net.Appender.RemoteSyslogAppender"/> class is set up to write 
+            to a remote syslog daemon.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RemoteSyslogAppender.AddMapping(log4net.Appender.RemoteSyslogAppender.LevelSeverity)">
+            <summary>
+            Add a mapping of level to severity
+            </summary>
+            <param name="mapping">The mapping to add</param>
+            <remarks>
+            <para>
+            Add a <see cref="T:log4net.Appender.RemoteSyslogAppender.LevelSeverity"/> mapping to this appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RemoteSyslogAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            This method is called by the <see cref="M:log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/> method.
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            Writes the event to a remote syslog daemon.
+            </para>
+            <para>
+            The format of the output will depend on the appender's layout.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RemoteSyslogAppender.ActivateOptions">
+            <summary>
+            Initialize the options for this appender
+            </summary>
+            <remarks>
+            <para>
+            Initialize the level to syslog severity mappings set on this appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RemoteSyslogAppender.GetSeverity(log4net.Core.Level)">
+            <summary>
+            Translates a log4net level to a syslog severity.
+            </summary>
+            <param name="level">A log4net level.</param>
+            <returns>A syslog severity.</returns>
+            <remarks>
+            <para>
+            Translates a log4net level to a syslog severity.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RemoteSyslogAppender.GeneratePriority(log4net.Appender.RemoteSyslogAppender.SyslogFacility,log4net.Appender.RemoteSyslogAppender.SyslogSeverity)">
+            <summary>
+            Generate a syslog priority.
+            </summary>
+            <param name="facility">The syslog facility.</param>
+            <param name="severity">The syslog severity.</param>
+            <returns>A syslog priority.</returns>
+            <remarks>
+            <para>
+            Generate a syslog priority.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.m_facility">
+            <summary>
+            The facility. The default facility is <see cref="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.User"/>.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.m_identity">
+            <summary>
+            The message identity
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.m_levelMapping">
+            <summary>
+            Mapping from level object to syslog severity
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.RemoteSyslogAppender.Identity">
+            <summary>
+            Message identity
+            </summary>
+            <remarks>
+            <para>
+            An identifier is specified with each log message. This can be specified
+            by setting the <see cref="P:log4net.Appender.RemoteSyslogAppender.Identity"/> property. The identity (also know 
+            as the tag) must not contain white space. The default value for the
+            identity is the application name (from <see cref="P:log4net.Core.LoggingEvent.Domain"/>).
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.RemoteSyslogAppender.Facility">
+            <summary>
+            Syslog facility
+            </summary>
+            <remarks>
+            Set to one of the <see cref="T:log4net.Appender.RemoteSyslogAppender.SyslogFacility"/> values. The list of
+            facilities is predefined and cannot be extended. The default value
+            is <see cref="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.User"/>.
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.RemoteSyslogAppender.SyslogSeverity">
+            <summary>
+            syslog severities
+            </summary>
+            <remarks>
+            <para>
+            The syslog severities.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogSeverity.Emergency">
+            <summary>
+            system is unusable
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogSeverity.Alert">
+            <summary>
+            action must be taken immediately
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogSeverity.Critical">
+            <summary>
+            critical conditions
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogSeverity.Error">
+            <summary>
+            error conditions
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogSeverity.Warning">
+            <summary>
+            warning conditions
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogSeverity.Notice">
+            <summary>
+            normal but significant condition
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogSeverity.Informational">
+            <summary>
+            informational
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogSeverity.Debug">
+            <summary>
+            debug-level messages
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.RemoteSyslogAppender.SyslogFacility">
+            <summary>
+            syslog facilities
+            </summary>
+            <remarks>
+            <para>
+            The syslog facilities
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Kernel">
+            <summary>
+            kernel messages
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.User">
+            <summary>
+            random user-level messages
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Mail">
+            <summary>
+            mail system
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Daemons">
+            <summary>
+            system daemons
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Authorization">
+            <summary>
+            security/authorization messages
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Syslog">
+            <summary>
+            messages generated internally by syslogd
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Printer">
+            <summary>
+            line printer subsystem
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.News">
+            <summary>
+            network news subsystem
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Uucp">
+            <summary>
+            UUCP subsystem
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Clock">
+            <summary>
+            clock (cron/at) daemon
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Authorization2">
+            <summary>
+            security/authorization  messages (private)
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Ftp">
+            <summary>
+            ftp daemon
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Ntp">
+            <summary>
+            NTP subsystem
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Audit">
+            <summary>
+            log audit
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Alert">
+            <summary>
+            log alert
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Clock2">
+            <summary>
+            clock daemon
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Local0">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Local1">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Local2">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Local3">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Local4">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Local5">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Local6">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemoteSyslogAppender.SyslogFacility.Local7">
+            <summary>
+            reserved for local use
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.RemoteSyslogAppender.LevelSeverity">
+            <summary>
+            A class to act as a mapping between the level that a logging call is made at and
+            the syslog severity that is should be logged at.
+            </summary>
+            <remarks>
+            <para>
+            A class to act as a mapping between the level that a logging call is made at and
+            the syslog severity that is should be logged at.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.RemoteSyslogAppender.LevelSeverity.Severity">
+            <summary>
+            The mapped syslog severity for the specified level
+            </summary>
+            <remarks>
+            <para>
+            Required property.
+            The mapped syslog severity for the specified level
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.RemotingAppender">
+            <summary>
+            Delivers logging events to a remote logging sink. 
+            </summary>
+            <remarks>
+            <para>
+            This Appender is designed to deliver events to a remote sink. 
+            That is any object that implements the <see cref="T:log4net.Appender.RemotingAppender.IRemoteLoggingSink"/>
+            interface. It delivers the events using .NET remoting. The
+            object to deliver events to is specified by setting the
+            appenders <see cref="P:log4net.Appender.RemotingAppender.Sink"/> property.</para>
+            <para>
+            The RemotingAppender buffers events before sending them. This allows it to 
+            make more efficient use of the remoting infrastructure.</para>
+            <para>
+            Once the buffer is full the events are still not sent immediately. 
+            They are scheduled to be sent using a pool thread. The effect is that 
+            the send occurs asynchronously. This is very important for a 
+            number of non obvious reasons. The remoting infrastructure will 
+            flow thread local variables (stored in the <see cref="T:System.Runtime.Remoting.Messaging.CallContext"/>),
+            if they are marked as <see cref="T:System.Runtime.Remoting.Messaging.ILogicalThreadAffinative"/>, across the 
+            remoting boundary. If the server is not contactable then
+            the remoting infrastructure will clear the <see cref="T:System.Runtime.Remoting.Messaging.ILogicalThreadAffinative"/>
+            objects from the <see cref="T:System.Runtime.Remoting.Messaging.CallContext"/>. To prevent a logging failure from
+            having side effects on the calling application the remoting call must be made
+            from a separate thread to the one used by the application. A <see cref="T:System.Threading.ThreadPool"/>
+            thread is used for this. If no <see cref="T:System.Threading.ThreadPool"/> thread is available then
+            the events will block in the thread pool manager until a thread is available.</para>
+            <para>
+            Because the events are sent asynchronously using pool threads it is possible to close 
+            this appender before all the queued events have been sent.
+            When closing the appender attempts to wait until all the queued events have been sent, but 
+            this will timeout after 30 seconds regardless.</para>
+            <para>
+            If this appender is being closed because the <see cref="E:System.AppDomain.ProcessExit"/>
+            event has fired it may not be possible to send all the queued events. During process
+            exit the runtime limits the time that a <see cref="E:System.AppDomain.ProcessExit"/>
+            event handler is allowed to run for. If the runtime terminates the threads before
+            the queued events have been sent then they will be lost. To ensure that all events
+            are sent the appender must be closed before the application exits. See 
+            <see cref="M:log4net.Core.LoggerManager.Shutdown"/> for details on how to shutdown
+            log4net programmatically.</para>
+            </remarks>
+            <seealso cref="T:log4net.Appender.RemotingAppender.IRemoteLoggingSink"/>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+            <author>Daniel Cazzulino</author>
+        </member>
+        <member name="M:log4net.Appender.RemotingAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.RemotingAppender"/> class.
+            </summary>
+            <remarks>
+            <para>
+            Default constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RemotingAppender.ActivateOptions">
+            <summary>
+            Initialize the appender based on the options set
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Appender.RemotingAppender.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Appender.RemotingAppender.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Appender.RemotingAppender.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RemotingAppender.SendBuffer(log4net.Core.LoggingEvent[])">
+            <summary>
+            Send the contents of the buffer to the remote sink.
+            </summary>
+            <remarks>
+            The events are not sent immediately. They are scheduled to be sent
+            using a pool thread. The effect is that the send occurs asynchronously.
+            This is very important for a number of non obvious reasons. The remoting
+            infrastructure will flow thread local variables (stored in the <see cref="T:System.Runtime.Remoting.Messaging.CallContext"/>),
+            if they are marked as <see cref="T:System.Runtime.Remoting.Messaging.ILogicalThreadAffinative"/>, across the 
+            remoting boundary. If the server is not contactable then
+            the remoting infrastructure will clear the <see cref="T:System.Runtime.Remoting.Messaging.ILogicalThreadAffinative"/>
+            objects from the <see cref="T:System.Runtime.Remoting.Messaging.CallContext"/>. To prevent a logging failure from
+            having side effects on the calling application the remoting call must be made
+            from a separate thread to the one used by the application. A <see cref="T:System.Threading.ThreadPool"/>
+            thread is used for this. If no <see cref="T:System.Threading.ThreadPool"/> thread is available then
+            the events will block in the thread pool manager until a thread is available.
+            </remarks>
+            <param name="events">The events to send.</param>
+        </member>
+        <member name="M:log4net.Appender.RemotingAppender.OnClose">
+            <summary>
+            Override base class close.
+            </summary>
+            <remarks>
+            <para>
+            This method waits while there are queued work items. The events are
+            sent asynchronously using <see cref="T:System.Threading.ThreadPool"/> work items. These items
+            will be sent once a thread pool thread is available to send them, therefore
+            it is possible to close the appender before all the queued events have been
+            sent.</para>
+            <para>
+            This method attempts to wait until all the queued events have been sent, but this 
+            method will timeout after 30 seconds regardless.</para>
+            <para>
+            If the appender is being closed because the <see cref="E:System.AppDomain.ProcessExit"/>
+            event has fired it may not be possible to send all the queued events. During process
+            exit the runtime limits the time that a <see cref="E:System.AppDomain.ProcessExit"/>
+            event handler is allowed to run for.</para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RemotingAppender.BeginAsyncSend">
+            <summary>
+            A work item is being queued into the thread pool
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.RemotingAppender.EndAsyncSend">
+            <summary>
+            A work item from the thread pool has completed
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.RemotingAppender.SendBufferCallback(System.Object)">
+            <summary>
+            Send the contents of the buffer to the remote sink.
+            </summary>
+            <remarks>
+            This method is designed to be used with the <see cref="T:System.Threading.ThreadPool"/>.
+            This method expects to be passed an array of <see cref="T:log4net.Core.LoggingEvent"/>
+            objects in the state param.
+            </remarks>
+            <param name="state">the logging events to send</param>
+        </member>
+        <member name="F:log4net.Appender.RemotingAppender.m_sinkUrl">
+            <summary>
+            The URL of the remote sink.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemotingAppender.m_sinkObj">
+            <summary>
+            The local proxy (.NET remoting) for the remote logging sink.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemotingAppender.m_queuedCallbackCount">
+            <summary>
+            The number of queued callbacks currently waiting or executing
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RemotingAppender.m_workQueueEmptyEvent">
+            <summary>
+            Event used to signal when there are no queued work items
+            </summary>
+            <remarks>
+            This event is set when there are no queued work items. In this
+            state it is safe to close the appender.
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.RemotingAppender.Sink">
+            <summary>
+            Gets or sets the URL of the well-known object that will accept 
+            the logging events.
+            </summary>
+            <value>
+            The well-known URL of the remote sink.
+            </value>
+            <remarks>
+            <para>
+            The URL of the remoting sink that will accept logging events.
+            The sink must implement the <see cref="T:log4net.Appender.RemotingAppender.IRemoteLoggingSink"/>
+            interface.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.RemotingAppender.IRemoteLoggingSink">
+            <summary>
+            Interface used to deliver <see cref="T:log4net.Core.LoggingEvent"/> objects to a remote sink.
+            </summary>
+            <remarks>
+            This interface must be implemented by a remoting sink
+            if the <see cref="T:log4net.Appender.RemotingAppender"/> is to be used
+            to deliver logging events to the sink.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RemotingAppender.IRemoteLoggingSink.LogEvents(log4net.Core.LoggingEvent[])">
+            <summary>
+            Delivers logging events to the remote sink
+            </summary>
+            <param name="events">Array of events to log.</param>
+            <remarks>
+            <para>
+            Delivers logging events to the remote sink
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.RollingFileAppender">
+            <summary>
+            Appender that rolls log files based on size or date or both.
+            </summary>
+            <remarks>
+            <para>
+            RollingFileAppender can roll log files based on size or date or both
+            depending on the setting of the <see cref="P:log4net.Appender.RollingFileAppender.RollingStyle"/> property.
+            When set to <see cref="F:log4net.Appender.RollingFileAppender.RollingMode.Size"/> the log file will be rolled
+            once its size exceeds the <see cref="P:log4net.Appender.RollingFileAppender.MaximumFileSize"/>.
+            When set to <see cref="F:log4net.Appender.RollingFileAppender.RollingMode.Date"/> the log file will be rolled
+            once the date boundary specified in the <see cref="P:log4net.Appender.RollingFileAppender.DatePattern"/> property
+            is crossed.
+            When set to <see cref="F:log4net.Appender.RollingFileAppender.RollingMode.Composite"/> the log file will be
+            rolled once the date boundary specified in the <see cref="P:log4net.Appender.RollingFileAppender.DatePattern"/> property
+            is crossed, but within a date boundary the file will also be rolled
+            once its size exceeds the <see cref="P:log4net.Appender.RollingFileAppender.MaximumFileSize"/>.
+            When set to <see cref="F:log4net.Appender.RollingFileAppender.RollingMode.Once"/> the log file will be rolled when
+            the appender is configured. This effectively means that the log file can be
+            rolled once per program execution.
+            </para>
+            <para>
+            A of few additional optional features have been added:
+            <list type="bullet">
+            <item>Attach date pattern for current log file <see cref="P:log4net.Appender.RollingFileAppender.StaticLogFileName"/></item>
+            <item>Backup number increments for newer files <see cref="P:log4net.Appender.RollingFileAppender.CountDirection"/></item>
+            <item>Infinite number of backups by file size <see cref="P:log4net.Appender.RollingFileAppender.MaxSizeRollBackups"/></item>
+            </list>
+            </para>
+            
+            <note>
+            <para>
+            For large or infinite numbers of backup files a <see cref="P:log4net.Appender.RollingFileAppender.CountDirection"/> 
+            greater than zero is highly recommended, otherwise all the backup files need
+            to be renamed each time a new backup is created.
+            </para>
+            <para>
+            When Date/Time based rolling is used setting <see cref="P:log4net.Appender.RollingFileAppender.StaticLogFileName"/> 
+            to <see langword="true"/> will reduce the number of file renamings to few or none.
+            </para>
+            </note>
+            
+            <note type="caution">
+            <para>
+            Changing <see cref="P:log4net.Appender.RollingFileAppender.StaticLogFileName"/> or <see cref="P:log4net.Appender.RollingFileAppender.CountDirection"/> without clearing
+            the log file directory of backup files will cause unexpected and unwanted side effects.  
+            </para>
+            </note>
+            
+            <para>
+            If Date/Time based rolling is enabled this appender will attempt to roll existing files
+            in the directory without a Date/Time tag based on the last write date of the base log file.
+            The appender only rolls the log file when a message is logged. If Date/Time based rolling 
+            is enabled then the appender will not roll the log file at the Date/Time boundary but
+            at the point when the next message is logged after the boundary has been crossed.
+            </para>
+            
+            <para>
+            The <see cref="T:log4net.Appender.RollingFileAppender"/> extends the <see cref="T:log4net.Appender.FileAppender"/> and
+            has the same behavior when opening the log file.
+            The appender will first try to open the file for writing when <see cref="M:log4net.Appender.RollingFileAppender.ActivateOptions"/>
+            is called. This will typically be during configuration.
+            If the file cannot be opened for writing the appender will attempt
+            to open the file again each time a message is logged to the appender.
+            If the file cannot be opened for writing when a message is logged then
+            the message will be discarded by this appender.
+            </para>
+            <para>
+            When rolling a backup file necessitates deleting an older backup file the
+            file to be deleted is moved to a temporary name before being deleted.
+            </para>
+            
+            <note type="caution">
+            <para>
+            A maximum number of backup files when rolling on date/time boundaries is not supported.
+            </para>
+            </note>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+            <author>Aspi Havewala</author>
+            <author>Douglas de la Torre</author>
+            <author>Edward Smit</author>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.RollingFileAppender"/> class.
+            </summary>
+            <remarks>
+            <para>
+            Default constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.SetQWForFiles(System.IO.TextWriter)">
+            <summary>
+            Sets the quiet writer being used.
+            </summary>
+            <remarks>
+            This method can be overridden by sub classes.
+            </remarks>
+            <param name="writer">the writer to set</param>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            Write out a logging event.
+            </summary>
+            <param name="loggingEvent">the event to write to file.</param>
+            <remarks>
+            <para>
+            Handles append time behavior for RollingFileAppender.  This checks
+            if a roll over either by date (checked first) or time (checked second)
+            is need and then appends to the file last.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.Append(log4net.Core.LoggingEvent[])">
+            <summary>
+            Write out an array of logging events.
+            </summary>
+            <param name="loggingEvents">the events to write to file.</param>
+            <remarks>
+            <para>
+            Handles append time behavior for RollingFileAppender.  This checks
+            if a roll over either by date (checked first) or time (checked second)
+            is need and then appends to the file last.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.AdjustFileBeforeAppend">
+            <summary>
+            Performs any required rolling before outputting the next event
+            </summary>
+            <remarks>
+            <para>
+            Handles append time behavior for RollingFileAppender.  This checks
+            if a roll over either by date (checked first) or time (checked second)
+            is need and then appends to the file last.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.OpenFile(System.String,System.Boolean)">
+            <summary>
+            Creates and opens the file for logging.  If <see cref="P:log4net.Appender.RollingFileAppender.StaticLogFileName"/>
+            is false then the fully qualified name is determined and used.
+            </summary>
+            <param name="fileName">the name of the file to open</param>
+            <param name="append">true to append to existing file</param>
+            <remarks>
+            <para>This method will ensure that the directory structure
+            for the <paramref name="fileName"/> specified exists.</para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.GetNextOutputFileName(System.String)">
+            <summary>
+            Get the current output file name
+            </summary>
+            <param name="fileName">the base file name</param>
+            <returns>the output file name</returns>
+            <remarks>
+            The output file name is based on the base fileName specified.
+            If <see cref="P:log4net.Appender.RollingFileAppender.StaticLogFileName"/> is set then the output 
+            file name is the same as the base file passed in. Otherwise
+            the output file depends on the date pattern, on the count
+            direction or both.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.DetermineCurSizeRollBackups">
+            <summary>
+            Determines curSizeRollBackups (only within the current roll point)
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.GetWildcardPatternForFile(System.String)">
+            <summary>
+            Generates a wildcard pattern that can be used to find all files
+            that are similar to the base file name.
+            </summary>
+            <param name="baseFileName"></param>
+            <returns></returns>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.GetExistingFiles(System.String)">
+            <summary>
+            Builds a list of filenames for all files matching the base filename plus a file
+            pattern.
+            </summary>
+            <param name="baseFilePath"></param>
+            <returns></returns>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.RollOverIfDateBoundaryCrossing">
+            <summary>
+            Initiates a roll over if needed for crossing a date boundary since the last run.
+            </summary>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.ExistingInit">
+            <summary>
+            Initializes based on existing conditions at time of <see cref="M:log4net.Appender.RollingFileAppender.ActivateOptions"/>.
+            </summary>
+            <remarks>
+            <para>
+            Initializes based on existing conditions at time of <see cref="M:log4net.Appender.RollingFileAppender.ActivateOptions"/>.
+            The following is done
+            <list type="bullet">
+            <item>determine curSizeRollBackups (only within the current roll point)</item>
+            <item>initiates a roll over if needed for crossing a date boundary since the last run.</item>
+            </list>
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.InitializeFromOneFile(System.String,System.String)">
+            <summary>
+            Does the work of bumping the 'current' file counter higher
+            to the highest count when an incremental file name is seen.
+            The highest count is either the first file (when count direction
+            is greater than 0) or the last file (when count direction less than 0).
+            In either case, we want to know the highest count that is present.
+            </summary>
+            <param name="baseFile"></param>
+            <param name="curFileName"></param>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.InitializeRollBackups(System.String,System.Collections.ArrayList)">
+            <summary>
+            Takes a list of files and a base file name, and looks for 
+            'incremented' versions of the base file.  Bumps the max
+            count up to the highest count seen.
+            </summary>
+            <param name="baseFile"></param>
+            <param name="arrayFiles"></param>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.ComputeCheckPeriod(System.String)">
+            <summary>
+            Calculates the RollPoint for the datePattern supplied.
+            </summary>
+            <param name="datePattern">the date pattern to calculate the check period for</param>
+            <returns>The RollPoint that is most accurate for the date pattern supplied</returns>
+            <remarks>
+            Essentially the date pattern is examined to determine what the
+            most suitable roll point is. The roll point chosen is the roll point
+            with the smallest period that can be detected using the date pattern
+            supplied. i.e. if the date pattern only outputs the year, month, day 
+            and hour then the smallest roll point that can be detected would be
+            and hourly roll point as minutes could not be detected.
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.ActivateOptions">
+            <summary>
+            Initialize the appender based on the options set
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Appender.RollingFileAppender.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Appender.RollingFileAppender.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Appender.RollingFileAppender.ActivateOptions"/> must be called again.
+            </para>
+            <para>
+            Sets initial conditions including date/time roll over information, first check,
+            scheduledFilename, and calls <see cref="M:log4net.Appender.RollingFileAppender.ExistingInit"/> to initialize
+            the current number of backups.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.RollOverTime(System.Boolean)">
+            <summary>
+            Rollover the file(s) to date/time tagged file(s).
+            </summary>
+            <param name="fileIsOpen">set to true if the file to be rolled is currently open</param>
+            <remarks>
+            <para>
+            Rollover the file(s) to date/time tagged file(s).
+            Resets curSizeRollBackups. 
+            If fileIsOpen is set then the new file is opened (through SafeOpenFile).
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.RollFile(System.String,System.String)">
+            <summary>
+            Renames file <paramref name="fromFile"/> to file <paramref name="toFile"/>.
+            </summary>
+            <param name="fromFile">Name of existing file to roll.</param>
+            <param name="toFile">New name for file.</param>
+            <remarks>
+            <para>
+            Renames file <paramref name="fromFile"/> to file <paramref name="toFile"/>. It
+            also checks for existence of target file and deletes if it does.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.FileExists(System.String)">
+            <summary>
+            Test if a file exists at a specified path
+            </summary>
+            <param name="path">the path to the file</param>
+            <returns>true if the file exists</returns>
+            <remarks>
+            <para>
+            Test if a file exists at a specified path
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.DeleteFile(System.String)">
+            <summary>
+            Deletes the specified file if it exists.
+            </summary>
+            <param name="fileName">The file to delete.</param>
+            <remarks>
+            <para>
+            Delete a file if is exists.
+            The file is first moved to a new filename then deleted.
+            This allows the file to be removed even when it cannot
+            be deleted, but it still can be moved.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.RollOverSize">
+            <summary>
+            Implements file roll base on file size.
+            </summary>
+            <remarks>
+            <para>
+            If the maximum number of size based backups is reached
+            (<c>curSizeRollBackups == maxSizeRollBackups</c>) then the oldest
+            file is deleted -- its index determined by the sign of countDirection.
+            If <c>countDirection</c> &lt; 0, then files
+            {<c>File.1</c>, ..., <c>File.curSizeRollBackups -1</c>}
+            are renamed to {<c>File.2</c>, ...,
+            <c>File.curSizeRollBackups</c>}. Moreover, <c>File</c> is
+            renamed <c>File.1</c> and closed.
+            </para>
+            <para>
+            A new file is created to receive further log output.
+            </para>
+            <para>
+            If <c>maxSizeRollBackups</c> is equal to zero, then the
+            <c>File</c> is truncated with no backup files created.
+            </para>
+            <para>
+            If <c>maxSizeRollBackups</c> &lt; 0, then <c>File</c> is
+            renamed if needed and no files are deleted.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.RollOverRenameFiles(System.String)">
+            <summary>
+            Implements file roll.
+            </summary>
+            <param name="baseFileName">the base name to rename</param>
+            <remarks>
+            <para>
+            If the maximum number of size based backups is reached
+            (<c>curSizeRollBackups == maxSizeRollBackups</c>) then the oldest
+            file is deleted -- its index determined by the sign of countDirection.
+            If <c>countDirection</c> &lt; 0, then files
+            {<c>File.1</c>, ..., <c>File.curSizeRollBackups -1</c>}
+            are renamed to {<c>File.2</c>, ...,
+            <c>File.curSizeRollBackups</c>}. 
+            </para>
+            <para>
+            If <c>maxSizeRollBackups</c> is equal to zero, then the
+            <c>File</c> is truncated with no backup files created.
+            </para>
+            <para>
+            If <c>maxSizeRollBackups</c> &lt; 0, then <c>File</c> is
+            renamed if needed and no files are deleted.
+            </para>
+            <para>
+            This is called by <see cref="M:log4net.Appender.RollingFileAppender.RollOverSize"/> to rename the files.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.RollingFileAppender.NextCheckDate(System.DateTime,log4net.Appender.RollingFileAppender.RollPoint)">
+            <summary>
+            Get the start time of the next window for the current rollpoint
+            </summary>
+            <param name="currentDateTime">the current date</param>
+            <param name="rollPoint">the type of roll point we are working with</param>
+            <returns>the start time for the next roll point an interval after the currentDateTime date</returns>
+            <remarks>
+            <para>
+            Returns the date of the next roll point after the currentDateTime date passed to the method.
+            </para>
+            <para>
+            The basic strategy is to subtract the time parts that are less significant
+            than the rollpoint from the current time. This should roll the time back to
+            the start of the time window for the current rollpoint. Then we add 1 window
+            worth of time and get the start time of the next window for the rollpoint.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_dateTime">
+            <summary>
+            This object supplies the current date/time.  Allows test code to plug in
+            a method to control this class when testing date/time based rolling.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_datePattern">
+            <summary>
+            The date pattern. By default, the pattern is set to <c>".yyyy-MM-dd"</c> 
+            meaning daily rollover.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_scheduledFilename">
+            <summary>
+            The actual formatted filename that is currently being written to
+            or will be the file transferred to on roll over
+            (based on staticLogFileName).
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_nextCheck">
+            <summary>
+            The timestamp when we shall next recompute the filename.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_now">
+            <summary>
+            Holds date of last roll over
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_rollPoint">
+            <summary>
+            The type of rolling done
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_maxFileSize">
+            <summary>
+            The default maximum file size is 10MB
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_maxSizeRollBackups">
+            <summary>
+            There is zero backup files by default
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_curSizeRollBackups">
+            <summary>
+            How many sized based backups have been made so far
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_countDirection">
+            <summary>
+            The rolling file count direction. 
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_rollingStyle">
+            <summary>
+            The rolling mode used in this appender.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_rollDate">
+            <summary>
+            Cache flag set if we are rolling by date.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_rollSize">
+            <summary>
+            Cache flag set if we are rolling by size.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_staticLogFileName">
+            <summary>
+            Value indicating whether to always log to the same file.
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.m_baseFileName">
+            <summary>
+            FileName provided in configuration.  Used for rolling properly
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.s_date1970">
+            <summary>
+            The 1st of January 1970 in UTC
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.RollingFileAppender.DatePattern">
+            <summary>
+            Gets or sets the date pattern to be used for generating file names
+            when rolling over on date.
+            </summary>
+            <value>
+            The date pattern to be used for generating file names when rolling 
+            over on date.
+            </value>
+            <remarks>
+            <para>
+            Takes a string in the same format as expected by 
+            <see cref="T:log4net.DateFormatter.SimpleDateFormatter"/>.
+            </para>
+            <para>
+            This property determines the rollover schedule when rolling over
+            on date.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.RollingFileAppender.MaxSizeRollBackups">
+            <summary>
+            Gets or sets the maximum number of backup files that are kept before
+            the oldest is erased.
+            </summary>
+            <value>
+            The maximum number of backup files that are kept before the oldest is
+            erased.
+            </value>
+            <remarks>
+            <para>
+            If set to zero, then there will be no backup files and the log file 
+            will be truncated when it reaches <see cref="P:log4net.Appender.RollingFileAppender.MaxFileSize"/>.  
+            </para>
+            <para>
+            If a negative number is supplied then no deletions will be made.  Note 
+            that this could result in very slow performance as a large number of 
+            files are rolled over unless <see cref="P:log4net.Appender.RollingFileAppender.CountDirection"/> is used.
+            </para>
+            <para>
+            The maximum applies to <b>each</b> time based group of files and 
+            <b>not</b> the total.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.RollingFileAppender.MaxFileSize">
+            <summary>
+            Gets or sets the maximum size that the output file is allowed to reach
+            before being rolled over to backup files.
+            </summary>
+            <value>
+            The maximum size in bytes that the output file is allowed to reach before being 
+            rolled over to backup files.
+            </value>
+            <remarks>
+            <para>
+            This property is equivalent to <see cref="P:log4net.Appender.RollingFileAppender.MaximumFileSize"/> except
+            that it is required for differentiating the setter taking a
+            <see cref="T:System.Int64"/> argument from the setter taking a <see cref="T:System.String"/> 
+            argument.
+            </para>
+            <para>
+            The default maximum file size is 10MB (10*1024*1024).
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.RollingFileAppender.MaximumFileSize">
+            <summary>
+            Gets or sets the maximum size that the output file is allowed to reach
+            before being rolled over to backup files.
+            </summary>
+            <value>
+            The maximum size that the output file is allowed to reach before being 
+            rolled over to backup files.
+            </value>
+            <remarks>
+            <para>
+            This property allows you to specify the maximum size with the
+            suffixes "KB", "MB" or "GB" so that the size is interpreted being 
+            expressed respectively in kilobytes, megabytes or gigabytes. 
+            </para>
+            <para>
+            For example, the value "10KB" will be interpreted as 10240 bytes.
+            </para>
+            <para>
+            The default maximum file size is 10MB.
+            </para>
+            <para>
+            If you have the option to set the maximum file size programmatically
+            consider using the <see cref="P:log4net.Appender.RollingFileAppender.MaxFileSize"/> property instead as this
+            allows you to set the size in bytes as a <see cref="T:System.Int64"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.RollingFileAppender.CountDirection">
+            <summary>
+            Gets or sets the rolling file count direction. 
+            </summary>
+            <value>
+            The rolling file count direction.
+            </value>
+            <remarks>
+            <para>
+            Indicates if the current file is the lowest numbered file or the
+            highest numbered file.
+            </para>
+            <para>
+            By default newer files have lower numbers (<see cref="P:log4net.Appender.RollingFileAppender.CountDirection"/> &lt; 0),
+            i.e. log.1 is most recent, log.5 is the 5th backup, etc...
+            </para>
+            <para>
+            <see cref="P:log4net.Appender.RollingFileAppender.CountDirection"/> &gt;= 0 does the opposite i.e.
+            log.1 is the first backup made, log.5 is the 5th backup made, etc.
+            For infinite backups use <see cref="P:log4net.Appender.RollingFileAppender.CountDirection"/> &gt;= 0 to reduce 
+            rollover costs.
+            </para>
+            <para>The default file count direction is -1.</para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.RollingFileAppender.RollingStyle">
+            <summary>
+            Gets or sets the rolling style.
+            </summary>
+            <value>The rolling style.</value>
+            <remarks>
+            <para>
+            The default rolling style is <see cref="F:log4net.Appender.RollingFileAppender.RollingMode.Composite"/>.
+            </para>
+            <para>
+            When set to <see cref="F:log4net.Appender.RollingFileAppender.RollingMode.Once"/> this appender's
+            <see cref="P:log4net.Appender.FileAppender.AppendToFile"/> property is set to <c>false</c>, otherwise
+            the appender would append to a single file rather than rolling
+            the file each time it is opened.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.RollingFileAppender.StaticLogFileName">
+            <summary>
+            Gets or sets a value indicating whether to always log to
+            the same file.
+            </summary>
+            <value>
+            <c>true</c> if always should be logged to the same file, otherwise <c>false</c>.
+            </value>
+            <remarks>
+            <para>
+            By default file.log is always the current file.  Optionally
+            file.log.yyyy-mm-dd for current formatted datePattern can by the currently
+            logging file (or file.log.curSizeRollBackup or even
+            file.log.yyyy-mm-dd.curSizeRollBackup).
+            </para>
+            <para>
+            This will make time based rollovers with a large number of backups 
+            much faster as the appender it won't have to rename all the backups!
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.RollingFileAppender.RollingMode">
+            <summary>
+            Style of rolling to use
+            </summary>
+            <remarks>
+            <para>
+            Style of rolling to use
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.RollingMode.Once">
+            <summary>
+            Roll files once per program execution
+            </summary>
+            <remarks>
+            <para>
+            Roll files once per program execution.
+            Well really once each time this appender is
+            configured.
+            </para>
+            <para>
+            Setting this option also sets <c>AppendToFile</c> to
+            <c>false</c> on the <c>RollingFileAppender</c>, otherwise
+            this appender would just be a normal file appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.RollingMode.Size">
+            <summary>
+            Roll files based only on the size of the file
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.RollingMode.Date">
+            <summary>
+            Roll files based only on the date
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.RollingMode.Composite">
+            <summary>
+            Roll files based on both the size and date of the file
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.RollingFileAppender.RollPoint">
+            <summary>
+            The code assumes that the following 'time' constants are in a increasing sequence.
+            </summary>
+            <remarks>
+            <para>
+            The code assumes that the following 'time' constants are in a increasing sequence.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.RollPoint.InvalidRollPoint">
+            <summary>
+            Roll the log not based on the date
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.RollPoint.TopOfMinute">
+            <summary>
+            Roll the log for each minute
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.RollPoint.TopOfHour">
+            <summary>
+            Roll the log for each hour
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.RollPoint.HalfDay">
+            <summary>
+            Roll the log twice a day (midday and midnight)
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.RollPoint.TopOfDay">
+            <summary>
+            Roll the log each day (midnight)
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.RollPoint.TopOfWeek">
+            <summary>
+            Roll the log each week
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.RollingFileAppender.RollPoint.TopOfMonth">
+            <summary>
+            Roll the log each month
+            </summary>
+        </member>
+        <member name="T:log4net.Appender.RollingFileAppender.IDateTime">
+            <summary>
+            This interface is used to supply Date/Time information to the <see cref="T:log4net.Appender.RollingFileAppender"/>.
+            </summary>
+            <remarks>
+            This interface is used to supply Date/Time information to the <see cref="T:log4net.Appender.RollingFileAppender"/>.
+            Used primarily to allow test classes to plug themselves in so they can
+            supply test date/times.
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.RollingFileAppender.IDateTime.Now">
+            <summary>
+            Gets the <i>current</i> time.
+            </summary>
+            <value>The <i>current</i> time.</value>
+            <remarks>
+            <para>
+            Gets the <i>current</i> time.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.RollingFileAppender.DefaultDateTime">
+            <summary>
+            Default implementation of <see cref="T:log4net.Appender.RollingFileAppender.IDateTime"/> that returns the current time.
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.RollingFileAppender.DefaultDateTime.Now">
+            <summary>
+            Gets the <b>current</b> time.
+            </summary>
+            <value>The <b>current</b> time.</value>
+            <remarks>
+            <para>
+            Gets the <b>current</b> time.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.SmtpAppender">
+            <summary>
+            Send an e-mail when a specific logging event occurs, typically on errors 
+            or fatal errors.
+            </summary>
+            <remarks>
+            <para>
+            The number of logging events delivered in this e-mail depend on
+            the value of <see cref="P:log4net.Appender.BufferingAppenderSkeleton.BufferSize"/> option. The
+            <see cref="T:log4net.Appender.SmtpAppender"/> keeps only the last
+            <see cref="P:log4net.Appender.BufferingAppenderSkeleton.BufferSize"/> logging events in its 
+            cyclic buffer. This keeps memory requirements at a reasonable level while 
+            still delivering useful application context.
+            </para>
+            <note type="caution">
+            Authentication and setting the server Port are only available on the MS .NET 1.1 runtime.
+            For these features to be enabled you need to ensure that you are using a version of
+            the log4net assembly that is built against the MS .NET 1.1 framework and that you are
+            running the your application on the MS .NET 1.1 runtime. On all other platforms only sending
+            unauthenticated messages to a server listening on port 25 (the default) is supported.
+            </note>
+            <para>
+            Authentication is supported by setting the <see cref="P:log4net.Appender.SmtpAppender.Authentication"/> property to
+            either <see cref="F:log4net.Appender.SmtpAppender.SmtpAuthentication.Basic"/> or <see cref="F:log4net.Appender.SmtpAppender.SmtpAuthentication.Ntlm"/>.
+            If using <see cref="F:log4net.Appender.SmtpAppender.SmtpAuthentication.Basic"/> authentication then the <see cref="P:log4net.Appender.SmtpAppender.Username"/>
+            and <see cref="P:log4net.Appender.SmtpAppender.Password"/> properties must also be set.
+            </para>
+            <para>
+            To set the SMTP server port use the <see cref="P:log4net.Appender.SmtpAppender.Port"/> property. The default port is 25.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Appender.SmtpAppender.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Default constructor
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.SmtpAppender.SendBuffer(log4net.Core.LoggingEvent[])">
+            <summary>
+            Sends the contents of the cyclic buffer as an e-mail message.
+            </summary>
+            <param name="events">The logging events to send.</param>
+        </member>
+        <member name="M:log4net.Appender.SmtpAppender.SendEmail(System.String)">
+            <summary>
+            Send the email message
+            </summary>
+            <param name="messageBody">the body text to include in the mail</param>
+        </member>
+        <member name="P:log4net.Appender.SmtpAppender.To">
+            <summary>
+            Gets or sets a semicolon-delimited list of recipient e-mail addresses.
+            </summary>
+            <value>
+            A semicolon-delimited list of e-mail addresses.
+            </value>
+            <remarks>
+            <para>
+            A semicolon-delimited list of recipient e-mail addresses.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpAppender.From">
+            <summary>
+            Gets or sets the e-mail address of the sender.
+            </summary>
+            <value>
+            The e-mail address of the sender.
+            </value>
+            <remarks>
+            <para>
+            The e-mail address of the sender.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpAppender.Subject">
+            <summary>
+            Gets or sets the subject line of the e-mail message.
+            </summary>
+            <value>
+            The subject line of the e-mail message.
+            </value>
+            <remarks>
+            <para>
+            The subject line of the e-mail message.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpAppender.SmtpHost">
+            <summary>
+            Gets or sets the name of the SMTP relay mail server to use to send 
+            the e-mail messages.
+            </summary>
+            <value>
+            The name of the e-mail relay server. If SmtpServer is not set, the 
+            name of the local SMTP server is used.
+            </value>
+            <remarks>
+            <para>
+            The name of the e-mail relay server. If SmtpServer is not set, the 
+            name of the local SMTP server is used.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpAppender.LocationInfo">
+            <summary>
+            Obsolete
+            </summary>
+            <remarks>
+            Use the BufferingAppenderSkeleton Fix methods instead 
+            </remarks>
+            <remarks>
+            <para>
+            Obsolete property.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpAppender.Authentication">
+            <summary>
+            The mode to use to authentication with the SMTP server
+            </summary>
+            <remarks>
+            <note type="caution">Authentication is only available on the MS .NET 1.1 runtime.</note>
+            <para>
+            Valid Authentication mode values are: <see cref="F:log4net.Appender.SmtpAppender.SmtpAuthentication.None"/>, 
+            <see cref="F:log4net.Appender.SmtpAppender.SmtpAuthentication.Basic"/>, and <see cref="F:log4net.Appender.SmtpAppender.SmtpAuthentication.Ntlm"/>. 
+            The default value is <see cref="F:log4net.Appender.SmtpAppender.SmtpAuthentication.None"/>. When using 
+            <see cref="F:log4net.Appender.SmtpAppender.SmtpAuthentication.Basic"/> you must specify the <see cref="P:log4net.Appender.SmtpAppender.Username"/> 
+            and <see cref="P:log4net.Appender.SmtpAppender.Password"/> to use to authenticate.
+            When using <see cref="F:log4net.Appender.SmtpAppender.SmtpAuthentication.Ntlm"/> the Windows credentials for the current
+            thread, if impersonating, or the process will be used to authenticate. 
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpAppender.Username">
+            <summary>
+            The username to use to authenticate with the SMTP server
+            </summary>
+            <remarks>
+            <note type="caution">Authentication is only available on the MS .NET 1.1 runtime.</note>
+            <para>
+            A <see cref="P:log4net.Appender.SmtpAppender.Username"/> and <see cref="P:log4net.Appender.SmtpAppender.Password"/> must be specified when 
+            <see cref="P:log4net.Appender.SmtpAppender.Authentication"/> is set to <see cref="F:log4net.Appender.SmtpAppender.SmtpAuthentication.Basic"/>, 
+            otherwise the username will be ignored. 
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpAppender.Password">
+            <summary>
+            The password to use to authenticate with the SMTP server
+            </summary>
+            <remarks>
+            <note type="caution">Authentication is only available on the MS .NET 1.1 runtime.</note>
+            <para>
+            A <see cref="P:log4net.Appender.SmtpAppender.Username"/> and <see cref="P:log4net.Appender.SmtpAppender.Password"/> must be specified when 
+            <see cref="P:log4net.Appender.SmtpAppender.Authentication"/> is set to <see cref="F:log4net.Appender.SmtpAppender.SmtpAuthentication.Basic"/>, 
+            otherwise the password will be ignored. 
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpAppender.Port">
+            <summary>
+            The port on which the SMTP server is listening
+            </summary>
+            <remarks>
+            <note type="caution">Server Port is only available on the MS .NET 1.1 runtime.</note>
+            <para>
+            The port on which the SMTP server is listening. The default
+            port is <c>25</c>. The Port can only be changed when running on
+            the MS .NET 1.1 runtime.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpAppender.Priority">
+            <summary>
+            Gets or sets the priority of the e-mail message
+            </summary>
+            <value>
+            One of the <see cref="T:System.Net.Mail.MailPriority"/> values.
+            </value>
+            <remarks>
+            <para>
+            Sets the priority of the e-mails generated by this
+            appender. The default priority is <see cref="F:System.Net.Mail.MailPriority.Normal"/>.
+            </para>
+            <para>
+            If you are using this appender to report errors then
+            you may want to set the priority to <see cref="F:System.Net.Mail.MailPriority.High"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.SmtpAppender.SmtpAuthentication">
+            <summary>
+            Values for the <see cref="P:log4net.Appender.SmtpAppender.Authentication"/> property.
+            </summary>
+            <remarks>
+            <para>
+            SMTP authentication modes.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.SmtpAppender.SmtpAuthentication.None">
+            <summary>
+            No authentication
+            </summary>
+        </member>
+        <member name="F:log4net.Appender.SmtpAppender.SmtpAuthentication.Basic">
+            <summary>
+            Basic authentication.
+            </summary>
+            <remarks>
+            Requires a username and password to be supplied
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.SmtpAppender.SmtpAuthentication.Ntlm">
+            <summary>
+            Integrated authentication
+            </summary>
+            <remarks>
+            Uses the Windows credentials from the current thread or process to authenticate.
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.SmtpPickupDirAppender">
+            <summary>
+            Send an email when a specific logging event occurs, typically on errors 
+            or fatal errors. Rather than sending via smtp it writes a file into the
+            directory specified by <see cref="P:log4net.Appender.SmtpPickupDirAppender.PickupDir"/>. This allows services such
+            as the IIS SMTP agent to manage sending the messages.
+            </summary>
+            <remarks>
+            <para>
+            The configuration for this appender is identical to that of the <c>SMTPAppender</c>,
+            except that instead of specifying the <c>SMTPAppender.SMTPHost</c> you specify
+            <see cref="P:log4net.Appender.SmtpPickupDirAppender.PickupDir"/>.
+            </para>
+            <para>
+            The number of logging events delivered in this e-mail depend on
+            the value of <see cref="P:log4net.Appender.BufferingAppenderSkeleton.BufferSize"/> option. The
+            <see cref="T:log4net.Appender.SmtpPickupDirAppender"/> keeps only the last
+            <see cref="P:log4net.Appender.BufferingAppenderSkeleton.BufferSize"/> logging events in its 
+            cyclic buffer. This keeps memory requirements at a reasonable level while 
+            still delivering useful application context.
+            </para>
+            </remarks>
+            <author>Niall Daley</author>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Appender.SmtpPickupDirAppender.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Default constructor
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.SmtpPickupDirAppender.SendBuffer(log4net.Core.LoggingEvent[])">
+            <summary>
+            Sends the contents of the cyclic buffer as an e-mail message.
+            </summary>
+            <param name="events">The logging events to send.</param>
+            <remarks>
+            <para>
+            Sends the contents of the cyclic buffer as an e-mail message.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.SmtpPickupDirAppender.ActivateOptions">
+            <summary>
+            Activate the options on this appender. 
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Appender.SmtpPickupDirAppender.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Appender.SmtpPickupDirAppender.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Appender.SmtpPickupDirAppender.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.SmtpPickupDirAppender.ConvertToFullPath(System.String)">
+            <summary>
+            Convert a path into a fully qualified path.
+            </summary>
+            <param name="path">The path to convert.</param>
+            <returns>The fully qualified path.</returns>
+            <remarks>
+            <para>
+            Converts the path specified to a fully
+            qualified path. If the path is relative it is
+            taken as relative from the application base 
+            directory.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.SmtpPickupDirAppender.m_securityContext">
+            <summary>
+            The security context to use for privileged calls
+            </summary>
+        </member>
+        <member name="P:log4net.Appender.SmtpPickupDirAppender.To">
+            <summary>
+            Gets or sets a semicolon-delimited list of recipient e-mail addresses.
+            </summary>
+            <value>
+            A semicolon-delimited list of e-mail addresses.
+            </value>
+            <remarks>
+            <para>
+            A semicolon-delimited list of e-mail addresses.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpPickupDirAppender.From">
+            <summary>
+            Gets or sets the e-mail address of the sender.
+            </summary>
+            <value>
+            The e-mail address of the sender.
+            </value>
+            <remarks>
+            <para>
+            The e-mail address of the sender.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpPickupDirAppender.Subject">
+            <summary>
+            Gets or sets the subject line of the e-mail message.
+            </summary>
+            <value>
+            The subject line of the e-mail message.
+            </value>
+            <remarks>
+            <para>
+            The subject line of the e-mail message.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpPickupDirAppender.PickupDir">
+            <summary>
+            Gets or sets the path to write the messages to.
+            </summary>
+            <remarks>
+            <para>
+            Gets or sets the path to write the messages to. This should be the same
+            as that used by the agent sending the messages.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpPickupDirAppender.SecurityContext">
+            <summary>
+            Gets or sets the <see cref="P:log4net.Appender.SmtpPickupDirAppender.SecurityContext"/> used to write to the pickup directory.
+            </summary>
+            <value>
+            The <see cref="P:log4net.Appender.SmtpPickupDirAppender.SecurityContext"/> used to write to the pickup directory.
+            </value>
+            <remarks>
+            <para>
+            Unless a <see cref="P:log4net.Appender.SmtpPickupDirAppender.SecurityContext"/> specified here for this appender
+            the <see cref="P:log4net.Core.SecurityContextProvider.DefaultProvider"/> is queried for the
+            security context to use. The default behavior is to use the security context
+            of the current thread.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.SmtpPickupDirAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.TelnetAppender">
+            <summary>
+            Appender that allows clients to connect via Telnet to receive log messages
+            </summary>
+            <remarks>	
+            <para>
+            The TelnetAppender accepts socket connections and streams logging messages
+            back to the client.  
+            The output is provided in a telnet-friendly way so that a log can be monitored 
+            over a TCP/IP socket.
+            This allows simple remote monitoring of application logging.
+            </para>
+            <para>
+            The default <see cref="P:log4net.Appender.TelnetAppender.Port"/> is 23 (the telnet port).
+            </para>
+            </remarks>
+            <author>Keith Long</author>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Appender.TelnetAppender.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Default constructor
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TelnetAppender.OnClose">
+            <summary>
+            Overrides the parent method to close the socket handler
+            </summary>
+            <remarks>
+            <para>
+            Closes all the outstanding connections.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TelnetAppender.ActivateOptions">
+            <summary>
+            Initialize the appender based on the options set.
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Appender.TelnetAppender.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Appender.TelnetAppender.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Appender.TelnetAppender.ActivateOptions"/> must be called again.
+            </para>
+            <para>
+            Create the socket handler and wait for connections
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TelnetAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            Writes the logging event to each connected client.
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            Writes the logging event to each connected client.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.TelnetAppender.Port">
+            <summary>
+            Gets or sets the TCP port number on which this <see cref="T:log4net.Appender.TelnetAppender"/> will listen for connections.
+            </summary>
+            <value>
+            An integer value in the range <see cref="F:System.Net.IPEndPoint.MinPort"/> to <see cref="F:System.Net.IPEndPoint.MaxPort"/> 
+            indicating the TCP port number on which this <see cref="T:log4net.Appender.TelnetAppender"/> will listen for connections.
+            </value>
+            <remarks>
+            <para>
+            The default value is 23 (the telnet port).
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentOutOfRangeException">The value specified is less than <see cref="F:System.Net.IPEndPoint.MinPort"/> 
+            or greater than <see cref="F:System.Net.IPEndPoint.MaxPort"/>.</exception>
+        </member>
+        <member name="P:log4net.Appender.TelnetAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.TelnetAppender.SocketHandler">
+            <summary>
+            Helper class to manage connected clients
+            </summary>
+            <remarks>
+            <para>
+            The SocketHandler class is used to accept connections from
+            clients.  It is threaded so that clients can connect/disconnect
+            asynchronously.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TelnetAppender.SocketHandler.#ctor(System.Int32)">
+            <summary>
+            Opens a new server port on <paramref ref="port"/>
+            </summary>
+            <param name="port">the local port to listen on for connections</param>
+            <remarks>
+            <para>
+            Creates a socket handler on the specified local server port.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TelnetAppender.SocketHandler.Send(System.String)">
+            <summary>
+            Sends a string message to each of the connected clients
+            </summary>
+            <param name="message">the text to send</param>
+            <remarks>
+            <para>
+            Sends a string message to each of the connected clients
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TelnetAppender.SocketHandler.AddClient(log4net.Appender.TelnetAppender.SocketHandler.SocketClient)">
+            <summary>
+            Add a client to the internal clients list
+            </summary>
+            <param name="client">client to add</param>
+        </member>
+        <member name="M:log4net.Appender.TelnetAppender.SocketHandler.RemoveClient(log4net.Appender.TelnetAppender.SocketHandler.SocketClient)">
+            <summary>
+            Remove a client from the internal clients list
+            </summary>
+            <param name="client">client to remove</param>
+        </member>
+        <member name="M:log4net.Appender.TelnetAppender.SocketHandler.OnConnect(System.IAsyncResult)">
+            <summary>
+            Callback used to accept a connection on the server socket
+            </summary>
+            <param name="asyncResult">The result of the asynchronous operation</param>
+            <remarks>
+            <para>
+            On connection adds to the list of connections 
+            if there are two many open connections you will be disconnected
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TelnetAppender.SocketHandler.Dispose">
+            <summary>
+            Close all network connections
+            </summary>
+            <remarks>
+            <para>
+            Make sure we close all network connections
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.TelnetAppender.SocketHandler.HasConnections">
+            <summary>
+            Test if this handler has active connections
+            </summary>
+            <value>
+            <c>true</c> if this handler has active connections
+            </value>
+            <remarks>
+            <para>
+            This property will be <c>true</c> while this handler has
+            active connections, that is at least one connection that 
+            the handler will attempt to send a message to.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.TelnetAppender.SocketHandler.SocketClient">
+            <summary>
+            Class that represents a client connected to this handler
+            </summary>
+            <remarks>
+            <para>
+            Class that represents a client connected to this handler
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TelnetAppender.SocketHandler.SocketClient.#ctor(System.Net.Sockets.Socket)">
+            <summary>
+            Create this <see cref="T:log4net.Appender.TelnetAppender.SocketHandler.SocketClient"/> for the specified <see cref="T:System.Net.Sockets.Socket"/>
+            </summary>
+            <param name="socket">the client's socket</param>
+            <remarks>
+            <para>
+            Opens a stream writer on the socket.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TelnetAppender.SocketHandler.SocketClient.Send(System.String)">
+            <summary>
+            Write a string to the client
+            </summary>
+            <param name="message">string to send</param>
+            <remarks>
+            <para>
+            Write a string to the client
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TelnetAppender.SocketHandler.SocketClient.Dispose">
+            <summary>
+            Cleanup the clients connection
+            </summary>
+            <remarks>
+            <para>
+            Close the socket connection.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Appender.TraceAppender">
+            <summary>
+            Appends log events to the <see cref="T:System.Diagnostics.Trace"/> system.
+            </summary>
+            <remarks>
+            <para>
+            The application configuration file can be used to control what listeners 
+            are actually used. See the MSDN documentation for the 
+            <see cref="T:System.Diagnostics.Trace"/> class for details on configuring the
+            trace system.
+            </para>
+            <para>
+            Events are written using the <c>System.Diagnostics.Trace.Write(string,string)</c>
+            method. The event's logger name is passed as the value for the category name to the Write method.
+            </para>
+            <para>
+            <b>Compact Framework</b><br/>
+            The Compact Framework does not support the <see cref="T:System.Diagnostics.Trace"/>
+            class for any operation except <c>Assert</c>. When using the Compact Framework this
+            appender will write to the <see cref="T:System.Diagnostics.Debug"/> system rather than
+            the Trace system. This appender will therefore behave like the <see cref="T:log4net.Appender.DebugAppender"/>.
+            </para>
+            </remarks>
+            <author>Douglas de la Torre</author>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Appender.TraceAppender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.TraceAppender"/>.
+            </summary>
+            <remarks>
+            <para>
+            Default constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TraceAppender.#ctor(log4net.Layout.ILayout)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Appender.TraceAppender"/> 
+            with a specified layout.
+            </summary>
+            <param name="layout">The layout to use with this appender.</param>
+            <remarks>
+            <para>
+            Obsolete constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Appender.TraceAppender.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            Writes the logging event to the <see cref="T:System.Diagnostics.Trace"/> system.
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            Writes the logging event to the <see cref="T:System.Diagnostics.Trace"/> system.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Appender.TraceAppender.m_immediateFlush">
+            <summary>
+            Immediate flush means that the underlying writer or output stream
+            will be flushed at the end of each append operation.
+            </summary>
+            <remarks>
+            <para>
+            Immediate flush is slower but ensures that each append request is 
+            actually written. If <see cref="P:log4net.Appender.TraceAppender.ImmediateFlush"/> is set to
+            <c>false</c>, then there is a good chance that the last few
+            logs events are not actually written to persistent media if and
+            when the application crashes.
+            </para>
+            <para>
+            The default value is <c>true</c>.</para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.TraceAppender.ImmediateFlush">
+            <summary>
+            Gets or sets a value that indicates whether the appender will 
+            flush at the end of each write.
+            </summary>
+            <remarks>
+            <para>The default behavior is to flush at the end of each 
+            write. If the option is set to<c>false</c>, then the underlying 
+            stream can defer writing to physical medium to a later time. 
+            </para>
+            <para>
+            Avoiding the flush operation at the end of each append results 
+            in a performance gain of 10 to 20 percent. However, there is safety
+            trade-off involved in skipping flushing. Indeed, when flushing is
+            skipped, then it is likely that the last few log events will not
+            be recorded on disk when the application exits. This is a high
+            price to pay even for a 20% performance gain.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Appender.TraceAppender.RequiresLayout">
+            <summary>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            This appender requires a <see cref="N:log4net.Layout"/> to be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Config.AliasDomainAttribute">
+            <summary>
+            Assembly level attribute that specifies a domain to alias to this assembly's repository.
+            </summary>
+            <remarks>
+            <para>
+            <b>AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute.</b>
+            </para>
+            <para>
+            An assembly's logger repository is defined by its <see cref="T:log4net.Config.DomainAttribute"/>,
+            however this can be overridden by an assembly loaded before the target assembly.
+            </para>
+            <para>
+            An assembly can alias another assembly's domain to its repository by
+            specifying this attribute with the name of the target domain.
+            </para>
+            <para>
+            This attribute can only be specified on the assembly and may be used
+            as many times as necessary to alias all the required domains.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Config.AliasRepositoryAttribute">
+            <summary>
+            Assembly level attribute that specifies a repository to alias to this assembly's repository.
+            </summary>
+            <remarks>
+            <para>
+            An assembly's logger repository is defined by its <see cref="T:log4net.Config.RepositoryAttribute"/>,
+            however this can be overridden by an assembly loaded before the target assembly.
+            </para>
+            <para>
+            An assembly can alias another assembly's repository to its repository by
+            specifying this attribute with the name of the target repository.
+            </para>
+            <para>
+            This attribute can only be specified on the assembly and may be used
+            as many times as necessary to alias all the required repositories.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Config.AliasRepositoryAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Config.AliasRepositoryAttribute"/> class with 
+            the specified repository to alias to this assembly's repository.
+            </summary>
+            <param name="name">The repository to alias to this assemby's repository.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Config.AliasRepositoryAttribute"/> class with 
+            the specified repository to alias to this assembly's repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Config.AliasRepositoryAttribute.Name">
+            <summary>
+            Gets or sets the repository to alias to this assemby's repository.
+            </summary>
+            <value>
+            The repository to alias to this assemby's repository.
+            </value>
+            <remarks>
+            <para>
+            The name of the repository to alias to this assemby's repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.AliasDomainAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Config.AliasDomainAttribute"/> class with 
+            the specified domain to alias to this assembly's repository.
+            </summary>
+            <param name="name">The domain to alias to this assemby's repository.</param>
+            <remarks>
+            <para>
+            Obsolete. Use <see cref="T:log4net.Config.AliasRepositoryAttribute"/> instead of <see cref="T:log4net.Config.AliasDomainAttribute"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Config.BasicConfigurator">
+            <summary>
+            Use this class to quickly configure a <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/>.
+            </summary>
+            <remarks>
+            <para>
+            Allows very simple programmatic configuration of log4net.
+            </para>
+            <para>
+            Only one appender can be configured using this configurator.
+            The appender is set at the root of the hierarchy and all logging
+            events will be delivered to that appender.
+            </para>
+            <para>
+            Appenders can also implement the <see cref="T:log4net.Core.IOptionHandler"/> interface. Therefore
+            they would require that the <see cref="M:log4net.Core.IOptionHandler.ActivateOptions"/> method
+            be called after the appenders properties have been configured.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Config.BasicConfigurator.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Config.BasicConfigurator"/> class. 
+            </summary>
+            <remarks>
+            <para>
+            Uses a private access modifier to prevent instantiation of this class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.BasicConfigurator.Configure">
+            <summary>
+            Initializes the log4net system with a default configuration.
+            </summary>
+            <remarks>
+            <para>
+            Initializes the log4net logging system using a <see cref="T:log4net.Appender.ConsoleAppender"/>
+            that will write to <c>Console.Out</c>. The log messages are
+            formatted using the <see cref="T:log4net.Layout.PatternLayout"/> layout object
+            with the <see cref="F:log4net.Layout.PatternLayout.DetailConversionPattern"/>
+            layout style.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.BasicConfigurator.Configure(log4net.Appender.IAppender)">
+            <summary>
+            Initializes the log4net system using the specified appender.
+            </summary>
+            <param name="appender">The appender to use to log all logging events.</param>
+            <remarks>
+            <para>
+            Initializes the log4net system using the specified appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.BasicConfigurator.Configure(log4net.Repository.ILoggerRepository)">
+            <summary>
+            Initializes the <see cref="T:log4net.Repository.ILoggerRepository"/> with a default configuration.
+            </summary>
+            <param name="repository">The repository to configure.</param>
+            <remarks>
+            <para>
+            Initializes the specified repository using a <see cref="T:log4net.Appender.ConsoleAppender"/>
+            that will write to <c>Console.Out</c>. The log messages are
+            formatted using the <see cref="T:log4net.Layout.PatternLayout"/> layout object
+            with the <see cref="F:log4net.Layout.PatternLayout.DetailConversionPattern"/>
+            layout style.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.BasicConfigurator.Configure(log4net.Repository.ILoggerRepository,log4net.Appender.IAppender)">
+            <summary>
+            Initializes the <see cref="T:log4net.Repository.ILoggerRepository"/> using the specified appender.
+            </summary>
+            <param name="repository">The repository to configure.</param>
+            <param name="appender">The appender to use to log all logging events.</param>
+            <remarks>
+            <para>
+            Initializes the <see cref="T:log4net.Repository.ILoggerRepository"/> using the specified appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Config.ConfiguratorAttribute">
+            <summary>
+            Base class for all log4net configuration attributes.
+            </summary>
+            <remarks>
+            This is an abstract class that must be extended by 
+            specific configurators. This attribute allows the
+            configurator to be parameterized by an assembly level
+            attribute.
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Config.ConfiguratorAttribute.#ctor(System.Int32)">
+            <summary>
+            Constructor used by subclasses.
+            </summary>
+            <param name="priority">the ordering priority for this configurator</param>
+            <remarks>
+            <para>
+            The <paramref name="priority"/> is used to order the configurator
+            attributes before they are invoked. Higher priority configurators are executed
+            before lower priority ones.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.ConfiguratorAttribute.Configure(System.Reflection.Assembly,log4net.Repository.ILoggerRepository)">
+            <summary>
+            Configures the <see cref="T:log4net.Repository.ILoggerRepository"/> for the specified assembly.
+            </summary>
+            <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
+            <param name="targetRepository">The repository to configure.</param>
+            <remarks>
+            <para>
+            Abstract method implemented by a subclass. When this method is called
+            the subclass should configure the <paramref name="targetRepository"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.ConfiguratorAttribute.CompareTo(System.Object)">
+            <summary>
+            Compare this instance to another ConfiguratorAttribute
+            </summary>
+            <param name="obj">the object to compare to</param>
+            <returns>see <see cref="M:System.IComparable.CompareTo(System.Object)"/></returns>
+            <remarks>
+            <para>
+            Compares the priorities of the two <see cref="T:log4net.Config.ConfiguratorAttribute"/> instances.
+            Sorts by priority in descending order. Objects with the same priority are
+            randomly ordered.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Config.DomainAttribute">
+            <summary>
+            Assembly level attribute that specifies the logging domain for the assembly.
+            </summary>
+            <remarks>
+            <para>
+            <b>DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute.</b>
+            </para>
+            <para>
+            Assemblies are mapped to logging domains. Each domain has its own
+            logging repository. This attribute specified on the assembly controls
+            the configuration of the domain. The <see cref="P:log4net.Config.RepositoryAttribute.Name"/> property specifies the name
+            of the domain that this assembly is a part of. The <see cref="P:log4net.Config.RepositoryAttribute.RepositoryType"/>
+            specifies the type of the repository objects to create for the domain. If 
+            this attribute is not specified and a <see cref="P:log4net.Config.RepositoryAttribute.Name"/> is not specified
+            then the assembly will be part of the default shared logging domain.
+            </para>
+            <para>
+            This attribute can only be specified on the assembly and may only be used
+            once per assembly.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Config.RepositoryAttribute">
+            <summary>
+            Assembly level attribute that specifies the logging repository for the assembly.
+            </summary>
+            <remarks>
+            <para>
+            Assemblies are mapped to logging repository. This attribute specified 
+            on the assembly controls
+            the configuration of the repository. The <see cref="P:log4net.Config.RepositoryAttribute.Name"/> property specifies the name
+            of the repository that this assembly is a part of. The <see cref="P:log4net.Config.RepositoryAttribute.RepositoryType"/>
+            specifies the type of the <see cref="T:log4net.Repository.ILoggerRepository"/> object 
+            to create for the assembly. If this attribute is not specified or a <see cref="P:log4net.Config.RepositoryAttribute.Name"/> 
+            is not specified then the assembly will be part of the default shared logging repository.
+            </para>
+            <para>
+            This attribute can only be specified on the assembly and may only be used
+            once per assembly.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Config.RepositoryAttribute.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Config.RepositoryAttribute"/> class.
+            </summary>
+            <remarks>
+            <para>
+            Default constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.RepositoryAttribute.#ctor(System.String)">
+            <summary>
+            Initialize a new instance of the <see cref="T:log4net.Config.RepositoryAttribute"/> class 
+            with the name of the repository.
+            </summary>
+            <param name="name">The name of the repository.</param>
+            <remarks>
+            <para>
+            Initialize the attribute with the name for the assembly's repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Config.RepositoryAttribute.Name">
+            <summary>
+            Gets or sets the name of the logging repository.
+            </summary>
+            <value>
+            The string name to use as the name of the repository associated with this
+            assembly.
+            </value>
+            <remarks>
+            <para>
+            This value does not have to be unique. Several assemblies can share the
+            same repository. They will share the logging configuration of the repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Config.RepositoryAttribute.RepositoryType">
+            <summary>
+            Gets or sets the type of repository to create for this assembly.
+            </summary>
+            <value>
+            The type of repository to create for this assembly.
+            </value>
+            <remarks>
+            <para>
+            The type of the repository to create for the assembly.
+            The type must implement the <see cref="T:log4net.Repository.ILoggerRepository"/>
+            interface.
+            </para>
+            <para>
+            This will be the type of repository created when 
+            the repository is created. If multiple assemblies reference the
+            same repository then the repository is only created once using the
+            <see cref="P:log4net.Config.RepositoryAttribute.RepositoryType"/> of the first assembly to call into the 
+            repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.DomainAttribute.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Config.DomainAttribute"/> class.
+            </summary>
+            <remarks>
+            <para>
+            Obsolete. Use RepositoryAttribute instead of DomainAttribute.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.DomainAttribute.#ctor(System.String)">
+            <summary>
+            Initialize a new instance of the <see cref="T:log4net.Config.DomainAttribute"/> class 
+            with the name of the domain.
+            </summary>
+            <param name="name">The name of the domain.</param>
+            <remarks>
+            <para>
+            Obsolete. Use RepositoryAttribute instead of DomainAttribute.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Config.DOMConfigurator">
+            <summary>
+            Use this class to initialize the log4net environment using an Xml tree.
+            </summary>
+            <remarks>
+            <para>
+            <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+            </para>
+            <para>
+            Configures a <see cref="T:log4net.Repository.ILoggerRepository"/> using an Xml tree.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Config.DOMConfigurator.#ctor">
+            <summary>
+            Private constructor
+            </summary>
+        </member>
+        <member name="M:log4net.Config.DOMConfigurator.Configure">
+            <summary>
+            Automatically configures the log4net system based on the 
+            application's configuration settings.
+            </summary>
+            <remarks>
+            <para>
+            <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+            </para>
+            Each application has a configuration file. This has the
+            same name as the application with '.config' appended.
+            This file is XML and calling this function prompts the
+            configurator to look in that file for a section called
+            <c>log4net</c> that contains the configuration data.
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.DOMConfigurator.Configure(log4net.Repository.ILoggerRepository)">
+            <summary>
+            Automatically configures the <see cref="T:log4net.Repository.ILoggerRepository"/> using settings
+            stored in the application's configuration file.
+            </summary>
+            <remarks>
+            <para>
+            <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+            </para>
+            Each application has a configuration file. This has the
+            same name as the application with '.config' appended.
+            This file is XML and calling this function prompts the
+            configurator to look in that file for a section called
+            <c>log4net</c> that contains the configuration data.
+            </remarks>
+            <param name="repository">The repository to configure.</param>
+        </member>
+        <member name="M:log4net.Config.DOMConfigurator.Configure(System.Xml.XmlElement)">
+            <summary>
+            Configures log4net using a <c>log4net</c> element
+            </summary>
+            <remarks>
+            <para>
+            <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+            </para>
+            Loads the log4net configuration from the XML element
+            supplied as <paramref name="element"/>.
+            </remarks>
+            <param name="element">The element to parse.</param>
+        </member>
+        <member name="M:log4net.Config.DOMConfigurator.Configure(log4net.Repository.ILoggerRepository,System.Xml.XmlElement)">
+            <summary>
+            Configures the <see cref="T:log4net.Repository.ILoggerRepository"/> using the specified XML 
+            element.
+            </summary>
+            <remarks>
+            <para>
+            <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+            </para>
+            Loads the log4net configuration from the XML element
+            supplied as <paramref name="element"/>.
+            </remarks>
+            <param name="repository">The repository to configure.</param>
+            <param name="element">The element to parse.</param>
+        </member>
+        <member name="M:log4net.Config.DOMConfigurator.Configure(System.IO.FileInfo)">
+            <summary>
+            Configures log4net using the specified configuration file.
+            </summary>
+            <param name="configFile">The XML file to load the configuration from.</param>
+            <remarks>
+            <para>
+            <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+            </para>
+            <para>
+            The configuration file must be valid XML. It must contain
+            at least one element called <c>log4net</c> that holds
+            the log4net configuration data.
+            </para>
+            <para>
+            The log4net configuration file can possible be specified in the application's
+            configuration file (either <c>MyAppName.exe.config</c> for a
+            normal application on <c>Web.config</c> for an ASP.NET application).
+            </para>
+            <example>
+            The following example configures log4net using a configuration file, of which the 
+            location is stored in the application's configuration file :
+            </example>
+            <code lang="C#">
+            using log4net.Config;
+            using System.IO;
+            using System.Configuration;
+            
+            ...
+            
+            DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
+            </code>
+            <para>
+            In the <c>.config</c> file, the path to the log4net can be specified like this :
+            </para>
+            <code lang="XML" escaped="true">
+            <configuration>
+            	<appSettings>
+            		<add key="log4net-config-file" value="log.config"/>
+            	</appSettings>
+            </configuration>
+            </code>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.DOMConfigurator.Configure(System.IO.Stream)">
+            <summary>
+            Configures log4net using the specified configuration file.
+            </summary>
+            <param name="configStream">A stream to load the XML configuration from.</param>
+            <remarks>
+            <para>
+            <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+            </para>
+            <para>
+            The configuration data must be valid XML. It must contain
+            at least one element called <c>log4net</c> that holds
+            the log4net configuration data.
+            </para>
+            <para>
+            Note that this method will NOT close the stream parameter.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.DOMConfigurator.Configure(log4net.Repository.ILoggerRepository,System.IO.FileInfo)">
+            <summary>
+            Configures the <see cref="T:log4net.Repository.ILoggerRepository"/> using the specified configuration 
+            file.
+            </summary>
+            <param name="repository">The repository to configure.</param>
+            <param name="configFile">The XML file to load the configuration from.</param>
+            <remarks>
+            <para>
+            <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+            </para>
+            <para>
+            The configuration file must be valid XML. It must contain
+            at least one element called <c>log4net</c> that holds
+            the configuration data.
+            </para>
+            <para>
+            The log4net configuration file can possible be specified in the application's
+            configuration file (either <c>MyAppName.exe.config</c> for a
+            normal application on <c>Web.config</c> for an ASP.NET application).
+            </para>
+            <example>
+            The following example configures log4net using a configuration file, of which the 
+            location is stored in the application's configuration file :
+            </example>
+            <code lang="C#">
+            using log4net.Config;
+            using System.IO;
+            using System.Configuration;
+            
+            ...
+            
+            DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
+            </code>
+            <para>
+            In the <c>.config</c> file, the path to the log4net can be specified like this :
+            </para>
+            <code lang="XML" escaped="true">
+            <configuration>
+            	<appSettings>
+            		<add key="log4net-config-file" value="log.config"/>
+            	</appSettings>
+            </configuration>
+            </code>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.DOMConfigurator.Configure(log4net.Repository.ILoggerRepository,System.IO.Stream)">
+            <summary>
+            Configures the <see cref="T:log4net.Repository.ILoggerRepository"/> using the specified configuration 
+            file.
+            </summary>
+            <param name="repository">The repository to configure.</param>
+            <param name="configStream">The stream to load the XML configuration from.</param>
+            <remarks>
+            <para>
+            <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+            </para>
+            <para>
+            The configuration data must be valid XML. It must contain
+            at least one element called <c>log4net</c> that holds
+            the configuration data.
+            </para>
+            <para>
+            Note that this method will NOT close the stream parameter.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.DOMConfigurator.ConfigureAndWatch(System.IO.FileInfo)">
+            <summary>
+            Configures log4net using the file specified, monitors the file for changes 
+            and reloads the configuration if a change is detected.
+            </summary>
+            <param name="configFile">The XML file to load the configuration from.</param>
+            <remarks>
+            <para>
+            <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+            </para>
+            <para>
+            The configuration file must be valid XML. It must contain
+            at least one element called <c>log4net</c> that holds
+            the configuration data.
+            </para>
+            <para>
+            The configuration file will be monitored using a <see cref="T:System.IO.FileSystemWatcher"/>
+            and depends on the behavior of that class.
+            </para>
+            <para>
+            For more information on how to configure log4net using
+            a separate configuration file, see <see cref="M:log4net.Config.DOMConfigurator.Configure(System.IO.FileInfo)"/>.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.Config.DOMConfigurator.Configure(System.IO.FileInfo)"/>
+        </member>
+        <member name="M:log4net.Config.DOMConfigurator.ConfigureAndWatch(log4net.Repository.ILoggerRepository,System.IO.FileInfo)">
+            <summary>
+            Configures the <see cref="T:log4net.Repository.ILoggerRepository"/> using the file specified, 
+            monitors the file for changes and reloads the configuration if a change 
+            is detected.
+            </summary>
+            <param name="repository">The repository to configure.</param>
+            <param name="configFile">The XML file to load the configuration from.</param>
+            <remarks>
+            <para>
+            <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+            </para>
+            <para>
+            The configuration file must be valid XML. It must contain
+            at least one element called <c>log4net</c> that holds
+            the configuration data.
+            </para>
+            <para>
+            The configuration file will be monitored using a <see cref="T:System.IO.FileSystemWatcher"/>
+            and depends on the behavior of that class.
+            </para>
+            <para>
+            For more information on how to configure log4net using
+            a separate configuration file, see <see cref="M:log4net.Config.DOMConfigurator.Configure(System.IO.FileInfo)"/>.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.Config.DOMConfigurator.Configure(System.IO.FileInfo)"/>
+        </member>
+        <member name="T:log4net.Config.DOMConfiguratorAttribute">
+            <summary>
+            Assembly level attribute to configure the <see cref="T:log4net.Config.XmlConfigurator"/>.
+            </summary>
+            <remarks>
+            <para>
+            <b>AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute.</b>
+            </para>
+            <para>
+            This attribute may only be used at the assembly scope and can only
+            be used once per assembly.
+            </para>
+            <para>
+            Use this attribute to configure the <see cref="T:log4net.Config.XmlConfigurator"/>
+            without calling one of the <see cref="M:log4net.Config.XmlConfigurator.Configure"/>
+            methods.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Config.XmlConfiguratorAttribute">
+            <summary>
+            Assembly level attribute to configure the <see cref="T:log4net.Config.XmlConfigurator"/>.
+            </summary>
+            <remarks>
+            <para>
+            This attribute may only be used at the assembly scope and can only
+            be used once per assembly.
+            </para>
+            <para>
+            Use this attribute to configure the <see cref="T:log4net.Config.XmlConfigurator"/>
+            without calling one of the <see cref="M:log4net.Config.XmlConfigurator.Configure"/>
+            methods.
+            </para>
+            <para>
+            If neither of the <see cref="P:log4net.Config.XmlConfiguratorAttribute.ConfigFile"/> or <see cref="P:log4net.Config.XmlConfiguratorAttribute.ConfigFileExtension"/>
+            properties are set the configuration is loaded from the application's .config file.
+            If set the <see cref="P:log4net.Config.XmlConfiguratorAttribute.ConfigFile"/> property takes priority over the
+            <see cref="P:log4net.Config.XmlConfiguratorAttribute.ConfigFileExtension"/> property. The <see cref="P:log4net.Config.XmlConfiguratorAttribute.ConfigFile"/> property
+            specifies a path to a file to load the config from. The path is relative to the
+            application's base directory; <see cref="P:System.AppDomain.BaseDirectory"/>.
+            The <see cref="P:log4net.Config.XmlConfiguratorAttribute.ConfigFileExtension"/> property is used as a postfix to the assembly file name.
+            The config file must be located in the  application's base directory; <see cref="P:System.AppDomain.BaseDirectory"/>.
+            For example in a console application setting the <see cref="P:log4net.Config.XmlConfiguratorAttribute.ConfigFileExtension"/> to
+            <c>config</c> has the same effect as not specifying the <see cref="P:log4net.Config.XmlConfiguratorAttribute.ConfigFile"/> or 
+            <see cref="P:log4net.Config.XmlConfiguratorAttribute.ConfigFileExtension"/> properties.
+            </para>
+            <para>
+            The <see cref="P:log4net.Config.XmlConfiguratorAttribute.Watch"/> property can be set to cause the <see cref="T:log4net.Config.XmlConfigurator"/>
+            to watch the configuration file for changes.
+            </para>
+            <note>
+            <para>
+            Log4net will only look for assembly level configuration attributes once.
+            When using the log4net assembly level attributes to control the configuration 
+            of log4net you must ensure that the first call to any of the 
+            <see cref="T:log4net.Core.LoggerManager"/> methods is made from the assembly with the configuration
+            attributes. 
+            </para>
+            <para>
+            If you cannot guarantee the order in which log4net calls will be made from 
+            different assemblies you must use programmatic configuration instead, i.e.
+            call the <see cref="M:log4net.Config.XmlConfigurator.Configure"/> method directly.
+            </para>
+            </note>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Config.XmlConfiguratorAttribute.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Default constructor
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.XmlConfiguratorAttribute.Configure(System.Reflection.Assembly,log4net.Repository.ILoggerRepository)">
+            <summary>
+            Configures the <see cref="T:log4net.Repository.ILoggerRepository"/> for the specified assembly.
+            </summary>
+            <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
+            <param name="targetRepository">The repository to configure.</param>
+            <remarks>
+            <para>
+            Configure the repository using the <see cref="T:log4net.Config.XmlConfigurator"/>.
+            The <paramref name="targetRepository"/> specified must extend the <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/>
+            class otherwise the <see cref="T:log4net.Config.XmlConfigurator"/> will not be able to
+            configure it.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentOutOfRangeException">The <paramref name="repository"/> does not extend <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/>.</exception>
+        </member>
+        <member name="M:log4net.Config.XmlConfiguratorAttribute.ConfigureFromFile(System.Reflection.Assembly,log4net.Repository.ILoggerRepository)">
+            <summary>
+            Attempt to load configuration from the local file system
+            </summary>
+            <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
+            <param name="targetRepository">The repository to configure.</param>
+        </member>
+        <member name="M:log4net.Config.XmlConfiguratorAttribute.ConfigureFromFile(log4net.Repository.ILoggerRepository,System.IO.FileInfo)">
+            <summary>
+            Configure the specified repository using a <see cref="T:System.IO.FileInfo"/>
+            </summary>
+            <param name="targetRepository">The repository to configure.</param>
+            <param name="configFile">the FileInfo pointing to the config file</param>
+        </member>
+        <member name="M:log4net.Config.XmlConfiguratorAttribute.ConfigureFromUri(System.Reflection.Assembly,log4net.Repository.ILoggerRepository)">
+            <summary>
+            Attempt to load configuration from a URI
+            </summary>
+            <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
+            <param name="targetRepository">The repository to configure.</param>
+        </member>
+        <member name="P:log4net.Config.XmlConfiguratorAttribute.ConfigFile">
+            <summary>
+            Gets or sets the filename of the configuration file.
+            </summary>
+            <value>
+            The filename of the configuration file.
+            </value>
+            <remarks>
+            <para>
+            If specified, this is the name of the configuration file to use with
+            the <see cref="T:log4net.Config.XmlConfigurator"/>. This file path is relative to the
+            <b>application base</b> directory (<see cref="P:System.AppDomain.BaseDirectory"/>).
+            </para>
+            <para>
+            The <see cref="P:log4net.Config.XmlConfiguratorAttribute.ConfigFile"/> takes priority over the <see cref="P:log4net.Config.XmlConfiguratorAttribute.ConfigFileExtension"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Config.XmlConfiguratorAttribute.ConfigFileExtension">
+            <summary>
+            Gets or sets the extension of the configuration file.
+            </summary>
+            <value>
+            The extension of the configuration file.
+            </value>
+            <remarks>
+            <para>
+            If specified this is the extension for the configuration file.
+            The path to the config file is built by using the <b>application 
+            base</b> directory (<see cref="P:System.AppDomain.BaseDirectory"/>),
+            the <b>assembly file name</b> and the config file extension.
+            </para>
+            <para>
+            If the <see cref="P:log4net.Config.XmlConfiguratorAttribute.ConfigFileExtension"/> is set to <c>MyExt</c> then
+            possible config file names would be: <c>MyConsoleApp.exe.MyExt</c> or
+            <c>MyClassLibrary.dll.MyExt</c>.
+            </para>
+            <para>
+            The <see cref="P:log4net.Config.XmlConfiguratorAttribute.ConfigFile"/> takes priority over the <see cref="P:log4net.Config.XmlConfiguratorAttribute.ConfigFileExtension"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Config.XmlConfiguratorAttribute.Watch">
+            <summary>
+            Gets or sets a value indicating whether to watch the configuration file.
+            </summary>
+            <value>
+            <c>true</c> if the configuration should be watched, <c>false</c> otherwise.
+            </value>
+            <remarks>
+            <para>
+            If this flag is specified and set to <c>true</c> then the framework
+            will watch the configuration file and will reload the config each time 
+            the file is modified.
+            </para>
+            <para>
+            The config file can only be watched if it is loaded from local disk.
+            In a No-Touch (Smart Client) deployment where the application is downloaded
+            from a web server the config file may not reside on the local disk
+            and therefore it may not be able to watch it.
+            </para>
+            <note>
+            Watching configuration is not supported on the SSCLI.
+            </note>
+            </remarks>
+        </member>
+        <member name="T:log4net.Config.Log4NetConfigurationSectionHandler">
+            <summary>
+            Class to register for the log4net section of the configuration file
+            </summary>
+            <remarks>
+            The log4net section of the configuration file needs to have a section
+            handler registered. This is the section handler used. It simply returns
+            the XML element that is the root of the section.
+            </remarks>
+            <example>
+            Example of registering the log4net section handler :
+            <code lang="XML" escaped="true">
+            <configuration>
+            	<configSections>
+            		<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
+            	</configSections>
+            	<log4net>
+            		log4net configuration XML goes here
+            	</log4net>
+            </configuration>
+            </code>
+            </example>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Config.Log4NetConfigurationSectionHandler.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Config.Log4NetConfigurationSectionHandler"/> class.
+            </summary>
+            <remarks>
+            <para>
+            Default constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.Log4NetConfigurationSectionHandler.Create(System.Object,System.Object,System.Xml.XmlNode)">
+            <summary>
+            Parses the configuration section.
+            </summary>
+            <param name="parent">The configuration settings in a corresponding parent configuration section.</param>
+            <param name="configContext">The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference.</param>
+            <param name="section">The <see cref="T:System.Xml.XmlNode"/> for the log4net section.</param>
+            <returns>The <see cref="T:System.Xml.XmlNode"/> for the log4net section.</returns>
+            <remarks>
+            <para>
+            Returns the <see cref="T:System.Xml.XmlNode"/> containing the configuration data,
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Config.PluginAttribute">
+            <summary>
+            Assembly level attribute that specifies a plugin to attach to 
+            the repository.
+            </summary>
+            <remarks>
+            <para>
+            Specifies the type of a plugin to create and attach to the
+            assembly's repository. The plugin type must implement the
+            <see cref="T:log4net.Plugin.IPlugin"/> interface.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Plugin.IPluginFactory">
+            <summary>
+            Interface used to create plugins.
+            </summary>
+            <remarks>
+            <para>
+            Interface used to create  a plugin.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Plugin.IPluginFactory.CreatePlugin">
+            <summary>
+            Creates the plugin object.
+            </summary>
+            <returns>the new plugin instance</returns>
+            <remarks>
+            <para>
+            Create and return a new plugin instance.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.PluginAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Config.PluginAttribute"/> class
+            with the specified type.
+            </summary>
+            <param name="typeName">The type name of plugin to create.</param>
+            <remarks>
+            <para>
+            Create the attribute with the plugin type specified.
+            </para>
+            <para>
+            Where possible use the constructor that takes a <see cref="T:System.Type"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.PluginAttribute.#ctor(System.Type)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Config.PluginAttribute"/> class
+            with the specified type.
+            </summary>
+            <param name="type">The type of plugin to create.</param>
+            <remarks>
+            <para>
+            Create the attribute with the plugin type specified.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.PluginAttribute.CreatePlugin">
+            <summary>
+            Creates the plugin object defined by this attribute.
+            </summary>
+            <remarks>
+            <para>
+            Creates the instance of the <see cref="T:log4net.Plugin.IPlugin"/> object as 
+            specified by this attribute.
+            </para>
+            </remarks>
+            <returns>The plugin object.</returns>
+        </member>
+        <member name="M:log4net.Config.PluginAttribute.ToString">
+            <summary>
+            Returns a representation of the properties of this object.
+            </summary>
+            <remarks>
+            <para>
+            Overrides base class <see cref="M:System.Object.ToString"/> method to 
+            return a representation of the properties of this object.
+            </para>
+            </remarks>
+            <returns>A representation of the properties of this object</returns>
+        </member>
+        <member name="P:log4net.Config.PluginAttribute.Type">
+            <summary>
+            Gets or sets the type for the plugin.
+            </summary>
+            <value>
+            The type for the plugin.
+            </value>
+            <remarks>
+            <para>
+            The type for the plugin.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Config.PluginAttribute.TypeName">
+            <summary>
+            Gets or sets the type name for the plugin.
+            </summary>
+            <value>
+            The type name for the plugin.
+            </value>
+            <remarks>
+            <para>
+            The type name for the plugin.
+            </para>
+            <para>
+            Where possible use the <see cref="P:log4net.Config.PluginAttribute.Type"/> property instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Config.SecurityContextProviderAttribute">
+            <summary>
+            Assembly level attribute to configure the <see cref="T:log4net.Core.SecurityContextProvider"/>.
+            </summary>
+            <remarks>
+            <para>
+            This attribute may only be used at the assembly scope and can only
+            be used once per assembly.
+            </para>
+            <para>
+            Use this attribute to configure the <see cref="T:log4net.Config.XmlConfigurator"/>
+            without calling one of the <see cref="M:log4net.Config.XmlConfigurator.Configure"/>
+            methods.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Config.SecurityContextProviderAttribute.#ctor(System.Type)">
+            <summary>
+            Construct provider attribute with type specified
+            </summary>
+            <param name="providerType">the type of the provider to use</param>
+            <remarks>
+            <para>
+            The provider specified must subclass the <see cref="T:log4net.Core.SecurityContextProvider"/>
+            class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.SecurityContextProviderAttribute.Configure(System.Reflection.Assembly,log4net.Repository.ILoggerRepository)">
+            <summary>
+            Configures the SecurityContextProvider
+            </summary>
+            <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
+            <param name="targetRepository">The repository to configure.</param>
+            <remarks>
+            <para>
+            Creates a provider instance from the <see cref="P:log4net.Config.SecurityContextProviderAttribute.ProviderType"/> specified.
+            Sets this as the default security context provider <see cref="P:log4net.Core.SecurityContextProvider.DefaultProvider"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Config.SecurityContextProviderAttribute.ProviderType">
+            <summary>
+            Gets or sets the type of the provider to use.
+            </summary>
+            <value>
+            the type of the provider to use.
+            </value>
+            <remarks>
+            <para>
+            The provider specified must subclass the <see cref="T:log4net.Core.SecurityContextProvider"/>
+            class.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Config.XmlConfigurator">
+            <summary>
+            Use this class to initialize the log4net environment using an Xml tree.
+            </summary>
+            <remarks>
+            <para>
+            Configures a <see cref="T:log4net.Repository.ILoggerRepository"/> using an Xml tree.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.#ctor">
+            <summary>
+            Private constructor
+            </summary>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.Configure">
+            <summary>
+            Automatically configures the log4net system based on the 
+            application's configuration settings.
+            </summary>
+            <remarks>
+            <para>
+            Each application has a configuration file. This has the
+            same name as the application with '.config' appended.
+            This file is XML and calling this function prompts the
+            configurator to look in that file for a section called
+            <c>log4net</c> that contains the configuration data.
+            </para>
+            <para>
+            To use this method to configure log4net you must specify 
+            the <see cref="T:log4net.Config.Log4NetConfigurationSectionHandler"/> section
+            handler for the <c>log4net</c> configuration section. See the
+            <see cref="T:log4net.Config.Log4NetConfigurationSectionHandler"/> for an example.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Config.Log4NetConfigurationSectionHandler"/>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.Configure(log4net.Repository.ILoggerRepository)">
+            <summary>
+            Automatically configures the <see cref="T:log4net.Repository.ILoggerRepository"/> using settings
+            stored in the application's configuration file.
+            </summary>
+            <remarks>
+            <para>
+            Each application has a configuration file. This has the
+            same name as the application with '.config' appended.
+            This file is XML and calling this function prompts the
+            configurator to look in that file for a section called
+            <c>log4net</c> that contains the configuration data.
+            </para>
+            <para>
+            To use this method to configure log4net you must specify 
+            the <see cref="T:log4net.Config.Log4NetConfigurationSectionHandler"/> section
+            handler for the <c>log4net</c> configuration section. See the
+            <see cref="T:log4net.Config.Log4NetConfigurationSectionHandler"/> for an example.
+            </para>
+            </remarks>
+            <param name="repository">The repository to configure.</param>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.Configure(System.Xml.XmlElement)">
+            <summary>
+            Configures log4net using a <c>log4net</c> element
+            </summary>
+            <remarks>
+            <para>
+            Loads the log4net configuration from the XML element
+            supplied as <paramref name="element"/>.
+            </para>
+            </remarks>
+            <param name="element">The element to parse.</param>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.Configure(log4net.Repository.ILoggerRepository,System.Xml.XmlElement)">
+            <summary>
+            Configures the <see cref="T:log4net.Repository.ILoggerRepository"/> using the specified XML 
+            element.
+            </summary>
+            <remarks>
+            Loads the log4net configuration from the XML element
+            supplied as <paramref name="element"/>.
+            </remarks>
+            <param name="repository">The repository to configure.</param>
+            <param name="element">The element to parse.</param>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.Configure(System.IO.FileInfo)">
+            <summary>
+            Configures log4net using the specified configuration file.
+            </summary>
+            <param name="configFile">The XML file to load the configuration from.</param>
+            <remarks>
+            <para>
+            The configuration file must be valid XML. It must contain
+            at least one element called <c>log4net</c> that holds
+            the log4net configuration data.
+            </para>
+            <para>
+            The log4net configuration file can possible be specified in the application's
+            configuration file (either <c>MyAppName.exe.config</c> for a
+            normal application on <c>Web.config</c> for an ASP.NET application).
+            </para>
+            <para>
+            The first element matching <c>&lt;configuration&gt;</c> will be read as the 
+            configuration. If this file is also a .NET .config file then you must specify 
+            a configuration section for the <c>log4net</c> element otherwise .NET will 
+            complain. Set the type for the section handler to <see cref="T:System.Configuration.IgnoreSectionHandler"/>, for example:
+            <code lang="XML" escaped="true">
+            <configSections>
+            	<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
+            </configSections>
+            </code>
+            </para>
+            <example>
+            The following example configures log4net using a configuration file, of which the 
+            location is stored in the application's configuration file :
+            </example>
+            <code lang="C#">
+            using log4net.Config;
+            using System.IO;
+            using System.Configuration;
+            
+            ...
+            
+            XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
+            </code>
+            <para>
+            In the <c>.config</c> file, the path to the log4net can be specified like this :
+            </para>
+            <code lang="XML" escaped="true">
+            <configuration>
+            	<appSettings>
+            		<add key="log4net-config-file" value="log.config"/>
+            	</appSettings>
+            </configuration>
+            </code>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.Configure(System.Uri)">
+            <summary>
+            Configures log4net using the specified configuration URI.
+            </summary>
+            <param name="configUri">A URI to load the XML configuration from.</param>
+            <remarks>
+            <para>
+            The configuration data must be valid XML. It must contain
+            at least one element called <c>log4net</c> that holds
+            the log4net configuration data.
+            </para>
+            <para>
+            The <see cref="T:System.Net.WebRequest"/> must support the URI scheme specified.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.Configure(System.IO.Stream)">
+            <summary>
+            Configures log4net using the specified configuration data stream.
+            </summary>
+            <param name="configStream">A stream to load the XML configuration from.</param>
+            <remarks>
+            <para>
+            The configuration data must be valid XML. It must contain
+            at least one element called <c>log4net</c> that holds
+            the log4net configuration data.
+            </para>
+            <para>
+            Note that this method will NOT close the stream parameter.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.Configure(log4net.Repository.ILoggerRepository,System.IO.FileInfo)">
+            <summary>
+            Configures the <see cref="T:log4net.Repository.ILoggerRepository"/> using the specified configuration 
+            file.
+            </summary>
+            <param name="repository">The repository to configure.</param>
+            <param name="configFile">The XML file to load the configuration from.</param>
+            <remarks>
+            <para>
+            The configuration file must be valid XML. It must contain
+            at least one element called <c>log4net</c> that holds
+            the configuration data.
+            </para>
+            <para>
+            The log4net configuration file can possible be specified in the application's
+            configuration file (either <c>MyAppName.exe.config</c> for a
+            normal application on <c>Web.config</c> for an ASP.NET application).
+            </para>
+            <para>
+            The first element matching <c>&lt;configuration&gt;</c> will be read as the 
+            configuration. If this file is also a .NET .config file then you must specify 
+            a configuration section for the <c>log4net</c> element otherwise .NET will 
+            complain. Set the type for the section handler to <see cref="T:System.Configuration.IgnoreSectionHandler"/>, for example:
+            <code lang="XML" escaped="true">
+            <configSections>
+            	<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
+            </configSections>
+            </code>
+            </para>
+            <example>
+            The following example configures log4net using a configuration file, of which the 
+            location is stored in the application's configuration file :
+            </example>
+            <code lang="C#">
+            using log4net.Config;
+            using System.IO;
+            using System.Configuration;
+            
+            ...
+            
+            XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
+            </code>
+            <para>
+            In the <c>.config</c> file, the path to the log4net can be specified like this :
+            </para>
+            <code lang="XML" escaped="true">
+            <configuration>
+            	<appSettings>
+            		<add key="log4net-config-file" value="log.config"/>
+            	</appSettings>
+            </configuration>
+            </code>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.Configure(log4net.Repository.ILoggerRepository,System.Uri)">
+            <summary>
+            Configures the <see cref="T:log4net.Repository.ILoggerRepository"/> using the specified configuration 
+            URI.
+            </summary>
+            <param name="repository">The repository to configure.</param>
+            <param name="configUri">A URI to load the XML configuration from.</param>
+            <remarks>
+            <para>
+            The configuration data must be valid XML. It must contain
+            at least one element called <c>log4net</c> that holds
+            the configuration data.
+            </para>
+            <para>
+            The <see cref="T:System.Net.WebRequest"/> must support the URI scheme specified.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.Configure(log4net.Repository.ILoggerRepository,System.IO.Stream)">
+            <summary>
+            Configures the <see cref="T:log4net.Repository.ILoggerRepository"/> using the specified configuration 
+            file.
+            </summary>
+            <param name="repository">The repository to configure.</param>
+            <param name="configStream">The stream to load the XML configuration from.</param>
+            <remarks>
+            <para>
+            The configuration data must be valid XML. It must contain
+            at least one element called <c>log4net</c> that holds
+            the configuration data.
+            </para>
+            <para>
+            Note that this method will NOT close the stream parameter.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.ConfigureAndWatch(System.IO.FileInfo)">
+            <summary>
+            Configures log4net using the file specified, monitors the file for changes 
+            and reloads the configuration if a change is detected.
+            </summary>
+            <param name="configFile">The XML file to load the configuration from.</param>
+            <remarks>
+            <para>
+            The configuration file must be valid XML. It must contain
+            at least one element called <c>log4net</c> that holds
+            the configuration data.
+            </para>
+            <para>
+            The configuration file will be monitored using a <see cref="T:System.IO.FileSystemWatcher"/>
+            and depends on the behavior of that class.
+            </para>
+            <para>
+            For more information on how to configure log4net using
+            a separate configuration file, see <see cref="M:log4net.Config.XmlConfigurator.Configure(System.IO.FileInfo)"/>.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.Config.XmlConfigurator.Configure(System.IO.FileInfo)"/>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.ConfigureAndWatch(log4net.Repository.ILoggerRepository,System.IO.FileInfo)">
+            <summary>
+            Configures the <see cref="T:log4net.Repository.ILoggerRepository"/> using the file specified, 
+            monitors the file for changes and reloads the configuration if a change 
+            is detected.
+            </summary>
+            <param name="repository">The repository to configure.</param>
+            <param name="configFile">The XML file to load the configuration from.</param>
+            <remarks>
+            <para>
+            The configuration file must be valid XML. It must contain
+            at least one element called <c>log4net</c> that holds
+            the configuration data.
+            </para>
+            <para>
+            The configuration file will be monitored using a <see cref="T:System.IO.FileSystemWatcher"/>
+            and depends on the behavior of that class.
+            </para>
+            <para>
+            For more information on how to configure log4net using
+            a separate configuration file, see <see cref="M:log4net.Config.XmlConfigurator.Configure(System.IO.FileInfo)"/>.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.Config.XmlConfigurator.Configure(System.IO.FileInfo)"/>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.ConfigureFromXml(log4net.Repository.ILoggerRepository,System.Xml.XmlElement)">
+            <summary>
+            Configures the specified repository using a <c>log4net</c> element.
+            </summary>
+            <param name="repository">The hierarchy to configure.</param>
+            <param name="element">The element to parse.</param>
+            <remarks>
+            <para>
+            Loads the log4net configuration from the XML element
+            supplied as <paramref name="element"/>.
+            </para>
+            <para>
+            This method is ultimately called by one of the Configure methods 
+            to load the configuration from an <see cref="T:System.Xml.XmlElement"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler">
+            <summary>
+            Class used to watch config files.
+            </summary>
+            <remarks>
+            <para>
+            Uses the <see cref="T:System.IO.FileSystemWatcher"/> to monitor
+            changes to a specified file. Because multiple change notifications
+            may be raised when the file is modified, a timer is used to
+            compress the notifications into a single event. The timer
+            waits for <see cref="F:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler.TimeoutMillis"/> time before delivering
+            the event notification. If any further <see cref="T:System.IO.FileSystemWatcher"/>
+            change notifications arrive while the timer is waiting it
+            is reset and waits again for <see cref="F:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler.TimeoutMillis"/> to
+            elapse.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler.TimeoutMillis">
+            <summary>
+            The default amount of time to wait after receiving notification
+            before reloading the config file.
+            </summary>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler.StartWatching(log4net.Repository.ILoggerRepository,System.IO.FileInfo)">
+            <summary>
+            Watch a specified config file used to configure a repository
+            </summary>
+            <param name="repository">The repository to configure.</param>
+            <param name="configFile">The configuration file to watch.</param>
+            <remarks>
+            <para>
+            Watch a specified config file used to configure a repository
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler.m_configFile">
+            <summary>
+            Holds the FileInfo used to configure the XmlConfigurator
+            </summary>
+        </member>
+        <member name="F:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler.m_repository">
+            <summary>
+            Holds the repository being configured.
+            </summary>
+        </member>
+        <member name="F:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler.m_timer">
+            <summary>
+            The timer used to compress the notification events.
+            </summary>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler.#ctor(log4net.Repository.ILoggerRepository,System.IO.FileInfo)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler"/> class.
+            </summary>
+            <param name="repository">The repository to configure.</param>
+            <param name="configFile">The configuration file to watch.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler.ConfigureAndWatchHandler_OnChanged(System.Object,System.IO.FileSystemEventArgs)">
+            <summary>
+            Event handler used by <see cref="T:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler"/>.
+            </summary>
+            <param name="source">The <see cref="T:System.IO.FileSystemWatcher"/> firing the event.</param>
+            <param name="e">The argument indicates the file that caused the event to be fired.</param>
+            <remarks>
+            <para>
+            This handler reloads the configuration from the file when the event is fired.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler.ConfigureAndWatchHandler_OnRenamed(System.Object,System.IO.RenamedEventArgs)">
+            <summary>
+            Event handler used by <see cref="T:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler"/>.
+            </summary>
+            <param name="source">The <see cref="T:System.IO.FileSystemWatcher"/> firing the event.</param>
+            <param name="e">The argument indicates the file that caused the event to be fired.</param>
+            <remarks>
+            <para>
+            This handler reloads the configuration from the file when the event is fired.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Config.XmlConfigurator.ConfigureAndWatchHandler.OnWatchedFileChange(System.Object)">
+            <summary>
+            Called by the timer when the configuration has been updated.
+            </summary>
+            <param name="state">null</param>
+        </member>
+        <member name="T:log4net.Core.CompactRepositorySelector">
+            <summary>
+            The implementation of the <see cref="T:log4net.Core.IRepositorySelector"/> interface suitable
+            for use with the compact framework
+            </summary>
+            <remarks>
+            <para>
+            This <see cref="T:log4net.Core.IRepositorySelector"/> implementation is a simple
+            mapping between repository name and <see cref="T:log4net.Repository.ILoggerRepository"/>
+            object.
+            </para>
+            <para>
+            The .NET Compact Framework 1.0 does not support retrieving assembly
+            level attributes therefore unlike the <c>DefaultRepositorySelector</c>
+            this selector does not examine the calling assembly for attributes.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="T:log4net.Core.IRepositorySelector">
+            <summary>
+            Interface used by the <see cref="T:log4net.LogManager"/> to select the <see cref="T:log4net.Repository.ILoggerRepository"/>.
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.LogManager"/> uses a <see cref="T:log4net.Core.IRepositorySelector"/> 
+            to specify the policy for selecting the correct <see cref="T:log4net.Repository.ILoggerRepository"/> 
+            to return to the caller.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Core.IRepositorySelector.GetRepository(System.Reflection.Assembly)">
+            <summary>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> for the specified assembly.
+            </summary>
+            <param name="assembly">The assembly to use to lookup to the <see cref="T:log4net.Repository.ILoggerRepository"/></param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> for the assembly.</returns>
+            <remarks>
+            <para>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> for the specified assembly.
+            </para>
+            <para>
+            How the association between <see cref="T:System.Reflection.Assembly"/> and <see cref="T:log4net.Repository.ILoggerRepository"/>
+            is made is not defined. The implementation may choose any method for
+            this association. The results of this method must be repeatable, i.e.
+            when called again with the same arguments the result must be the
+            save value.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.IRepositorySelector.GetRepository(System.String)">
+            <summary>
+            Gets the named <see cref="T:log4net.Repository.ILoggerRepository"/>.
+            </summary>
+            <param name="repositoryName">The name to use to lookup to the <see cref="T:log4net.Repository.ILoggerRepository"/>.</param>
+            <returns>The named <see cref="T:log4net.Repository.ILoggerRepository"/></returns>
+            <remarks>
+            Lookup a named <see cref="T:log4net.Repository.ILoggerRepository"/>. This is the repository created by
+            calling <see cref="M:log4net.Core.IRepositorySelector.CreateRepository(System.String,System.Type)"/>.
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.IRepositorySelector.CreateRepository(System.Reflection.Assembly,System.Type)">
+            <summary>
+            Creates a new repository for the assembly specified.
+            </summary>
+            <param name="assembly">The assembly to use to create the domain to associate with the <see cref="T:log4net.Repository.ILoggerRepository"/>.</param>
+            <param name="repositoryType">The type of repository to create, must implement <see cref="T:log4net.Repository.ILoggerRepository"/>.</param>
+            <returns>The repository created.</returns>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be associated with the domain
+            specified such that a call to <see cref="M:log4net.Core.IRepositorySelector.GetRepository(System.Reflection.Assembly)"/> with the
+            same assembly specified will return the same repository instance.
+            </para>
+            <para>
+            How the association between <see cref="T:System.Reflection.Assembly"/> and <see cref="T:log4net.Repository.ILoggerRepository"/>
+            is made is not defined. The implementation may choose any method for
+            this association.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.IRepositorySelector.CreateRepository(System.String,System.Type)">
+            <summary>
+            Creates a new repository with the name specified.
+            </summary>
+            <param name="repositoryName">The name to associate with the <see cref="T:log4net.Repository.ILoggerRepository"/>.</param>
+            <param name="repositoryType">The type of repository to create, must implement <see cref="T:log4net.Repository.ILoggerRepository"/>.</param>
+            <returns>The repository created.</returns>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be associated with the name
+            specified such that a call to <see cref="M:log4net.Core.IRepositorySelector.GetRepository(System.String)"/> with the
+            same name will return the same repository instance.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.IRepositorySelector.ExistsRepository(System.String)">
+            <summary>
+            Test if a named repository exists
+            </summary>
+            <param name="repositoryName">the named repository to check</param>
+            <returns><c>true</c> if the repository exists</returns>
+            <remarks>
+            <para>
+            Test if a named repository exists. Use <see cref="M:log4net.Core.IRepositorySelector.CreateRepository(System.Reflection.Assembly,System.Type)"/>
+            to create a new repository and <see cref="M:log4net.Core.IRepositorySelector.GetRepository(System.Reflection.Assembly)"/> to retrieve 
+            a repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.IRepositorySelector.GetAllRepositories">
+            <summary>
+            Gets an array of all currently defined repositories.
+            </summary>
+            <returns>
+            An array of the <see cref="T:log4net.Repository.ILoggerRepository"/> instances created by 
+            this <see cref="T:log4net.Core.IRepositorySelector"/>.</returns>
+            <remarks>
+            <para>
+            Gets an array of all of the repositories created by this selector.
+            </para>
+            </remarks>
+        </member>
+        <member name="E:log4net.Core.IRepositorySelector.LoggerRepositoryCreatedEvent">
+            <summary>
+            Event to notify that a logger repository has been created.
+            </summary>
+            <value>
+            Event to notify that a logger repository has been created.
+            </value>
+            <remarks>
+            <para>
+            Event raised when a new repository is created.
+            The event source will be this selector. The event args will
+            be a <see cref="T:log4net.Core.LoggerRepositoryCreationEventArgs"/> which
+            holds the newly created <see cref="T:log4net.Repository.ILoggerRepository"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.CompactRepositorySelector.#ctor(System.Type)">
+            <summary>
+            Create a new repository selector
+            </summary>
+            <param name="defaultRepositoryType">the type of the repositories to create, must implement <see cref="T:log4net.Repository.ILoggerRepository"/></param>
+            <remarks>
+            <para>
+            Create an new compact repository selector.
+            The default type for repositories must be specified,
+            an appropriate value would be <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/>.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">throw if <paramref name="defaultRepositoryType"/> is null</exception>
+            <exception cref="T:System.ArgumentOutOfRangeException">throw if <paramref name="defaultRepositoryType"/> does not implement <see cref="T:log4net.Repository.ILoggerRepository"/></exception>
+        </member>
+        <member name="M:log4net.Core.CompactRepositorySelector.GetRepository(System.Reflection.Assembly)">
+            <summary>
+            Get the <see cref="T:log4net.Repository.ILoggerRepository"/> for the specified assembly
+            </summary>
+            <param name="assembly">not used</param>
+            <returns>The default <see cref="T:log4net.Repository.ILoggerRepository"/></returns>
+            <remarks>
+            <para>
+            The <paramref name="assembly"/> argument is not used. This selector does not create a
+            separate repository for each assembly. 
+            </para>
+            <para>
+            As a named repository is not specified the default repository is 
+            returned. The default repository is named <c>log4net-default-repository</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.CompactRepositorySelector.GetRepository(System.String)">
+            <summary>
+            Get the named <see cref="T:log4net.Repository.ILoggerRepository"/>
+            </summary>
+            <param name="repositoryName">the name of the repository to lookup</param>
+            <returns>The named <see cref="T:log4net.Repository.ILoggerRepository"/></returns>
+            <remarks>
+            <para>
+            Get the named <see cref="T:log4net.Repository.ILoggerRepository"/>. The default 
+            repository is <c>log4net-default-repository</c>. Other repositories 
+            must be created using the <see cref="M:log4net.Core.CompactRepositorySelector.CreateRepository(System.String,System.Type)"/>.
+            If the named repository does not exist an exception is thrown.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">throw if <paramref name="repositoryName"/> is null</exception>
+            <exception cref="T:log4net.Core.LogException">throw if the <paramref name="repositoryName"/> does not exist</exception>
+        </member>
+        <member name="M:log4net.Core.CompactRepositorySelector.CreateRepository(System.Reflection.Assembly,System.Type)">
+            <summary>
+            Create a new repository for the assembly specified 
+            </summary>
+            <param name="assembly">not used</param>
+            <param name="repositoryType">the type of repository to create, must implement <see cref="T:log4net.Repository.ILoggerRepository"/></param>
+            <returns>the repository created</returns>
+            <remarks>
+            <para>
+            The <paramref name="assembly"/> argument is not used. This selector does not create a
+            separate repository for each assembly. 
+            </para>
+            <para>
+            If the <paramref name="repositoryType"/> is <c>null</c> then the
+            default repository type specified to the constructor is used.
+            </para>
+            <para>
+            As a named repository is not specified the default repository is 
+            returned. The default repository is named <c>log4net-default-repository</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.CompactRepositorySelector.CreateRepository(System.String,System.Type)">
+            <summary>
+            Create a new repository for the repository specified
+            </summary>
+            <param name="repositoryName">the repository to associate with the <see cref="T:log4net.Repository.ILoggerRepository"/></param>
+            <param name="repositoryType">the type of repository to create, must implement <see cref="T:log4net.Repository.ILoggerRepository"/>.
+            If this param is null then the default repository type is used.</param>
+            <returns>the repository created</returns>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be associated with the repository
+            specified such that a call to <see cref="M:log4net.Core.CompactRepositorySelector.GetRepository(System.String)"/> with the
+            same repository specified will return the same repository instance.
+            </para>
+            <para>
+            If the named repository already exists an exception will be thrown.
+            </para>
+            <para>
+            If <paramref name="repositoryType"/> is <c>null</c> then the default 
+            repository type specified to the constructor is used.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">throw if <paramref name="repositoryName"/> is null</exception>
+            <exception cref="T:log4net.Core.LogException">throw if the <paramref name="repositoryName"/> already exists</exception>
+        </member>
+        <member name="M:log4net.Core.CompactRepositorySelector.ExistsRepository(System.String)">
+            <summary>
+            Test if a named repository exists
+            </summary>
+            <param name="repositoryName">the named repository to check</param>
+            <returns><c>true</c> if the repository exists</returns>
+            <remarks>
+            <para>
+            Test if a named repository exists. Use <see cref="M:log4net.Core.CompactRepositorySelector.CreateRepository(System.String,System.Type)"/>
+            to create a new repository and <see cref="M:log4net.Core.CompactRepositorySelector.GetRepository(System.String)"/> to retrieve 
+            a repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.CompactRepositorySelector.GetAllRepositories">
+            <summary>
+            Gets a list of <see cref="T:log4net.Repository.ILoggerRepository"/> objects
+            </summary>
+            <returns>an array of all known <see cref="T:log4net.Repository.ILoggerRepository"/> objects</returns>
+            <remarks>
+            <para>
+            Gets an array of all of the repositories created by this selector.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.CompactRepositorySelector.OnLoggerRepositoryCreatedEvent(log4net.Repository.ILoggerRepository)">
+            <summary>
+            Notify the registered listeners that the repository has been created
+            </summary>
+            <param name="repository">The repository that has been created</param>
+            <remarks>
+            <para>
+            Raises the <event cref="E:log4net.Core.CompactRepositorySelector.LoggerRepositoryCreatedEvent">LoggerRepositoryCreatedEvent</event>
+            event.
+            </para>
+            </remarks>
+        </member>
+        <member name="E:log4net.Core.CompactRepositorySelector.LoggerRepositoryCreatedEvent">
+            <summary>
+            Event to notify that a logger repository has been created.
+            </summary>
+            <value>
+            Event to notify that a logger repository has been created.
+            </value>
+            <remarks>
+            <para>
+            Event raised when a new repository is created.
+            The event source will be this selector. The event args will
+            be a <see cref="T:log4net.Core.LoggerRepositoryCreationEventArgs"/> which
+            holds the newly created <see cref="T:log4net.Repository.ILoggerRepository"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.DefaultRepositorySelector">
+            <summary>
+            The default implementation of the <see cref="T:log4net.Core.IRepositorySelector"/> interface.
+            </summary>
+            <remarks>
+            <para>
+            Uses attributes defined on the calling assembly to determine how to
+            configure the hierarchy for the repository.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Core.DefaultRepositorySelector.#ctor(System.Type)">
+            <summary>
+            Creates a new repository selector.
+            </summary>
+            <param name="defaultRepositoryType">The type of the repositories to create, must implement <see cref="T:log4net.Repository.ILoggerRepository"/></param>
+            <remarks>
+            <para>
+            Create an new repository selector.
+            The default type for repositories must be specified,
+            an appropriate value would be <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/>.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException"><paramref name="defaultRepositoryType"/> is <see langword="null"/>.</exception>
+            <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="defaultRepositoryType"/> does not implement <see cref="T:log4net.Repository.ILoggerRepository"/>.</exception>
+        </member>
+        <member name="M:log4net.Core.DefaultRepositorySelector.GetRepository(System.Reflection.Assembly)">
+            <summary>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> for the specified assembly.
+            </summary>
+            <param name="repositoryAssembly">The assembly use to lookup the <see cref="T:log4net.Repository.ILoggerRepository"/>.</param>
+            <remarks>
+            <para>
+            The type of the <see cref="T:log4net.Repository.ILoggerRepository"/> created and the repository 
+            to create can be overridden by specifying the <see cref="T:log4net.Config.RepositoryAttribute"/> 
+            attribute on the <paramref name="repositoryAssembly"/>.
+            </para>
+            <para>
+            The default values are to use the <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> 
+            implementation of the <see cref="T:log4net.Repository.ILoggerRepository"/> interface and to use the
+            <see cref="P:System.Reflection.AssemblyName.Name"/> as the name of the repository.
+            </para>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be automatically configured using 
+            any <see cref="T:log4net.Config.ConfiguratorAttribute"/> attributes defined on
+            the <paramref name="repositoryAssembly"/>.
+            </para>
+            </remarks>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> for the assembly</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="repositoryAssembly"/> is <see langword="null"/>.</exception>
+        </member>
+        <member name="M:log4net.Core.DefaultRepositorySelector.GetRepository(System.String)">
+            <summary>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> for the specified repository.
+            </summary>
+            <param name="repositoryName">The repository to use to lookup the <see cref="T:log4net.Repository.ILoggerRepository"/>.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> for the specified repository.</returns>
+            <remarks>
+            <para>
+            Returns the named repository. If <paramref name="repositoryName"/> is <c>null</c>
+            a <see cref="T:System.ArgumentNullException"/> is thrown. If the repository 
+            does not exist a <see cref="T:log4net.Core.LogException"/> is thrown.
+            </para>
+            <para>
+            Use <see cref="M:log4net.Core.DefaultRepositorySelector.CreateRepository(System.String,System.Type)"/> to create a repository.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException"><paramref name="repositoryName"/> is <see langword="null"/>.</exception>
+            <exception cref="T:log4net.Core.LogException"><paramref name="repositoryName"/> does not exist.</exception>
+        </member>
+        <member name="M:log4net.Core.DefaultRepositorySelector.CreateRepository(System.Reflection.Assembly,System.Type)">
+            <summary>
+            Create a new repository for the assembly specified 
+            </summary>
+            <param name="repositoryAssembly">the assembly to use to create the repository to associate with the <see cref="T:log4net.Repository.ILoggerRepository"/>.</param>
+            <param name="repositoryType">The type of repository to create, must implement <see cref="T:log4net.Repository.ILoggerRepository"/>.</param>
+            <returns>The repository created.</returns>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be associated with the repository
+            specified such that a call to <see cref="M:log4net.Core.DefaultRepositorySelector.GetRepository(System.Reflection.Assembly)"/> with the
+            same assembly specified will return the same repository instance.
+            </para>
+            <para>
+            The type of the <see cref="T:log4net.Repository.ILoggerRepository"/> created and
+            the repository to create can be overridden by specifying the
+            <see cref="T:log4net.Config.RepositoryAttribute"/> attribute on the 
+            <paramref name="repositoryAssembly"/>.  The default values are to use the 
+            <paramref name="repositoryType"/> implementation of the 
+            <see cref="T:log4net.Repository.ILoggerRepository"/> interface and to use the
+            <see cref="P:System.Reflection.AssemblyName.Name"/> as the name of the repository.
+            </para>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be automatically
+            configured using any <see cref="T:log4net.Config.ConfiguratorAttribute"/> 
+            attributes defined on the <paramref name="repositoryAssembly"/>.
+            </para>
+            <para>
+            If a repository for the <paramref name="repositoryAssembly"/> already exists
+            that repository will be returned. An error will not be raised and that 
+            repository may be of a different type to that specified in <paramref name="repositoryType"/>.
+            Also the <see cref="T:log4net.Config.RepositoryAttribute"/> attribute on the
+            assembly may be used to override the repository type specified in 
+            <paramref name="repositoryType"/>.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException"><paramref name="repositoryAssembly"/> is <see langword="null"/>.</exception>
+        </member>
+        <member name="M:log4net.Core.DefaultRepositorySelector.CreateRepository(System.Reflection.Assembly,System.Type,System.String,System.Boolean)">
+            <summary>
+            Creates a new repository for the assembly specified.
+            </summary>
+            <param name="repositoryAssembly">the assembly to use to create the repository to associate with the <see cref="T:log4net.Repository.ILoggerRepository"/>.</param>
+            <param name="repositoryType">The type of repository to create, must implement <see cref="T:log4net.Repository.ILoggerRepository"/>.</param>
+            <param name="repositoryName">The name to assign to the created repository</param>
+            <param name="readAssemblyAttributes">Set to <c>true</c> to read and apply the assembly attributes</param>
+            <returns>The repository created.</returns>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be associated with the repository
+            specified such that a call to <see cref="M:log4net.Core.DefaultRepositorySelector.GetRepository(System.Reflection.Assembly)"/> with the
+            same assembly specified will return the same repository instance.
+            </para>
+            <para>
+            The type of the <see cref="T:log4net.Repository.ILoggerRepository"/> created and
+            the repository to create can be overridden by specifying the
+            <see cref="T:log4net.Config.RepositoryAttribute"/> attribute on the 
+            <paramref name="repositoryAssembly"/>.  The default values are to use the 
+            <paramref name="repositoryType"/> implementation of the 
+            <see cref="T:log4net.Repository.ILoggerRepository"/> interface and to use the
+            <see cref="P:System.Reflection.AssemblyName.Name"/> as the name of the repository.
+            </para>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be automatically
+            configured using any <see cref="T:log4net.Config.ConfiguratorAttribute"/> 
+            attributes defined on the <paramref name="repositoryAssembly"/>.
+            </para>
+            <para>
+            If a repository for the <paramref name="repositoryAssembly"/> already exists
+            that repository will be returned. An error will not be raised and that 
+            repository may be of a different type to that specified in <paramref name="repositoryType"/>.
+            Also the <see cref="T:log4net.Config.RepositoryAttribute"/> attribute on the
+            assembly may be used to override the repository type specified in 
+            <paramref name="repositoryType"/>.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException"><paramref name="repositoryAssembly"/> is <see langword="null"/>.</exception>
+        </member>
+        <member name="M:log4net.Core.DefaultRepositorySelector.CreateRepository(System.String,System.Type)">
+            <summary>
+            Creates a new repository for the specified repository.
+            </summary>
+            <param name="repositoryName">The repository to associate with the <see cref="T:log4net.Repository.ILoggerRepository"/>.</param>
+            <param name="repositoryType">The type of repository to create, must implement <see cref="T:log4net.Repository.ILoggerRepository"/>.
+            If this param is <see langword="null"/> then the default repository type is used.</param>
+            <returns>The new repository.</returns>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be associated with the repository
+            specified such that a call to <see cref="M:log4net.Core.DefaultRepositorySelector.GetRepository(System.String)"/> with the
+            same repository specified will return the same repository instance.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException"><paramref name="repositoryName"/> is <see langword="null"/>.</exception>
+            <exception cref="T:log4net.Core.LogException"><paramref name="repositoryName"/> already exists.</exception>
+        </member>
+        <member name="M:log4net.Core.DefaultRepositorySelector.ExistsRepository(System.String)">
+            <summary>
+            Test if a named repository exists
+            </summary>
+            <param name="repositoryName">the named repository to check</param>
+            <returns><c>true</c> if the repository exists</returns>
+            <remarks>
+            <para>
+            Test if a named repository exists. Use <see cref="M:log4net.Core.DefaultRepositorySelector.CreateRepository(System.String,System.Type)"/>
+            to create a new repository and <see cref="M:log4net.Core.DefaultRepositorySelector.GetRepository(System.String)"/> to retrieve 
+            a repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.DefaultRepositorySelector.GetAllRepositories">
+            <summary>
+            Gets a list of <see cref="T:log4net.Repository.ILoggerRepository"/> objects
+            </summary>
+            <returns>an array of all known <see cref="T:log4net.Repository.ILoggerRepository"/> objects</returns>
+            <remarks>
+            <para>
+            Gets an array of all of the repositories created by this selector.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.DefaultRepositorySelector.AliasRepository(System.String,log4net.Repository.ILoggerRepository)">
+            <summary>
+            Aliases a repository to an existing repository.
+            </summary>
+            <param name="repositoryAlias">The repository to alias.</param>
+            <param name="repositoryTarget">The repository that the repository is aliased to.</param>
+            <remarks>
+            <para>
+            The repository specified will be aliased to the repository when created. 
+            The repository must not already exist.
+            </para>
+            <para>
+            When the repository is created it must utilize the same repository type as 
+            the repository it is aliased to, otherwise the aliasing will fail.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            <para><paramref name="repositoryAlias"/> is <see langword="null"/>.</para>
+            <para>-or-</para>
+            <para><paramref name="repositoryTarget"/> is <see langword="null"/>.</para>
+            </exception>
+        </member>
+        <member name="M:log4net.Core.DefaultRepositorySelector.OnLoggerRepositoryCreatedEvent(log4net.Repository.ILoggerRepository)">
+            <summary>
+            Notifies the registered listeners that the repository has been created.
+            </summary>
+            <param name="repository">The repository that has been created.</param>
+            <remarks>
+            <para>
+            Raises the <see cref="E:log4net.Core.DefaultRepositorySelector.LoggerRepositoryCreatedEvent"/> event.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.DefaultRepositorySelector.GetInfoForAssembly(System.Reflection.Assembly,System.String@,System.Type@)">
+            <summary>
+            Gets the repository name and repository type for the specified assembly.
+            </summary>
+            <param name="assembly">The assembly that has a <see cref="T:log4net.Config.RepositoryAttribute"/>.</param>
+            <param name="repositoryName">in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling.</param>
+            <param name="repositoryType">in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="assembly"/> is <see langword="null"/>.</exception>
+        </member>
+        <member name="M:log4net.Core.DefaultRepositorySelector.ConfigureRepository(System.Reflection.Assembly,log4net.Repository.ILoggerRepository)">
+            <summary>
+            Configures the repository using information from the assembly.
+            </summary>
+            <param name="assembly">The assembly containing <see cref="T:log4net.Config.ConfiguratorAttribute"/>
+            attributes which define the configuration for the repository.</param>
+            <param name="repository">The repository to configure.</param>
+            <exception cref="T:System.ArgumentNullException">
+            <para><paramref name="assembly"/> is <see langword="null"/>.</para>
+            <para>-or-</para>
+            <para><paramref name="repository"/> is <see langword="null"/>.</para>
+            </exception>
+        </member>
+        <member name="M:log4net.Core.DefaultRepositorySelector.LoadPlugins(System.Reflection.Assembly,log4net.Repository.ILoggerRepository)">
+            <summary>
+            Loads the attribute defined plugins on the assembly.
+            </summary>
+            <param name="assembly">The assembly that contains the attributes.</param>
+            <param name="repository">The repository to add the plugins to.</param>
+            <exception cref="T:System.ArgumentNullException">
+            <para><paramref name="assembly"/> is <see langword="null"/>.</para>
+            <para>-or-</para>
+            <para><paramref name="repository"/> is <see langword="null"/>.</para>
+            </exception>
+        </member>
+        <member name="M:log4net.Core.DefaultRepositorySelector.LoadAliases(System.Reflection.Assembly,log4net.Repository.ILoggerRepository)">
+            <summary>
+            Loads the attribute defined aliases on the assembly.
+            </summary>
+            <param name="assembly">The assembly that contains the attributes.</param>
+            <param name="repository">The repository to alias to.</param>
+            <exception cref="T:System.ArgumentNullException">
+            <para><paramref name="assembly"/> is <see langword="null"/>.</para>
+            <para>-or-</para>
+            <para><paramref name="repository"/> is <see langword="null"/>.</para>
+            </exception>
+        </member>
+        <member name="E:log4net.Core.DefaultRepositorySelector.LoggerRepositoryCreatedEvent">
+            <summary>
+            Event to notify that a logger repository has been created.
+            </summary>
+            <value>
+            Event to notify that a logger repository has been created.
+            </value>
+            <remarks>
+            <para>
+            Event raised when a new repository is created.
+            The event source will be this selector. The event args will
+            be a <see cref="T:log4net.Core.LoggerRepositoryCreationEventArgs"/> which
+            holds the newly created <see cref="T:log4net.Repository.ILoggerRepository"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.ErrorCode">
+            <summary>
+            Defined error codes that can be passed to the <see cref="M:log4net.Core.IErrorHandler.Error(System.String,System.Exception,log4net.Core.ErrorCode)"/> method.
+            </summary>
+            <remarks>
+            <para>
+            Values passed to the <see cref="M:log4net.Core.IErrorHandler.Error(System.String,System.Exception,log4net.Core.ErrorCode)"/> method.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Core.ErrorCode.GenericFailure">
+            <summary>
+            A general error
+            </summary>
+        </member>
+        <member name="F:log4net.Core.ErrorCode.WriteFailure">
+            <summary>
+            Error while writing output
+            </summary>
+        </member>
+        <member name="F:log4net.Core.ErrorCode.FlushFailure">
+            <summary>
+            Failed to flush file
+            </summary>
+        </member>
+        <member name="F:log4net.Core.ErrorCode.CloseFailure">
+            <summary>
+            Failed to close file
+            </summary>
+        </member>
+        <member name="F:log4net.Core.ErrorCode.FileOpenFailure">
+            <summary>
+            Unable to open output file
+            </summary>
+        </member>
+        <member name="F:log4net.Core.ErrorCode.MissingLayout">
+            <summary>
+            No layout specified
+            </summary>
+        </member>
+        <member name="F:log4net.Core.ErrorCode.AddressParseFailure">
+            <summary>
+            Failed to parse address
+            </summary>
+        </member>
+        <member name="T:log4net.Core.IErrorHandler">
+            <summary>
+            Appenders may delegate their error handling to an <see cref="T:log4net.Core.IErrorHandler"/>.
+            </summary>
+            <remarks>
+            <para>
+            Error handling is a particularly tedious to get right because by
+            definition errors are hard to predict and to reproduce. 
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Core.IErrorHandler.Error(System.String,System.Exception,log4net.Core.ErrorCode)">
+            <summary>
+            Handles the error and information about the error condition is passed as 
+            a parameter.
+            </summary>
+            <param name="message">The message associated with the error.</param>
+            <param name="e">The <see cref="T:System.Exception"/> that was thrown when the error occurred.</param>
+            <param name="errorCode">The error code associated with the error.</param>
+            <remarks>
+            <para>
+            Handles the error and information about the error condition is passed as 
+            a parameter.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.IErrorHandler.Error(System.String,System.Exception)">
+            <summary>
+            Prints the error message passed as a parameter.
+            </summary>
+            <param name="message">The message associated with the error.</param>
+            <param name="e">The <see cref="T:System.Exception"/> that was thrown when the error occurred.</param>
+            <remarks>
+            <para>
+            See <see cref="M:log4net.Core.IErrorHandler.Error(System.String,System.Exception,log4net.Core.ErrorCode)"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.IErrorHandler.Error(System.String)">
+            <summary>
+            Prints the error message passed as a parameter.
+            </summary>
+            <param name="message">The message associated with the error.</param>
+            <remarks>
+            <para>
+            See <see cref="M:log4net.Core.IErrorHandler.Error(System.String,System.Exception,log4net.Core.ErrorCode)"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.IFixingRequired">
+            <summary>
+            Interface for objects that require fixing.
+            </summary>
+            <remarks>
+            <para>
+            Interface that indicates that the object requires fixing before it
+            can be taken outside the context of the appender's 
+            <see cref="M:log4net.Appender.IAppender.DoAppend(log4net.Core.LoggingEvent)"/> method.
+            </para>
+            <para>
+            When objects that implement this interface are stored 
+            in the context properties maps <see cref="T:log4net.GlobalContext"/>
+            <see cref="P:log4net.GlobalContext.Properties"/> and <see cref="T:log4net.ThreadContext"/>
+            <see cref="P:log4net.ThreadContext.Properties"/> are fixed 
+            (see <see cref="P:log4net.Core.LoggingEvent.Fix"/>) the <see cref="M:log4net.Core.IFixingRequired.GetFixedObject"/>
+            method will be called.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Core.IFixingRequired.GetFixedObject">
+            <summary>
+            Get a portable version of this object
+            </summary>
+            <returns>the portable instance of this object</returns>
+            <remarks>
+            <para>
+            Get a portable instance object that represents the current
+            state of this object. The portable object can be stored
+            and logged from any thread with identical results.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.ILogger">
+            <summary>
+            Interface that all loggers implement
+            </summary>
+            <remarks>
+            <para>
+            This interface supports logging events and testing if a level
+            is enabled for logging.
+            </para>
+            <para>
+            These methods will not throw exceptions. Note to implementor, ensure
+            that the implementation of these methods cannot allow an exception
+            to be thrown to the caller.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Core.ILogger.Log(System.Type,log4net.Core.Level,System.Object,System.Exception)">
+            <summary>
+            This generic form is intended to be used by wrappers.
+            </summary>
+            <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
+            the stack boundary into the logging system for this call.</param>
+            <param name="level">The level of the message to be logged.</param>
+            <param name="message">The message object to log.</param>
+            <param name="exception">the exception to log, including its stack trace. Pass <c>null</c> to not log an exception.</param>
+            <remarks>
+            <para>
+            Generates a logging event for the specified <paramref name="level"/> using
+            the <paramref name="message"/> and <paramref name="exception"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.ILogger.Log(log4net.Core.LoggingEvent)">
+            <summary>
+            This is the most generic printing method that is intended to be used 
+            by wrappers.
+            </summary>
+            <param name="logEvent">The event being logged.</param>
+            <remarks>
+            <para>
+            Logs the specified logging event through this logger.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.ILogger.IsEnabledFor(log4net.Core.Level)">
+            <summary>
+            Checks if this logger is enabled for a given <see cref="T:log4net.Core.Level"/> passed as parameter.
+            </summary>
+            <param name="level">The level to check.</param>
+            <returns>
+            <c>true</c> if this logger is enabled for <c>level</c>, otherwise <c>false</c>.
+            </returns>
+            <remarks>
+            <para>
+            Test if this logger is going to log events of the specified <paramref name="level"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.ILogger.Name">
+            <summary>
+            Gets the name of the logger.
+            </summary>
+            <value>
+            The name of the logger.
+            </value>
+            <remarks>
+            <para>
+            The name of this logger
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.ILogger.Repository">
+            <summary>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> where this 
+            <c>Logger</c> instance is attached to.
+            </summary>
+            <value>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> that this logger belongs to.
+            </value>
+            <remarks>
+            <para>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> where this 
+            <c>Logger</c> instance is attached to.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.ILoggerWrapper">
+            <summary>
+            Base interface for all wrappers
+            </summary>
+            <remarks>
+            <para>
+            Base interface for all wrappers.
+            </para>
+            <para>
+            All wrappers must implement this interface.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="P:log4net.Core.ILoggerWrapper.Logger">
+            <summary>
+            Get the implementation behind this wrapper object.
+            </summary>
+            <value>
+            The <see cref="T:log4net.Core.ILogger"/> object that in implementing this object.
+            </value>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Core.ILogger"/> object that in implementing this
+            object. The <c>Logger</c> object may not 
+            be the same object as this object because of logger decorators.
+            This gets the actual underlying objects that is used to process
+            the log events.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.LoggerRepositoryCreationEventHandler">
+            <summary>
+            Delegate used to handle logger repository creation event notifications
+            </summary>
+            <param name="sender">The <see cref="T:log4net.Core.IRepositorySelector"/> which created the repository.</param>
+            <param name="e">The <see cref="T:log4net.Core.LoggerRepositoryCreationEventArgs"/> event args
+            that holds the <see cref="T:log4net.Repository.ILoggerRepository"/> instance that has been created.</param>
+            <remarks>
+            <para>
+            Delegate used to handle logger repository creation event notifications.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.LoggerRepositoryCreationEventArgs">
+            <summary>
+            Provides data for the <see cref="E:log4net.Core.IRepositorySelector.LoggerRepositoryCreatedEvent"/> event.
+            </summary>
+            <remarks>
+            <para>
+            A <see cref="E:log4net.Core.IRepositorySelector.LoggerRepositoryCreatedEvent"/> 
+            event is raised every time a <see cref="T:log4net.Repository.ILoggerRepository"/> is created.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggerRepositoryCreationEventArgs.m_repository">
+            <summary>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created
+            </summary>
+        </member>
+        <member name="M:log4net.Core.LoggerRepositoryCreationEventArgs.#ctor(log4net.Repository.ILoggerRepository)">
+            <summary>
+            Construct instance using <see cref="T:log4net.Repository.ILoggerRepository"/> specified
+            </summary>
+            <param name="repository">the <see cref="T:log4net.Repository.ILoggerRepository"/> that has been created</param>
+            <remarks>
+            <para>
+            Construct instance using <see cref="T:log4net.Repository.ILoggerRepository"/> specified
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggerRepositoryCreationEventArgs.LoggerRepository">
+            <summary>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> that has been created
+            </summary>
+            <value>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> that has been created
+            </value>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> that has been created
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.ITriggeringEventEvaluator">
+            <summary>
+            Test if an <see cref="T:log4net.Core.LoggingEvent"/> triggers an action
+            </summary>
+            <remarks>
+            <para>
+            Implementations of this interface allow certain appenders to decide
+            when to perform an appender specific action.
+            </para>
+            <para>
+            The action or behavior triggered is defined by the implementation.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Core.ITriggeringEventEvaluator.IsTriggeringEvent(log4net.Core.LoggingEvent)">
+            <summary>
+            Test if this event triggers the action
+            </summary>
+            <param name="loggingEvent">The event to check</param>
+            <returns><c>true</c> if this event triggers the action, otherwise <c>false</c></returns>
+            <remarks>
+            <para>
+            Return <c>true</c> if this event triggers the action
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.Level">
+            <summary>
+            Defines the default set of levels recognized by the system.
+            </summary>
+            <remarks>
+            <para>
+            Each <see cref="T:log4net.Core.LoggingEvent"/> has an associated <see cref="T:log4net.Core.Level"/>.
+            </para>
+            <para>
+            Levels have a numeric <see cref="P:log4net.Core.Level.Value"/> that defines the relative 
+            ordering between levels. Two Levels with the same <see cref="P:log4net.Core.Level.Value"/> 
+            are deemed to be equivalent.
+            </para>
+            <para>
+            The levels that are recognized by log4net are set for each <see cref="T:log4net.Repository.ILoggerRepository"/>
+            and each repository can have different levels defined. The levels are stored
+            in the <see cref="P:log4net.Repository.ILoggerRepository.LevelMap"/> on the repository. Levels are
+            looked up by name from the <see cref="P:log4net.Repository.ILoggerRepository.LevelMap"/>.
+            </para>
+            <para>
+            When logging at level INFO the actual level used is not <see cref="F:log4net.Core.Level.Info"/> but
+            the value of <c>LoggerRepository.LevelMap["INFO"]</c>. The default value for this is
+            <see cref="F:log4net.Core.Level.Info"/>, but this can be changed by reconfiguring the level map.
+            </para>
+            <para>
+            Each level has a <see cref="P:log4net.Core.Level.DisplayName"/> in addition to its <see cref="P:log4net.Core.Level.Name"/>. The 
+            <see cref="P:log4net.Core.Level.DisplayName"/> is the string that is written into the output log. By default
+            the display name is the same as the level name, but this can be used to alias levels
+            or to localize the log output.
+            </para>
+            <para>
+            Some of the predefined levels recognized by the system are:
+            </para>
+            <list type="bullet">
+            	<item>
+            		<description><see cref="F:log4net.Core.Level.Off"/>.</description>
+            	</item>
+            	<item>
+            		<description><see cref="F:log4net.Core.Level.Fatal"/>.</description>
+            	</item>
+            	<item>
+            		<description><see cref="F:log4net.Core.Level.Error"/>.</description>
+            	</item>
+            	<item>
+            		<description><see cref="F:log4net.Core.Level.Warn"/>.</description>
+            	</item>
+            	<item>
+            		<description><see cref="F:log4net.Core.Level.Info"/>.</description>
+            	</item>
+            	<item>
+            		<description><see cref="F:log4net.Core.Level.Debug"/>.</description>
+            	</item>
+            	<item>
+            		<description><see cref="F:log4net.Core.Level.All"/>.</description>
+            	</item>
+            </list>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Core.Level.#ctor(System.Int32,System.String,System.String)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="level">Integer value for this level, higher values represent more severe levels.</param>
+            <param name="levelName">The string name of this level.</param>
+            <param name="displayName">The display name for this level. This may be localized or otherwise different from the name</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Core.Level"/> class with
+            the specified level name and value.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.Level.#ctor(System.Int32,System.String)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="level">Integer value for this level, higher values represent more severe levels.</param>
+            <param name="levelName">The string name of this level.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Core.Level"/> class with
+            the specified level name and value.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.Level.ToString">
+            <summary>
+            Returns the <see cref="T:System.String"/> representation of the current 
+            <see cref="T:log4net.Core.Level"/>.
+            </summary>
+            <returns>
+            A <see cref="T:System.String"/> representation of the current <see cref="T:log4net.Core.Level"/>.
+            </returns>
+            <remarks>
+            <para>
+            Returns the level <see cref="P:log4net.Core.Level.Name"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.Level.Equals(System.Object)">
+            <summary>
+            Compares levels.
+            </summary>
+            <param name="o">The object to compare against.</param>
+            <returns><c>true</c> if the objects are equal.</returns>
+            <remarks>
+            <para>
+            Compares the levels of <see cref="T:log4net.Core.Level"/> instances, and 
+            defers to base class if the target object is not a <see cref="T:log4net.Core.Level"/>
+            instance.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.Level.GetHashCode">
+            <summary>
+            Returns a hash code
+            </summary>
+            <returns>A hash code for the current <see cref="T:log4net.Core.Level"/>.</returns>
+            <remarks>
+            <para>
+            Returns a hash code suitable for use in hashing algorithms and data 
+            structures like a hash table.
+            </para>
+            <para>
+            Returns the hash code of the level <see cref="P:log4net.Core.Level.Value"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.Level.CompareTo(System.Object)">
+            <summary>
+            Compares this instance to a specified object and returns an 
+            indication of their relative values.
+            </summary>
+            <param name="r">A <see cref="T:log4net.Core.Level"/> instance or <see langword="null"/> to compare with this instance.</param>
+            <returns>
+            A 32-bit signed integer that indicates the relative order of the 
+            values compared. The return value has these meanings:
+            <list type="table">
+            	<listheader>
+            		<term>Value</term>
+            		<description>Meaning</description>
+            	</listheader>
+            	<item>
+            		<term>Less than zero</term>
+            		<description>This instance is less than <paramref name="r"/>.</description>
+            	</item>
+            	<item>
+            		<term>Zero</term>
+            		<description>This instance is equal to <paramref name="r"/>.</description>
+            	</item>
+            	<item>
+            		<term>Greater than zero</term>
+            		<description>
+            			<para>This instance is greater than <paramref name="r"/>.</para>
+            			<para>-or-</para>
+            			<para><paramref name="r"/> is <see langword="null"/>.</para>
+            			</description>
+            	</item>
+            </list>
+            </returns>
+            <remarks>
+            <para>
+            <paramref name="r"/> must be an instance of <see cref="T:log4net.Core.Level"/> 
+            or <see langword="null"/>; otherwise, an exception is thrown.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentException"><paramref name="r"/> is not a <see cref="T:log4net.Core.Level"/>.</exception>
+        </member>
+        <member name="M:log4net.Core.Level.op_GreaterThan(log4net.Core.Level,log4net.Core.Level)">
+            <summary>
+            Returns a value indicating whether a specified <see cref="T:log4net.Core.Level"/> 
+            is greater than another specified <see cref="T:log4net.Core.Level"/>.
+            </summary>
+            <param name="l">A <see cref="T:log4net.Core.Level"/></param>
+            <param name="r">A <see cref="T:log4net.Core.Level"/></param>
+            <returns>
+            <c>true</c> if <paramref name="l"/> is greater than 
+            <paramref name="r"/>; otherwise, <c>false</c>.
+            </returns>
+            <remarks>
+            <para>
+            Compares two levels.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.Level.op_LessThan(log4net.Core.Level,log4net.Core.Level)">
+            <summary>
+            Returns a value indicating whether a specified <see cref="T:log4net.Core.Level"/> 
+            is less than another specified <see cref="T:log4net.Core.Level"/>.
+            </summary>
+            <param name="l">A <see cref="T:log4net.Core.Level"/></param>
+            <param name="r">A <see cref="T:log4net.Core.Level"/></param>
+            <returns>
+            <c>true</c> if <paramref name="l"/> is less than 
+            <paramref name="r"/>; otherwise, <c>false</c>.
+            </returns>
+            <remarks>
+            <para>
+            Compares two levels.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.Level.op_GreaterThanOrEqual(log4net.Core.Level,log4net.Core.Level)">
+            <summary>
+            Returns a value indicating whether a specified <see cref="T:log4net.Core.Level"/> 
+            is greater than or equal to another specified <see cref="T:log4net.Core.Level"/>.
+            </summary>
+            <param name="l">A <see cref="T:log4net.Core.Level"/></param>
+            <param name="r">A <see cref="T:log4net.Core.Level"/></param>
+            <returns>
+            <c>true</c> if <paramref name="l"/> is greater than or equal to 
+            <paramref name="r"/>; otherwise, <c>false</c>.
+            </returns>
+            <remarks>
+            <para>
+            Compares two levels.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.Level.op_LessThanOrEqual(log4net.Core.Level,log4net.Core.Level)">
+            <summary>
+            Returns a value indicating whether a specified <see cref="T:log4net.Core.Level"/> 
+            is less than or equal to another specified <see cref="T:log4net.Core.Level"/>.
+            </summary>
+            <param name="l">A <see cref="T:log4net.Core.Level"/></param>
+            <param name="r">A <see cref="T:log4net.Core.Level"/></param>
+            <returns>
+            <c>true</c> if <paramref name="l"/> is less than or equal to 
+            <paramref name="r"/>; otherwise, <c>false</c>.
+            </returns>
+            <remarks>
+            <para>
+            Compares two levels.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.Level.op_Equality(log4net.Core.Level,log4net.Core.Level)">
+            <summary>
+            Returns a value indicating whether two specified <see cref="T:log4net.Core.Level"/> 
+            objects have the same value.
+            </summary>
+            <param name="l">A <see cref="T:log4net.Core.Level"/> or <see langword="null"/>.</param>
+            <param name="r">A <see cref="T:log4net.Core.Level"/> or <see langword="null"/>.</param>
+            <returns>
+            <c>true</c> if the value of <paramref name="l"/> is the same as the 
+            value of <paramref name="r"/>; otherwise, <c>false</c>.
+            </returns>
+            <remarks>
+            <para>
+            Compares two levels.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.Level.op_Inequality(log4net.Core.Level,log4net.Core.Level)">
+            <summary>
+            Returns a value indicating whether two specified <see cref="T:log4net.Core.Level"/> 
+            objects have different values.
+            </summary>
+            <param name="l">A <see cref="T:log4net.Core.Level"/> or <see langword="null"/>.</param>
+            <param name="r">A <see cref="T:log4net.Core.Level"/> or <see langword="null"/>.</param>
+            <returns>
+            <c>true</c> if the value of <paramref name="l"/> is different from
+            the value of <paramref name="r"/>; otherwise, <c>false</c>.
+            </returns>
+            <remarks>
+            <para>
+            Compares two levels.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.Level.Compare(log4net.Core.Level,log4net.Core.Level)">
+            <summary>
+            Compares two specified <see cref="T:log4net.Core.Level"/> instances.
+            </summary>
+            <param name="l">The first <see cref="T:log4net.Core.Level"/> to compare.</param>
+            <param name="r">The second <see cref="T:log4net.Core.Level"/> to compare.</param>
+            <returns>
+            A 32-bit signed integer that indicates the relative order of the 
+            two values compared. The return value has these meanings:
+            <list type="table">
+            	<listheader>
+            		<term>Value</term>
+            		<description>Meaning</description>
+            	</listheader>
+            	<item>
+            		<term>Less than zero</term>
+            		<description><paramref name="l"/> is less than <paramref name="r"/>.</description>
+            	</item>
+            	<item>
+            		<term>Zero</term>
+            		<description><paramref name="l"/> is equal to <paramref name="r"/>.</description>
+            	</item>
+            	<item>
+            		<term>Greater than zero</term>
+            		<description><paramref name="l"/> is greater than <paramref name="r"/>.</description>
+            	</item>
+            </list>
+            </returns>
+            <remarks>
+            <para>
+            Compares two levels.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.Level.Off">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Off"/> level designates a higher level than all the rest.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Emergency">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Emergency"/> level designates very severe error events. 
+            System unusable, emergencies.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Fatal">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Fatal"/> level designates very severe error events 
+            that will presumably lead the application to abort.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Alert">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Alert"/> level designates very severe error events. 
+            Take immediate action, alerts.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Critical">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Critical"/> level designates very severe error events. 
+            Critical condition, critical.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Severe">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Severe"/> level designates very severe error events.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Error">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Error"/> level designates error events that might 
+            still allow the application to continue running.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Warn">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Warn"/> level designates potentially harmful 
+            situations.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Notice">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Notice"/> level designates informational messages 
+            that highlight the progress of the application at the highest level.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Info">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Info"/> level designates informational messages that 
+            highlight the progress of the application at coarse-grained level.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Debug">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Debug"/> level designates fine-grained informational 
+            events that are most useful to debug an application.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Fine">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Fine"/> level designates fine-grained informational 
+            events that are most useful to debug an application.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Trace">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Trace"/> level designates fine-grained informational 
+            events that are most useful to debug an application.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Finer">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Finer"/> level designates fine-grained informational 
+            events that are most useful to debug an application.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Verbose">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Verbose"/> level designates fine-grained informational 
+            events that are most useful to debug an application.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.Finest">
+            <summary>
+            The <see cref="F:log4net.Core.Level.Finest"/> level designates fine-grained informational 
+            events that are most useful to debug an application.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.Level.All">
+            <summary>
+            The <see cref="F:log4net.Core.Level.All"/> level designates the lowest level possible.
+            </summary>
+        </member>
+        <member name="P:log4net.Core.Level.Name">
+            <summary>
+            Gets the name of this level.
+            </summary>
+            <value>
+            The name of this level.
+            </value>
+            <remarks>
+            <para>
+            Gets the name of this level.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.Level.Value">
+            <summary>
+            Gets the value of this level.
+            </summary>
+            <value>
+            The value of this level.
+            </value>
+            <remarks>
+            <para>
+            Gets the value of this level.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.Level.DisplayName">
+            <summary>
+            Gets the display name of this level.
+            </summary>
+            <value>
+            The display name of this level.
+            </value>
+            <remarks>
+            <para>
+            Gets the display name of this level.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.LevelCollection">
+            <summary>
+            A strongly-typed collection of <see cref="T:log4net.Core.Level"/> objects.
+            </summary>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.ReadOnly(log4net.Core.LevelCollection)">
+            <summary>
+            Creates a read-only wrapper for a <c>LevelCollection</c> instance.
+            </summary>
+            <param name="list">list to create a readonly wrapper arround</param>
+            <returns>
+            A <c>LevelCollection</c> wrapper that is read-only.
+            </returns>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.#ctor">
+            <summary>
+            Initializes a new instance of the <c>LevelCollection</c> class
+            that is empty and has the default initial capacity.
+            </summary>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.#ctor(System.Int32)">
+            <summary>
+            Initializes a new instance of the <c>LevelCollection</c> class
+            that has the specified initial capacity.
+            </summary>
+            <param name="capacity">
+            The number of elements that the new <c>LevelCollection</c> is initially capable of storing.
+            </param>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.#ctor(log4net.Core.LevelCollection)">
+            <summary>
+            Initializes a new instance of the <c>LevelCollection</c> class
+            that contains elements copied from the specified <c>LevelCollection</c>.
+            </summary>
+            <param name="c">The <c>LevelCollection</c> whose elements are copied to the new collection.</param>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.#ctor(log4net.Core.Level[])">
+            <summary>
+            Initializes a new instance of the <c>LevelCollection</c> class
+            that contains elements copied from the specified <see cref="T:log4net.Core.Level"/> array.
+            </summary>
+            <param name="a">The <see cref="T:log4net.Core.Level"/> array whose elements are copied to the new list.</param>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.#ctor(System.Collections.ICollection)">
+            <summary>
+            Initializes a new instance of the <c>LevelCollection</c> class
+            that contains elements copied from the specified <see cref="T:log4net.Core.Level"/> collection.
+            </summary>
+            <param name="col">The <see cref="T:log4net.Core.Level"/> collection whose elements are copied to the new list.</param>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.#ctor(log4net.Core.LevelCollection.Tag)">
+            <summary>
+            Allow subclasses to avoid our default constructors
+            </summary>
+            <param name="tag"></param>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.CopyTo(log4net.Core.Level[])">
+            <summary>
+            Copies the entire <c>LevelCollection</c> to a one-dimensional
+            <see cref="T:log4net.Core.Level"/> array.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:log4net.Core.Level"/> array to copy to.</param>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.CopyTo(log4net.Core.Level[],System.Int32)">
+            <summary>
+            Copies the entire <c>LevelCollection</c> to a one-dimensional
+            <see cref="T:log4net.Core.Level"/> array, starting at the specified index of the target array.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:log4net.Core.Level"/> array to copy to.</param>
+            <param name="start">The zero-based index in <paramref name="array"/> at which copying begins.</param>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.Add(log4net.Core.Level)">
+            <summary>
+            Adds a <see cref="T:log4net.Core.Level"/> to the end of the <c>LevelCollection</c>.
+            </summary>
+            <param name="item">The <see cref="T:log4net.Core.Level"/> to be added to the end of the <c>LevelCollection</c>.</param>
+            <returns>The index at which the value has been added.</returns>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.Clear">
+            <summary>
+            Removes all elements from the <c>LevelCollection</c>.
+            </summary>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.Clone">
+            <summary>
+            Creates a shallow copy of the <see cref="T:log4net.Core.LevelCollection"/>.
+            </summary>
+            <returns>A new <see cref="T:log4net.Core.LevelCollection"/> with a shallow copy of the collection data.</returns>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.Contains(log4net.Core.Level)">
+            <summary>
+            Determines whether a given <see cref="T:log4net.Core.Level"/> is in the <c>LevelCollection</c>.
+            </summary>
+            <param name="item">The <see cref="T:log4net.Core.Level"/> to check for.</param>
+            <returns><c>true</c> if <paramref name="item"/> is found in the <c>LevelCollection</c>; otherwise, <c>false</c>.</returns>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.IndexOf(log4net.Core.Level)">
+            <summary>
+            Returns the zero-based index of the first occurrence of a <see cref="T:log4net.Core.Level"/>
+            in the <c>LevelCollection</c>.
+            </summary>
+            <param name="item">The <see cref="T:log4net.Core.Level"/> to locate in the <c>LevelCollection</c>.</param>
+            <returns>
+            The zero-based index of the first occurrence of <paramref name="item"/> 
+            in the entire <c>LevelCollection</c>, if found; otherwise, -1.
+            </returns>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.Insert(System.Int32,log4net.Core.Level)">
+            <summary>
+            Inserts an element into the <c>LevelCollection</c> at the specified index.
+            </summary>
+            <param name="index">The zero-based index at which <paramref name="item"/> should be inserted.</param>
+            <param name="item">The <see cref="T:log4net.Core.Level"/> to insert.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            <para><paramref name="index"/> is less than zero</para>
+            <para>-or-</para>
+            <para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Core.LevelCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.Remove(log4net.Core.Level)">
+            <summary>
+            Removes the first occurrence of a specific <see cref="T:log4net.Core.Level"/> from the <c>LevelCollection</c>.
+            </summary>
+            <param name="item">The <see cref="T:log4net.Core.Level"/> to remove from the <c>LevelCollection</c>.</param>
+            <exception cref="T:System.ArgumentException">
+            The specified <see cref="T:log4net.Core.Level"/> was not found in the <c>LevelCollection</c>.
+            </exception>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.RemoveAt(System.Int32)">
+            <summary>
+            Removes the element at the specified index of the <c>LevelCollection</c>.
+            </summary>
+            <param name="index">The zero-based index of the element to remove.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            <para><paramref name="index"/> is less than zero</para>
+            <para>-or-</para>
+            <para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Core.LevelCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.GetEnumerator">
+            <summary>
+            Returns an enumerator that can iterate through the <c>LevelCollection</c>.
+            </summary>
+            <returns>An <see cref="T:log4net.Core.LevelCollection.Enumerator"/> for the entire <c>LevelCollection</c>.</returns>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.AddRange(log4net.Core.LevelCollection)">
+            <summary>
+            Adds the elements of another <c>LevelCollection</c> to the current <c>LevelCollection</c>.
+            </summary>
+            <param name="x">The <c>LevelCollection</c> whose elements should be added to the end of the current <c>LevelCollection</c>.</param>
+            <returns>The new <see cref="P:log4net.Core.LevelCollection.Count"/> of the <c>LevelCollection</c>.</returns>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.AddRange(log4net.Core.Level[])">
+            <summary>
+            Adds the elements of a <see cref="T:log4net.Core.Level"/> array to the current <c>LevelCollection</c>.
+            </summary>
+            <param name="x">The <see cref="T:log4net.Core.Level"/> array whose elements should be added to the end of the <c>LevelCollection</c>.</param>
+            <returns>The new <see cref="P:log4net.Core.LevelCollection.Count"/> of the <c>LevelCollection</c>.</returns>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.AddRange(System.Collections.ICollection)">
+            <summary>
+            Adds the elements of a <see cref="T:log4net.Core.Level"/> collection to the current <c>LevelCollection</c>.
+            </summary>
+            <param name="col">The <see cref="T:log4net.Core.Level"/> collection whose elements should be added to the end of the <c>LevelCollection</c>.</param>
+            <returns>The new <see cref="P:log4net.Core.LevelCollection.Count"/> of the <c>LevelCollection</c>.</returns>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.TrimToSize">
+            <summary>
+            Sets the capacity to the actual number of elements.
+            </summary>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.ValidateIndex(System.Int32)">
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            <para><paramref name="index"/> is less than zero</para>
+            <para>-or-</para>
+            <para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Core.LevelCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.ValidateIndex(System.Int32,System.Boolean)">
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            <para><paramref name="index"/> is less than zero</para>
+            <para>-or-</para>
+            <para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Core.LevelCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="P:log4net.Core.LevelCollection.Count">
+            <summary>
+            Gets the number of elements actually contained in the <c>LevelCollection</c>.
+            </summary>
+        </member>
+        <member name="P:log4net.Core.LevelCollection.IsSynchronized">
+            <summary>
+            Gets a value indicating whether access to the collection is synchronized (thread-safe).
+            </summary>
+            <value>true if access to the ICollection is synchronized (thread-safe); otherwise, false.</value>
+        </member>
+        <member name="P:log4net.Core.LevelCollection.SyncRoot">
+            <summary>
+            Gets an object that can be used to synchronize access to the collection.
+            </summary>
+        </member>
+        <member name="P:log4net.Core.LevelCollection.Item(System.Int32)">
+            <summary>
+            Gets or sets the <see cref="T:log4net.Core.Level"/> at the specified index.
+            </summary>
+            <param name="index">The zero-based index of the element to get or set.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            <para><paramref name="index"/> is less than zero</para>
+            <para>-or-</para>
+            <para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Core.LevelCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="P:log4net.Core.LevelCollection.IsFixedSize">
+            <summary>
+            Gets a value indicating whether the collection has a fixed size.
+            </summary>
+            <value>true if the collection has a fixed size; otherwise, false. The default is false</value>
+        </member>
+        <member name="P:log4net.Core.LevelCollection.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the IList is read-only.
+            </summary>
+            <value>true if the collection is read-only; otherwise, false. The default is false</value>
+        </member>
+        <member name="P:log4net.Core.LevelCollection.Capacity">
+            <summary>
+            Gets or sets the number of elements the <c>LevelCollection</c> can contain.
+            </summary>
+        </member>
+        <member name="T:log4net.Core.LevelCollection.ILevelCollectionEnumerator">
+            <summary>
+            Supports type-safe iteration over a <see cref="T:log4net.Core.LevelCollection"/>.
+            </summary>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.ILevelCollectionEnumerator.MoveNext">
+            <summary>
+            Advances the enumerator to the next element in the collection.
+            </summary>
+            <returns>
+            <c>true</c> if the enumerator was successfully advanced to the next element; 
+            <c>false</c> if the enumerator has passed the end of the collection.
+            </returns>
+            <exception cref="T:System.InvalidOperationException">
+            The collection was modified after the enumerator was created.
+            </exception>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.ILevelCollectionEnumerator.Reset">
+            <summary>
+            Sets the enumerator to its initial position, before the first element in the collection.
+            </summary>
+        </member>
+        <member name="P:log4net.Core.LevelCollection.ILevelCollectionEnumerator.Current">
+            <summary>
+            Gets the current element in the collection.
+            </summary>
+        </member>
+        <member name="T:log4net.Core.LevelCollection.Tag">
+            <summary>
+            Type visible only to our subclasses
+            Used to access protected constructor
+            </summary>
+        </member>
+        <member name="F:log4net.Core.LevelCollection.Tag.Default">
+            <summary>
+            A value
+            </summary>
+        </member>
+        <member name="T:log4net.Core.LevelCollection.Enumerator">
+            <summary>
+            Supports simple iteration over a <see cref="T:log4net.Core.LevelCollection"/>.
+            </summary>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.Enumerator.#ctor(log4net.Core.LevelCollection)">
+            <summary>
+            Initializes a new instance of the <c>Enumerator</c> class.
+            </summary>
+            <param name="tc"></param>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.Enumerator.MoveNext">
+            <summary>
+            Advances the enumerator to the next element in the collection.
+            </summary>
+            <returns>
+            <c>true</c> if the enumerator was successfully advanced to the next element; 
+            <c>false</c> if the enumerator has passed the end of the collection.
+            </returns>
+            <exception cref="T:System.InvalidOperationException">
+            The collection was modified after the enumerator was created.
+            </exception>
+        </member>
+        <member name="M:log4net.Core.LevelCollection.Enumerator.Reset">
+            <summary>
+            Sets the enumerator to its initial position, before the first element in the collection.
+            </summary>
+        </member>
+        <member name="P:log4net.Core.LevelCollection.Enumerator.Current">
+            <summary>
+            Gets the current element in the collection.
+            </summary>
+        </member>
+        <member name="T:log4net.Core.LevelEvaluator">
+            <summary>
+            An evaluator that triggers at a threshold level
+            </summary>
+            <remarks>
+            <para>
+            This evaluator will trigger if the level of the event
+            passed to <see cref="M:log4net.Core.LevelEvaluator.IsTriggeringEvent(log4net.Core.LoggingEvent)"/>
+            is equal to or greater than the <see cref="P:log4net.Core.LevelEvaluator.Threshold"/>
+            level.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Core.LevelEvaluator.m_threshold">
+            <summary>
+            The threshold for triggering
+            </summary>
+        </member>
+        <member name="M:log4net.Core.LevelEvaluator.#ctor">
+            <summary>
+            Create a new evaluator using the <see cref="F:log4net.Core.Level.Off"/> threshold.
+            </summary>
+            <remarks>
+            <para>
+            Create a new evaluator using the <see cref="F:log4net.Core.Level.Off"/> threshold.
+            </para>
+            <para>
+            This evaluator will trigger if the level of the event
+            passed to <see cref="M:log4net.Core.LevelEvaluator.IsTriggeringEvent(log4net.Core.LoggingEvent)"/>
+            is equal to or greater than the <see cref="P:log4net.Core.LevelEvaluator.Threshold"/>
+            level.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LevelEvaluator.#ctor(log4net.Core.Level)">
+            <summary>
+            Create a new evaluator using the specified <see cref="T:log4net.Core.Level"/> threshold.
+            </summary>
+            <param name="threshold">the threshold to trigger at</param>
+            <remarks>
+            <para>
+            Create a new evaluator using the specified <see cref="T:log4net.Core.Level"/> threshold.
+            </para>
+            <para>
+            This evaluator will trigger if the level of the event
+            passed to <see cref="M:log4net.Core.LevelEvaluator.IsTriggeringEvent(log4net.Core.LoggingEvent)"/>
+            is equal to or greater than the <see cref="P:log4net.Core.LevelEvaluator.Threshold"/>
+            level.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LevelEvaluator.IsTriggeringEvent(log4net.Core.LoggingEvent)">
+            <summary>
+            Is this <paramref name="loggingEvent"/> the triggering event?
+            </summary>
+            <param name="loggingEvent">The event to check</param>
+            <returns>This method returns <c>true</c>, if the event level
+            is equal or higher than the <see cref="P:log4net.Core.LevelEvaluator.Threshold"/>. 
+            Otherwise it returns <c>false</c></returns>
+            <remarks>
+            <para>
+            This evaluator will trigger if the level of the event
+            passed to <see cref="M:log4net.Core.LevelEvaluator.IsTriggeringEvent(log4net.Core.LoggingEvent)"/>
+            is equal to or greater than the <see cref="P:log4net.Core.LevelEvaluator.Threshold"/>
+            level.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LevelEvaluator.Threshold">
+            <summary>
+            the threshold to trigger at
+            </summary>
+            <value>
+            The <see cref="T:log4net.Core.Level"/> that will cause this evaluator to trigger
+            </value>
+            <remarks>
+            <para>
+            This evaluator will trigger if the level of the event
+            passed to <see cref="M:log4net.Core.LevelEvaluator.IsTriggeringEvent(log4net.Core.LoggingEvent)"/>
+            is equal to or greater than the <see cref="P:log4net.Core.LevelEvaluator.Threshold"/>
+            level.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.LevelMap">
+            <summary>
+            Mapping between string name and Level object
+            </summary>
+            <remarks>
+            <para>
+            Mapping between string name and <see cref="T:log4net.Core.Level"/> object.
+            This mapping is held separately for each <see cref="T:log4net.Repository.ILoggerRepository"/>.
+            The level name is case insensitive.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Core.LevelMap.m_mapName2Level">
+            <summary>
+            Mapping from level name to Level object. The
+            level name is case insensitive
+            </summary>
+        </member>
+        <member name="M:log4net.Core.LevelMap.#ctor">
+            <summary>
+            Construct the level map
+            </summary>
+            <remarks>
+            <para>
+            Construct the level map.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LevelMap.Clear">
+            <summary>
+            Clear the internal maps of all levels
+            </summary>
+            <remarks>
+            <para>
+            Clear the internal maps of all levels
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LevelMap.Add(System.String,System.Int32)">
+            <summary>
+            Create a new Level and add it to the map
+            </summary>
+            <param name="name">the string to display for the Level</param>
+            <param name="value">the level value to give to the Level</param>
+            <remarks>
+            <para>
+            Create a new Level and add it to the map
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.Core.LevelMap.Add(System.String,System.Int32,System.String)"/>
+        </member>
+        <member name="M:log4net.Core.LevelMap.Add(System.String,System.Int32,System.String)">
+            <summary>
+            Create a new Level and add it to the map
+            </summary>
+            <param name="name">the string to display for the Level</param>
+            <param name="value">the level value to give to the Level</param>
+            <param name="displayName">the display name to give to the Level</param>
+            <remarks>
+            <para>
+            Create a new Level and add it to the map
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LevelMap.Add(log4net.Core.Level)">
+            <summary>
+            Add a Level to the map
+            </summary>
+            <param name="level">the Level to add</param>
+            <remarks>
+            <para>
+            Add a Level to the map
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LevelMap.LookupWithDefault(log4net.Core.Level)">
+            <summary>
+            Lookup a named level from the map
+            </summary>
+            <param name="defaultLevel">the name of the level to lookup is taken from this level. 
+            If the level is not set on the map then this level is added</param>
+            <returns>the level in the map with the name specified</returns>
+            <remarks>
+            <para>
+            Lookup a named level from the map. The name of the level to lookup is taken
+            from the <see cref="P:log4net.Core.Level.Name"/> property of the <paramref name="defaultLevel"/>
+            argument.
+            </para>
+            <para>
+            If no level with the specified name is found then the 
+            <paramref name="defaultLevel"/> argument is added to the level map
+            and returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LevelMap.Item(System.String)">
+            <summary>
+            Lookup a <see cref="T:log4net.Core.Level"/> by name
+            </summary>
+            <param name="name">The name of the Level to lookup</param>
+            <returns>a Level from the map with the name specified</returns>
+            <remarks>
+            <para>
+            Returns the <see cref="T:log4net.Core.Level"/> from the
+            map with the name specified. If the no level is
+            found then <c>null</c> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LevelMap.AllLevels">
+            <summary>
+            Return all possible levels as a list of Level objects.
+            </summary>
+            <returns>all possible levels as a list of Level objects</returns>
+            <remarks>
+            <para>
+            Return all possible levels as a list of Level objects.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.LocationInfo">
+            <summary>
+            The internal representation of caller location information.
+            </summary>
+            <remarks>
+            <para>
+            This class uses the <c>System.Diagnostics.StackTrace</c> class to generate
+            a call stack. The caller's information is then extracted from this stack.
+            </para>
+            <para>
+            The <c>System.Diagnostics.StackTrace</c> class is not supported on the 
+            .NET Compact Framework 1.0 therefore caller location information is not
+            available on that framework.
+            </para>
+            <para>
+            The <c>System.Diagnostics.StackTrace</c> class has this to say about Release builds:
+            </para>
+            <para>
+            "StackTrace information will be most informative with Debug build configurations. 
+            By default, Debug builds include debug symbols, while Release builds do not. The 
+            debug symbols contain most of the file, method name, line number, and column 
+            information used in constructing StackFrame and StackTrace objects. StackTrace 
+            might not report as many method calls as expected, due to code transformations 
+            that occur during optimization."
+            </para>
+            <para>
+            This means that in a Release build the caller information may be incomplete or may 
+            not exist at all! Therefore caller location information cannot be relied upon in a Release build.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="F:log4net.Core.LocationInfo.NA">
+            <summary>
+            When location information is not available the constant
+            <c>NA</c> is returned. Current value of this string
+            constant is <b>?</b>.
+            </summary>
+        </member>
+        <member name="M:log4net.Core.LocationInfo.#ctor(System.Type)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
+            the stack boundary into the logging system for this call.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Core.LocationInfo"/>
+            class based on the current thread.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LocationInfo.#ctor(System.String,System.String,System.String,System.String)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="className">The fully qualified class name.</param>
+            <param name="methodName">The method name.</param>
+            <param name="fileName">The file name.</param>
+            <param name="lineNumber">The line number of the method within the file.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Core.LocationInfo"/>
+            class with the specified data.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LocationInfo.ClassName">
+            <summary>
+            Gets the fully qualified class name of the caller making the logging 
+            request.
+            </summary>
+            <value>
+            The fully qualified class name of the caller making the logging 
+            request.
+            </value>
+            <remarks>
+            <para>
+            Gets the fully qualified class name of the caller making the logging 
+            request.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LocationInfo.FileName">
+            <summary>
+            Gets the file name of the caller.
+            </summary>
+            <value>
+            The file name of the caller.
+            </value>
+            <remarks>
+            <para>
+            Gets the file name of the caller.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LocationInfo.LineNumber">
+            <summary>
+            Gets the line number of the caller.
+            </summary>
+            <value>
+            The line number of the caller.
+            </value>
+            <remarks>
+            <para>
+            Gets the line number of the caller.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LocationInfo.MethodName">
+            <summary>
+            Gets the method name of the caller.
+            </summary>
+            <value>
+            The method name of the caller.
+            </value>
+            <remarks>
+            <para>
+            Gets the method name of the caller.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LocationInfo.FullInfo">
+            <summary>
+            Gets all available caller information
+            </summary>
+            <value>
+            All available caller information, in the format
+            <c>fully.qualified.classname.of.caller.methodName(Filename:line)</c>
+            </value>
+            <remarks>
+            <para>
+            Gets all available caller information, in the format
+            <c>fully.qualified.classname.of.caller.methodName(Filename:line)</c>
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.LoggerManager">
+            <summary>
+            Static manager that controls the creation of repositories
+            </summary>
+            <remarks>
+            <para>
+            Static manager that controls the creation of repositories
+            </para>
+            <para>
+            This class is used by the wrapper managers (e.g. <see cref="T:log4net.LogManager"/>)
+            to provide access to the <see cref="T:log4net.Core.ILogger"/> objects.
+            </para>
+            <para>
+            This manager also holds the <see cref="T:log4net.Core.IRepositorySelector"/> that is used to
+            lookup and create repositories. The selector can be set either programmatically using
+            the <see cref="P:log4net.Core.LoggerManager.RepositorySelector"/> property, or by setting the <c>log4net.RepositorySelector</c>
+            AppSetting in the applications config file to the fully qualified type name of the
+            selector to use. 
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.#ctor">
+            <summary>
+            Private constructor to prevent instances. Only static methods should be used.
+            </summary>
+            <remarks>
+            <para>
+            Private constructor to prevent instances. Only static methods should be used.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.#cctor">
+            <summary>
+            Hook the shutdown event
+            </summary>
+            <remarks>
+            <para>
+            On the full .NET runtime, the static constructor hooks up the 
+            <c>AppDomain.ProcessExit</c> and <c>AppDomain.DomainUnload</c>> events. 
+            These are used to shutdown the log4net system as the application exits.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.RegisterAppDomainEvents">
+            <summary>
+            Register for ProcessExit and DomainUnload events on the AppDomain
+            </summary>
+            <remarks>
+            <para>
+            This needs to be in a separate method because the events make
+            a LinkDemand for the ControlAppDomain SecurityPermission. Because
+            this is a LinkDemand it is demanded at JIT time. Therefore we cannot
+            catch the exception in the method itself, we have to catch it in the
+            caller.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.GetLoggerRepository(System.String)">
+            <summary>
+            Return the default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.
+            </summary>
+            <param name="repository">the repository to lookup in</param>
+            <returns>Return the default <see cref="T:log4net.Repository.ILoggerRepository"/> instance</returns>
+            <remarks>
+            <para>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified
+            by the <paramref name="repository"/> argument.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.GetLoggerRepository(System.Reflection.Assembly)">
+            <summary>
+            Returns the default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.
+            </summary>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+            <returns>The default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.</returns>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.GetRepository(System.String)">
+            <summary>
+            Return the default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.
+            </summary>
+            <param name="repository">the repository to lookup in</param>
+            <returns>Return the default <see cref="T:log4net.Repository.ILoggerRepository"/> instance</returns>
+            <remarks>
+            <para>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified
+            by the <paramref name="repository"/> argument.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.GetRepository(System.Reflection.Assembly)">
+            <summary>
+            Returns the default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.
+            </summary>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+            <returns>The default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.</returns>
+            <remarks>
+            <para>
+            Returns the default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.Exists(System.String,System.String)">
+            <summary>
+            Returns the named logger if it exists.
+            </summary>
+            <param name="repository">The repository to lookup in.</param>
+            <param name="name">The fully qualified logger name to look for.</param>
+            <returns>
+            The logger found, or <c>null</c> if the named logger does not exist in the
+            specified repository.
+            </returns>
+            <remarks>
+            <para>
+            If the named logger exists (in the specified repository) then it
+            returns a reference to the logger, otherwise it returns
+            <c>null</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.Exists(System.Reflection.Assembly,System.String)">
+            <summary>
+            Returns the named logger if it exists.
+            </summary>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+            <param name="name">The fully qualified logger name to look for.</param>
+            <returns>
+            The logger found, or <c>null</c> if the named logger does not exist in the
+            specified assembly's repository.
+            </returns>
+            <remarks>
+            <para>
+            If the named logger exists (in the specified assembly's repository) then it
+            returns a reference to the logger, otherwise it returns
+            <c>null</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.GetCurrentLoggers(System.String)">
+            <summary>
+            Returns all the currently defined loggers in the specified repository.
+            </summary>
+            <param name="repository">The repository to lookup in.</param>
+            <returns>All the defined loggers.</returns>
+            <remarks>
+            <para>
+            The root logger is <b>not</b> included in the returned array.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.GetCurrentLoggers(System.Reflection.Assembly)">
+            <summary>
+            Returns all the currently defined loggers in the specified assembly's repository.
+            </summary>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+            <returns>All the defined loggers.</returns>
+            <remarks>
+            <para>
+            The root logger is <b>not</b> included in the returned array.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.GetLogger(System.String,System.String)">
+            <summary>
+            Retrieves or creates a named logger.
+            </summary>
+            <param name="repository">The repository to lookup in.</param>
+            <param name="name">The name of the logger to retrieve.</param>
+            <returns>The logger with the name specified.</returns>
+            <remarks>
+            <para>
+            Retrieves a logger named as the <paramref name="name"/>
+            parameter. If the named logger already exists, then the
+            existing instance will be returned. Otherwise, a new instance is
+            created.
+            </para>
+            <para>
+            By default, loggers do not have a set level but inherit
+            it from the hierarchy. This is one of the central features of
+            log4net.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.GetLogger(System.Reflection.Assembly,System.String)">
+            <summary>
+            Retrieves or creates a named logger.
+            </summary>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+            <param name="name">The name of the logger to retrieve.</param>
+            <returns>The logger with the name specified.</returns>
+            <remarks>
+            <para>
+            Retrieves a logger named as the <paramref name="name"/>
+            parameter. If the named logger already exists, then the
+            existing instance will be returned. Otherwise, a new instance is
+            created.
+            </para>
+            <para>
+            By default, loggers do not have a set level but inherit
+            it from the hierarchy. This is one of the central features of
+            log4net.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.GetLogger(System.String,System.Type)">
+            <summary>
+            Shorthand for <see cref="M:log4net.LogManager.GetLogger(System.String)"/>.
+            </summary>
+            <param name="repository">The repository to lookup in.</param>
+            <param name="type">The <paramref name="type"/> of which the fullname will be used as the name of the logger to retrieve.</param>
+            <returns>The logger with the name specified.</returns>
+            <remarks>
+            <para>
+            Gets the logger for the fully qualified name of the type specified.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.GetLogger(System.Reflection.Assembly,System.Type)">
+            <summary>
+            Shorthand for <see cref="M:log4net.LogManager.GetLogger(System.String)"/>.
+            </summary>
+            <param name="repositoryAssembly">the assembly to use to lookup the repository</param>
+            <param name="type">The <paramref name="type"/> of which the fullname will be used as the name of the logger to retrieve.</param>
+            <returns>The logger with the name specified.</returns>
+            <remarks>
+            <para>
+            Gets the logger for the fully qualified name of the type specified.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.Shutdown">
+            <summary>
+            Shuts down the log4net system.
+            </summary>
+            <remarks>
+            <para>
+            Calling this method will <b>safely</b> close and remove all
+            appenders in all the loggers including root contained in all the
+            default repositories.
+            </para>
+            <para>
+            Some appenders need to be closed before the application exists. 
+            Otherwise, pending logging events might be lost.
+            </para>
+            <para>
+            The <c>shutdown</c> method is careful to close nested
+            appenders before closing regular appenders. This is allows
+            configurations where a regular appender is attached to a logger
+            and again to a nested appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.ShutdownRepository(System.String)">
+            <summary>
+            Shuts down the repository for the repository specified.
+            </summary>
+            <param name="repository">The repository to shutdown.</param>
+            <remarks>
+            <para>
+            Calling this method will <b>safely</b> close and remove all
+            appenders in all the loggers including root contained in the
+            repository for the <paramref name="repository"/> specified.
+            </para>
+            <para>
+            Some appenders need to be closed before the application exists. 
+            Otherwise, pending logging events might be lost.
+            </para>
+            <para>
+            The <c>shutdown</c> method is careful to close nested
+            appenders before closing regular appenders. This is allows
+            configurations where a regular appender is attached to a logger
+            and again to a nested appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.ShutdownRepository(System.Reflection.Assembly)">
+            <summary>
+            Shuts down the repository for the repository specified.
+            </summary>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+            <remarks>
+            <para>
+            Calling this method will <b>safely</b> close and remove all
+            appenders in all the loggers including root contained in the
+            repository for the repository. The repository is looked up using
+            the <paramref name="repositoryAssembly"/> specified.
+            </para>
+            <para>
+            Some appenders need to be closed before the application exists. 
+            Otherwise, pending logging events might be lost.
+            </para>
+            <para>
+            The <c>shutdown</c> method is careful to close nested
+            appenders before closing regular appenders. This is allows
+            configurations where a regular appender is attached to a logger
+            and again to a nested appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.ResetConfiguration(System.String)">
+            <summary>
+            Resets all values contained in this repository instance to their defaults.
+            </summary>
+            <param name="repository">The repository to reset.</param>
+            <remarks>
+            <para>
+            Resets all values contained in the repository instance to their
+            defaults.  This removes all appenders from all loggers, sets
+            the level of all non-root loggers to <c>null</c>,
+            sets their additivity flag to <c>true</c> and sets the level
+            of the root logger to <see cref="F:log4net.Core.Level.Debug"/>. Moreover,
+            message disabling is set its default "off" value.
+            </para>		
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.ResetConfiguration(System.Reflection.Assembly)">
+            <summary>
+            Resets all values contained in this repository instance to their defaults.
+            </summary>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository to reset.</param>
+            <remarks>
+            <para>
+            Resets all values contained in the repository instance to their
+            defaults.  This removes all appenders from all loggers, sets
+            the level of all non-root loggers to <c>null</c>,
+            sets their additivity flag to <c>true</c> and sets the level
+            of the root logger to <see cref="F:log4net.Core.Level.Debug"/>. Moreover,
+            message disabling is set its default "off" value.
+            </para>		
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.CreateDomain(System.String)">
+            <summary>
+            Creates a repository with the specified name.
+            </summary>
+            <param name="repository">The name of the repository, this must be unique amongst repositories.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> created for the repository.</returns>
+            <remarks>
+            <para>
+            <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
+            </para>
+            <para>
+            Creates the default type of <see cref="T:log4net.Repository.ILoggerRepository"/> which is a
+            <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> object.
+            </para>
+            <para>
+            The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+            An <see cref="T:System.Exception"/> will be thrown if the repository already exists.
+            </para>
+            </remarks>
+            <exception cref="T:log4net.Core.LogException">The specified repository already exists.</exception>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.CreateRepository(System.String)">
+            <summary>
+            Creates a repository with the specified name.
+            </summary>
+            <param name="repository">The name of the repository, this must be unique amongst repositories.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> created for the repository.</returns>
+            <remarks>
+            <para>
+            Creates the default type of <see cref="T:log4net.Repository.ILoggerRepository"/> which is a
+            <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> object.
+            </para>
+            <para>
+            The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+            An <see cref="T:System.Exception"/> will be thrown if the repository already exists.
+            </para>
+            </remarks>
+            <exception cref="T:log4net.Core.LogException">The specified repository already exists.</exception>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.CreateDomain(System.String,System.Type)">
+            <summary>
+            Creates a repository with the specified name and repository type.
+            </summary>
+            <param name="repository">The name of the repository, this must be unique to the repository.</param>
+            <param name="repositoryType">A <see cref="T:System.Type"/> that implements <see cref="T:log4net.Repository.ILoggerRepository"/>
+            and has a no arg constructor. An instance of this type will be created to act
+            as the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> created for the repository.</returns>
+            <remarks>
+            <para>
+            <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
+            </para>
+            <para>
+            The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+            An Exception will be thrown if the repository already exists.
+            </para>
+            </remarks>
+            <exception cref="T:log4net.Core.LogException">The specified repository already exists.</exception>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.CreateRepository(System.String,System.Type)">
+            <summary>
+            Creates a repository with the specified name and repository type.
+            </summary>
+            <param name="repository">The name of the repository, this must be unique to the repository.</param>
+            <param name="repositoryType">A <see cref="T:System.Type"/> that implements <see cref="T:log4net.Repository.ILoggerRepository"/>
+            and has a no arg constructor. An instance of this type will be created to act
+            as the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> created for the repository.</returns>
+            <remarks>
+            <para>
+            The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+            An Exception will be thrown if the repository already exists.
+            </para>
+            </remarks>
+            <exception cref="T:log4net.Core.LogException">The specified repository already exists.</exception>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.CreateDomain(System.Reflection.Assembly,System.Type)">
+            <summary>
+            Creates a repository for the specified assembly and repository type.
+            </summary>
+            <param name="repositoryAssembly">The assembly to use to get the name of the repository.</param>
+            <param name="repositoryType">A <see cref="T:System.Type"/> that implements <see cref="T:log4net.Repository.ILoggerRepository"/>
+            and has a no arg constructor. An instance of this type will be created to act
+            as the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> created for the repository.</returns>
+            <remarks>
+            <para>
+            <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
+            </para>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be associated with the repository
+            specified such that a call to <see cref="M:log4net.Core.LoggerManager.GetRepository(System.Reflection.Assembly)"/> with the
+            same assembly specified will return the same repository instance.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.CreateRepository(System.Reflection.Assembly,System.Type)">
+            <summary>
+            Creates a repository for the specified assembly and repository type.
+            </summary>
+            <param name="repositoryAssembly">The assembly to use to get the name of the repository.</param>
+            <param name="repositoryType">A <see cref="T:System.Type"/> that implements <see cref="T:log4net.Repository.ILoggerRepository"/>
+            and has a no arg constructor. An instance of this type will be created to act
+            as the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> created for the repository.</returns>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be associated with the repository
+            specified such that a call to <see cref="M:log4net.Core.LoggerManager.GetRepository(System.Reflection.Assembly)"/> with the
+            same assembly specified will return the same repository instance.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.GetAllRepositories">
+            <summary>
+            Gets an array of all currently defined repositories.
+            </summary>
+            <returns>An array of all the known <see cref="T:log4net.Repository.ILoggerRepository"/> objects.</returns>
+            <remarks>
+            <para>
+            Gets an array of all currently defined repositories.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.GetVersionInfo">
+            <summary>
+            Internal method to get pertinent version info.
+            </summary>
+            <returns>A string of version info.</returns>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.OnDomainUnload(System.Object,System.EventArgs)">
+            <summary>
+            Called when the <see cref="E:System.AppDomain.DomainUnload"/> event fires
+            </summary>
+            <param name="sender">the <see cref="T:System.AppDomain"/> that is exiting</param>
+            <param name="e">null</param>
+            <remarks>
+            <para>
+            Called when the <see cref="E:System.AppDomain.DomainUnload"/> event fires.
+            </para>
+            <para>
+            When the event is triggered the log4net system is <see cref="M:log4net.Core.LoggerManager.Shutdown"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggerManager.OnProcessExit(System.Object,System.EventArgs)">
+            <summary>
+            Called when the <see cref="E:System.AppDomain.ProcessExit"/> event fires
+            </summary>
+            <param name="sender">the <see cref="T:System.AppDomain"/> that is exiting</param>
+            <param name="e">null</param>
+            <remarks>
+            <para>
+            Called when the <see cref="E:System.AppDomain.ProcessExit"/> event fires.
+            </para>
+            <para>
+            When the event is triggered the log4net system is <see cref="M:log4net.Core.LoggerManager.Shutdown"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggerManager.s_repositorySelector">
+            <summary>
+            Initialize the default repository selector
+            </summary>
+        </member>
+        <member name="P:log4net.Core.LoggerManager.RepositorySelector">
+            <summary>
+            Gets or sets the repository selector used by the <see cref="T:log4net.LogManager"/>.
+            </summary>
+            <value>
+            The repository selector used by the <see cref="T:log4net.LogManager"/>.
+            </value>
+            <remarks>
+            <para>
+            The repository selector (<see cref="T:log4net.Core.IRepositorySelector"/>) is used by 
+            the <see cref="T:log4net.LogManager"/> to create and select repositories 
+            (<see cref="T:log4net.Repository.ILoggerRepository"/>).
+            </para>
+            <para>
+            The caller to <see cref="T:log4net.LogManager"/> supplies either a string name 
+            or an assembly (if not supplied the assembly is inferred using 
+            <see cref="M:System.Reflection.Assembly.GetCallingAssembly"/>).
+            </para>
+            <para>
+            This context is used by the selector to lookup a specific repository.
+            </para>
+            <para>
+            For the full .NET Framework, the default repository is <c>DefaultRepositorySelector</c>;
+            for the .NET Compact Framework <c>CompactRepositorySelector</c> is the default
+            repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.LoggerWrapperImpl">
+            <summary>
+            Implementation of the <see cref="T:log4net.Core.ILoggerWrapper"/> interface.
+            </summary>
+            <remarks>
+            <para>
+            This class should be used as the base for all wrapper implementations.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Core.LoggerWrapperImpl.#ctor(log4net.Core.ILogger)">
+            <summary>
+            Constructs a new wrapper for the specified logger.
+            </summary>
+            <param name="logger">The logger to wrap.</param>
+            <remarks>
+            <para>
+            Constructs a new wrapper for the specified logger.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggerWrapperImpl.m_logger">
+            <summary>
+            The logger that this object is wrapping
+            </summary>
+        </member>
+        <member name="P:log4net.Core.LoggerWrapperImpl.Logger">
+            <summary>
+            Gets the implementation behind this wrapper object.
+            </summary>
+            <value>
+            The <see cref="T:log4net.Core.ILogger"/> object that this object is implementing.
+            </value>
+            <remarks>
+            <para>
+            The <c>Logger</c> object may not be the same object as this object 
+            because of logger decorators.
+            </para>
+            <para>
+            This gets the actual underlying objects that is used to process
+            the log events.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.LoggingEventData">
+            <summary>
+            Portable data structure used by <see cref="T:log4net.Core.LoggingEvent"/>
+            </summary>
+            <remarks>
+            <para>
+            Portable data structure used by <see cref="T:log4net.Core.LoggingEvent"/>
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Core.LoggingEventData.LoggerName">
+            <summary>
+            The logger name.
+            </summary>
+            <remarks>
+            <para>
+            The logger name.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggingEventData.Level">
+            <summary>
+            Level of logging event.
+            </summary>
+            <remarks>
+            <para>
+            Level of logging event. Level cannot be Serializable
+            because it is a flyweight.  Due to its special serialization it
+            cannot be declared final either.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggingEventData.Message">
+            <summary>
+            The application supplied message.
+            </summary>
+            <remarks>
+            <para>
+            The application supplied message of logging event.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggingEventData.ThreadName">
+            <summary>
+            The name of thread
+            </summary>
+            <remarks>
+            <para>
+            The name of thread in which this logging event was generated
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggingEventData.TimeStamp">
+            <summary>
+            The time the event was logged
+            </summary>
+            <remarks>
+            <para>
+            The TimeStamp is stored in the local time zone for this computer.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggingEventData.LocationInfo">
+            <summary>
+            Location information for the caller.
+            </summary>
+            <remarks>
+            <para>
+            Location information for the caller.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggingEventData.UserName">
+            <summary>
+            String representation of the user
+            </summary>
+            <remarks>
+            <para>
+            String representation of the user's windows name,
+            like DOMAIN\username
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggingEventData.Identity">
+            <summary>
+            String representation of the identity.
+            </summary>
+            <remarks>
+            <para>
+            String representation of the current thread's principal identity.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggingEventData.ExceptionString">
+            <summary>
+            The string representation of the exception
+            </summary>
+            <remarks>
+            <para>
+            The string representation of the exception
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggingEventData.Domain">
+            <summary>
+            String representation of the AppDomain.
+            </summary>
+            <remarks>
+            <para>
+            String representation of the AppDomain.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggingEventData.Properties">
+            <summary>
+            Additional event specific properties
+            </summary>
+            <remarks>
+            <para>
+            A logger or an appender may attach additional
+            properties to specific events. These properties
+            have a string key and an object value.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.FixFlags">
+            <summary>
+            Flags passed to the <see cref="P:log4net.Core.LoggingEvent.Fix"/> property
+            </summary>
+            <remarks>
+            <para>
+            Flags passed to the <see cref="P:log4net.Core.LoggingEvent.Fix"/> property
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Core.FixFlags.Mdc">
+            <summary>
+            Fix the MDC
+            </summary>
+        </member>
+        <member name="F:log4net.Core.FixFlags.Ndc">
+            <summary>
+            Fix the NDC
+            </summary>
+        </member>
+        <member name="F:log4net.Core.FixFlags.Message">
+            <summary>
+            Fix the rendered message
+            </summary>
+        </member>
+        <member name="F:log4net.Core.FixFlags.ThreadName">
+            <summary>
+            Fix the thread name
+            </summary>
+        </member>
+        <member name="F:log4net.Core.FixFlags.LocationInfo">
+            <summary>
+            Fix the callers location information
+            </summary>
+            <remarks>
+            CAUTION: Very slow to generate
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.FixFlags.UserName">
+            <summary>
+            Fix the callers windows user name
+            </summary>
+            <remarks>
+            CAUTION: Slow to generate
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.FixFlags.Domain">
+            <summary>
+            Fix the domain friendly name
+            </summary>
+        </member>
+        <member name="F:log4net.Core.FixFlags.Identity">
+            <summary>
+            Fix the callers principal name
+            </summary>
+            <remarks>
+            CAUTION: May be slow to generate
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.FixFlags.Exception">
+            <summary>
+            Fix the exception text
+            </summary>
+        </member>
+        <member name="F:log4net.Core.FixFlags.Properties">
+            <summary>
+            Fix the event properties
+            </summary>
+        </member>
+        <member name="F:log4net.Core.FixFlags.None">
+            <summary>
+            No fields fixed
+            </summary>
+        </member>
+        <member name="F:log4net.Core.FixFlags.All">
+            <summary>
+            All fields fixed
+            </summary>
+        </member>
+        <member name="F:log4net.Core.FixFlags.Partial">
+            <summary>
+            Partial fields fixed
+            </summary>
+            <remarks>
+            <para>
+            This set of partial fields gives good performance. The following fields are fixed:
+            </para>
+            <list type="bullet">
+            <item><description><see cref="F:log4net.Core.FixFlags.Message"/></description></item>
+            <item><description><see cref="F:log4net.Core.FixFlags.ThreadName"/></description></item>
+            <item><description><see cref="F:log4net.Core.FixFlags.Exception"/></description></item>
+            <item><description><see cref="F:log4net.Core.FixFlags.Domain"/></description></item>
+            <item><description><see cref="F:log4net.Core.FixFlags.Properties"/></description></item>
+            </list>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.LoggingEvent">
+            <summary>
+            The internal representation of logging events. 
+            </summary>
+            <remarks>
+            <para>
+            When an affirmative decision is made to log then a 
+            <see cref="T:log4net.Core.LoggingEvent"/> instance is created. This instance 
+            is passed around to the different log4net components.
+            </para>
+            <para>
+            This class is of concern to those wishing to extend log4net.
+            </para>
+            <para>
+            Some of the values in instances of <see cref="T:log4net.Core.LoggingEvent"/>
+            are considered volatile, that is the values are correct at the
+            time the event is delivered to appenders, but will not be consistent
+            at any time afterwards. If an event is to be stored and then processed
+            at a later time these volatile values must be fixed by calling
+            <see cref="M:log4net.Core.LoggingEvent.FixVolatileData"/>. There is a performance penalty
+            for incurred by calling <see cref="M:log4net.Core.LoggingEvent.FixVolatileData"/> but it
+            is essential to maintaining data consistency.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+            <author>Douglas de la Torre</author>
+            <author>Daniel Cazzulino</author>
+        </member>
+        <member name="F:log4net.Core.LoggingEvent.HostNameProperty">
+            <summary>
+            The key into the Properties map for the host name value.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.LoggingEvent.IdentityProperty">
+            <summary>
+            The key into the Properties map for the thread identity value.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.LoggingEvent.UserNameProperty">
+            <summary>
+            The key into the Properties map for the user name value.
+            </summary>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.#ctor(System.Type,log4net.Repository.ILoggerRepository,System.String,log4net.Core.Level,System.Object,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Core.LoggingEvent"/> class
+            from the supplied parameters.
+            </summary>
+            <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
+            the stack boundary into the logging system for this call.</param>
+            <param name="repository">The repository this event is logged in.</param>
+            <param name="loggerName">The name of the logger of this event.</param>
+            <param name="level">The level of this event.</param>
+            <param name="message">The message of this event.</param>
+            <param name="exception">The exception for this event.</param>
+            <remarks>
+            <para>
+            Except <see cref="P:log4net.Core.LoggingEvent.TimeStamp"/>, <see cref="P:log4net.Core.LoggingEvent.Level"/> and <see cref="P:log4net.Core.LoggingEvent.LoggerName"/>, 
+            all fields of <c>LoggingEvent</c> are filled when actually needed. Call
+            <see cref="M:log4net.Core.LoggingEvent.FixVolatileData"/> to cache all data locally
+            to prevent inconsistencies.
+            </para>
+            <para>This method is called by the log4net framework
+            to create a logging event.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.#ctor(System.Type,log4net.Repository.ILoggerRepository,log4net.Core.LoggingEventData,log4net.Core.FixFlags)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Core.LoggingEvent"/> class 
+            using specific data.
+            </summary>
+            <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
+            the stack boundary into the logging system for this call.</param>
+            <param name="repository">The repository this event is logged in.</param>
+            <param name="data">Data used to initialize the logging event.</param>
+            <param name="fixedData">The fields in the <paranref name="data"/> struct that have already been fixed.</param>
+            <remarks>
+            <para>
+            This constructor is provided to allow a <see cref="T:log4net.Core.LoggingEvent"/>
+            to be created independently of the log4net framework. This can
+            be useful if you require a custom serialization scheme.
+            </para>
+            <para>
+            Use the <see cref="M:log4net.Core.LoggingEvent.GetLoggingEventData(log4net.Core.FixFlags)"/> method to obtain an 
+            instance of the <see cref="T:log4net.Core.LoggingEventData"/> class.
+            </para>
+            <para>
+            The <paramref name="fixedData"/> parameter should be used to specify which fields in the
+            <paramref name="data"/> struct have been preset. Fields not specified in the <paramref name="fixedData"/>
+            will be captured from the environment if requested or fixed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.#ctor(System.Type,log4net.Repository.ILoggerRepository,log4net.Core.LoggingEventData)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Core.LoggingEvent"/> class 
+            using specific data.
+            </summary>
+            <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
+            the stack boundary into the logging system for this call.</param>
+            <param name="repository">The repository this event is logged in.</param>
+            <param name="data">Data used to initialize the logging event.</param>
+            <remarks>
+            <para>
+            This constructor is provided to allow a <see cref="T:log4net.Core.LoggingEvent"/>
+            to be created independently of the log4net framework. This can
+            be useful if you require a custom serialization scheme.
+            </para>
+            <para>
+            Use the <see cref="M:log4net.Core.LoggingEvent.GetLoggingEventData(log4net.Core.FixFlags)"/> method to obtain an 
+            instance of the <see cref="T:log4net.Core.LoggingEventData"/> class.
+            </para>
+            <para>
+            This constructor sets this objects <see cref="P:log4net.Core.LoggingEvent.Fix"/> flags to <see cref="F:log4net.Core.FixFlags.All"/>,
+            this assumes that all the data relating to this event is passed in via the <paramref name="data"/>
+            parameter and no other data should be captured from the environment.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.#ctor(log4net.Core.LoggingEventData)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Core.LoggingEvent"/> class 
+            using specific data.
+            </summary>
+            <param name="data">Data used to initialize the logging event.</param>
+            <remarks>
+            <para>
+            This constructor is provided to allow a <see cref="T:log4net.Core.LoggingEvent"/>
+            to be created independently of the log4net framework. This can
+            be useful if you require a custom serialization scheme.
+            </para>
+            <para>
+            Use the <see cref="M:log4net.Core.LoggingEvent.GetLoggingEventData(log4net.Core.FixFlags)"/> method to obtain an 
+            instance of the <see cref="T:log4net.Core.LoggingEventData"/> class.
+            </para>
+            <para>
+            This constructor sets this objects <see cref="P:log4net.Core.LoggingEvent.Fix"/> flags to <see cref="F:log4net.Core.FixFlags.All"/>,
+            this assumes that all the data relating to this event is passed in via the <paramref name="data"/>
+            parameter and no other data should be captured from the environment.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serialization constructor
+            </summary>
+            <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> that holds the serialized object data.</param>
+            <param name="context">The <see cref="T:System.Runtime.Serialization.StreamingContext"/> that contains contextual information about the source or destination.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Core.LoggingEvent"/> class 
+            with serialized data.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.EnsureRepository(log4net.Repository.ILoggerRepository)">
+            <summary>
+            Ensure that the repository is set.
+            </summary>
+            <param name="repository">the value for the repository</param>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.WriteRenderedMessage(System.IO.TextWriter)">
+            <summary>
+            Write the rendered message to a TextWriter
+            </summary>
+            <param name="writer">the writer to write the message to</param>
+            <remarks>
+            <para>
+            Unlike the <see cref="P:log4net.Core.LoggingEvent.RenderedMessage"/> property this method
+            does store the message data in the internal cache. Therefore 
+            if called only once this method should be faster than the
+            <see cref="P:log4net.Core.LoggingEvent.RenderedMessage"/> property, however if the message is
+            to be accessed multiple times then the property will be more efficient.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serializes this object into the <see cref="T:System.Runtime.Serialization.SerializationInfo"/> provided.
+            </summary>
+            <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> to populate with data.</param>
+            <param name="context">The destination for this serialization.</param>
+            <remarks>
+            <para>
+            The data in this event must be fixed before it can be serialized.
+            </para>
+            <para>
+            The <see cref="M:log4net.Core.LoggingEvent.FixVolatileData"/> method must be called during the
+            <see cref="M:log4net.Appender.IAppender.DoAppend(log4net.Core.LoggingEvent)"/> method call if this event 
+            is to be used outside that method.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.GetLoggingEventData">
+            <summary>
+            Gets the portable data for this <see cref="T:log4net.Core.LoggingEvent"/>.
+            </summary>
+            <returns>The <see cref="T:log4net.Core.LoggingEventData"/> for this event.</returns>
+            <remarks>
+            <para>
+            A new <see cref="T:log4net.Core.LoggingEvent"/> can be constructed using a
+            <see cref="T:log4net.Core.LoggingEventData"/> instance.
+            </para>
+            <para>
+            Does a <see cref="F:log4net.Core.FixFlags.Partial"/> fix of the data
+            in the logging event before returning the event data.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.GetLoggingEventData(log4net.Core.FixFlags)">
+            <summary>
+            Gets the portable data for this <see cref="T:log4net.Core.LoggingEvent"/>.
+            </summary>
+            <param name="fixFlags">The set of data to ensure is fixed in the LoggingEventData</param>
+            <returns>The <see cref="T:log4net.Core.LoggingEventData"/> for this event.</returns>
+            <remarks>
+            <para>
+            A new <see cref="T:log4net.Core.LoggingEvent"/> can be constructed using a
+            <see cref="T:log4net.Core.LoggingEventData"/> instance.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.GetExceptionStrRep">
+            <summary>
+            Returns this event's exception's rendered using the 
+            <see cref="P:log4net.Repository.ILoggerRepository.RendererMap"/>.
+            </summary>
+            <returns>
+            This event's exception's rendered using the <see cref="P:log4net.Repository.ILoggerRepository.RendererMap"/>.
+            </returns>
+            <remarks>
+            <para>
+            <b>Obsolete. Use <see cref="M:log4net.Core.LoggingEvent.GetExceptionString"/> instead.</b>
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.GetExceptionString">
+            <summary>
+            Returns this event's exception's rendered using the 
+            <see cref="P:log4net.Repository.ILoggerRepository.RendererMap"/>.
+            </summary>
+            <returns>
+            This event's exception's rendered using the <see cref="P:log4net.Repository.ILoggerRepository.RendererMap"/>.
+            </returns>
+            <remarks>
+            <para>
+            Returns this event's exception's rendered using the 
+            <see cref="P:log4net.Repository.ILoggerRepository.RendererMap"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.FixVolatileData">
+            <summary>
+            Fix instance fields that hold volatile data.
+            </summary>
+            <remarks>
+            <para>
+            Some of the values in instances of <see cref="T:log4net.Core.LoggingEvent"/>
+            are considered volatile, that is the values are correct at the
+            time the event is delivered to appenders, but will not be consistent
+            at any time afterwards. If an event is to be stored and then processed
+            at a later time these volatile values must be fixed by calling
+            <see cref="M:log4net.Core.LoggingEvent.FixVolatileData"/>. There is a performance penalty
+            incurred by calling <see cref="M:log4net.Core.LoggingEvent.FixVolatileData"/> but it
+            is essential to maintaining data consistency.
+            </para>
+            <para>
+            Calling <see cref="M:log4net.Core.LoggingEvent.FixVolatileData"/> is equivalent to
+            calling <see cref="M:log4net.Core.LoggingEvent.FixVolatileData(System.Boolean)"/> passing the parameter
+            <c>false</c>.
+            </para>
+            <para>
+            See <see cref="M:log4net.Core.LoggingEvent.FixVolatileData(System.Boolean)"/> for more
+            information.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.FixVolatileData(System.Boolean)">
+            <summary>
+            Fixes instance fields that hold volatile data.
+            </summary>
+            <param name="fastButLoose">Set to <c>true</c> to not fix data that takes a long time to fix.</param>
+            <remarks>
+            <para>
+            Some of the values in instances of <see cref="T:log4net.Core.LoggingEvent"/>
+            are considered volatile, that is the values are correct at the
+            time the event is delivered to appenders, but will not be consistent
+            at any time afterwards. If an event is to be stored and then processed
+            at a later time these volatile values must be fixed by calling
+            <see cref="M:log4net.Core.LoggingEvent.FixVolatileData"/>. There is a performance penalty
+            for incurred by calling <see cref="M:log4net.Core.LoggingEvent.FixVolatileData"/> but it
+            is essential to maintaining data consistency.
+            </para>
+            <para>
+            The <paramref name="fastButLoose"/> param controls the data that
+            is fixed. Some of the data that can be fixed takes a long time to 
+            generate, therefore if you do not require those settings to be fixed
+            they can be ignored by setting the <paramref name="fastButLoose"/> param
+            to <c>true</c>. This setting will ignore the <see cref="P:log4net.Core.LoggingEvent.LocationInformation"/>
+            and <see cref="P:log4net.Core.LoggingEvent.UserName"/> settings.
+            </para>
+            <para>
+            Set <paramref name="fastButLoose"/> to <c>false</c> to ensure that all 
+            settings are fixed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.FixVolatileData(log4net.Core.FixFlags)">
+            <summary>
+            Fix the fields specified by the <see cref="T:log4net.Core.FixFlags"/> parameter
+            </summary>
+            <param name="flags">the fields to fix</param>
+            <remarks>
+            <para>
+            Only fields specified in the <paramref name="flags"/> will be fixed.
+            Fields will not be fixed if they have previously been fixed.
+            It is not possible to 'unfix' a field.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.LookupProperty(System.String)">
+            <summary>
+            Lookup a composite property in this event
+            </summary>
+            <param name="key">the key for the property to lookup</param>
+            <returns>the value for the property</returns>
+            <remarks>
+            <para>
+            This event has composite properties that combine together properties from
+            several different contexts in the following order:
+            <list type="definition">
+            	<item>
+            		<term>this events properties</term>
+            		<description>
+            		This event has <see cref="P:log4net.Core.LoggingEvent.Properties"/> that can be set. These 
+            		properties are specific to this event only.
+            		</description>
+            	</item>
+            	<item>
+            		<term>the thread properties</term>
+            		<description>
+            		The <see cref="P:log4net.ThreadContext.Properties"/> that are set on the current
+            		thread. These properties are shared by all events logged on this thread.
+            		</description>
+            	</item>
+            	<item>
+            		<term>the global properties</term>
+            		<description>
+            		The <see cref="P:log4net.GlobalContext.Properties"/> that are set globally. These 
+            		properties are shared by all the threads in the AppDomain.
+            		</description>
+            	</item>
+            </list>
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LoggingEvent.GetProperties">
+            <summary>
+            Get all the composite properties in this event
+            </summary>
+            <returns>the <see cref="T:log4net.Util.PropertiesDictionary"/> containing all the properties</returns>
+            <remarks>
+            <para>
+            See <see cref="M:log4net.Core.LoggingEvent.LookupProperty(System.String)"/> for details of the composite properties 
+            stored by the event.
+            </para>
+            <para>
+            This method returns a single <see cref="T:log4net.Util.PropertiesDictionary"/> containing all the
+            properties defined for this event.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggingEvent.m_data">
+            <summary>
+            The internal logging event data.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.LoggingEvent.m_compositeProperties">
+            <summary>
+            The internal logging event data.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.LoggingEvent.m_eventProperties">
+            <summary>
+            The internal logging event data.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.LoggingEvent.m_callerStackBoundaryDeclaringType">
+            <summary>
+            The fully qualified Type of the calling 
+            logger class in the stack frame (i.e. the declaring type of the method).
+            </summary>
+        </member>
+        <member name="F:log4net.Core.LoggingEvent.m_message">
+            <summary>
+            The application supplied message of logging event.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.LoggingEvent.m_thrownException">
+            <summary>
+            The exception that was thrown.
+            </summary>
+            <remarks>
+            This is not serialized. The string representation
+            is serialized instead.
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggingEvent.m_repository">
+            <summary>
+            The repository that generated the logging event
+            </summary>
+            <remarks>
+            This is not serialized.
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggingEvent.m_fixFlags">
+            <summary>
+            The fix state for this event
+            </summary>
+            <remarks>
+            These flags indicate which fields have been fixed.
+            Not serialized.
+            </remarks>
+        </member>
+        <member name="F:log4net.Core.LoggingEvent.m_cacheUpdatable">
+            <summary>
+            Indicated that the internal cache is updateable (ie not fixed)
+            </summary>
+            <remarks>
+            This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler
+            changes in the caching strategy.
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.StartTime">
+            <summary>
+            Gets the time when the current process started.
+            </summary>
+            <value>
+            This is the time when this process started.
+            </value>
+            <remarks>
+            <para>
+            The TimeStamp is stored in the local time zone for this computer.
+            </para>
+            <para>
+            Tries to get the start time for the current process.
+            Failing that it returns the time of the first call to
+            this property.
+            </para>
+            <para>
+            Note that AppDomains may be loaded and unloaded within the
+            same process without the process terminating and therefore
+            without the process start time being reset.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.Level">
+            <summary>
+            Gets the <see cref="P:log4net.Core.LoggingEvent.Level"/> of the logging event.
+            </summary>
+            <value>
+            The <see cref="P:log4net.Core.LoggingEvent.Level"/> of the logging event.
+            </value>
+            <remarks>
+            <para>
+            Gets the <see cref="P:log4net.Core.LoggingEvent.Level"/> of the logging event.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.TimeStamp">
+            <summary>
+            Gets the time of the logging event.
+            </summary>
+            <value>
+            The time of the logging event.
+            </value>
+            <remarks>
+            <para>
+            The TimeStamp is stored in the local time zone for this computer.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.LoggerName">
+            <summary>
+            Gets the name of the logger that logged the event.
+            </summary>
+            <value>
+            The name of the logger that logged the event.
+            </value>
+            <remarks>
+            <para>
+            Gets the name of the logger that logged the event.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.LocationInformation">
+            <summary>
+            Gets the location information for this logging event.
+            </summary>
+            <value>
+            The location information for this logging event.
+            </value>
+            <remarks>
+            <para>
+            The collected information is cached for future use.
+            </para>
+            <para>
+            See the <see cref="T:log4net.Core.LocationInfo"/> class for more information on
+            supported frameworks and the different behavior in Debug and
+            Release builds.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.MessageObject">
+            <summary>
+            Gets the message object used to initialize this event.
+            </summary>
+            <value>
+            The message object used to initialize this event.
+            </value>
+            <remarks>
+            <para>
+            Gets the message object used to initialize this event.
+            Note that this event may not have a valid message object.
+            If the event is serialized the message object will not 
+            be transferred. To get the text of the message the
+            <see cref="P:log4net.Core.LoggingEvent.RenderedMessage"/> property must be used 
+            not this property.
+            </para>
+            <para>
+            If there is no defined message object for this event then
+            null will be returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.ExceptionObject">
+            <summary>
+            Gets the exception object used to initialize this event.
+            </summary>
+            <value>
+            The exception object used to initialize this event.
+            </value>
+            <remarks>
+            <para>
+            Gets the exception object used to initialize this event.
+            Note that this event may not have a valid exception object.
+            If the event is serialized the exception object will not 
+            be transferred. To get the text of the exception the
+            <see cref="M:log4net.Core.LoggingEvent.GetExceptionString"/> method must be used 
+            not this property.
+            </para>
+            <para>
+            If there is no defined exception object for this event then
+            null will be returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.Repository">
+            <summary>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> that this event was created in.
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> that this event was created in.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.RenderedMessage">
+            <summary>
+            Gets the message, rendered through the <see cref="P:log4net.Repository.ILoggerRepository.RendererMap"/>.
+            </summary>
+            <value>
+            The message rendered through the <see cref="P:log4net.Repository.ILoggerRepository.RendererMap"/>.
+            </value>
+            <remarks>
+            <para>
+            The collected information is cached for future use.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.ThreadName">
+            <summary>
+            Gets the name of the current thread.  
+            </summary>
+            <value>
+            The name of the current thread, or the thread ID when 
+            the name is not available.
+            </value>
+            <remarks>
+            <para>
+            The collected information is cached for future use.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.UserName">
+            <summary>
+            Gets the name of the current user.
+            </summary>
+            <value>
+            The name of the current user, or <c>NOT AVAILABLE</c> when the 
+            underlying runtime has no support for retrieving the name of the 
+            current user.
+            </value>
+            <remarks>
+            <para>
+            Calls <c>WindowsIdentity.GetCurrent().Name</c> to get the name of
+            the current windows user.
+            </para>
+            <para>
+            To improve performance, we could cache the string representation of 
+            the name, and reuse that as long as the identity stayed constant.  
+            Once the identity changed, we would need to re-assign and re-render 
+            the string.
+            </para>
+            <para>
+            However, the <c>WindowsIdentity.GetCurrent()</c> call seems to 
+            return different objects every time, so the current implementation 
+            doesn't do this type of caching.
+            </para>
+            <para>
+            Timing for these operations:
+            </para>
+            <list type="table">
+              <listheader>
+                <term>Method</term>
+                <description>Results</description>
+              </listheader>
+              <item>
+                <term><c>WindowsIdentity.GetCurrent()</c></term>
+                <description>10000 loops, 00:00:00.2031250 seconds</description>
+              </item>
+              <item>
+                <term><c>WindowsIdentity.GetCurrent().Name</c></term>
+                <description>10000 loops, 00:00:08.0468750 seconds</description>
+              </item>
+            </list>
+            <para>
+            This means we could speed things up almost 40 times by caching the 
+            value of the <c>WindowsIdentity.GetCurrent().Name</c> property, since 
+            this takes (8.04-0.20) = 7.84375 seconds.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.Identity">
+            <summary>
+            Gets the identity of the current thread principal.
+            </summary>
+            <value>
+            The string name of the identity of the current thread principal.
+            </value>
+            <remarks>
+            <para>
+            Calls <c>System.Threading.Thread.CurrentPrincipal.Identity.Name</c> to get
+            the name of the current thread principal.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.Domain">
+            <summary>
+            Gets the AppDomain friendly name.
+            </summary>
+            <value>
+            The AppDomain friendly name.
+            </value>
+            <remarks>
+            <para>
+            Gets the AppDomain friendly name.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.Properties">
+            <summary>
+            Additional event specific properties.
+            </summary>
+            <value>
+            Additional event specific properties.
+            </value>
+            <remarks>
+            <para>
+            A logger or an appender may attach additional
+            properties to specific events. These properties
+            have a string key and an object value.
+            </para>
+            <para>
+            This property is for events that have been added directly to
+            this event. The aggregate properties (which include these
+            event properties) can be retrieved using <see cref="M:log4net.Core.LoggingEvent.LookupProperty(System.String)"/>
+            and <see cref="M:log4net.Core.LoggingEvent.GetProperties"/>.
+            </para>
+            <para>
+            Once the properties have been fixed <see cref="P:log4net.Core.LoggingEvent.Fix"/> this property
+            returns the combined cached properties. This ensures that updates to
+            this property are always reflected in the underlying storage. When
+            returning the combined properties there may be more keys in the
+            Dictionary than expected.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LoggingEvent.Fix">
+            <summary>
+            The fixed fields in this event
+            </summary>
+            <value>
+            The set of fields that are fixed in this event
+            </value>
+            <remarks>
+            <para>
+            Fields will not be fixed if they have previously been fixed.
+            It is not possible to 'unfix' a field.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.LogImpl">
+            <summary>
+            Implementation of <see cref="T:log4net.ILog"/> wrapper interface.
+            </summary>
+            <remarks>
+            <para>
+            This implementation of the <see cref="T:log4net.ILog"/> interface
+            forwards to the <see cref="T:log4net.Core.ILogger"/> held by the base class.
+            </para>
+            <para>
+            This logger has methods to allow the caller to log at the following
+            levels:
+            </para>
+            <list type="definition">
+              <item>
+                <term>DEBUG</term>
+                <description>
+                The <see cref="M:log4net.Core.LogImpl.Debug(System.Object)"/> and <see cref="M:log4net.Core.LogImpl.DebugFormat(System.String,System.Object[])"/> methods log messages
+                at the <c>DEBUG</c> level. That is the level with that name defined in the
+                repositories <see cref="P:log4net.Repository.ILoggerRepository.LevelMap"/>. The default value
+                for this level is <see cref="F:log4net.Core.Level.Debug"/>. The <see cref="P:log4net.Core.LogImpl.IsDebugEnabled"/>
+                property tests if this level is enabled for logging.
+                </description>
+              </item>
+              <item>
+                <term>INFO</term>
+                <description>
+                The <see cref="M:log4net.Core.LogImpl.Info(System.Object)"/> and <see cref="M:log4net.Core.LogImpl.InfoFormat(System.String,System.Object[])"/> methods log messages
+                at the <c>INFO</c> level. That is the level with that name defined in the
+                repositories <see cref="P:log4net.Repository.ILoggerRepository.LevelMap"/>. The default value
+                for this level is <see cref="F:log4net.Core.Level.Info"/>. The <see cref="P:log4net.Core.LogImpl.IsInfoEnabled"/>
+                property tests if this level is enabled for logging.
+                </description>
+              </item>
+              <item>
+                <term>WARN</term>
+                <description>
+                The <see cref="M:log4net.Core.LogImpl.Warn(System.Object)"/> and <see cref="M:log4net.Core.LogImpl.WarnFormat(System.String,System.Object[])"/> methods log messages
+                at the <c>WARN</c> level. That is the level with that name defined in the
+                repositories <see cref="P:log4net.Repository.ILoggerRepository.LevelMap"/>. The default value
+                for this level is <see cref="F:log4net.Core.Level.Warn"/>. The <see cref="P:log4net.Core.LogImpl.IsWarnEnabled"/>
+                property tests if this level is enabled for logging.
+                </description>
+              </item>
+              <item>
+                <term>ERROR</term>
+                <description>
+                The <see cref="M:log4net.Core.LogImpl.Error(System.Object)"/> and <see cref="M:log4net.Core.LogImpl.ErrorFormat(System.String,System.Object[])"/> methods log messages
+                at the <c>ERROR</c> level. That is the level with that name defined in the
+                repositories <see cref="P:log4net.Repository.ILoggerRepository.LevelMap"/>. The default value
+                for this level is <see cref="F:log4net.Core.Level.Error"/>. The <see cref="P:log4net.Core.LogImpl.IsErrorEnabled"/>
+                property tests if this level is enabled for logging.
+                </description>
+              </item>
+              <item>
+                <term>FATAL</term>
+                <description>
+                The <see cref="M:log4net.Core.LogImpl.Fatal(System.Object)"/> and <see cref="M:log4net.Core.LogImpl.FatalFormat(System.String,System.Object[])"/> methods log messages
+                at the <c>FATAL</c> level. That is the level with that name defined in the
+                repositories <see cref="P:log4net.Repository.ILoggerRepository.LevelMap"/>. The default value
+                for this level is <see cref="F:log4net.Core.Level.Fatal"/>. The <see cref="P:log4net.Core.LogImpl.IsFatalEnabled"/>
+                property tests if this level is enabled for logging.
+                </description>
+              </item>
+            </list>
+            <para>
+            The values for these levels and their semantic meanings can be changed by 
+            configuring the <see cref="P:log4net.Repository.ILoggerRepository.LevelMap"/> for the repository.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.ILog">
+            <summary>
+            The ILog interface is use by application to log messages into
+            the log4net framework.
+            </summary>
+            <remarks>
+            <para>
+            Use the <see cref="T:log4net.LogManager"/> to obtain logger instances
+            that implement this interface. The <see cref="M:log4net.LogManager.GetLogger(System.Reflection.Assembly,System.Type)"/>
+            static method is used to get logger instances.
+            </para>
+            <para>
+            This class contains methods for logging at different levels and also
+            has properties for determining if those logging levels are
+            enabled in the current configuration.
+            </para>
+            <para>
+            This interface can be implemented in different ways. This documentation
+            specifies reasonable behavior that a caller can expect from the actual
+            implementation, however different implementations reserve the right to
+            do things differently.
+            </para>
+            </remarks>
+            <example>Simple example of logging messages
+            <code lang="C#">
+            ILog log = LogManager.GetLogger("application-log");
+            
+            log.Info("Application Start");
+            log.Debug("This is a debug message");
+            
+            if (log.IsDebugEnabled)
+            {
+            	log.Debug("This is another debug message");
+            }
+            </code>
+            </example>
+            <seealso cref="T:log4net.LogManager"/>
+            <seealso cref="M:log4net.LogManager.GetLogger(System.Reflection.Assembly,System.Type)"/>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.ILog.Debug(System.Object)">
+            <overloads>Log a message object with the <see cref="F:log4net.Core.Level.Debug"/> level.</overloads>
+            <summary>
+            Log a message object with the <see cref="F:log4net.Core.Level.Debug"/> level.
+            </summary>
+            <param name="message">The message object to log.</param>
+            <remarks>
+            <para>
+            This method first checks if this logger is <c>DEBUG</c>
+            enabled by comparing the level of this logger with the 
+            <see cref="F:log4net.Core.Level.Debug"/> level. If this logger is
+            <c>DEBUG</c> enabled, then it converts the message object
+            (passed as parameter) to a string by invoking the appropriate
+            <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+            proceeds to call all the registered appenders in this logger 
+            and also higher in the hierarchy depending on the value of 
+            the additivity flag.
+            </para>
+            <para><b>WARNING</b> Note that passing an <see cref="T:System.Exception"/> 
+            to this method will print the name of the <see cref="T:System.Exception"/> 
+            but no stack trace. To print a stack trace use the 
+            <see cref="M:log4net.ILog.Debug(System.Object,System.Exception)"/> form instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Debug(System.Object,System.Exception)"/>
+            <seealso cref="P:log4net.ILog.IsDebugEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.Debug(System.Object,System.Exception)">
+            <summary>
+            Log a message object with the <see cref="F:log4net.Core.Level.Debug"/> level including
+            the stack trace of the <see cref="T:System.Exception"/> passed
+            as a parameter.
+            </summary>
+            <param name="message">The message object to log.</param>
+            <param name="exception">The exception to log, including its stack trace.</param>
+            <remarks>
+            <para>
+            See the <see cref="M:log4net.ILog.Debug(System.Object)"/> form for more detailed information.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Debug(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsDebugEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.DebugFormat(System.String,System.Object[])">
+            <overloads>Log a formatted string with the <see cref="F:log4net.Core.Level.Debug"/> level.</overloads>
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Debug"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Debug(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Debug(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsDebugEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.DebugFormat(System.String,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Debug"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Debug(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Debug(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsDebugEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.DebugFormat(System.String,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Debug"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Debug(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Debug(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsDebugEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.DebugFormat(System.String,System.Object,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Debug"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <param name="arg2">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Debug(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Debug(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsDebugEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Debug"/> level.
+            </summary>
+            <param name="provider">An <see cref="T:System.IFormatProvider"/> that supplies culture-specific formatting information</param>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Debug(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Debug(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsDebugEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.Info(System.Object)">
+            <overloads>Log a message object with the <see cref="F:log4net.Core.Level.Info"/> level.</overloads>
+            <summary>
+            Logs a message object with the <see cref="F:log4net.Core.Level.Info"/> level.
+            </summary>
+            <remarks>
+            <para>
+            This method first checks if this logger is <c>INFO</c>
+            enabled by comparing the level of this logger with the 
+            <see cref="F:log4net.Core.Level.Info"/> level. If this logger is
+            <c>INFO</c> enabled, then it converts the message object
+            (passed as parameter) to a string by invoking the appropriate
+            <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+            proceeds to call all the registered appenders in this logger 
+            and also higher in the hierarchy depending on the value of the 
+            additivity flag.
+            </para>
+            <para><b>WARNING</b> Note that passing an <see cref="T:System.Exception"/> 
+            to this method will print the name of the <see cref="T:System.Exception"/> 
+            but no stack trace. To print a stack trace use the 
+            <see cref="M:log4net.ILog.Info(System.Object,System.Exception)"/> form instead.
+            </para>
+            </remarks>
+            <param name="message">The message object to log.</param>
+            <seealso cref="M:log4net.ILog.Info(System.Object,System.Exception)"/>
+            <seealso cref="P:log4net.ILog.IsInfoEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.Info(System.Object,System.Exception)">
+            <summary>
+            Logs a message object with the <c>INFO</c> level including
+            the stack trace of the <see cref="T:System.Exception"/> passed
+            as a parameter.
+            </summary>
+            <param name="message">The message object to log.</param>
+            <param name="exception">The exception to log, including its stack trace.</param>
+            <remarks>
+            <para>
+            See the <see cref="M:log4net.ILog.Info(System.Object)"/> form for more detailed information.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Info(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsInfoEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.InfoFormat(System.String,System.Object[])">
+            <overloads>Log a formatted message string with the <see cref="F:log4net.Core.Level.Info"/> level.</overloads>
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Info"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Info(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Info(System.Object,System.Exception)"/>
+            <seealso cref="P:log4net.ILog.IsInfoEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.InfoFormat(System.String,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Info"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Info(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Info(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsInfoEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.InfoFormat(System.String,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Info"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Info(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Info(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsInfoEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.InfoFormat(System.String,System.Object,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Info"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <param name="arg2">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Info(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Info(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsInfoEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Info"/> level.
+            </summary>
+            <param name="provider">An <see cref="T:System.IFormatProvider"/> that supplies culture-specific formatting information</param>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Info(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Info(System.Object,System.Exception)"/>
+            <seealso cref="P:log4net.ILog.IsInfoEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.Warn(System.Object)">
+            <overloads>Log a message object with the <see cref="F:log4net.Core.Level.Warn"/> level.</overloads>
+            <summary>
+            Log a message object with the <see cref="F:log4net.Core.Level.Warn"/> level.
+            </summary>
+            <remarks>
+            <para>
+            This method first checks if this logger is <c>WARN</c>
+            enabled by comparing the level of this logger with the 
+            <see cref="F:log4net.Core.Level.Warn"/> level. If this logger is
+            <c>WARN</c> enabled, then it converts the message object
+            (passed as parameter) to a string by invoking the appropriate
+            <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+            proceeds to call all the registered appenders in this logger 
+            and also higher in the hierarchy depending on the value of the 
+            additivity flag.
+            </para>
+            <para><b>WARNING</b> Note that passing an <see cref="T:System.Exception"/> 
+            to this method will print the name of the <see cref="T:System.Exception"/> 
+            but no stack trace. To print a stack trace use the 
+            <see cref="M:log4net.ILog.Warn(System.Object,System.Exception)"/> form instead.
+            </para>
+            </remarks>
+            <param name="message">The message object to log.</param>
+            <seealso cref="M:log4net.ILog.Warn(System.Object,System.Exception)"/>
+            <seealso cref="P:log4net.ILog.IsWarnEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.Warn(System.Object,System.Exception)">
+            <summary>
+            Log a message object with the <see cref="F:log4net.Core.Level.Warn"/> level including
+            the stack trace of the <see cref="T:System.Exception"/> passed
+            as a parameter.
+            </summary>
+            <param name="message">The message object to log.</param>
+            <param name="exception">The exception to log, including its stack trace.</param>
+            <remarks>
+            <para>
+            See the <see cref="M:log4net.ILog.Warn(System.Object)"/> form for more detailed information.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Warn(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsWarnEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.WarnFormat(System.String,System.Object[])">
+            <overloads>Log a formatted message string with the <see cref="F:log4net.Core.Level.Warn"/> level.</overloads>
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Warn"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Warn(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Warn(System.Object,System.Exception)"/>
+            <seealso cref="P:log4net.ILog.IsWarnEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.WarnFormat(System.String,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Warn"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Warn(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Warn(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsWarnEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.WarnFormat(System.String,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Warn"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Warn(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Warn(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsWarnEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.WarnFormat(System.String,System.Object,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Warn"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <param name="arg2">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Warn(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Warn(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsWarnEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Warn"/> level.
+            </summary>
+            <param name="provider">An <see cref="T:System.IFormatProvider"/> that supplies culture-specific formatting information</param>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Warn(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Warn(System.Object,System.Exception)"/>
+            <seealso cref="P:log4net.ILog.IsWarnEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.Error(System.Object)">
+            <overloads>Log a message object with the <see cref="F:log4net.Core.Level.Error"/> level.</overloads>
+            <summary>
+            Logs a message object with the <see cref="F:log4net.Core.Level.Error"/> level.
+            </summary>
+            <param name="message">The message object to log.</param>
+            <remarks>
+            <para>
+            This method first checks if this logger is <c>ERROR</c>
+            enabled by comparing the level of this logger with the 
+            <see cref="F:log4net.Core.Level.Error"/> level. If this logger is
+            <c>ERROR</c> enabled, then it converts the message object
+            (passed as parameter) to a string by invoking the appropriate
+            <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+            proceeds to call all the registered appenders in this logger 
+            and also higher in the hierarchy depending on the value of the 
+            additivity flag.
+            </para>
+            <para><b>WARNING</b> Note that passing an <see cref="T:System.Exception"/> 
+            to this method will print the name of the <see cref="T:System.Exception"/> 
+            but no stack trace. To print a stack trace use the 
+            <see cref="M:log4net.ILog.Error(System.Object,System.Exception)"/> form instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Error(System.Object,System.Exception)"/>
+            <seealso cref="P:log4net.ILog.IsErrorEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.Error(System.Object,System.Exception)">
+            <summary>
+            Log a message object with the <see cref="F:log4net.Core.Level.Error"/> level including
+            the stack trace of the <see cref="T:System.Exception"/> passed
+            as a parameter.
+            </summary>
+            <param name="message">The message object to log.</param>
+            <param name="exception">The exception to log, including its stack trace.</param>
+            <remarks>
+            <para>
+            See the <see cref="M:log4net.ILog.Error(System.Object)"/> form for more detailed information.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Error(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsErrorEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.ErrorFormat(System.String,System.Object[])">
+            <overloads>Log a formatted message string with the <see cref="F:log4net.Core.Level.Error"/> level.</overloads>
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Error"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Error(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Error(System.Object,System.Exception)"/>
+            <seealso cref="P:log4net.ILog.IsErrorEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.ErrorFormat(System.String,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Error"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Error(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Error(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsErrorEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.ErrorFormat(System.String,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Error"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Error(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Error(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsErrorEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.ErrorFormat(System.String,System.Object,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Error"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <param name="arg2">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Error(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Error(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsErrorEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Error"/> level.
+            </summary>
+            <param name="provider">An <see cref="T:System.IFormatProvider"/> that supplies culture-specific formatting information</param>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Error(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Error(System.Object,System.Exception)"/>
+            <seealso cref="P:log4net.ILog.IsErrorEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.Fatal(System.Object)">
+            <overloads>Log a message object with the <see cref="F:log4net.Core.Level.Fatal"/> level.</overloads>
+            <summary>
+            Log a message object with the <see cref="F:log4net.Core.Level.Fatal"/> level.
+            </summary>
+            <remarks>
+            <para>
+            This method first checks if this logger is <c>FATAL</c>
+            enabled by comparing the level of this logger with the 
+            <see cref="F:log4net.Core.Level.Fatal"/> level. If this logger is
+            <c>FATAL</c> enabled, then it converts the message object
+            (passed as parameter) to a string by invoking the appropriate
+            <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+            proceeds to call all the registered appenders in this logger 
+            and also higher in the hierarchy depending on the value of the 
+            additivity flag.
+            </para>
+            <para><b>WARNING</b> Note that passing an <see cref="T:System.Exception"/> 
+            to this method will print the name of the <see cref="T:System.Exception"/> 
+            but no stack trace. To print a stack trace use the 
+            <see cref="M:log4net.ILog.Fatal(System.Object,System.Exception)"/> form instead.
+            </para>
+            </remarks>
+            <param name="message">The message object to log.</param>
+            <seealso cref="M:log4net.ILog.Fatal(System.Object,System.Exception)"/>
+            <seealso cref="P:log4net.ILog.IsFatalEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.Fatal(System.Object,System.Exception)">
+            <summary>
+            Log a message object with the <see cref="F:log4net.Core.Level.Fatal"/> level including
+            the stack trace of the <see cref="T:System.Exception"/> passed
+            as a parameter.
+            </summary>
+            <param name="message">The message object to log.</param>
+            <param name="exception">The exception to log, including its stack trace.</param>
+            <remarks>
+            <para>
+            See the <see cref="M:log4net.ILog.Fatal(System.Object)"/> form for more detailed information.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Fatal(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsFatalEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.FatalFormat(System.String,System.Object[])">
+            <overloads>Log a formatted message string with the <see cref="F:log4net.Core.Level.Fatal"/> level.</overloads>
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Fatal"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Fatal(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Fatal(System.Object,System.Exception)"/>
+            <seealso cref="P:log4net.ILog.IsFatalEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.FatalFormat(System.String,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Fatal"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Fatal(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Fatal(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsFatalEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.FatalFormat(System.String,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Fatal"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Fatal(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Fatal(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsFatalEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.FatalFormat(System.String,System.Object,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Fatal"/> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <param name="arg2">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Fatal(System.Object,System.Exception)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Fatal(System.Object)"/>
+            <seealso cref="P:log4net.ILog.IsFatalEnabled"/>
+        </member>
+        <member name="M:log4net.ILog.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <see cref="F:log4net.Core.Level.Fatal"/> level.
+            </summary>
+            <param name="provider">An <see cref="T:System.IFormatProvider"/> that supplies culture-specific formatting information</param>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <c>String.Format</c> method. See
+            <see cref="M:System.String.Format(System.String,System.Object[])"/> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.ILog.Fatal(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Fatal(System.Object,System.Exception)"/>
+            <seealso cref="P:log4net.ILog.IsFatalEnabled"/>
+        </member>
+        <member name="P:log4net.ILog.IsDebugEnabled">
+            <summary>
+            Checks if this logger is enabled for the <see cref="F:log4net.Core.Level.Debug"/> level.
+            </summary>
+            <value>
+            <c>true</c> if this logger is enabled for <see cref="F:log4net.Core.Level.Debug"/> events, <c>false</c> otherwise.
+            </value>
+            <remarks>
+            <para>
+            This function is intended to lessen the computational cost of
+            disabled log debug statements.
+            </para>
+            <para> For some ILog interface <c>log</c>, when you write:</para>
+            <code lang="C#">
+            log.Debug("This is entry number: " + i );
+            </code>
+            <para>
+            You incur the cost constructing the message, string construction and concatenation in
+            this case, regardless of whether the message is logged or not.
+            </para>
+            <para>
+            If you are worried about speed (who isn't), then you should write:
+            </para>
+            <code lang="C#">
+            if (log.IsDebugEnabled)
+            { 
+                log.Debug("This is entry number: " + i );
+            }
+            </code>
+            <para>
+            This way you will not incur the cost of parameter
+            construction if debugging is disabled for <c>log</c>. On
+            the other hand, if the <c>log</c> is debug enabled, you
+            will incur the cost of evaluating whether the logger is debug
+            enabled twice. Once in <see cref="P:log4net.ILog.IsDebugEnabled"/> and once in
+            the <see cref="M:log4net.ILog.Debug(System.Object)"/>.  This is an insignificant overhead
+            since evaluating a logger takes about 1% of the time it
+            takes to actually log. This is the preferred style of logging.
+            </para>
+            <para>Alternatively if your logger is available statically then the is debug
+            enabled state can be stored in a static variable like this:
+            </para>
+            <code lang="C#">
+            private static readonly bool isDebugEnabled = log.IsDebugEnabled;
+            </code>
+            <para>
+            Then when you come to log you can write:
+            </para>
+            <code lang="C#">
+            if (isDebugEnabled)
+            { 
+                log.Debug("This is entry number: " + i );
+            }
+            </code>
+            <para>
+            This way the debug enabled state is only queried once
+            when the class is loaded. Using a <c>private static readonly</c>
+            variable is the most efficient because it is a run time constant
+            and can be heavily optimized by the JIT compiler.
+            </para>
+            <para>
+            Of course if you use a static readonly variable to
+            hold the enabled state of the logger then you cannot
+            change the enabled state at runtime to vary the logging
+            that is produced. You have to decide if you need absolute
+            speed or runtime flexibility.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.ILog.Debug(System.Object)"/>
+            <seealso cref="M:log4net.ILog.DebugFormat(System.IFormatProvider,System.String,System.Object[])"/>
+        </member>
+        <member name="P:log4net.ILog.IsInfoEnabled">
+            <summary>
+            Checks if this logger is enabled for the <see cref="F:log4net.Core.Level.Info"/> level.
+            </summary>
+            <value>
+            <c>true</c> if this logger is enabled for <see cref="F:log4net.Core.Level.Info"/> events, <c>false</c> otherwise.
+            </value>
+            <remarks>
+            For more information see <see cref="P:log4net.ILog.IsDebugEnabled"/>.
+            </remarks>
+            <seealso cref="M:log4net.ILog.Info(System.Object)"/>
+            <seealso cref="M:log4net.ILog.InfoFormat(System.IFormatProvider,System.String,System.Object[])"/>
+            <seealso cref="P:log4net.ILog.IsDebugEnabled"/>
+        </member>
+        <member name="P:log4net.ILog.IsWarnEnabled">
+            <summary>
+            Checks if this logger is enabled for the <see cref="F:log4net.Core.Level.Warn"/> level.
+            </summary>
+            <value>
+            <c>true</c> if this logger is enabled for <see cref="F:log4net.Core.Level.Warn"/> events, <c>false</c> otherwise.
+            </value>
+            <remarks>
+            For more information see <see cref="P:log4net.ILog.IsDebugEnabled"/>.
+            </remarks>
+            <seealso cref="M:log4net.ILog.Warn(System.Object)"/>
+            <seealso cref="M:log4net.ILog.WarnFormat(System.IFormatProvider,System.String,System.Object[])"/>
+            <seealso cref="P:log4net.ILog.IsDebugEnabled"/>
+        </member>
+        <member name="P:log4net.ILog.IsErrorEnabled">
+            <summary>
+            Checks if this logger is enabled for the <see cref="F:log4net.Core.Level.Error"/> level.
+            </summary>
+            <value>
+            <c>true</c> if this logger is enabled for <see cref="F:log4net.Core.Level.Error"/> events, <c>false</c> otherwise.
+            </value>
+            <remarks>
+            For more information see <see cref="P:log4net.ILog.IsDebugEnabled"/>.
+            </remarks>
+            <seealso cref="M:log4net.ILog.Error(System.Object)"/>
+            <seealso cref="M:log4net.ILog.ErrorFormat(System.IFormatProvider,System.String,System.Object[])"/>
+            <seealso cref="P:log4net.ILog.IsDebugEnabled"/>
+        </member>
+        <member name="P:log4net.ILog.IsFatalEnabled">
+            <summary>
+            Checks if this logger is enabled for the <see cref="F:log4net.Core.Level.Fatal"/> level.
+            </summary>
+            <value>
+            <c>true</c> if this logger is enabled for <see cref="F:log4net.Core.Level.Fatal"/> events, <c>false</c> otherwise.
+            </value>
+            <remarks>
+            For more information see <see cref="P:log4net.ILog.IsDebugEnabled"/>.
+            </remarks>
+            <seealso cref="M:log4net.ILog.Fatal(System.Object)"/>
+            <seealso cref="M:log4net.ILog.FatalFormat(System.IFormatProvider,System.String,System.Object[])"/>
+            <seealso cref="P:log4net.ILog.IsDebugEnabled"/>
+        </member>
+        <member name="M:log4net.Core.LogImpl.#ctor(log4net.Core.ILogger)">
+            <summary>
+            Construct a new wrapper for the specified logger.
+            </summary>
+            <param name="logger">The logger to wrap.</param>
+            <remarks>
+            <para>
+            Construct a new wrapper for the specified logger.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.ReloadLevels(log4net.Repository.ILoggerRepository)">
+            <summary>
+            Virtual method called when the configuration of the repository changes
+            </summary>
+            <param name="repository">the repository holding the levels</param>
+            <remarks>
+            <para>
+            Virtual method called when the configuration of the repository changes
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.Debug(System.Object)">
+            <summary>
+            Logs a message object with the <c>DEBUG</c> level.
+            </summary>
+            <param name="message">The message object to log.</param>
+            <remarks>
+            <para>
+            This method first checks if this logger is <c>DEBUG</c>
+            enabled by comparing the level of this logger with the 
+            <c>DEBUG</c> level. If this logger is
+            <c>DEBUG</c> enabled, then it converts the message object
+            (passed as parameter) to a string by invoking the appropriate
+            <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+            proceeds to call all the registered appenders in this logger 
+            and also higher in the hierarchy depending on the value of the 
+            additivity flag.
+            </para>
+            <para>
+            <b>WARNING</b> Note that passing an <see cref="T:System.Exception"/> 
+            to this method will print the name of the <see cref="T:System.Exception"/> 
+            but no stack trace. To print a stack trace use the 
+            <see cref="M:log4net.Core.LogImpl.Debug(System.Object,System.Exception)"/> form instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.Debug(System.Object,System.Exception)">
+            <summary>
+            Logs a message object with the <c>DEBUG</c> level
+            </summary>
+            <param name="message">The message object to log.</param>
+            <param name="exception">The exception to log, including its stack trace.</param>
+            <remarks>
+            <para>
+            Logs a message object with the <c>DEBUG</c> level including
+            the stack trace of the <see cref="T:System.Exception"/> <paramref name="exception"/> passed
+            as a parameter.
+            </para>
+            <para>
+            See the <see cref="M:log4net.Core.LogImpl.Debug(System.Object)"/> form for more detailed information.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.Core.LogImpl.Debug(System.Object)"/>
+        </member>
+        <member name="M:log4net.Core.LogImpl.DebugFormat(System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <c>DEBUG</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.DebugFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Debug(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.DebugFormat(System.String,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>DEBUG</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.DebugFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Debug(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.DebugFormat(System.String,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>DEBUG</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.DebugFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Debug(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.DebugFormat(System.String,System.Object,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>DEBUG</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <param name="arg2">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.DebugFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Debug(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <c>DEBUG</c> level.
+            </summary>
+            <param name="provider">An <see cref="T:System.IFormatProvider"/> that supplies culture-specific formatting information</param>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Debug(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.Info(System.Object)">
+            <summary>
+            Logs a message object with the <c>INFO</c> level.
+            </summary>
+            <param name="message">The message object to log.</param>
+            <remarks>
+            <para>
+            This method first checks if this logger is <c>INFO</c>
+            enabled by comparing the level of this logger with the 
+            <c>INFO</c> level. If this logger is
+            <c>INFO</c> enabled, then it converts the message object
+            (passed as parameter) to a string by invoking the appropriate
+            <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+            proceeds to call all the registered appenders in this logger 
+            and also higher in the hierarchy depending on the value of 
+            the additivity flag.
+            </para>
+            <para>
+            <b>WARNING</b> Note that passing an <see cref="T:System.Exception"/> 
+            to this method will print the name of the <see cref="T:System.Exception"/> 
+            but no stack trace. To print a stack trace use the 
+            <see cref="M:log4net.Core.LogImpl.Info(System.Object,System.Exception)"/> form instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.Info(System.Object,System.Exception)">
+            <summary>
+            Logs a message object with the <c>INFO</c> level.
+            </summary>
+            <param name="message">The message object to log.</param>
+            <param name="exception">The exception to log, including its stack trace.</param>
+            <remarks>
+            <para>
+            Logs a message object with the <c>INFO</c> level including
+            the stack trace of the <see cref="T:System.Exception"/> <paramref name="exception"/> 
+            passed as a parameter.
+            </para>
+            <para>
+            See the <see cref="M:log4net.Core.LogImpl.Info(System.Object)"/> form for more detailed information.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.Core.LogImpl.Info(System.Object)"/>
+        </member>
+        <member name="M:log4net.Core.LogImpl.InfoFormat(System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <c>INFO</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.InfoFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Info(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.InfoFormat(System.String,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>INFO</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.InfoFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Info(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.InfoFormat(System.String,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>INFO</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.InfoFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Info(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.InfoFormat(System.String,System.Object,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>INFO</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <param name="arg2">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.InfoFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Info(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <c>INFO</c> level.
+            </summary>
+            <param name="provider">An <see cref="T:System.IFormatProvider"/> that supplies culture-specific formatting information</param>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Info(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.Warn(System.Object)">
+            <summary>
+            Logs a message object with the <c>WARN</c> level.
+            </summary>
+            <param name="message">the message object to log</param>
+            <remarks>
+            <para>
+            This method first checks if this logger is <c>WARN</c>
+            enabled by comparing the level of this logger with the 
+            <c>WARN</c> level. If this logger is
+            <c>WARN</c> enabled, then it converts the message object
+            (passed as parameter) to a string by invoking the appropriate
+            <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+            proceeds to call all the registered appenders in this logger and 
+            also higher in the hierarchy depending on the value of the 
+            additivity flag.
+            </para>
+            <para>
+            <b>WARNING</b> Note that passing an <see cref="T:System.Exception"/> to this
+            method will print the name of the <see cref="T:System.Exception"/> but no
+            stack trace. To print a stack trace use the 
+            <see cref="M:log4net.Core.LogImpl.Warn(System.Object,System.Exception)"/> form instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.Warn(System.Object,System.Exception)">
+            <summary>
+            Logs a message object with the <c>WARN</c> level
+            </summary>
+            <param name="message">The message object to log.</param>
+            <param name="exception">The exception to log, including its stack trace.</param>
+            <remarks>
+            <para>
+            Logs a message object with the <c>WARN</c> level including
+            the stack trace of the <see cref="T:System.Exception"/> <paramref name="exception"/> 
+            passed as a parameter.
+            </para>
+            <para>
+            See the <see cref="M:log4net.Core.LogImpl.Warn(System.Object)"/> form for more detailed information.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.Core.LogImpl.Warn(System.Object)"/>
+        </member>
+        <member name="M:log4net.Core.LogImpl.WarnFormat(System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <c>WARN</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.WarnFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Warn(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.WarnFormat(System.String,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>WARN</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.WarnFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Warn(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.WarnFormat(System.String,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>WARN</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.WarnFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Warn(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.WarnFormat(System.String,System.Object,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>WARN</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <param name="arg2">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.WarnFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Warn(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <c>WARN</c> level.
+            </summary>
+            <param name="provider">An <see cref="T:System.IFormatProvider"/> that supplies culture-specific formatting information</param>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Warn(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.Error(System.Object)">
+            <summary>
+            Logs a message object with the <c>ERROR</c> level.
+            </summary>
+            <param name="message">The message object to log.</param>
+            <remarks>
+            <para>
+            This method first checks if this logger is <c>ERROR</c>
+            enabled by comparing the level of this logger with the 
+            <c>ERROR</c> level. If this logger is
+            <c>ERROR</c> enabled, then it converts the message object
+            (passed as parameter) to a string by invoking the appropriate
+            <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+            proceeds to call all the registered appenders in this logger and 
+            also higher in the hierarchy depending on the value of the 
+            additivity flag.
+            </para>
+            <para>
+            <b>WARNING</b> Note that passing an <see cref="T:System.Exception"/> to this
+            method will print the name of the <see cref="T:System.Exception"/> but no
+            stack trace. To print a stack trace use the 
+            <see cref="M:log4net.Core.LogImpl.Error(System.Object,System.Exception)"/> form instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.Error(System.Object,System.Exception)">
+            <summary>
+            Logs a message object with the <c>ERROR</c> level
+            </summary>
+            <param name="message">The message object to log.</param>
+            <param name="exception">The exception to log, including its stack trace.</param>
+            <remarks>
+            <para>
+            Logs a message object with the <c>ERROR</c> level including
+            the stack trace of the <see cref="T:System.Exception"/> <paramref name="exception"/> 
+            passed as a parameter.
+            </para>
+            <para>
+            See the <see cref="M:log4net.Core.LogImpl.Error(System.Object)"/> form for more detailed information.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.Core.LogImpl.Error(System.Object)"/>
+        </member>
+        <member name="M:log4net.Core.LogImpl.ErrorFormat(System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <c>ERROR</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.ErrorFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Error(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.ErrorFormat(System.String,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>ERROR</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.ErrorFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Error(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.ErrorFormat(System.String,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>ERROR</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.ErrorFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Error(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.ErrorFormat(System.String,System.Object,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>ERROR</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <param name="arg2">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.ErrorFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Error(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <c>ERROR</c> level.
+            </summary>
+            <param name="provider">An <see cref="T:System.IFormatProvider"/> that supplies culture-specific formatting information</param>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Error(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.Fatal(System.Object)">
+            <summary>
+            Logs a message object with the <c>FATAL</c> level.
+            </summary>
+            <param name="message">The message object to log.</param>
+            <remarks>
+            <para>
+            This method first checks if this logger is <c>FATAL</c>
+            enabled by comparing the level of this logger with the 
+            <c>FATAL</c> level. If this logger is
+            <c>FATAL</c> enabled, then it converts the message object
+            (passed as parameter) to a string by invoking the appropriate
+            <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+            proceeds to call all the registered appenders in this logger and 
+            also higher in the hierarchy depending on the value of the 
+            additivity flag.
+            </para>
+            <para>
+            <b>WARNING</b> Note that passing an <see cref="T:System.Exception"/> to this
+            method will print the name of the <see cref="T:System.Exception"/> but no
+            stack trace. To print a stack trace use the 
+            <see cref="M:log4net.Core.LogImpl.Fatal(System.Object,System.Exception)"/> form instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.Fatal(System.Object,System.Exception)">
+            <summary>
+            Logs a message object with the <c>FATAL</c> level
+            </summary>
+            <param name="message">The message object to log.</param>
+            <param name="exception">The exception to log, including its stack trace.</param>
+            <remarks>
+            <para>
+            Logs a message object with the <c>FATAL</c> level including
+            the stack trace of the <see cref="T:System.Exception"/> <paramref name="exception"/> 
+            passed as a parameter.
+            </para>
+            <para>
+            See the <see cref="M:log4net.Core.LogImpl.Fatal(System.Object)"/> form for more detailed information.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.Core.LogImpl.Fatal(System.Object)"/>
+        </member>
+        <member name="M:log4net.Core.LogImpl.FatalFormat(System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <c>FATAL</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.FatalFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Fatal(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.FatalFormat(System.String,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>FATAL</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.FatalFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Fatal(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.FatalFormat(System.String,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>FATAL</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.FatalFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Fatal(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.FatalFormat(System.String,System.Object,System.Object,System.Object)">
+            <summary>
+            Logs a formatted message string with the <c>FATAL</c> level.
+            </summary>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="arg0">An Object to format</param>
+            <param name="arg1">An Object to format</param>
+            <param name="arg2">An Object to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            The string is formatted using the <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>
+            format provider. To specify a localized provider use the
+            <see cref="M:log4net.Core.LogImpl.FatalFormat(System.IFormatProvider,System.String,System.Object[])"/> method.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Fatal(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a formatted message string with the <c>FATAL</c> level.
+            </summary>
+            <param name="provider">An <see cref="T:System.IFormatProvider"/> that supplies culture-specific formatting information</param>
+            <param name="format">A String containing zero or more format items</param>
+            <param name="args">An Object array containing zero or more objects to format</param>
+            <remarks>
+            <para>
+            The message is formatted using the <see cref="M:System.String.Format(System.IFormatProvider,System.String,System.Object[])"/> method. See
+            <c>String.Format</c> for details of the syntax of the format string and the behavior
+            of the formatting.
+            </para>
+            <para>
+            This method does not take an <see cref="T:System.Exception"/> object to include in the
+            log event. To pass an <see cref="T:System.Exception"/> use one of the <see cref="M:log4net.Core.LogImpl.Fatal(System.Object)"/>
+            methods instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.LogImpl.LoggerRepositoryConfigurationChanged(System.Object,System.EventArgs)">
+            <summary>
+            Event handler for the <see cref="E:log4net.Repository.ILoggerRepository.ConfigurationChanged"/> event
+            </summary>
+            <param name="sender">the repository</param>
+            <param name="e">Empty</param>
+        </member>
+        <member name="F:log4net.Core.LogImpl.ThisDeclaringType">
+            <summary>
+            The fully qualified name of this declaring type not the type of any subclass.
+            </summary>
+        </member>
+        <member name="P:log4net.Core.LogImpl.IsDebugEnabled">
+            <summary>
+            Checks if this logger is enabled for the <c>DEBUG</c>
+            level.
+            </summary>
+            <value>
+            <c>true</c> if this logger is enabled for <c>DEBUG</c> events,
+            <c>false</c> otherwise.
+            </value>
+            <remarks>
+            <para>
+            This function is intended to lessen the computational cost of
+            disabled log debug statements.
+            </para>
+            <para>
+            For some <c>log</c> Logger object, when you write:
+            </para>
+            <code lang="C#">
+            log.Debug("This is entry number: " + i );
+            </code>
+            <para>
+            You incur the cost constructing the message, concatenation in
+            this case, regardless of whether the message is logged or not.
+            </para>
+            <para>
+            If you are worried about speed, then you should write:
+            </para>
+            <code lang="C#">
+            if (log.IsDebugEnabled())
+            { 
+             log.Debug("This is entry number: " + i );
+            }
+            </code>
+            <para>
+            This way you will not incur the cost of parameter
+            construction if debugging is disabled for <c>log</c>. On
+            the other hand, if the <c>log</c> is debug enabled, you
+            will incur the cost of evaluating whether the logger is debug
+            enabled twice. Once in <c>IsDebugEnabled</c> and once in
+            the <c>Debug</c>.  This is an insignificant overhead
+            since evaluating a logger takes about 1% of the time it
+            takes to actually log.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.LogImpl.IsInfoEnabled">
+            <summary>
+            Checks if this logger is enabled for the <c>INFO</c> level.
+            </summary>
+            <value>
+            <c>true</c> if this logger is enabled for <c>INFO</c> events,
+            <c>false</c> otherwise.
+            </value>
+            <remarks>
+            <para>
+            See <see cref="P:log4net.Core.LogImpl.IsDebugEnabled"/> for more information and examples 
+            of using this method.
+            </para>
+            </remarks>
+            <seealso cref="P:log4net.Core.LogImpl.IsDebugEnabled"/>
+        </member>
+        <member name="P:log4net.Core.LogImpl.IsWarnEnabled">
+            <summary>
+            Checks if this logger is enabled for the <c>WARN</c> level.
+            </summary>
+            <value>
+            <c>true</c> if this logger is enabled for <c>WARN</c> events,
+            <c>false</c> otherwise.
+            </value>
+            <remarks>
+            <para>
+            See <see cref="P:log4net.Core.LogImpl.IsDebugEnabled"/> for more information and examples 
+            of using this method.
+            </para>
+            </remarks>
+            <seealso cref="P:log4net.ILog.IsDebugEnabled"/>
+        </member>
+        <member name="P:log4net.Core.LogImpl.IsErrorEnabled">
+            <summary>
+            Checks if this logger is enabled for the <c>ERROR</c> level.
+            </summary>
+            <value>
+            <c>true</c> if this logger is enabled for <c>ERROR</c> events,
+            <c>false</c> otherwise.
+            </value>
+            <remarks>
+            <para>
+            See <see cref="P:log4net.Core.LogImpl.IsDebugEnabled"/> for more information and examples of using this method.
+            </para>
+            </remarks>
+            <seealso cref="P:log4net.ILog.IsDebugEnabled"/>
+        </member>
+        <member name="P:log4net.Core.LogImpl.IsFatalEnabled">
+            <summary>
+            Checks if this logger is enabled for the <c>FATAL</c> level.
+            </summary>
+            <value>
+            <c>true</c> if this logger is enabled for <c>FATAL</c> events,
+            <c>false</c> otherwise.
+            </value>
+            <remarks>
+            <para>
+            See <see cref="P:log4net.Core.LogImpl.IsDebugEnabled"/> for more information and examples of using this method.
+            </para>
+            </remarks>
+            <seealso cref="P:log4net.ILog.IsDebugEnabled"/>
+        </member>
+        <member name="T:log4net.Core.SecurityContext">
+            <summary>
+            A SecurityContext used by log4net when interacting with protected resources
+            </summary>
+            <remarks>
+            <para>
+            A SecurityContext used by log4net when interacting with protected resources
+            for example with operating system services. This can be used to impersonate
+            a principal that has been granted privileges on the system resources.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Core.SecurityContext.Impersonate(System.Object)">
+            <summary>
+            Impersonate this SecurityContext
+            </summary>
+            <param name="state">State supplied by the caller</param>
+            <returns>An <see cref="T:System.IDisposable"/> instance that will
+            revoke the impersonation of this SecurityContext, or <c>null</c></returns>
+            <remarks>
+            <para>
+            Impersonate this security context. Further calls on the current
+            thread should now be made in the security context provided
+            by this object. When the <see cref="T:System.IDisposable"/> result 
+            <see cref="M:System.IDisposable.Dispose"/> method is called the security
+            context of the thread should be reverted to the state it was in
+            before <see cref="M:log4net.Core.SecurityContext.Impersonate(System.Object)"/> was called.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.SecurityContextProvider">
+            <summary>
+            The <see cref="T:log4net.Core.SecurityContextProvider"/> providers default <see cref="T:log4net.Core.SecurityContext"/> instances.
+            </summary>
+            <remarks>
+            <para>
+            A configured component that interacts with potentially protected system
+            resources uses a <see cref="T:log4net.Core.SecurityContext"/> to provide the elevated
+            privileges required. If the <see cref="T:log4net.Core.SecurityContext"/> object has
+            been not been explicitly provided to the component then the component
+            will request one from this <see cref="T:log4net.Core.SecurityContextProvider"/>.
+            </para>
+            <para>
+            By default the <see cref="P:log4net.Core.SecurityContextProvider.DefaultProvider"/> is
+            an instance of <see cref="T:log4net.Core.SecurityContextProvider"/> which returns only
+            <see cref="T:log4net.Util.NullSecurityContext"/> objects. This is a reasonable default
+            where the privileges required are not know by the system.
+            </para>
+            <para>
+            This default behavior can be overridden by subclassing the <see cref="T:log4net.Core.SecurityContextProvider"/>
+            and overriding the <see cref="M:log4net.Core.SecurityContextProvider.CreateSecurityContext(System.Object)"/> method to return
+            the desired <see cref="T:log4net.Core.SecurityContext"/> objects. The default provider
+            can be replaced by programmatically setting the value of the 
+            <see cref="P:log4net.Core.SecurityContextProvider.DefaultProvider"/> property.
+            </para>
+            <para>
+            An alternative is to use the <c>log4net.Config.SecurityContextProviderAttribute</c>
+            This attribute can be applied to an assembly in the same way as the
+            <c>log4net.Config.XmlConfiguratorAttribute"</c>. The attribute takes
+            the type to use as the <see cref="T:log4net.Core.SecurityContextProvider"/> as an argument.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Core.SecurityContextProvider.s_defaultProvider">
+            <summary>
+            The default provider
+            </summary>
+        </member>
+        <member name="M:log4net.Core.SecurityContextProvider.#ctor">
+            <summary>
+            Protected default constructor to allow subclassing
+            </summary>
+            <remarks>
+            <para>
+            Protected default constructor to allow subclassing
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.SecurityContextProvider.CreateSecurityContext(System.Object)">
+            <summary>
+            Create a SecurityContext for a consumer
+            </summary>
+            <param name="consumer">The consumer requesting the SecurityContext</param>
+            <returns>An impersonation context</returns>
+            <remarks>
+            <para>
+            The default implementation is to return a <see cref="T:log4net.Util.NullSecurityContext"/>.
+            </para>
+            <para>
+            Subclasses should override this method to provide their own
+            behavior.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Core.SecurityContextProvider.DefaultProvider">
+            <summary>
+            Gets or sets the default SecurityContextProvider
+            </summary>
+            <value>
+            The default SecurityContextProvider
+            </value>
+            <remarks>
+            <para>
+            The default provider is used by configured components that
+            require a <see cref="T:log4net.Core.SecurityContext"/> and have not had one
+            given to them.
+            </para>
+            <para>
+            By default this is an instance of <see cref="T:log4net.Core.SecurityContextProvider"/>
+            that returns <see cref="T:log4net.Util.NullSecurityContext"/> objects.
+            </para>
+            <para>
+            The default provider can be set programmatically by setting
+            the value of this property to a sub class of <see cref="T:log4net.Core.SecurityContextProvider"/>
+            that has the desired behavior.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.WrapperCreationHandler">
+            <summary>
+            Delegate used to handle creation of new wrappers.
+            </summary>
+            <param name="logger">The logger to wrap in a wrapper.</param>
+            <remarks>
+            <para>
+            Delegate used to handle creation of new wrappers. This delegate
+            is called from the <see cref="M:log4net.Core.WrapperMap.CreateNewWrapperObject(log4net.Core.ILogger)"/>
+            method to construct the wrapper for the specified logger.
+            </para>
+            <para>
+            The delegate to use is supplied to the <see cref="T:log4net.Core.WrapperMap"/>
+            constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Core.WrapperMap">
+            <summary>
+            Maps between logger objects and wrapper objects.
+            </summary>
+            <remarks>
+            <para>
+            This class maintains a mapping between <see cref="T:log4net.Core.ILogger"/> objects and
+            <see cref="T:log4net.Core.ILoggerWrapper"/> objects. Use the <see cref="M:log4net.Core.WrapperMap.GetWrapper(log4net.Core.ILogger)"/> method to 
+            lookup the <see cref="T:log4net.Core.ILoggerWrapper"/> for the specified <see cref="T:log4net.Core.ILogger"/>.
+            </para>
+            <para>
+            New wrapper instances are created by the <see cref="M:log4net.Core.WrapperMap.CreateNewWrapperObject(log4net.Core.ILogger)"/>
+            method. The default behavior is for this method to delegate construction
+            of the wrapper to the <see cref="T:log4net.Core.WrapperCreationHandler"/> delegate supplied
+            to the constructor. This allows specialization of the behavior without
+            requiring subclassing of this type.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Core.WrapperMap.#ctor(log4net.Core.WrapperCreationHandler)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Core.WrapperMap"/>
+            </summary>
+            <param name="createWrapperHandler">The handler to use to create the wrapper objects.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Core.WrapperMap"/> class with 
+            the specified handler to create the wrapper objects.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.WrapperMap.GetWrapper(log4net.Core.ILogger)">
+            <summary>
+            Gets the wrapper object for the specified logger.
+            </summary>
+            <returns>The wrapper object for the specified logger</returns>
+            <remarks>
+            <para>
+            If the logger is null then the corresponding wrapper is null.
+            </para>
+            <para>
+            Looks up the wrapper it it has previously been requested and
+            returns it. If the wrapper has never been requested before then
+            the <see cref="M:log4net.Core.WrapperMap.CreateNewWrapperObject(log4net.Core.ILogger)"/> virtual method is
+            called.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.WrapperMap.CreateNewWrapperObject(log4net.Core.ILogger)">
+            <summary>
+            Creates the wrapper object for the specified logger.
+            </summary>
+            <param name="logger">The logger to wrap in a wrapper.</param>
+            <returns>The wrapper object for the logger.</returns>
+            <remarks>
+            <para>
+            This implementation uses the <see cref="T:log4net.Core.WrapperCreationHandler"/>
+            passed to the constructor to create the wrapper. This method
+            can be overridden in a subclass.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.WrapperMap.RepositoryShutdown(log4net.Repository.ILoggerRepository)">
+            <summary>
+            Called when a monitored repository shutdown event is received.
+            </summary>
+            <param name="repository">The <see cref="T:log4net.Repository.ILoggerRepository"/> that is shutting down</param>
+            <remarks>
+            <para>
+            This method is called when a <see cref="T:log4net.Repository.ILoggerRepository"/> that this
+            <see cref="T:log4net.Core.WrapperMap"/> is holding loggers for has signaled its shutdown
+            event <see cref="E:log4net.Repository.ILoggerRepository.ShutdownEvent"/>. The default
+            behavior of this method is to release the references to the loggers
+            and their wrappers generated for this repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Core.WrapperMap.ILoggerRepository_Shutdown(System.Object,System.EventArgs)">
+            <summary>
+            Event handler for repository shutdown event.
+            </summary>
+            <param name="sender">The sender of the event.</param>
+            <param name="e">The event args.</param>
+        </member>
+        <member name="F:log4net.Core.WrapperMap.m_repositories">
+            <summary>
+            Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings
+            </summary>
+        </member>
+        <member name="F:log4net.Core.WrapperMap.m_createWrapperHandler">
+            <summary>
+            The handler to use to create the extension wrapper objects.
+            </summary>
+        </member>
+        <member name="F:log4net.Core.WrapperMap.m_shutdownHandler">
+            <summary>
+            Internal reference to the delegate used to register for repository shutdown events.
+            </summary>
+        </member>
+        <member name="P:log4net.Core.WrapperMap.Repositories">
+            <summary>
+            Gets the map of logger repositories.
+            </summary>
+            <value>
+            Map of logger repositories.
+            </value>
+            <remarks>
+            <para>
+            Gets the hashtable that is keyed on <see cref="T:log4net.Repository.ILoggerRepository"/>. The
+            values are hashtables keyed on <see cref="T:log4net.Core.ILogger"/> with the
+            value being the corresponding <see cref="T:log4net.Core.ILoggerWrapper"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.DateFormatter.AbsoluteTimeDateFormatter">
+            <summary>
+            Formats a <see cref="T:System.DateTime"/> as <c>"HH:mm:ss,fff"</c>.
+            </summary>
+            <remarks>
+            <para>
+            Formats a <see cref="T:System.DateTime"/> in the format <c>"HH:mm:ss,fff"</c> for example, <c>"15:49:37,459"</c>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.DateFormatter.IDateFormatter">
+            <summary>
+            Render a <see cref="T:System.DateTime"/> as a string.
+            </summary>
+            <remarks>
+            <para>
+            Interface to abstract the rendering of a <see cref="T:System.DateTime"/>
+            instance into a string.
+            </para>
+            <para>
+            The <see cref="M:log4net.DateFormatter.IDateFormatter.FormatDate(System.DateTime,System.IO.TextWriter)"/> method is used to render the
+            date to a text writer.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.DateFormatter.IDateFormatter.FormatDate(System.DateTime,System.IO.TextWriter)">
+            <summary>
+            Formats the specified date as a string.
+            </summary>
+            <param name="dateToFormat">The date to format.</param>
+            <param name="writer">The writer to write to.</param>
+            <remarks>
+            <para>
+            Format the <see cref="T:System.DateTime"/> as a string and write it
+            to the <see cref="T:System.IO.TextWriter"/> provided.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.DateFormatter.AbsoluteTimeDateFormatter.AbsoluteTimeDateFormat">
+            <summary>
+            String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is <b>ABSOLUTE</b>.
+            </summary>
+        </member>
+        <member name="F:log4net.DateFormatter.AbsoluteTimeDateFormatter.DateAndTimeDateFormat">
+            <summary>
+            String constant used to specify DateTimeDateFormat in layouts.  Current value is <b>DATE</b>.
+            </summary>
+        </member>
+        <member name="F:log4net.DateFormatter.AbsoluteTimeDateFormatter.Iso8601TimeDateFormat">
+            <summary>
+            String constant used to specify ISO8601DateFormat in layouts. Current value is <b>ISO8601</b>.
+            </summary>
+        </member>
+        <member name="M:log4net.DateFormatter.AbsoluteTimeDateFormatter.FormatDateWithoutMillis(System.DateTime,System.Text.StringBuilder)">
+            <summary>
+            Renders the date into a string. Format is <c>"HH:mm:ss"</c>.
+            </summary>
+            <param name="dateToFormat">The date to render into a string.</param>
+            <param name="buffer">The string builder to write to.</param>
+            <remarks>
+            <para>
+            Subclasses should override this method to render the date
+            into a string using a precision up to the second. This method
+            will be called at most once per second and the result will be
+            reused if it is needed again during the same second.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.DateFormatter.AbsoluteTimeDateFormatter.FormatDate(System.DateTime,System.IO.TextWriter)">
+            <summary>
+            Renders the date into a string. Format is "HH:mm:ss,fff".
+            </summary>
+            <param name="dateToFormat">The date to render into a string.</param>
+            <param name="writer">The writer to write to.</param>
+            <remarks>
+            <para>
+            Uses the <see cref="M:log4net.DateFormatter.AbsoluteTimeDateFormatter.FormatDateWithoutMillis(System.DateTime,System.Text.StringBuilder)"/> method to generate the
+            time string up to the seconds and then appends the current
+            milliseconds. The results from <see cref="M:log4net.DateFormatter.AbsoluteTimeDateFormatter.FormatDateWithoutMillis(System.DateTime,System.Text.StringBuilder)"/> are
+            cached and <see cref="M:log4net.DateFormatter.AbsoluteTimeDateFormatter.FormatDateWithoutMillis(System.DateTime,System.Text.StringBuilder)"/> is called at most once
+            per second.
+            </para>
+            <para>
+            Sub classes should override <see cref="M:log4net.DateFormatter.AbsoluteTimeDateFormatter.FormatDateWithoutMillis(System.DateTime,System.Text.StringBuilder)"/>
+            rather than <see cref="M:log4net.DateFormatter.AbsoluteTimeDateFormatter.FormatDate(System.DateTime,System.IO.TextWriter)"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.DateFormatter.AbsoluteTimeDateFormatter.s_lastTimeToTheSecond">
+            <summary>
+            Last stored time with precision up to the second.
+            </summary>
+        </member>
+        <member name="F:log4net.DateFormatter.AbsoluteTimeDateFormatter.s_lastTimeBuf">
+            <summary>
+            Last stored time with precision up to the second, formatted
+            as a string.
+            </summary>
+        </member>
+        <member name="F:log4net.DateFormatter.AbsoluteTimeDateFormatter.s_lastTimeString">
+            <summary>
+            Last stored time with precision up to the second, formatted
+            as a string.
+            </summary>
+        </member>
+        <member name="T:log4net.DateFormatter.DateTimeDateFormatter">
+            <summary>
+            Formats a <see cref="T:System.DateTime"/> as <c>"dd MMM yyyy HH:mm:ss,fff"</c>
+            </summary>
+            <remarks>
+            <para>
+            Formats a <see cref="T:System.DateTime"/> in the format 
+            <c>"dd MMM yyyy HH:mm:ss,fff"</c> for example, 
+            <c>"06 Nov 1994 15:49:37,459"</c>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+            <author>Angelika Schnagl</author>
+        </member>
+        <member name="M:log4net.DateFormatter.DateTimeDateFormatter.#ctor">
+            <summary>
+            Default constructor.
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.DateFormatter.DateTimeDateFormatter"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.DateFormatter.DateTimeDateFormatter.FormatDateWithoutMillis(System.DateTime,System.Text.StringBuilder)">
+            <summary>
+            Formats the date without the milliseconds part
+            </summary>
+            <param name="dateToFormat">The date to format.</param>
+            <param name="buffer">The string builder to write to.</param>
+            <remarks>
+            <para>
+            Formats a DateTime in the format <c>"dd MMM yyyy HH:mm:ss"</c>
+            for example, <c>"06 Nov 1994 15:49:37"</c>.
+            </para>
+            <para>
+            The base class will append the <c>",fff"</c> milliseconds section.
+            This method will only be called at most once per second.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.DateFormatter.DateTimeDateFormatter.m_dateTimeFormatInfo">
+            <summary>
+            The format info for the invariant culture.
+            </summary>
+        </member>
+        <member name="T:log4net.DateFormatter.Iso8601DateFormatter">
+            <summary>
+            Formats the <see cref="T:System.DateTime"/> as <c>"yyyy-MM-dd HH:mm:ss,fff"</c>.
+            </summary>
+            <remarks>
+            <para>
+            Formats the <see cref="T:System.DateTime"/> specified as a string: <c>"yyyy-MM-dd HH:mm:ss,fff"</c>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.DateFormatter.Iso8601DateFormatter.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.DateFormatter.Iso8601DateFormatter"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.DateFormatter.Iso8601DateFormatter.FormatDateWithoutMillis(System.DateTime,System.Text.StringBuilder)">
+            <summary>
+            Formats the date without the milliseconds part
+            </summary>
+            <param name="dateToFormat">The date to format.</param>
+            <param name="buffer">The string builder to write to.</param>
+            <remarks>
+            <para>
+            Formats the date specified as a string: <c>"yyyy-MM-dd HH:mm:ss"</c>.
+            </para>
+            <para>
+            The base class will append the <c>",fff"</c> milliseconds section.
+            This method will only be called at most once per second.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.DateFormatter.SimpleDateFormatter">
+            <summary>
+            Formats the <see cref="T:System.DateTime"/> using the <see cref="M:System.DateTime.ToString(System.String,System.IFormatProvider)"/> method.
+            </summary>
+            <remarks>
+            <para>
+            Formats the <see cref="T:System.DateTime"/> using the <see cref="T:System.DateTime"/> <see cref="M:System.DateTime.ToString(System.String,System.IFormatProvider)"/> method.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.DateFormatter.SimpleDateFormatter.#ctor(System.String)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="format">The format string.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.DateFormatter.SimpleDateFormatter"/> class 
+            with the specified format string.
+            </para>
+            <para>
+            The format string must be compatible with the options
+            that can be supplied to <see cref="M:System.DateTime.ToString(System.String,System.IFormatProvider)"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.DateFormatter.SimpleDateFormatter.FormatDate(System.DateTime,System.IO.TextWriter)">
+            <summary>
+            Formats the date using <see cref="M:System.DateTime.ToString(System.String,System.IFormatProvider)"/>.
+            </summary>
+            <param name="dateToFormat">The date to convert to a string.</param>
+            <param name="writer">The writer to write to.</param>
+            <remarks>
+            <para>
+            Uses the date format string supplied to the constructor to call
+            the <see cref="M:System.DateTime.ToString(System.String,System.IFormatProvider)"/> method to format the date.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.DateFormatter.SimpleDateFormatter.m_formatString">
+            <summary>
+            The format string used to format the <see cref="T:System.DateTime"/>.
+            </summary>
+            <remarks>
+            <para>
+            The format string must be compatible with the options
+            that can be supplied to <see cref="M:System.DateTime.ToString(System.String,System.IFormatProvider)"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Filter.DenyAllFilter">
+            <summary>
+            This filter drops all <see cref="T:log4net.Core.LoggingEvent"/>. 
+            </summary>
+            <remarks>
+            <para>
+            You can add this filter to the end of a filter chain to
+            switch from the default "accept all unless instructed otherwise"
+            filtering behavior to a "deny all unless instructed otherwise"
+            behavior.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Filter.FilterSkeleton">
+            <summary>
+            Subclass this type to implement customized logging event filtering
+            </summary>
+            <remarks>
+            <para>
+            Users should extend this class to implement customized logging
+            event filtering. Note that <see cref="T:log4net.Repository.Hierarchy.Logger"/> and 
+            <see cref="T:log4net.Appender.AppenderSkeleton"/>, the parent class of all standard
+            appenders, have built-in filtering rules. It is suggested that you
+            first use and understand the built-in rules before rushing to write
+            your own custom filters.
+            </para>
+            <para>
+            This abstract class assumes and also imposes that filters be
+            organized in a linear chain. The <see cref="M:log4net.Filter.FilterSkeleton.Decide(log4net.Core.LoggingEvent)"/>
+            method of each filter is called sequentially, in the order of their 
+            addition to the chain.
+            </para>
+            <para>
+            The <see cref="M:log4net.Filter.FilterSkeleton.Decide(log4net.Core.LoggingEvent)"/> method must return one
+            of the integer constants <see cref="F:log4net.Filter.FilterDecision.Deny"/>, 
+            <see cref="F:log4net.Filter.FilterDecision.Neutral"/> or <see cref="F:log4net.Filter.FilterDecision.Accept"/>.
+            </para>
+            <para>
+            If the value <see cref="F:log4net.Filter.FilterDecision.Deny"/> is returned, then the log event is dropped 
+            immediately without consulting with the remaining filters.
+            </para>
+            <para>
+            If the value <see cref="F:log4net.Filter.FilterDecision.Neutral"/> is returned, then the next filter
+            in the chain is consulted. If there are no more filters in the
+            chain, then the log event is logged. Thus, in the presence of no
+            filters, the default behavior is to log all logging events.
+            </para>
+            <para>
+            If the value <see cref="F:log4net.Filter.FilterDecision.Accept"/> is returned, then the log
+            event is logged without consulting the remaining filters.
+            </para>
+            <para>
+            The philosophy of log4net filters is largely inspired from the
+            Linux ipchains.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Filter.IFilter">
+            <summary>
+            Implement this interface to provide customized logging event filtering
+            </summary>
+            <remarks>
+            <para>
+            Users should implement this interface to implement customized logging
+            event filtering. Note that <see cref="T:log4net.Repository.Hierarchy.Logger"/> and 
+            <see cref="T:log4net.Appender.AppenderSkeleton"/>, the parent class of all standard
+            appenders, have built-in filtering rules. It is suggested that you
+            first use and understand the built-in rules before rushing to write
+            your own custom filters.
+            </para>
+            <para>
+            This abstract class assumes and also imposes that filters be
+            organized in a linear chain. The <see cref="M:log4net.Filter.IFilter.Decide(log4net.Core.LoggingEvent)"/>
+            method of each filter is called sequentially, in the order of their 
+            addition to the chain.
+            </para>
+            <para>
+            The <see cref="M:log4net.Filter.IFilter.Decide(log4net.Core.LoggingEvent)"/> method must return one
+            of the integer constants <see cref="F:log4net.Filter.FilterDecision.Deny"/>, 
+            <see cref="F:log4net.Filter.FilterDecision.Neutral"/> or <see cref="F:log4net.Filter.FilterDecision.Accept"/>.
+            </para>
+            <para>
+            If the value <see cref="F:log4net.Filter.FilterDecision.Deny"/> is returned, then the log event is dropped 
+            immediately without consulting with the remaining filters.
+            </para>
+            <para>
+            If the value <see cref="F:log4net.Filter.FilterDecision.Neutral"/> is returned, then the next filter
+            in the chain is consulted. If there are no more filters in the
+            chain, then the log event is logged. Thus, in the presence of no
+            filters, the default behavior is to log all logging events.
+            </para>
+            <para>
+            If the value <see cref="F:log4net.Filter.FilterDecision.Accept"/> is returned, then the log
+            event is logged without consulting the remaining filters.
+            </para>
+            <para>
+            The philosophy of log4net filters is largely inspired from the
+            Linux ipchains.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Filter.IFilter.Decide(log4net.Core.LoggingEvent)">
+            <summary>
+            Decide if the logging event should be logged through an appender.
+            </summary>
+            <param name="loggingEvent">The LoggingEvent to decide upon</param>
+            <returns>The decision of the filter</returns>
+            <remarks>
+            <para>
+            If the decision is <see cref="F:log4net.Filter.FilterDecision.Deny"/>, then the event will be
+            dropped. If the decision is <see cref="F:log4net.Filter.FilterDecision.Neutral"/>, then the next
+            filter, if any, will be invoked. If the decision is <see cref="F:log4net.Filter.FilterDecision.Accept"/> then
+            the event will be logged without consulting with other filters in
+            the chain.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Filter.IFilter.Next">
+            <summary>
+            Property to get and set the next filter
+            </summary>
+            <value>
+            The next filter in the chain
+            </value>
+            <remarks>
+            <para>
+            Filters are typically composed into chains. This property allows the next filter in 
+            the chain to be accessed.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Filter.FilterSkeleton.m_next">
+            <summary>
+            Points to the next filter in the filter chain.
+            </summary>
+            <remarks>
+            <para>
+            See <see cref="P:log4net.Filter.FilterSkeleton.Next"/> for more information.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Filter.FilterSkeleton.ActivateOptions">
+            <summary>
+            Initialize the filter with the options set
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Filter.FilterSkeleton.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Filter.FilterSkeleton.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Filter.FilterSkeleton.ActivateOptions"/> must be called again.
+            </para>
+            <para>
+            Typically filter's options become active immediately on set, 
+            however this method must still be called. 
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Filter.FilterSkeleton.Decide(log4net.Core.LoggingEvent)">
+            <summary>
+            Decide if the <see cref="T:log4net.Core.LoggingEvent"/> should be logged through an appender.
+            </summary>
+            <param name="loggingEvent">The <see cref="T:log4net.Core.LoggingEvent"/> to decide upon</param>
+            <returns>The decision of the filter</returns>
+            <remarks>
+            <para>
+            If the decision is <see cref="F:log4net.Filter.FilterDecision.Deny"/>, then the event will be
+            dropped. If the decision is <see cref="F:log4net.Filter.FilterDecision.Neutral"/>, then the next
+            filter, if any, will be invoked. If the decision is <see cref="F:log4net.Filter.FilterDecision.Accept"/> then
+            the event will be logged without consulting with other filters in
+            the chain.
+            </para>
+            <para>
+            This method is marked <c>abstract</c> and must be implemented
+            in a subclass.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Filter.FilterSkeleton.Next">
+            <summary>
+            Property to get and set the next filter
+            </summary>
+            <value>
+            The next filter in the chain
+            </value>
+            <remarks>
+            <para>
+            Filters are typically composed into chains. This property allows the next filter in 
+            the chain to be accessed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Filter.DenyAllFilter.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:log4net.Filter.DenyAllFilter.Decide(log4net.Core.LoggingEvent)">
+            <summary>
+            Always returns the integer constant <see cref="F:log4net.Filter.FilterDecision.Deny"/>
+            </summary>
+            <param name="loggingEvent">the LoggingEvent to filter</param>
+            <returns>Always returns <see cref="F:log4net.Filter.FilterDecision.Deny"/></returns>
+            <remarks>
+            <para>
+            Ignores the event being logged and just returns
+            <see cref="F:log4net.Filter.FilterDecision.Deny"/>. This can be used to change the default filter
+            chain behavior from <see cref="F:log4net.Filter.FilterDecision.Accept"/> to <see cref="F:log4net.Filter.FilterDecision.Deny"/>. This filter
+            should only be used as the last filter in the chain
+            as any further filters will be ignored!
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Filter.FilterDecision">
+            <summary>
+            The return result from <see cref="M:log4net.Filter.IFilter.Decide(log4net.Core.LoggingEvent)"/>
+            </summary>
+            <remarks>
+            <para>
+            The return result from <see cref="M:log4net.Filter.IFilter.Decide(log4net.Core.LoggingEvent)"/>
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Filter.FilterDecision.Deny">
+            <summary>
+            The log event must be dropped immediately without 
+            consulting with the remaining filters, if any, in the chain.
+            </summary>
+        </member>
+        <member name="F:log4net.Filter.FilterDecision.Neutral">
+            <summary>
+            This filter is neutral with respect to the log event. 
+            The remaining filters, if any, should be consulted for a final decision.
+            </summary>
+        </member>
+        <member name="F:log4net.Filter.FilterDecision.Accept">
+            <summary>
+            The log event must be logged immediately without 
+            consulting with the remaining filters, if any, in the chain.
+            </summary>
+        </member>
+        <member name="T:log4net.Filter.LevelMatchFilter">
+            <summary>
+            This is a very simple filter based on <see cref="T:log4net.Core.Level"/> matching.
+            </summary>
+            <remarks>
+            <para>
+            The filter admits two options <see cref="P:log4net.Filter.LevelMatchFilter.LevelToMatch"/> and
+            <see cref="P:log4net.Filter.LevelMatchFilter.AcceptOnMatch"/>. If there is an exact match between the value
+            of the <see cref="P:log4net.Filter.LevelMatchFilter.LevelToMatch"/> option and the <see cref="T:log4net.Core.Level"/> of the 
+            <see cref="T:log4net.Core.LoggingEvent"/>, then the <see cref="M:log4net.Filter.LevelMatchFilter.Decide(log4net.Core.LoggingEvent)"/> method returns <see cref="F:log4net.Filter.FilterDecision.Accept"/> in 
+            case the <see cref="P:log4net.Filter.LevelMatchFilter.AcceptOnMatch"/> option value is set
+            to <c>true</c>, if it is <c>false</c> then 
+            <see cref="F:log4net.Filter.FilterDecision.Deny"/> is returned. If the <see cref="T:log4net.Core.Level"/> does not match then
+            the result will be <see cref="F:log4net.Filter.FilterDecision.Neutral"/>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="F:log4net.Filter.LevelMatchFilter.m_acceptOnMatch">
+            <summary>
+            flag to indicate if the filter should <see cref="F:log4net.Filter.FilterDecision.Accept"/> on a match
+            </summary>
+        </member>
+        <member name="F:log4net.Filter.LevelMatchFilter.m_levelToMatch">
+            <summary>
+            the <see cref="T:log4net.Core.Level"/> to match against
+            </summary>
+        </member>
+        <member name="M:log4net.Filter.LevelMatchFilter.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:log4net.Filter.LevelMatchFilter.Decide(log4net.Core.LoggingEvent)">
+            <summary>
+            Tests if the <see cref="T:log4net.Core.Level"/> of the logging event matches that of the filter
+            </summary>
+            <param name="loggingEvent">the event to filter</param>
+            <returns>see remarks</returns>
+            <remarks>
+            <para>
+            If the <see cref="T:log4net.Core.Level"/> of the event matches the level of the
+            filter then the result of the function depends on the
+            value of <see cref="P:log4net.Filter.LevelMatchFilter.AcceptOnMatch"/>. If it is true then
+            the function will return <see cref="F:log4net.Filter.FilterDecision.Accept"/>, it it is false then it
+            will return <see cref="F:log4net.Filter.FilterDecision.Deny"/>. If the <see cref="T:log4net.Core.Level"/> does not match then
+            the result will be <see cref="F:log4net.Filter.FilterDecision.Neutral"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Filter.LevelMatchFilter.AcceptOnMatch">
+            <summary>
+            <see cref="F:log4net.Filter.FilterDecision.Accept"/> when matching <see cref="P:log4net.Filter.LevelMatchFilter.LevelToMatch"/>
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="P:log4net.Filter.LevelMatchFilter.AcceptOnMatch"/> property is a flag that determines
+            the behavior when a matching <see cref="T:log4net.Core.Level"/> is found. If the
+            flag is set to true then the filter will <see cref="F:log4net.Filter.FilterDecision.Accept"/> the 
+            logging event, otherwise it will <see cref="F:log4net.Filter.FilterDecision.Deny"/> the event.
+            </para>
+            <para>
+            The default is <c>true</c> i.e. to <see cref="F:log4net.Filter.FilterDecision.Accept"/> the event.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Filter.LevelMatchFilter.LevelToMatch">
+            <summary>
+            The <see cref="T:log4net.Core.Level"/> that the filter will match
+            </summary>
+            <remarks>
+            <para>
+            The level that this filter will attempt to match against the 
+            <see cref="T:log4net.Core.LoggingEvent"/> level. If a match is found then
+            the result depends on the value of <see cref="P:log4net.Filter.LevelMatchFilter.AcceptOnMatch"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Filter.LevelRangeFilter">
+            <summary>
+            This is a simple filter based on <see cref="T:log4net.Core.Level"/> matching.
+            </summary>
+            <remarks>
+            <para>
+            The filter admits three options <see cref="P:log4net.Filter.LevelRangeFilter.LevelMin"/> and <see cref="P:log4net.Filter.LevelRangeFilter.LevelMax"/>
+            that determine the range of priorities that are matched, and
+            <see cref="P:log4net.Filter.LevelRangeFilter.AcceptOnMatch"/>. If there is a match between the range
+            of priorities and the <see cref="T:log4net.Core.Level"/> of the <see cref="T:log4net.Core.LoggingEvent"/>, then the 
+            <see cref="M:log4net.Filter.LevelRangeFilter.Decide(log4net.Core.LoggingEvent)"/> method returns <see cref="F:log4net.Filter.FilterDecision.Accept"/> in case the <see cref="P:log4net.Filter.LevelRangeFilter.AcceptOnMatch"/> 
+            option value is set to <c>true</c>, if it is <c>false</c>
+            then <see cref="F:log4net.Filter.FilterDecision.Deny"/> is returned. If there is no match, <see cref="F:log4net.Filter.FilterDecision.Deny"/> is returned.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="F:log4net.Filter.LevelRangeFilter.m_acceptOnMatch">
+            <summary>
+            Flag to indicate the behavior when matching a <see cref="T:log4net.Core.Level"/>
+            </summary>
+        </member>
+        <member name="F:log4net.Filter.LevelRangeFilter.m_levelMin">
+            <summary>
+            the minimum <see cref="T:log4net.Core.Level"/> value to match
+            </summary>
+        </member>
+        <member name="F:log4net.Filter.LevelRangeFilter.m_levelMax">
+            <summary>
+            the maximum <see cref="T:log4net.Core.Level"/> value to match
+            </summary>
+        </member>
+        <member name="M:log4net.Filter.LevelRangeFilter.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:log4net.Filter.LevelRangeFilter.Decide(log4net.Core.LoggingEvent)">
+            <summary>
+            Check if the event should be logged.
+            </summary>
+            <param name="loggingEvent">the logging event to check</param>
+            <returns>see remarks</returns>
+            <remarks>
+            <para>
+            If the <see cref="T:log4net.Core.Level"/> of the logging event is outside the range
+            matched by this filter then <see cref="F:log4net.Filter.FilterDecision.Deny"/>
+            is returned. If the <see cref="T:log4net.Core.Level"/> is matched then the value of
+            <see cref="P:log4net.Filter.LevelRangeFilter.AcceptOnMatch"/> is checked. If it is true then
+            <see cref="F:log4net.Filter.FilterDecision.Accept"/> is returned, otherwise
+            <see cref="F:log4net.Filter.FilterDecision.Neutral"/> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Filter.LevelRangeFilter.AcceptOnMatch">
+            <summary>
+            <see cref="F:log4net.Filter.FilterDecision.Accept"/> when matching <see cref="P:log4net.Filter.LevelRangeFilter.LevelMin"/> and <see cref="P:log4net.Filter.LevelRangeFilter.LevelMax"/>
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="P:log4net.Filter.LevelRangeFilter.AcceptOnMatch"/> property is a flag that determines
+            the behavior when a matching <see cref="T:log4net.Core.Level"/> is found. If the
+            flag is set to true then the filter will <see cref="F:log4net.Filter.FilterDecision.Accept"/> the 
+            logging event, otherwise it will <see cref="F:log4net.Filter.FilterDecision.Neutral"/> the event.
+            </para>
+            <para>
+            The default is <c>true</c> i.e. to <see cref="F:log4net.Filter.FilterDecision.Accept"/> the event.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Filter.LevelRangeFilter.LevelMin">
+            <summary>
+            Set the minimum matched <see cref="T:log4net.Core.Level"/>
+            </summary>
+            <remarks>
+            <para>
+            The minimum level that this filter will attempt to match against the 
+            <see cref="T:log4net.Core.LoggingEvent"/> level. If a match is found then
+            the result depends on the value of <see cref="P:log4net.Filter.LevelRangeFilter.AcceptOnMatch"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Filter.LevelRangeFilter.LevelMax">
+            <summary>
+            Sets the maximum matched <see cref="T:log4net.Core.Level"/>
+            </summary>
+            <remarks>
+            <para>
+            The maximum level that this filter will attempt to match against the 
+            <see cref="T:log4net.Core.LoggingEvent"/> level. If a match is found then
+            the result depends on the value of <see cref="P:log4net.Filter.LevelRangeFilter.AcceptOnMatch"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Filter.LoggerMatchFilter">
+            <summary>
+            Simple filter to match a string in the event's logger name.
+            </summary>
+            <remarks>
+            <para>
+            The works very similar to the <see cref="T:log4net.Filter.LevelMatchFilter"/>. It admits two 
+            options <see cref="P:log4net.Filter.LoggerMatchFilter.LoggerToMatch"/> and <see cref="P:log4net.Filter.LoggerMatchFilter.AcceptOnMatch"/>. If the 
+            <see cref="P:log4net.Core.LoggingEvent.LoggerName"/> of the <see cref="T:log4net.Core.LoggingEvent"/> starts 
+            with the value of the <see cref="P:log4net.Filter.LoggerMatchFilter.LoggerToMatch"/> option, then the 
+            <see cref="M:log4net.Filter.LoggerMatchFilter.Decide(log4net.Core.LoggingEvent)"/> method returns <see cref="F:log4net.Filter.FilterDecision.Accept"/> in 
+            case the <see cref="P:log4net.Filter.LoggerMatchFilter.AcceptOnMatch"/> option value is set to <c>true</c>, 
+            if it is <c>false</c> then <see cref="F:log4net.Filter.FilterDecision.Deny"/> is returned.
+            </para>
+            </remarks>
+            <author>Daniel Cazzulino</author>
+        </member>
+        <member name="F:log4net.Filter.LoggerMatchFilter.m_acceptOnMatch">
+            <summary>
+            Flag to indicate the behavior when we have a match
+            </summary>
+        </member>
+        <member name="F:log4net.Filter.LoggerMatchFilter.m_loggerToMatch">
+            <summary>
+            The logger name string to substring match against the event
+            </summary>
+        </member>
+        <member name="M:log4net.Filter.LoggerMatchFilter.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:log4net.Filter.LoggerMatchFilter.Decide(log4net.Core.LoggingEvent)">
+            <summary>
+            Check if this filter should allow the event to be logged
+            </summary>
+            <param name="loggingEvent">the event being logged</param>
+            <returns>see remarks</returns>
+            <remarks>
+            <para>
+            The rendered message is matched against the <see cref="P:log4net.Filter.LoggerMatchFilter.LoggerToMatch"/>.
+            If the <see cref="P:log4net.Filter.LoggerMatchFilter.LoggerToMatch"/> equals the beginning of 
+            the incoming <see cref="P:log4net.Core.LoggingEvent.LoggerName"/> (<see cref="M:System.String.StartsWith(System.String)"/>)
+            then a match will have occurred. If no match occurs
+            this function will return <see cref="F:log4net.Filter.FilterDecision.Neutral"/>
+            allowing other filters to check the event. If a match occurs then
+            the value of <see cref="P:log4net.Filter.LoggerMatchFilter.AcceptOnMatch"/> is checked. If it is
+            true then <see cref="F:log4net.Filter.FilterDecision.Accept"/> is returned otherwise
+            <see cref="F:log4net.Filter.FilterDecision.Deny"/> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Filter.LoggerMatchFilter.AcceptOnMatch">
+            <summary>
+            <see cref="F:log4net.Filter.FilterDecision.Accept"/> when matching <see cref="P:log4net.Filter.LoggerMatchFilter.LoggerToMatch"/>
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="P:log4net.Filter.LoggerMatchFilter.AcceptOnMatch"/> property is a flag that determines
+            the behavior when a matching <see cref="T:log4net.Core.Level"/> is found. If the
+            flag is set to true then the filter will <see cref="F:log4net.Filter.FilterDecision.Accept"/> the 
+            logging event, otherwise it will <see cref="F:log4net.Filter.FilterDecision.Deny"/> the event.
+            </para>
+            <para>
+            The default is <c>true</c> i.e. to <see cref="F:log4net.Filter.FilterDecision.Accept"/> the event.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Filter.LoggerMatchFilter.LoggerToMatch">
+            <summary>
+            The <see cref="P:log4net.Core.LoggingEvent.LoggerName"/> that the filter will match
+            </summary>
+            <remarks>
+            <para>
+            This filter will attempt to match this value against logger name in
+            the following way. The match will be done against the beginning of the
+            logger name (using <see cref="M:System.String.StartsWith(System.String)"/>). The match is
+            case sensitive. If a match is found then
+            the result depends on the value of <see cref="P:log4net.Filter.LoggerMatchFilter.AcceptOnMatch"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Filter.MdcFilter">
+            <summary>
+            Simple filter to match a keyed string in the <see cref="T:log4net.MDC"/>
+            </summary>
+            <remarks>
+            <para>
+            Simple filter to match a keyed string in the <see cref="T:log4net.MDC"/>
+            </para>
+            <para>
+            As the MDC has been replaced with layered properties the
+            <see cref="T:log4net.Filter.PropertyFilter"/> should be used instead.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Filter.PropertyFilter">
+            <summary>
+            Simple filter to match a string an event property
+            </summary>
+            <remarks>
+            <para>
+            Simple filter to match a string in the value for a
+            specific event property
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="T:log4net.Filter.StringMatchFilter">
+            <summary>
+            Simple filter to match a string in the rendered message
+            </summary>
+            <remarks>
+            <para>
+            Simple filter to match a string in the rendered message
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="F:log4net.Filter.StringMatchFilter.m_acceptOnMatch">
+            <summary>
+            Flag to indicate the behavior when we have a match
+            </summary>
+        </member>
+        <member name="F:log4net.Filter.StringMatchFilter.m_stringToMatch">
+            <summary>
+            The string to substring match against the message
+            </summary>
+        </member>
+        <member name="F:log4net.Filter.StringMatchFilter.m_stringRegexToMatch">
+            <summary>
+            A string regex to match
+            </summary>
+        </member>
+        <member name="F:log4net.Filter.StringMatchFilter.m_regexToMatch">
+            <summary>
+            A regex object to match (generated from m_stringRegexToMatch)
+            </summary>
+        </member>
+        <member name="M:log4net.Filter.StringMatchFilter.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:log4net.Filter.StringMatchFilter.ActivateOptions">
+            <summary>
+            Initialize and precompile the Regex if required
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Filter.StringMatchFilter.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Filter.StringMatchFilter.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Filter.StringMatchFilter.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Filter.StringMatchFilter.Decide(log4net.Core.LoggingEvent)">
+            <summary>
+            Check if this filter should allow the event to be logged
+            </summary>
+            <param name="loggingEvent">the event being logged</param>
+            <returns>see remarks</returns>
+            <remarks>
+            <para>
+            The rendered message is matched against the <see cref="P:log4net.Filter.StringMatchFilter.StringToMatch"/>.
+            If the <see cref="P:log4net.Filter.StringMatchFilter.StringToMatch"/> occurs as a substring within
+            the message then a match will have occurred. If no match occurs
+            this function will return <see cref="F:log4net.Filter.FilterDecision.Neutral"/>
+            allowing other filters to check the event. If a match occurs then
+            the value of <see cref="P:log4net.Filter.StringMatchFilter.AcceptOnMatch"/> is checked. If it is
+            true then <see cref="F:log4net.Filter.FilterDecision.Accept"/> is returned otherwise
+            <see cref="F:log4net.Filter.FilterDecision.Deny"/> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Filter.StringMatchFilter.AcceptOnMatch">
+            <summary>
+            <see cref="F:log4net.Filter.FilterDecision.Accept"/> when matching <see cref="P:log4net.Filter.StringMatchFilter.StringToMatch"/> or <see cref="P:log4net.Filter.StringMatchFilter.RegexToMatch"/>
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="P:log4net.Filter.StringMatchFilter.AcceptOnMatch"/> property is a flag that determines
+            the behavior when a matching <see cref="T:log4net.Core.Level"/> is found. If the
+            flag is set to true then the filter will <see cref="F:log4net.Filter.FilterDecision.Accept"/> the 
+            logging event, otherwise it will <see cref="F:log4net.Filter.FilterDecision.Neutral"/> the event.
+            </para>
+            <para>
+            The default is <c>true</c> i.e. to <see cref="F:log4net.Filter.FilterDecision.Accept"/> the event.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Filter.StringMatchFilter.StringToMatch">
+            <summary>
+            Sets the static string to match
+            </summary>
+            <remarks>
+            <para>
+            The string that will be substring matched against
+            the rendered message. If the message contains this
+            string then the filter will match. If a match is found then
+            the result depends on the value of <see cref="P:log4net.Filter.StringMatchFilter.AcceptOnMatch"/>.
+            </para>
+            <para>
+            One of <see cref="P:log4net.Filter.StringMatchFilter.StringToMatch"/> or <see cref="P:log4net.Filter.StringMatchFilter.RegexToMatch"/>
+            must be specified.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Filter.StringMatchFilter.RegexToMatch">
+            <summary>
+            Sets the regular expression to match
+            </summary>
+            <remarks>
+            <para>
+            The regular expression pattern that will be matched against
+            the rendered message. If the message matches this
+            pattern then the filter will match. If a match is found then
+            the result depends on the value of <see cref="P:log4net.Filter.StringMatchFilter.AcceptOnMatch"/>.
+            </para>
+            <para>
+            One of <see cref="P:log4net.Filter.StringMatchFilter.StringToMatch"/> or <see cref="P:log4net.Filter.StringMatchFilter.RegexToMatch"/>
+            must be specified.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Filter.PropertyFilter.m_key">
+            <summary>
+            The key to use to lookup the string from the event properties
+            </summary>
+        </member>
+        <member name="M:log4net.Filter.PropertyFilter.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:log4net.Filter.PropertyFilter.Decide(log4net.Core.LoggingEvent)">
+            <summary>
+            Check if this filter should allow the event to be logged
+            </summary>
+            <param name="loggingEvent">the event being logged</param>
+            <returns>see remarks</returns>
+            <remarks>
+            <para>
+            The event property for the <see cref="P:log4net.Filter.PropertyFilter.Key"/> is matched against 
+            the <see cref="P:log4net.Filter.StringMatchFilter.StringToMatch"/>.
+            If the <see cref="P:log4net.Filter.StringMatchFilter.StringToMatch"/> occurs as a substring within
+            the property value then a match will have occurred. If no match occurs
+            this function will return <see cref="F:log4net.Filter.FilterDecision.Neutral"/>
+            allowing other filters to check the event. If a match occurs then
+            the value of <see cref="P:log4net.Filter.StringMatchFilter.AcceptOnMatch"/> is checked. If it is
+            true then <see cref="F:log4net.Filter.FilterDecision.Accept"/> is returned otherwise
+            <see cref="F:log4net.Filter.FilterDecision.Deny"/> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Filter.PropertyFilter.Key">
+            <summary>
+            The key to lookup in the event properties and then match against.
+            </summary>
+            <remarks>
+            <para>
+            The key name to use to lookup in the properties map of the
+            <see cref="T:log4net.Core.LoggingEvent"/>. The match will be performed against 
+            the value of this property if it exists.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Filter.NdcFilter">
+            <summary>
+            Simple filter to match a string in the <see cref="T:log4net.NDC"/>
+            </summary>
+            <remarks>
+            <para>
+            Simple filter to match a string in the <see cref="T:log4net.NDC"/>
+            </para>
+            <para>
+            As the MDC has been replaced with named stacks stored in the
+            properties collections the <see cref="T:log4net.Filter.PropertyFilter"/> should 
+            be used instead.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Filter.NdcFilter.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Sets the <see cref="P:log4net.Filter.PropertyFilter.Key"/> to <c>"NDC"</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.AppDomainPatternConverter">
+            <summary>
+            Write the event appdomain name to the output
+            </summary>
+            <remarks>
+            <para>
+            Writes the <see cref="P:log4net.Core.LoggingEvent.Domain"/> to the output writer.
+            </para>
+            </remarks>
+            <author>Daniel Cazzulino</author>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="T:log4net.Layout.Pattern.PatternLayoutConverter">
+            <summary>
+            Abstract class that provides the formatting functionality that 
+            derived classes need.
+            </summary>
+            <remarks>
+            Conversion specifiers in a conversion patterns are parsed to
+            individual PatternConverters. Each of which is responsible for
+            converting a logging event in a converter specific manner.
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="T:log4net.Util.PatternConverter">
+            <summary>
+            Abstract class that provides the formatting functionality that 
+            derived classes need.
+            </summary>
+            <remarks>
+            <para>
+            Conversion specifiers in a conversion patterns are parsed to
+            individual PatternConverters. Each of which is responsible for
+            converting a logging event in a converter specific manner.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="F:log4net.Util.PatternConverter.c_renderBufferSize">
+            <summary>
+            Initial buffer size
+            </summary>
+        </member>
+        <member name="F:log4net.Util.PatternConverter.c_renderBufferMaxCapacity">
+            <summary>
+            Maximum buffer size before it is recycled
+            </summary>
+        </member>
+        <member name="M:log4net.Util.PatternConverter.#ctor">
+            <summary>
+            Protected constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.PatternConverter"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternConverter.Convert(System.IO.TextWriter,System.Object)">
+            <summary>
+            Evaluate this pattern converter and write the output to a writer.
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="state">The state object on which the pattern converter should be executed.</param>
+            <remarks>
+            <para>
+            Derived pattern converters must override this method in order to
+            convert conversion specifiers in the appropriate way.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternConverter.SetNext(log4net.Util.PatternConverter)">
+            <summary>
+            Set the next pattern converter in the chains
+            </summary>
+            <param name="patternConverter">the pattern converter that should follow this converter in the chain</param>
+            <returns>the next converter</returns>
+            <remarks>
+            <para>
+            The PatternConverter can merge with its neighbor during this method (or a sub class).
+            Therefore the return value may or may not be the value of the argument passed in.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternConverter.Format(System.IO.TextWriter,System.Object)">
+            <summary>
+            Write the pattern converter to the writer with appropriate formatting
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="state">The state object on which the pattern converter should be executed.</param>
+            <remarks>
+            <para>
+            This method calls <see cref="M:log4net.Util.PatternConverter.Convert(System.IO.TextWriter,System.Object)"/> to allow the subclass to perform
+            appropriate conversion of the pattern converter. If formatting options have
+            been specified via the <see cref="P:log4net.Util.PatternConverter.FormattingInfo"/> then this method will
+            apply those formattings before writing the output.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternConverter.SpacePad(System.IO.TextWriter,System.Int32)">
+            <summary>
+            Fast space padding method.
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> to which the spaces will be appended.</param>
+            <param name="length">The number of spaces to be padded.</param>
+            <remarks>
+            <para>
+            Fast space padding method.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.PatternConverter.m_option">
+            <summary>
+            The option string to the converter
+            </summary>
+        </member>
+        <member name="M:log4net.Util.PatternConverter.WriteDictionary(System.IO.TextWriter,log4net.Repository.ILoggerRepository,System.Collections.IDictionary)">
+            <summary>
+            Write an dictionary to a <see cref="T:System.IO.TextWriter"/>
+            </summary>
+            <param name="writer">the writer to write to</param>
+            <param name="repository">a <see cref="T:log4net.Repository.ILoggerRepository"/> to use for object conversion</param>
+            <param name="value">the value to write to the writer</param>
+            <remarks>
+            <para>
+            Writes the <see cref="T:System.Collections.IDictionary"/> to a writer in the form:
+            </para>
+            <code>
+            {key1=value1, key2=value2, key3=value3}
+            </code>
+            <para>
+            If the <see cref="T:log4net.Repository.ILoggerRepository"/> specified
+            is not null then it is used to render the key and value to text, otherwise
+            the object's ToString method is called.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternConverter.WriteObject(System.IO.TextWriter,log4net.Repository.ILoggerRepository,System.Object)">
+            <summary>
+            Write an object to a <see cref="T:System.IO.TextWriter"/>
+            </summary>
+            <param name="writer">the writer to write to</param>
+            <param name="repository">a <see cref="T:log4net.Repository.ILoggerRepository"/> to use for object conversion</param>
+            <param name="value">the value to write to the writer</param>
+            <remarks>
+            <para>
+            Writes the Object to a writer. If the <see cref="T:log4net.Repository.ILoggerRepository"/> specified
+            is not null then it is used to render the object to text, otherwise
+            the object's ToString method is called.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.PatternConverter.Next">
+            <summary>
+            Get the next pattern converter in the chain
+            </summary>
+            <value>
+            the next pattern converter in the chain
+            </value>
+            <remarks>
+            <para>
+            Get the next pattern converter in the chain
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.PatternConverter.FormattingInfo">
+            <summary>
+            Gets or sets the formatting info for this converter
+            </summary>
+            <value>
+            The formatting info for this converter
+            </value>
+            <remarks>
+            <para>
+            Gets or sets the formatting info for this converter
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.PatternConverter.Option">
+            <summary>
+            Gets or sets the option value for this converter
+            </summary>
+            <summary>
+            The option for this converter
+            </summary>
+            <remarks>
+            <para>
+            Gets or sets the option value for this converter
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.Pattern.PatternLayoutConverter.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Layout.Pattern.PatternLayoutConverter"/> class.
+            </summary>
+        </member>
+        <member name="M:log4net.Layout.Pattern.PatternLayoutConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Derived pattern converters must override this method in order to
+            convert conversion specifiers in the correct way.
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">The <see cref="T:log4net.Core.LoggingEvent"/> on which the pattern converter should be executed.</param>
+        </member>
+        <member name="M:log4net.Layout.Pattern.PatternLayoutConverter.Convert(System.IO.TextWriter,System.Object)">
+            <summary>
+            Derived pattern converters must override this method in order to
+            convert conversion specifiers in the correct way.
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="state">The state object on which the pattern converter should be executed.</param>
+        </member>
+        <member name="F:log4net.Layout.Pattern.PatternLayoutConverter.m_ignoresException">
+            <summary>
+            Flag indicating if this converter handles exceptions
+            </summary>
+            <remarks>
+            <c>false</c> if this converter handles exceptions
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.Pattern.PatternLayoutConverter.IgnoresException">
+            <summary>
+            Flag indicating if this converter handles the logging event exception
+            </summary>
+            <value><c>false</c> if this converter handles the logging event exception</value>
+            <remarks>
+            <para>
+            If this converter handles the exception object contained within
+            <see cref="T:log4net.Core.LoggingEvent"/>, then this property should be set to
+            <c>false</c>. Otherwise, if the layout ignores the exception
+            object, then the property should be set to <c>true</c>.
+            </para>
+            <para>
+            Set this value to override a this default setting. The default
+            value is <c>true</c>, this converter does not handle the exception.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.Pattern.AppDomainPatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Write the event appdomain name to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            Writes the <see cref="P:log4net.Core.LoggingEvent.Domain"/> to the output <paramref name="writer"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.DatePatternConverter">
+            <summary>
+            Date pattern converter, uses a <see cref="T:log4net.DateFormatter.IDateFormatter"/> to format 
+            the date of a <see cref="T:log4net.Core.LoggingEvent"/>.
+            </summary>
+            <remarks>
+            <para>
+            Render the <see cref="P:log4net.Core.LoggingEvent.TimeStamp"/> to the writer as a string.
+            </para>
+            <para>
+            The value of the <see cref="P:log4net.Util.PatternConverter.Option"/> determines 
+            the formatting of the date. The following values are allowed:
+            <list type="definition">
+            	<listheader>
+            		<term>Option value</term>
+            		<description>Output</description>
+            	</listheader>
+            	<item>
+            		<term>ISO8601</term>
+            		<description>
+            		Uses the <see cref="T:log4net.DateFormatter.Iso8601DateFormatter"/> formatter. 
+            		Formats using the <c>"yyyy-MM-dd HH:mm:ss,fff"</c> pattern.
+            		</description>
+            	</item>
+            	<item>
+            		<term>DATE</term>
+            		<description>
+            		Uses the <see cref="T:log4net.DateFormatter.DateTimeDateFormatter"/> formatter. 
+            		Formats using the <c>"dd MMM yyyy HH:mm:ss,fff"</c> for example, <c>"06 Nov 1994 15:49:37,459"</c>.
+            		</description>
+            	</item>
+            	<item>
+            		<term>ABSOLUTE</term>
+            		<description>
+            		Uses the <see cref="T:log4net.DateFormatter.AbsoluteTimeDateFormatter"/> formatter. 
+            		Formats using the <c>"HH:mm:ss,yyyy"</c> for example, <c>"15:49:37,459"</c>.
+            		</description>
+            	</item>
+            	<item>
+            		<term>other</term>
+            		<description>
+            		Any other pattern string uses the <see cref="T:log4net.DateFormatter.SimpleDateFormatter"/> formatter. 
+            		This formatter passes the pattern string to the <see cref="T:System.DateTime"/> 
+            		<see cref="M:System.DateTime.ToString(System.String)"/> method.
+            		For details on valid patterns see 
+            		<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemglobalizationdatetimeformatinfoclasstopic.asp">DateTimeFormatInfo Class</a>.
+            		</description>
+            	</item>
+            </list>
+            </para>
+            <para>
+            The <see cref="P:log4net.Core.LoggingEvent.TimeStamp"/> is in the local time zone and is rendered in that zone.
+            To output the time in Universal time see <see cref="T:log4net.Layout.Pattern.UtcDatePatternConverter"/>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Layout.Pattern.DatePatternConverter.m_dateFormatter">
+            <summary>
+            The <see cref="T:log4net.DateFormatter.IDateFormatter"/> used to render the date to a string
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.DateFormatter.IDateFormatter"/> used to render the date to a string
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.Pattern.DatePatternConverter.ActivateOptions">
+            <summary>
+            Initialize the converter pattern based on the <see cref="P:log4net.Util.PatternConverter.Option"/> property.
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Layout.Pattern.DatePatternConverter.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Layout.Pattern.DatePatternConverter.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Layout.Pattern.DatePatternConverter.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.Pattern.DatePatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Convert the pattern into the rendered message
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            Pass the <see cref="P:log4net.Core.LoggingEvent.TimeStamp"/> to the <see cref="T:log4net.DateFormatter.IDateFormatter"/>
+            for it to render it to the writer.
+            </para>
+            <para>
+            The <see cref="P:log4net.Core.LoggingEvent.TimeStamp"/> passed is in the local time zone.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.ExceptionPatternConverter">
+            <summary>
+            Write the exception text to the output
+            </summary>
+            <remarks>
+            <para>
+            If an exception object is stored in the logging event
+            it will be rendered into the pattern output with a
+            trailing newline.
+            </para>
+            <para>
+            If there is no exception then nothing will be output
+            and no trailing newline will be appended.
+            It is typical to put a newline before the exception
+            and to have the exception as the last data in the pattern.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.ExceptionPatternConverter.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:log4net.Layout.Pattern.ExceptionPatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Write the exception text to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            If an exception object is stored in the logging event
+            it will be rendered into the pattern output with a
+            trailing newline.
+            </para>
+            <para>
+            If there is no exception then nothing will be output
+            and no trailing newline will be appended.
+            It is typical to put a newline before the exception
+            and to have the exception as the last data in the pattern.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.FileLocationPatternConverter">
+            <summary>
+            Writes the caller location file name to the output
+            </summary>
+            <remarks>
+            <para>
+            Writes the value of the <see cref="P:log4net.Core.LocationInfo.FileName"/> for
+            the event to the output writer.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.FileLocationPatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Write the caller location file name to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            Writes the value of the <see cref="P:log4net.Core.LocationInfo.FileName"/> for
+            the <paramref name="loggingEvent"/> to the output <paramref name="writer"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.FullLocationPatternConverter">
+            <summary>
+            Write the caller location info to the output
+            </summary>
+            <remarks>
+            <para>
+            Writes the <see cref="P:log4net.Core.LocationInfo.FullInfo"/> to the output writer.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.FullLocationPatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Write the caller location info to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            Writes the <see cref="P:log4net.Core.LocationInfo.FullInfo"/> to the output writer.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.IdentityPatternConverter">
+            <summary>
+            Writes the event identity to the output
+            </summary>
+            <remarks>
+            <para>
+            Writes the value of the <see cref="P:log4net.Core.LoggingEvent.Identity"/> to
+            the output writer.
+            </para>
+            </remarks>
+            <author>Daniel Cazzulino</author>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.IdentityPatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Writes the event identity to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            Writes the value of the <paramref name="loggingEvent"/> 
+            <see cref="P:log4net.Core.LoggingEvent.Identity"/> to
+            the output <paramref name="writer"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.LevelPatternConverter">
+            <summary>
+            Write the event level to the output
+            </summary>
+            <remarks>
+            <para>
+            Writes the display name of the event <see cref="P:log4net.Core.LoggingEvent.Level"/>
+            to the writer.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.LevelPatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Write the event level to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            Writes the <see cref="P:log4net.Core.Level.DisplayName"/> of the <paramref name="loggingEvent"/> <see cref="P:log4net.Core.LoggingEvent.Level"/>
+            to the <paramref name="writer"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.LineLocationPatternConverter">
+            <summary>
+            Write the caller location line number to the output
+            </summary>
+            <remarks>
+            <para>
+            Writes the value of the <see cref="P:log4net.Core.LocationInfo.LineNumber"/> for
+            the event to the output writer.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.LineLocationPatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Write the caller location line number to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            Writes the value of the <see cref="P:log4net.Core.LocationInfo.LineNumber"/> for
+            the <paramref name="loggingEvent"/> to the output <paramref name="writer"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.LoggerPatternConverter">
+            <summary>
+            Converter for logger name
+            </summary>
+            <remarks>
+            <para>
+            Outputs the <see cref="P:log4net.Core.LoggingEvent.LoggerName"/> of the event.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="T:log4net.Layout.Pattern.NamedPatternConverter">
+            <summary>
+            Converter to output and truncate <c>'.'</c> separated strings
+            </summary>
+            <remarks>
+            <para>
+            This abstract class supports truncating a <c>'.'</c> separated string
+            to show a specified number of elements from the right hand side.
+            This is used to truncate class names that are fully qualified.
+            </para>
+            <para>
+            Subclasses should override the <see cref="M:log4net.Layout.Pattern.NamedPatternConverter.GetFullyQualifiedName(log4net.Core.LoggingEvent)"/> method to
+            return the fully qualified string.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.NamedPatternConverter.ActivateOptions">
+            <summary>
+            Initialize the converter 
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Layout.Pattern.NamedPatternConverter.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Layout.Pattern.NamedPatternConverter.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Layout.Pattern.NamedPatternConverter.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.Pattern.NamedPatternConverter.GetFullyQualifiedName(log4net.Core.LoggingEvent)">
+            <summary>
+            Get the fully qualified string data
+            </summary>
+            <param name="loggingEvent">the event being logged</param>
+            <returns>the fully qualified name</returns>
+            <remarks>
+            <para>
+            Overridden by subclasses to get the fully qualified name before the
+            precision is applied to it.
+            </para>
+            <para>
+            Return the fully qualified <c>'.'</c> (dot/period) separated string.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.Pattern.NamedPatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Convert the pattern to the rendered message
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            Render the <see cref="M:log4net.Layout.Pattern.NamedPatternConverter.GetFullyQualifiedName(log4net.Core.LoggingEvent)"/> to the precision
+            specified by the <see cref="P:log4net.Util.PatternConverter.Option"/> property.
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.Pattern.LoggerPatternConverter.GetFullyQualifiedName(log4net.Core.LoggingEvent)">
+            <summary>
+            Gets the fully qualified name of the logger
+            </summary>
+            <param name="loggingEvent">the event being logged</param>
+            <returns>The fully qualified logger name</returns>
+            <remarks>
+            <para>
+            Returns the <see cref="P:log4net.Core.LoggingEvent.LoggerName"/> of the <paramref name="loggingEvent"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.MessagePatternConverter">
+            <summary>
+            Writes the event message to the output
+            </summary>
+            <remarks>
+            <para>
+            Uses the <see cref="M:log4net.Core.LoggingEvent.WriteRenderedMessage(System.IO.TextWriter)"/> method
+            to write out the event message.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.MessagePatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Writes the event message to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            Uses the <see cref="M:log4net.Core.LoggingEvent.WriteRenderedMessage(System.IO.TextWriter)"/> method
+            to write out the event message.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.MethodLocationPatternConverter">
+            <summary>
+            Write the method name to the output
+            </summary>
+            <remarks>
+            <para>
+            Writes the caller location <see cref="P:log4net.Core.LocationInfo.MethodName"/> to
+            the output.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.MethodLocationPatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Write the method name to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            Writes the caller location <see cref="P:log4net.Core.LocationInfo.MethodName"/> to
+            the output.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.NdcPatternConverter">
+            <summary>
+            Converter to include event NDC
+            </summary>
+            <remarks>
+            <para>
+            Outputs the value of the event property named <c>NDC</c>.
+            </para>
+            <para>
+            The <see cref="T:log4net.Layout.Pattern.PropertyPatternConverter"/> should be used instead.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.NdcPatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Write the event NDC to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            As the thread context stacks are now stored in named event properties
+            this converter simply looks up the value of the <c>NDC</c> property.
+            </para>
+            <para>
+            The <see cref="T:log4net.Layout.Pattern.PropertyPatternConverter"/> should be used instead.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.PropertyPatternConverter">
+            <summary>
+            Property pattern converter
+            </summary>
+            <remarks>
+            <para>
+            Writes out the value of a named property. The property name
+            should be set in the <see cref="P:log4net.Util.PatternConverter.Option"/>
+            property.
+            </para>
+            <para>
+            If the <see cref="P:log4net.Util.PatternConverter.Option"/> is set to <c>null</c>
+            then all the properties are written as key value pairs.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.PropertyPatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Write the property value to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            Writes out the value of a named property. The property name
+            should be set in the <see cref="P:log4net.Util.PatternConverter.Option"/>
+            property.
+            </para>
+            <para>
+            If the <see cref="P:log4net.Util.PatternConverter.Option"/> is set to <c>null</c>
+            then all the properties are written as key value pairs.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.RelativeTimePatternConverter">
+            <summary>
+            Converter to output the relative time of the event
+            </summary>
+            <remarks>
+            <para>
+            Converter to output the time of the event relative to the start of the program.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.RelativeTimePatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Write the relative time to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            Writes out the relative time of the event in milliseconds.
+            That is the number of milliseconds between the event <see cref="P:log4net.Core.LoggingEvent.TimeStamp"/>
+            and the <see cref="P:log4net.Core.LoggingEvent.StartTime"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.Pattern.RelativeTimePatternConverter.TimeDifferenceInMillis(System.DateTime,System.DateTime)">
+            <summary>
+            Helper method to get the time difference between two DateTime objects
+            </summary>
+            <param name="start">start time (in the current local time zone)</param>
+            <param name="end">end time (in the current local time zone)</param>
+            <returns>the time difference in milliseconds</returns>
+        </member>
+        <member name="T:log4net.Layout.Pattern.ThreadPatternConverter">
+            <summary>
+            Converter to include event thread name
+            </summary>
+            <remarks>
+            <para>
+            Writes the <see cref="P:log4net.Core.LoggingEvent.ThreadName"/> to the output.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.ThreadPatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Write the ThreadName to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            Writes the <see cref="P:log4net.Core.LoggingEvent.ThreadName"/> to the <paramref name="writer"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.TypeNamePatternConverter">
+            <summary>
+            Pattern converter for the class name
+            </summary>
+            <remarks>
+            <para>
+            Outputs the <see cref="P:log4net.Core.LocationInfo.ClassName"/> of the event.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.TypeNamePatternConverter.GetFullyQualifiedName(log4net.Core.LoggingEvent)">
+            <summary>
+            Gets the fully qualified name of the class
+            </summary>
+            <param name="loggingEvent">the event being logged</param>
+            <returns>The fully qualified type name for the caller location</returns>
+            <remarks>
+            <para>
+            Returns the <see cref="P:log4net.Core.LocationInfo.ClassName"/> of the <paramref name="loggingEvent"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Pattern.UserNamePatternConverter">
+            <summary>
+            Converter to include event user name
+            </summary>
+            <author>Douglas de la Torre</author>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.UserNamePatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Convert the pattern to the rendered message
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+        </member>
+        <member name="T:log4net.Layout.Pattern.UtcDatePatternConverter">
+            <summary>
+            Write the TimeStamp to the output
+            </summary>
+            <remarks>
+            <para>
+            Date pattern converter, uses a <see cref="T:log4net.DateFormatter.IDateFormatter"/> to format 
+            the date of a <see cref="T:log4net.Core.LoggingEvent"/>.
+            </para>
+            <para>
+            Uses a <see cref="T:log4net.DateFormatter.IDateFormatter"/> to format the <see cref="P:log4net.Core.LoggingEvent.TimeStamp"/> 
+            in Universal time.
+            </para>
+            <para>
+            See the <see cref="T:log4net.Layout.Pattern.DatePatternConverter"/> for details on the date pattern syntax.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Layout.Pattern.DatePatternConverter"/>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.Pattern.UtcDatePatternConverter.Convert(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Write the TimeStamp to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            Pass the <see cref="P:log4net.Core.LoggingEvent.TimeStamp"/> to the <see cref="T:log4net.DateFormatter.IDateFormatter"/>
+            for it to render it to the writer.
+            </para>
+            <para>
+            The <see cref="P:log4net.Core.LoggingEvent.TimeStamp"/> passed is in the local time zone, this is converted
+            to Universal time before it is rendered.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Layout.Pattern.DatePatternConverter"/>
+        </member>
+        <member name="T:log4net.Layout.ExceptionLayout">
+            <summary>
+            A Layout that renders only the Exception text from the logging event
+            </summary>
+            <remarks>
+            <para>
+            A Layout that renders only the Exception text from the logging event.
+            </para>
+            <para>
+            This Layout should only be used with appenders that utilize multiple
+            layouts (e.g. <see cref="T:log4net.Appender.AdoNetAppender"/>).
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Layout.LayoutSkeleton">
+            <summary>
+            Extend this abstract class to create your own log layout format.
+            </summary>
+            <remarks>
+            <para>
+            This is the base implementation of the <see cref="T:log4net.Layout.ILayout"/>
+            interface. Most layout objects should extend this class.
+            </para>
+            </remarks>
+            <remarks>
+            <note type="inheritinfo">
+            <para>
+            Subclasses must implement the <see cref="M:log4net.Layout.LayoutSkeleton.Format(System.IO.TextWriter,log4net.Core.LoggingEvent)"/>
+            method.
+            </para>
+            <para>
+            Subclasses should set the <see cref="P:log4net.Layout.LayoutSkeleton.IgnoresException"/> in their default
+            constructor.
+            </para>
+            </note>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Layout.ILayout">
+            <summary>
+            Interface implemented by layout objects
+            </summary>
+            <remarks>
+            <para>
+            An <see cref="T:log4net.Layout.ILayout"/> object is used to format a <see cref="T:log4net.Core.LoggingEvent"/>
+            as text. The <see cref="M:log4net.Layout.ILayout.Format(System.IO.TextWriter,log4net.Core.LoggingEvent)"/> method is called by an
+            appender to transform the <see cref="T:log4net.Core.LoggingEvent"/> into a string.
+            </para>
+            <para>
+            The layout can also supply <see cref="P:log4net.Layout.ILayout.Header"/> and <see cref="P:log4net.Layout.ILayout.Footer"/>
+            text that is appender before any events and after all the events respectively.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Layout.ILayout.Format(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Implement this method to create your own layout format.
+            </summary>
+            <param name="writer">The TextWriter to write the formatted event to</param>
+            <param name="loggingEvent">The event to format</param>
+            <remarks>
+            <para>
+            This method is called by an appender to format
+            the <paramref name="loggingEvent"/> as text and output to a writer.
+            </para>
+            <para>
+            If the caller does not have a <see cref="T:System.IO.TextWriter"/> and prefers the
+            event to be formatted as a <see cref="T:System.String"/> then the following
+            code can be used to format the event into a <see cref="T:System.IO.StringWriter"/>.
+            </para>
+            <code lang="C#">
+            StringWriter writer = new StringWriter();
+            Layout.Format(writer, loggingEvent);
+            string formattedEvent = writer.ToString();
+            </code>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.ILayout.ContentType">
+            <summary>
+            The content type output by this layout. 
+            </summary>
+            <value>The content type</value>
+            <remarks>
+            <para>
+            The content type output by this layout.
+            </para>
+            <para>
+            This is a MIME type e.g. <c>"text/plain"</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.ILayout.Header">
+            <summary>
+            The header for the layout format.
+            </summary>
+            <value>the layout header</value>
+            <remarks>
+            <para>
+            The Header text will be appended before any logging events
+            are formatted and appended.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.ILayout.Footer">
+            <summary>
+            The footer for the layout format.
+            </summary>
+            <value>the layout footer</value>
+            <remarks>
+            <para>
+            The Footer text will be appended after all the logging events
+            have been formatted and appended.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.ILayout.IgnoresException">
+            <summary>
+            Flag indicating if this layout handle exceptions
+            </summary>
+            <value><c>false</c> if this layout handles exceptions</value>
+            <remarks>
+            <para>
+            If this layout handles the exception object contained within
+            <see cref="T:log4net.Core.LoggingEvent"/>, then the layout should return
+            <c>false</c>. Otherwise, if the layout ignores the exception
+            object, then the layout should return <c>true</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Layout.LayoutSkeleton.m_header">
+            <summary>
+            The header text
+            </summary>
+            <remarks>
+            <para>
+            See <see cref="P:log4net.Layout.LayoutSkeleton.Header"/> for more information.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Layout.LayoutSkeleton.m_footer">
+            <summary>
+            The footer text
+            </summary>
+            <remarks>
+            <para>
+            See <see cref="P:log4net.Layout.LayoutSkeleton.Footer"/> for more information.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Layout.LayoutSkeleton.m_ignoresException">
+            <summary>
+            Flag indicating if this layout handles exceptions
+            </summary>
+            <remarks>
+            <para>
+            <c>false</c> if this layout handles exceptions
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.LayoutSkeleton.#ctor">
+            <summary>
+            Empty default constructor
+            </summary>
+            <remarks>
+            <para>
+            Empty default constructor
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.LayoutSkeleton.ActivateOptions">
+            <summary>
+            Activate component options
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Layout.LayoutSkeleton.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Layout.LayoutSkeleton.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Layout.LayoutSkeleton.ActivateOptions"/> must be called again.
+            </para>
+            <para>
+            This method must be implemented by the subclass.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.LayoutSkeleton.Format(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Implement this method to create your own layout format.
+            </summary>
+            <param name="writer">The TextWriter to write the formatted event to</param>
+            <param name="loggingEvent">The event to format</param>
+            <remarks>
+            <para>
+            This method is called by an appender to format
+            the <paramref name="loggingEvent"/> as text.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.LayoutSkeleton.ContentType">
+            <summary>
+            The content type output by this layout. 
+            </summary>
+            <value>The content type is <c>"text/plain"</c></value>
+            <remarks>
+            <para>
+            The content type output by this layout.
+            </para>
+            <para>
+            This base class uses the value <c>"text/plain"</c>.
+            To change this value a subclass must override this
+            property.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.LayoutSkeleton.Header">
+            <summary>
+            The header for the layout format.
+            </summary>
+            <value>the layout header</value>
+            <remarks>
+            <para>
+            The Header text will be appended before any logging events
+            are formatted and appended.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.LayoutSkeleton.Footer">
+            <summary>
+            The footer for the layout format.
+            </summary>
+            <value>the layout footer</value>
+            <remarks>
+            <para>
+            The Footer text will be appended after all the logging events
+            have been formatted and appended.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.LayoutSkeleton.IgnoresException">
+            <summary>
+            Flag indicating if this layout handles exceptions
+            </summary>
+            <value><c>false</c> if this layout handles exceptions</value>
+            <remarks>
+            <para>
+            If this layout handles the exception object contained within
+            <see cref="T:log4net.Core.LoggingEvent"/>, then the layout should return
+            <c>false</c>. Otherwise, if the layout ignores the exception
+            object, then the layout should return <c>true</c>.
+            </para>
+            <para>
+            Set this value to override a this default setting. The default
+            value is <c>true</c>, this layout does not handle the exception.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.ExceptionLayout.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Constructs a ExceptionLayout
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.ExceptionLayout.ActivateOptions">
+            <summary>
+            Activate component options
+            </summary>
+            <remarks>
+            <para>
+            Part of the <see cref="T:log4net.Core.IOptionHandler"/> component activation
+            framework.
+            </para>
+            <para>
+            This method does nothing as options become effective immediately.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.ExceptionLayout.Format(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Gets the exception text from the logging event
+            </summary>
+            <param name="writer">The TextWriter to write the formatted event to</param>
+            <param name="loggingEvent">the event being logged</param>
+            <remarks>
+            <para>
+            Write the exception string to the <see cref="T:System.IO.TextWriter"/>.
+            The exception string is retrieved from <see cref="M:log4net.Core.LoggingEvent.GetExceptionString"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.IRawLayout">
+            <summary>
+            Interface for raw layout objects
+            </summary>
+            <remarks>
+            <para>
+            Interface used to format a <see cref="T:log4net.Core.LoggingEvent"/>
+            to an object.
+            </para>
+            <para>
+            This interface should not be confused with the
+            <see cref="T:log4net.Layout.ILayout"/> interface. This interface is used in
+            only certain specialized situations where a raw object is
+            required rather than a formatted string. The <see cref="T:log4net.Layout.ILayout"/>
+            is not generally useful than this interface.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Layout.IRawLayout.Format(log4net.Core.LoggingEvent)">
+            <summary>
+            Implement this method to create your own layout format.
+            </summary>
+            <param name="loggingEvent">The event to format</param>
+            <returns>returns the formatted event</returns>
+            <remarks>
+            <para>
+            Implement this method to create your own layout format.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.Layout2RawLayoutAdapter">
+            <summary>
+            Adapts any <see cref="T:log4net.Layout.ILayout"/> to a <see cref="T:log4net.Layout.IRawLayout"/>
+            </summary>
+            <remarks>
+            <para>
+            Where an <see cref="T:log4net.Layout.IRawLayout"/> is required this adapter
+            allows a <see cref="T:log4net.Layout.ILayout"/> to be specified.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="F:log4net.Layout.Layout2RawLayoutAdapter.m_layout">
+            <summary>
+            The layout to adapt
+            </summary>
+        </member>
+        <member name="M:log4net.Layout.Layout2RawLayoutAdapter.#ctor(log4net.Layout.ILayout)">
+            <summary>
+            Construct a new adapter
+            </summary>
+            <param name="layout">the layout to adapt</param>
+            <remarks>
+            <para>
+            Create the adapter for the specified <paramref name="layout"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.Layout2RawLayoutAdapter.Format(log4net.Core.LoggingEvent)">
+            <summary>
+            Format the logging event as an object.
+            </summary>
+            <param name="loggingEvent">The event to format</param>
+            <returns>returns the formatted event</returns>
+            <remarks>
+            <para>
+            Format the logging event as an object.
+            </para>
+            <para>
+            Uses the <see cref="T:log4net.Layout.ILayout"/> object supplied to 
+            the constructor to perform the formatting.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.PatternLayout">
+            <summary>
+            A flexible layout configurable with pattern string.
+            </summary>
+            <remarks>
+            <para>
+            The goal of this class is to <see cref="M:log4net.Layout.PatternLayout.Format(System.IO.TextWriter,log4net.Core.LoggingEvent)"/> a 
+            <see cref="T:log4net.Core.LoggingEvent"/> as a string. The results
+            depend on the <i>conversion pattern</i>.
+            </para>
+            <para>
+            The conversion pattern is closely related to the conversion
+            pattern of the printf function in C. A conversion pattern is
+            composed of literal text and format control expressions called
+            <i>conversion specifiers</i>.
+            </para>
+            <para>
+            <i>You are free to insert any literal text within the conversion
+            pattern.</i>
+            </para>
+            <para>
+            Each conversion specifier starts with a percent sign (%) and is
+            followed by optional <i>format modifiers</i> and a <i>conversion
+            pattern name</i>. The conversion pattern name specifies the type of
+            data, e.g. logger, level, date, thread name. The format
+            modifiers control such things as field width, padding, left and
+            right justification. The following is a simple example.
+            </para>
+            <para>
+            Let the conversion pattern be <b>"%-5level [%thread]: %message%newline"</b> and assume
+            that the log4net environment was set to use a PatternLayout. Then the
+            statements
+            </para>
+            <code lang="C#">
+            ILog log = LogManager.GetLogger(typeof(TestApp));
+            log.Debug("Message 1");
+            log.Warn("Message 2");   
+            </code>
+            <para>would yield the output</para>
+            <code>
+            DEBUG [main]: Message 1
+            WARN  [main]: Message 2  
+            </code>
+            <para>
+            Note that there is no explicit separator between text and
+            conversion specifiers. The pattern parser knows when it has reached
+            the end of a conversion specifier when it reads a conversion
+            character. In the example above the conversion specifier
+            <b>%-5level</b> means the level of the logging event should be left
+            justified to a width of five characters.
+            </para>
+            <para>
+            The recognized conversion pattern names are:
+            </para>
+            <list type="table">
+                <listheader>
+                    <term>Conversion Pattern Name</term>
+                    <description>Effect</description>
+                </listheader>
+                <item>
+                    <term>a</term>
+                    <description>Equivalent to <b>appdomain</b></description>
+                </item>
+                <item>
+                    <term>appdomain</term>
+                    <description>
+            			Used to output the friendly name of the AppDomain where the 
+            			logging event was generated. 
+                    </description>
+                </item>
+                <item>
+                    <term>c</term>
+                    <description>Equivalent to <b>logger</b></description>
+                </item>
+                <item>
+                    <term>C</term>
+                    <description>Equivalent to <b>type</b></description>
+                </item>
+                <item>
+                    <term>class</term>
+                    <description>Equivalent to <b>type</b></description>
+                </item>
+                <item>
+                    <term>d</term>
+                    <description>Equivalent to <b>date</b></description>
+                </item>
+                <item>
+            		<term>date</term> 
+            		<description>
+            			<para>
+            			Used to output the date of the logging event in the local time zone. 
+            			To output the date in universal time use the <c>%utcdate</c> pattern.
+            			The date conversion 
+            			specifier may be followed by a <i>date format specifier</i> enclosed 
+            			between braces. For example, <b>%date{HH:mm:ss,fff}</b> or
+            			<b>%date{dd MMM yyyy HH:mm:ss,fff}</b>.  If no date format specifier is 
+            			given then ISO8601 format is
+            			assumed (<see cref="T:log4net.DateFormatter.Iso8601DateFormatter"/>).
+            			</para>
+            			<para>
+            			The date format specifier admits the same syntax as the
+            			time pattern string of the <see cref="M:System.DateTime.ToString(System.String)"/>.
+            			</para>
+            			<para>
+            			For better results it is recommended to use the log4net date
+            			formatters. These can be specified using one of the strings
+            			"ABSOLUTE", "DATE" and "ISO8601" for specifying 
+            			<see cref="T:log4net.DateFormatter.AbsoluteTimeDateFormatter"/>, 
+            			<see cref="T:log4net.DateFormatter.DateTimeDateFormatter"/> and respectively 
+            			<see cref="T:log4net.DateFormatter.Iso8601DateFormatter"/>. For example, 
+            			<b>%date{ISO8601}</b> or <b>%date{ABSOLUTE}</b>.
+            			</para>
+            			<para>
+            			These dedicated date formatters perform significantly
+            			better than <see cref="M:System.DateTime.ToString(System.String)"/>.
+            			</para>
+            		</description>
+            	</item>
+            	<item>
+            		<term>exception</term>
+            		<description>
+            			<para>
+            			Used to output the exception passed in with the log message.
+            			</para>
+            			<para>
+            			If an exception object is stored in the logging event
+            			it will be rendered into the pattern output with a
+            			trailing newline.
+            			If there is no exception then nothing will be output
+            			and no trailing newline will be appended.
+            			It is typical to put a newline before the exception
+            			and to have the exception as the last data in the pattern.
+            			</para>
+            		</description>
+            	</item>
+                <item>
+                    <term>F</term>
+                    <description>Equivalent to <b>file</b></description>
+                </item>
+            	<item>
+            		<term>file</term>
+            		<description>
+            			<para>
+            			Used to output the file name where the logging request was
+            			issued.
+            			</para>
+            			<para>
+            			<b>WARNING</b> Generating caller location information is
+            			extremely slow. Its use should be avoided unless execution speed
+            			is not an issue.
+            			</para>
+            			<para>
+            			See the note below on the availability of caller location information.
+            			</para>
+            		</description>
+            	</item>
+            	<item>
+            		<term>identity</term>
+            		<description>
+            			<para>
+            			Used to output the user name for the currently active user
+            			(Principal.Identity.Name).
+            			</para>
+            			<para>
+            			<b>WARNING</b> Generating caller information is
+            			extremely slow. Its use should be avoided unless execution speed
+            			is not an issue.
+            			</para>
+            		</description>
+            	</item>
+                <item>
+                    <term>l</term>
+                    <description>Equivalent to <b>location</b></description>
+                </item>
+                <item>
+                    <term>L</term>
+                    <description>Equivalent to <b>line</b></description>
+                </item>
+            	<item>
+            		<term>location</term>
+            		<description>
+            			<para>
+            			Used to output location information of the caller which generated
+            			the logging event.
+            			</para>
+            			<para>
+            			The location information depends on the CLI implementation but
+            			usually consists of the fully qualified name of the calling
+            			method followed by the callers source the file name and line
+            			number between parentheses.
+            			</para>
+            			<para>
+            			The location information can be very useful. However, its
+            			generation is <b>extremely</b> slow. Its use should be avoided
+            			unless execution speed is not an issue.
+            			</para>
+            			<para>
+            			See the note below on the availability of caller location information.
+            			</para>
+            		</description>
+            	</item>
+            	<item>
+            		<term>level</term>
+            		<description>
+            			<para>
+            			Used to output the level of the logging event.
+            			</para>
+            		</description>
+            	</item>
+            	<item>
+            		<term>line</term>
+            		<description>
+            			<para>
+            			Used to output the line number from where the logging request
+            			was issued.
+            			</para>
+            			<para>
+            			<b>WARNING</b> Generating caller location information is
+            			extremely slow. Its use should be avoided unless execution speed
+            			is not an issue.
+            			</para>
+            			<para>
+            			See the note below on the availability of caller location information.
+            			</para>
+            		</description>
+            	</item>
+                <item>
+                    <term>logger</term>
+                    <description>
+                        <para>
+            			Used to output the logger of the logging event. The
+            			logger conversion specifier can be optionally followed by
+            			<i>precision specifier</i>, that is a decimal constant in
+            			brackets.
+                        </para>
+            			<para>
+            			If a precision specifier is given, then only the corresponding
+            			number of right most components of the logger name will be
+            			printed. By default the logger name is printed in full.
+            			</para>
+            			<para>
+            			For example, for the logger name "a.b.c" the pattern
+            			<b>%logger{2}</b> will output "b.c".
+            			</para>
+                    </description>
+                </item>
+                <item>
+                    <term>m</term>
+                    <description>Equivalent to <b>message</b></description>
+                </item>
+                <item>
+                    <term>M</term>
+                    <description>Equivalent to <b>method</b></description>
+                </item>
+            	<item>
+            		<term>message</term>
+            		<description>
+            			<para>
+            			Used to output the application supplied message associated with 
+            			the logging event.
+            			</para>
+            		</description>
+            	</item>
+            	<item>
+            		<term>mdc</term>
+            		<description>
+            			<para>
+            			The MDC (old name for the ThreadContext.Properties) is now part of the
+            			combined event properties. This pattern is supported for compatibility
+            			but is equivalent to <b>property</b>.
+            			</para>
+            		</description>
+            	</item>
+            	<item>
+            		<term>method</term>
+            		<description>
+            			<para>
+            			Used to output the method name where the logging request was
+            			issued.
+            			</para>
+            			<para>
+            			<b>WARNING</b> Generating caller location information is
+            			extremely slow. Its use should be avoided unless execution speed
+            			is not an issue.
+            			</para>
+            			<para>
+            			See the note below on the availability of caller location information.
+            			</para>
+            		</description>
+            	</item>
+                <item>
+                    <term>n</term>
+                    <description>Equivalent to <b>newline</b></description>
+                </item>
+            	<item>
+            		<term>newline</term>
+            		<description>
+            			<para>
+            			Outputs the platform dependent line separator character or
+            			characters.
+            			</para>
+            			<para>
+            			This conversion pattern offers the same performance as using 
+            			non-portable line separator strings such as	"\n", or "\r\n". 
+            			Thus, it is the preferred way of specifying a line separator.
+            			</para> 
+            		</description>
+            	</item>
+            	<item>
+            		<term>ndc</term>
+            		<description>
+            			<para>
+            			Used to output the NDC (nested diagnostic context) associated
+            			with the thread that generated the logging event.
+            			</para>
+            		</description>
+            	</item>
+                <item>
+                    <term>p</term>
+                    <description>Equivalent to <b>level</b></description>
+                </item>
+                <item>
+                    <term>P</term>
+                    <description>Equivalent to <b>property</b></description>
+                </item>
+                <item>
+                    <term>properties</term>
+                    <description>Equivalent to <b>property</b></description>
+                </item>
+            	<item>
+            		<term>property</term>
+            		<description>
+            			<para>
+            			Used to output the an event specific property. The key to 
+            			lookup must be specified within braces and directly following the
+            			pattern specifier, e.g. <b>%property{user}</b> would include the value
+            			from the property that is keyed by the string 'user'. Each property value
+            			that is to be included in the log must be specified separately.
+            			Properties are added to events by loggers or appenders. By default 
+            			the <c>log4net:HostName</c> property is set to the name of machine on 
+            			which the event was originally logged.
+            			</para>
+            			<para>
+            			If no key is specified, e.g. <b>%property</b> then all the keys and their
+            			values are printed in a comma separated list.
+            			</para>
+            			<para>
+            			The properties of an event are combined from a number of different
+            			contexts. These are listed below in the order in which they are searched.
+            			</para>
+            			<list type="definition">
+            				<item>
+            					<term>the event properties</term>
+            					<description>
+            					The event has <see cref="P:log4net.Core.LoggingEvent.Properties"/> that can be set. These 
+            					properties are specific to this event only.
+            					</description>
+            				</item>
+            				<item>
+            					<term>the thread properties</term>
+            					<description>
+            					The <see cref="P:log4net.ThreadContext.Properties"/> that are set on the current
+            					thread. These properties are shared by all events logged on this thread.
+            					</description>
+            				</item>
+            				<item>
+            					<term>the global properties</term>
+            					<description>
+            					The <see cref="P:log4net.GlobalContext.Properties"/> that are set globally. These 
+            					properties are shared by all the threads in the AppDomain.
+            					</description>
+            				</item>
+            			</list>
+            			
+            		</description>
+            	</item>
+                <item>
+                    <term>r</term>
+                    <description>Equivalent to <b>timestamp</b></description>
+                </item>
+                <item>
+                    <term>t</term>
+                    <description>Equivalent to <b>thread</b></description>
+                </item>
+            	<item>
+            		<term>timestamp</term>
+            		<description>
+            			<para>
+            			Used to output the number of milliseconds elapsed since the start
+            			of the application until the creation of the logging event.
+            			</para>
+            		</description>
+            	</item>
+            	<item>
+            		<term>thread</term>
+            		<description>
+            			<para>
+            			Used to output the name of the thread that generated the
+            			logging event. Uses the thread number if no name is available.
+            			</para>
+            		</description>
+            	</item>
+                <item>
+            		<term>type</term> 
+            		<description>
+            			<para>
+            			Used to output the fully qualified type name of the caller
+            			issuing the logging request. This conversion specifier
+            			can be optionally followed by <i>precision specifier</i>, that
+            			is a decimal constant in brackets.
+            			</para>
+            			<para>
+            			If a precision specifier is given, then only the corresponding
+            			number of right most components of the class name will be
+            			printed. By default the class name is output in fully qualified form.
+            			</para>
+            			<para>
+            			For example, for the class name "log4net.Layout.PatternLayout", the
+            			pattern <b>%type{1}</b> will output "PatternLayout".
+            			</para>
+            			<para>
+            			<b>WARNING</b> Generating the caller class information is
+            			slow. Thus, its use should be avoided unless execution speed is
+            			not an issue.
+            			</para>
+            			<para>
+            			See the note below on the availability of caller location information.
+            			</para>
+            		</description>
+                </item>
+                <item>
+                    <term>u</term>
+                    <description>Equivalent to <b>identity</b></description>
+                </item>
+            	<item>
+            		<term>username</term>
+            		<description>
+            			<para>
+            			Used to output the WindowsIdentity for the currently
+            			active user.
+            			</para>
+            			<para>
+            			<b>WARNING</b> Generating caller WindowsIdentity information is
+            			extremely slow. Its use should be avoided unless execution speed
+            			is not an issue.
+            			</para>
+            		</description>
+            	</item>
+                <item>
+            		<term>utcdate</term> 
+            		<description>
+            			<para>
+            			Used to output the date of the logging event in universal time. 
+            			The date conversion 
+            			specifier may be followed by a <i>date format specifier</i> enclosed 
+            			between braces. For example, <b>%utcdate{HH:mm:ss,fff}</b> or
+            			<b>%utcdate{dd MMM yyyy HH:mm:ss,fff}</b>.  If no date format specifier is 
+            			given then ISO8601 format is
+            			assumed (<see cref="T:log4net.DateFormatter.Iso8601DateFormatter"/>).
+            			</para>
+            			<para>
+            			The date format specifier admits the same syntax as the
+            			time pattern string of the <see cref="M:System.DateTime.ToString(System.String)"/>.
+            			</para>
+            			<para>
+            			For better results it is recommended to use the log4net date
+            			formatters. These can be specified using one of the strings
+            			"ABSOLUTE", "DATE" and "ISO8601" for specifying 
+            			<see cref="T:log4net.DateFormatter.AbsoluteTimeDateFormatter"/>, 
+            			<see cref="T:log4net.DateFormatter.DateTimeDateFormatter"/> and respectively 
+            			<see cref="T:log4net.DateFormatter.Iso8601DateFormatter"/>. For example, 
+            			<b>%utcdate{ISO8601}</b> or <b>%utcdate{ABSOLUTE}</b>.
+            			</para>
+            			<para>
+            			These dedicated date formatters perform significantly
+            			better than <see cref="M:System.DateTime.ToString(System.String)"/>.
+            			</para>
+            		</description>
+            	</item>
+                <item>
+                    <term>w</term>
+                    <description>Equivalent to <b>username</b></description>
+                </item>
+                <item>
+                    <term>x</term>
+                    <description>Equivalent to <b>ndc</b></description>
+                </item>
+                <item>
+                    <term>X</term>
+                    <description>Equivalent to <b>mdc</b></description>
+                </item>
+            	<item>
+            		<term>%</term>
+            		<description>
+            			<para>
+            			The sequence %% outputs a single percent sign.
+            			</para>
+            		</description>
+            	</item>
+            </list>
+            <para>
+            The single letter patterns are deprecated in favor of the 
+            longer more descriptive pattern names.
+            </para>
+            <para>
+            By default the relevant information is output as is. However,
+            with the aid of format modifiers it is possible to change the
+            minimum field width, the maximum field width and justification.
+            </para>
+            <para>
+            The optional format modifier is placed between the percent sign
+            and the conversion pattern name.
+            </para>
+            <para>
+            The first optional format modifier is the <i>left justification
+            flag</i> which is just the minus (-) character. Then comes the
+            optional <i>minimum field width</i> modifier. This is a decimal
+            constant that represents the minimum number of characters to
+            output. If the data item requires fewer characters, it is padded on
+            either the left or the right until the minimum width is
+            reached. The default is to pad on the left (right justify) but you
+            can specify right padding with the left justification flag. The
+            padding character is space. If the data item is larger than the
+            minimum field width, the field is expanded to accommodate the
+            data. The value is never truncated.
+            </para>
+            <para>
+            This behavior can be changed using the <i>maximum field
+            width</i> modifier which is designated by a period followed by a
+            decimal constant. If the data item is longer than the maximum
+            field, then the extra characters are removed from the
+            <i>beginning</i> of the data item and not from the end. For
+            example, it the maximum field width is eight and the data item is
+            ten characters long, then the first two characters of the data item
+            are dropped. This behavior deviates from the printf function in C
+            where truncation is done from the end.
+            </para>
+            <para>
+            Below are various format modifier examples for the logger
+            conversion specifier.
+            </para>
+            <div class="tablediv">
+            	<table class="dtTABLE" cellspacing="0">
+            		<tr>
+            			<th>Format modifier</th>
+            			<th>left justify</th>
+            			<th>minimum width</th>
+            			<th>maximum width</th>
+            			<th>comment</th>
+            		</tr>
+            		<tr>
+            			<td align="center">%20logger</td>
+            			<td align="center">false</td>
+            			<td align="center">20</td>
+            			<td align="center">none</td>
+            			<td>
+            				<para>
+            				Left pad with spaces if the logger name is less than 20
+            				characters long.
+            				</para>
+            			</td>
+            		</tr>
+            		<tr>
+            			<td align="center">%-20logger</td>
+            			<td align="center">true</td>
+            			<td align="center">20</td>
+            			<td align="center">none</td>
+            			<td>
+            				<para>
+            				Right pad with spaces if the logger 
+            				name is less than 20 characters long.
+            				</para>
+            			</td>
+            		</tr>
+            		<tr>
+            			<td align="center">%.30logger</td>
+            			<td align="center">NA</td>
+            			<td align="center">none</td>
+            			<td align="center">30</td>
+            			<td>
+            				<para>
+            				Truncate from the beginning if the logger 
+            				name is longer than 30 characters.
+            				</para>
+            			</td>
+            		</tr>
+            		<tr>
+            			<td align="center"><nobr>%20.30logger</nobr></td>
+            			<td align="center">false</td>
+            			<td align="center">20</td>
+            			<td align="center">30</td>
+            			<td>
+            				<para>
+            				Left pad with spaces if the logger name is shorter than 20
+            				characters. However, if logger name is longer than 30 characters,
+            				then truncate from the beginning.
+            				</para>
+            			</td>
+            		</tr>
+            		<tr>
+            			<td align="center">%-20.30logger</td>
+            			<td align="center">true</td>
+            			<td align="center">20</td>
+            			<td align="center">30</td>
+            			<td>
+            				<para>
+            				Right pad with spaces if the logger name is shorter than 20
+            				characters. However, if logger name is longer than 30 characters,
+            				then truncate from the beginning.
+            				</para>
+            			</td>
+            		</tr>
+            	</table>
+            </div>
+            <para>
+            <b>Note about caller location information.</b><br/>
+            The following patterns <c>%type %file %line %method %location %class %C %F %L %l %M</c> 
+            all generate caller location information.
+            Location information uses the <c>System.Diagnostics.StackTrace</c> class to generate
+            a call stack. The caller's information is then extracted from this stack.
+            </para>
+            <note type="caution">
+            <para>
+            The <c>System.Diagnostics.StackTrace</c> class is not supported on the 
+            .NET Compact Framework 1.0 therefore caller location information is not
+            available on that framework.
+            </para>
+            </note>
+            <note type="caution">
+            <para>
+            The <c>System.Diagnostics.StackTrace</c> class has this to say about Release builds:
+            </para>
+            <para>
+            "StackTrace information will be most informative with Debug build configurations. 
+            By default, Debug builds include debug symbols, while Release builds do not. The 
+            debug symbols contain most of the file, method name, line number, and column 
+            information used in constructing StackFrame and StackTrace objects. StackTrace 
+            might not report as many method calls as expected, due to code transformations 
+            that occur during optimization."
+            </para>
+            <para>
+            This means that in a Release build the caller information may be incomplete or may 
+            not exist at all! Therefore caller location information cannot be relied upon in a Release build.
+            </para>
+            </note>
+            <para>
+            Additional pattern converters may be registered with a specific <see cref="T:log4net.Layout.PatternLayout"/>
+            instance using the <see cref="M:log4net.Layout.PatternLayout.AddConverter(System.String,System.Type)"/> method.
+            </para>
+            </remarks>
+            <example>
+            This is a more detailed pattern.
+            <code><b>%timestamp [%thread] %level %logger %ndc - %message%newline</b></code>
+            </example>
+            <example>
+            A similar pattern except that the relative time is
+            right padded if less than 6 digits, thread name is right padded if
+            less than 15 characters and truncated if longer and the logger
+            name is left padded if shorter than 30 characters and truncated if
+            longer.
+            <code><b>%-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline</b></code>
+            </example>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+            <author>Douglas de la Torre</author>
+            <author>Daniel Cazzulino</author>
+        </member>
+        <member name="F:log4net.Layout.PatternLayout.DefaultConversionPattern">
+            <summary>
+            Default pattern string for log output. 
+            </summary>
+            <remarks>
+            <para>
+            Default pattern string for log output. 
+            Currently set to the string <b>"%message%newline"</b> 
+            which just prints the application supplied message. 
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Layout.PatternLayout.DetailConversionPattern">
+            <summary>
+            A detailed conversion pattern
+            </summary>
+            <remarks>
+            <para>
+            A conversion pattern which includes Time, Thread, Logger, and Nested Context.
+            Current value is <b>%timestamp [%thread] %level %logger %ndc - %message%newline</b>.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Layout.PatternLayout.s_globalRulesRegistry">
+            <summary>
+            Internal map of converter identifiers to converter types.
+            </summary>
+            <remarks>
+            <para>
+            This static map is overridden by the m_converterRegistry instance map
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Layout.PatternLayout.m_pattern">
+            <summary>
+            the pattern
+            </summary>
+        </member>
+        <member name="F:log4net.Layout.PatternLayout.m_head">
+            <summary>
+            the head of the pattern converter chain
+            </summary>
+        </member>
+        <member name="F:log4net.Layout.PatternLayout.m_instanceRulesRegistry">
+            <summary>
+            patterns defined on this PatternLayout only
+            </summary>
+        </member>
+        <member name="M:log4net.Layout.PatternLayout.#cctor">
+            <summary>
+            Initialize the global registry
+            </summary>
+            <remarks>
+            <para>
+            Defines the builtin global rules.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.PatternLayout.#ctor">
+            <summary>
+            Constructs a PatternLayout using the DefaultConversionPattern
+            </summary>
+            <remarks>
+            <para>
+            The default pattern just produces the application supplied message.
+            </para>
+            <para>
+            Note to Inheritors: This constructor calls the virtual method
+            <see cref="M:log4net.Layout.PatternLayout.CreatePatternParser(System.String)"/>. If you override this method be
+            aware that it will be called before your is called constructor.
+            </para>
+            <para>
+            As per the <see cref="T:log4net.Core.IOptionHandler"/> contract the <see cref="M:log4net.Layout.PatternLayout.ActivateOptions"/>
+            method must be called after the properties on this object have been
+            configured.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.PatternLayout.#ctor(System.String)">
+            <summary>
+            Constructs a PatternLayout using the supplied conversion pattern
+            </summary>
+            <param name="pattern">the pattern to use</param>
+            <remarks>
+            <para>
+            Note to Inheritors: This constructor calls the virtual method
+            <see cref="M:log4net.Layout.PatternLayout.CreatePatternParser(System.String)"/>. If you override this method be
+            aware that it will be called before your is called constructor.
+            </para>
+            <para>
+            When using this constructor the <see cref="M:log4net.Layout.PatternLayout.ActivateOptions"/> method 
+            need not be called. This may not be the case when using a subclass.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.PatternLayout.CreatePatternParser(System.String)">
+            <summary>
+            Create the pattern parser instance
+            </summary>
+            <param name="pattern">the pattern to parse</param>
+            <returns>The <see cref="T:log4net.Util.PatternParser"/> that will format the event</returns>
+            <remarks>
+            <para>
+            Creates the <see cref="T:log4net.Util.PatternParser"/> used to parse the conversion string. Sets the
+            global and instance rules on the <see cref="T:log4net.Util.PatternParser"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.PatternLayout.ActivateOptions">
+            <summary>
+            Initialize layout options
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Layout.PatternLayout.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Layout.PatternLayout.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Layout.PatternLayout.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.PatternLayout.Format(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Produces a formatted string as specified by the conversion pattern.
+            </summary>
+            <param name="loggingEvent">the event being logged</param>
+            <param name="writer">The TextWriter to write the formatted event to</param>
+            <remarks>
+            <para>
+            Parse the <see cref="T:log4net.Core.LoggingEvent"/> using the patter format
+            specified in the <see cref="P:log4net.Layout.PatternLayout.ConversionPattern"/> property.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.PatternLayout.AddConverter(log4net.Layout.PatternLayout.ConverterInfo)">
+            <summary>
+            Add a converter to this PatternLayout
+            </summary>
+            <param name="converterInfo">the converter info</param>
+            <remarks>
+            <para>
+            This version of the method is used by the configurator.
+            Programmatic users should use the alternative <see cref="M:log4net.Layout.PatternLayout.AddConverter(System.String,System.Type)"/> method.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.PatternLayout.AddConverter(System.String,System.Type)">
+            <summary>
+            Add a converter to this PatternLayout
+            </summary>
+            <param name="name">the name of the conversion pattern for this converter</param>
+            <param name="type">the type of the converter</param>
+            <remarks>
+            <para>
+            Add a named pattern converter to this instance. This
+            converter will be used in the formatting of the event.
+            This method must be called before <see cref="M:log4net.Layout.PatternLayout.ActivateOptions"/>.
+            </para>
+            <para>
+            The <paramref name="type"/> specified must extend the 
+            <see cref="T:log4net.Util.PatternConverter"/> type.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.PatternLayout.ConversionPattern">
+            <summary>
+            The pattern formatting string
+            </summary>
+            <remarks>
+            <para>
+            The <b>ConversionPattern</b> option. This is the string which
+            controls formatting and consists of a mix of literal content and
+            conversion specifiers.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.PatternLayout.ConverterInfo">
+            <summary>
+            Wrapper class used to map converter names to converter types
+            </summary>
+            <remarks>
+            <para>
+            Pattern converter info class used during configuration to
+            pass to the <see cref="M:log4net.Layout.PatternLayout.AddConverter(log4net.Layout.PatternLayout.ConverterInfo)"/>
+            method.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.PatternLayout.ConverterInfo.#ctor">
+            <summary>
+            default constructor
+            </summary>
+        </member>
+        <member name="P:log4net.Layout.PatternLayout.ConverterInfo.Name">
+            <summary>
+            Gets or sets the name of the conversion pattern
+            </summary>
+            <remarks>
+            <para>
+            The name of the pattern in the format string
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.PatternLayout.ConverterInfo.Type">
+            <summary>
+            Gets or sets the type of the converter
+            </summary>
+            <remarks>
+            <para>
+            The value specified must extend the 
+            <see cref="T:log4net.Util.PatternConverter"/> type.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.RawLayoutConverter">
+            <summary>
+            Type converter for the <see cref="T:log4net.Layout.IRawLayout"/> interface
+            </summary>
+            <remarks>
+            <para>
+            Used to convert objects to the <see cref="T:log4net.Layout.IRawLayout"/> interface.
+            Supports converting from the <see cref="T:log4net.Layout.ILayout"/> interface to
+            the <see cref="T:log4net.Layout.IRawLayout"/> interface using the <see cref="T:log4net.Layout.Layout2RawLayoutAdapter"/>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Util.TypeConverters.IConvertFrom">
+            <summary>
+            Interface supported by type converters
+            </summary>
+            <remarks>
+            <para>
+            This interface supports conversion from arbitrary types
+            to a single target type. See <see cref="T:log4net.Util.TypeConverters.TypeConverterAttribute"/>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.IConvertFrom.CanConvertFrom(System.Type)">
+            <summary>
+            Can the source type be converted to the type supported by this object
+            </summary>
+            <param name="sourceType">the type to convert</param>
+            <returns>true if the conversion is possible</returns>
+            <remarks>
+            <para>
+            Test if the <paramref name="sourceType"/> can be converted to the
+            type supported by this converter.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.IConvertFrom.ConvertFrom(System.Object)">
+            <summary>
+            Convert the source object to the type supported by this object
+            </summary>
+            <param name="source">the object to convert</param>
+            <returns>the converted object</returns>
+            <remarks>
+            <para>
+            Converts the <paramref name="source"/> to the type supported
+            by this converter.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.RawLayoutConverter.CanConvertFrom(System.Type)">
+            <summary>
+            Can the sourceType be converted to an <see cref="T:log4net.Layout.IRawLayout"/>
+            </summary>
+            <param name="sourceType">the source to be to be converted</param>
+            <returns><c>true</c> if the source type can be converted to <see cref="T:log4net.Layout.IRawLayout"/></returns>
+            <remarks>
+            <para>
+            Test if the <paramref name="sourceType"/> can be converted to a
+            <see cref="T:log4net.Layout.IRawLayout"/>. Only <see cref="T:log4net.Layout.ILayout"/> is supported
+            as the <paramref name="sourceType"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.RawLayoutConverter.ConvertFrom(System.Object)">
+            <summary>
+            Convert the value to a <see cref="T:log4net.Layout.IRawLayout"/> object
+            </summary>
+            <param name="source">the value to convert</param>
+            <returns>the <see cref="T:log4net.Layout.IRawLayout"/> object</returns>
+            <remarks>
+            <para>
+            Convert the <paramref name="source"/> object to a 
+            <see cref="T:log4net.Layout.IRawLayout"/> object. If the <paramref name="source"/> object
+            is a <see cref="T:log4net.Layout.ILayout"/> then the <see cref="T:log4net.Layout.Layout2RawLayoutAdapter"/>
+            is used to adapt between the two interfaces, otherwise an
+            exception is thrown.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.RawPropertyLayout">
+            <summary>
+            Extract the value of a property from the <see cref="T:log4net.Core.LoggingEvent"/>
+            </summary>
+            <remarks>
+            <para>
+            Extract the value of a property from the <see cref="T:log4net.Core.LoggingEvent"/>
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Layout.RawPropertyLayout.#ctor">
+            <summary>
+            Constructs a RawPropertyLayout
+            </summary>
+        </member>
+        <member name="M:log4net.Layout.RawPropertyLayout.Format(log4net.Core.LoggingEvent)">
+            <summary>
+            Lookup the property for <see cref="P:log4net.Layout.RawPropertyLayout.Key"/>
+            </summary>
+            <param name="loggingEvent">The event to format</param>
+            <returns>returns property value</returns>
+            <remarks>
+            <para>
+            Looks up and returns the object value of the property
+            named <see cref="P:log4net.Layout.RawPropertyLayout.Key"/>. If there is no property defined
+            with than name then <c>null</c> will be returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.RawPropertyLayout.Key">
+            <summary>
+            The name of the value to lookup in the LoggingEvent Properties collection.
+            </summary>
+            <value>
+            Value to lookup in the LoggingEvent Properties collection
+            </value>
+            <remarks>
+            <para>
+            String name of the property to lookup in the <see cref="T:log4net.Core.LoggingEvent"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.RawTimeStampLayout">
+            <summary>
+            Extract the date from the <see cref="T:log4net.Core.LoggingEvent"/>
+            </summary>
+            <remarks>
+            <para>
+            Extract the date from the <see cref="T:log4net.Core.LoggingEvent"/>
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Layout.RawTimeStampLayout.#ctor">
+            <summary>
+            Constructs a RawTimeStampLayout
+            </summary>
+        </member>
+        <member name="M:log4net.Layout.RawTimeStampLayout.Format(log4net.Core.LoggingEvent)">
+            <summary>
+            Gets the <see cref="P:log4net.Core.LoggingEvent.TimeStamp"/> as a <see cref="T:System.DateTime"/>.
+            </summary>
+            <param name="loggingEvent">The event to format</param>
+            <returns>returns the time stamp</returns>
+            <remarks>
+            <para>
+            Gets the <see cref="P:log4net.Core.LoggingEvent.TimeStamp"/> as a <see cref="T:System.DateTime"/>.
+            </para>
+            <para>
+            The time stamp is in local time. To format the time stamp
+            in universal time use <see cref="T:log4net.Layout.RawUtcTimeStampLayout"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.RawUtcTimeStampLayout">
+            <summary>
+            Extract the date from the <see cref="T:log4net.Core.LoggingEvent"/>
+            </summary>
+            <remarks>
+            <para>
+            Extract the date from the <see cref="T:log4net.Core.LoggingEvent"/>
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Layout.RawUtcTimeStampLayout.#ctor">
+            <summary>
+            Constructs a RawUtcTimeStampLayout
+            </summary>
+        </member>
+        <member name="M:log4net.Layout.RawUtcTimeStampLayout.Format(log4net.Core.LoggingEvent)">
+            <summary>
+            Gets the <see cref="P:log4net.Core.LoggingEvent.TimeStamp"/> as a <see cref="T:System.DateTime"/>.
+            </summary>
+            <param name="loggingEvent">The event to format</param>
+            <returns>returns the time stamp</returns>
+            <remarks>
+            <para>
+            Gets the <see cref="P:log4net.Core.LoggingEvent.TimeStamp"/> as a <see cref="T:System.DateTime"/>.
+            </para>
+            <para>
+            The time stamp is in universal time. To format the time stamp
+            in local time use <see cref="T:log4net.Layout.RawTimeStampLayout"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.SimpleLayout">
+            <summary>
+            A very simple layout
+            </summary>
+            <remarks>
+            <para>
+            SimpleLayout consists of the level of the log statement,
+            followed by " - " and then the log message itself. For example,
+            <code>
+            DEBUG - Hello world
+            </code>
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Layout.SimpleLayout.#ctor">
+            <summary>
+            Constructs a SimpleLayout
+            </summary>
+        </member>
+        <member name="M:log4net.Layout.SimpleLayout.ActivateOptions">
+            <summary>
+            Initialize layout options
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Layout.SimpleLayout.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Layout.SimpleLayout.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Layout.SimpleLayout.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.SimpleLayout.Format(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Produces a simple formatted output.
+            </summary>
+            <param name="loggingEvent">the event being logged</param>
+            <param name="writer">The TextWriter to write the formatted event to</param>
+            <remarks>
+            <para>
+            Formats the event as the level of the even,
+            followed by " - " and then the log message itself. The
+            output is terminated by a newline.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.XmlLayout">
+             <summary>
+             Layout that formats the log events as XML elements.
+             </summary>
+             <remarks>
+             <para>
+             The output of the <see cref="T:log4net.Layout.XmlLayout"/> consists of a series of 
+             log4net:event elements. It does not output a complete well-formed XML 
+             file. The output is designed to be included as an <em>external entity</em>
+             in a separate file to form a correct XML file.
+             </para>
+             <para>
+             For example, if <c>abc</c> is the name of the file where
+             the <see cref="T:log4net.Layout.XmlLayout"/> output goes, then a well-formed XML file would 
+             be:
+             </para>
+             <code lang="XML">
+             &lt;?xml version="1.0" ?&gt;
+             
+             &lt;!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [&lt;!ENTITY data SYSTEM "abc"&gt;]&gt;
+            
+             &lt;log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2&gt;
+                 &amp;data;
+             &lt;/log4net:events&gt;
+             </code>
+             <para>
+             This approach enforces the independence of the <see cref="T:log4net.Layout.XmlLayout"/> 
+             and the appender where it is embedded.
+             </para>
+             <para>
+             The <c>version</c> attribute helps components to correctly
+             interpret output generated by <see cref="T:log4net.Layout.XmlLayout"/>. The value of 
+             this attribute should be "1.2" for release 1.2 and later.
+             </para>
+             <para>
+             Alternatively the <c>Header</c> and <c>Footer</c> properties can be
+             configured to output the correct XML header, open tag and close tag.
+             When setting the <c>Header</c> and <c>Footer</c> properties it is essential
+             that the underlying data store not be appendable otherwise the data
+             will become invalid XML.
+             </para>
+             </remarks>
+             <author>Nicko Cadell</author>
+             <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Layout.XmlLayoutBase">
+            <summary>
+            Layout that formats the log events as XML elements.
+            </summary>
+            <remarks>
+            <para>
+            This is an abstract class that must be subclassed by an implementation 
+            to conform to a specific schema.
+            </para>
+            <para>
+            Deriving classes must implement the <see cref="M:log4net.Layout.XmlLayoutBase.FormatXml(System.Xml.XmlWriter,log4net.Core.LoggingEvent)"/> method.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Layout.XmlLayoutBase.#ctor">
+            <summary>
+            Protected constructor to support subclasses
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Layout.XmlLayoutBase"/> class
+            with no location info.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.XmlLayoutBase.#ctor(System.Boolean)">
+            <summary>
+            Protected constructor to support subclasses
+            </summary>
+            <remarks>
+            <para>
+            The <paramref name="locationInfo" /> parameter determines whether 
+            location information will be output by the layout. If 
+            <paramref name="locationInfo" /> is set to <c>true</c>, then the 
+            file name and line number of the statement at the origin of the log 
+            statement will be output. 
+            </para>
+            <para>
+            If you are embedding this layout within an SMTPAppender
+            then make sure to set the <b>LocationInfo</b> option of that 
+            appender as well.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.XmlLayoutBase.ActivateOptions">
+            <summary>
+            Initialize layout options
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Layout.XmlLayoutBase.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Layout.XmlLayoutBase.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Layout.XmlLayoutBase.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.XmlLayoutBase.Format(System.IO.TextWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Produces a formatted string.
+            </summary>
+            <param name="loggingEvent">The event being logged.</param>
+            <param name="writer">The TextWriter to write the formatted event to</param>
+            <remarks>
+            <para>
+            Format the <see cref="T:log4net.Core.LoggingEvent"/> and write it to the <see cref="T:System.IO.TextWriter"/>.
+            </para>
+            <para>
+            This method creates an <see cref="T:System.Xml.XmlTextWriter"/> that writes to the
+            <paramref name="writer"/>. The <see cref="T:System.Xml.XmlTextWriter"/> is passed 
+            to the <see cref="M:log4net.Layout.XmlLayoutBase.FormatXml(System.Xml.XmlWriter,log4net.Core.LoggingEvent)"/> method. Subclasses should override the
+            <see cref="M:log4net.Layout.XmlLayoutBase.FormatXml(System.Xml.XmlWriter,log4net.Core.LoggingEvent)"/> method rather than this method.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.XmlLayoutBase.FormatXml(System.Xml.XmlWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Does the actual writing of the XML.
+            </summary>
+            <param name="writer">The writer to use to output the event to.</param>
+            <param name="loggingEvent">The event to write.</param>
+            <remarks>
+            <para>
+            Subclasses should override this method to format
+            the <see cref="T:log4net.Core.LoggingEvent"/> as XML.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Layout.XmlLayoutBase.m_locationInfo">
+            <summary>
+            Flag to indicate if location information should be included in
+            the XML events.
+            </summary>
+        </member>
+        <member name="F:log4net.Layout.XmlLayoutBase.m_protectCloseTextWriter">
+            <summary>
+            Writer adapter that ignores Close
+            </summary>
+        </member>
+        <member name="F:log4net.Layout.XmlLayoutBase.m_invalidCharReplacement">
+            <summary>
+            The string to replace invalid chars with
+            </summary>
+        </member>
+        <member name="P:log4net.Layout.XmlLayoutBase.LocationInfo">
+            <summary>
+            Gets a value indicating whether to include location information in 
+            the XML events.
+            </summary>
+            <value>
+            <c>true</c> if location information should be included in the XML 
+            events; otherwise, <c>false</c>.
+            </value>
+            <remarks>
+            <para>
+            If <see cref="P:log4net.Layout.XmlLayoutBase.LocationInfo"/> is set to <c>true</c>, then the file 
+            name and line number of the statement at the origin of the log 
+            statement will be output. 
+            </para>
+            <para>
+            If you are embedding this layout within an <c>SMTPAppender</c>
+            then make sure to set the <b>LocationInfo</b> option of that 
+            appender as well.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.XmlLayoutBase.InvalidCharReplacement">
+            <summary>
+            The string to replace characters that can not be expressed in XML with.
+            <remarks>
+            <para>
+            Not all characters may be expressed in XML. This property contains the
+            string to replace those that can not with. This defaults to a ?. Set it
+            to the empty string to simply remove offending characters. For more
+            details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets
+            Character replacement will occur in  the log message, the property names 
+            and the property values.
+            </para>
+            </remarks>
+            </summary>
+        </member>
+        <member name="P:log4net.Layout.XmlLayoutBase.ContentType">
+            <summary>
+            Gets the content type output by this layout. 
+            </summary>
+            <value>
+            As this is the XML layout, the value is always <c>"text/xml"</c>.
+            </value>
+            <remarks>
+            <para>
+            As this is the XML layout, the value is always <c>"text/xml"</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.XmlLayout.#ctor">
+            <summary>
+            Constructs an XmlLayout
+            </summary>
+        </member>
+        <member name="M:log4net.Layout.XmlLayout.#ctor(System.Boolean)">
+            <summary>
+            Constructs an XmlLayout.
+            </summary>
+            <remarks>
+            <para>
+            The <b>LocationInfo</b> option takes a boolean value. By
+            default, it is set to false which means there will be no location
+            information output by this layout. If the the option is set to
+            true, then the file name and line number of the statement
+            at the origin of the log statement will be output. 
+            </para>
+            <para>
+            If you are embedding this layout within an SmtpAppender
+            then make sure to set the <b>LocationInfo</b> option of that 
+            appender as well.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.XmlLayout.ActivateOptions">
+            <summary>
+            Initialize layout options
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Layout.XmlLayout.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Layout.XmlLayout.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Layout.XmlLayout.ActivateOptions"/> must be called again.
+            </para>
+            <para>
+            Builds a cache of the element names
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.XmlLayout.FormatXml(System.Xml.XmlWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Does the actual writing of the XML.
+            </summary>
+            <param name="writer">The writer to use to output the event to.</param>
+            <param name="loggingEvent">The event to write.</param>
+            <remarks>
+            <para>
+            Override the base class <see cref="M:log4net.Layout.XmlLayoutBase.FormatXml(System.Xml.XmlWriter,log4net.Core.LoggingEvent)"/> method
+            to write the <see cref="T:log4net.Core.LoggingEvent"/> to the <see cref="T:System.Xml.XmlWriter"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Layout.XmlLayout.m_prefix">
+            <summary>
+            The prefix to use for all generated element names
+            </summary>
+        </member>
+        <member name="P:log4net.Layout.XmlLayout.Prefix">
+            <summary>
+            The prefix to use for all element names
+            </summary>
+            <remarks>
+            <para>
+            The default prefix is <b>log4net</b>. Set this property
+            to change the prefix. If the prefix is set to an empty string
+            then no prefix will be written.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.XmlLayout.Base64EncodeMessage">
+            <summary>
+            Set whether or not to base64 encode the message.
+            </summary>
+            <remarks>
+            <para>
+            By default the log message will be written as text to the xml
+            output. This can cause problems when the message contains binary
+            data. By setting this to true the contents of the message will be
+            base64 encoded. If this is set then invalid character replacement
+            (see <see cref="P:log4net.Layout.XmlLayoutBase.InvalidCharReplacement"/>) will not be performed
+            on the log message.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.XmlLayout.Base64EncodeProperties">
+            <summary>
+            Set whether or not to base64 encode the property values.
+            </summary>
+            <remarks>
+            <para>
+            By default the properties will be written as text to the xml
+            output. This can cause problems when one or more properties contain
+            binary data. By setting this to true the values of the properties
+            will be base64 encoded. If this is set then invalid character replacement
+            (see <see cref="P:log4net.Layout.XmlLayoutBase.InvalidCharReplacement"/>) will not be performed
+            on the property values.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Layout.XmlLayoutSchemaLog4j">
+            <summary>
+            Layout that formats the log events as XML elements compatible with the log4j schema
+            </summary>
+            <remarks>
+            <para>
+            Formats the log events according to the http://logging.apache.org/log4j schema.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Layout.XmlLayoutSchemaLog4j.s_date1970">
+            <summary>
+            The 1st of January 1970 in UTC
+            </summary>
+        </member>
+        <member name="M:log4net.Layout.XmlLayoutSchemaLog4j.#ctor">
+            <summary>
+            Constructs an XMLLayoutSchemaLog4j
+            </summary>
+        </member>
+        <member name="M:log4net.Layout.XmlLayoutSchemaLog4j.#ctor(System.Boolean)">
+            <summary>
+            Constructs an XMLLayoutSchemaLog4j.
+            </summary>
+            <remarks>
+            <para>
+            The <b>LocationInfo</b> option takes a boolean value. By
+            default, it is set to false which means there will be no location
+            information output by this layout. If the the option is set to
+            true, then the file name and line number of the statement
+            at the origin of the log statement will be output. 
+            </para>
+            <para>
+            If you are embedding this layout within an SMTPAppender
+            then make sure to set the <b>LocationInfo</b> option of that 
+            appender as well.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Layout.XmlLayoutSchemaLog4j.FormatXml(System.Xml.XmlWriter,log4net.Core.LoggingEvent)">
+            <summary>
+            Actually do the writing of the xml
+            </summary>
+            <param name="writer">the writer to use</param>
+            <param name="loggingEvent">the event to write</param>
+            <remarks>
+            <para>
+            Generate XML that is compatible with the log4j schema.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Layout.XmlLayoutSchemaLog4j.Version">
+            <summary>
+            The version of the log4j schema to use.
+            </summary>
+            <remarks>
+            <para>
+            Only version 1.2 of the log4j schema is supported.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.ObjectRenderer.DefaultRenderer">
+            <summary>
+            The default object Renderer.
+            </summary>
+            <remarks>
+            <para>
+            The default renderer supports rendering objects and collections to strings.
+            </para>
+            <para>
+            See the <see cref="M:log4net.ObjectRenderer.DefaultRenderer.RenderObject(log4net.ObjectRenderer.RendererMap,System.Object,System.IO.TextWriter)"/> method for details of the output.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.ObjectRenderer.IObjectRenderer">
+            <summary>
+            Implement this interface in order to render objects as strings
+            </summary>
+            <remarks>
+            <para>
+            Certain types require special case conversion to
+            string form. This conversion is done by an object renderer.
+            Object renderers implement the <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/>
+            interface.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.ObjectRenderer.IObjectRenderer.RenderObject(log4net.ObjectRenderer.RendererMap,System.Object,System.IO.TextWriter)">
+            <summary>
+            Render the object <paramref name="obj"/> to a string
+            </summary>
+            <param name="rendererMap">The map used to lookup renderers</param>
+            <param name="obj">The object to render</param>
+            <param name="writer">The writer to render to</param>
+            <remarks>
+            <para>
+            Render the object <paramref name="obj"/> to a 
+            string.
+            </para>
+            <para>
+            The <paramref name="rendererMap"/> parameter is
+            provided to lookup and render other objects. This is
+            very useful where <paramref name="obj"/> contains
+            nested objects of unknown type. The <see cref="M:log4net.ObjectRenderer.RendererMap.FindAndRender(System.Object,System.IO.TextWriter)"/>
+            method can be used to render these objects.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.ObjectRenderer.DefaultRenderer.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Default constructor
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.ObjectRenderer.DefaultRenderer.RenderObject(log4net.ObjectRenderer.RendererMap,System.Object,System.IO.TextWriter)">
+            <summary>
+            Render the object <paramref name="obj"/> to a string
+            </summary>
+            <param name="rendererMap">The map used to lookup renderers</param>
+            <param name="obj">The object to render</param>
+            <param name="writer">The writer to render to</param>
+            <remarks>
+            <para>
+            Render the object <paramref name="obj"/> to a string.
+            </para>
+            <para>
+            The <paramref name="rendererMap"/> parameter is
+            provided to lookup and render other objects. This is
+            very useful where <paramref name="obj"/> contains
+            nested objects of unknown type. The <see cref="M:log4net.ObjectRenderer.RendererMap.FindAndRender(System.Object)"/>
+            method can be used to render these objects.
+            </para>
+            <para>
+            The default renderer supports rendering objects to strings as follows:
+            </para>
+            <list type="table">
+            	<listheader>
+            		<term>Value</term>
+            		<description>Rendered String</description>
+            	</listheader>
+            	<item>
+            		<term><c>null</c></term>
+            		<description>
+            		<para>"(null)"</para>
+            		</description>
+            	</item>
+            	<item>
+            		<term><see cref="T:System.Array"/></term>
+            		<description>
+            		<para>
+            		For a one dimensional array this is the
+            		array type name, an open brace, followed by a comma
+            		separated list of the elements (using the appropriate
+            		renderer), followed by a close brace. 
+            		</para>
+            		<para>
+            		For example: <c>int[] {1, 2, 3}</c>.
+            		</para>
+            		<para>
+            		If the array is not one dimensional the 
+            		<c>Array.ToString()</c> is returned.
+            		</para>
+            		</description>
+            	</item>
+            	<item>
+            		<term><see cref="T:System.Collections.IEnumerable"/>, <see cref="T:System.Collections.ICollection"/> &amp; <see cref="T:System.Collections.IEnumerator"/></term>
+            		<description>
+            		<para>
+            		Rendered as an open brace, followed by a comma
+            		separated list of the elements (using the appropriate
+            		renderer), followed by a close brace.
+            		</para>
+            		<para>
+            		For example: <c>{a, b, c}</c>.
+            		</para>
+            		<para>
+            		All collection classes that implement <see cref="T:System.Collections.ICollection"/> its subclasses, 
+            		or generic equivalents all implement the <see cref="T:System.Collections.IEnumerable"/> interface.
+            		</para>
+            		</description>
+            	</item>		
+            	<item>
+            		<term><see cref="T:System.Collections.DictionaryEntry"/></term>
+            		<description>
+            		<para>
+            		Rendered as the key, an equals sign ('='), and the value (using the appropriate
+            		renderer). 
+            		</para>
+            		<para>
+            		For example: <c>key=value</c>.
+            		</para>
+            		</description>
+            	</item>		
+            	<item>
+            		<term>other</term>
+            		<description>
+            		<para><c>Object.ToString()</c></para>
+            		</description>
+            	</item>
+            </list>
+            </remarks>
+        </member>
+        <member name="M:log4net.ObjectRenderer.DefaultRenderer.RenderArray(log4net.ObjectRenderer.RendererMap,System.Array,System.IO.TextWriter)">
+            <summary>
+            Render the array argument into a string
+            </summary>
+            <param name="rendererMap">The map used to lookup renderers</param>
+            <param name="array">the array to render</param>
+            <param name="writer">The writer to render to</param>
+            <remarks>
+            <para>
+            For a one dimensional array this is the
+            array type name, an open brace, followed by a comma
+            separated list of the elements (using the appropriate
+            renderer), followed by a close brace. For example:
+            <c>int[] {1, 2, 3}</c>.
+            </para>
+            <para>
+            If the array is not one dimensional the 
+            <c>Array.ToString()</c> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.ObjectRenderer.DefaultRenderer.RenderEnumerator(log4net.ObjectRenderer.RendererMap,System.Collections.IEnumerator,System.IO.TextWriter)">
+            <summary>
+            Render the enumerator argument into a string
+            </summary>
+            <param name="rendererMap">The map used to lookup renderers</param>
+            <param name="enumerator">the enumerator to render</param>
+            <param name="writer">The writer to render to</param>
+            <remarks>
+            <para>
+            Rendered as an open brace, followed by a comma
+            separated list of the elements (using the appropriate
+            renderer), followed by a close brace. For example:
+            <c>{a, b, c}</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.ObjectRenderer.DefaultRenderer.RenderDictionaryEntry(log4net.ObjectRenderer.RendererMap,System.Collections.DictionaryEntry,System.IO.TextWriter)">
+            <summary>
+            Render the DictionaryEntry argument into a string
+            </summary>
+            <param name="rendererMap">The map used to lookup renderers</param>
+            <param name="entry">the DictionaryEntry to render</param>
+            <param name="writer">The writer to render to</param>
+            <remarks>
+            <para>
+            Render the key, an equals sign ('='), and the value (using the appropriate
+            renderer). For example: <c>key=value</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.ObjectRenderer.RendererMap">
+            <summary>
+            Map class objects to an <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/>.
+            </summary>
+            <remarks>
+            <para>
+            Maintains a mapping between types that require special
+            rendering and the <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/> that
+            is used to render them.
+            </para>
+            <para>
+            The <see cref="M:log4net.ObjectRenderer.RendererMap.FindAndRender(System.Object)"/> method is used to render an
+            <c>object</c> using the appropriate renderers defined in this map.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.ObjectRenderer.RendererMap.#ctor">
+            <summary>
+            Default Constructor
+            </summary>
+            <remarks>
+            <para>
+            Default constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.ObjectRenderer.RendererMap.FindAndRender(System.Object)">
+            <summary>
+            Render <paramref name="obj"/> using the appropriate renderer.
+            </summary>
+            <param name="obj">the object to render to a string</param>
+            <returns>the object rendered as a string</returns>
+            <remarks>
+            <para>
+            This is a convenience method used to render an object to a string.
+            The alternative method <see cref="M:log4net.ObjectRenderer.RendererMap.FindAndRender(System.Object,System.IO.TextWriter)"/>
+            should be used when streaming output to a <see cref="T:System.IO.TextWriter"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.ObjectRenderer.RendererMap.FindAndRender(System.Object,System.IO.TextWriter)">
+            <summary>
+            Render <paramref name="obj"/> using the appropriate renderer.
+            </summary>
+            <param name="obj">the object to render to a string</param>
+            <param name="writer">The writer to render to</param>
+            <remarks>
+            <para>
+            Find the appropriate renderer for the type of the
+            <paramref name="obj"/> parameter. This is accomplished by calling the
+            <see cref="M:log4net.ObjectRenderer.RendererMap.Get(System.Type)"/> method. Once a renderer is found, it is
+            applied on the object <paramref name="obj"/> and the result is returned
+            as a <see cref="T:System.String"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.ObjectRenderer.RendererMap.Get(System.Object)">
+            <summary>
+            Gets the renderer for the specified object type
+            </summary>
+            <param name="obj">the object to lookup the renderer for</param>
+            <returns>the renderer for <paramref name="obj"/></returns>
+            <remarks>
+            <param>
+            Gets the renderer for the specified object type.
+            </param>
+            <param>
+            Syntactic sugar method that calls <see cref="M:log4net.ObjectRenderer.RendererMap.Get(System.Type)"/> 
+            with the type of the object parameter.
+            </param>
+            </remarks>
+        </member>
+        <member name="M:log4net.ObjectRenderer.RendererMap.Get(System.Type)">
+            <summary>
+            Gets the renderer for the specified type
+            </summary>
+            <param name="type">the type to lookup the renderer for</param>
+            <returns>the renderer for the specified type</returns>
+            <remarks>
+            <para>
+            Returns the renderer for the specified type.
+            If no specific renderer has been defined the
+            <see cref="P:log4net.ObjectRenderer.RendererMap.DefaultRenderer"/> will be returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.ObjectRenderer.RendererMap.SearchTypeAndInterfaces(System.Type)">
+            <summary>
+            Internal function to recursively search interfaces
+            </summary>
+            <param name="type">the type to lookup the renderer for</param>
+            <returns>the renderer for the specified type</returns>
+        </member>
+        <member name="M:log4net.ObjectRenderer.RendererMap.Clear">
+            <summary>
+            Clear the map of renderers
+            </summary>
+            <remarks>
+            <para>
+            Clear the custom renderers defined by using
+            <see cref="M:log4net.ObjectRenderer.RendererMap.Put(System.Type,log4net.ObjectRenderer.IObjectRenderer)"/>. The <see cref="P:log4net.ObjectRenderer.RendererMap.DefaultRenderer"/>
+            cannot be removed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.ObjectRenderer.RendererMap.Put(System.Type,log4net.ObjectRenderer.IObjectRenderer)">
+            <summary>
+            Register an <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/> for <paramref name="typeToRender"/>. 
+            </summary>
+            <param name="typeToRender">the type that will be rendered by <paramref name="renderer"/></param>
+            <param name="renderer">the renderer for <paramref name="typeToRender"/></param>
+            <remarks>
+            <para>
+            Register an object renderer for a specific source type.
+            This renderer will be returned from a call to <see cref="M:log4net.ObjectRenderer.RendererMap.Get(System.Type)"/>
+            specifying the same <paramref name="typeToRender"/> as an argument.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.ObjectRenderer.RendererMap.DefaultRenderer">
+            <summary>
+            Get the default renderer instance
+            </summary>
+            <value>the default renderer</value>
+            <remarks>
+            <para>
+            Get the default renderer
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Plugin.IPlugin">
+            <summary>
+            Interface implemented by logger repository plugins.
+            </summary>
+            <remarks>
+            <para>
+            Plugins define additional behavior that can be associated
+            with a <see cref="T:log4net.Repository.ILoggerRepository"/>.
+            The <see cref="T:log4net.Plugin.PluginMap"/> held by the <see cref="P:log4net.Repository.ILoggerRepository.PluginMap"/>
+            property is used to store the plugins for a repository.
+            </para>
+            <para>
+            The <c>log4net.Config.PluginAttribute</c> can be used to
+            attach plugins to repositories created using configuration
+            attributes.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Plugin.IPlugin.Attach(log4net.Repository.ILoggerRepository)">
+            <summary>
+            Attaches the plugin to the specified <see cref="T:log4net.Repository.ILoggerRepository"/>.
+            </summary>
+            <param name="repository">The <see cref="T:log4net.Repository.ILoggerRepository"/> that this plugin should be attached to.</param>
+            <remarks>
+            <para>
+            A plugin may only be attached to a single repository.
+            </para>
+            <para>
+            This method is called when the plugin is attached to the repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Plugin.IPlugin.Shutdown">
+            <summary>
+            Is called when the plugin is to shutdown.
+            </summary>
+            <remarks>
+            <para>
+            This method is called to notify the plugin that 
+            it should stop operating and should detach from
+            the repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Plugin.IPlugin.Name">
+            <summary>
+            Gets the name of the plugin.
+            </summary>
+            <value>
+            The name of the plugin.
+            </value>
+            <remarks>
+            <para>
+            Plugins are stored in the <see cref="T:log4net.Plugin.PluginMap"/>
+            keyed by name. Each plugin instance attached to a
+            repository must be a unique name.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Plugin.PluginCollection">
+            <summary>
+            A strongly-typed collection of <see cref="T:log4net.Plugin.IPlugin"/> objects.
+            </summary>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.ReadOnly(log4net.Plugin.PluginCollection)">
+            <summary>
+            Creates a read-only wrapper for a <c>PluginCollection</c> instance.
+            </summary>
+            <param name="list">list to create a readonly wrapper arround</param>
+            <returns>
+            A <c>PluginCollection</c> wrapper that is read-only.
+            </returns>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.#ctor">
+            <summary>
+            Initializes a new instance of the <c>PluginCollection</c> class
+            that is empty and has the default initial capacity.
+            </summary>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.#ctor(System.Int32)">
+            <summary>
+            Initializes a new instance of the <c>PluginCollection</c> class
+            that has the specified initial capacity.
+            </summary>
+            <param name="capacity">
+            The number of elements that the new <c>PluginCollection</c> is initially capable of storing.
+            </param>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.#ctor(log4net.Plugin.PluginCollection)">
+            <summary>
+            Initializes a new instance of the <c>PluginCollection</c> class
+            that contains elements copied from the specified <c>PluginCollection</c>.
+            </summary>
+            <param name="c">The <c>PluginCollection</c> whose elements are copied to the new collection.</param>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.#ctor(log4net.Plugin.IPlugin[])">
+            <summary>
+            Initializes a new instance of the <c>PluginCollection</c> class
+            that contains elements copied from the specified <see cref="T:log4net.Plugin.IPlugin"/> array.
+            </summary>
+            <param name="a">The <see cref="T:log4net.Plugin.IPlugin"/> array whose elements are copied to the new list.</param>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.#ctor(System.Collections.ICollection)">
+            <summary>
+            Initializes a new instance of the <c>PluginCollection</c> class
+            that contains elements copied from the specified <see cref="T:log4net.Plugin.IPlugin"/> collection.
+            </summary>
+            <param name="col">The <see cref="T:log4net.Plugin.IPlugin"/> collection whose elements are copied to the new list.</param>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.#ctor(log4net.Plugin.PluginCollection.Tag)">
+            <summary>
+            Allow subclasses to avoid our default constructors
+            </summary>
+            <param name="tag"></param>
+            <exclude/>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.CopyTo(log4net.Plugin.IPlugin[])">
+            <summary>
+            Copies the entire <c>PluginCollection</c> to a one-dimensional
+            <see cref="T:log4net.Plugin.IPlugin"/> array.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:log4net.Plugin.IPlugin"/> array to copy to.</param>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.CopyTo(log4net.Plugin.IPlugin[],System.Int32)">
+            <summary>
+            Copies the entire <c>PluginCollection</c> to a one-dimensional
+            <see cref="T:log4net.Plugin.IPlugin"/> array, starting at the specified index of the target array.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:log4net.Plugin.IPlugin"/> array to copy to.</param>
+            <param name="start">The zero-based index in <paramref name="array"/> at which copying begins.</param>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.Add(log4net.Plugin.IPlugin)">
+            <summary>
+            Adds a <see cref="T:log4net.Plugin.IPlugin"/> to the end of the <c>PluginCollection</c>.
+            </summary>
+            <param name="item">The <see cref="T:log4net.Plugin.IPlugin"/> to be added to the end of the <c>PluginCollection</c>.</param>
+            <returns>The index at which the value has been added.</returns>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.Clear">
+            <summary>
+            Removes all elements from the <c>PluginCollection</c>.
+            </summary>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.Clone">
+            <summary>
+            Creates a shallow copy of the <see cref="T:log4net.Plugin.PluginCollection"/>.
+            </summary>
+            <returns>A new <see cref="T:log4net.Plugin.PluginCollection"/> with a shallow copy of the collection data.</returns>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.Contains(log4net.Plugin.IPlugin)">
+            <summary>
+            Determines whether a given <see cref="T:log4net.Plugin.IPlugin"/> is in the <c>PluginCollection</c>.
+            </summary>
+            <param name="item">The <see cref="T:log4net.Plugin.IPlugin"/> to check for.</param>
+            <returns><c>true</c> if <paramref name="item"/> is found in the <c>PluginCollection</c>; otherwise, <c>false</c>.</returns>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.IndexOf(log4net.Plugin.IPlugin)">
+            <summary>
+            Returns the zero-based index of the first occurrence of a <see cref="T:log4net.Plugin.IPlugin"/>
+            in the <c>PluginCollection</c>.
+            </summary>
+            <param name="item">The <see cref="T:log4net.Plugin.IPlugin"/> to locate in the <c>PluginCollection</c>.</param>
+            <returns>
+            The zero-based index of the first occurrence of <paramref name="item"/> 
+            in the entire <c>PluginCollection</c>, if found; otherwise, -1.
+            </returns>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.Insert(System.Int32,log4net.Plugin.IPlugin)">
+            <summary>
+            Inserts an element into the <c>PluginCollection</c> at the specified index.
+            </summary>
+            <param name="index">The zero-based index at which <paramref name="item"/> should be inserted.</param>
+            <param name="item">The <see cref="T:log4net.Plugin.IPlugin"/> to insert.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            <para><paramref name="index"/> is less than zero</para>
+            <para>-or-</para>
+            <para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Plugin.PluginCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.Remove(log4net.Plugin.IPlugin)">
+            <summary>
+            Removes the first occurrence of a specific <see cref="T:log4net.Plugin.IPlugin"/> from the <c>PluginCollection</c>.
+            </summary>
+            <param name="item">The <see cref="T:log4net.Plugin.IPlugin"/> to remove from the <c>PluginCollection</c>.</param>
+            <exception cref="T:System.ArgumentException">
+            The specified <see cref="T:log4net.Plugin.IPlugin"/> was not found in the <c>PluginCollection</c>.
+            </exception>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.RemoveAt(System.Int32)">
+            <summary>
+            Removes the element at the specified index of the <c>PluginCollection</c>.
+            </summary>
+            <param name="index">The zero-based index of the element to remove.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            <para><paramref name="index"/> is less than zero.</para>
+            <para>-or-</para>
+            <para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Plugin.PluginCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.GetEnumerator">
+            <summary>
+            Returns an enumerator that can iterate through the <c>PluginCollection</c>.
+            </summary>
+            <returns>An <see cref="T:log4net.Plugin.PluginCollection.Enumerator"/> for the entire <c>PluginCollection</c>.</returns>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.AddRange(log4net.Plugin.PluginCollection)">
+            <summary>
+            Adds the elements of another <c>PluginCollection</c> to the current <c>PluginCollection</c>.
+            </summary>
+            <param name="x">The <c>PluginCollection</c> whose elements should be added to the end of the current <c>PluginCollection</c>.</param>
+            <returns>The new <see cref="P:log4net.Plugin.PluginCollection.Count"/> of the <c>PluginCollection</c>.</returns>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.AddRange(log4net.Plugin.IPlugin[])">
+            <summary>
+            Adds the elements of a <see cref="T:log4net.Plugin.IPlugin"/> array to the current <c>PluginCollection</c>.
+            </summary>
+            <param name="x">The <see cref="T:log4net.Plugin.IPlugin"/> array whose elements should be added to the end of the <c>PluginCollection</c>.</param>
+            <returns>The new <see cref="P:log4net.Plugin.PluginCollection.Count"/> of the <c>PluginCollection</c>.</returns>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.AddRange(System.Collections.ICollection)">
+            <summary>
+            Adds the elements of a <see cref="T:log4net.Plugin.IPlugin"/> collection to the current <c>PluginCollection</c>.
+            </summary>
+            <param name="col">The <see cref="T:log4net.Plugin.IPlugin"/> collection whose elements should be added to the end of the <c>PluginCollection</c>.</param>
+            <returns>The new <see cref="P:log4net.Plugin.PluginCollection.Count"/> of the <c>PluginCollection</c>.</returns>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.TrimToSize">
+            <summary>
+            Sets the capacity to the actual number of elements.
+            </summary>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.ValidateIndex(System.Int32)">
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            <para><paramref name="index"/> is less than zero.</para>
+            <para>-or-</para>
+            <para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Plugin.PluginCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.ValidateIndex(System.Int32,System.Boolean)">
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            <para><paramref name="index"/> is less than zero.</para>
+            <para>-or-</para>
+            <para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Plugin.PluginCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="P:log4net.Plugin.PluginCollection.Count">
+            <summary>
+            Gets the number of elements actually contained in the <c>PluginCollection</c>.
+            </summary>
+        </member>
+        <member name="P:log4net.Plugin.PluginCollection.IsSynchronized">
+            <summary>
+            Gets a value indicating whether access to the collection is synchronized (thread-safe).
+            </summary>
+            <returns>true if access to the ICollection is synchronized (thread-safe); otherwise, false.</returns>
+        </member>
+        <member name="P:log4net.Plugin.PluginCollection.SyncRoot">
+            <summary>
+            Gets an object that can be used to synchronize access to the collection.
+            </summary>
+            <value>
+            An object that can be used to synchronize access to the collection.
+            </value>
+        </member>
+        <member name="P:log4net.Plugin.PluginCollection.Item(System.Int32)">
+            <summary>
+            Gets or sets the <see cref="T:log4net.Plugin.IPlugin"/> at the specified index.
+            </summary>
+            <value>
+            The <see cref="T:log4net.Plugin.IPlugin"/> at the specified index.
+            </value>
+            <param name="index">The zero-based index of the element to get or set.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            <para><paramref name="index"/> is less than zero.</para>
+            <para>-or-</para>
+            <para><paramref name="index"/> is equal to or greater than <see cref="P:log4net.Plugin.PluginCollection.Count"/>.</para>
+            </exception>
+        </member>
+        <member name="P:log4net.Plugin.PluginCollection.IsFixedSize">
+            <summary>
+            Gets a value indicating whether the collection has a fixed size.
+            </summary>
+            <value><c>true</c> if the collection has a fixed size; otherwise, <c>false</c>. The default is <c>false</c>.</value>
+        </member>
+        <member name="P:log4net.Plugin.PluginCollection.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the IList is read-only.
+            </summary>
+            <value><c>true</c> if the collection is read-only; otherwise, <c>false</c>. The default is <c>false</c>.</value>
+        </member>
+        <member name="P:log4net.Plugin.PluginCollection.Capacity">
+            <summary>
+            Gets or sets the number of elements the <c>PluginCollection</c> can contain.
+            </summary>
+            <value>
+            The number of elements the <c>PluginCollection</c> can contain.
+            </value>
+        </member>
+        <member name="T:log4net.Plugin.PluginCollection.IPluginCollectionEnumerator">
+            <summary>
+            Supports type-safe iteration over a <see cref="T:log4net.Plugin.PluginCollection"/>.
+            </summary>
+            <exclude/>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.IPluginCollectionEnumerator.MoveNext">
+            <summary>
+            Advances the enumerator to the next element in the collection.
+            </summary>
+            <returns>
+            <c>true</c> if the enumerator was successfully advanced to the next element; 
+            <c>false</c> if the enumerator has passed the end of the collection.
+            </returns>
+            <exception cref="T:System.InvalidOperationException">
+            The collection was modified after the enumerator was created.
+            </exception>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.IPluginCollectionEnumerator.Reset">
+            <summary>
+            Sets the enumerator to its initial position, before the first element in the collection.
+            </summary>
+        </member>
+        <member name="P:log4net.Plugin.PluginCollection.IPluginCollectionEnumerator.Current">
+            <summary>
+            Gets the current element in the collection.
+            </summary>
+        </member>
+        <member name="T:log4net.Plugin.PluginCollection.Tag">
+            <summary>
+            Type visible only to our subclasses
+            Used to access protected constructor
+            </summary>
+            <exclude/>
+        </member>
+        <member name="F:log4net.Plugin.PluginCollection.Tag.Default">
+            <summary>
+            A value
+            </summary>
+        </member>
+        <member name="T:log4net.Plugin.PluginCollection.Enumerator">
+            <summary>
+            Supports simple iteration over a <see cref="T:log4net.Plugin.PluginCollection"/>.
+            </summary>
+            <exclude/>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.Enumerator.#ctor(log4net.Plugin.PluginCollection)">
+            <summary>
+            Initializes a new instance of the <c>Enumerator</c> class.
+            </summary>
+            <param name="tc"></param>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.Enumerator.MoveNext">
+            <summary>
+            Advances the enumerator to the next element in the collection.
+            </summary>
+            <returns>
+            <c>true</c> if the enumerator was successfully advanced to the next element; 
+            <c>false</c> if the enumerator has passed the end of the collection.
+            </returns>
+            <exception cref="T:System.InvalidOperationException">
+            The collection was modified after the enumerator was created.
+            </exception>
+        </member>
+        <member name="M:log4net.Plugin.PluginCollection.Enumerator.Reset">
+            <summary>
+            Sets the enumerator to its initial position, before the first element in the collection.
+            </summary>
+        </member>
+        <member name="P:log4net.Plugin.PluginCollection.Enumerator.Current">
+            <summary>
+            Gets the current element in the collection.
+            </summary>
+            <value>
+            The current element in the collection.
+            </value>
+        </member>
+        <member name="T:log4net.Plugin.PluginCollection.ReadOnlyPluginCollection">
+            <exclude/>
+        </member>
+        <member name="T:log4net.Plugin.PluginMap">
+            <summary>
+            Map of repository plugins.
+            </summary>
+            <remarks>
+            <para>
+            This class is a name keyed map of the plugins that are
+            attached to a repository.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Plugin.PluginMap.#ctor(log4net.Repository.ILoggerRepository)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="repository">The repository that the plugins should be attached to.</param>
+            <remarks>
+            <para>
+            Initialize a new instance of the <see cref="T:log4net.Plugin.PluginMap"/> class with a 
+            repository that the plugins should be attached to.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Plugin.PluginMap.Add(log4net.Plugin.IPlugin)">
+            <summary>
+            Adds a <see cref="T:log4net.Plugin.IPlugin"/> to the map.
+            </summary>
+            <param name="plugin">The <see cref="T:log4net.Plugin.IPlugin"/> to add to the map.</param>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Plugin.IPlugin"/> will be attached to the repository when added.
+            </para>
+            <para>
+            If there already exists a plugin with the same name 
+            attached to the repository then the old plugin will
+            be <see cref="M:log4net.Plugin.IPlugin.Shutdown"/> and replaced with
+            the new plugin.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Plugin.PluginMap.Remove(log4net.Plugin.IPlugin)">
+            <summary>
+            Removes a <see cref="T:log4net.Plugin.IPlugin"/> from the map.
+            </summary>
+            <param name="plugin">The <see cref="T:log4net.Plugin.IPlugin"/> to remove from the map.</param>
+            <remarks>
+            <para>
+            Remove a specific plugin from this map.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Plugin.PluginMap.Item(System.String)">
+            <summary>
+            Gets a <see cref="T:log4net.Plugin.IPlugin"/> by name.
+            </summary>
+            <param name="name">The name of the <see cref="T:log4net.Plugin.IPlugin"/> to lookup.</param>
+            <returns>
+            The <see cref="T:log4net.Plugin.IPlugin"/> from the map with the name specified, or 
+            <c>null</c> if no plugin is found.
+            </returns>
+            <remarks>
+            <para>
+            Lookup a plugin by name. If the plugin is not found <c>null</c>
+            will be returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Plugin.PluginMap.AllPlugins">
+            <summary>
+            Gets all possible plugins as a list of <see cref="T:log4net.Plugin.IPlugin"/> objects.
+            </summary>
+            <value>All possible plugins as a list of <see cref="T:log4net.Plugin.IPlugin"/> objects.</value>
+            <remarks>
+            <para>
+            Get a collection of all the plugins defined in this map.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Plugin.PluginSkeleton">
+            <summary>
+            Base implementation of <see cref="T:log4net.Plugin.IPlugin"/>
+            </summary>
+            <remarks>
+            <para>
+            Default abstract implementation of the <see cref="T:log4net.Plugin.IPlugin"/>
+            interface. This base class can be used by implementors
+            of the <see cref="T:log4net.Plugin.IPlugin"/> interface.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Plugin.PluginSkeleton.#ctor(System.String)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="name">the name of the plugin</param>
+            <remarks>
+            Initializes a new Plugin with the specified name.
+            </remarks>
+        </member>
+        <member name="M:log4net.Plugin.PluginSkeleton.Attach(log4net.Repository.ILoggerRepository)">
+            <summary>
+            Attaches this plugin to a <see cref="T:log4net.Repository.ILoggerRepository"/>.
+            </summary>
+            <param name="repository">The <see cref="T:log4net.Repository.ILoggerRepository"/> that this plugin should be attached to.</param>
+            <remarks>
+            <para>
+            A plugin may only be attached to a single repository.
+            </para>
+            <para>
+            This method is called when the plugin is attached to the repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Plugin.PluginSkeleton.Shutdown">
+            <summary>
+            Is called when the plugin is to shutdown.
+            </summary>
+            <remarks>
+            <para>
+            This method is called to notify the plugin that 
+            it should stop operating and should detach from
+            the repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Plugin.PluginSkeleton.m_name">
+            <summary>
+            The name of this plugin.
+            </summary>
+        </member>
+        <member name="F:log4net.Plugin.PluginSkeleton.m_repository">
+            <summary>
+            The repository this plugin is attached to.
+            </summary>
+        </member>
+        <member name="P:log4net.Plugin.PluginSkeleton.Name">
+            <summary>
+            Gets or sets the name of the plugin.
+            </summary>
+            <value>
+            The name of the plugin.
+            </value>
+            <remarks>
+            <para>
+            Plugins are stored in the <see cref="T:log4net.Plugin.PluginMap"/>
+            keyed by name. Each plugin instance attached to a
+            repository must be a unique name.
+            </para>
+            <para>
+            The name of the plugin must not change one the 
+            plugin has been attached to a repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Plugin.PluginSkeleton.LoggerRepository">
+            <summary>
+            The repository for this plugin
+            </summary>
+            <value>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> that this plugin is attached to.
+            </value>
+            <remarks>
+            <para>
+            Gets or sets the <see cref="T:log4net.Repository.ILoggerRepository"/> that this plugin is 
+            attached to.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Plugin.RemoteLoggingServerPlugin">
+            <summary>
+            Plugin that listens for events from the <see cref="T:log4net.Appender.RemotingAppender"/>
+            </summary>
+            <remarks>
+            <para>
+            This plugin publishes an instance of <see cref="T:log4net.Appender.RemotingAppender.IRemoteLoggingSink"/> 
+            on a specified <see cref="P:log4net.Plugin.RemoteLoggingServerPlugin.SinkUri"/>. This listens for logging events delivered from
+            a remote <see cref="T:log4net.Appender.RemotingAppender"/>.
+            </para>
+            <para>
+            When an event is received it is relogged within the attached repository
+            as if it had been raised locally.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Plugin.RemoteLoggingServerPlugin.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Plugin.RemoteLoggingServerPlugin"/> class.
+            </para>
+            <para>
+            The <see cref="P:log4net.Plugin.RemoteLoggingServerPlugin.SinkUri"/> property must be set.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Plugin.RemoteLoggingServerPlugin.#ctor(System.String)">
+            <summary>
+            Construct with sink Uri.
+            </summary>
+            <param name="sinkUri">The name to publish the sink under in the remoting infrastructure. 
+            See <see cref="P:log4net.Plugin.RemoteLoggingServerPlugin.SinkUri"/> for more details.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Plugin.RemoteLoggingServerPlugin"/> class
+            with specified name.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Plugin.RemoteLoggingServerPlugin.Attach(log4net.Repository.ILoggerRepository)">
+            <summary>
+            Attaches this plugin to a <see cref="T:log4net.Repository.ILoggerRepository"/>.
+            </summary>
+            <param name="repository">The <see cref="T:log4net.Repository.ILoggerRepository"/> that this plugin should be attached to.</param>
+            <remarks>
+            <para>
+            A plugin may only be attached to a single repository.
+            </para>
+            <para>
+            This method is called when the plugin is attached to the repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Plugin.RemoteLoggingServerPlugin.Shutdown">
+            <summary>
+            Is called when the plugin is to shutdown.
+            </summary>
+            <remarks>
+            <para>
+            When the plugin is shutdown the remote logging
+            sink is disconnected.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Plugin.RemoteLoggingServerPlugin.SinkUri">
+            <summary>
+            Gets or sets the URI of this sink.
+            </summary>
+            <value>
+            The URI of this sink.
+            </value>
+            <remarks>
+            <para>
+            This is the name under which the object is marshaled.
+            <see cref="M:System.Runtime.Remoting.RemotingServices.Marshal(System.MarshalByRefObject,System.String,System.Type)"/>
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Plugin.RemoteLoggingServerPlugin.RemoteLoggingSinkImpl">
+            <summary>
+            Delivers <see cref="T:log4net.Core.LoggingEvent"/> objects to a remote sink.
+            </summary>
+            <remarks>
+            <para>
+            Internal class used to listen for logging events
+            and deliver them to the local repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Plugin.RemoteLoggingServerPlugin.RemoteLoggingSinkImpl.#ctor(log4net.Repository.ILoggerRepository)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="repository">The repository to log to.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Plugin.RemoteLoggingServerPlugin.RemoteLoggingSinkImpl"/> for the
+            specified <see cref="T:log4net.Repository.ILoggerRepository"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Plugin.RemoteLoggingServerPlugin.RemoteLoggingSinkImpl.LogEvents(log4net.Core.LoggingEvent[])">
+            <summary>
+            Logs the events to the repository.
+            </summary>
+            <param name="events">The events to log.</param>
+            <remarks>
+            <para>
+            The events passed are logged to the <see cref="T:log4net.Repository.ILoggerRepository"/>
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Plugin.RemoteLoggingServerPlugin.RemoteLoggingSinkImpl.InitializeLifetimeService">
+            <summary>
+            Obtains a lifetime service object to control the lifetime 
+            policy for this instance.
+            </summary>
+            <returns><c>null</c> to indicate that this instance should live forever.</returns>
+            <remarks>
+            <para>
+            Obtains a lifetime service object to control the lifetime 
+            policy for this instance. This object should live forever
+            therefore this implementation returns <c>null</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Plugin.RemoteLoggingServerPlugin.RemoteLoggingSinkImpl.m_repository">
+            <summary>
+            The underlying <see cref="T:log4net.Repository.ILoggerRepository"/> that events should
+            be logged to.
+            </summary>
+        </member>
+        <member name="T:log4net.Repository.Hierarchy.DefaultLoggerFactory">
+            <summary>
+            Default implementation of <see cref="T:log4net.Repository.Hierarchy.ILoggerFactory"/>
+            </summary>
+            <remarks>
+            <para>
+            This default implementation of the <see cref="T:log4net.Repository.Hierarchy.ILoggerFactory"/>
+            interface is used to create the default subclass
+            of the <see cref="T:log4net.Repository.Hierarchy.Logger"/> object.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Repository.Hierarchy.ILoggerFactory">
+            <summary>
+            Interface abstracts creation of <see cref="T:log4net.Repository.Hierarchy.Logger"/> instances
+            </summary>
+            <remarks>
+            <para>
+            This interface is used by the <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> to 
+            create new <see cref="T:log4net.Repository.Hierarchy.Logger"/> objects.
+            </para>
+            <para>
+            The <see cref="M:log4net.Repository.Hierarchy.ILoggerFactory.CreateLogger(System.String)"/> method is called
+            to create a named <see cref="T:log4net.Repository.Hierarchy.Logger"/>.
+            </para>
+            <para>
+            Implement this interface to create new subclasses of <see cref="T:log4net.Repository.Hierarchy.Logger"/>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.ILoggerFactory.CreateLogger(System.String)">
+            <summary>
+            Create a new <see cref="T:log4net.Repository.Hierarchy.Logger"/> instance
+            </summary>
+            <param name="name">The name of the <see cref="T:log4net.Repository.Hierarchy.Logger"/>.</param>
+            <returns>The <see cref="T:log4net.Repository.Hierarchy.Logger"/> instance for the specified name.</returns>
+            <remarks>
+            <para>
+            Create a new <see cref="T:log4net.Repository.Hierarchy.Logger"/> instance with the 
+            specified name.
+            </para>
+            <para>
+            Called by the <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> to create
+            new named <see cref="T:log4net.Repository.Hierarchy.Logger"/> instances.
+            </para>
+            <para>
+            If the <paramref name="name"/> is <c>null</c> then the root logger
+            must be returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.DefaultLoggerFactory.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Repository.Hierarchy.DefaultLoggerFactory"/> class. 
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.DefaultLoggerFactory.CreateLogger(System.String)">
+            <summary>
+            Create a new <see cref="T:log4net.Repository.Hierarchy.Logger"/> instance
+            </summary>
+            <param name="name">The name of the <see cref="T:log4net.Repository.Hierarchy.Logger"/>.</param>
+            <returns>The <see cref="T:log4net.Repository.Hierarchy.Logger"/> instance for the specified name.</returns>
+            <remarks>
+            <para>
+            Create a new <see cref="T:log4net.Repository.Hierarchy.Logger"/> instance with the 
+            specified name.
+            </para>
+            <para>
+            Called by the <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> to create
+            new named <see cref="T:log4net.Repository.Hierarchy.Logger"/> instances.
+            </para>
+            <para>
+            If the <paramref name="name"/> is <c>null</c> then the root logger
+            must be returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.Hierarchy.DefaultLoggerFactory.LoggerImpl">
+            <summary>
+            Default internal subclass of <see cref="T:log4net.Repository.Hierarchy.Logger"/>
+            </summary>
+            <remarks>
+            <para>
+            This subclass has no additional behavior over the
+            <see cref="T:log4net.Repository.Hierarchy.Logger"/> class but does allow instances
+            to be created.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.Hierarchy.Logger">
+            <summary>
+            Implementation of <see cref="T:log4net.Core.ILogger"/> used by <see cref="P:log4net.Repository.Hierarchy.Logger.Hierarchy"/>
+            </summary>
+            <remarks>
+            <para>
+            Internal class used to provide implementation of <see cref="T:log4net.Core.ILogger"/>
+            interface. Applications should use <see cref="T:log4net.LogManager"/> to get
+            logger instances.
+            </para>
+            <para>
+            This is one of the central classes in the log4net implementation. One of the
+            distinctive features of log4net are hierarchical loggers and their
+            evaluation. The <see cref="P:log4net.Repository.Hierarchy.Logger.Hierarchy"/> organizes the <see cref="T:log4net.Repository.Hierarchy.Logger"/>
+            instances into a rooted tree hierarchy.
+            </para>
+            <para>
+            The <see cref="T:log4net.Repository.Hierarchy.Logger"/> class is abstract. Only concrete subclasses of
+            <see cref="T:log4net.Repository.Hierarchy.Logger"/> can be created. The <see cref="T:log4net.Repository.Hierarchy.ILoggerFactory"/>
+            is used to create instances of this type for the <see cref="P:log4net.Repository.Hierarchy.Logger.Hierarchy"/>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+            <author>Aspi Havewala</author>
+            <author>Douglas de la Torre</author>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Logger.#ctor(System.String)">
+            <summary>
+            This constructor created a new <see cref="T:log4net.Repository.Hierarchy.Logger"/> instance and
+            sets its name.
+            </summary>
+            <param name="name">The name of the <see cref="T:log4net.Repository.Hierarchy.Logger"/>.</param>
+            <remarks>
+            <para>
+            This constructor is protected and designed to be used by
+            a subclass that is not abstract.
+            </para>
+            <para>
+            Loggers are constructed by <see cref="T:log4net.Repository.Hierarchy.ILoggerFactory"/> 
+            objects. See <see cref="T:log4net.Repository.Hierarchy.DefaultLoggerFactory"/> for the default
+            logger creator.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Logger.AddAppender(log4net.Appender.IAppender)">
+            <summary>
+            Add <paramref name="newAppender"/> to the list of appenders of this
+            Logger instance.
+            </summary>
+            <param name="newAppender">An appender to add to this logger</param>
+            <remarks>
+            <para>
+            Add <paramref name="newAppender"/> to the list of appenders of this
+            Logger instance.
+            </para>
+            <para>
+            If <paramref name="newAppender"/> is already in the list of
+            appenders, then it won't be added again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Logger.GetAppender(System.String)">
+            <summary>
+            Look for the appender named as <c>name</c>
+            </summary>
+            <param name="name">The name of the appender to lookup</param>
+            <returns>The appender with the name specified, or <c>null</c>.</returns>
+            <remarks>
+            <para>
+            Returns the named appender, or null if the appender is not found.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Logger.RemoveAllAppenders">
+            <summary>
+            Remove all previously added appenders from this Logger instance.
+            </summary>
+            <remarks>
+            <para>
+            Remove all previously added appenders from this Logger instance.
+            </para>
+            <para>
+            This is useful when re-reading configuration information.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Logger.RemoveAppender(log4net.Appender.IAppender)">
+            <summary>
+            Remove the appender passed as parameter form the list of appenders.
+            </summary>
+            <param name="appender">The appender to remove</param>
+            <returns>The appender removed from the list</returns>
+            <remarks>
+            <para>
+            Remove the appender passed as parameter form the list of appenders.
+            The appender removed is not closed.
+            If you are discarding the appender you must call
+            <see cref="M:log4net.Appender.IAppender.Close"/> on the appender removed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Logger.RemoveAppender(System.String)">
+            <summary>
+            Remove the appender passed as parameter form the list of appenders.
+            </summary>
+            <param name="name">The name of the appender to remove</param>
+            <returns>The appender removed from the list</returns>
+            <remarks>
+            <para>
+            Remove the named appender passed as parameter form the list of appenders.
+            The appender removed is not closed.
+            If you are discarding the appender you must call
+            <see cref="M:log4net.Appender.IAppender.Close"/> on the appender removed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Logger.Log(System.Type,log4net.Core.Level,System.Object,System.Exception)">
+            <summary>
+            This generic form is intended to be used by wrappers.
+            </summary>
+            <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
+            the stack boundary into the logging system for this call.</param>
+            <param name="level">The level of the message to be logged.</param>
+            <param name="message">The message object to log.</param>
+            <param name="exception">The exception to log, including its stack trace.</param>
+            <remarks>
+            <para>
+            Generate a logging event for the specified <paramref name="level"/> using
+            the <paramref name="message"/> and <paramref name="exception"/>.
+            </para>
+            <para>
+            This method must not throw any exception to the caller.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Logger.Log(log4net.Core.LoggingEvent)">
+            <summary>
+            This is the most generic printing method that is intended to be used 
+            by wrappers.
+            </summary>
+            <param name="logEvent">The event being logged.</param>
+            <remarks>
+            <para>
+            Logs the specified logging event through this logger.
+            </para>
+            <para>
+            This method must not throw any exception to the caller.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Logger.IsEnabledFor(log4net.Core.Level)">
+            <summary>
+            Checks if this logger is enabled for a given <see cref="P:log4net.Repository.Hierarchy.Logger.Level"/> passed as parameter.
+            </summary>
+            <param name="level">The level to check.</param>
+            <returns>
+            <c>true</c> if this logger is enabled for <c>level</c>, otherwise <c>false</c>.
+            </returns>
+            <remarks>
+            <para>
+            Test if this logger is going to log events of the specified <paramref name="level"/>.
+            </para>
+            <para>
+            This method must not throw any exception to the caller.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Logger.CallAppenders(log4net.Core.LoggingEvent)">
+            <summary>
+            Deliver the <see cref="T:log4net.Core.LoggingEvent"/> to the attached appenders.
+            </summary>
+            <param name="loggingEvent">The event to log.</param>
+            <remarks>
+            <para>
+            Call the appenders in the hierarchy starting at
+            <c>this</c>. If no appenders could be found, emit a
+            warning.
+            </para>
+            <para>
+            This method calls all the appenders inherited from the
+            hierarchy circumventing any evaluation of whether to log or not
+            to log the particular log request.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Logger.CloseNestedAppenders">
+            <summary>
+            Closes all attached appenders implementing the <see cref="T:log4net.Core.IAppenderAttachable"/> interface.
+            </summary>
+            <remarks>
+            <para>
+            Used to ensure that the appenders are correctly shutdown.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Logger.Log(log4net.Core.Level,System.Object,System.Exception)">
+            <summary>
+            This is the most generic printing method. This generic form is intended to be used by wrappers
+            </summary>
+            <param name="level">The level of the message to be logged.</param>
+            <param name="message">The message object to log.</param>
+            <param name="exception">The exception to log, including its stack trace.</param>
+            <remarks>
+            <para>
+            Generate a logging event for the specified <paramref name="level"/> using
+            the <paramref name="message"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Logger.ForcedLog(System.Type,log4net.Core.Level,System.Object,System.Exception)">
+            <summary>
+            Creates a new logging event and logs the event without further checks.
+            </summary>
+            <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
+            the stack boundary into the logging system for this call.</param>
+            <param name="level">The level of the message to be logged.</param>
+            <param name="message">The message object to log.</param>
+            <param name="exception">The exception to log, including its stack trace.</param>
+            <remarks>
+            <para>
+            Generates a logging event and delivers it to the attached
+            appenders.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Logger.ForcedLog(log4net.Core.LoggingEvent)">
+            <summary>
+            Creates a new logging event and logs the event without further checks.
+            </summary>
+            <param name="logEvent">The event being logged.</param>
+            <remarks>
+            <para>
+            Delivers the logging event to the attached appenders.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Repository.Hierarchy.Logger.ThisDeclaringType">
+            <summary>
+            The fully qualified type of the Logger class.
+            </summary>
+        </member>
+        <member name="F:log4net.Repository.Hierarchy.Logger.m_name">
+            <summary>
+            The name of this logger.
+            </summary>
+        </member>
+        <member name="F:log4net.Repository.Hierarchy.Logger.m_level">
+            <summary>
+            The assigned level of this logger. 
+            </summary>
+            <remarks>
+            <para>
+            The <c>level</c> variable need not be 
+            assigned a value in which case it is inherited 
+            form the hierarchy.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Repository.Hierarchy.Logger.m_parent">
+            <summary>
+            The parent of this logger.
+            </summary>
+            <remarks>
+            <para>
+            The parent of this logger. 
+            All loggers have at least one ancestor which is the root logger.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Repository.Hierarchy.Logger.m_hierarchy">
+            <summary>
+            Loggers need to know what Hierarchy they are in.
+            </summary>
+            <remarks>
+            <para>
+            Loggers need to know what Hierarchy they are in.
+            The hierarchy that this logger is a member of is stored
+            here.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Repository.Hierarchy.Logger.m_appenderAttachedImpl">
+            <summary>
+            Helper implementation of the <see cref="T:log4net.Core.IAppenderAttachable"/> interface
+            </summary>
+        </member>
+        <member name="F:log4net.Repository.Hierarchy.Logger.m_additive">
+            <summary>
+            Flag indicating if child loggers inherit their parents appenders
+            </summary>
+            <remarks>
+            <para>
+            Additivity is set to true by default, that is children inherit
+            the appenders of their ancestors by default. If this variable is
+            set to <c>false</c> then the appenders found in the
+            ancestors of this logger are not used. However, the children
+            of this logger will inherit its appenders, unless the children
+            have their additivity flag set to <c>false</c> too. See
+            the user manual for more details.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Repository.Hierarchy.Logger.m_appenderLock">
+            <summary>
+            Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl
+            </summary>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Logger.Parent">
+            <summary>
+            Gets or sets the parent logger in the hierarchy.
+            </summary>
+            <value>
+            The parent logger in the hierarchy.
+            </value>
+            <remarks>
+            <para>
+            Part of the Composite pattern that makes the hierarchy.
+            The hierarchy is parent linked rather than child linked.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Logger.Additivity">
+            <summary>
+            Gets or sets a value indicating if child loggers inherit their parent's appenders.
+            </summary>
+            <value>
+            <c>true</c> if child loggers inherit their parent's appenders.
+            </value>
+            <remarks>
+            <para>
+            Additivity is set to <c>true</c> by default, that is children inherit
+            the appenders of their ancestors by default. If this variable is
+            set to <c>false</c> then the appenders found in the
+            ancestors of this logger are not used. However, the children
+            of this logger will inherit its appenders, unless the children
+            have their additivity flag set to <c>false</c> too. See
+            the user manual for more details.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Logger.EffectiveLevel">
+            <summary>
+            Gets the effective level for this logger.
+            </summary>
+            <returns>The nearest level in the logger hierarchy.</returns>
+            <remarks>
+            <para>
+            Starting from this logger, searches the logger hierarchy for a
+            non-null level and returns it. Otherwise, returns the level of the
+            root logger.
+            </para>
+            <para>The Logger class is designed so that this method executes as
+            quickly as possible.</para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Logger.Hierarchy">
+            <summary>
+            Gets or sets the <see cref="P:log4net.Repository.Hierarchy.Logger.Hierarchy"/> where this 
+            <c>Logger</c> instance is attached to.
+            </summary>
+            <value>The hierarchy that this logger belongs to.</value>
+            <remarks>
+            <para>
+            This logger must be attached to a single <see cref="P:log4net.Repository.Hierarchy.Logger.Hierarchy"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Logger.Level">
+            <summary>
+            Gets or sets the assigned <see cref="P:log4net.Repository.Hierarchy.Logger.Level"/>, if any, for this Logger.  
+            </summary>
+            <value>
+            The <see cref="P:log4net.Repository.Hierarchy.Logger.Level"/> of this logger.
+            </value>
+            <remarks>
+            <para>
+            The assigned <see cref="P:log4net.Repository.Hierarchy.Logger.Level"/> can be <c>null</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Logger.Appenders">
+            <summary>
+            Get the appenders contained in this logger as an 
+            <see cref="T:System.Collections.ICollection"/>.
+            </summary>
+            <returns>A collection of the appenders in this logger</returns>
+            <remarks>
+            <para>
+            Get the appenders contained in this logger as an 
+            <see cref="T:System.Collections.ICollection"/>. If no appenders 
+            can be found, then a <see cref="T:log4net.Util.EmptyCollection"/> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Logger.Name">
+            <summary>
+            Gets the logger name.
+            </summary>
+            <value>
+            The name of the logger.
+            </value>
+            <remarks>
+            <para>
+            The name of this logger
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Logger.Repository">
+            <summary>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> where this 
+            <c>Logger</c> instance is attached to.
+            </summary>
+            <value>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> that this logger belongs to.
+            </value>
+            <remarks>
+            <para>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> where this 
+            <c>Logger</c> instance is attached to.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.DefaultLoggerFactory.LoggerImpl.#ctor(System.String)">
+            <summary>
+            Construct a new Logger
+            </summary>
+            <param name="name">the name of the logger</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Repository.Hierarchy.DefaultLoggerFactory.LoggerImpl"/> class
+            with the specified name. 
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.Hierarchy.LoggerCreationEventHandler">
+            <summary>
+            Delegate used to handle logger creation event notifications.
+            </summary>
+            <param name="sender">The <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> in which the <see cref="T:log4net.Repository.Hierarchy.Logger"/> has been created.</param>
+            <param name="e">The <see cref="T:log4net.Repository.Hierarchy.LoggerCreationEventArgs"/> event args that hold the <see cref="T:log4net.Repository.Hierarchy.Logger"/> instance that has been created.</param>
+            <remarks>
+            <para>
+            Delegate used to handle logger creation event notifications.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.Hierarchy.LoggerCreationEventArgs">
+            <summary>
+            Provides data for the <see cref="E:log4net.Repository.Hierarchy.Hierarchy.LoggerCreatedEvent"/> event.
+            </summary>
+            <remarks>
+            <para>
+            A <see cref="E:log4net.Repository.Hierarchy.Hierarchy.LoggerCreatedEvent"/> event is raised every time a
+            <see cref="P:log4net.Repository.Hierarchy.LoggerCreationEventArgs.Logger"/> is created.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Repository.Hierarchy.LoggerCreationEventArgs.m_log">
+            <summary>
+            The <see cref="P:log4net.Repository.Hierarchy.LoggerCreationEventArgs.Logger"/> created
+            </summary>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.LoggerCreationEventArgs.#ctor(log4net.Repository.Hierarchy.Logger)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="log">The <see cref="P:log4net.Repository.Hierarchy.LoggerCreationEventArgs.Logger"/> that has been created.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Repository.Hierarchy.LoggerCreationEventArgs"/> event argument 
+            class,with the specified <see cref="P:log4net.Repository.Hierarchy.LoggerCreationEventArgs.Logger"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.LoggerCreationEventArgs.Logger">
+            <summary>
+            Gets the <see cref="P:log4net.Repository.Hierarchy.LoggerCreationEventArgs.Logger"/> that has been created.
+            </summary>
+            <value>
+            The <see cref="P:log4net.Repository.Hierarchy.LoggerCreationEventArgs.Logger"/> that has been created.
+            </value>
+            <remarks>
+            <para>
+            The <see cref="P:log4net.Repository.Hierarchy.LoggerCreationEventArgs.Logger"/> that has been created.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.Hierarchy.Hierarchy">
+            <summary>
+            Hierarchical organization of loggers
+            </summary>
+            <remarks>
+            <para>
+            <i>The casual user should not have to deal with this class
+            directly.</i>
+            </para>
+            <para>
+            This class is specialized in retrieving loggers by name and
+            also maintaining the logger hierarchy. Implements the 
+            <see cref="T:log4net.Repository.ILoggerRepository"/> interface.
+            </para>
+            <para>
+            The structure of the logger hierarchy is maintained by the
+            <see cref="M:log4net.Repository.Hierarchy.Hierarchy.GetLogger(System.String)"/> method. The hierarchy is such that children
+            link to their parent but parents do not have any references to their
+            children. Moreover, loggers can be instantiated in any order, in
+            particular descendant before ancestor.
+            </para>
+            <para>
+            In case a descendant is created before a particular ancestor,
+            then it creates a provision node for the ancestor and adds itself
+            to the provision node. Other descendants of the same ancestor add
+            themselves to the previously created provision node.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Repository.LoggerRepositorySkeleton">
+            <summary>
+            Base implementation of <see cref="T:log4net.Repository.ILoggerRepository"/>
+            </summary>
+            <remarks>
+            <para>
+            Default abstract implementation of the <see cref="T:log4net.Repository.ILoggerRepository"/> interface.
+            </para>
+            <para>
+            Skeleton implementation of the <see cref="T:log4net.Repository.ILoggerRepository"/> interface.
+            All <see cref="T:log4net.Repository.ILoggerRepository"/> types can extend this type.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Repository.ILoggerRepository">
+            <summary>
+            Interface implemented by logger repositories.
+            </summary>
+            <remarks>
+            <para>
+            This interface is implemented by logger repositories. e.g. 
+            <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/>.
+            </para>
+            <para>
+            This interface is used by the <see cref="T:log4net.LogManager"/>
+            to obtain <see cref="T:log4net.ILog"/> interfaces.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Repository.ILoggerRepository.Exists(System.String)">
+            <summary>
+            Check if the named logger exists in the repository. If so return
+            its reference, otherwise returns <c>null</c>.
+            </summary>
+            <param name="name">The name of the logger to lookup</param>
+            <returns>The Logger object with the name specified</returns>
+            <remarks>
+            <para>
+            If the names logger exists it is returned, otherwise
+            <c>null</c> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.ILoggerRepository.GetCurrentLoggers">
+            <summary>
+            Returns all the currently defined loggers as an Array.
+            </summary>
+            <returns>All the defined loggers</returns>
+            <remarks>
+            <para>
+            Returns all the currently defined loggers as an Array.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.ILoggerRepository.GetLogger(System.String)">
+            <summary>
+            Returns a named logger instance
+            </summary>
+            <param name="name">The name of the logger to retrieve</param>
+            <returns>The logger object with the name specified</returns>
+            <remarks>
+            <para>
+            Returns a named logger instance.
+            </para>
+            <para>
+            If a logger of that name already exists, then it will be
+            returned.  Otherwise, a new logger will be instantiated and
+            then linked with its existing ancestors as well as children.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.ILoggerRepository.Shutdown">
+            <summary>Shutdown the repository</summary>
+            <remarks>
+            <para>
+            Shutting down a repository will <i>safely</i> close and remove
+            all appenders in all loggers including the root logger.
+            </para>
+            <para>
+            Some appenders need to be closed before the
+            application exists. Otherwise, pending logging events might be
+            lost.
+            </para>
+            <para>
+            The <see cref="M:log4net.Repository.ILoggerRepository.Shutdown"/> method is careful to close nested
+            appenders before closing regular appenders. This is allows
+            configurations where a regular appender is attached to a logger
+            and again to a nested appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.ILoggerRepository.ResetConfiguration">
+            <summary>
+            Reset the repositories configuration to a default state
+            </summary>
+            <remarks>
+            <para>
+            Reset all values contained in this instance to their
+            default state.
+            </para>
+            <para>
+            Existing loggers are not removed. They are just reset.
+            </para>
+            <para>
+            This method should be used sparingly and with care as it will
+            block all logging until it is completed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.ILoggerRepository.Log(log4net.Core.LoggingEvent)">
+            <summary>
+            Log the <see cref="T:log4net.Core.LoggingEvent"/> through this repository.
+            </summary>
+            <param name="logEvent">the event to log</param>
+            <remarks>
+            <para>
+            This method should not normally be used to log.
+            The <see cref="T:log4net.ILog"/> interface should be used 
+            for routine logging. This interface can be obtained
+            using the <see cref="M:log4net.LogManager.GetLogger(System.String)"/> method.
+            </para>
+            <para>
+            The <c>logEvent</c> is delivered to the appropriate logger and
+            that logger is then responsible for logging the event.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.ILoggerRepository.GetAppenders">
+            <summary>
+            Returns all the Appenders that are configured as an Array.
+            </summary>
+            <returns>All the Appenders</returns>
+            <remarks>
+            <para>
+            Returns all the Appenders that are configured as an Array.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.ILoggerRepository.Name">
+            <summary>
+            The name of the repository
+            </summary>
+            <value>
+            The name of the repository
+            </value>
+            <remarks>
+            <para>
+            The name of the repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.ILoggerRepository.RendererMap">
+            <summary>
+            RendererMap accesses the object renderer map for this repository.
+            </summary>
+            <value>
+            RendererMap accesses the object renderer map for this repository.
+            </value>
+            <remarks>
+            <para>
+            RendererMap accesses the object renderer map for this repository.
+            </para>
+            <para>
+            The RendererMap holds a mapping between types and
+            <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/> objects.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.ILoggerRepository.PluginMap">
+            <summary>
+            The plugin map for this repository.
+            </summary>
+            <value>
+            The plugin map for this repository.
+            </value>
+            <remarks>
+            <para>
+            The plugin map holds the <see cref="T:log4net.Plugin.IPlugin"/> instances
+            that have been attached to this repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.ILoggerRepository.LevelMap">
+            <summary>
+            Get the level map for the Repository.
+            </summary>
+            <remarks>
+            <para>
+            Get the level map for the Repository.
+            </para>
+            <para>
+            The level map defines the mappings between
+            level names and <see cref="T:log4net.Core.Level"/> objects in
+            this repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.ILoggerRepository.Threshold">
+            <summary>
+            The threshold for all events in this repository
+            </summary>
+            <value>
+            The threshold for all events in this repository
+            </value>
+            <remarks>
+            <para>
+            The threshold for all events in this repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.ILoggerRepository.Configured">
+            <summary>
+            Flag indicates if this repository has been configured.
+            </summary>
+            <value>
+            Flag indicates if this repository has been configured.
+            </value>
+            <remarks>
+            <para>
+            Flag indicates if this repository has been configured.
+            </para>
+            </remarks>
+        </member>
+        <member name="E:log4net.Repository.ILoggerRepository.ShutdownEvent">
+            <summary>
+            Event to notify that the repository has been shutdown.
+            </summary>
+            <value>
+            Event to notify that the repository has been shutdown.
+            </value>
+            <remarks>
+            <para>
+            Event raised when the repository has been shutdown.
+            </para>
+            </remarks>
+        </member>
+        <member name="E:log4net.Repository.ILoggerRepository.ConfigurationReset">
+            <summary>
+            Event to notify that the repository has had its configuration reset.
+            </summary>
+            <value>
+            Event to notify that the repository has had its configuration reset.
+            </value>
+            <remarks>
+            <para>
+            Event raised when the repository's configuration has been
+            reset to default.
+            </para>
+            </remarks>
+        </member>
+        <member name="E:log4net.Repository.ILoggerRepository.ConfigurationChanged">
+            <summary>
+            Event to notify that the repository has had its configuration changed.
+            </summary>
+            <value>
+            Event to notify that the repository has had its configuration changed.
+            </value>
+            <remarks>
+            <para>
+            Event raised when the repository's configuration has been changed.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.ILoggerRepository.Properties">
+            <summary>
+            Repository specific properties
+            </summary>
+            <value>
+            Repository specific properties
+            </value>
+            <remarks>
+            <para>
+            These properties can be specified on a repository specific basis.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.LoggerRepositorySkeleton.#ctor">
+            <summary>
+            Default Constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes the repository with default (empty) properties.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.LoggerRepositorySkeleton.#ctor(log4net.Util.PropertiesDictionary)">
+            <summary>
+            Construct the repository using specific properties
+            </summary>
+            <param name="properties">the properties to set for this repository</param>
+            <remarks>
+            <para>
+            Initializes the repository with specified properties.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.LoggerRepositorySkeleton.Exists(System.String)">
+            <summary>
+            Test if logger exists
+            </summary>
+            <param name="name">The name of the logger to lookup</param>
+            <returns>The Logger object with the name specified</returns>
+            <remarks>
+            <para>
+            Check if the named logger exists in the repository. If so return
+            its reference, otherwise returns <c>null</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.LoggerRepositorySkeleton.GetCurrentLoggers">
+            <summary>
+            Returns all the currently defined loggers in the repository
+            </summary>
+            <returns>All the defined loggers</returns>
+            <remarks>
+            <para>
+            Returns all the currently defined loggers in the repository as an Array.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.LoggerRepositorySkeleton.GetLogger(System.String)">
+            <summary>
+            Return a new logger instance
+            </summary>
+            <param name="name">The name of the logger to retrieve</param>
+            <returns>The logger object with the name specified</returns>
+            <remarks>
+            <para>
+            Return a new logger instance.
+            </para>
+            <para>
+            If a logger of that name already exists, then it will be
+            returned. Otherwise, a new logger will be instantiated and
+            then linked with its existing ancestors as well as children.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.LoggerRepositorySkeleton.Shutdown">
+            <summary>
+            Shutdown the repository
+            </summary>
+            <remarks>
+            <para>
+            Shutdown the repository. Can be overridden in a subclass.
+            This base class implementation notifies the <see cref="E:log4net.Repository.LoggerRepositorySkeleton.ShutdownEvent"/>
+            listeners and all attached plugins of the shutdown event.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.LoggerRepositorySkeleton.ResetConfiguration">
+            <summary>
+            Reset the repositories configuration to a default state
+            </summary>
+            <remarks>
+            <para>
+            Reset all values contained in this instance to their
+            default state.
+            </para>
+            <para>
+            Existing loggers are not removed. They are just reset.
+            </para>
+            <para>
+            This method should be used sparingly and with care as it will
+            block all logging until it is completed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.LoggerRepositorySkeleton.Log(log4net.Core.LoggingEvent)">
+            <summary>
+            Log the logEvent through this repository.
+            </summary>
+            <param name="logEvent">the event to log</param>
+            <remarks>
+            <para>
+            This method should not normally be used to log.
+            The <see cref="T:log4net.ILog"/> interface should be used 
+            for routine logging. This interface can be obtained
+            using the <see cref="M:log4net.LogManager.GetLogger(System.String)"/> method.
+            </para>
+            <para>
+            The <c>logEvent</c> is delivered to the appropriate logger and
+            that logger is then responsible for logging the event.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.LoggerRepositorySkeleton.GetAppenders">
+            <summary>
+            Returns all the Appenders that are configured as an Array.
+            </summary>
+            <returns>All the Appenders</returns>
+            <remarks>
+            <para>
+            Returns all the Appenders that are configured as an Array.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.LoggerRepositorySkeleton.AddRenderer(System.Type,log4net.ObjectRenderer.IObjectRenderer)">
+            <summary>
+            Adds an object renderer for a specific class. 
+            </summary>
+            <param name="typeToRender">The type that will be rendered by the renderer supplied.</param>
+            <param name="rendererInstance">The object renderer used to render the object.</param>
+            <remarks>
+            <para>
+            Adds an object renderer for a specific class. 
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.LoggerRepositorySkeleton.OnShutdown(System.EventArgs)">
+            <summary>
+            Notify the registered listeners that the repository is shutting down
+            </summary>
+            <param name="e">Empty EventArgs</param>
+            <remarks>
+            <para>
+            Notify any listeners that this repository is shutting down.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.LoggerRepositorySkeleton.OnConfigurationReset(System.EventArgs)">
+            <summary>
+            Notify the registered listeners that the repository has had its configuration reset
+            </summary>
+            <param name="e">Empty EventArgs</param>
+            <remarks>
+            <para>
+            Notify any listeners that this repository's configuration has been reset.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.LoggerRepositorySkeleton.OnConfigurationChanged(System.EventArgs)">
+            <summary>
+            Notify the registered listeners that the repository has had its configuration changed
+            </summary>
+            <param name="e">Empty EventArgs</param>
+            <remarks>
+            <para>
+            Notify any listeners that this repository's configuration has changed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.LoggerRepositorySkeleton.RaiseConfigurationChanged(System.EventArgs)">
+            <summary>
+            Raise a configuration changed event on this repository
+            </summary>
+            <param name="e">EventArgs.Empty</param>
+            <remarks>
+            <para>
+            Applications that programmatically change the configuration of the repository should
+            raise this event notification to notify listeners.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.LoggerRepositorySkeleton.Name">
+            <summary>
+            The name of the repository
+            </summary>
+            <value>
+            The string name of the repository
+            </value>
+            <remarks>
+            <para>
+            The name of this repository. The name is
+            used to store and lookup the repositories 
+            stored by the <see cref="T:log4net.Core.IRepositorySelector"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.LoggerRepositorySkeleton.Threshold">
+            <summary>
+            The threshold for all events in this repository
+            </summary>
+            <value>
+            The threshold for all events in this repository
+            </value>
+            <remarks>
+            <para>
+            The threshold for all events in this repository
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.LoggerRepositorySkeleton.RendererMap">
+            <summary>
+            RendererMap accesses the object renderer map for this repository.
+            </summary>
+            <value>
+            RendererMap accesses the object renderer map for this repository.
+            </value>
+            <remarks>
+            <para>
+            RendererMap accesses the object renderer map for this repository.
+            </para>
+            <para>
+            The RendererMap holds a mapping between types and
+            <see cref="T:log4net.ObjectRenderer.IObjectRenderer"/> objects.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.LoggerRepositorySkeleton.PluginMap">
+            <summary>
+            The plugin map for this repository.
+            </summary>
+            <value>
+            The plugin map for this repository.
+            </value>
+            <remarks>
+            <para>
+            The plugin map holds the <see cref="T:log4net.Plugin.IPlugin"/> instances
+            that have been attached to this repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.LoggerRepositorySkeleton.LevelMap">
+            <summary>
+            Get the level map for the Repository.
+            </summary>
+            <remarks>
+            <para>
+            Get the level map for the Repository.
+            </para>
+            <para>
+            The level map defines the mappings between
+            level names and <see cref="T:log4net.Core.Level"/> objects in
+            this repository.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.LoggerRepositorySkeleton.Configured">
+            <summary>
+            Flag indicates if this repository has been configured.
+            </summary>
+            <value>
+            Flag indicates if this repository has been configured.
+            </value>
+            <remarks>
+            <para>
+            Flag indicates if this repository has been configured.
+            </para>
+            </remarks>
+        </member>
+        <member name="E:log4net.Repository.LoggerRepositorySkeleton.ShutdownEvent">
+            <summary>
+            Event to notify that the repository has been shutdown.
+            </summary>
+            <value>
+            Event to notify that the repository has been shutdown.
+            </value>
+            <remarks>
+            <para>
+            Event raised when the repository has been shutdown.
+            </para>
+            </remarks>
+        </member>
+        <member name="E:log4net.Repository.LoggerRepositorySkeleton.ConfigurationReset">
+            <summary>
+            Event to notify that the repository has had its configuration reset.
+            </summary>
+            <value>
+            Event to notify that the repository has had its configuration reset.
+            </value>
+            <remarks>
+            <para>
+            Event raised when the repository's configuration has been
+            reset to default.
+            </para>
+            </remarks>
+        </member>
+        <member name="E:log4net.Repository.LoggerRepositorySkeleton.ConfigurationChanged">
+            <summary>
+            Event to notify that the repository has had its configuration changed.
+            </summary>
+            <value>
+            Event to notify that the repository has had its configuration changed.
+            </value>
+            <remarks>
+            <para>
+            Event raised when the repository's configuration has been changed.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.LoggerRepositorySkeleton.Properties">
+            <summary>
+            Repository specific properties
+            </summary>
+            <value>
+            Repository specific properties
+            </value>
+            <remarks>
+            These properties can be specified on a repository specific basis
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.IBasicRepositoryConfigurator">
+            <summary>
+            Basic Configurator interface for repositories
+            </summary>
+            <remarks>
+            <para>
+            Interface used by basic configurator to configure a <see cref="T:log4net.Repository.ILoggerRepository"/>
+            with a default <see cref="T:log4net.Appender.IAppender"/>.
+            </para>
+            <para>
+            A <see cref="T:log4net.Repository.ILoggerRepository"/> should implement this interface to support
+            configuration by the <see cref="T:log4net.Config.BasicConfigurator"/>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Repository.IBasicRepositoryConfigurator.Configure(log4net.Appender.IAppender)">
+            <summary>
+            Initialize the repository using the specified appender
+            </summary>
+            <param name="appender">the appender to use to log all logging events</param>
+            <remarks>
+            <para>
+            Configure the repository to route all logging events to the
+            specified appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.IXmlRepositoryConfigurator">
+            <summary>
+            Configure repository using XML
+            </summary>
+            <remarks>
+            <para>
+            Interface used by Xml configurator to configure a <see cref="T:log4net.Repository.ILoggerRepository"/>.
+            </para>
+            <para>
+            A <see cref="T:log4net.Repository.ILoggerRepository"/> should implement this interface to support
+            configuration by the <see cref="T:log4net.Config.XmlConfigurator"/>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Repository.IXmlRepositoryConfigurator.Configure(System.Xml.XmlElement)">
+            <summary>
+            Initialize the repository using the specified config
+            </summary>
+            <param name="element">the element containing the root of the config</param>
+            <remarks>
+            <para>
+            The schema for the XML configuration data is defined by
+            the implementation.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.#ctor(log4net.Util.PropertiesDictionary)">
+            <summary>
+            Construct with properties
+            </summary>
+            <param name="properties">The properties to pass to this repository.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.#ctor(log4net.Repository.Hierarchy.ILoggerFactory)">
+            <summary>
+            Construct with a logger factory
+            </summary>
+            <param name="loggerFactory">The factory to use to create new logger instances.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> class with 
+            the specified <see cref="T:log4net.Repository.Hierarchy.ILoggerFactory"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.#ctor(log4net.Util.PropertiesDictionary,log4net.Repository.Hierarchy.ILoggerFactory)">
+            <summary>
+            Construct with properties and a logger factory
+            </summary>
+            <param name="properties">The properties to pass to this repository.</param>
+            <param name="loggerFactory">The factory to use to create new logger instances.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> class with 
+            the specified <see cref="T:log4net.Repository.Hierarchy.ILoggerFactory"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.Exists(System.String)">
+            <summary>
+            Test if a logger exists
+            </summary>
+            <param name="name">The name of the logger to lookup</param>
+            <returns>The Logger object with the name specified</returns>
+            <remarks>
+            <para>
+            Check if the named logger exists in the hierarchy. If so return
+            its reference, otherwise returns <c>null</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.GetCurrentLoggers">
+            <summary>
+            Returns all the currently defined loggers in the hierarchy as an Array
+            </summary>
+            <returns>All the defined loggers</returns>
+            <remarks>
+            <para>
+            Returns all the currently defined loggers in the hierarchy as an Array.
+            The root logger is <b>not</b> included in the returned
+            enumeration.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.GetLogger(System.String)">
+            <summary>
+            Return a new logger instance named as the first parameter using
+            the default factory.
+            </summary>
+            <remarks>
+            <para>
+            Return a new logger instance named as the first parameter using
+            the default factory.
+            </para>
+            <para>
+            If a logger of that name already exists, then it will be
+            returned.  Otherwise, a new logger will be instantiated and
+            then linked with its existing ancestors as well as children.
+            </para>
+            </remarks>
+            <param name="name">The name of the logger to retrieve</param>
+            <returns>The logger object with the name specified</returns>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.Shutdown">
+            <summary>
+            Shutting down a hierarchy will <i>safely</i> close and remove
+            all appenders in all loggers including the root logger.
+            </summary>
+            <remarks>
+            <para>
+            Shutting down a hierarchy will <i>safely</i> close and remove
+            all appenders in all loggers including the root logger.
+            </para>
+            <para>
+            Some appenders need to be closed before the
+            application exists. Otherwise, pending logging events might be
+            lost.
+            </para>
+            <para>
+            The <c>Shutdown</c> method is careful to close nested
+            appenders before closing regular appenders. This is allows
+            configurations where a regular appender is attached to a logger
+            and again to a nested appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.ResetConfiguration">
+            <summary>
+            Reset all values contained in this hierarchy instance to their default.
+            </summary>
+            <remarks>
+            <para>
+            Reset all values contained in this hierarchy instance to their
+            default.  This removes all appenders from all loggers, sets
+            the level of all non-root loggers to <c>null</c>,
+            sets their additivity flag to <c>true</c> and sets the level
+            of the root logger to <see cref="F:log4net.Core.Level.Debug"/>. Moreover,
+            message disabling is set its default "off" value.
+            </para>
+            <para>
+            Existing loggers are not removed. They are just reset.
+            </para>
+            <para>
+            This method should be used sparingly and with care as it will
+            block all logging until it is completed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.Log(log4net.Core.LoggingEvent)">
+            <summary>
+            Log the logEvent through this hierarchy.
+            </summary>
+            <param name="logEvent">the event to log</param>
+            <remarks>
+            <para>
+            This method should not normally be used to log.
+            The <see cref="T:log4net.ILog"/> interface should be used 
+            for routine logging. This interface can be obtained
+            using the <see cref="M:log4net.LogManager.GetLogger(System.String)"/> method.
+            </para>
+            <para>
+            The <c>logEvent</c> is delivered to the appropriate logger and
+            that logger is then responsible for logging the event.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.GetAppenders">
+            <summary>
+            Returns all the Appenders that are currently configured
+            </summary>
+            <returns>An array containing all the currently configured appenders</returns>
+            <remarks>
+            <para>
+            Returns all the <see cref="T:log4net.Appender.IAppender"/> instances that are currently configured.
+            All the loggers are searched for appenders. The appenders may also be containers
+            for appenders and these are also searched for additional loggers.
+            </para>
+            <para>
+            The list returned is unordered but does not contain duplicates.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.CollectAppender(System.Collections.ArrayList,log4net.Appender.IAppender)">
+            <summary>
+            Collect the appenders from an <see cref="T:log4net.Core.IAppenderAttachable"/>.
+            The appender may also be a container.
+            </summary>
+            <param name="appenderList"></param>
+            <param name="appender"></param>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.CollectAppenders(System.Collections.ArrayList,log4net.Core.IAppenderAttachable)">
+            <summary>
+            Collect the appenders from an <see cref="T:log4net.Core.IAppenderAttachable"/> container
+            </summary>
+            <param name="appenderList"></param>
+            <param name="container"></param>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.log4net#Repository#IBasicRepositoryConfigurator#Configure(log4net.Appender.IAppender)">
+            <summary>
+            Initialize the log4net system using the specified appender
+            </summary>
+            <param name="appender">the appender to use to log all logging events</param>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.BasicRepositoryConfigure(log4net.Appender.IAppender)">
+            <summary>
+            Initialize the log4net system using the specified appender
+            </summary>
+            <param name="appender">the appender to use to log all logging events</param>
+            <remarks>
+            <para>
+            This method provides the same functionality as the 
+            <see cref="M:log4net.Repository.IBasicRepositoryConfigurator.Configure(log4net.Appender.IAppender)"/> method implemented
+            on this object, but it is protected and therefore can be called by subclasses.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.log4net#Repository#IXmlRepositoryConfigurator#Configure(System.Xml.XmlElement)">
+            <summary>
+            Initialize the log4net system using the specified config
+            </summary>
+            <param name="element">the element containing the root of the config</param>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.XmlRepositoryConfigure(System.Xml.XmlElement)">
+            <summary>
+            Initialize the log4net system using the specified config
+            </summary>
+            <param name="element">the element containing the root of the config</param>
+            <remarks>
+            <para>
+            This method provides the same functionality as the 
+            <see cref="M:log4net.Repository.IBasicRepositoryConfigurator.Configure(log4net.Appender.IAppender)"/> method implemented
+            on this object, but it is protected and therefore can be called by subclasses.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.IsDisabled(log4net.Core.Level)">
+            <summary>
+            Test if this hierarchy is disabled for the specified <see cref="T:log4net.Core.Level"/>.
+            </summary>
+            <param name="level">The level to check against.</param>
+            <returns>
+            <c>true</c> if the repository is disabled for the level argument, <c>false</c> otherwise.
+            </returns>
+            <remarks>
+            <para>
+            If this hierarchy has not been configured then this method will
+            always return <c>true</c>.
+            </para>
+            <para>
+            This method will return <c>true</c> if this repository is
+            disabled for <c>level</c> object passed as parameter and
+            <c>false</c> otherwise.
+            </para>
+            <para>
+            See also the <see cref="P:log4net.Repository.ILoggerRepository.Threshold"/> property.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.Clear">
+            <summary>
+            Clear all logger definitions from the internal hashtable
+            </summary>
+            <remarks>
+            <para>
+            This call will clear all logger definitions from the internal
+            hashtable. Invoking this method will irrevocably mess up the
+            logger hierarchy.
+            </para>
+            <para>
+            You should <b>really</b> know what you are doing before
+            invoking this method.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.GetLogger(System.String,log4net.Repository.Hierarchy.ILoggerFactory)">
+            <summary>
+            Return a new logger instance named as the first parameter using
+            <paramref name="factory"/>.
+            </summary>
+            <param name="name">The name of the logger to retrieve</param>
+            <param name="factory">The factory that will make the new logger instance</param>
+            <returns>The logger object with the name specified</returns>
+            <remarks>
+            <para>
+            If a logger of that name already exists, then it will be
+            returned. Otherwise, a new logger will be instantiated by the
+            <paramref name="factory"/> parameter and linked with its existing
+            ancestors as well as children.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.OnLoggerCreationEvent(log4net.Repository.Hierarchy.Logger)">
+            <summary>
+            Sends a logger creation event to all registered listeners
+            </summary>
+            <param name="logger">The newly created logger</param>
+            <remarks>
+            Raises the logger creation event.
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.UpdateParents(log4net.Repository.Hierarchy.Logger)">
+            <summary>
+            Updates all the parents of the specified logger
+            </summary>
+            <param name="log">The logger to update the parents for</param>
+            <remarks>
+            <para>
+            This method loops through all the <i>potential</i> parents of
+            <paramref name="log"/>. There 3 possible cases:
+            </para>
+            <list type="number">
+            	<item>
+            		<term>No entry for the potential parent of <paramref name="log"/> exists</term>
+            		<description>
+            		We create a ProvisionNode for this potential 
+            		parent and insert <paramref name="log"/> in that provision node.
+            		</description>
+            	</item>
+            	<item>
+            		<term>The entry is of type Logger for the potential parent.</term>
+            		<description>
+            		The entry is <paramref name="log"/>'s nearest existing parent. We 
+            		update <paramref name="log"/>'s parent field with this entry. We also break from 
+            		he loop because updating our parent's parent is our parent's 
+            		responsibility.
+            		</description>
+            	</item>
+            	<item>
+            		<term>The entry is of type ProvisionNode for this potential parent.</term>
+            		<description>
+            		We add <paramref name="log"/> to the list of children for this 
+            		potential parent.
+            		</description>
+            	</item>
+            </list>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.UpdateChildren(log4net.Repository.Hierarchy.ProvisionNode,log4net.Repository.Hierarchy.Logger)">
+            <summary>
+            Replace a <see cref="T:log4net.Repository.Hierarchy.ProvisionNode"/> with a <see cref="T:log4net.Repository.Hierarchy.Logger"/> in the hierarchy.
+            </summary>
+            <param name="pn"></param>
+            <param name="log"></param>
+            <remarks>
+            <para>
+            We update the links for all the children that placed themselves
+            in the provision node 'pn'. The second argument 'log' is a
+            reference for the newly created Logger, parent of all the
+            children in 'pn'.
+            </para>
+            <para>
+            We loop on all the children 'c' in 'pn'.
+            </para>
+            <para>
+            If the child 'c' has been already linked to a child of
+            'log' then there is no need to update 'c'.
+            </para>
+            <para>
+            Otherwise, we set log's parent field to c's parent and set
+            c's parent field to log.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.AddLevel(log4net.Repository.Hierarchy.Hierarchy.LevelEntry)">
+            <summary>
+            Define or redefine a Level using the values in the <see cref="T:log4net.Repository.Hierarchy.Hierarchy.LevelEntry"/> argument
+            </summary>
+            <param name="levelEntry">the level values</param>
+            <remarks>
+            <para>
+            Define or redefine a Level using the values in the <see cref="T:log4net.Repository.Hierarchy.Hierarchy.LevelEntry"/> argument
+            </para>
+            <para>
+            Supports setting levels via the configuration file.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.AddProperty(log4net.Repository.Hierarchy.Hierarchy.PropertyEntry)">
+            <summary>
+            Set a Property using the values in the <see cref="T:log4net.Repository.Hierarchy.Hierarchy.LevelEntry"/> argument
+            </summary>
+            <param name="propertyEntry">the property value</param>
+            <remarks>
+            <para>
+            Set a Property using the values in the <see cref="T:log4net.Repository.Hierarchy.Hierarchy.LevelEntry"/> argument.
+            </para>
+            <para>
+            Supports setting property values via the configuration file.
+            </para>
+            </remarks>
+        </member>
+        <member name="E:log4net.Repository.Hierarchy.Hierarchy.LoggerCreatedEvent">
+            <summary>
+            Event used to notify that a logger has been created.
+            </summary>
+            <remarks>
+            <para>
+            Event raised when a logger is created.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Hierarchy.EmittedNoAppenderWarning">
+            <summary>
+            Has no appender warning been emitted
+            </summary>
+            <remarks>
+            <para>
+            Flag to indicate if we have already issued a warning
+            about not having an appender warning.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Hierarchy.Root">
+            <summary>
+            Get the root of this hierarchy
+            </summary>
+            <remarks>
+            <para>
+            Get the root of this hierarchy.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Hierarchy.LoggerFactory">
+            <summary>
+            Gets or sets the default <see cref="T:log4net.Repository.Hierarchy.ILoggerFactory"/> instance.
+            </summary>
+            <value>The default <see cref="T:log4net.Repository.Hierarchy.ILoggerFactory"/></value>
+            <remarks>
+            <para>
+            The logger factory is used to create logger instances.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.Hierarchy.Hierarchy.LevelEntry">
+            <summary>
+            A class to hold the value, name and display name for a level
+            </summary>
+            <remarks>
+            <para>
+            A class to hold the value, name and display name for a level
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.LevelEntry.ToString">
+            <summary>
+            Override <c>Object.ToString</c> to return sensible debug info
+            </summary>
+            <returns>string info about this object</returns>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Hierarchy.LevelEntry.Value">
+            <summary>
+            Value of the level
+            </summary>
+            <remarks>
+            <para>
+            If the value is not set (defaults to -1) the value will be looked
+            up for the current level with the same name.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Hierarchy.LevelEntry.Name">
+            <summary>
+            Name of the level
+            </summary>
+            <value>
+            The name of the level
+            </value>
+            <remarks>
+            <para>
+            The name of the level.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Hierarchy.LevelEntry.DisplayName">
+            <summary>
+            Display name for the level
+            </summary>
+            <value>
+            The display name of the level
+            </value>
+            <remarks>
+            <para>
+            The display name of the level.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.Hierarchy.Hierarchy.PropertyEntry">
+            <summary>
+            A class to hold the key and data for a property set in the config file
+            </summary>
+            <remarks>
+            <para>
+            A class to hold the key and data for a property set in the config file
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.Hierarchy.PropertyEntry.ToString">
+            <summary>
+            Override <c>Object.ToString</c> to return sensible debug info
+            </summary>
+            <returns>string info about this object</returns>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Hierarchy.PropertyEntry.Key">
+            <summary>
+            Property Key
+            </summary>
+            <value>
+            Property Key
+            </value>
+            <remarks>
+            <para>
+            Property Key.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.Hierarchy.PropertyEntry.Value">
+            <summary>
+            Property Value
+            </summary>
+            <value>
+            Property Value
+            </value>
+            <remarks>
+            <para>
+            Property Value.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.Hierarchy.LoggerKey">
+            <summary>
+            Used internally to accelerate hash table searches.
+            </summary>
+            <remarks>
+            <para>
+            Internal class used to improve performance of 
+            string keyed hashtables.
+            </para>
+            <para>
+            The hashcode of the string is cached for reuse.
+            The string is stored as an interned value.
+            When comparing two <see cref="T:log4net.Repository.Hierarchy.LoggerKey"/> objects for equality 
+            the reference equality of the interned strings is compared.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.LoggerKey.#ctor(System.String)">
+            <summary>
+            Construct key with string name
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Repository.Hierarchy.LoggerKey"/> class 
+            with the specified name.
+            </para>
+            <para>
+            Stores the hashcode of the string and interns
+            the string key to optimize comparisons.
+            </para>
+            <note>
+            The Compact Framework 1.0 the <see cref="M:System.String.Intern(System.String)"/>
+            method does not work. On the Compact Framework
+            the string keys are not interned nor are they
+            compared by reference.
+            </note>
+            </remarks>
+            <param name="name">The name of the logger.</param>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.LoggerKey.GetHashCode">
+            <summary>
+            Returns a hash code for the current instance.
+            </summary>
+            <returns>A hash code for the current instance.</returns>
+            <remarks>
+            <para>
+            Returns the cached hashcode.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.LoggerKey.Equals(System.Object)">
+            <summary>
+            Determines whether two <see cref="T:log4net.Repository.Hierarchy.LoggerKey"/> instances 
+            are equal.
+            </summary>
+            <param name="obj">The <see cref="T:System.Object"/> to compare with the current <see cref="T:log4net.Repository.Hierarchy.LoggerKey"/>.</param>
+            <returns>
+            <c>true</c> if the specified <see cref="T:System.Object"/> is equal to the current <see cref="T:log4net.Repository.Hierarchy.LoggerKey"/>; otherwise, <c>false</c>.
+            </returns>
+            <remarks>
+            <para>
+            Compares the references of the interned strings.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.Hierarchy.ProvisionNode">
+            <summary>
+            Provision nodes are used where no logger instance has been specified
+            </summary>
+            <remarks>
+            <para>
+            <see cref="T:log4net.Repository.Hierarchy.ProvisionNode"/> instances are used in the 
+            <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> when there is no specified 
+            <see cref="T:log4net.Repository.Hierarchy.Logger"/> for that node.
+            </para>
+            <para>
+            A provision node holds a list of child loggers on behalf of
+            a logger that does not exist.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.ProvisionNode.#ctor(log4net.Repository.Hierarchy.Logger)">
+            <summary>
+            Create a new provision node with child node
+            </summary>
+            <param name="log">A child logger to add to this node.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Repository.Hierarchy.ProvisionNode"/> class 
+            with the specified child logger.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.Hierarchy.RootLogger">
+            <summary>
+            The <see cref="T:log4net.Repository.Hierarchy.RootLogger"/> sits at the root of the logger hierarchy tree. 
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Repository.Hierarchy.RootLogger"/> is a regular <see cref="T:log4net.Repository.Hierarchy.Logger"/> except 
+            that it provides several guarantees.
+            </para>
+            <para>
+            First, it cannot be assigned a <c>null</c>
+            level. Second, since the root logger cannot have a parent, the
+            <see cref="P:log4net.Repository.Hierarchy.RootLogger.EffectiveLevel"/> property always returns the value of the
+            level field without walking the hierarchy.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.RootLogger.#ctor(log4net.Core.Level)">
+            <summary>
+            Construct a <see cref="T:log4net.Repository.Hierarchy.RootLogger"/>
+            </summary>
+            <param name="level">The level to assign to the root logger.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Repository.Hierarchy.RootLogger"/> class with
+            the specified logging level.
+            </para>
+            <para>
+            The root logger names itself as "root". However, the root
+            logger cannot be retrieved by name.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.RootLogger.EffectiveLevel">
+            <summary>
+            Gets the assigned level value without walking the logger hierarchy.
+            </summary>
+            <value>The assigned level value without walking the logger hierarchy.</value>
+            <remarks>
+            <para>
+            Because the root logger cannot have a parent and its level
+            must not be <c>null</c> this property just returns the
+            value of <see cref="P:log4net.Repository.Hierarchy.Logger.Level"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Repository.Hierarchy.RootLogger.Level">
+            <summary>
+            Gets or sets the assigned <see cref="P:log4net.Repository.Hierarchy.RootLogger.Level"/> for the root logger.  
+            </summary>
+            <value>
+            The <see cref="P:log4net.Repository.Hierarchy.RootLogger.Level"/> of the root logger.
+            </value>
+            <remarks>
+            <para>
+            Setting the level of the root logger to a <c>null</c> reference
+            may have catastrophic results. We prevent this here.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.Hierarchy.XmlHierarchyConfigurator">
+            <summary>
+            Initializes the log4net environment using an XML DOM.
+            </summary>
+            <remarks>
+            <para>
+            Configures a <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> using an XML DOM.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.#ctor(log4net.Repository.Hierarchy.Hierarchy)">
+            <summary>
+            Construct the configurator for a hierarchy
+            </summary>
+            <param name="hierarchy">The hierarchy to build.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Repository.Hierarchy.XmlHierarchyConfigurator"/> class
+            with the specified <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.Configure(System.Xml.XmlElement)">
+            <summary>
+            Configure the hierarchy by parsing a DOM tree of XML elements.
+            </summary>
+            <param name="element">The root element to parse.</param>
+            <remarks>
+            <para>
+            Configure the hierarchy by parsing a DOM tree of XML elements.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.FindAppenderByReference(System.Xml.XmlElement)">
+            <summary>
+            Parse appenders by IDREF.
+            </summary>
+            <param name="appenderRef">The appender ref element.</param>
+            <returns>The instance of the appender that the ref refers to.</returns>
+            <remarks>
+            <para>
+            Parse an XML element that represents an appender and return 
+            the appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(System.Xml.XmlElement)">
+            <summary>
+            Parses an appender element.
+            </summary>
+            <param name="appenderElement">The appender element.</param>
+            <returns>The appender instance or <c>null</c> when parsing failed.</returns>
+            <remarks>
+            <para>
+            Parse an XML element that represents an appender and return
+            the appender instance.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseLogger(System.Xml.XmlElement)">
+            <summary>
+            Parses a logger element.
+            </summary>
+            <param name="loggerElement">The logger element.</param>
+            <remarks>
+            <para>
+            Parse an XML element that represents a logger.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseRoot(System.Xml.XmlElement)">
+            <summary>
+            Parses the root logger element.
+            </summary>
+            <param name="rootElement">The root element.</param>
+            <remarks>
+            <para>
+            Parse an XML element that represents the root logger.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseChildrenOfLoggerElement(System.Xml.XmlElement,log4net.Repository.Hierarchy.Logger,System.Boolean)">
+            <summary>
+            Parses the children of a logger element.
+            </summary>
+            <param name="catElement">The category element.</param>
+            <param name="log">The logger instance.</param>
+            <param name="isRoot">Flag to indicate if the logger is the root logger.</param>
+            <remarks>
+            <para>
+            Parse the child elements of a &lt;logger&gt; element.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseRenderer(System.Xml.XmlElement)">
+            <summary>
+            Parses an object renderer.
+            </summary>
+            <param name="element">The renderer element.</param>
+            <remarks>
+            <para>
+            Parse an XML element that represents a renderer.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseLevel(System.Xml.XmlElement,log4net.Repository.Hierarchy.Logger,System.Boolean)">
+            <summary>
+            Parses a level element.
+            </summary>
+            <param name="element">The level element.</param>
+            <param name="log">The logger object to set the level on.</param>
+            <param name="isRoot">Flag to indicate if the logger is the root logger.</param>
+            <remarks>
+            <para>
+            Parse an XML element that represents a level.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.SetParameter(System.Xml.XmlElement,System.Object)">
+            <summary>
+            Sets a parameter on an object.
+            </summary>
+            <param name="element">The parameter element.</param>
+            <param name="target">The object to set the parameter on.</param>
+            <remarks>
+            The parameter name must correspond to a writable property
+            on the object. The value of the parameter is a string,
+            therefore this function will attempt to set a string
+            property first. If unable to set a string property it
+            will inspect the property and its argument type. It will
+            attempt to call a static method called <c>Parse</c> on the
+            type of the property. This method will take a single
+            string argument and return a value that can be used to
+            set the property.
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.HasAttributesOrElements(System.Xml.XmlElement)">
+            <summary>
+            Test if an element has no attributes or child elements
+            </summary>
+            <param name="element">the element to inspect</param>
+            <returns><c>true</c> if the element has any attributes or child elements, <c>false</c> otherwise</returns>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.IsTypeConstructible(System.Type)">
+            <summary>
+            Test if a <see cref="T:System.Type"/> is constructible with <c>Activator.CreateInstance</c>.
+            </summary>
+            <param name="type">the type to inspect</param>
+            <returns><c>true</c> if the type is creatable using a default constructor, <c>false</c> otherwise</returns>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.FindMethodInfo(System.Type,System.String)">
+            <summary>
+            Look for a method on the <paramref name="targetType"/> that matches the <paramref name="name"/> supplied
+            </summary>
+            <param name="targetType">the type that has the method</param>
+            <param name="name">the name of the method</param>
+            <returns>the method info found</returns>
+            <remarks>
+            <para>
+            The method must be a public instance method on the <paramref name="targetType"/>.
+            The method must be named <paramref name="name"/> or "Add" followed by <paramref name="name"/>.
+            The method must take a single parameter.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ConvertStringTo(System.Type,System.String)">
+            <summary>
+            Converts a string value to a target type.
+            </summary>
+            <param name="type">The type of object to convert the string to.</param>
+            <param name="value">The string value to use as the value of the object.</param>
+            <returns>
+            <para>
+            An object of type <paramref name="type"/> with value <paramref name="value"/> or 
+            <c>null</c> when the conversion could not be performed.
+            </para>
+            </returns>
+        </member>
+        <member name="M:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.CreateObjectFromXml(System.Xml.XmlElement,System.Type,System.Type)">
+            <summary>
+            Creates an object as specified in XML.
+            </summary>
+            <param name="element">The XML element that contains the definition of the object.</param>
+            <param name="defaultTargetType">The object type to use if not explicitly specified.</param>
+            <param name="typeConstraint">The type that the returned object must be or must inherit from.</param>
+            <returns>The object or <c>null</c></returns>
+            <remarks>
+            <para>
+            Parse an XML element and create an object instance based on the configuration
+            data.
+            </para>
+            <para>
+            The type of the instance may be specified in the XML. If not
+            specified then the <paramref name="defaultTargetType"/> is used
+            as the type. However the type is specified it must support the
+            <paramref name="typeConstraint"/> type.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.m_appenderBag">
+            <summary>
+            key: appenderName, value: appender.
+            </summary>
+        </member>
+        <member name="F:log4net.Repository.Hierarchy.XmlHierarchyConfigurator.m_hierarchy">
+            <summary>
+            The Hierarchy being configured.
+            </summary>
+        </member>
+        <member name="T:log4net.Repository.LoggerRepositoryShutdownEventHandler">
+            <summary>
+            Delegate used to handle logger repository shutdown event notifications
+            </summary>
+            <param name="sender">The <see cref="T:log4net.Repository.ILoggerRepository"/> that is shutting down.</param>
+            <param name="e">Empty event args</param>
+            <remarks>
+            <para>
+            Delegate used to handle logger repository shutdown event notifications.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.LoggerRepositoryConfigurationResetEventHandler">
+            <summary>
+            Delegate used to handle logger repository configuration reset event notifications
+            </summary>
+            <param name="sender">The <see cref="T:log4net.Repository.ILoggerRepository"/> that has had its configuration reset.</param>
+            <param name="e">Empty event args</param>
+            <remarks>
+            <para>
+            Delegate used to handle logger repository configuration reset event notifications.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Repository.LoggerRepositoryConfigurationChangedEventHandler">
+            <summary>
+            Delegate used to handle event notifications for logger repository configuration changes.
+            </summary>
+            <param name="sender">The <see cref="T:log4net.Repository.ILoggerRepository"/> that has had its configuration changed.</param>
+            <param name="e">Empty event arguments.</param>
+            <remarks>
+            <para>
+            Delegate used to handle event notifications for logger repository configuration changes.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PatternStringConverters.AppDomainPatternConverter">
+            <summary>
+            Write the name of the current AppDomain to the output
+            </summary>
+            <remarks>
+            <para>
+            Write the name of the current AppDomain to the output writer
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.AppDomainPatternConverter.Convert(System.IO.TextWriter,System.Object)">
+            <summary>
+            Write the name of the current AppDomain to the output
+            </summary>
+            <param name="writer">the writer to write to</param>
+            <param name="state">null, state is not set</param>
+            <remarks>
+            <para>
+            Writes name of the current AppDomain to the output <paramref name="writer"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PatternStringConverters.DatePatternConverter">
+            <summary>
+            Write the current date to the output
+            </summary>
+            <remarks>
+            <para>
+            Date pattern converter, uses a <see cref="T:log4net.DateFormatter.IDateFormatter"/> to format 
+            the current date and time to the writer as a string.
+            </para>
+            <para>
+            The value of the <see cref="P:log4net.Util.PatternConverter.Option"/> determines 
+            the formatting of the date. The following values are allowed:
+            <list type="definition">
+            	<listheader>
+            		<term>Option value</term>
+            		<description>Output</description>
+            	</listheader>
+            	<item>
+            		<term>ISO8601</term>
+            		<description>
+            		Uses the <see cref="T:log4net.DateFormatter.Iso8601DateFormatter"/> formatter. 
+            		Formats using the <c>"yyyy-MM-dd HH:mm:ss,fff"</c> pattern.
+            		</description>
+            	</item>
+            	<item>
+            		<term>DATE</term>
+            		<description>
+            		Uses the <see cref="T:log4net.DateFormatter.DateTimeDateFormatter"/> formatter. 
+            		Formats using the <c>"dd MMM yyyy HH:mm:ss,fff"</c> for example, <c>"06 Nov 1994 15:49:37,459"</c>.
+            		</description>
+            	</item>
+            	<item>
+            		<term>ABSOLUTE</term>
+            		<description>
+            		Uses the <see cref="T:log4net.DateFormatter.AbsoluteTimeDateFormatter"/> formatter. 
+            		Formats using the <c>"HH:mm:ss,fff"</c> for example, <c>"15:49:37,459"</c>.
+            		</description>
+            	</item>
+            	<item>
+            		<term>other</term>
+            		<description>
+            		Any other pattern string uses the <see cref="T:log4net.DateFormatter.SimpleDateFormatter"/> formatter. 
+            		This formatter passes the pattern string to the <see cref="T:System.DateTime"/> 
+            		<see cref="M:System.DateTime.ToString(System.String)"/> method.
+            		For details on valid patterns see 
+            		<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemglobalizationdatetimeformatinfoclasstopic.asp">DateTimeFormatInfo Class</a>.
+            		</description>
+            	</item>
+            </list>
+            </para>
+            <para>
+            The date and time is in the local time zone and is rendered in that zone.
+            To output the time in Universal time see <see cref="T:log4net.Util.PatternStringConverters.UtcDatePatternConverter"/>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Util.PatternStringConverters.DatePatternConverter.m_dateFormatter">
+            <summary>
+            The <see cref="T:log4net.DateFormatter.IDateFormatter"/> used to render the date to a string
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.DateFormatter.IDateFormatter"/> used to render the date to a string
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.DatePatternConverter.ActivateOptions">
+            <summary>
+            Initialize the converter options
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Util.PatternStringConverters.DatePatternConverter.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Util.PatternStringConverters.DatePatternConverter.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Util.PatternStringConverters.DatePatternConverter.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.DatePatternConverter.Convert(System.IO.TextWriter,System.Object)">
+            <summary>
+            Write the current date to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="state">null, state is not set</param>
+            <remarks>
+            <para>
+            Pass the current date and time to the <see cref="T:log4net.DateFormatter.IDateFormatter"/>
+            for it to render it to the writer.
+            </para>
+            <para>
+            The date and time passed is in the local time zone.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PatternStringConverters.EnvironmentPatternConverter">
+            <summary>
+            Write an environment variable to the output
+            </summary>
+            <remarks>
+            <para>
+            Write an environment variable to the output writer.
+            The value of the <see cref="P:log4net.Util.PatternConverter.Option"/> determines 
+            the name of the variable to output.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.EnvironmentPatternConverter.Convert(System.IO.TextWriter,System.Object)">
+            <summary>
+            Write an environment variable to the output
+            </summary>
+            <param name="writer">the writer to write to</param>
+            <param name="state">null, state is not set</param>
+            <remarks>
+            <para>
+            Writes the environment variable to the output <paramref name="writer"/>.
+            The name of the environment variable to output must be set
+            using the <see cref="P:log4net.Util.PatternConverter.Option"/>
+            property.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PatternStringConverters.IdentityPatternConverter">
+            <summary>
+            Write the current thread identity to the output
+            </summary>
+            <remarks>
+            <para>
+            Write the current thread identity to the output writer
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.IdentityPatternConverter.Convert(System.IO.TextWriter,System.Object)">
+            <summary>
+            Write the current thread identity to the output
+            </summary>
+            <param name="writer">the writer to write to</param>
+            <param name="state">null, state is not set</param>
+            <remarks>
+            <para>
+            Writes the current thread identity to the output <paramref name="writer"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PatternStringConverters.LiteralPatternConverter">
+            <summary>
+            Pattern converter for literal string instances in the pattern
+            </summary>
+            <remarks>
+            <para>
+            Writes the literal string value specified in the 
+            <see cref="P:log4net.Util.PatternConverter.Option"/> property to 
+            the output.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.LiteralPatternConverter.SetNext(log4net.Util.PatternConverter)">
+            <summary>
+            Set the next converter in the chain
+            </summary>
+            <param name="pc">The next pattern converter in the chain</param>
+            <returns>The next pattern converter</returns>
+            <remarks>
+            <para>
+            Special case the building of the pattern converter chain
+            for <see cref="T:log4net.Util.PatternStringConverters.LiteralPatternConverter"/> instances. Two adjacent
+            literals in the pattern can be represented by a single combined
+            pattern converter. This implementation detects when a 
+            <see cref="T:log4net.Util.PatternStringConverters.LiteralPatternConverter"/> is added to the chain
+            after this converter and combines its value with this converter's
+            literal value.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.LiteralPatternConverter.Format(System.IO.TextWriter,System.Object)">
+            <summary>
+            Write the literal to the output
+            </summary>
+            <param name="writer">the writer to write to</param>
+            <param name="state">null, not set</param>
+            <remarks>
+            <para>
+            Override the formatting behavior to ignore the FormattingInfo
+            because we have a literal instead.
+            </para>
+            <para>
+            Writes the value of <see cref="P:log4net.Util.PatternConverter.Option"/>
+            to the output <paramref name="writer"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.LiteralPatternConverter.Convert(System.IO.TextWriter,System.Object)">
+            <summary>
+            Convert this pattern into the rendered message
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="state">null, not set</param>
+            <remarks>
+            <para>
+            This method is not used.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PatternStringConverters.NewLinePatternConverter">
+            <summary>
+            Writes a newline to the output
+            </summary>
+            <remarks>
+            <para>
+            Writes the system dependent line terminator to the output.
+            This behavior can be overridden by setting the <see cref="P:log4net.Util.PatternConverter.Option"/>:
+            </para>
+            <list type="definition">
+              <listheader>
+                <term>Option Value</term>
+                <description>Output</description>
+              </listheader>
+              <item>
+                <term>DOS</term>
+                <description>DOS or Windows line terminator <c>"\r\n"</c></description>
+              </item>
+              <item>
+                <term>UNIX</term>
+                <description>UNIX line terminator <c>"\n"</c></description>
+              </item>
+            </list>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.NewLinePatternConverter.ActivateOptions">
+            <summary>
+            Initialize the converter
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Util.PatternStringConverters.NewLinePatternConverter.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Util.PatternStringConverters.NewLinePatternConverter.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Util.PatternStringConverters.NewLinePatternConverter.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PatternStringConverters.ProcessIdPatternConverter">
+            <summary>
+            Write the current process ID to the output
+            </summary>
+            <remarks>
+            <para>
+            Write the current process ID to the output writer
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.ProcessIdPatternConverter.Convert(System.IO.TextWriter,System.Object)">
+            <summary>
+            Write the current process ID to the output
+            </summary>
+            <param name="writer">the writer to write to</param>
+            <param name="state">null, state is not set</param>
+            <remarks>
+            <para>
+            Write the current process ID to the output <paramref name="writer"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PatternStringConverters.PropertyPatternConverter">
+            <summary>
+            Property pattern converter
+            </summary>
+            <remarks>
+            <para>
+            This pattern converter reads the thread and global properties.
+            The thread properties take priority over global properties.
+            See <see cref="P:log4net.ThreadContext.Properties"/> for details of the 
+            thread properties. See <see cref="P:log4net.GlobalContext.Properties"/> for
+            details of the global properties.
+            </para>
+            <para>
+            If the <see cref="P:log4net.Util.PatternConverter.Option"/> is specified then that will be used to
+            lookup a single property. If no <see cref="P:log4net.Util.PatternConverter.Option"/> is specified
+            then all properties will be dumped as a list of key value pairs.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.PropertyPatternConverter.Convert(System.IO.TextWriter,System.Object)">
+            <summary>
+            Write the property value to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="state">null, state is not set</param>
+            <remarks>
+            <para>
+            Writes out the value of a named property. The property name
+            should be set in the <see cref="P:log4net.Util.PatternConverter.Option"/>
+            property.
+            </para>
+            <para>
+            If the <see cref="P:log4net.Util.PatternConverter.Option"/> is set to <c>null</c>
+            then all the properties are written as key value pairs.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PatternStringConverters.RandomStringPatternConverter">
+            <summary>
+            A Pattern converter that generates a string of random characters
+            </summary>
+            <remarks>
+            <para>
+            The converter generates a string of random characters. By default
+            the string is length 4. This can be changed by setting the <see cref="P:log4net.Util.PatternConverter.Option"/>
+            to the string value of the length required.
+            </para>
+            <para>
+            The random characters in the string are limited to uppercase letters
+            and numbers only.
+            </para>
+            <para>
+            The random number generator used by this class is not cryptographically secure.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Util.PatternStringConverters.RandomStringPatternConverter.s_random">
+            <summary>
+            Shared random number generator
+            </summary>
+        </member>
+        <member name="F:log4net.Util.PatternStringConverters.RandomStringPatternConverter.m_length">
+            <summary>
+            Length of random string to generate. Default length 4.
+            </summary>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.RandomStringPatternConverter.ActivateOptions">
+            <summary>
+            Initialize the converter options
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Util.PatternStringConverters.RandomStringPatternConverter.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Util.PatternStringConverters.RandomStringPatternConverter.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Util.PatternStringConverters.RandomStringPatternConverter.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.RandomStringPatternConverter.Convert(System.IO.TextWriter,System.Object)">
+            <summary>
+            Write a randoim string to the output
+            </summary>
+            <param name="writer">the writer to write to</param>
+            <param name="state">null, state is not set</param>
+            <remarks>
+            <para>
+            Write a randoim string to the output <paramref name="writer"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PatternStringConverters.UserNamePatternConverter">
+            <summary>
+            Write the current threads username to the output
+            </summary>
+            <remarks>
+            <para>
+            Write the current threads username to the output writer
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.UserNamePatternConverter.Convert(System.IO.TextWriter,System.Object)">
+            <summary>
+            Write the current threads username to the output
+            </summary>
+            <param name="writer">the writer to write to</param>
+            <param name="state">null, state is not set</param>
+            <remarks>
+            <para>
+            Write the current threads username to the output <paramref name="writer"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PatternStringConverters.UtcDatePatternConverter">
+            <summary>
+            Write the UTC date time to the output
+            </summary>
+            <remarks>
+            <para>
+            Date pattern converter, uses a <see cref="T:log4net.DateFormatter.IDateFormatter"/> to format 
+            the current date and time in Universal time.
+            </para>
+            <para>
+            See the <see cref="T:log4net.Util.PatternStringConverters.DatePatternConverter"/> for details on the date pattern syntax.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Util.PatternStringConverters.DatePatternConverter"/>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.PatternStringConverters.UtcDatePatternConverter.Convert(System.IO.TextWriter,System.Object)">
+            <summary>
+            Write the current date and time to the output
+            </summary>
+            <param name="writer"><see cref="T:System.IO.TextWriter"/> that will receive the formatted result.</param>
+            <param name="state">null, state is not set</param>
+            <remarks>
+            <para>
+            Pass the current date and time to the <see cref="T:log4net.DateFormatter.IDateFormatter"/>
+            for it to render it to the writer.
+            </para>
+            <para>
+            The date is in Universal time when it is rendered.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Util.PatternStringConverters.DatePatternConverter"/>
+        </member>
+        <member name="T:log4net.Util.TypeConverters.BooleanConverter">
+            <summary>
+            Type converter for Boolean.
+            </summary>
+            <remarks>
+            <para>
+            Supports conversion from string to <c>bool</c> type.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Util.TypeConverters.ConverterRegistry"/>
+            <seealso cref="T:log4net.Util.TypeConverters.IConvertFrom"/>
+            <seealso cref="T:log4net.Util.TypeConverters.IConvertTo"/>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.BooleanConverter.CanConvertFrom(System.Type)">
+            <summary>
+            Can the source type be converted to the type supported by this object
+            </summary>
+            <param name="sourceType">the type to convert</param>
+            <returns>true if the conversion is possible</returns>
+            <remarks>
+            <para>
+            Returns <c>true</c> if the <paramref name="sourceType"/> is
+            the <see cref="T:System.String"/> type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.BooleanConverter.ConvertFrom(System.Object)">
+            <summary>
+            Convert the source object to the type supported by this object
+            </summary>
+            <param name="source">the object to convert</param>
+            <returns>the converted object</returns>
+            <remarks>
+            <para>
+            Uses the <see cref="M:System.Boolean.Parse(System.String)"/> method to convert the
+            <see cref="T:System.String"/> argument to a <see cref="T:System.Boolean"/>.
+            </para>
+            </remarks>
+            <exception cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException">
+            The <paramref name="source"/> object cannot be converted to the
+            target type. To check for this condition use the <see cref="M:log4net.Util.TypeConverters.BooleanConverter.CanConvertFrom(System.Type)"/>
+            method.
+            </exception>
+        </member>
+        <member name="T:log4net.Util.TypeConverters.ConversionNotSupportedException">
+            <summary>
+            Exception base type for conversion errors.
+            </summary>
+            <remarks>
+            <para>
+            This type extends <see cref="T:System.ApplicationException"/>. It
+            does not add any new functionality but does differentiate the
+            type of exception being thrown.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.ConversionNotSupportedException.#ctor">
+            <summary>
+            Constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.ConversionNotSupportedException.#ctor(System.String)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="message">A message to include with the exception.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException"/> class
+            with the specified message.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.ConversionNotSupportedException.#ctor(System.String,System.Exception)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="message">A message to include with the exception.</param>
+            <param name="innerException">A nested exception to include.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException"/> class
+            with the specified message and inner exception.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.ConversionNotSupportedException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serialization constructor
+            </summary>
+            <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The <see cref="T:System.Runtime.Serialization.StreamingContext"/> that contains contextual information about the source or destination.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException"/> class 
+            with serialized data.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.ConversionNotSupportedException.Create(System.Type,System.Object)">
+            <summary>
+            Creates a new instance of the <see cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException"/> class.
+            </summary>
+            <param name="destinationType">The conversion destination type.</param>
+            <param name="sourceValue">The value to convert.</param>
+            <returns>An instance of the <see cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException"/>.</returns>
+            <remarks>
+            <para>
+            Creates a new instance of the <see cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.ConversionNotSupportedException.Create(System.Type,System.Object,System.Exception)">
+            <summary>
+            Creates a new instance of the <see cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException"/> class.
+            </summary>
+            <param name="destinationType">The conversion destination type.</param>
+            <param name="sourceValue">The value to convert.</param>
+            <param name="innerException">A nested exception to include.</param>
+            <returns>An instance of the <see cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException"/>.</returns>
+            <remarks>
+            <para>
+            Creates a new instance of the <see cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.TypeConverters.ConverterRegistry">
+            <summary>
+            Register of type converters for specific types.
+            </summary>
+            <remarks>
+            <para>
+            Maintains a registry of type converters used to convert between
+            types.
+            </para>
+            <para>
+            Use the <see cref="M:log4net.Util.TypeConverters.ConverterRegistry.AddConverter(System.Type,System.Object)"/> and 
+            <see cref="M:log4net.Util.TypeConverters.ConverterRegistry.AddConverter(System.Type,System.Type)"/> methods to register new converters.
+            The <see cref="M:log4net.Util.TypeConverters.ConverterRegistry.GetConvertTo(System.Type,System.Type)"/> and <see cref="M:log4net.Util.TypeConverters.ConverterRegistry.GetConvertFrom(System.Type)"/> methods
+            lookup appropriate converters to use.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Util.TypeConverters.IConvertFrom"/>
+            <seealso cref="T:log4net.Util.TypeConverters.IConvertTo"/>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.ConverterRegistry.#ctor">
+            <summary>
+            Private constructor
+            </summary>
+            <remarks>
+            Initializes a new instance of the <see cref="T:log4net.Util.TypeConverters.ConverterRegistry"/> class.
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.ConverterRegistry.#cctor">
+            <summary>
+            Static constructor.
+            </summary>
+            <remarks>
+            <para>
+            This constructor defines the intrinsic type converters.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.ConverterRegistry.AddConverter(System.Type,System.Object)">
+            <summary>
+            Adds a converter for a specific type.
+            </summary>
+            <param name="destinationType">The type being converted to.</param>
+            <param name="converter">The type converter to use to convert to the destination type.</param>
+            <remarks>
+            <para>
+            Adds a converter instance for a specific type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.ConverterRegistry.AddConverter(System.Type,System.Type)">
+            <summary>
+            Adds a converter for a specific type.
+            </summary>
+            <param name="destinationType">The type being converted to.</param>
+            <param name="converterType">The type of the type converter to use to convert to the destination type.</param>
+            <remarks>
+            <para>
+            Adds a converter <see cref="T:System.Type"/> for a specific type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.ConverterRegistry.GetConvertTo(System.Type,System.Type)">
+            <summary>
+            Gets the type converter to use to convert values to the destination type.
+            </summary>
+            <param name="sourceType">The type being converted from.</param>
+            <param name="destinationType">The type being converted to.</param>
+            <returns>
+            The type converter instance to use for type conversions or <c>null</c> 
+            if no type converter is found.
+            </returns>
+            <remarks>
+            <para>
+            Gets the type converter to use to convert values to the destination type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.ConverterRegistry.GetConvertFrom(System.Type)">
+            <summary>
+            Gets the type converter to use to convert values to the destination type.
+            </summary>
+            <param name="destinationType">The type being converted to.</param>
+            <returns>
+            The type converter instance to use for type conversions or <c>null</c> 
+            if no type converter is found.
+            </returns>
+            <remarks>
+            <para>
+            Gets the type converter to use to convert values to the destination type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.ConverterRegistry.GetConverterFromAttribute(System.Type)">
+            <summary>
+            Lookups the type converter to use as specified by the attributes on the 
+            destination type.
+            </summary>
+            <param name="destinationType">The type being converted to.</param>
+            <returns>
+            The type converter instance to use for type conversions or <c>null</c> 
+            if no type converter is found.
+            </returns>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.ConverterRegistry.CreateConverterInstance(System.Type)">
+            <summary>
+            Creates the instance of the type converter.
+            </summary>
+            <param name="converterType">The type of the type converter.</param>
+            <returns>
+            The type converter instance to use for type conversions or <c>null</c> 
+            if no type converter is found.
+            </returns>
+            <remarks>
+            <para>
+            The type specified for the type converter must implement 
+            the <see cref="T:log4net.Util.TypeConverters.IConvertFrom"/> or <see cref="T:log4net.Util.TypeConverters.IConvertTo"/> interfaces 
+            and must have a public default (no argument) constructor.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.TypeConverters.ConverterRegistry.s_type2converter">
+            <summary>
+            Mapping from <see cref="T:System.Type"/> to type converter.
+            </summary>
+        </member>
+        <member name="T:log4net.Util.TypeConverters.EncodingConverter">
+            <summary>
+            Supports conversion from string to <see cref="T:System.Text.Encoding"/> type.
+            </summary>
+            <remarks>
+            <para>
+            Supports conversion from string to <see cref="T:System.Text.Encoding"/> type.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Util.TypeConverters.ConverterRegistry"/>
+            <seealso cref="T:log4net.Util.TypeConverters.IConvertFrom"/>
+            <seealso cref="T:log4net.Util.TypeConverters.IConvertTo"/>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.EncodingConverter.CanConvertFrom(System.Type)">
+            <summary>
+            Can the source type be converted to the type supported by this object
+            </summary>
+            <param name="sourceType">the type to convert</param>
+            <returns>true if the conversion is possible</returns>
+            <remarks>
+            <para>
+            Returns <c>true</c> if the <paramref name="sourceType"/> is
+            the <see cref="T:System.String"/> type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.EncodingConverter.ConvertFrom(System.Object)">
+            <summary>
+            Overrides the ConvertFrom method of IConvertFrom.
+            </summary>
+            <param name="source">the object to convert to an encoding</param>
+            <returns>the encoding</returns>
+            <remarks>
+            <para>
+            Uses the <see cref="M:System.Text.Encoding.GetEncoding(System.String)"/> method to 
+            convert the <see cref="T:System.String"/> argument to an <see cref="T:System.Text.Encoding"/>.
+            </para>
+            </remarks>
+            <exception cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException">
+            The <paramref name="source"/> object cannot be converted to the
+            target type. To check for this condition use the <see cref="M:log4net.Util.TypeConverters.EncodingConverter.CanConvertFrom(System.Type)"/>
+            method.
+            </exception>
+        </member>
+        <member name="T:log4net.Util.TypeConverters.IConvertTo">
+            <summary>
+            Interface supported by type converters
+            </summary>
+            <remarks>
+            <para>
+            This interface supports conversion from a single type to arbitrary types.
+            See <see cref="T:log4net.Util.TypeConverters.TypeConverterAttribute"/>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.IConvertTo.CanConvertTo(System.Type)">
+            <summary>
+            Returns whether this converter can convert the object to the specified type
+            </summary>
+            <param name="targetType">A Type that represents the type you want to convert to</param>
+            <returns>true if the conversion is possible</returns>
+            <remarks>
+            <para>
+            Test if the type supported by this converter can be converted to the
+            <paramref name="targetType"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.IConvertTo.ConvertTo(System.Object,System.Type)">
+            <summary>
+            Converts the given value object to the specified type, using the arguments
+            </summary>
+            <param name="source">the object to convert</param>
+            <param name="targetType">The Type to convert the value parameter to</param>
+            <returns>the converted object</returns>
+            <remarks>
+            <para>
+            Converts the <paramref name="source"/> (which must be of the type supported
+            by this converter) to the <paramref name="targetType"/> specified..
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.TypeConverters.IPAddressConverter">
+            <summary>
+            Supports conversion from string to <see cref="T:System.Net.IPAddress"/> type.
+            </summary>
+            <remarks>
+            <para>
+            Supports conversion from string to <see cref="T:System.Net.IPAddress"/> type.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Util.TypeConverters.ConverterRegistry"/>
+            <seealso cref="T:log4net.Util.TypeConverters.IConvertFrom"/>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.IPAddressConverter.CanConvertFrom(System.Type)">
+            <summary>
+            Can the source type be converted to the type supported by this object
+            </summary>
+            <param name="sourceType">the type to convert</param>
+            <returns>true if the conversion is possible</returns>
+            <remarks>
+            <para>
+            Returns <c>true</c> if the <paramref name="sourceType"/> is
+            the <see cref="T:System.String"/> type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.IPAddressConverter.ConvertFrom(System.Object)">
+            <summary>
+            Overrides the ConvertFrom method of IConvertFrom.
+            </summary>
+            <param name="source">the object to convert to an IPAddress</param>
+            <returns>the IPAddress</returns>
+            <remarks>
+            <para>
+            Uses the <see cref="M:System.Net.IPAddress.Parse(System.String)"/> method to convert the
+            <see cref="T:System.String"/> argument to an <see cref="T:System.Net.IPAddress"/>.
+            If that fails then the string is resolved as a DNS hostname.
+            </para>
+            </remarks>
+            <exception cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException">
+            The <paramref name="source"/> object cannot be converted to the
+            target type. To check for this condition use the <see cref="M:log4net.Util.TypeConverters.IPAddressConverter.CanConvertFrom(System.Type)"/>
+            method.
+            </exception>
+        </member>
+        <member name="F:log4net.Util.TypeConverters.IPAddressConverter.validIpAddressChars">
+            <summary>
+            Valid characters in an IPv4 or IPv6 address string. (Does not support subnets)
+            </summary>
+        </member>
+        <member name="T:log4net.Util.TypeConverters.PatternLayoutConverter">
+            <summary>
+            Supports conversion from string to <see cref="T:log4net.Layout.PatternLayout"/> type.
+            </summary>
+            <remarks>
+            <para>
+            Supports conversion from string to <see cref="T:log4net.Layout.PatternLayout"/> type.
+            </para>
+            <para>
+            The string is used as the <see cref="P:log4net.Layout.PatternLayout.ConversionPattern"/> 
+            of the <see cref="T:log4net.Layout.PatternLayout"/>.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Util.TypeConverters.ConverterRegistry"/>
+            <seealso cref="T:log4net.Util.TypeConverters.IConvertFrom"/>
+            <seealso cref="T:log4net.Util.TypeConverters.IConvertTo"/>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.PatternLayoutConverter.CanConvertFrom(System.Type)">
+            <summary>
+            Can the source type be converted to the type supported by this object
+            </summary>
+            <param name="sourceType">the type to convert</param>
+            <returns>true if the conversion is possible</returns>
+            <remarks>
+            <para>
+            Returns <c>true</c> if the <paramref name="sourceType"/> is
+            the <see cref="T:System.String"/> type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.PatternLayoutConverter.ConvertFrom(System.Object)">
+            <summary>
+            Overrides the ConvertFrom method of IConvertFrom.
+            </summary>
+            <param name="source">the object to convert to a PatternLayout</param>
+            <returns>the PatternLayout</returns>
+            <remarks>
+            <para>
+            Creates and returns a new <see cref="T:log4net.Layout.PatternLayout"/> using
+            the <paramref name="source"/> <see cref="T:System.String"/> as the
+            <see cref="P:log4net.Layout.PatternLayout.ConversionPattern"/>.
+            </para>
+            </remarks>
+            <exception cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException">
+            The <paramref name="source"/> object cannot be converted to the
+            target type. To check for this condition use the <see cref="M:log4net.Util.TypeConverters.PatternLayoutConverter.CanConvertFrom(System.Type)"/>
+            method.
+            </exception>
+        </member>
+        <member name="T:log4net.Util.TypeConverters.PatternStringConverter">
+            <summary>
+            Convert between string and <see cref="T:log4net.Util.PatternString"/>
+            </summary>
+            <remarks>
+            <para>
+            Supports conversion from string to <see cref="T:log4net.Util.PatternString"/> type, 
+            and from a <see cref="T:log4net.Util.PatternString"/> type to a string.
+            </para>
+            <para>
+            The string is used as the <see cref="P:log4net.Util.PatternString.ConversionPattern"/> 
+            of the <see cref="T:log4net.Util.PatternString"/>.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Util.TypeConverters.ConverterRegistry"/>
+            <seealso cref="T:log4net.Util.TypeConverters.IConvertFrom"/>
+            <seealso cref="T:log4net.Util.TypeConverters.IConvertTo"/>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.PatternStringConverter.CanConvertTo(System.Type)">
+            <summary>
+            Can the target type be converted to the type supported by this object
+            </summary>
+            <param name="targetType">A <see cref="T:System.Type"/> that represents the type you want to convert to</param>
+            <returns>true if the conversion is possible</returns>
+            <remarks>
+            <para>
+            Returns <c>true</c> if the <paramref name="targetType"/> is
+            assignable from a <see cref="T:System.String"/> type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.PatternStringConverter.ConvertTo(System.Object,System.Type)">
+            <summary>
+            Converts the given value object to the specified type, using the arguments
+            </summary>
+            <param name="source">the object to convert</param>
+            <param name="targetType">The Type to convert the value parameter to</param>
+            <returns>the converted object</returns>
+            <remarks>
+            <para>
+            Uses the <see cref="M:log4net.Util.PatternString.Format"/> method to convert the
+            <see cref="T:log4net.Util.PatternString"/> argument to a <see cref="T:System.String"/>.
+            </para>
+            </remarks>
+            <exception cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException">
+            The <paramref name="source"/> object cannot be converted to the
+            <paramref name="targetType"/>. To check for this condition use the 
+            <see cref="M:log4net.Util.TypeConverters.PatternStringConverter.CanConvertTo(System.Type)"/> method.
+            </exception>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.PatternStringConverter.CanConvertFrom(System.Type)">
+            <summary>
+            Can the source type be converted to the type supported by this object
+            </summary>
+            <param name="sourceType">the type to convert</param>
+            <returns>true if the conversion is possible</returns>
+            <remarks>
+            <para>
+            Returns <c>true</c> if the <paramref name="sourceType"/> is
+            the <see cref="T:System.String"/> type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.PatternStringConverter.ConvertFrom(System.Object)">
+            <summary>
+            Overrides the ConvertFrom method of IConvertFrom.
+            </summary>
+            <param name="source">the object to convert to a PatternString</param>
+            <returns>the PatternString</returns>
+            <remarks>
+            <para>
+            Creates and returns a new <see cref="T:log4net.Util.PatternString"/> using
+            the <paramref name="source"/> <see cref="T:System.String"/> as the
+            <see cref="P:log4net.Util.PatternString.ConversionPattern"/>.
+            </para>
+            </remarks>
+            <exception cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException">
+            The <paramref name="source"/> object cannot be converted to the
+            target type. To check for this condition use the <see cref="M:log4net.Util.TypeConverters.PatternStringConverter.CanConvertFrom(System.Type)"/>
+            method.
+            </exception>
+        </member>
+        <member name="T:log4net.Util.TypeConverters.TypeConverter">
+            <summary>
+            Supports conversion from string to <see cref="T:System.Type"/> type.
+            </summary>
+            <remarks>
+            <para>
+            Supports conversion from string to <see cref="T:System.Type"/> type.
+            </para>
+            </remarks>
+            <seealso cref="T:log4net.Util.TypeConverters.ConverterRegistry"/>
+            <seealso cref="T:log4net.Util.TypeConverters.IConvertFrom"/>
+            <seealso cref="T:log4net.Util.TypeConverters.IConvertTo"/>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.TypeConverter.CanConvertFrom(System.Type)">
+            <summary>
+            Can the source type be converted to the type supported by this object
+            </summary>
+            <param name="sourceType">the type to convert</param>
+            <returns>true if the conversion is possible</returns>
+            <remarks>
+            <para>
+            Returns <c>true</c> if the <paramref name="sourceType"/> is
+            the <see cref="T:System.String"/> type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.TypeConverter.ConvertFrom(System.Object)">
+            <summary>
+            Overrides the ConvertFrom method of IConvertFrom.
+            </summary>
+            <param name="source">the object to convert to a Type</param>
+            <returns>the Type</returns>
+            <remarks>
+            <para>
+            Uses the <see cref="M:System.Type.GetType(System.String,System.Boolean)"/> method to convert the
+            <see cref="T:System.String"/> argument to a <see cref="T:System.Type"/>.
+            Additional effort is made to locate partially specified types
+            by searching the loaded assemblies.
+            </para>
+            </remarks>
+            <exception cref="T:log4net.Util.TypeConverters.ConversionNotSupportedException">
+            The <paramref name="source"/> object cannot be converted to the
+            target type. To check for this condition use the <see cref="M:log4net.Util.TypeConverters.TypeConverter.CanConvertFrom(System.Type)"/>
+            method.
+            </exception>
+        </member>
+        <member name="T:log4net.Util.TypeConverters.TypeConverterAttribute">
+            <summary>
+            Attribute used to associate a type converter
+            </summary>
+            <remarks>
+            <para>
+            Class and Interface level attribute that specifies a type converter
+            to use with the associated type.
+            </para>
+            <para>
+            To associate a type converter with a target type apply a
+            <c>TypeConverterAttribute</c> to the target type. Specify the
+            type of the type converter on the attribute.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="F:log4net.Util.TypeConverters.TypeConverterAttribute.m_typeName">
+            <summary>
+            The string type name of the type converter
+            </summary>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.TypeConverterAttribute.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Default constructor
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.TypeConverterAttribute.#ctor(System.String)">
+            <summary>
+            Create a new type converter attribute for the specified type name
+            </summary>
+            <param name="typeName">The string type name of the type converter</param>
+            <remarks>
+            <para>
+            The type specified must implement the <see cref="T:log4net.Util.TypeConverters.IConvertFrom"/> 
+            or the <see cref="T:log4net.Util.TypeConverters.IConvertTo"/> interfaces.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TypeConverters.TypeConverterAttribute.#ctor(System.Type)">
+            <summary>
+            Create a new type converter attribute for the specified type
+            </summary>
+            <param name="converterType">The type of the type converter</param>
+            <remarks>
+            <para>
+            The type specified must implement the <see cref="T:log4net.Util.TypeConverters.IConvertFrom"/> 
+            or the <see cref="T:log4net.Util.TypeConverters.IConvertTo"/> interfaces.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.TypeConverters.TypeConverterAttribute.ConverterTypeName">
+            <summary>
+            The string type name of the type converter 
+            </summary>
+            <value>
+            The string type name of the type converter 
+            </value>
+            <remarks>
+            <para>
+            The type specified must implement the <see cref="T:log4net.Util.TypeConverters.IConvertFrom"/> 
+            or the <see cref="T:log4net.Util.TypeConverters.IConvertTo"/> interfaces.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.AppenderAttachedImpl">
+            <summary>
+            A straightforward implementation of the <see cref="T:log4net.Core.IAppenderAttachable"/> interface.
+            </summary>
+            <remarks>
+            <para>
+            This is the default implementation of the <see cref="T:log4net.Core.IAppenderAttachable"/>
+            interface. Implementors of the <see cref="T:log4net.Core.IAppenderAttachable"/> interface
+            should aggregate an instance of this type.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.AppenderAttachedImpl.#ctor">
+            <summary>
+            Constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.AppenderAttachedImpl"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(log4net.Core.LoggingEvent)">
+            <summary>
+            Append on on all attached appenders.
+            </summary>
+            <param name="loggingEvent">The event being logged.</param>
+            <returns>The number of appenders called.</returns>
+            <remarks>
+            <para>
+            Calls the <see cref="M:log4net.Appender.IAppender.DoAppend(log4net.Core.LoggingEvent)"/> method on all 
+            attached appenders.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(log4net.Core.LoggingEvent[])">
+            <summary>
+            Append on on all attached appenders.
+            </summary>
+            <param name="loggingEvents">The array of events being logged.</param>
+            <returns>The number of appenders called.</returns>
+            <remarks>
+            <para>
+            Calls the <see cref="M:log4net.Appender.IAppender.DoAppend(log4net.Core.LoggingEvent)"/> method on all 
+            attached appenders.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.AppenderAttachedImpl.CallAppend(log4net.Appender.IAppender,log4net.Core.LoggingEvent[])">
+            <summary>
+            Calls the DoAppende method on the <see cref="T:log4net.Appender.IAppender"/> with 
+            the <see cref="T:log4net.Core.LoggingEvent"/> objects supplied.
+            </summary>
+            <param name="appender">The appender</param>
+            <param name="loggingEvents">The events</param>
+            <remarks>
+            <para>
+            If the <paramref name="appender"/> supports the <see cref="T:log4net.Appender.IBulkAppender"/>
+            interface then the <paramref name="loggingEvents"/> will be passed 
+            through using that interface. Otherwise the <see cref="T:log4net.Core.LoggingEvent"/>
+            objects in the array will be passed one at a time.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.AppenderAttachedImpl.AddAppender(log4net.Appender.IAppender)">
+            <summary>
+            Attaches an appender.
+            </summary>
+            <param name="newAppender">The appender to add.</param>
+            <remarks>
+            <para>
+            If the appender is already in the list it won't be added again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.AppenderAttachedImpl.GetAppender(System.String)">
+            <summary>
+            Gets an attached appender with the specified name.
+            </summary>
+            <param name="name">The name of the appender to get.</param>
+            <returns>
+            The appender with the name specified, or <c>null</c> if no appender with the
+            specified name is found.
+            </returns>
+            <remarks>
+            <para>
+            Lookup an attached appender by name.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.AppenderAttachedImpl.RemoveAllAppenders">
+            <summary>
+            Removes all attached appenders.
+            </summary>
+            <remarks>
+            <para>
+            Removes and closes all attached appenders
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.AppenderAttachedImpl.RemoveAppender(log4net.Appender.IAppender)">
+            <summary>
+            Removes the specified appender from the list of attached appenders.
+            </summary>
+            <param name="appender">The appender to remove.</param>
+            <returns>The appender removed from the list</returns>
+            <remarks>
+            <para>
+            The appender removed is not closed.
+            If you are discarding the appender you must call
+            <see cref="M:log4net.Appender.IAppender.Close"/> on the appender removed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.AppenderAttachedImpl.RemoveAppender(System.String)">
+            <summary>
+            Removes the appender with the specified name from the list of appenders.
+            </summary>
+            <param name="name">The name of the appender to remove.</param>
+            <returns>The appender removed from the list</returns>
+            <remarks>
+            <para>
+            The appender removed is not closed.
+            If you are discarding the appender you must call
+            <see cref="M:log4net.Appender.IAppender.Close"/> on the appender removed.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.AppenderAttachedImpl.m_appenderList">
+            <summary>
+            List of appenders
+            </summary>
+        </member>
+        <member name="F:log4net.Util.AppenderAttachedImpl.m_appenderArray">
+            <summary>
+            Array of appenders, used to cache the m_appenderList
+            </summary>
+        </member>
+        <member name="P:log4net.Util.AppenderAttachedImpl.Appenders">
+            <summary>
+            Gets all attached appenders.
+            </summary>
+            <returns>
+            A collection of attached appenders, or <c>null</c> if there
+            are no attached appenders.
+            </returns>
+            <remarks>
+            <para>
+            The read only collection of all currently attached appenders.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.CompositeProperties">
+            <summary>
+            This class aggregates several PropertiesDictionary collections together.
+            </summary>
+            <remarks>
+            <para>
+            Provides a dictionary style lookup over an ordered list of
+            <see cref="T:log4net.Util.PropertiesDictionary"/> collections.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.CompositeProperties.#ctor">
+            <summary>
+            Constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.CompositeProperties"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.CompositeProperties.Add(log4net.Util.ReadOnlyPropertiesDictionary)">
+            <summary>
+            Add a Properties Dictionary to this composite collection
+            </summary>
+            <param name="properties">the properties to add</param>
+            <remarks>
+            <para>
+            Properties dictionaries added first take precedence over dictionaries added
+            later.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.CompositeProperties.Flatten">
+            <summary>
+            Flatten this composite collection into a single properties dictionary
+            </summary>
+            <returns>the flattened dictionary</returns>
+            <remarks>
+            <para>
+            Reduces the collection of ordered dictionaries to a single dictionary
+            containing the resultant values for the keys.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.CompositeProperties.Item(System.String)">
+            <summary>
+            Gets the value of a property
+            </summary>
+            <value>
+            The value for the property with the specified key
+            </value>
+            <remarks>
+            <para>
+            Looks up the value for the <paramref name="key"/> specified.
+            The <see cref="T:log4net.Util.PropertiesDictionary"/> collections are searched
+            in the order in which they were added to this collection. The value
+            returned is the value held by the first collection that contains
+            the specified key.
+            </para>
+            <para>
+            If none of the collections contain the specified key then
+            <c>null</c> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.ContextPropertiesBase">
+            <summary>
+            Base class for Context Properties implementations
+            </summary>
+            <remarks>
+            <para>
+            This class defines a basic property get set accessor
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="P:log4net.Util.ContextPropertiesBase.Item(System.String)">
+            <summary>
+            Gets or sets the value of a property
+            </summary>
+            <value>
+            The value for the property with the specified key
+            </value>
+            <remarks>
+            <para>
+            Gets or sets the value of a property
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.CountingQuietTextWriter">
+            <summary>
+            Subclass of <see cref="T:log4net.Util.QuietTextWriter"/> that maintains a count of 
+            the number of bytes written.
+            </summary>
+            <remarks>
+            <para>
+            This writer counts the number of bytes written.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Util.QuietTextWriter">
+            <summary>
+            <see cref="T:System.IO.TextWriter"/> that does not leak exceptions
+            </summary>
+            <remarks>
+            <para>
+            <see cref="T:log4net.Util.QuietTextWriter"/> does not throw exceptions when things go wrong. 
+            Instead, it delegates error handling to its <see cref="T:log4net.Core.IErrorHandler"/>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Util.TextWriterAdapter">
+            <summary>
+            Adapter that extends <see cref="T:System.IO.TextWriter"/> and forwards all
+            messages to an instance of <see cref="T:System.IO.TextWriter"/>.
+            </summary>
+            <remarks>
+            <para>
+            Adapter that extends <see cref="T:System.IO.TextWriter"/> and forwards all
+            messages to an instance of <see cref="T:System.IO.TextWriter"/>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Util.TextWriterAdapter.m_writer">
+            <summary>
+            The writer to forward messages to
+            </summary>
+        </member>
+        <member name="M:log4net.Util.TextWriterAdapter.#ctor(System.IO.TextWriter)">
+            <summary>
+            Create an instance of <see cref="T:log4net.Util.TextWriterAdapter"/> that forwards all
+            messages to a <see cref="T:System.IO.TextWriter"/>.
+            </summary>
+            <param name="writer">The <see cref="T:System.IO.TextWriter"/> to forward to</param>
+            <remarks>
+            <para>
+            Create an instance of <see cref="T:log4net.Util.TextWriterAdapter"/> that forwards all
+            messages to a <see cref="T:System.IO.TextWriter"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TextWriterAdapter.Close">
+            <summary>
+            Closes the writer and releases any system resources associated with the writer
+            </summary>
+            <remarks>
+            <para>
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TextWriterAdapter.Dispose(System.Boolean)">
+            <summary>
+            Dispose this writer
+            </summary>
+            <param name="disposing">flag indicating if we are being disposed</param>
+            <remarks>
+            <para>
+            Dispose this writer
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TextWriterAdapter.Flush">
+            <summary>
+            Flushes any buffered output
+            </summary>
+            <remarks>
+            <para>
+            Clears all buffers for the writer and causes any buffered data to be written 
+            to the underlying device
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TextWriterAdapter.Write(System.Char)">
+            <summary>
+            Writes a character to the wrapped TextWriter
+            </summary>
+            <param name="value">the value to write to the TextWriter</param>
+            <remarks>
+            <para>
+            Writes a character to the wrapped TextWriter
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TextWriterAdapter.Write(System.Char[],System.Int32,System.Int32)">
+            <summary>
+            Writes a character buffer to the wrapped TextWriter
+            </summary>
+            <param name="buffer">the data buffer</param>
+            <param name="index">the start index</param>
+            <param name="count">the number of characters to write</param>
+            <remarks>
+            <para>
+            Writes a character buffer to the wrapped TextWriter
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.TextWriterAdapter.Write(System.String)">
+            <summary>
+            Writes a string to the wrapped TextWriter
+            </summary>
+            <param name="value">the value to write to the TextWriter</param>
+            <remarks>
+            <para>
+            Writes a string to the wrapped TextWriter
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.TextWriterAdapter.Writer">
+            <summary>
+            Gets or sets the underlying <see cref="T:System.IO.TextWriter"/>.
+            </summary>
+            <value>
+            The underlying <see cref="T:System.IO.TextWriter"/>.
+            </value>
+            <remarks>
+            <para>
+            Gets or sets the underlying <see cref="T:System.IO.TextWriter"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.TextWriterAdapter.Encoding">
+            <summary>
+            The Encoding in which the output is written
+            </summary>
+            <value>
+            The <see cref="P:log4net.Util.TextWriterAdapter.Encoding"/>
+            </value>
+            <remarks>
+            <para>
+            The Encoding in which the output is written
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.TextWriterAdapter.FormatProvider">
+            <summary>
+            Gets an object that controls formatting
+            </summary>
+            <value>
+            The format provider
+            </value>
+            <remarks>
+            <para>
+            Gets an object that controls formatting
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.TextWriterAdapter.NewLine">
+            <summary>
+            Gets or sets the line terminator string used by the TextWriter
+            </summary>
+            <value>
+            The line terminator to use
+            </value>
+            <remarks>
+            <para>
+            Gets or sets the line terminator string used by the TextWriter
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.QuietTextWriter.#ctor(System.IO.TextWriter,log4net.Core.IErrorHandler)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="writer">the writer to actually write to</param>
+            <param name="errorHandler">the error handler to report error to</param>
+            <remarks>
+            <para>
+            Create a new QuietTextWriter using a writer and error handler
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.QuietTextWriter.Write(System.Char)">
+            <summary>
+            Writes a character to the underlying writer
+            </summary>
+            <param name="value">the char to write</param>
+            <remarks>
+            <para>
+            Writes a character to the underlying writer
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.QuietTextWriter.Write(System.Char[],System.Int32,System.Int32)">
+            <summary>
+            Writes a buffer to the underlying writer
+            </summary>
+            <param name="buffer">the buffer to write</param>
+            <param name="index">the start index to write from</param>
+            <param name="count">the number of characters to write</param>
+            <remarks>
+            <para>
+            Writes a buffer to the underlying writer
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.QuietTextWriter.Write(System.String)">
+            <summary>
+            Writes a string to the output.
+            </summary>
+            <param name="value">The string data to write to the output.</param>
+            <remarks>
+            <para>
+            Writes a string to the output.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.QuietTextWriter.Close">
+            <summary>
+            Closes the underlying output writer.
+            </summary>
+            <remarks>
+            <para>
+            Closes the underlying output writer.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.QuietTextWriter.m_errorHandler">
+            <summary>
+            The error handler instance to pass all errors to
+            </summary>
+        </member>
+        <member name="F:log4net.Util.QuietTextWriter.m_closed">
+            <summary>
+            Flag to indicate if this writer is closed
+            </summary>
+        </member>
+        <member name="P:log4net.Util.QuietTextWriter.ErrorHandler">
+            <summary>
+            Gets or sets the error handler that all errors are passed to.
+            </summary>
+            <value>
+            The error handler that all errors are passed to.
+            </value>
+            <remarks>
+            <para>
+            Gets or sets the error handler that all errors are passed to.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.QuietTextWriter.Closed">
+            <summary>
+            Gets a value indicating whether this writer is closed.
+            </summary>
+            <value>
+            <c>true</c> if this writer is closed, otherwise <c>false</c>.
+            </value>
+            <remarks>
+            <para>
+            Gets a value indicating whether this writer is closed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.CountingQuietTextWriter.#ctor(System.IO.TextWriter,log4net.Core.IErrorHandler)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="writer">The <see cref="T:System.IO.TextWriter"/> to actually write to.</param>
+            <param name="errorHandler">The <see cref="T:log4net.Core.IErrorHandler"/> to report errors to.</param>
+            <remarks>
+            <para>
+            Creates a new instance of the <see cref="T:log4net.Util.CountingQuietTextWriter"/> class 
+            with the specified <see cref="T:System.IO.TextWriter"/> and <see cref="T:log4net.Core.IErrorHandler"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.CountingQuietTextWriter.Write(System.Char)">
+            <summary>
+            Writes a character to the underlying writer and counts the number of bytes written.
+            </summary>
+            <param name="value">the char to write</param>
+            <remarks>
+            <para>
+            Overrides implementation of <see cref="T:log4net.Util.QuietTextWriter"/>. Counts
+            the number of bytes written.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.CountingQuietTextWriter.Write(System.Char[],System.Int32,System.Int32)">
+            <summary>
+            Writes a buffer to the underlying writer and counts the number of bytes written.
+            </summary>
+            <param name="buffer">the buffer to write</param>
+            <param name="index">the start index to write from</param>
+            <param name="count">the number of characters to write</param>
+            <remarks>
+            <para>
+            Overrides implementation of <see cref="T:log4net.Util.QuietTextWriter"/>. Counts
+            the number of bytes written.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.CountingQuietTextWriter.Write(System.String)">
+            <summary>
+            Writes a string to the output and counts the number of bytes written.
+            </summary>
+            <param name="str">The string data to write to the output.</param>
+            <remarks>
+            <para>
+            Overrides implementation of <see cref="T:log4net.Util.QuietTextWriter"/>. Counts
+            the number of bytes written.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.CountingQuietTextWriter.m_countBytes">
+            <summary>
+            Total number of bytes written.
+            </summary>
+        </member>
+        <member name="P:log4net.Util.CountingQuietTextWriter.Count">
+            <summary>
+            Gets or sets the total number of bytes written.
+            </summary>
+            <value>
+            The total number of bytes written.
+            </value>
+            <remarks>
+            <para>
+            Gets or sets the total number of bytes written.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.CyclicBuffer">
+            <summary>
+            A fixed size rolling buffer of logging events.
+            </summary>
+            <remarks>
+            <para>
+            An array backed fixed size leaky bucket.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.CyclicBuffer.#ctor(System.Int32)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="maxSize">The maximum number of logging events in the buffer.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.CyclicBuffer"/> class with 
+            the specified maximum number of buffered logging events.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentOutOfRangeException">The <paramref name="maxSize"/> argument is not a positive integer.</exception>
+        </member>
+        <member name="M:log4net.Util.CyclicBuffer.Append(log4net.Core.LoggingEvent)">
+            <summary>
+            Appends a <paramref name="loggingEvent"/> to the buffer.
+            </summary>
+            <param name="loggingEvent">The event to append to the buffer.</param>
+            <returns>The event discarded from the buffer, if the buffer is full, otherwise <c>null</c>.</returns>
+            <remarks>
+            <para>
+            Append an event to the buffer. If the buffer still contains free space then
+            <c>null</c> is returned. If the buffer is full then an event will be dropped
+            to make space for the new event, the event dropped is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.CyclicBuffer.PopOldest">
+            <summary>
+            Get and remove the oldest event in the buffer.
+            </summary>
+            <returns>The oldest logging event in the buffer</returns>
+            <remarks>
+            <para>
+            Gets the oldest (first) logging event in the buffer and removes it 
+            from the buffer.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.CyclicBuffer.PopAll">
+            <summary>
+            Pops all the logging events from the buffer into an array.
+            </summary>
+            <returns>An array of all the logging events in the buffer.</returns>
+            <remarks>
+            <para>
+            Get all the events in the buffer and clear the buffer.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.CyclicBuffer.Clear">
+            <summary>
+            Clear the buffer
+            </summary>
+            <remarks>
+            <para>
+            Clear the buffer of all events. The events in the buffer are lost.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.CyclicBuffer.Item(System.Int32)">
+            <summary>
+            Gets the <paramref name="i"/>th oldest event currently in the buffer.
+            </summary>
+            <value>The <paramref name="i"/>th oldest event currently in the buffer.</value>
+            <remarks>
+            <para>
+            If <paramref name="i"/> is outside the range 0 to the number of events
+            currently in the buffer, then <c>null</c> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.CyclicBuffer.MaxSize">
+            <summary>
+            Gets the maximum size of the buffer.
+            </summary>
+            <value>The maximum size of the buffer.</value>
+            <remarks>
+            <para>
+            Gets the maximum size of the buffer
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.CyclicBuffer.Length">
+            <summary>
+            Gets the number of logging events in the buffer.
+            </summary>
+            <value>The number of logging events in the buffer.</value>
+            <remarks>
+            <para>
+            This number is guaranteed to be in the range 0 to <see cref="P:log4net.Util.CyclicBuffer.MaxSize"/>
+            (inclusive).
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.EmptyCollection">
+            <summary>
+            An always empty <see cref="T:System.Collections.ICollection"/>.
+            </summary>
+            <remarks>
+            <para>
+            A singleton implementation of the <see cref="T:System.Collections.ICollection"/>
+            interface that always represents an empty collection.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.EmptyCollection.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Util.EmptyCollection"/> class. 
+            </summary>
+            <remarks>
+            <para>
+            Uses a private access modifier to enforce the singleton pattern.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.EmptyCollection.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies the elements of the <see cref="T:System.Collections.ICollection"/> to an 
+            <see cref="T:System.Array"/>, starting at a particular Array index.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:System.Array"/> 
+            that is the destination of the elements copied from 
+            <see cref="T:System.Collections.ICollection"/>. The Array must have zero-based 
+            indexing.</param>
+            <param name="index">The zero-based index in array at which 
+            copying begins.</param>
+            <remarks>
+            <para>
+            As the collection is empty no values are copied into the array.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.EmptyCollection.GetEnumerator">
+            <summary>
+            Returns an enumerator that can iterate through a collection.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IEnumerator"/> that can be used to 
+            iterate through the collection.
+            </returns>
+            <remarks>
+            <para>
+            As the collection is empty a <see cref="T:log4net.Util.NullEnumerator"/> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.EmptyCollection.s_instance">
+            <summary>
+            The singleton instance of the empty collection.
+            </summary>
+        </member>
+        <member name="P:log4net.Util.EmptyCollection.Instance">
+            <summary>
+            Gets the singleton instance of the empty collection.
+            </summary>
+            <returns>The singleton instance of the empty collection.</returns>
+            <remarks>
+            <para>
+            Gets the singleton instance of the empty collection.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.EmptyCollection.IsSynchronized">
+            <summary>
+            Gets a value indicating if access to the <see cref="T:System.Collections.ICollection"/> is synchronized (thread-safe).
+            </summary>
+            <value>
+            <b>true</b> if access to the <see cref="T:System.Collections.ICollection"/> is synchronized (thread-safe); otherwise, <b>false</b>.
+            </value>
+            <remarks>
+            <para>
+            For the <see cref="T:log4net.Util.EmptyCollection"/> this property is always <c>true</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.EmptyCollection.Count">
+            <summary>
+            Gets the number of elements contained in the <see cref="T:System.Collections.ICollection"/>.
+            </summary>
+            <value>
+            The number of elements contained in the <see cref="T:System.Collections.ICollection"/>.
+            </value>
+            <remarks>
+            <para>
+            As the collection is empty the <see cref="P:log4net.Util.EmptyCollection.Count"/> is always <c>0</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.EmptyCollection.SyncRoot">
+            <summary>
+            Gets an object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"/>.
+            </summary>
+            <value>
+            An object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"/>.
+            </value>
+            <remarks>
+            <para>
+            As the collection is empty and thread safe and synchronized this instance is also
+            the <see cref="P:log4net.Util.EmptyCollection.SyncRoot"/> object.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.EmptyDictionary">
+            <summary>
+            An always empty <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <remarks>
+            <para>
+            A singleton implementation of the <see cref="T:System.Collections.IDictionary"/>
+            interface that always represents an empty collection.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.EmptyDictionary.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Util.EmptyDictionary"/> class. 
+            </summary>
+            <remarks>
+            <para>
+            Uses a private access modifier to enforce the singleton pattern.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.EmptyDictionary.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies the elements of the <see cref="T:System.Collections.ICollection"/> to an 
+            <see cref="T:System.Array"/>, starting at a particular Array index.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:System.Array"/> 
+            that is the destination of the elements copied from 
+            <see cref="T:System.Collections.ICollection"/>. The Array must have zero-based 
+            indexing.</param>
+            <param name="index">The zero-based index in array at which 
+            copying begins.</param>
+            <remarks>
+            <para>
+            As the collection is empty no values are copied into the array.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.EmptyDictionary.System#Collections#IEnumerable#GetEnumerator">
+            <summary>
+            Returns an enumerator that can iterate through a collection.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IEnumerator"/> that can be used to 
+            iterate through the collection.
+            </returns>
+            <remarks>
+            <para>
+            As the collection is empty a <see cref="T:log4net.Util.NullEnumerator"/> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.EmptyDictionary.Add(System.Object,System.Object)">
+            <summary>
+            Adds an element with the provided key and value to the 
+            <see cref="T:log4net.Util.EmptyDictionary"/>.
+            </summary>
+            <param name="key">The <see cref="T:System.Object"/> to use as the key of the element to add.</param>
+            <param name="value">The <see cref="T:System.Object"/> to use as the value of the element to add.</param>
+            <remarks>
+            <para>
+            As the collection is empty no new values can be added. A <see cref="T:System.InvalidOperationException"/>
+            is thrown if this method is called.
+            </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">This dictionary is always empty and cannot be modified.</exception>
+        </member>
+        <member name="M:log4net.Util.EmptyDictionary.Clear">
+            <summary>
+            Removes all elements from the <see cref="T:log4net.Util.EmptyDictionary"/>.
+            </summary>
+            <remarks>
+            <para>
+            As the collection is empty no values can be removed. A <see cref="T:System.InvalidOperationException"/>
+            is thrown if this method is called.
+            </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">This dictionary is always empty and cannot be modified.</exception>
+        </member>
+        <member name="M:log4net.Util.EmptyDictionary.Contains(System.Object)">
+            <summary>
+            Determines whether the <see cref="T:log4net.Util.EmptyDictionary"/> contains an element 
+            with the specified key.
+            </summary>
+            <param name="key">The key to locate in the <see cref="T:log4net.Util.EmptyDictionary"/>.</param>
+            <returns><c>false</c></returns>
+            <remarks>
+            <para>
+            As the collection is empty the <see cref="M:log4net.Util.EmptyDictionary.Contains(System.Object)"/> method always returns <c>false</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.EmptyDictionary.GetEnumerator">
+            <summary>
+            Returns an enumerator that can iterate through a collection.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IEnumerator"/> that can be used to 
+            iterate through the collection.
+            </returns>
+            <remarks>
+            <para>
+            As the collection is empty a <see cref="T:log4net.Util.NullEnumerator"/> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.EmptyDictionary.Remove(System.Object)">
+            <summary>
+            Removes the element with the specified key from the <see cref="T:log4net.Util.EmptyDictionary"/>.
+            </summary>
+            <param name="key">The key of the element to remove.</param>
+            <remarks>
+            <para>
+            As the collection is empty no values can be removed. A <see cref="T:System.InvalidOperationException"/>
+            is thrown if this method is called.
+            </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">This dictionary is always empty and cannot be modified.</exception>
+        </member>
+        <member name="F:log4net.Util.EmptyDictionary.s_instance">
+            <summary>
+            The singleton instance of the empty dictionary.
+            </summary>
+        </member>
+        <member name="P:log4net.Util.EmptyDictionary.Instance">
+            <summary>
+            Gets the singleton instance of the <see cref="T:log4net.Util.EmptyDictionary"/>.
+            </summary>
+            <returns>The singleton instance of the <see cref="T:log4net.Util.EmptyDictionary"/>.</returns>
+            <remarks>
+            <para>
+            Gets the singleton instance of the <see cref="T:log4net.Util.EmptyDictionary"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.EmptyDictionary.IsSynchronized">
+            <summary>
+            Gets a value indicating if access to the <see cref="T:System.Collections.ICollection"/> is synchronized (thread-safe).
+            </summary>
+            <value>
+            <b>true</b> if access to the <see cref="T:System.Collections.ICollection"/> is synchronized (thread-safe); otherwise, <b>false</b>.
+            </value>
+            <remarks>
+            <para>
+            For the <see cref="T:log4net.Util.EmptyCollection"/> this property is always <b>true</b>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.EmptyDictionary.Count">
+            <summary>
+            Gets the number of elements contained in the <see cref="T:System.Collections.ICollection"/>
+            </summary>
+            <value>
+            The number of elements contained in the <see cref="T:System.Collections.ICollection"/>.
+            </value>
+            <remarks>
+            <para>
+            As the collection is empty the <see cref="P:log4net.Util.EmptyDictionary.Count"/> is always <c>0</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.EmptyDictionary.SyncRoot">
+            <summary>
+            Gets an object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"/>.
+            </summary>
+            <value>
+            An object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"/>.
+            </value>
+            <remarks>
+            <para>
+            As the collection is empty and thread safe and synchronized this instance is also
+            the <see cref="P:log4net.Util.EmptyDictionary.SyncRoot"/> object.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.EmptyDictionary.IsFixedSize">
+            <summary>
+            Gets a value indicating whether the <see cref="T:log4net.Util.EmptyDictionary"/> has a fixed size.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            As the collection is empty <see cref="P:log4net.Util.EmptyDictionary.IsFixedSize"/> always returns <c>true</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.EmptyDictionary.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see cref="T:log4net.Util.EmptyDictionary"/> is read-only.
+            </summary>
+            <value><c>true</c></value>
+            <remarks>
+            <para>
+            As the collection is empty <see cref="P:log4net.Util.EmptyDictionary.IsReadOnly"/> always returns <c>true</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.EmptyDictionary.Keys">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"/> containing the keys of the <see cref="T:log4net.Util.EmptyDictionary"/>.
+            </summary>
+            <value>An <see cref="T:System.Collections.ICollection"/> containing the keys of the <see cref="T:log4net.Util.EmptyDictionary"/>.</value>
+            <remarks>
+            <para>
+            As the collection is empty a <see cref="T:log4net.Util.EmptyCollection"/> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.EmptyDictionary.Values">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"/> containing the values of the <see cref="T:log4net.Util.EmptyDictionary"/>.
+            </summary>
+            <value>An <see cref="T:System.Collections.ICollection"/> containing the values of the <see cref="T:log4net.Util.EmptyDictionary"/>.</value>
+            <remarks>
+            <para>
+            As the collection is empty a <see cref="T:log4net.Util.EmptyCollection"/> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.EmptyDictionary.Item(System.Object)">
+            <summary>
+            Gets or sets the element with the specified key.
+            </summary>
+            <param name="key">The key of the element to get or set.</param>
+            <value><c>null</c></value>
+            <remarks>
+            <para>
+            As the collection is empty no values can be looked up or stored. 
+            If the index getter is called then <c>null</c> is returned.
+            A <see cref="T:System.InvalidOperationException"/> is thrown if the setter is called.
+            </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">This dictionary is always empty and cannot be modified.</exception>
+        </member>
+        <member name="T:log4net.Util.FormattingInfo">
+            <summary>
+            Contain the information obtained when parsing formatting modifiers 
+            in conversion modifiers.
+            </summary>
+            <remarks>
+            <para>
+            Holds the formatting information extracted from the format string by
+            the <see cref="T:log4net.Util.PatternParser"/>. This is used by the <see cref="T:log4net.Util.PatternConverter"/>
+            objects when rendering the output.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.FormattingInfo.#ctor">
+            <summary>
+            Defaut Constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.FormattingInfo"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.FormattingInfo.#ctor(System.Int32,System.Int32,System.Boolean)">
+            <summary>
+            Constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.FormattingInfo"/> class
+            with the specified parameters.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.FormattingInfo.Min">
+            <summary>
+            Gets or sets the minimum value.
+            </summary>
+            <value>
+            The minimum value.
+            </value>
+            <remarks>
+            <para>
+            Gets or sets the minimum value.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.FormattingInfo.Max">
+            <summary>
+            Gets or sets the maximum value.
+            </summary>
+            <value>
+            The maximum value.
+            </value>
+            <remarks>
+            <para>
+            Gets or sets the maximum value.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.FormattingInfo.LeftAlign">
+            <summary>
+            Gets or sets a flag indicating whether left align is enabled
+            or not.
+            </summary>
+            <value>
+            A flag indicating whether left align is enabled or not.
+            </value>
+            <remarks>
+            <para>
+            Gets or sets a flag indicating whether left align is enabled or not.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.GlobalContextProperties">
+            <summary>
+            Implementation of Properties collection for the <see cref="T:log4net.GlobalContext"/>
+            </summary>
+            <remarks>
+            <para>
+            This class implements a properties collection that is thread safe and supports both
+            storing properties and capturing a read only copy of the current propertied.
+            </para>
+            <para>
+            This class is optimized to the scenario where the properties are read frequently
+            and are modified infrequently.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Util.GlobalContextProperties.m_readOnlyProperties">
+            <summary>
+            The read only copy of the properties.
+            </summary>
+            <remarks>
+            <para>
+            This variable is declared <c>volatile</c> to prevent the compiler and JIT from
+            reordering reads and writes of this thread performed on different threads.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.GlobalContextProperties.m_syncRoot">
+            <summary>
+            Lock object used to synchronize updates within this instance
+            </summary>
+        </member>
+        <member name="M:log4net.Util.GlobalContextProperties.#ctor">
+            <summary>
+            Constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.GlobalContextProperties"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.GlobalContextProperties.Remove(System.String)">
+            <summary>
+            Remove a property from the global context
+            </summary>
+            <param name="key">the key for the entry to remove</param>
+            <remarks>
+            <para>
+            Removing an entry from the global context properties is relatively expensive compared
+            with reading a value. 
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.GlobalContextProperties.Clear">
+            <summary>
+            Clear the global context properties
+            </summary>
+        </member>
+        <member name="M:log4net.Util.GlobalContextProperties.GetReadOnlyProperties">
+            <summary>
+            Get a readonly immutable copy of the properties
+            </summary>
+            <returns>the current global context properties</returns>
+            <remarks>
+            <para>
+            This implementation is fast because the GlobalContextProperties class
+            stores a readonly copy of the properties.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.GlobalContextProperties.Item(System.String)">
+            <summary>
+            Gets or sets the value of a property
+            </summary>
+            <value>
+            The value for the property with the specified key
+            </value>
+            <remarks>
+            <para>
+            Reading the value for a key is faster than setting the value.
+            When the value is written a new read only copy of 
+            the properties is created.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.LevelMapping">
+            <summary>
+            Manages a mapping from levels to <see cref="T:log4net.Util.LevelMappingEntry"/>
+            </summary>
+            <remarks>
+            <para>
+            Manages an ordered mapping from <see cref="T:log4net.Core.Level"/> instances 
+            to <see cref="T:log4net.Util.LevelMappingEntry"/> subclasses.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.LevelMapping.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Initialise a new instance of <see cref="T:log4net.Util.LevelMapping"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LevelMapping.Add(log4net.Util.LevelMappingEntry)">
+            <summary>
+            Add a <see cref="T:log4net.Util.LevelMappingEntry"/> to this mapping
+            </summary>
+            <param name="entry">the entry to add</param>
+            <remarks>
+            <para>
+            If a <see cref="T:log4net.Util.LevelMappingEntry"/> has previously been added
+            for the same <see cref="T:log4net.Core.Level"/> then that entry will be 
+            overwritten.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LevelMapping.Lookup(log4net.Core.Level)">
+            <summary>
+            Lookup the mapping for the specified level
+            </summary>
+            <param name="level">the level to lookup</param>
+            <returns>the <see cref="T:log4net.Util.LevelMappingEntry"/> for the level or <c>null</c> if no mapping found</returns>
+            <remarks>
+            <para>
+            Lookup the value for the specified level. Finds the nearest
+            mapping value for the level that is equal to or less than the
+            <paramref name="level"/> specified.
+            </para>
+            <para>
+            If no mapping could be found then <c>null</c> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LevelMapping.ActivateOptions">
+            <summary>
+            Initialize options
+            </summary>
+            <remarks>
+            <para>
+            Caches the sorted list of <see cref="T:log4net.Util.LevelMappingEntry"/> in an array
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.LogicalThreadContextProperties">
+            <summary>
+            Implementation of Properties collection for the <see cref="T:log4net.LogicalThreadContext"/>
+            </summary>
+            <remarks>
+            <para>
+            Class implements a collection of properties that is specific to each thread.
+            The class is not synchronized as each thread has its own <see cref="T:log4net.Util.PropertiesDictionary"/>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.LogicalThreadContextProperties.#ctor">
+            <summary>
+            Constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.LogicalThreadContextProperties"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LogicalThreadContextProperties.Remove(System.String)">
+            <summary>
+            Remove a property
+            </summary>
+            <param name="key">the key for the entry to remove</param>
+            <remarks>
+            <para>
+            Remove the value for the specified <paramref name="key"/> from the context.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LogicalThreadContextProperties.Clear">
+            <summary>
+            Clear all the context properties
+            </summary>
+            <remarks>
+            <para>
+            Clear all the context properties
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LogicalThreadContextProperties.GetProperties(System.Boolean)">
+            <summary>
+            Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread.
+            </summary>
+            <param name="create">create the dictionary if it does not exist, otherwise return null if is does not exist</param>
+            <returns>the properties for this thread</returns>
+            <remarks>
+            <para>
+            The collection returned is only to be used on the calling thread. If the
+            caller needs to share the collection between different threads then the 
+            caller must clone the collection before doings so.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.LogicalThreadContextProperties.Item(System.String)">
+            <summary>
+            Gets or sets the value of a property
+            </summary>
+            <value>
+            The value for the property with the specified key
+            </value>
+            <remarks>
+            <para>
+            Get or set the property value for the <paramref name="key"/> specified.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.LogLog">
+            <summary>
+            Outputs log statements from within the log4net assembly.
+            </summary>
+            <remarks>
+            <para>
+            Log4net components cannot make log4net logging calls. However, it is
+            sometimes useful for the user to learn about what log4net is
+            doing.
+            </para>
+            <para>
+            All log4net internal debug calls go to the standard output stream
+            whereas internal error messages are sent to the standard error output 
+            stream.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.LogLog.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Util.LogLog"/> class. 
+            </summary>
+            <remarks>
+            <para>
+            Uses a private access modifier to prevent instantiation of this class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LogLog.#cctor">
+            <summary>
+            Static constructor that initializes logging by reading 
+            settings from the application configuration file.
+            </summary>
+            <remarks>
+            <para>
+            The <c>log4net.Internal.Debug</c> application setting
+            controls internal debugging. This setting should be set
+            to <c>true</c> to enable debugging.
+            </para>
+            <para>
+            The <c>log4net.Internal.Quiet</c> application setting
+            suppresses all internal logging including error messages. 
+            This setting should be set to <c>true</c> to enable message
+            suppression.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LogLog.Debug(System.String)">
+            <summary>
+            Writes log4net internal debug messages to the 
+            standard output stream.
+            </summary>
+            <param name="message">The message to log.</param>
+            <remarks>
+            <para>
+            All internal debug messages are prepended with 
+            the string "log4net: ".
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LogLog.Debug(System.String,System.Exception)">
+            <summary>
+            Writes log4net internal debug messages to the 
+            standard output stream.
+            </summary>
+            <param name="message">The message to log.</param>
+            <param name="exception">An exception to log.</param>
+            <remarks>
+            <para>
+            All internal debug messages are prepended with 
+            the string "log4net: ".
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LogLog.Warn(System.String)">
+            <summary>
+            Writes log4net internal warning messages to the 
+            standard error stream.
+            </summary>
+            <param name="message">The message to log.</param>
+            <remarks>
+            <para>
+            All internal warning messages are prepended with 
+            the string "log4net:WARN ".
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LogLog.Warn(System.String,System.Exception)">
+            <summary>
+            Writes log4net internal warning messages to the 
+            standard error stream.
+            </summary>
+            <param name="message">The message to log.</param>
+            <param name="exception">An exception to log.</param>
+            <remarks>
+            <para>
+            All internal warning messages are prepended with 
+            the string "log4net:WARN ".
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LogLog.Error(System.String)">
+            <summary>
+            Writes log4net internal error messages to the 
+            standard error stream.
+            </summary>
+            <param name="message">The message to log.</param>
+            <remarks>
+            <para>
+            All internal error messages are prepended with 
+            the string "log4net:ERROR ".
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LogLog.Error(System.String,System.Exception)">
+            <summary>
+            Writes log4net internal error messages to the 
+            standard error stream.
+            </summary>
+            <param name="message">The message to log.</param>
+            <param name="exception">An exception to log.</param>
+            <remarks>
+            <para>
+            All internal debug messages are prepended with 
+            the string "log4net:ERROR ".
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LogLog.EmitOutLine(System.String)">
+            <summary>
+            Writes output to the standard output stream.  
+            </summary>
+            <param name="message">The message to log.</param>
+            <remarks>
+            <para>
+            Writes to both Console.Out and System.Diagnostics.Trace.
+            Note that the System.Diagnostics.Trace is not supported
+            on the Compact Framework.
+            </para>
+            <para>
+            If the AppDomain is not configured with a config file then
+            the call to System.Diagnostics.Trace may fail. This is only
+            an issue if you are programmatically creating your own AppDomains.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.LogLog.EmitErrorLine(System.String)">
+            <summary>
+            Writes output to the standard error stream.  
+            </summary>
+            <param name="message">The message to log.</param>
+            <remarks>
+            <para>
+            Writes to both Console.Error and System.Diagnostics.Trace.
+            Note that the System.Diagnostics.Trace is not supported
+            on the Compact Framework.
+            </para>
+            <para>
+            If the AppDomain is not configured with a config file then
+            the call to System.Diagnostics.Trace may fail. This is only
+            an issue if you are programmatically creating your own AppDomains.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.LogLog.s_debugEnabled">
+            <summary>
+             Default debug level
+            </summary>
+        </member>
+        <member name="F:log4net.Util.LogLog.s_quietMode">
+            <summary>
+            In quietMode not even errors generate any output.
+            </summary>
+        </member>
+        <member name="P:log4net.Util.LogLog.InternalDebugging">
+            <summary>
+            Gets or sets a value indicating whether log4net internal logging
+            is enabled or disabled.
+            </summary>
+            <value>
+            <c>true</c> if log4net internal logging is enabled, otherwise 
+            <c>false</c>.
+            </value>
+            <remarks>
+            <para>
+            When set to <c>true</c>, internal debug level logging will be 
+            displayed.
+            </para>
+            <para>
+            This value can be set by setting the application setting 
+            <c>log4net.Internal.Debug</c> in the application configuration
+            file.
+            </para>
+            <para>
+            The default value is <c>false</c>, i.e. debugging is
+            disabled.
+            </para>
+            </remarks>
+            <example>
+            <para>
+            The following example enables internal debugging using the 
+            application configuration file :
+            </para>
+            <code lang="XML" escaped="true">
+            <configuration>
+            	<appSettings>
+            		<add key="log4net.Internal.Debug" value="true" />
+            	</appSettings>
+            </configuration>
+            </code>
+            </example>
+        </member>
+        <member name="P:log4net.Util.LogLog.QuietMode">
+            <summary>
+            Gets or sets a value indicating whether log4net should generate no output
+            from internal logging, not even for errors. 
+            </summary>
+            <value>
+            <c>true</c> if log4net should generate no output at all from internal 
+            logging, otherwise <c>false</c>.
+            </value>
+            <remarks>
+            <para>
+            When set to <c>true</c> will cause internal logging at all levels to be 
+            suppressed. This means that no warning or error reports will be logged. 
+            This option overrides the <see cref="P:log4net.Util.LogLog.InternalDebugging"/> setting and 
+            disables all debug also.
+            </para>
+            <para>This value can be set by setting the application setting
+            <c>log4net.Internal.Quiet</c> in the application configuration file.
+            </para>
+            <para>
+            The default value is <c>false</c>, i.e. internal logging is not
+            disabled.
+            </para>
+            </remarks>
+            <example>
+            The following example disables internal logging using the 
+            application configuration file :
+            <code lang="XML" escaped="true">
+            <configuration>
+            	<appSettings>
+            		<add key="log4net.Internal.Quiet" value="true"/>
+            	</appSettings>
+            </configuration>
+            </code>
+            </example>
+        </member>
+        <member name="P:log4net.Util.LogLog.IsDebugEnabled">
+            <summary>
+            Test if LogLog.Debug is enabled for output.
+            </summary>
+            <value>
+            <c>true</c> if Debug is enabled
+            </value>
+            <remarks>
+            <para>
+            Test if LogLog.Debug is enabled for output.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.LogLog.IsWarnEnabled">
+            <summary>
+            Test if LogLog.Warn is enabled for output.
+            </summary>
+            <value>
+            <c>true</c> if Warn is enabled
+            </value>
+            <remarks>
+            <para>
+            Test if LogLog.Warn is enabled for output.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.LogLog.IsErrorEnabled">
+            <summary>
+            Test if LogLog.Error is enabled for output.
+            </summary>
+            <value>
+            <c>true</c> if Error is enabled
+            </value>
+            <remarks>
+            <para>
+            Test if LogLog.Error is enabled for output.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.NativeError">
+            <summary>
+            Represents a native error code and message.
+            </summary>
+            <remarks>
+            <para>
+            Represents a Win32 platform native error.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.NativeError.#ctor(System.Int32,System.String)">
+            <summary>
+            Create an instance of the <see cref="T:log4net.Util.NativeError"/> class with the specified 
+            error number and message.
+            </summary>
+            <param name="number">The number of the native error.</param>
+            <param name="message">The message of the native error.</param>
+            <remarks>
+            <para>
+            Create an instance of the <see cref="T:log4net.Util.NativeError"/> class with the specified 
+            error number and message.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.NativeError.GetLastError">
+            <summary>
+            Create a new instance of the <see cref="T:log4net.Util.NativeError"/> class for the last Windows error.
+            </summary>
+            <returns>
+            An instance of the <see cref="T:log4net.Util.NativeError"/> class for the last windows error.
+            </returns>
+            <remarks>
+            <para>
+            The message for the <see cref="M:System.Runtime.InteropServices.Marshal.GetLastWin32Error"/> error number is lookup up using the 
+            native Win32 <c>FormatMessage</c> function.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.NativeError.GetError(System.Int32)">
+            <summary>
+            Create a new instance of the <see cref="T:log4net.Util.NativeError"/> class.
+            </summary>
+            <param name="number">the error number for the native error</param>
+            <returns>
+            An instance of the <see cref="T:log4net.Util.NativeError"/> class for the specified 
+            error number.
+            </returns>
+            <remarks>
+            <para>
+            The message for the specified error number is lookup up using the 
+            native Win32 <c>FormatMessage</c> function.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.NativeError.GetErrorMessage(System.Int32)">
+            <summary>
+            Retrieves the message corresponding with a Win32 message identifier.
+            </summary>
+            <param name="messageId">Message identifier for the requested message.</param>
+            <returns>
+            The message corresponding with the specified message identifier.
+            </returns>
+            <remarks>
+            <para>
+            The message will be searched for in system message-table resource(s)
+            using the native <c>FormatMessage</c> function.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.NativeError.ToString">
+            <summary>
+            Return error information string
+            </summary>
+            <returns>error information string</returns>
+            <remarks>
+            <para>
+            Return error information string
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.NativeError.FormatMessage(System.Int32,System.IntPtr@,System.Int32,System.Int32,System.String@,System.Int32,System.IntPtr)">
+            <summary>
+            Formats a message string.
+            </summary>
+            <param name="dwFlags">Formatting options, and how to interpret the <paramref name="lpSource"/> parameter.</param>
+            <param name="lpSource">Location of the message definition.</param>
+            <param name="dwMessageId">Message identifier for the requested message.</param>
+            <param name="dwLanguageId">Language identifier for the requested message.</param>
+            <param name="lpBuffer">If <paramref name="dwFlags"/> includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the <c>LocalAlloc</c> function, and places the pointer to the buffer at the address specified in <paramref name="lpBuffer"/>.</param>
+            <param name="nSize">If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer.</param>
+            <param name="Arguments">Pointer to an array of values that are used as insert values in the formatted message.</param>
+            <remarks>
+            <para>
+            The function requires a message definition as input. The message definition can come from a 
+            buffer passed into the function. It can come from a message table resource in an 
+            already-loaded module. Or the caller can ask the function to search the system's message 
+            table resource(s) for the message definition. The function finds the message definition 
+            in a message table resource based on a message identifier and a language identifier. 
+            The function copies the formatted message text to an output buffer, processing any embedded 
+            insert sequences if requested.
+            </para>
+            <para>
+            To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message.
+            </para>
+            </remarks>
+            <returns>
+            <para>
+            If the function succeeds, the return value is the number of TCHARs stored in the output 
+            buffer, excluding the terminating null character.
+            </para>
+            <para>
+            If the function fails, the return value is zero. To get extended error information, 
+            call <see cref="M:System.Runtime.InteropServices.Marshal.GetLastWin32Error"/>.
+            </para>
+            </returns>
+        </member>
+        <member name="P:log4net.Util.NativeError.Number">
+            <summary>
+            Gets the number of the native error.
+            </summary>
+            <value>
+            The number of the native error.
+            </value>
+            <remarks>
+            <para>
+            Gets the number of the native error.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.NativeError.Message">
+            <summary>
+            Gets the message of the native error.
+            </summary>
+            <value>
+            The message of the native error.
+            </value>
+            <remarks>
+            <para>
+            </para>
+            Gets the message of the native error.
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.NullDictionaryEnumerator">
+            <summary>
+            An always empty <see cref="T:System.Collections.IDictionaryEnumerator"/>.
+            </summary>
+            <remarks>
+            <para>
+            A singleton implementation of the <see cref="T:System.Collections.IDictionaryEnumerator"/> over a collection
+            that is empty and not modifiable.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.NullDictionaryEnumerator.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Util.NullDictionaryEnumerator"/> class. 
+            </summary>
+            <remarks>
+            <para>
+            Uses a private access modifier to enforce the singleton pattern.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.NullDictionaryEnumerator.MoveNext">
+            <summary>
+            Test if the enumerator can advance, if so advance.
+            </summary>
+            <returns><c>false</c> as the <see cref="T:log4net.Util.NullDictionaryEnumerator"/> cannot advance.</returns>
+            <remarks>
+            <para>
+            As the enumerator is over an empty collection its <see cref="P:log4net.Util.NullDictionaryEnumerator.Current"/>
+            value cannot be moved over a valid position, therefore <see cref="M:log4net.Util.NullDictionaryEnumerator.MoveNext"/>
+            will always return <c>false</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.NullDictionaryEnumerator.Reset">
+            <summary>
+            Resets the enumerator back to the start.
+            </summary>
+            <remarks>
+            <para>
+            As the enumerator is over an empty collection <see cref="M:log4net.Util.NullDictionaryEnumerator.Reset"/> does nothing.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.NullDictionaryEnumerator.s_instance">
+            <summary>
+            The singleton instance of the <see cref="T:log4net.Util.NullDictionaryEnumerator"/>.
+            </summary>
+        </member>
+        <member name="P:log4net.Util.NullDictionaryEnumerator.Instance">
+            <summary>
+            Gets the singleton instance of the <see cref="T:log4net.Util.NullDictionaryEnumerator"/>.
+            </summary>
+            <returns>The singleton instance of the <see cref="T:log4net.Util.NullDictionaryEnumerator"/>.</returns>
+            <remarks>
+            <para>
+            Gets the singleton instance of the <see cref="T:log4net.Util.NullDictionaryEnumerator"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.NullDictionaryEnumerator.Current">
+            <summary>
+            Gets the current object from the enumerator.
+            </summary>
+            <remarks>
+            Throws an <see cref="T:System.InvalidOperationException"/> because the 
+            <see cref="T:log4net.Util.NullDictionaryEnumerator"/> never has a current value.
+            </remarks>
+            <remarks>
+            <para>
+            As the enumerator is over an empty collection its <see cref="P:log4net.Util.NullDictionaryEnumerator.Current"/>
+            value cannot be moved over a valid position, therefore <see cref="P:log4net.Util.NullDictionaryEnumerator.Current"/>
+            will throw an <see cref="T:System.InvalidOperationException"/>.
+            </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">The collection is empty and <see cref="P:log4net.Util.NullDictionaryEnumerator.Current"/> 
+            cannot be positioned over a valid location.</exception>
+        </member>
+        <member name="P:log4net.Util.NullDictionaryEnumerator.Key">
+            <summary>
+            Gets the current key from the enumerator.
+            </summary>
+            <remarks>
+            Throws an exception because the <see cref="T:log4net.Util.NullDictionaryEnumerator"/>
+            never has a current value.
+            </remarks>
+            <remarks>
+            <para>
+            As the enumerator is over an empty collection its <see cref="P:log4net.Util.NullDictionaryEnumerator.Current"/>
+            value cannot be moved over a valid position, therefore <see cref="P:log4net.Util.NullDictionaryEnumerator.Key"/>
+            will throw an <see cref="T:System.InvalidOperationException"/>.
+            </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">The collection is empty and <see cref="P:log4net.Util.NullDictionaryEnumerator.Current"/> 
+            cannot be positioned over a valid location.</exception>
+        </member>
+        <member name="P:log4net.Util.NullDictionaryEnumerator.Value">
+            <summary>
+            Gets the current value from the enumerator.
+            </summary>
+            <value>The current value from the enumerator.</value>
+            <remarks>
+            Throws an <see cref="T:System.InvalidOperationException"/> because the 
+            <see cref="T:log4net.Util.NullDictionaryEnumerator"/> never has a current value.
+            </remarks>
+            <remarks>
+            <para>
+            As the enumerator is over an empty collection its <see cref="P:log4net.Util.NullDictionaryEnumerator.Current"/>
+            value cannot be moved over a valid position, therefore <see cref="P:log4net.Util.NullDictionaryEnumerator.Value"/>
+            will throw an <see cref="T:System.InvalidOperationException"/>.
+            </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">The collection is empty and <see cref="P:log4net.Util.NullDictionaryEnumerator.Current"/> 
+            cannot be positioned over a valid location.</exception>
+        </member>
+        <member name="P:log4net.Util.NullDictionaryEnumerator.Entry">
+            <summary>
+            Gets the current entry from the enumerator.
+            </summary>
+            <remarks>
+            Throws an <see cref="T:System.InvalidOperationException"/> because the 
+            <see cref="T:log4net.Util.NullDictionaryEnumerator"/> never has a current entry.
+            </remarks>
+            <remarks>
+            <para>
+            As the enumerator is over an empty collection its <see cref="P:log4net.Util.NullDictionaryEnumerator.Current"/>
+            value cannot be moved over a valid position, therefore <see cref="P:log4net.Util.NullDictionaryEnumerator.Entry"/>
+            will throw an <see cref="T:System.InvalidOperationException"/>.
+            </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">The collection is empty and <see cref="P:log4net.Util.NullDictionaryEnumerator.Current"/> 
+            cannot be positioned over a valid location.</exception>
+        </member>
+        <member name="T:log4net.Util.NullEnumerator">
+            <summary>
+            An always empty <see cref="T:System.Collections.IEnumerator"/>.
+            </summary>
+            <remarks>
+            <para>
+            A singleton implementation of the <see cref="T:System.Collections.IEnumerator"/> over a collection
+            that is empty and not modifiable.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.NullEnumerator.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Util.NullEnumerator"/> class. 
+            </summary>
+            <remarks>
+            <para>
+            Uses a private access modifier to enforce the singleton pattern.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.NullEnumerator.MoveNext">
+            <summary>
+            Test if the enumerator can advance, if so advance
+            </summary>
+            <returns><c>false</c> as the <see cref="T:log4net.Util.NullEnumerator"/> cannot advance.</returns>
+            <remarks>
+            <para>
+            As the enumerator is over an empty collection its <see cref="P:log4net.Util.NullEnumerator.Current"/>
+            value cannot be moved over a valid position, therefore <see cref="M:log4net.Util.NullEnumerator.MoveNext"/>
+            will always return <c>false</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.NullEnumerator.Reset">
+            <summary>
+            Resets the enumerator back to the start.
+            </summary>
+            <remarks>
+            <para>
+            As the enumerator is over an empty collection <see cref="M:log4net.Util.NullEnumerator.Reset"/> does nothing.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.NullEnumerator.s_instance">
+            <summary>
+            The singleton instance of the <see cref="T:log4net.Util.NullEnumerator"/>.
+            </summary>
+        </member>
+        <member name="P:log4net.Util.NullEnumerator.Instance">
+            <summary>
+            Get the singleton instance of the <see cref="T:log4net.Util.NullEnumerator"/>.
+            </summary>
+            <returns>The singleton instance of the <see cref="T:log4net.Util.NullEnumerator"/>.</returns>
+            <remarks>
+            <para>
+            Gets the singleton instance of the <see cref="T:log4net.Util.NullEnumerator"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.NullEnumerator.Current">
+            <summary>
+            Gets the current object from the enumerator.
+            </summary>
+            <remarks>
+            Throws an <see cref="T:System.InvalidOperationException"/> because the 
+            <see cref="T:log4net.Util.NullDictionaryEnumerator"/> never has a current value.
+            </remarks>
+            <remarks>
+            <para>
+            As the enumerator is over an empty collection its <see cref="P:log4net.Util.NullEnumerator.Current"/>
+            value cannot be moved over a valid position, therefore <see cref="P:log4net.Util.NullEnumerator.Current"/>
+            will throw an <see cref="T:System.InvalidOperationException"/>.
+            </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">The collection is empty and <see cref="P:log4net.Util.NullEnumerator.Current"/> 
+            cannot be positioned over a valid location.</exception>
+        </member>
+        <member name="T:log4net.Util.NullSecurityContext">
+            <summary>
+            A SecurityContext used when a SecurityContext is not required
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Util.NullSecurityContext"/> is a no-op implementation of the
+            <see cref="T:log4net.Core.SecurityContext"/> base class. It is used where a <see cref="T:log4net.Core.SecurityContext"/>
+            is required but one has not been provided.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Util.NullSecurityContext.Instance">
+            <summary>
+            Singleton instance of <see cref="T:log4net.Util.NullSecurityContext"/>
+            </summary>
+            <remarks>
+            <para>
+            Singleton instance of <see cref="T:log4net.Util.NullSecurityContext"/>
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.NullSecurityContext.#ctor">
+            <summary>
+            Private constructor
+            </summary>
+            <remarks>
+            <para>
+            Private constructor for singleton pattern.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.NullSecurityContext.Impersonate(System.Object)">
+            <summary>
+            Impersonate this SecurityContext
+            </summary>
+            <param name="state">State supplied by the caller</param>
+            <returns><c>null</c></returns>
+            <remarks>
+            <para>
+            No impersonation is done and <c>null</c> is always returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.OnlyOnceErrorHandler">
+            <summary>
+            Implements log4net's default error handling policy which consists 
+            of emitting a message for the first error in an appender and 
+            ignoring all subsequent errors.
+            </summary>
+            <remarks>
+            <para>
+            The error message is printed on the standard error output stream.
+            </para>
+            <para>
+            This policy aims at protecting an otherwise working application
+            from being flooded with error messages when logging fails.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.OnlyOnceErrorHandler.#ctor">
+            <summary>
+            Default Constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.OnlyOnceErrorHandler"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.OnlyOnceErrorHandler.#ctor(System.String)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="prefix">The prefix to use for each message.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.OnlyOnceErrorHandler"/> class
+            with the specified prefix.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.OnlyOnceErrorHandler.Error(System.String,System.Exception,log4net.Core.ErrorCode)">
+            <summary>
+            Log an Error
+            </summary>
+            <param name="message">The error message.</param>
+            <param name="e">The exception.</param>
+            <param name="errorCode">The internal error code.</param>
+            <remarks>
+            <para>
+            Prints the message and the stack trace of the exception on the standard
+            error output stream.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.OnlyOnceErrorHandler.Error(System.String,System.Exception)">
+            <summary>
+            Log an Error
+            </summary>
+            <param name="message">The error message.</param>
+            <param name="e">The exception.</param>
+            <remarks>
+            <para>
+            Prints the message and the stack trace of the exception on the standard
+            error output stream.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.OnlyOnceErrorHandler.Error(System.String)">
+            <summary>
+            Log an error
+            </summary>
+            <param name="message">The error message.</param>
+            <remarks>
+            <para>
+            Print a the error message passed as parameter on the standard
+            error output stream.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.OnlyOnceErrorHandler.m_firstTime">
+            <summary>
+            Flag to indicate if it is the first error
+            </summary>
+        </member>
+        <member name="F:log4net.Util.OnlyOnceErrorHandler.m_prefix">
+            <summary>
+            String to prefix each message with
+            </summary>
+        </member>
+        <member name="P:log4net.Util.OnlyOnceErrorHandler.IsEnabled">
+            <summary>
+            Is error logging enabled
+            </summary>
+            <remarks>
+            <para>
+            Is error logging enabled. Logging is only enabled for the
+            first error delivered to the <see cref="T:log4net.Util.OnlyOnceErrorHandler"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.OptionConverter">
+            <summary>
+            A convenience class to convert property values to specific types.
+            </summary>
+            <remarks>
+            <para>
+            Utility functions for converting types and parsing values.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.OptionConverter.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Util.OptionConverter"/> class. 
+            </summary>
+            <remarks>
+            <para>
+            Uses a private access modifier to prevent instantiation of this class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.OptionConverter.ToBoolean(System.String,System.Boolean)">
+            <summary>
+            Converts a string to a <see cref="T:System.Boolean"/> value.
+            </summary>
+            <param name="argValue">String to convert.</param>
+            <param name="defaultValue">The default value.</param>
+            <returns>The <see cref="T:System.Boolean"/> value of <paramref name="argValue"/>.</returns>
+            <remarks>
+            <para>
+            If <paramref name="argValue"/> is "true", then <c>true</c> is returned. 
+            If <paramref name="argValue"/> is "false", then <c>false</c> is returned. 
+            Otherwise, <paramref name="defaultValue"/> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.OptionConverter.ToFileSize(System.String,System.Int64)">
+            <summary>
+            Parses a file size into a number.
+            </summary>
+            <param name="argValue">String to parse.</param>
+            <param name="defaultValue">The default value.</param>
+            <returns>The <see cref="T:System.Int64"/> value of <paramref name="argValue"/>.</returns>
+            <remarks>
+            <para>
+            Parses a file size of the form: number[KB|MB|GB] into a
+            long value. It is scaled with the appropriate multiplier.
+            </para>
+            <para>
+            <paramref name="defaultValue"/> is returned when <paramref name="argValue"/>
+            cannot be converted to a <see cref="T:System.Int64"/> value.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.OptionConverter.ConvertStringTo(System.Type,System.String)">
+            <summary>
+            Converts a string to an object.
+            </summary>
+            <param name="target">The target type to convert to.</param>
+            <param name="txt">The string to convert to an object.</param>
+            <returns>
+            The object converted from a string or <c>null</c> when the 
+            conversion failed.
+            </returns>
+            <remarks>
+            <para>
+            Converts a string to an object. Uses the converter registry to try
+            to convert the string value into the specified target type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.OptionConverter.CanConvertTypeTo(System.Type,System.Type)">
+            <summary>
+            Checks if there is an appropriate type conversion from the source type to the target type.
+            </summary>
+            <param name="sourceType">The type to convert from.</param>
+            <param name="targetType">The type to convert to.</param>
+            <returns><c>true</c> if there is a conversion from the source type to the target type.</returns>
+            <remarks>
+            Checks if there is an appropriate type conversion from the source type to the target type.
+            <para>
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.OptionConverter.ConvertTypeTo(System.Object,System.Type)">
+            <summary>
+            Converts an object to the target type.
+            </summary>
+            <param name="sourceInstance">The object to convert to the target type.</param>
+            <param name="targetType">The type to convert to.</param>
+            <returns>The converted object.</returns>
+            <remarks>
+            <para>
+            Converts an object to the target type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.OptionConverter.InstantiateByClassName(System.String,System.Type,System.Object)">
+            <summary>
+            Instantiates an object given a class name.
+            </summary>
+            <param name="className">The fully qualified class name of the object to instantiate.</param>
+            <param name="superClass">The class to which the new object should belong.</param>
+            <param name="defaultValue">The object to return in case of non-fulfillment.</param>
+            <returns>
+            An instance of the <paramref name="className"/> or <paramref name="defaultValue"/>
+            if the object could not be instantiated.
+            </returns>
+            <remarks>
+            <para>
+            Checks that the <paramref name="className"/> is a subclass of
+            <paramref name="superClass"/>. If that test fails or the object could
+            not be instantiated, then <paramref name="defaultValue"/> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.OptionConverter.SubstituteVariables(System.String,System.Collections.IDictionary)">
+            <summary>
+            Performs variable substitution in string <paramref name="val"/> from the 
+            values of keys found in <paramref name="props"/>.
+            </summary>
+            <param name="value">The string on which variable substitution is performed.</param>
+            <param name="props">The dictionary to use to lookup variables.</param>
+            <returns>The result of the substitutions.</returns>
+            <remarks>
+            <para>
+            The variable substitution delimiters are <b>${</b> and <b>}</b>.
+            </para>
+            <para>
+            For example, if props contains <c>key=value</c>, then the call
+            </para>
+            <para>
+            <code lang="C#">
+            string s = OptionConverter.SubstituteVariables("Value of key is ${key}.");
+            </code>
+            </para>
+            <para>
+            will set the variable <c>s</c> to "Value of key is value.".
+            </para>
+            <para>
+            If no value could be found for the specified key, then substitution 
+            defaults to an empty string.
+            </para>
+            <para>
+            For example, if system properties contains no value for the key
+            "nonExistentKey", then the call
+            </para>
+            <para>
+            <code lang="C#">
+            string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]");
+            </code>
+            </para>
+            <para>
+            will set <s>s</s> to "Value of nonExistentKey is []".	 
+            </para>
+            <para>
+            An Exception is thrown if <paramref name="value"/> contains a start 
+            delimiter "${" which is not balanced by a stop delimiter "}". 
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.OptionConverter.ParseEnum(System.Type,System.String,System.Boolean)">
+            <summary>
+            Converts the string representation of the name or numeric value of one or 
+            more enumerated constants to an equivalent enumerated object.
+            </summary>
+            <param name="enumType">The type to convert to.</param>
+            <param name="value">The enum string value.</param>
+            <param name="ignoreCase">If <c>true</c>, ignore case; otherwise, regard case.</param>
+            <returns>An object of type <paramref name="enumType" /> whose value is represented by <paramref name="value" />.</returns>
+        </member>
+        <member name="T:log4net.Util.PatternParser">
+            <summary>
+            Most of the work of the <see cref="T:log4net.Layout.PatternLayout"/> class
+            is delegated to the PatternParser class.
+            </summary>
+            <remarks>
+            <para>
+            The <c>PatternParser</c> processes a pattern string and
+            returns a chain of <see cref="T:log4net.Util.PatternConverter"/> objects.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.PatternParser.#ctor(System.String)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="pattern">The pattern to parse.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.PatternParser"/> class 
+            with the specified pattern string.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternParser.Parse">
+            <summary>
+            Parses the pattern into a chain of pattern converters.
+            </summary>
+            <returns>The head of a chain of pattern converters.</returns>
+            <remarks>
+            <para>
+            Parses the pattern into a chain of pattern converters.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternParser.BuildCache">
+            <summary>
+            Build the unified cache of converters from the static and instance maps
+            </summary>
+            <returns>the list of all the converter names</returns>
+            <remarks>
+            <para>
+            Build the unified cache of converters from the static and instance maps
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternParser.ParseInternal(System.String,System.String[])">
+            <summary>
+            Internal method to parse the specified pattern to find specified matches
+            </summary>
+            <param name="pattern">the pattern to parse</param>
+            <param name="matches">the converter names to match in the pattern</param>
+            <remarks>
+            <para>
+            The matches param must be sorted such that longer strings come before shorter ones.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternParser.ProcessLiteral(System.String)">
+            <summary>
+            Process a parsed literal
+            </summary>
+            <param name="text">the literal text</param>
+        </member>
+        <member name="M:log4net.Util.PatternParser.ProcessConverter(System.String,System.String,log4net.Util.FormattingInfo)">
+            <summary>
+            Process a parsed converter pattern
+            </summary>
+            <param name="converterName">the name of the converter</param>
+            <param name="option">the optional option for the converter</param>
+            <param name="formattingInfo">the formatting info for the converter</param>
+        </member>
+        <member name="M:log4net.Util.PatternParser.AddConverter(log4net.Util.PatternConverter)">
+            <summary>
+            Resets the internal state of the parser and adds the specified pattern converter 
+            to the chain.
+            </summary>
+            <param name="pc">The pattern converter to add.</param>
+        </member>
+        <member name="F:log4net.Util.PatternParser.m_head">
+            <summary>
+            The first pattern converter in the chain
+            </summary>
+        </member>
+        <member name="F:log4net.Util.PatternParser.m_tail">
+            <summary>
+             the last pattern converter in the chain
+            </summary>
+        </member>
+        <member name="F:log4net.Util.PatternParser.m_pattern">
+            <summary>
+            The pattern
+            </summary>
+        </member>
+        <member name="F:log4net.Util.PatternParser.m_patternConverters">
+            <summary>
+            Internal map of converter identifiers to converter types
+            </summary>
+            <remarks>
+            <para>
+            This map overrides the static s_globalRulesRegistry map.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.PatternParser.PatternConverters">
+            <summary>
+            Get the converter registry used by this parser
+            </summary>
+            <value>
+            The converter registry used by this parser
+            </value>
+            <remarks>
+            <para>
+            Get the converter registry used by this parser
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PatternParser.StringLengthComparer">
+            <summary>
+            Sort strings by length
+            </summary>
+            <remarks>
+            <para>
+            <see cref="T:System.Collections.IComparer"/> that orders strings by string length.
+            The longest strings are placed first
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PatternString">
+            <summary>
+            This class implements a patterned string.
+            </summary>
+            <remarks>
+            <para>
+            This string has embedded patterns that are resolved and expanded
+            when the string is formatted.
+            </para>
+            <para>
+            This class functions similarly to the <see cref="T:log4net.Layout.PatternLayout"/>
+            in that it accepts a pattern and renders it to a string. Unlike the 
+            <see cref="T:log4net.Layout.PatternLayout"/> however the <c>PatternString</c>
+            does not render the properties of a specific <see cref="T:log4net.Core.LoggingEvent"/> but
+            of the process in general.
+            </para>
+            <para>
+            The recognized conversion pattern names are:
+            </para>
+            <list type="table">
+                <listheader>
+                    <term>Conversion Pattern Name</term>
+                    <description>Effect</description>
+                </listheader>
+                <item>
+                    <term>appdomain</term>
+                    <description>
+                        <para>
+                        Used to output the friendly name of the current AppDomain.
+                        </para>
+                    </description>
+                </item>
+                <item>
+                    <term>date</term>
+                    <description>
+            			<para>
+            			Used to output the date of the logging event in the local time zone. 
+            			To output the date in universal time use the <c>%utcdate</c> pattern.
+            			The date conversion 
+            			specifier may be followed by a <i>date format specifier</i> enclosed 
+            			between braces. For example, <b>%date{HH:mm:ss,fff}</b> or
+            			<b>%date{dd MMM yyyy HH:mm:ss,fff}</b>.  If no date format specifier is 
+            			given then ISO8601 format is
+            			assumed (<see cref="T:log4net.DateFormatter.Iso8601DateFormatter"/>).
+            			</para>
+            			<para>
+            			The date format specifier admits the same syntax as the
+            			time pattern string of the <see cref="M:System.DateTime.ToString(System.String)"/>.
+            			</para>
+            			<para>
+            			For better results it is recommended to use the log4net date
+            			formatters. These can be specified using one of the strings
+            			"ABSOLUTE", "DATE" and "ISO8601" for specifying 
+            			<see cref="T:log4net.DateFormatter.AbsoluteTimeDateFormatter"/>, 
+            			<see cref="T:log4net.DateFormatter.DateTimeDateFormatter"/> and respectively 
+            			<see cref="T:log4net.DateFormatter.Iso8601DateFormatter"/>. For example, 
+            			<b>%date{ISO8601}</b> or <b>%date{ABSOLUTE}</b>.
+            			</para>
+            			<para>
+            			These dedicated date formatters perform significantly
+            			better than <see cref="M:System.DateTime.ToString(System.String)"/>.
+            			</para>
+                    </description>
+                </item>
+                <item>
+                    <term>env</term>
+                    <description>
+                        <para>
+            			Used to output the a specific environment variable. The key to 
+            			lookup must be specified within braces and directly following the
+            			pattern specifier, e.g. <b>%env{COMPUTERNAME}</b> would include the value
+            			of the <c>COMPUTERNAME</c> environment variable.
+                        </para>
+                        <para>
+                        The <c>env</c> pattern is not supported on the .NET Compact Framework.
+                        </para>
+                    </description>
+                </item>
+                <item>
+                    <term>identity</term>
+                    <description>
+            			<para>
+            			Used to output the user name for the currently active user
+            			(Principal.Identity.Name).
+            			</para>
+                    </description>
+                </item>
+                <item>
+                    <term>newline</term>
+                    <description>
+            			<para>
+            			Outputs the platform dependent line separator character or
+            			characters.
+            			</para>
+            			<para>
+            			This conversion pattern name offers the same performance as using 
+            			non-portable line separator strings such as	"\n", or "\r\n". 
+            			Thus, it is the preferred way of specifying a line separator.
+            			</para> 
+                    </description>
+                </item>
+                <item>
+                    <term>processid</term>
+                    <description>
+                        <para>
+            			Used to output the system process ID for the current process.
+                        </para>
+                    </description>
+                </item>
+                <item>
+                    <term>property</term>
+                    <description>
+            			<para>
+            			Used to output a specific context property. The key to 
+            			lookup must be specified within braces and directly following the
+            			pattern specifier, e.g. <b>%property{user}</b> would include the value
+            			from the property that is keyed by the string 'user'. Each property value
+            			that is to be included in the log must be specified separately.
+            			Properties are stored in logging contexts. By default 
+            			the <c>log4net:HostName</c> property is set to the name of machine on 
+            			which the event was originally logged.
+            			</para>
+            			<para>
+            			If no key is specified, e.g. <b>%property</b> then all the keys and their
+            			values are printed in a comma separated list.
+            			</para>
+            			<para>
+            			The properties of an event are combined from a number of different
+            			contexts. These are listed below in the order in which they are searched.
+            			</para>
+            			<list type="definition">
+            				<item>
+            					<term>the thread properties</term>
+            					<description>
+            					The <see cref="P:log4net.ThreadContext.Properties"/> that are set on the current
+            					thread. These properties are shared by all events logged on this thread.
+            					</description>
+            				</item>
+            				<item>
+            					<term>the global properties</term>
+            					<description>
+            					The <see cref="P:log4net.GlobalContext.Properties"/> that are set globally. These 
+            					properties are shared by all the threads in the AppDomain.
+            					</description>
+            				</item>
+            			</list>
+                    </description>
+                </item>
+                <item>
+                    <term>random</term>
+                    <description>
+                        <para>
+                        Used to output a random string of characters. The string is made up of
+                        uppercase letters and numbers. By default the string is 4 characters long.
+                        The length of the string can be specified within braces directly following the
+            			pattern specifier, e.g. <b>%random{8}</b> would output an 8 character string.
+                        </para>
+                    </description>
+                </item>
+                <item>
+                    <term>username</term>
+                    <description>
+            			<para>
+            			Used to output the WindowsIdentity for the currently
+            			active user.
+            			</para>
+                    </description>
+                </item>
+                <item>
+                    <term>utcdate</term>
+                    <description>
+            			<para>
+            			Used to output the date of the logging event in universal time. 
+            			The date conversion 
+            			specifier may be followed by a <i>date format specifier</i> enclosed 
+            			between braces. For example, <b>%utcdate{HH:mm:ss,fff}</b> or
+            			<b>%utcdate{dd MMM yyyy HH:mm:ss,fff}</b>.  If no date format specifier is 
+            			given then ISO8601 format is
+            			assumed (<see cref="T:log4net.DateFormatter.Iso8601DateFormatter"/>).
+            			</para>
+            			<para>
+            			The date format specifier admits the same syntax as the
+            			time pattern string of the <see cref="M:System.DateTime.ToString(System.String)"/>.
+            			</para>
+            			<para>
+            			For better results it is recommended to use the log4net date
+            			formatters. These can be specified using one of the strings
+            			"ABSOLUTE", "DATE" and "ISO8601" for specifying 
+            			<see cref="T:log4net.DateFormatter.AbsoluteTimeDateFormatter"/>, 
+            			<see cref="T:log4net.DateFormatter.DateTimeDateFormatter"/> and respectively 
+            			<see cref="T:log4net.DateFormatter.Iso8601DateFormatter"/>. For example, 
+            			<b>%utcdate{ISO8601}</b> or <b>%utcdate{ABSOLUTE}</b>.
+            			</para>
+            			<para>
+            			These dedicated date formatters perform significantly
+            			better than <see cref="M:System.DateTime.ToString(System.String)"/>.
+            			</para>
+                    </description>
+                </item>
+            	<item>
+            		<term>%</term>
+            		<description>
+            			<para>
+            			The sequence %% outputs a single percent sign.
+            			</para>
+            		</description>
+            	</item>
+            </list>
+            <para>
+            Additional pattern converters may be registered with a specific <see cref="T:log4net.Util.PatternString"/>
+            instance using <see cref="M:log4net.Util.PatternString.AddConverter(log4net.Util.PatternString.ConverterInfo)"/> or
+            <see cref="M:log4net.Util.PatternString.AddConverter(System.String,System.Type)"/>.
+            </para>
+            <para>
+            See the <see cref="T:log4net.Layout.PatternLayout"/> for details on the 
+            <i>format modifiers</i> supported by the patterns.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Util.PatternString.s_globalRulesRegistry">
+            <summary>
+            Internal map of converter identifiers to converter types.
+            </summary>
+        </member>
+        <member name="F:log4net.Util.PatternString.m_pattern">
+            <summary>
+            the pattern
+            </summary>
+        </member>
+        <member name="F:log4net.Util.PatternString.m_head">
+            <summary>
+            the head of the pattern converter chain
+            </summary>
+        </member>
+        <member name="F:log4net.Util.PatternString.m_instanceRulesRegistry">
+            <summary>
+            patterns defined on this PatternString only
+            </summary>
+        </member>
+        <member name="M:log4net.Util.PatternString.#cctor">
+            <summary>
+            Initialize the global registry
+            </summary>
+        </member>
+        <member name="M:log4net.Util.PatternString.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Initialize a new instance of <see cref="T:log4net.Util.PatternString"/>
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternString.#ctor(System.String)">
+            <summary>
+            Constructs a PatternString
+            </summary>
+            <param name="pattern">The pattern to use with this PatternString</param>
+            <remarks>
+            <para>
+            Initialize a new instance of <see cref="T:log4net.Util.PatternString"/> with the pattern specified.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternString.ActivateOptions">
+            <summary>
+            Initialize object options
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Util.PatternString.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Util.PatternString.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Util.PatternString.ActivateOptions"/> must be called again.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternString.CreatePatternParser(System.String)">
+            <summary>
+            Create the <see cref="T:log4net.Util.PatternParser"/> used to parse the pattern
+            </summary>
+            <param name="pattern">the pattern to parse</param>
+            <returns>The <see cref="T:log4net.Util.PatternParser"/></returns>
+            <remarks>
+            <para>
+            Returns PatternParser used to parse the conversion string. Subclasses
+            may override this to return a subclass of PatternParser which recognize
+            custom conversion pattern name.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternString.Format(System.IO.TextWriter)">
+            <summary>
+            Produces a formatted string as specified by the conversion pattern.
+            </summary>
+            <param name="writer">The TextWriter to write the formatted event to</param>
+            <remarks>
+            <para>
+            Format the pattern to the <paramref name="writer"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternString.Format">
+            <summary>
+            Format the pattern as a string
+            </summary>
+            <returns>the pattern formatted as a string</returns>
+            <remarks>
+            <para>
+            Format the pattern to a string.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternString.AddConverter(log4net.Util.PatternString.ConverterInfo)">
+            <summary>
+            Add a converter to this PatternString
+            </summary>
+            <param name="converterInfo">the converter info</param>
+            <remarks>
+            <para>
+            This version of the method is used by the configurator.
+            Programmatic users should use the alternative <see cref="M:log4net.Util.PatternString.AddConverter(System.String,System.Type)"/> method.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternString.AddConverter(System.String,System.Type)">
+            <summary>
+            Add a converter to this PatternString
+            </summary>
+            <param name="name">the name of the conversion pattern for this converter</param>
+            <param name="type">the type of the converter</param>
+            <remarks>
+            <para>
+            Add a converter to this PatternString
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.PatternString.ConversionPattern">
+            <summary>
+            Gets or sets the pattern formatting string
+            </summary>
+            <value>
+            The pattern formatting string
+            </value>
+            <remarks>
+            <para>
+            The <b>ConversionPattern</b> option. This is the string which
+            controls formatting and consists of a mix of literal content and
+            conversion specifiers.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PatternString.ConverterInfo">
+            <summary>
+            Wrapper class used to map converter names to converter types
+            </summary>
+            <remarks>
+            <para>
+            Wrapper class used to map converter names to converter types
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PatternString.ConverterInfo.#ctor">
+            <summary>
+            default constructor
+            </summary>
+        </member>
+        <member name="P:log4net.Util.PatternString.ConverterInfo.Name">
+            <summary>
+            Gets or sets the name of the conversion pattern
+            </summary>
+            <value>
+            The name of the conversion pattern
+            </value>
+            <remarks>
+            <para>
+            Gets or sets the name of the conversion pattern
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.PatternString.ConverterInfo.Type">
+            <summary>
+            Gets or sets the type of the converter
+            </summary>
+            <value>
+            The type of the converter
+            </value>
+            <remarks>
+            <para>
+            Gets or sets the type of the converter
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.PropertiesDictionary">
+            <summary>
+            String keyed object map.
+            </summary>
+            <remarks>
+            <para>
+            While this collection is serializable only member 
+            objects that are serializable will
+            be serialized along with this collection.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="T:log4net.Util.ReadOnlyPropertiesDictionary">
+            <summary>
+            String keyed object map that is read only.
+            </summary>
+            <remarks>
+            <para>
+            This collection is readonly and cannot be modified.
+            </para>
+            <para>
+            While this collection is serializable only member 
+            objects that are serializable will
+            be serialized along with this collection.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="F:log4net.Util.ReadOnlyPropertiesDictionary.m_hashtable">
+            <summary>
+            The Hashtable used to store the properties data
+            </summary>
+        </member>
+        <member name="M:log4net.Util.ReadOnlyPropertiesDictionary.#ctor">
+            <summary>
+            Constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.ReadOnlyPropertiesDictionary"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ReadOnlyPropertiesDictionary.#ctor(log4net.Util.ReadOnlyPropertiesDictionary)">
+            <summary>
+            Copy Constructor
+            </summary>
+            <param name="propertiesDictionary">properties to copy</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.ReadOnlyPropertiesDictionary"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ReadOnlyPropertiesDictionary.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Deserialization constructor
+            </summary>
+            <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> that holds the serialized object data.</param>
+            <param name="context">The <see cref="T:System.Runtime.Serialization.StreamingContext"/> that contains contextual information about the source or destination.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.ReadOnlyPropertiesDictionary"/> class 
+            with serialized data.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ReadOnlyPropertiesDictionary.GetKeys">
+            <summary>
+            Gets the key names.
+            </summary>
+            <returns>An array of all the keys.</returns>
+            <remarks>
+            <para>
+            Gets the key names.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ReadOnlyPropertiesDictionary.Contains(System.String)">
+            <summary>
+            Test if the dictionary contains a specified key
+            </summary>
+            <param name="key">the key to look for</param>
+            <returns>true if the dictionary contains the specified key</returns>
+            <remarks>
+            <para>
+            Test if the dictionary contains a specified key
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ReadOnlyPropertiesDictionary.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serializes this object into the <see cref="T:System.Runtime.Serialization.SerializationInfo"/> provided.
+            </summary>
+            <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> to populate with data.</param>
+            <param name="context">The destination for this serialization.</param>
+            <remarks>
+            <para>
+            Serializes this object into the <see cref="T:System.Runtime.Serialization.SerializationInfo"/> provided.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ReadOnlyPropertiesDictionary.System#Collections#IDictionary#GetEnumerator">
+            <summary>
+            See <see cref="M:System.Collections.IDictionary.GetEnumerator"/>
+            </summary>
+        </member>
+        <member name="M:log4net.Util.ReadOnlyPropertiesDictionary.System#Collections#IDictionary#Remove(System.Object)">
+            <summary>
+            See <see cref="M:System.Collections.IDictionary.Remove(System.Object)"/>
+            </summary>
+            <param name="key"></param>
+        </member>
+        <member name="M:log4net.Util.ReadOnlyPropertiesDictionary.System#Collections#IDictionary#Contains(System.Object)">
+            <summary>
+            See <see cref="M:System.Collections.IDictionary.Contains(System.Object)"/>
+            </summary>
+            <param name="key"></param>
+            <returns></returns>
+        </member>
+        <member name="M:log4net.Util.ReadOnlyPropertiesDictionary.Clear">
+            <summary>
+            Remove all properties from the properties collection
+            </summary>
+        </member>
+        <member name="M:log4net.Util.ReadOnlyPropertiesDictionary.System#Collections#IDictionary#Add(System.Object,System.Object)">
+            <summary>
+            See <see cref="M:System.Collections.IDictionary.Add(System.Object,System.Object)"/>
+            </summary>
+            <param name="key"></param>
+            <param name="value"></param>
+        </member>
+        <member name="M:log4net.Util.ReadOnlyPropertiesDictionary.System#Collections#ICollection#CopyTo(System.Array,System.Int32)">
+            <summary>
+            See <see cref="M:System.Collections.ICollection.CopyTo(System.Array,System.Int32)"/>
+            </summary>
+            <param name="array"></param>
+            <param name="index"></param>
+        </member>
+        <member name="M:log4net.Util.ReadOnlyPropertiesDictionary.System#Collections#IEnumerable#GetEnumerator">
+            <summary>
+            See <see cref="M:System.Collections.IEnumerable.GetEnumerator"/>
+            </summary>
+        </member>
+        <member name="P:log4net.Util.ReadOnlyPropertiesDictionary.Item(System.String)">
+            <summary>
+            Gets or sets the value of the  property with the specified key.
+            </summary>
+            <value>
+            The value of the property with the specified key.
+            </value>
+            <param name="key">The key of the property to get or set.</param>
+            <remarks>
+            <para>
+            The property value will only be serialized if it is serializable.
+            If it cannot be serialized it will be silently ignored if
+            a serialization operation is performed.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.ReadOnlyPropertiesDictionary.InnerHashtable">
+            <summary>
+            The hashtable used to store the properties
+            </summary>
+            <value>
+            The internal collection used to store the properties
+            </value>
+            <remarks>
+            <para>
+            The hashtable used to store the properties
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.ReadOnlyPropertiesDictionary.System#Collections#IDictionary#IsReadOnly">
+            <summary>
+            See <see cref="P:System.Collections.IDictionary.IsReadOnly"/>
+            </summary>
+        </member>
+        <member name="P:log4net.Util.ReadOnlyPropertiesDictionary.System#Collections#IDictionary#Item(System.Object)">
+            <summary>
+            See <see cref="P:System.Collections.IDictionary.Item(System.Object)"/>
+            </summary>
+        </member>
+        <member name="P:log4net.Util.ReadOnlyPropertiesDictionary.System#Collections#IDictionary#Values">
+            <summary>
+            See <see cref="P:System.Collections.IDictionary.Values"/>
+            </summary>
+        </member>
+        <member name="P:log4net.Util.ReadOnlyPropertiesDictionary.System#Collections#IDictionary#Keys">
+            <summary>
+            See <see cref="P:System.Collections.IDictionary.Keys"/>
+            </summary>
+        </member>
+        <member name="P:log4net.Util.ReadOnlyPropertiesDictionary.System#Collections#IDictionary#IsFixedSize">
+            <summary>
+            See <see cref="P:System.Collections.IDictionary.IsFixedSize"/>
+            </summary>
+        </member>
+        <member name="P:log4net.Util.ReadOnlyPropertiesDictionary.System#Collections#ICollection#IsSynchronized">
+            <summary>
+            See <see cref="P:System.Collections.ICollection.IsSynchronized"/>
+            </summary>
+        </member>
+        <member name="P:log4net.Util.ReadOnlyPropertiesDictionary.Count">
+            <summary>
+            The number of properties in this collection
+            </summary>
+        </member>
+        <member name="P:log4net.Util.ReadOnlyPropertiesDictionary.System#Collections#ICollection#SyncRoot">
+            <summary>
+            See <see cref="P:System.Collections.ICollection.SyncRoot"/>
+            </summary>
+        </member>
+        <member name="M:log4net.Util.PropertiesDictionary.#ctor">
+            <summary>
+            Constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.PropertiesDictionary"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PropertiesDictionary.#ctor(log4net.Util.ReadOnlyPropertiesDictionary)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="propertiesDictionary">properties to copy</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.PropertiesDictionary"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PropertiesDictionary.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Util.PropertiesDictionary"/> class 
+            with serialized data.
+            </summary>
+            <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> that holds the serialized object data.</param>
+            <param name="context">The <see cref="T:System.Runtime.Serialization.StreamingContext"/> that contains contextual information about the source or destination.</param>
+            <remarks>
+            <para>
+            Because this class is sealed the serialization constructor is private.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PropertiesDictionary.Remove(System.String)">
+            <summary>
+            Remove the entry with the specified key from this dictionary
+            </summary>
+            <param name="key">the key for the entry to remove</param>
+            <remarks>
+            <para>
+            Remove the entry with the specified key from this dictionary
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PropertiesDictionary.System#Collections#IDictionary#GetEnumerator">
+            <summary>
+            See <see cref="M:System.Collections.IDictionary.GetEnumerator"/>
+            </summary>
+            <returns>an enumerator</returns>
+            <remarks>
+            <para>
+            Returns a <see cref="T:System.Collections.IDictionaryEnumerator"/> over the contest of this collection.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PropertiesDictionary.System#Collections#IDictionary#Remove(System.Object)">
+            <summary>
+            See <see cref="M:System.Collections.IDictionary.Remove(System.Object)"/>
+            </summary>
+            <param name="key">the key to remove</param>
+            <remarks>
+            <para>
+            Remove the entry with the specified key from this dictionary
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PropertiesDictionary.System#Collections#IDictionary#Contains(System.Object)">
+            <summary>
+            See <see cref="M:System.Collections.IDictionary.Contains(System.Object)"/>
+            </summary>
+            <param name="key">the key to lookup in the collection</param>
+            <returns><c>true</c> if the collection contains the specified key</returns>
+            <remarks>
+            <para>
+            Test if this collection contains a specified key.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PropertiesDictionary.Clear">
+            <summary>
+            Remove all properties from the properties collection
+            </summary>
+            <remarks>
+            <para>
+            Remove all properties from the properties collection
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.PropertiesDictionary.System#Collections#IDictionary#Add(System.Object,System.Object)">
+            <summary>
+            See <see cref="M:System.Collections.IDictionary.Add(System.Object,System.Object)"/>
+            </summary>
+            <param name="key">the key</param>
+            <param name="value">the value to store for the key</param>
+            <remarks>
+            <para>
+            Store a value for the specified <see cref="T:System.String"/> <paramref name="key"/>.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentException">Thrown if the <paramref name="key"/> is not a string</exception>
+        </member>
+        <member name="M:log4net.Util.PropertiesDictionary.System#Collections#ICollection#CopyTo(System.Array,System.Int32)">
+            <summary>
+            See <see cref="M:System.Collections.ICollection.CopyTo(System.Array,System.Int32)"/>
+            </summary>
+            <param name="array"></param>
+            <param name="index"></param>
+        </member>
+        <member name="M:log4net.Util.PropertiesDictionary.System#Collections#IEnumerable#GetEnumerator">
+            <summary>
+            See <see cref="M:System.Collections.IEnumerable.GetEnumerator"/>
+            </summary>
+        </member>
+        <member name="P:log4net.Util.PropertiesDictionary.Item(System.String)">
+            <summary>
+            Gets or sets the value of the  property with the specified key.
+            </summary>
+            <value>
+            The value of the property with the specified key.
+            </value>
+            <param name="key">The key of the property to get or set.</param>
+            <remarks>
+            <para>
+            The property value will only be serialized if it is serializable.
+            If it cannot be serialized it will be silently ignored if
+            a serialization operation is performed.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.PropertiesDictionary.System#Collections#IDictionary#IsReadOnly">
+            <summary>
+            See <see cref="P:System.Collections.IDictionary.IsReadOnly"/>
+            </summary>
+            <value>
+            <c>false</c>
+            </value>
+            <remarks>
+            <para>
+            This collection is modifiable. This property always
+            returns <c>false</c>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.PropertiesDictionary.System#Collections#IDictionary#Item(System.Object)">
+            <summary>
+            See <see cref="P:System.Collections.IDictionary.Item(System.Object)"/>
+            </summary>
+            <value>
+            The value for the key specified.
+            </value>
+            <remarks>
+            <para>
+            Get or set a value for the specified <see cref="T:System.String"/> <paramref name="key"/>.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentException">Thrown if the <paramref name="key"/> is not a string</exception>
+        </member>
+        <member name="P:log4net.Util.PropertiesDictionary.System#Collections#IDictionary#Values">
+            <summary>
+            See <see cref="P:System.Collections.IDictionary.Values"/>
+            </summary>
+        </member>
+        <member name="P:log4net.Util.PropertiesDictionary.System#Collections#IDictionary#Keys">
+            <summary>
+            See <see cref="P:System.Collections.IDictionary.Keys"/>
+            </summary>
+        </member>
+        <member name="P:log4net.Util.PropertiesDictionary.System#Collections#IDictionary#IsFixedSize">
+            <summary>
+            See <see cref="P:System.Collections.IDictionary.IsFixedSize"/>
+            </summary>
+        </member>
+        <member name="P:log4net.Util.PropertiesDictionary.System#Collections#ICollection#IsSynchronized">
+            <summary>
+            See <see cref="P:System.Collections.ICollection.IsSynchronized"/>
+            </summary>
+        </member>
+        <member name="P:log4net.Util.PropertiesDictionary.System#Collections#ICollection#SyncRoot">
+            <summary>
+            See <see cref="P:System.Collections.ICollection.SyncRoot"/>
+            </summary>
+        </member>
+        <member name="T:log4net.Util.ProtectCloseTextWriter">
+            <summary>
+            A <see cref="T:System.IO.TextWriter"/> that ignores the <see cref="M:log4net.Util.ProtectCloseTextWriter.Close"/> message
+            </summary>
+            <remarks>
+            <para>
+            This writer is used in special cases where it is necessary 
+            to protect a writer from being closed by a client.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.ProtectCloseTextWriter.#ctor(System.IO.TextWriter)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="writer">the writer to actually write to</param>
+            <remarks>
+            <para>
+            Create a new ProtectCloseTextWriter using a writer
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ProtectCloseTextWriter.Attach(System.IO.TextWriter)">
+            <summary>
+            Attach this instance to a different underlying <see cref="T:System.IO.TextWriter"/>
+            </summary>
+            <param name="writer">the writer to attach to</param>
+            <remarks>
+            <para>
+            Attach this instance to a different underlying <see cref="T:System.IO.TextWriter"/>
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ProtectCloseTextWriter.Close">
+            <summary>
+            Does not close the underlying output writer.
+            </summary>
+            <remarks>
+            <para>
+            Does not close the underlying output writer.
+            This method does nothing.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.ReaderWriterLock">
+            <summary>
+            Defines a lock that supports single writers and multiple readers
+            </summary>
+            <remarks>
+            <para>
+            <c>ReaderWriterLock</c> is used to synchronize access to a resource. 
+            At any given time, it allows either concurrent read access for 
+            multiple threads, or write access for a single thread. In a 
+            situation where a resource is changed infrequently, a 
+            <c>ReaderWriterLock</c> provides better throughput than a simple 
+            one-at-a-time lock, such as <see cref="T:System.Threading.Monitor"/>.
+            </para>
+            <para>
+            If a platform does not support a <c>System.Threading.ReaderWriterLock</c> 
+            implementation then all readers and writers are serialized. Therefore 
+            the caller must not rely on multiple simultaneous readers.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.ReaderWriterLock.#ctor">
+            <summary>
+            Constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.ReaderWriterLock"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ReaderWriterLock.AcquireReaderLock">
+            <summary>
+            Acquires a reader lock
+            </summary>
+            <remarks>
+            <para>
+            <see cref="M:log4net.Util.ReaderWriterLock.AcquireReaderLock"/> blocks if a different thread has the writer 
+            lock, or if at least one thread is waiting for the writer lock.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ReaderWriterLock.ReleaseReaderLock">
+            <summary>
+            Decrements the lock count
+            </summary>
+            <remarks>
+            <para>
+            <see cref="M:log4net.Util.ReaderWriterLock.ReleaseReaderLock"/> decrements the lock count. When the count 
+            reaches zero, the lock is released.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ReaderWriterLock.AcquireWriterLock">
+            <summary>
+            Acquires the writer lock
+            </summary>
+            <remarks>
+            <para>
+            This method blocks if another thread has a reader lock or writer lock.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ReaderWriterLock.ReleaseWriterLock">
+            <summary>
+            Decrements the lock count on the writer lock
+            </summary>
+            <remarks>
+            <para>
+            ReleaseWriterLock decrements the writer lock count. 
+            When the count reaches zero, the writer lock is released.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.ReusableStringWriter">
+            <summary>
+            A <see cref="T:System.IO.StringWriter"/> that can be <see cref="M:log4net.Util.ReusableStringWriter.Reset(System.Int32,System.Int32)"/> and reused
+            </summary>
+            <remarks>
+            <para>
+            A <see cref="T:System.IO.StringWriter"/> that can be <see cref="M:log4net.Util.ReusableStringWriter.Reset(System.Int32,System.Int32)"/> and reused.
+            This uses a single buffer for string operations.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.ReusableStringWriter.#ctor(System.IFormatProvider)">
+            <summary>
+            Create an instance of <see cref="T:log4net.Util.ReusableStringWriter"/>
+            </summary>
+            <param name="formatProvider">the format provider to use</param>
+            <remarks>
+            <para>
+            Create an instance of <see cref="T:log4net.Util.ReusableStringWriter"/>
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ReusableStringWriter.Dispose(System.Boolean)">
+            <summary>
+            Override Dispose to prevent closing of writer
+            </summary>
+            <param name="disposing">flag</param>
+            <remarks>
+            <para>
+            Override Dispose to prevent closing of writer
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ReusableStringWriter.Reset(System.Int32,System.Int32)">
+            <summary>
+            Reset this string writer so that it can be reused.
+            </summary>
+            <param name="maxCapacity">the maximum buffer capacity before it is trimmed</param>
+            <param name="defaultSize">the default size to make the buffer</param>
+            <remarks>
+            <para>
+            Reset this string writer so that it can be reused.
+            The internal buffers are cleared and reset.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.SystemInfo">
+            <summary>
+            Utility class for system specific information.
+            </summary>
+            <remarks>
+            <para>
+            Utility class of static methods for system specific information.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+            <author>Alexey Solofnenko</author>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.#ctor">
+            <summary>
+            Private constructor to prevent instances.
+            </summary>
+            <remarks>
+            <para>
+            Only static methods are exposed from this type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.#cctor">
+            <summary>
+            Initialize default values for private static fields.
+            </summary>
+            <remarks>
+            <para>
+            Only static methods are exposed from this type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.AssemblyLocationInfo(System.Reflection.Assembly)">
+            <summary>
+            Gets the assembly location path for the specified assembly.
+            </summary>
+            <param name="myAssembly">The assembly to get the location for.</param>
+            <returns>The location of the assembly.</returns>
+            <remarks>
+            <para>
+            This method does not guarantee to return the correct path
+            to the assembly. If only tries to give an indication as to
+            where the assembly was loaded from.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.AssemblyQualifiedName(System.Type)">
+            <summary>
+            Gets the fully qualified name of the <see cref="T:System.Type"/>, including 
+            the name of the assembly from which the <see cref="T:System.Type"/> was 
+            loaded.
+            </summary>
+            <param name="type">The <see cref="T:System.Type"/> to get the fully qualified name for.</param>
+            <returns>The fully qualified name for the <see cref="T:System.Type"/>.</returns>
+            <remarks>
+            <para>
+            This is equivalent to the <c>Type.AssemblyQualifiedName</c> property,
+            but this method works on the .NET Compact Framework 1.0 as well as
+            the full .NET runtime.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.AssemblyShortName(System.Reflection.Assembly)">
+            <summary>
+            Gets the short name of the <see cref="T:System.Reflection.Assembly"/>.
+            </summary>
+            <param name="myAssembly">The <see cref="T:System.Reflection.Assembly"/> to get the name for.</param>
+            <returns>The short name of the <see cref="T:System.Reflection.Assembly"/>.</returns>
+            <remarks>
+            <para>
+            The short name of the assembly is the <see cref="P:System.Reflection.Assembly.FullName"/> 
+            without the version, culture, or public key. i.e. it is just the 
+            assembly's file name without the extension.
+            </para>
+            <para>
+            Use this rather than <c>Assembly.GetName().Name</c> because that
+            is not available on the Compact Framework.
+            </para>
+            <para>
+            Because of a FileIOPermission security demand we cannot do
+            the obvious Assembly.GetName().Name. We are allowed to get
+            the <see cref="P:System.Reflection.Assembly.FullName"/> of the assembly so we 
+            start from there and strip out just the assembly name.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.AssemblyFileName(System.Reflection.Assembly)">
+            <summary>
+            Gets the file name portion of the <see cref="T:System.Reflection.Assembly"/>, including the extension.
+            </summary>
+            <param name="myAssembly">The <see cref="T:System.Reflection.Assembly"/> to get the file name for.</param>
+            <returns>The file name of the assembly.</returns>
+            <remarks>
+            <para>
+            Gets the file name portion of the <see cref="T:System.Reflection.Assembly"/>, including the extension.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.GetTypeFromString(System.Type,System.String,System.Boolean,System.Boolean)">
+            <summary>
+            Loads the type specified in the type string.
+            </summary>
+            <param name="relativeType">A sibling type to use to load the type.</param>
+            <param name="typeName">The name of the type to load.</param>
+            <param name="throwOnError">Flag set to <c>true</c> to throw an exception if the type cannot be loaded.</param>
+            <param name="ignoreCase"><c>true</c> to ignore the case of the type name; otherwise, <c>false</c></param>
+            <returns>The type loaded or <c>null</c> if it could not be loaded.</returns>
+            <remarks>
+            <para>
+            If the type name is fully qualified, i.e. if contains an assembly name in 
+            the type name, the type will be loaded from the system using 
+            <see cref="M:System.Type.GetType(System.String,System.Boolean)"/>.
+            </para>
+            <para>
+            If the type name is not fully qualified, it will be loaded from the assembly
+            containing the specified relative type. If the type is not found in the assembly 
+            then all the loaded assemblies will be searched for the type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.GetTypeFromString(System.String,System.Boolean,System.Boolean)">
+            <summary>
+            Loads the type specified in the type string.
+            </summary>
+            <param name="typeName">The name of the type to load.</param>
+            <param name="throwOnError">Flag set to <c>true</c> to throw an exception if the type cannot be loaded.</param>
+            <param name="ignoreCase"><c>true</c> to ignore the case of the type name; otherwise, <c>false</c></param>
+            <returns>The type loaded or <c>null</c> if it could not be loaded.</returns>		
+            <remarks>
+            <para>
+            If the type name is fully qualified, i.e. if contains an assembly name in 
+            the type name, the type will be loaded from the system using 
+            <see cref="M:System.Type.GetType(System.String,System.Boolean)"/>.
+            </para>
+            <para>
+            If the type name is not fully qualified it will be loaded from the
+            assembly that is directly calling this method. If the type is not found 
+            in the assembly then all the loaded assemblies will be searched for the type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.GetTypeFromString(System.Reflection.Assembly,System.String,System.Boolean,System.Boolean)">
+            <summary>
+            Loads the type specified in the type string.
+            </summary>
+            <param name="relativeAssembly">An assembly to load the type from.</param>
+            <param name="typeName">The name of the type to load.</param>
+            <param name="throwOnError">Flag set to <c>true</c> to throw an exception if the type cannot be loaded.</param>
+            <param name="ignoreCase"><c>true</c> to ignore the case of the type name; otherwise, <c>false</c></param>
+            <returns>The type loaded or <c>null</c> if it could not be loaded.</returns>
+            <remarks>
+            <para>
+            If the type name is fully qualified, i.e. if contains an assembly name in 
+            the type name, the type will be loaded from the system using 
+            <see cref="M:System.Type.GetType(System.String,System.Boolean)"/>.
+            </para>
+            <para>
+            If the type name is not fully qualified it will be loaded from the specified
+            assembly. If the type is not found in the assembly then all the loaded assemblies 
+            will be searched for the type.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.NewGuid">
+            <summary>
+            Generate a new guid
+            </summary>
+            <returns>A new Guid</returns>
+            <remarks>
+            <para>
+            Generate a new guid
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.CreateArgumentOutOfRangeException(System.String,System.Object,System.String)">
+            <summary>
+            Create an <see cref="T:System.ArgumentOutOfRangeException"/>
+            </summary>
+            <param name="parameterName">The name of the parameter that caused the exception</param>
+            <param name="actualValue">The value of the argument that causes this exception</param>
+            <param name="message">The message that describes the error</param>
+            <returns>the ArgumentOutOfRangeException object</returns>
+            <remarks>
+            <para>
+            Create a new instance of the <see cref="T:System.ArgumentOutOfRangeException"/> class 
+            with a specified error message, the parameter name, and the value 
+            of the argument.
+            </para>
+            <para>
+            The Compact Framework does not support the 3 parameter constructor for the
+            <see cref="T:System.ArgumentOutOfRangeException"/> type. This method provides an
+            implementation that works for all platforms.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.TryParse(System.String,System.Int32@)">
+            <summary>
+            Parse a string into an <see cref="T:System.Int32"/> value
+            </summary>
+            <param name="s">the string to parse</param>
+            <param name="val">out param where the parsed value is placed</param>
+            <returns><c>true</c> if the string was able to be parsed into an integer</returns>
+            <remarks>
+            <para>
+            Attempts to parse the string into an integer. If the string cannot
+            be parsed then this method returns <c>false</c>. The method does not throw an exception.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.TryParse(System.String,System.Int64@)">
+            <summary>
+            Parse a string into an <see cref="T:System.Int64"/> value
+            </summary>
+            <param name="s">the string to parse</param>
+            <param name="val">out param where the parsed value is placed</param>
+            <returns><c>true</c> if the string was able to be parsed into an integer</returns>
+            <remarks>
+            <para>
+            Attempts to parse the string into an integer. If the string cannot
+            be parsed then this method returns <c>false</c>. The method does not throw an exception.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.GetAppSetting(System.String)">
+            <summary>
+            Lookup an application setting
+            </summary>
+            <param name="key">the application settings key to lookup</param>
+            <returns>the value for the key, or <c>null</c></returns>
+            <remarks>
+            <para>
+            Configuration APIs are not supported under the Compact Framework
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.ConvertToFullPath(System.String)">
+            <summary>
+            Convert a path into a fully qualified local file path.
+            </summary>
+            <param name="path">The path to convert.</param>
+            <returns>The fully qualified path.</returns>
+            <remarks>
+            <para>
+            Converts the path specified to a fully
+            qualified path. If the path is relative it is
+            taken as relative from the application base 
+            directory.
+            </para>
+            <para>
+            The path specified must be a local file path, a URI is not supported.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemInfo.CreateCaseInsensitiveHashtable">
+            <summary>
+            Creates a new case-insensitive instance of the <see cref="T:System.Collections.Hashtable"/> class with the default initial capacity. 
+            </summary>
+            <returns>A new case-insensitive instance of the <see cref="T:System.Collections.Hashtable"/> class with the default initial capacity</returns>
+            <remarks>
+            <para>
+            The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.SystemInfo.EmptyTypes">
+            <summary>
+            Gets an empty array of types.
+            </summary>
+            <remarks>
+            <para>
+            The <c>Type.EmptyTypes</c> field is not available on
+            the .NET Compact Framework 1.0.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.SystemInfo.s_hostName">
+            <summary>
+            Cache the host name for the current machine
+            </summary>
+        </member>
+        <member name="F:log4net.Util.SystemInfo.s_appFriendlyName">
+            <summary>
+            Cache the application friendly name
+            </summary>
+        </member>
+        <member name="F:log4net.Util.SystemInfo.s_nullText">
+            <summary>
+            Text to output when a <c>null</c> is encountered.
+            </summary>
+        </member>
+        <member name="F:log4net.Util.SystemInfo.s_notAvailableText">
+            <summary>
+            Text to output when an unsupported feature is requested.
+            </summary>
+        </member>
+        <member name="F:log4net.Util.SystemInfo.s_processStartTime">
+            <summary>
+            Start time for the current process.
+            </summary>
+        </member>
+        <member name="P:log4net.Util.SystemInfo.NewLine">
+            <summary>
+            Gets the system dependent line terminator.
+            </summary>
+            <value>
+            The system dependent line terminator.
+            </value>
+            <remarks>
+            <para>
+            Gets the system dependent line terminator.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.SystemInfo.ApplicationBaseDirectory">
+            <summary>
+            Gets the base directory for this <see cref="T:System.AppDomain"/>.
+            </summary>
+            <value>The base directory path for the current <see cref="T:System.AppDomain"/>.</value>
+            <remarks>
+            <para>
+            Gets the base directory for this <see cref="T:System.AppDomain"/>.
+            </para>
+            <para>
+            The value returned may be either a local file path or a URI.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.SystemInfo.ConfigurationFileLocation">
+            <summary>
+            Gets the path to the configuration file for the current <see cref="T:System.AppDomain"/>.
+            </summary>
+            <value>The path to the configuration file for the current <see cref="T:System.AppDomain"/>.</value>
+            <remarks>
+            <para>
+            The .NET Compact Framework 1.0 does not have a concept of a configuration
+            file. For this runtime, we use the entry assembly location as the root for
+            the configuration file name.
+            </para>
+            <para>
+            The value returned may be either a local file path or a URI.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.SystemInfo.EntryAssemblyLocation">
+            <summary>
+            Gets the path to the file that first executed in the current <see cref="T:System.AppDomain"/>.
+            </summary>
+            <value>The path to the entry assembly.</value>
+            <remarks>
+            <para>
+            Gets the path to the file that first executed in the current <see cref="T:System.AppDomain"/>.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.SystemInfo.CurrentThreadId">
+            <summary>
+            Gets the ID of the current thread.
+            </summary>
+            <value>The ID of the current thread.</value>
+            <remarks>
+            <para>
+            On the .NET framework, the <c>AppDomain.GetCurrentThreadId</c> method
+            is used to obtain the thread ID for the current thread. This is the 
+            operating system ID for the thread.
+            </para>
+            <para>
+            On the .NET Compact Framework 1.0 it is not possible to get the 
+            operating system thread ID for the current thread. The native method 
+            <c>GetCurrentThreadId</c> is implemented inline in a header file
+            and cannot be called.
+            </para>
+            <para>
+            On the .NET Framework 2.0 the <c>Thread.ManagedThreadId</c> is used as this
+            gives a stable id unrelated to the operating system thread ID which may 
+            change if the runtime is using fibers.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.SystemInfo.HostName">
+            <summary>
+            Get the host name or machine name for the current machine
+            </summary>
+            <value>
+            The hostname or machine name
+            </value>
+            <remarks>
+            <para>
+            Get the host name or machine name for the current machine
+            </para>
+            <para>
+            The host name (<see cref="M:System.Net.Dns.GetHostName"/>) or
+            the machine name (<c>Environment.MachineName</c>) for
+            the current machine, or if neither of these are available
+            then <c>NOT AVAILABLE</c> is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.SystemInfo.ApplicationFriendlyName">
+            <summary>
+            Get this application's friendly name
+            </summary>
+            <value>
+            The friendly name of this application as a string
+            </value>
+            <remarks>
+            <para>
+            If available the name of the application is retrieved from
+            the <c>AppDomain</c> using <c>AppDomain.CurrentDomain.FriendlyName</c>.
+            </para>
+            <para>
+            Otherwise the file name of the entry assembly is used.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.SystemInfo.ProcessStartTime">
+            <summary>
+            Get the start time for the current process.
+            </summary>
+            <remarks>
+            <para>
+            This is the time at which the log4net library was loaded into the
+            AppDomain. Due to reports of a hang in the call to <c>System.Diagnostics.Process.StartTime</c>
+            this is not the start time for the current process.
+            </para>
+            <para>
+            The log4net library should be loaded by an application early during its
+            startup, therefore this start time should be a good approximation for
+            the actual start time.
+            </para>
+            <para>
+            Note that AppDomains may be loaded and unloaded within the
+            same process without the process terminating, however this start time
+            will be set per AppDomain.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.SystemInfo.NullText">
+            <summary>
+            Text to output when a <c>null</c> is encountered.
+            </summary>
+            <remarks>
+            <para>
+            Use this value to indicate a <c>null</c> has been encountered while
+            outputting a string representation of an item.
+            </para>
+            <para>
+            The default value is <c>(null)</c>. This value can be overridden by specifying
+            a value for the <c>log4net.NullText</c> appSetting in the application's
+            .config file.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.SystemInfo.NotAvailableText">
+            <summary>
+            Text to output when an unsupported feature is requested.
+            </summary>
+            <remarks>
+            <para>
+            Use this value when an unsupported feature is requested.
+            </para>
+            <para>
+            The default value is <c>NOT AVAILABLE</c>. This value can be overridden by specifying
+            a value for the <c>log4net.NotAvailableText</c> appSetting in the application's
+            .config file.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.SystemStringFormat">
+            <summary>
+            Utility class that represents a format string.
+            </summary>
+            <remarks>
+            <para>
+            Utility class that represents a format string.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.SystemStringFormat.#ctor(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Initialise the <see cref="T:log4net.Util.SystemStringFormat"/>
+            </summary>
+            <param name="provider">An <see cref="T:System.IFormatProvider"/> that supplies culture-specific formatting information.</param>
+            <param name="format">A <see cref="T:System.String"/> containing zero or more format items.</param>
+            <param name="args">An <see cref="T:System.Object"/> array containing zero or more objects to format.</param>
+        </member>
+        <member name="M:log4net.Util.SystemStringFormat.ToString">
+            <summary>
+            Format the string and arguments
+            </summary>
+            <returns>the formatted string</returns>
+        </member>
+        <member name="M:log4net.Util.SystemStringFormat.StringFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Replaces the format item in a specified <see cref="T:System.String"/> with the text equivalent 
+            of the value of a corresponding <see cref="T:System.Object"/> instance in a specified array.
+            A specified parameter supplies culture-specific formatting information.
+            </summary>
+            <param name="provider">An <see cref="T:System.IFormatProvider"/> that supplies culture-specific formatting information.</param>
+            <param name="format">A <see cref="T:System.String"/> containing zero or more format items.</param>
+            <param name="args">An <see cref="T:System.Object"/> array containing zero or more objects to format.</param>
+            <returns>
+            A copy of format in which the format items have been replaced by the <see cref="T:System.String"/> 
+            equivalent of the corresponding instances of <see cref="T:System.Object"/> in args.
+            </returns>
+            <remarks>
+            <para>
+            This method does not throw exceptions. If an exception thrown while formatting the result the
+            exception and arguments are returned in the result string.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.SystemStringFormat.StringFormatError(System.Exception,System.String,System.Object[])">
+            <summary>
+            Process an error during StringFormat
+            </summary>
+        </member>
+        <member name="M:log4net.Util.SystemStringFormat.RenderArray(System.Array,System.Text.StringBuilder)">
+            <summary>
+            Dump the contents of an array into a string builder
+            </summary>
+        </member>
+        <member name="M:log4net.Util.SystemStringFormat.RenderObject(System.Object,System.Text.StringBuilder)">
+            <summary>
+            Dump an object to a string
+            </summary>
+        </member>
+        <member name="T:log4net.Util.ThreadContextProperties">
+            <summary>
+            Implementation of Properties collection for the <see cref="T:log4net.ThreadContext"/>
+            </summary>
+            <remarks>
+            <para>
+            Class implements a collection of properties that is specific to each thread.
+            The class is not synchronized as each thread has its own <see cref="T:log4net.Util.PropertiesDictionary"/>.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Util.ThreadContextProperties.s_threadLocalSlot">
+            <summary>
+            The thread local data slot to use to store a PropertiesDictionary.
+            </summary>
+        </member>
+        <member name="M:log4net.Util.ThreadContextProperties.#ctor">
+            <summary>
+            Internal constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.ThreadContextProperties"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ThreadContextProperties.Remove(System.String)">
+            <summary>
+            Remove a property
+            </summary>
+            <param name="key">the key for the entry to remove</param>
+            <remarks>
+            <para>
+            Remove a property
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ThreadContextProperties.Clear">
+            <summary>
+            Clear all properties
+            </summary>
+            <remarks>
+            <para>
+            Clear all properties
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ThreadContextProperties.GetProperties(System.Boolean)">
+            <summary>
+            Get the <c>PropertiesDictionary</c> for this thread.
+            </summary>
+            <param name="create">create the dictionary if it does not exist, otherwise return null if is does not exist</param>
+            <returns>the properties for this thread</returns>
+            <remarks>
+            <para>
+            The collection returned is only to be used on the calling thread. If the
+            caller needs to share the collection between different threads then the 
+            caller must clone the collection before doing so.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.ThreadContextProperties.Item(System.String)">
+            <summary>
+            Gets or sets the value of a property
+            </summary>
+            <value>
+            The value for the property with the specified key
+            </value>
+            <remarks>
+            <para>
+            Gets or sets the value of a property
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.ThreadContextStack">
+            <summary>
+            Implementation of Stack for the <see cref="T:log4net.ThreadContext"/>
+            </summary>
+            <remarks>
+            <para>
+            Implementation of Stack for the <see cref="T:log4net.ThreadContext"/>
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="F:log4net.Util.ThreadContextStack.m_stack">
+            <summary>
+            The stack store.
+            </summary>
+        </member>
+        <member name="M:log4net.Util.ThreadContextStack.#ctor">
+            <summary>
+            Internal constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.ThreadContextStack"/> class. 
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ThreadContextStack.Clear">
+            <summary>
+            Clears all the contextual information held in this stack.
+            </summary>
+            <remarks>
+            <para>
+            Clears all the contextual information held in this stack.
+            Only call this if you think that this tread is being reused after
+            a previous call execution which may not have completed correctly.
+            You do not need to use this method if you always guarantee to call
+            the <see cref="M:System.IDisposable.Dispose"/> method of the <see cref="T:System.IDisposable"/>
+            returned from <see cref="M:log4net.Util.ThreadContextStack.Push(System.String)"/> even in exceptional circumstances,
+            for example by using the <c>using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message"))</c> 
+            syntax.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ThreadContextStack.Pop">
+            <summary>
+            Removes the top context from this stack.
+            </summary>
+            <returns>The message in the context that was removed from the top of this stack.</returns>
+            <remarks>
+            <para>
+            Remove the top context from this stack, and return
+            it to the caller. If this stack is empty then an
+            empty string (not <see langword="null"/>) is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ThreadContextStack.Push(System.String)">
+            <summary>
+            Pushes a new context message into this stack.
+            </summary>
+            <param name="message">The new context message.</param>
+            <returns>
+            An <see cref="T:System.IDisposable"/> that can be used to clean up the context stack.
+            </returns>
+            <remarks>
+            <para>
+            Pushes a new context onto this stack. An <see cref="T:System.IDisposable"/>
+            is returned that can be used to clean up this stack. This
+            can be easily combined with the <c>using</c> keyword to scope the
+            context.
+            </para>
+            </remarks>
+            <example>Simple example of using the <c>Push</c> method with the <c>using</c> keyword.
+            <code lang="C#">
+            using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message"))
+            {
+            	log.Warn("This should have an ThreadContext Stack message");
+            }
+            </code>
+            </example>
+        </member>
+        <member name="M:log4net.Util.ThreadContextStack.GetFullMessage">
+            <summary>
+            Gets the current context information for this stack.
+            </summary>
+            <returns>The current context information.</returns>
+        </member>
+        <member name="M:log4net.Util.ThreadContextStack.ToString">
+            <summary>
+            Gets the current context information for this stack.
+            </summary>
+            <returns>Gets the current context information</returns>
+            <remarks>
+            <para>
+            Gets the current context information for this stack.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ThreadContextStack.log4net#Core#IFixingRequired#GetFixedObject">
+            <summary>
+            Get a portable version of this object
+            </summary>
+            <returns>the portable instance of this object</returns>
+            <remarks>
+            <para>
+            Get a cross thread portable version of this object
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.ThreadContextStack.Count">
+            <summary>
+            The number of messages in the stack
+            </summary>
+            <value>
+            The current number of messages in the stack
+            </value>
+            <remarks>
+            <para>
+            The current number of messages in the stack. That is
+            the number of times <see cref="M:log4net.Util.ThreadContextStack.Push(System.String)"/> has been called
+            minus the number of times <see cref="M:log4net.Util.ThreadContextStack.Pop"/> has been called.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.ThreadContextStack.InternalStack">
+            <summary>
+            Gets and sets the internal stack used by this <see cref="T:log4net.Util.ThreadContextStack"/>
+            </summary>
+            <value>The internal storage stack</value>
+            <remarks>
+            <para>
+            This property is provided only to support backward compatability 
+            of the <see cref="T:log4net.NDC"/>. Tytpically the internal stack should not
+            be modified.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.ThreadContextStack.StackFrame">
+            <summary>
+            Inner class used to represent a single context frame in the stack.
+            </summary>
+            <remarks>
+            <para>
+            Inner class used to represent a single context frame in the stack.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ThreadContextStack.StackFrame.#ctor(System.String,log4net.Util.ThreadContextStack.StackFrame)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="message">The message for this context.</param>
+            <param name="parent">The parent context in the chain.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.ThreadContextStack.StackFrame"/> class
+            with the specified message and parent context.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.ThreadContextStack.StackFrame.Message">
+            <summary>
+            Get the message.
+            </summary>
+            <value>The message.</value>
+            <remarks>
+            <para>
+            Get the message.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.ThreadContextStack.StackFrame.FullMessage">
+            <summary>
+            Gets the full text of the context down to the root level.
+            </summary>
+            <value>
+            The full text of the context down to the root level.
+            </value>
+            <remarks>
+            <para>
+            Gets the full text of the context down to the root level.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.ThreadContextStack.AutoPopStackFrame">
+            <summary>
+            Struct returned from the <see cref="M:log4net.Util.ThreadContextStack.Push(System.String)"/> method.
+            </summary>
+            <remarks>
+            <para>
+            This struct implements the <see cref="T:System.IDisposable"/> and is designed to be used
+            with the <see langword="using"/> pattern to remove the stack frame at the end of the scope.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.ThreadContextStack.AutoPopStackFrame.m_frameStack">
+            <summary>
+            The ThreadContextStack internal stack
+            </summary>
+        </member>
+        <member name="F:log4net.Util.ThreadContextStack.AutoPopStackFrame.m_frameDepth">
+            <summary>
+            The depth to trim the stack to when this instance is disposed
+            </summary>
+        </member>
+        <member name="M:log4net.Util.ThreadContextStack.AutoPopStackFrame.#ctor(System.Collections.Stack,System.Int32)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="frameStack">The internal stack used by the ThreadContextStack.</param>
+            <param name="frameDepth">The depth to return the stack to when this object is disposed.</param>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.ThreadContextStack.AutoPopStackFrame"/> class with
+            the specified stack and return depth.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.ThreadContextStack.AutoPopStackFrame.Dispose">
+            <summary>
+            Returns the stack to the correct depth.
+            </summary>
+            <remarks>
+            <para>
+            Returns the stack to the correct depth.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.ThreadContextStacks">
+            <summary>
+            Implementation of Stacks collection for the <see cref="T:log4net.ThreadContext"/>
+            </summary>
+            <remarks>
+            <para>
+            Implementation of Stacks collection for the <see cref="T:log4net.ThreadContext"/>
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.Util.ThreadContextStacks.#ctor(log4net.Util.ContextPropertiesBase)">
+            <summary>
+            Internal constructor
+            </summary>
+            <remarks>
+            <para>
+            Initializes a new instance of the <see cref="T:log4net.Util.ThreadContextStacks"/> class.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.ThreadContextStacks.Item(System.String)">
+            <summary>
+            Gets the named thread context stack
+            </summary>
+            <value>
+            The named stack
+            </value>
+            <remarks>
+            <para>
+            Gets the named thread context stack
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.Transform">
+            <summary>
+            Utility class for transforming strings.
+            </summary>
+            <remarks>
+            <para>
+            Utility class for transforming strings.
+            </para>
+            </remarks>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.Util.Transform.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.Util.Transform"/> class. 
+            </summary>
+            <remarks>
+            <para>
+            Uses a private access modifier to prevent instantiation of this class.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.Transform.WriteEscapedXmlString(System.Xml.XmlWriter,System.String,System.String)">
+            <summary>
+            Write a string to an <see cref="T:System.Xml.XmlWriter"/>
+            </summary>
+            <param name="writer">the writer to write to</param>
+            <param name="textData">the string to write</param>
+            <param name="invalidCharReplacement">The string to replace non XML compliant chars with</param>
+            <remarks>
+            <para>
+            The test is escaped either using XML escape entities
+            or using CDATA sections.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.Transform.MaskXmlInvalidCharacters(System.String,System.String)">
+            <summary>
+            Replace invalid XML characters in text string
+            </summary>
+            <param name="textData">the XML text input string</param>
+            <param name="mask">the string to use in place of invalid characters</param>
+            <returns>A string that does not contain invalid XML characters.</returns>
+            <remarks>
+            <para>
+            Certain Unicode code points are not allowed in the XML InfoSet, for
+            details see: <a href="http://www.w3.org/TR/REC-xml/#charsets">http://www.w3.org/TR/REC-xml/#charsets</a>.
+            </para>
+            <para>
+            This method replaces any illegal characters in the input string
+            with the mask string specified.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.Transform.CountSubstrings(System.String,System.String)">
+            <summary>
+            Count the number of times that the substring occurs in the text
+            </summary>
+            <param name="text">the text to search</param>
+            <param name="substring">the substring to find</param>
+            <returns>the number of times the substring occurs in the text</returns>
+            <remarks>
+            <para>
+            The substring is assumed to be non repeating within itself.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.WindowsSecurityContext">
+            <summary>
+            Impersonate a Windows Account
+            </summary>
+            <remarks>
+            <para>
+            This <see cref="T:log4net.Core.SecurityContext"/> impersonates a Windows account.
+            </para>
+            <para>
+            How the impersonation is done depends on the value of <see cref="M:log4net.Util.WindowsSecurityContext.Impersonate(System.Object)"/>.
+            This allows the context to either impersonate a set of user credentials specified 
+            using username, domain name and password or to revert to the process credentials.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.WindowsSecurityContext.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+            <remarks>
+            <para>
+            Default constructor
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.WindowsSecurityContext.ActivateOptions">
+            <summary>
+            Initialize the SecurityContext based on the options set.
+            </summary>
+            <remarks>
+            <para>
+            This is part of the <see cref="T:log4net.Core.IOptionHandler"/> delayed object
+            activation scheme. The <see cref="M:log4net.Util.WindowsSecurityContext.ActivateOptions"/> method must 
+            be called on this object after the configuration properties have
+            been set. Until <see cref="M:log4net.Util.WindowsSecurityContext.ActivateOptions"/> is called this
+            object is in an undefined state and must not be used. 
+            </para>
+            <para>
+            If any of the configuration properties are modified then 
+            <see cref="M:log4net.Util.WindowsSecurityContext.ActivateOptions"/> must be called again.
+            </para>
+            <para>
+            The security context will try to Logon the specified user account and
+            capture a primary token for impersonation.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">The required <see cref="P:log4net.Util.WindowsSecurityContext.UserName"/>, 
+            <see cref="P:log4net.Util.WindowsSecurityContext.DomainName"/> or <see cref="P:log4net.Util.WindowsSecurityContext.Password"/> properties were not specified.</exception>
+        </member>
+        <member name="M:log4net.Util.WindowsSecurityContext.Impersonate(System.Object)">
+            <summary>
+            Impersonate the Windows account specified by the <see cref="P:log4net.Util.WindowsSecurityContext.UserName"/> and <see cref="P:log4net.Util.WindowsSecurityContext.DomainName"/> properties.
+            </summary>
+            <param name="state">caller provided state</param>
+            <returns>
+            An <see cref="T:System.IDisposable"/> instance that will revoke the impersonation of this SecurityContext
+            </returns>
+            <remarks>
+            <para>
+            Depending on the <see cref="P:log4net.Util.WindowsSecurityContext.Credentials"/> property either
+            impersonate a user using credentials supplied or revert 
+            to the process credentials.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.WindowsSecurityContext.LogonUser(System.String,System.String,System.String)">
+            <summary>
+            Create a <see cref="T:System.Security.Principal.WindowsIdentity"/> given the userName, domainName and password.
+            </summary>
+            <param name="userName">the user name</param>
+            <param name="domainName">the domain name</param>
+            <param name="password">the password</param>
+            <returns>the <see cref="T:System.Security.Principal.WindowsIdentity"/> for the account specified</returns>
+            <remarks>
+            <para>
+            Uses the Windows API call LogonUser to get a principal token for the account. This
+            token is used to initialize the WindowsIdentity.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.WindowsSecurityContext.Credentials">
+            <summary>
+            Gets or sets the impersonation mode for this security context
+            </summary>
+            <value>
+            The impersonation mode for this security context
+            </value>
+            <remarks>
+            <para>
+            Impersonate either a user with user credentials or
+            revert this thread to the credentials of the process.
+            The value is one of the <see cref="T:log4net.Util.WindowsSecurityContext.ImpersonationMode"/>
+            enum.
+            </para>
+            <para>
+            The default value is <see cref="F:log4net.Util.WindowsSecurityContext.ImpersonationMode.User"/>
+            </para>
+            <para>
+            When the mode is set to <see cref="F:log4net.Util.WindowsSecurityContext.ImpersonationMode.User"/>
+            the user's credentials are established using the
+            <see cref="P:log4net.Util.WindowsSecurityContext.UserName"/>, <see cref="P:log4net.Util.WindowsSecurityContext.DomainName"/> and <see cref="P:log4net.Util.WindowsSecurityContext.Password"/>
+            values.
+            </para>
+            <para>
+            When the mode is set to <see cref="F:log4net.Util.WindowsSecurityContext.ImpersonationMode.Process"/>
+            no other properties need to be set. If the calling thread is 
+            impersonating then it will be reverted back to the process credentials.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.WindowsSecurityContext.UserName">
+            <summary>
+            Gets or sets the Windows username for this security context
+            </summary>
+            <value>
+            The Windows username for this security context
+            </value>
+            <remarks>
+            <para>
+            This property must be set if <see cref="P:log4net.Util.WindowsSecurityContext.Credentials"/>
+            is set to <see cref="F:log4net.Util.WindowsSecurityContext.ImpersonationMode.User"/> (the default setting).
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.WindowsSecurityContext.DomainName">
+            <summary>
+            Gets or sets the Windows domain name for this security context
+            </summary>
+            <value>
+            The Windows domain name for this security context
+            </value>
+            <remarks>
+            <para>
+            The default value for <see cref="P:log4net.Util.WindowsSecurityContext.DomainName"/> is the local machine name
+            taken from the <see cref="P:System.Environment.MachineName"/> property.
+            </para>
+            <para>
+            This property must be set if <see cref="P:log4net.Util.WindowsSecurityContext.Credentials"/>
+            is set to <see cref="F:log4net.Util.WindowsSecurityContext.ImpersonationMode.User"/> (the default setting).
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.Util.WindowsSecurityContext.Password">
+            <summary>
+            Sets the password for the Windows account specified by the <see cref="P:log4net.Util.WindowsSecurityContext.UserName"/> and <see cref="P:log4net.Util.WindowsSecurityContext.DomainName"/> properties.
+            </summary>
+            <value>
+            The password for the Windows account specified by the <see cref="P:log4net.Util.WindowsSecurityContext.UserName"/> and <see cref="P:log4net.Util.WindowsSecurityContext.DomainName"/> properties.
+            </value>
+            <remarks>
+            <para>
+            This property must be set if <see cref="P:log4net.Util.WindowsSecurityContext.Credentials"/>
+            is set to <see cref="F:log4net.Util.WindowsSecurityContext.ImpersonationMode.User"/> (the default setting).
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.Util.WindowsSecurityContext.ImpersonationMode">
+            <summary>
+            The impersonation modes for the <see cref="T:log4net.Util.WindowsSecurityContext"/>
+            </summary>
+            <remarks>
+            <para>
+            See the <see cref="P:log4net.Util.WindowsSecurityContext.Credentials"/> property for
+            details.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.Util.WindowsSecurityContext.ImpersonationMode.User">
+            <summary>
+            Impersonate a user using the credentials supplied
+            </summary>
+        </member>
+        <member name="F:log4net.Util.WindowsSecurityContext.ImpersonationMode.Process">
+            <summary>
+            Revert this the thread to the credentials of the process
+            </summary>
+        </member>
+        <member name="T:log4net.Util.WindowsSecurityContext.DisposableImpersonationContext">
+            <summary>
+            Adds <see cref="T:System.IDisposable"/> to <see cref="T:System.Security.Principal.WindowsImpersonationContext"/>
+            </summary>
+            <remarks>
+            <para>
+            Helper class to expose the <see cref="T:System.Security.Principal.WindowsImpersonationContext"/>
+            through the <see cref="T:System.IDisposable"/> interface.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.WindowsSecurityContext.DisposableImpersonationContext.#ctor(System.Security.Principal.WindowsImpersonationContext)">
+            <summary>
+            Constructor
+            </summary>
+            <param name="impersonationContext">the impersonation context being wrapped</param>
+            <remarks>
+            <para>
+            Constructor
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.Util.WindowsSecurityContext.DisposableImpersonationContext.Dispose">
+            <summary>
+            Revert the impersonation
+            </summary>
+            <remarks>
+            <para>
+            Revert the impersonation
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.GlobalContext">
+            <summary>
+            The log4net Global Context.
+            </summary>
+            <remarks>
+            <para>
+            The <c>GlobalContext</c> provides a location for global debugging 
+            information to be stored.
+            </para>
+            <para>
+            The global context has a properties map and these properties can 
+            be included in the output of log messages. The <see cref="T:log4net.Layout.PatternLayout"/>
+            supports selecting and outputing these properties.
+            </para>
+            <para>
+            By default the <c>log4net:HostName</c> property is set to the name of 
+            the current machine.
+            </para>
+            </remarks>
+            <example>
+            <code lang="C#">
+            GlobalContext.Properties["hostname"] = Environment.MachineName;
+            </code>
+            </example>
+            <threadsafety static="true" instance="true"/>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.GlobalContext.#ctor">
+            <summary>
+            Private Constructor. 
+            </summary>
+            <remarks>
+            Uses a private access modifier to prevent instantiation of this class.
+            </remarks>
+        </member>
+        <member name="F:log4net.GlobalContext.s_properties">
+            <summary>
+            The global context properties instance
+            </summary>
+        </member>
+        <member name="P:log4net.GlobalContext.Properties">
+            <summary>
+            The global properties map.
+            </summary>
+            <value>
+            The global properties map.
+            </value>
+            <remarks>
+            <para>
+            The global properties map.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.LogicalThreadContext">
+            <summary>
+            The log4net Logical Thread Context.
+            </summary>
+            <remarks>
+            <para>
+            The <c>LogicalThreadContext</c> provides a location for <see cref="T:System.Runtime.Remoting.Messaging.CallContext"/> specific debugging 
+            information to be stored.
+            The <c>LogicalThreadContext</c> properties override any <see cref="T:log4net.ThreadContext"/> or <see cref="T:log4net.GlobalContext"/>
+            properties with the same name.
+            </para>
+            <para>
+            The Logical Thread Context has a properties map and a stack.
+            The properties and stack can 
+            be included in the output of log messages. The <see cref="T:log4net.Layout.PatternLayout"/>
+            supports selecting and outputting these properties.
+            </para>
+            <para>
+            The Logical Thread Context provides a diagnostic context for the current call context. 
+            This is an instrument for distinguishing interleaved log
+            output from different sources. Log output is typically interleaved
+            when a server handles multiple clients near-simultaneously.
+            </para>
+            <para>
+            The Logical Thread Context is managed on a per <see cref="T:System.Runtime.Remoting.Messaging.CallContext"/> basis.
+            </para>
+            </remarks>
+            <example>Example of using the thread context properties to store a username.
+            <code lang="C#">
+            LogicalThreadContext.Properties["user"] = userName;
+            log.Info("This log message has a LogicalThreadContext Property called 'user'");
+            </code>
+            </example>
+            <example>Example of how to push a message into the context stack
+            <code lang="C#">
+            using(LogicalThreadContext.Stacks["LDC"].Push("my context message"))
+            {
+            	log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'");
+            
+            } // at the end of the using block the message is automatically popped 
+            </code>
+            </example>
+            <threadsafety static="true" instance="true"/>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.LogicalThreadContext.#ctor">
+            <summary>
+            Private Constructor. 
+            </summary>
+            <remarks>
+            <para>
+            Uses a private access modifier to prevent instantiation of this class.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.LogicalThreadContext.s_properties">
+            <summary>
+            The thread context properties instance
+            </summary>
+        </member>
+        <member name="F:log4net.LogicalThreadContext.s_stacks">
+            <summary>
+            The thread context stacks instance
+            </summary>
+        </member>
+        <member name="P:log4net.LogicalThreadContext.Properties">
+            <summary>
+            The thread properties map
+            </summary>
+            <value>
+            The thread properties map
+            </value>
+            <remarks>
+            <para>
+            The <c>LogicalThreadContext</c> properties override any <see cref="T:log4net.ThreadContext"/> 
+            or <see cref="T:log4net.GlobalContext"/> properties with the same name.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.LogicalThreadContext.Stacks">
+            <summary>
+            The thread stacks
+            </summary>
+            <value>
+            stack map
+            </value>
+            <remarks>
+            <para>
+            The logical thread stacks.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.LogManager">
+            <summary>
+            This class is used by client applications to request logger instances.
+            </summary>
+            <remarks>
+            <para>
+            This class has static methods that are used by a client to request
+            a logger instance. The <see cref="M:log4net.LogManager.GetLogger(System.String)"/> method is 
+            used to retrieve a logger.
+            </para>
+            <para>
+            See the <see cref="T:log4net.ILog"/> interface for more details.
+            </para>
+            </remarks>
+            <example>Simple example of logging messages
+            <code lang="C#">
+            ILog log = LogManager.GetLogger("application-log");
+            
+            log.Info("Application Start");
+            log.Debug("This is a debug message");
+            
+            if (log.IsDebugEnabled)
+            {
+            	log.Debug("This is another debug message");
+            }
+            </code>
+            </example>
+            <threadsafety static="true" instance="true"/>
+            <seealso cref="T:log4net.ILog"/>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.LogManager.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.LogManager"/> class. 
+            </summary>
+            <remarks>
+            Uses a private access modifier to prevent instantiation of this class.
+            </remarks>
+        </member>
+        <member name="M:log4net.LogManager.Exists(System.String)">
+            <overloads>Returns the named logger if it exists.</overloads>
+            <summary>
+            Returns the named logger if it exists.
+            </summary>
+            <remarks>
+            <para>
+            If the named logger exists (in the default repository) then it
+            returns a reference to the logger, otherwise it returns <c>null</c>.
+            </para>
+            </remarks>
+            <param name="name">The fully qualified logger name to look for.</param>
+            <returns>The logger found, or <c>null</c> if no logger could be found.</returns>
+        </member>
+        <member name="M:log4net.LogManager.Exists(System.String,System.String)">
+            <summary>
+            Returns the named logger if it exists.
+            </summary>
+            <remarks>
+            <para>
+            If the named logger exists (in the specified repository) then it
+            returns a reference to the logger, otherwise it returns
+            <c>null</c>.
+            </para>
+            </remarks>
+            <param name="repository">The repository to lookup in.</param>
+            <param name="name">The fully qualified logger name to look for.</param>
+            <returns>
+            The logger found, or <c>null</c> if the logger doesn't exist in the specified 
+            repository.
+            </returns>
+        </member>
+        <member name="M:log4net.LogManager.Exists(System.Reflection.Assembly,System.String)">
+            <summary>
+            Returns the named logger if it exists.
+            </summary>
+            <remarks>
+            <para>
+            If the named logger exists (in the repository for the specified assembly) then it
+            returns a reference to the logger, otherwise it returns
+            <c>null</c>.
+            </para>
+            </remarks>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+            <param name="name">The fully qualified logger name to look for.</param>
+            <returns>
+            The logger, or <c>null</c> if the logger doesn't exist in the specified
+            assembly's repository.
+            </returns>
+        </member>
+        <member name="M:log4net.LogManager.GetCurrentLoggers">
+            <overloads>Get the currently defined loggers.</overloads>
+            <summary>
+            Returns all the currently defined loggers in the default repository.
+            </summary>
+            <remarks>
+            <para>The root logger is <b>not</b> included in the returned array.</para>
+            </remarks>
+            <returns>All the defined loggers.</returns>
+        </member>
+        <member name="M:log4net.LogManager.GetCurrentLoggers(System.String)">
+            <summary>
+            Returns all the currently defined loggers in the specified repository.
+            </summary>
+            <param name="repository">The repository to lookup in.</param>
+            <remarks>
+            The root logger is <b>not</b> included in the returned array.
+            </remarks>
+            <returns>All the defined loggers.</returns>
+        </member>
+        <member name="M:log4net.LogManager.GetCurrentLoggers(System.Reflection.Assembly)">
+            <summary>
+            Returns all the currently defined loggers in the specified assembly's repository.
+            </summary>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+            <remarks>
+            The root logger is <b>not</b> included in the returned array.
+            </remarks>
+            <returns>All the defined loggers.</returns>
+        </member>
+        <member name="M:log4net.LogManager.GetLogger(System.String)">
+            <overloads>Get or create a logger.</overloads>
+            <summary>
+            Retrieves or creates a named logger.
+            </summary>
+            <remarks>
+            <para>
+            Retrieves a logger named as the <paramref name="name"/>
+            parameter. If the named logger already exists, then the
+            existing instance will be returned. Otherwise, a new instance is
+            created.
+            </para>
+            <para>By default, loggers do not have a set level but inherit
+            it from the hierarchy. This is one of the central features of
+            log4net.
+            </para>
+            </remarks>
+            <param name="name">The name of the logger to retrieve.</param>
+            <returns>The logger with the name specified.</returns>
+        </member>
+        <member name="M:log4net.LogManager.GetLogger(System.String,System.String)">
+            <summary>
+            Retrieves or creates a named logger.
+            </summary>
+            <remarks>
+            <para>
+            Retrieve a logger named as the <paramref name="name"/>
+            parameter. If the named logger already exists, then the
+            existing instance will be returned. Otherwise, a new instance is
+            created.
+            </para>
+            <para>
+            By default, loggers do not have a set level but inherit
+            it from the hierarchy. This is one of the central features of
+            log4net.
+            </para>
+            </remarks>
+            <param name="repository">The repository to lookup in.</param>
+            <param name="name">The name of the logger to retrieve.</param>
+            <returns>The logger with the name specified.</returns>
+        </member>
+        <member name="M:log4net.LogManager.GetLogger(System.Reflection.Assembly,System.String)">
+            <summary>
+            Retrieves or creates a named logger.
+            </summary>
+            <remarks>
+            <para>
+            Retrieve a logger named as the <paramref name="name"/>
+            parameter. If the named logger already exists, then the
+            existing instance will be returned. Otherwise, a new instance is
+            created.
+            </para>
+            <para>
+            By default, loggers do not have a set level but inherit
+            it from the hierarchy. This is one of the central features of
+            log4net.
+            </para>
+            </remarks>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+            <param name="name">The name of the logger to retrieve.</param>
+            <returns>The logger with the name specified.</returns>
+        </member>
+        <member name="M:log4net.LogManager.GetLogger(System.Type)">
+            <summary>
+            Shorthand for <see cref="M:log4net.LogManager.GetLogger(System.String)"/>.
+            </summary>
+            <remarks>
+            Get the logger for the fully qualified name of the type specified.
+            </remarks>
+            <param name="type">The full name of <paramref name="type"/> will be used as the name of the logger to retrieve.</param>
+            <returns>The logger with the name specified.</returns>
+        </member>
+        <member name="M:log4net.LogManager.GetLogger(System.String,System.Type)">
+            <summary>
+            Shorthand for <see cref="M:log4net.LogManager.GetLogger(System.String)"/>.
+            </summary>
+            <remarks>
+            Gets the logger for the fully qualified name of the type specified.
+            </remarks>
+            <param name="repository">The repository to lookup in.</param>
+            <param name="type">The full name of <paramref name="type"/> will be used as the name of the logger to retrieve.</param>
+            <returns>The logger with the name specified.</returns>
+        </member>
+        <member name="M:log4net.LogManager.GetLogger(System.Reflection.Assembly,System.Type)">
+            <summary>
+            Shorthand for <see cref="M:log4net.LogManager.GetLogger(System.String)"/>.
+            </summary>
+            <remarks>
+            Gets the logger for the fully qualified name of the type specified.
+            </remarks>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+            <param name="type">The full name of <paramref name="type"/> will be used as the name of the logger to retrieve.</param>
+            <returns>The logger with the name specified.</returns>
+        </member>
+        <member name="M:log4net.LogManager.Shutdown">
+            <summary>
+            Shuts down the log4net system.
+            </summary>
+            <remarks>
+            <para>
+            Calling this method will <b>safely</b> close and remove all
+            appenders in all the loggers including root contained in all the
+            default repositories.
+            </para>
+            <para>
+            Some appenders need to be closed before the application exists. 
+            Otherwise, pending logging events might be lost.
+            </para>
+            <para>The <c>shutdown</c> method is careful to close nested
+            appenders before closing regular appenders. This is allows
+            configurations where a regular appender is attached to a logger
+            and again to a nested appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.LogManager.ShutdownRepository">
+            <overloads>Shutdown a logger repository.</overloads>
+            <summary>
+            Shuts down the default repository.
+            </summary>
+            <remarks>
+            <para>
+            Calling this method will <b>safely</b> close and remove all
+            appenders in all the loggers including root contained in the
+            default repository.
+            </para>
+            <para>Some appenders need to be closed before the application exists. 
+            Otherwise, pending logging events might be lost.
+            </para>
+            <para>The <c>shutdown</c> method is careful to close nested
+            appenders before closing regular appenders. This is allows
+            configurations where a regular appender is attached to a logger
+            and again to a nested appender.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.LogManager.ShutdownRepository(System.String)">
+            <summary>
+            Shuts down the repository for the repository specified.
+            </summary>
+            <remarks>
+            <para>
+            Calling this method will <b>safely</b> close and remove all
+            appenders in all the loggers including root contained in the
+            <paramref name="repository"/> specified.
+            </para>
+            <para>
+            Some appenders need to be closed before the application exists. 
+            Otherwise, pending logging events might be lost.
+            </para>
+            <para>The <c>shutdown</c> method is careful to close nested
+            appenders before closing regular appenders. This is allows
+            configurations where a regular appender is attached to a logger
+            and again to a nested appender.
+            </para>
+            </remarks>
+            <param name="repository">The repository to shutdown.</param>
+        </member>
+        <member name="M:log4net.LogManager.ShutdownRepository(System.Reflection.Assembly)">
+            <summary>
+            Shuts down the repository specified.
+            </summary>
+            <remarks>
+            <para>
+            Calling this method will <b>safely</b> close and remove all
+            appenders in all the loggers including root contained in the
+            repository. The repository is looked up using
+            the <paramref name="repositoryAssembly"/> specified.
+            </para>
+            <para>
+            Some appenders need to be closed before the application exists. 
+            Otherwise, pending logging events might be lost.
+            </para>
+            <para>
+            The <c>shutdown</c> method is careful to close nested
+            appenders before closing regular appenders. This is allows
+            configurations where a regular appender is attached to a logger
+            and again to a nested appender.
+            </para>
+            </remarks>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+        </member>
+        <member name="M:log4net.LogManager.ResetConfiguration">
+            <overloads>Reset the configuration of a repository</overloads>
+            <summary>
+            Resets all values contained in this repository instance to their defaults.
+            </summary>
+            <remarks>
+            <para>
+            Resets all values contained in the repository instance to their
+            defaults.  This removes all appenders from all loggers, sets
+            the level of all non-root loggers to <c>null</c>,
+            sets their additivity flag to <c>true</c> and sets the level
+            of the root logger to <see cref="F:log4net.Core.Level.Debug"/>. Moreover,
+            message disabling is set to its default "off" value.
+            </para>		
+            </remarks>
+        </member>
+        <member name="M:log4net.LogManager.ResetConfiguration(System.String)">
+            <summary>
+            Resets all values contained in this repository instance to their defaults.
+            </summary>
+            <remarks>
+            <para>
+            Reset all values contained in the repository instance to their
+            defaults.  This removes all appenders from all loggers, sets
+            the level of all non-root loggers to <c>null</c>,
+            sets their additivity flag to <c>true</c> and sets the level
+            of the root logger to <see cref="F:log4net.Core.Level.Debug"/>. Moreover,
+            message disabling is set to its default "off" value.
+            </para>		
+            </remarks>
+            <param name="repository">The repository to reset.</param>
+        </member>
+        <member name="M:log4net.LogManager.ResetConfiguration(System.Reflection.Assembly)">
+            <summary>
+            Resets all values contained in this repository instance to their defaults.
+            </summary>
+            <remarks>
+            <para>
+            Reset all values contained in the repository instance to their
+            defaults.  This removes all appenders from all loggers, sets
+            the level of all non-root loggers to <c>null</c>,
+            sets their additivity flag to <c>true</c> and sets the level
+            of the root logger to <see cref="F:log4net.Core.Level.Debug"/>. Moreover,
+            message disabling is set to its default "off" value.
+            </para>		
+            </remarks>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository to reset.</param>
+        </member>
+        <member name="M:log4net.LogManager.GetLoggerRepository">
+            <overloads>Get the logger repository.</overloads>
+            <summary>
+            Returns the default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.
+            </summary>
+            <remarks>
+            <para>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified
+            by the callers assembly (<see cref="M:System.Reflection.Assembly.GetCallingAssembly"/>).
+            </para>
+            </remarks>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> instance for the default repository.</returns>
+        </member>
+        <member name="M:log4net.LogManager.GetLoggerRepository(System.String)">
+            <summary>
+            Returns the default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.
+            </summary>
+            <returns>The default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.</returns>
+            <remarks>
+            <para>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified
+            by the <paramref name="repository"/> argument.
+            </para>
+            </remarks>
+            <param name="repository">The repository to lookup in.</param>
+        </member>
+        <member name="M:log4net.LogManager.GetLoggerRepository(System.Reflection.Assembly)">
+            <summary>
+            Returns the default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.
+            </summary>
+            <returns>The default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.</returns>
+            <remarks>
+            <para>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified
+            by the <paramref name="repositoryAssembly"/> argument.
+            </para>
+            </remarks>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+        </member>
+        <member name="M:log4net.LogManager.GetRepository">
+            <overloads>Get a logger repository.</overloads>
+            <summary>
+            Returns the default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.
+            </summary>
+            <remarks>
+            <para>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified
+            by the callers assembly (<see cref="M:System.Reflection.Assembly.GetCallingAssembly"/>).
+            </para>
+            </remarks>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> instance for the default repository.</returns>
+        </member>
+        <member name="M:log4net.LogManager.GetRepository(System.String)">
+            <summary>
+            Returns the default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.
+            </summary>
+            <returns>The default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.</returns>
+            <remarks>
+            <para>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified
+            by the <paramref name="repository"/> argument.
+            </para>
+            </remarks>
+            <param name="repository">The repository to lookup in.</param>
+        </member>
+        <member name="M:log4net.LogManager.GetRepository(System.Reflection.Assembly)">
+            <summary>
+            Returns the default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.
+            </summary>
+            <returns>The default <see cref="T:log4net.Repository.ILoggerRepository"/> instance.</returns>
+            <remarks>
+            <para>
+            Gets the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified
+            by the <paramref name="repositoryAssembly"/> argument.
+            </para>
+            </remarks>
+            <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+        </member>
+        <member name="M:log4net.LogManager.CreateDomain(System.Type)">
+            <overloads>Create a domain</overloads>
+            <summary>
+            Creates a repository with the specified repository type.
+            </summary>
+            <remarks>
+            <para>
+            <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
+            </para>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be associated with the repository
+            specified such that a call to <see cref="M:log4net.LogManager.GetRepository"/> will return 
+            the same repository instance.
+            </para>
+            </remarks>
+            <param name="repositoryType">A <see cref="T:System.Type"/> that implements <see cref="T:log4net.Repository.ILoggerRepository"/>
+            and has a no arg constructor. An instance of this type will be created to act
+            as the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> created for the repository.</returns>
+        </member>
+        <member name="M:log4net.LogManager.CreateRepository(System.Type)">
+            <overloads>Create a logger repository.</overloads>
+            <summary>
+            Creates a repository with the specified repository type.
+            </summary>
+            <param name="repositoryType">A <see cref="T:System.Type"/> that implements <see cref="T:log4net.Repository.ILoggerRepository"/>
+            and has a no arg constructor. An instance of this type will be created to act
+            as the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> created for the repository.</returns>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be associated with the repository
+            specified such that a call to <see cref="M:log4net.LogManager.GetRepository"/> will return 
+            the same repository instance.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.LogManager.CreateDomain(System.String)">
+            <summary>
+            Creates a repository with the specified name.
+            </summary>
+            <remarks>
+            <para>
+            <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
+            </para>
+            <para>
+            Creates the default type of <see cref="T:log4net.Repository.ILoggerRepository"/> which is a
+            <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> object.
+            </para>
+            <para>
+            The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+            An <see cref="T:System.Exception"/> will be thrown if the repository already exists.
+            </para>
+            </remarks>
+            <param name="repository">The name of the repository, this must be unique amongst repositories.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> created for the repository.</returns>
+            <exception cref="T:log4net.Core.LogException">The specified repository already exists.</exception>
+        </member>
+        <member name="M:log4net.LogManager.CreateRepository(System.String)">
+            <summary>
+            Creates a repository with the specified name.
+            </summary>
+            <remarks>
+            <para>
+            Creates the default type of <see cref="T:log4net.Repository.ILoggerRepository"/> which is a
+            <see cref="T:log4net.Repository.Hierarchy.Hierarchy"/> object.
+            </para>
+            <para>
+            The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+            An <see cref="T:System.Exception"/> will be thrown if the repository already exists.
+            </para>
+            </remarks>
+            <param name="repository">The name of the repository, this must be unique amongst repositories.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> created for the repository.</returns>
+            <exception cref="T:log4net.Core.LogException">The specified repository already exists.</exception>
+        </member>
+        <member name="M:log4net.LogManager.CreateDomain(System.String,System.Type)">
+            <summary>
+            Creates a repository with the specified name and repository type.
+            </summary>
+            <remarks>
+            <para>
+            <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
+            </para>
+            <para>
+            The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+            An <see cref="T:System.Exception"/> will be thrown if the repository already exists.
+            </para>
+            </remarks>
+            <param name="repository">The name of the repository, this must be unique to the repository.</param>
+            <param name="repositoryType">A <see cref="T:System.Type"/> that implements <see cref="T:log4net.Repository.ILoggerRepository"/>
+            and has a no arg constructor. An instance of this type will be created to act
+            as the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> created for the repository.</returns>
+            <exception cref="T:log4net.Core.LogException">The specified repository already exists.</exception>
+        </member>
+        <member name="M:log4net.LogManager.CreateRepository(System.String,System.Type)">
+            <summary>
+            Creates a repository with the specified name and repository type.
+            </summary>
+            <remarks>
+            <para>
+            The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+            An <see cref="T:System.Exception"/> will be thrown if the repository already exists.
+            </para>
+            </remarks>
+            <param name="repository">The name of the repository, this must be unique to the repository.</param>
+            <param name="repositoryType">A <see cref="T:System.Type"/> that implements <see cref="T:log4net.Repository.ILoggerRepository"/>
+            and has a no arg constructor. An instance of this type will be created to act
+            as the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> created for the repository.</returns>
+            <exception cref="T:log4net.Core.LogException">The specified repository already exists.</exception>
+        </member>
+        <member name="M:log4net.LogManager.CreateDomain(System.Reflection.Assembly,System.Type)">
+            <summary>
+            Creates a repository for the specified assembly and repository type.
+            </summary>
+            <remarks>
+            <para>
+            <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
+            </para>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be associated with the repository
+            specified such that a call to <see cref="M:log4net.LogManager.GetRepository(System.Reflection.Assembly)"/> with the
+            same assembly specified will return the same repository instance.
+            </para>
+            </remarks>
+            <param name="repositoryAssembly">The assembly to use to get the name of the repository.</param>
+            <param name="repositoryType">A <see cref="T:System.Type"/> that implements <see cref="T:log4net.Repository.ILoggerRepository"/>
+            and has a no arg constructor. An instance of this type will be created to act
+            as the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> created for the repository.</returns>
+        </member>
+        <member name="M:log4net.LogManager.CreateRepository(System.Reflection.Assembly,System.Type)">
+            <summary>
+            Creates a repository for the specified assembly and repository type.
+            </summary>
+            <remarks>
+            <para>
+            The <see cref="T:log4net.Repository.ILoggerRepository"/> created will be associated with the repository
+            specified such that a call to <see cref="M:log4net.LogManager.GetRepository(System.Reflection.Assembly)"/> with the
+            same assembly specified will return the same repository instance.
+            </para>
+            </remarks>
+            <param name="repositoryAssembly">The assembly to use to get the name of the repository.</param>
+            <param name="repositoryType">A <see cref="T:System.Type"/> that implements <see cref="T:log4net.Repository.ILoggerRepository"/>
+            and has a no arg constructor. An instance of this type will be created to act
+            as the <see cref="T:log4net.Repository.ILoggerRepository"/> for the repository specified.</param>
+            <returns>The <see cref="T:log4net.Repository.ILoggerRepository"/> created for the repository.</returns>
+        </member>
+        <member name="M:log4net.LogManager.GetAllRepositories">
+            <summary>
+            Gets the list of currently defined repositories.
+            </summary>
+            <remarks>
+            <para>
+            Get an array of all the <see cref="T:log4net.Repository.ILoggerRepository"/> objects that have been created.
+            </para>
+            </remarks>
+            <returns>An array of all the known <see cref="T:log4net.Repository.ILoggerRepository"/> objects.</returns>
+        </member>
+        <member name="M:log4net.LogManager.WrapLogger(log4net.Core.ILogger)">
+            <summary>
+            Looks up the wrapper object for the logger specified.
+            </summary>
+            <param name="logger">The logger to get the wrapper for.</param>
+            <returns>The wrapper for the logger specified.</returns>
+        </member>
+        <member name="M:log4net.LogManager.WrapLoggers(log4net.Core.ILogger[])">
+            <summary>
+            Looks up the wrapper objects for the loggers specified.
+            </summary>
+            <param name="loggers">The loggers to get the wrappers for.</param>
+            <returns>The wrapper objects for the loggers specified.</returns>
+        </member>
+        <member name="M:log4net.LogManager.WrapperCreationHandler(log4net.Core.ILogger)">
+            <summary>
+            Create the <see cref="T:log4net.Core.ILoggerWrapper"/> objects used by
+            this manager.
+            </summary>
+            <param name="logger">The logger to wrap.</param>
+            <returns>The wrapper for the logger specified.</returns>
+        </member>
+        <member name="F:log4net.LogManager.s_wrapperMap">
+            <summary>
+            The wrapper map to use to hold the <see cref="T:log4net.Core.LogImpl"/> objects.
+            </summary>
+        </member>
+        <member name="T:log4net.MDC">
+            <summary>
+            Implementation of Mapped Diagnostic Contexts.
+            </summary>
+            <remarks>
+            <note>
+            <para>
+            The MDC is deprecated and has been replaced by the <see cref="P:log4net.ThreadContext.Properties"/>.
+            The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
+            </para>
+            </note>
+            <para>
+            The MDC class is similar to the <see cref="T:log4net.NDC"/> class except that it is
+            based on a map instead of a stack. It provides <i>mapped
+            diagnostic contexts</i>. A <i>Mapped Diagnostic Context</i>, or
+            MDC in short, is an instrument for distinguishing interleaved log
+            output from different sources. Log output is typically interleaved
+            when a server handles multiple clients near-simultaneously.
+            </para>
+            <para>
+            The MDC is managed on a per thread basis.
+            </para>
+            </remarks>
+            <threadsafety static="true" instance="true"/>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.MDC.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.MDC"/> class. 
+            </summary>
+            <remarks>
+            Uses a private access modifier to prevent instantiation of this class.
+            </remarks>
+        </member>
+        <member name="M:log4net.MDC.Get(System.String)">
+            <summary>
+            Gets the context value identified by the <paramref name="key"/> parameter.
+            </summary>
+            <param name="key">The key to lookup in the MDC.</param>
+            <returns>The string value held for the key, or a <c>null</c> reference if no corresponding value is found.</returns>
+            <remarks>
+            <note>
+            <para>
+            The MDC is deprecated and has been replaced by the <see cref="P:log4net.ThreadContext.Properties"/>.
+            The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
+            </para>
+            </note>
+            <para>
+            If the <paramref name="key"/> parameter does not look up to a
+            previously defined context then <c>null</c> will be returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.MDC.Set(System.String,System.String)">
+            <summary>
+            Add an entry to the MDC
+            </summary>
+            <param name="key">The key to store the value under.</param>
+            <param name="value">The value to store.</param>
+            <remarks>
+            <note>
+            <para>
+            The MDC is deprecated and has been replaced by the <see cref="P:log4net.ThreadContext.Properties"/>.
+            The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
+            </para>
+            </note>
+            <para>
+            Puts a context value (the <paramref name="val"/> parameter) as identified
+            with the <paramref name="key"/> parameter into the current thread's
+            context map.
+            </para>
+            <para>
+            If a value is already defined for the <paramref name="key"/>
+            specified then the value will be replaced. If the <paramref name="val"/> 
+            is specified as <c>null</c> then the key value mapping will be removed.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.MDC.Remove(System.String)">
+            <summary>
+            Removes the key value mapping for the key specified.
+            </summary>
+            <param name="key">The key to remove.</param>
+            <remarks>
+            <note>
+            <para>
+            The MDC is deprecated and has been replaced by the <see cref="P:log4net.ThreadContext.Properties"/>.
+            The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
+            </para>
+            </note>
+            <para>
+            Remove the specified entry from this thread's MDC
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.MDC.Clear">
+            <summary>
+            Clear all entries in the MDC
+            </summary>
+            <remarks>
+            <note>
+            <para>
+            The MDC is deprecated and has been replaced by the <see cref="P:log4net.ThreadContext.Properties"/>.
+            The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
+            </para>
+            </note>
+            <para>
+            Remove all the entries from this thread's MDC
+            </para>
+            </remarks>
+        </member>
+        <member name="T:log4net.NDC">
+            <summary>
+            Implementation of Nested Diagnostic Contexts.
+            </summary>
+            <remarks>
+            <note>
+            <para>
+            The NDC is deprecated and has been replaced by the <see cref="P:log4net.ThreadContext.Stacks"/>.
+            The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+            </para>
+            </note>
+            <para>
+            A Nested Diagnostic Context, or NDC in short, is an instrument
+            to distinguish interleaved log output from different sources. Log
+            output is typically interleaved when a server handles multiple
+            clients near-simultaneously.
+            </para>
+            <para>
+            Interleaved log output can still be meaningful if each log entry
+            from different contexts had a distinctive stamp. This is where NDCs
+            come into play.
+            </para>
+            <para>
+            Note that NDCs are managed on a per thread basis. The NDC class
+            is made up of static methods that operate on the context of the
+            calling thread.
+            </para>
+            </remarks>
+            <example>How to push a message into the context
+            <code lang="C#">
+            using(NDC.Push("my context message"))
+            {
+            	... all log calls will have 'my context message' included ...
+            
+            } // at the end of the using block the message is automatically removed 
+            </code>
+            </example>
+            <threadsafety static="true" instance="true"/>
+            <author>Nicko Cadell</author>
+            <author>Gert Driesen</author>
+        </member>
+        <member name="M:log4net.NDC.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:log4net.NDC"/> class. 
+            </summary>
+            <remarks>
+            Uses a private access modifier to prevent instantiation of this class.
+            </remarks>
+        </member>
+        <member name="M:log4net.NDC.Clear">
+            <summary>
+            Clears all the contextual information held on the current thread.
+            </summary>
+            <remarks>
+            <note>
+            <para>
+            The NDC is deprecated and has been replaced by the <see cref="P:log4net.ThreadContext.Stacks"/>.
+            The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+            </para>
+            </note>
+            <para>
+            Clears the stack of NDC data held on the current thread.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.NDC.CloneStack">
+            <summary>
+            Creates a clone of the stack of context information.
+            </summary>
+            <returns>A clone of the context info for this thread.</returns>
+            <remarks>
+            <note>
+            <para>
+            The NDC is deprecated and has been replaced by the <see cref="P:log4net.ThreadContext.Stacks"/>.
+            The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+            </para>
+            </note>
+            <para>
+            The results of this method can be passed to the <see cref="M:log4net.NDC.Inherit(System.Collections.Stack)"/> 
+            method to allow child threads to inherit the context of their 
+            parent thread.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.NDC.Inherit(System.Collections.Stack)">
+            <summary>
+            Inherits the contextual information from another thread.
+            </summary>
+            <param name="stack">The context stack to inherit.</param>
+            <remarks>
+            <note>
+            <para>
+            The NDC is deprecated and has been replaced by the <see cref="P:log4net.ThreadContext.Stacks"/>.
+            The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+            </para>
+            </note>
+            <para>
+            This thread will use the context information from the stack
+            supplied. This can be used to initialize child threads with
+            the same contextual information as their parent threads. These
+            contexts will <b>NOT</b> be shared. Any further contexts that
+            are pushed onto the stack will not be visible to the other.
+            Call <see cref="M:log4net.NDC.CloneStack"/> to obtain a stack to pass to
+            this method.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.NDC.Pop">
+            <summary>
+            Removes the top context from the stack.
+            </summary>
+            <returns>
+            The message in the context that was removed from the top 
+            of the stack.
+            </returns>
+            <remarks>
+            <note>
+            <para>
+            The NDC is deprecated and has been replaced by the <see cref="P:log4net.ThreadContext.Stacks"/>.
+            The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+            </para>
+            </note>
+            <para>
+            Remove the top context from the stack, and return
+            it to the caller. If the stack is empty then an
+            empty string (not <c>null</c>) is returned.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.NDC.Push(System.String)">
+            <summary>
+            Pushes a new context message.
+            </summary>
+            <param name="message">The new context message.</param>
+            <returns>
+            An <see cref="T:System.IDisposable"/> that can be used to clean up 
+            the context stack.
+            </returns>
+            <remarks>
+            <note>
+            <para>
+            The NDC is deprecated and has been replaced by the <see cref="P:log4net.ThreadContext.Stacks"/>.
+            The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+            </para>
+            </note>
+            <para>
+            Pushes a new context onto the context stack. An <see cref="T:System.IDisposable"/>
+            is returned that can be used to clean up the context stack. This
+            can be easily combined with the <c>using</c> keyword to scope the
+            context.
+            </para>
+            </remarks>
+            <example>Simple example of using the <c>Push</c> method with the <c>using</c> keyword.
+            <code lang="C#">
+            using(log4net.NDC.Push("NDC_Message"))
+            {
+            	log.Warn("This should have an NDC message");
+            }
+            </code>
+            </example>
+        </member>
+        <member name="M:log4net.NDC.Remove">
+            <summary>
+            Removes the context information for this thread. It is
+            not required to call this method.
+            </summary>
+            <remarks>
+            <note>
+            <para>
+            The NDC is deprecated and has been replaced by the <see cref="P:log4net.ThreadContext.Stacks"/>.
+            The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+            </para>
+            </note>
+            <para>
+            This method is not implemented.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:log4net.NDC.SetMaxDepth(System.Int32)">
+            <summary>
+            Forces the stack depth to be at most <paramref name="maxDepth"/>.
+            </summary>
+            <param name="maxDepth">The maximum depth of the stack</param>
+            <remarks>
+            <note>
+            <para>
+            The NDC is deprecated and has been replaced by the <see cref="P:log4net.ThreadContext.Stacks"/>.
+            The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+            </para>
+            </note>
+            <para>
+            Forces the stack depth to be at most <paramref name="maxDepth"/>.
+            This may truncate the head of the stack. This only affects the 
+            stack in the current thread. Also it does not prevent it from
+            growing, it only sets the maximum depth at the time of the
+            call. This can be used to return to a known context depth.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.NDC.Depth">
+            <summary>
+            Gets the current context depth.
+            </summary>
+            <value>The current context depth.</value>
+            <remarks>
+            <note>
+            <para>
+            The NDC is deprecated and has been replaced by the <see cref="P:log4net.ThreadContext.Stacks"/>.
+            The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+            </para>
+            </note>
+            <para>
+            The number of context values pushed onto the context stack.
+            </para>
+            <para>
+            Used to record the current depth of the context. This can then 
+            be restored using the <see cref="M:log4net.NDC.SetMaxDepth(System.Int32)"/> method.
+            </para>
+            </remarks>
+            <seealso cref="M:log4net.NDC.SetMaxDepth(System.Int32)"/>
+        </member>
+        <member name="T:log4net.ThreadContext">
+            <summary>
+            The log4net Thread Context.
+            </summary>
+            <remarks>
+            <para>
+            The <c>ThreadContext</c> provides a location for thread specific debugging 
+            information to be stored.
+            The <c>ThreadContext</c> properties override any <see cref="T:log4net.GlobalContext"/>
+            properties with the same name.
+            </para>
+            <para>
+            The thread context has a properties map and a stack.
+            The properties and stack can 
+            be included in the output of log messages. The <see cref="T:log4net.Layout.PatternLayout"/>
+            supports selecting and outputting these properties.
+            </para>
+            <para>
+            The Thread Context provides a diagnostic context for the current thread. 
+            This is an instrument for distinguishing interleaved log
+            output from different sources. Log output is typically interleaved
+            when a server handles multiple clients near-simultaneously.
+            </para>
+            <para>
+            The Thread Context is managed on a per thread basis.
+            </para>
+            </remarks>
+            <example>Example of using the thread context properties to store a username.
+            <code lang="C#">
+            ThreadContext.Properties["user"] = userName;
+            log.Info("This log message has a ThreadContext Property called 'user'");
+            </code>
+            </example>
+            <example>Example of how to push a message into the context stack
+            <code lang="C#">
+            using(ThreadContext.Stacks["NDC"].Push("my context message"))
+            {
+            	log.Info("This log message has a ThreadContext Stack message that includes 'my context message'");
+            
+            } // at the end of the using block the message is automatically popped 
+            </code>
+            </example>
+            <threadsafety static="true" instance="true"/>
+            <author>Nicko Cadell</author>
+        </member>
+        <member name="M:log4net.ThreadContext.#ctor">
+            <summary>
+            Private Constructor. 
+            </summary>
+            <remarks>
+            <para>
+            Uses a private access modifier to prevent instantiation of this class.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:log4net.ThreadContext.s_properties">
+            <summary>
+            The thread context properties instance
+            </summary>
+        </member>
+        <member name="F:log4net.ThreadContext.s_stacks">
+            <summary>
+            The thread context stacks instance
+            </summary>
+        </member>
+        <member name="P:log4net.ThreadContext.Properties">
+            <summary>
+            The thread properties map
+            </summary>
+            <value>
+            The thread properties map
+            </value>
+            <remarks>
+            <para>
+            The <c>ThreadContext</c> properties override any <see cref="T:log4net.GlobalContext"/>
+            properties with the same name.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:log4net.ThreadContext.Stacks">
+            <summary>
+            The thread stacks
+            </summary>
+            <value>
+            stack map
+            </value>
+            <remarks>
+            <para>
+            The thread local stacks.
+            </para>
+            </remarks>
+        </member>
+    </members>
+</doc>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Logger.cs
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Logger.cs	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Logger.cs	(revision 22)
@@ -0,0 +1,197 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+using log4net;
+using log4net.Config;
+
+namespace UEUserGuide
+{
+    /// <summary>
+    /// This class provide the logging/tracing functionalities.
+    /// </summary>
+    public sealed class Logger
+    {
+        ///////////////////////////////////////////////////////////////////////
+        #region Internal fields
+
+        /// <summary>
+        /// Logger component reference (log4net).
+        /// </summary>
+        private ILog _logger;
+
+        #endregion Internal fields
+
+        ///////////////////////////////////////////////////////////////////////
+        #region Thread-safe Singleton implementation
+
+        /// <summary>
+        /// Unique instance of <seealso cref="FsComFramework.Logger.Logger"/>.
+        /// </summary>
+        private static volatile Logger instance = null;
+
+        /// <summary>
+        /// Synchronisation object.
+        /// </summary>
+        private static object _syncRoot = new Object();
+
+        /// <summary>
+        /// Internal ctor.
+        /// </summary>
+        private Logger()
+        {
+        }
+
+        /// <summary>
+        /// Instance accessor.
+        /// </summary>
+        /// <example>
+        /// The code below shows how to do Logger access:
+        /// <code>
+        /// public GenericSAFrm()
+        /// {
+        ///     // Initialize logger.
+        ///     Logger.Instance.Initialize("GenericSA");
+        ///
+        ///     InitializeComponent();
+        /// }
+        /// </code>
+        /// </example>
+        public static Logger Instance
+        {
+            get
+            {
+                lock (_syncRoot)
+                {
+                    if (instance == null)
+                    {
+                        instance = new Logger();
+                    }
+
+                    return instance;
+                }
+            }
+        }
+
+        #endregion Thread-safe Singleton implementation
+
+        ///////////////////////////////////////////////////////////////////////
+        #region Logger methods.
+
+        /// <summary>
+        /// Gets the Debug level status: true if set, false otherwise.
+        /// </summary>
+        public bool IsDebugLevelSet { get { return _logger.IsDebugEnabled; } }
+
+        /// <summary>
+        /// Gets the Info level status: true if set, false otherwise.
+        /// </summary>
+        public bool IsInfoLevelSet { get { return _logger.IsInfoEnabled; } }
+
+        /// <summary>
+        /// Gets the Warning level status: true if set, false otherwise.
+        /// </summary>
+        public bool IsWarningLevelSet { get { return _logger.IsWarnEnabled; } }
+
+        /// <summary>
+        /// Initialize the logger component.
+        /// </summary>
+        /// <param name="name">Logger name - see application configuation file, log4net XML element.</param>
+        /// <example>
+        /// The code below shows how to do Logger access:
+        /// <code>
+        /// public GenericSAFrm()
+        /// {
+        ///     // Initialize logger.
+        ///     Logger.Instance.Initialize("GenericSA");
+        ///
+        ///     InitializeComponent();
+        /// }
+        /// </code>
+        /// </example>
+        public void Initialize(string name)
+        {
+            if (string.IsNullOrEmpty(name))
+            {
+                _logger = LogManager.GetLogger("TraceAppender");
+                XmlConfigurator.Configure();
+            }
+            else
+            {
+                _logger = LogManager.GetLogger(name);
+                XmlConfigurator.Configure();
+            }
+        }
+
+        /// <summary>
+        /// Log information message.
+        /// </summary>
+        /// <param name="fmt">Message format - <see>IFormater</see>.</param>
+        /// <param name="args">List of argument to pass to the formater.</param>          
+        /// <example>
+        /// The code below shows how to do Logger access:
+        /// <code>
+        /// if (Logger.Instance.IsInfoLevelSet) Logger.Instance.InfoLogger("GenericSAFrm.Window_Loaded: All is ok, continue!");
+        /// </code>
+        /// </example>
+        public void InfoLogger(string fmt, params object[] args)
+        {
+            if (_logger.IsInfoEnabled) _logger.InfoFormat(fmt, args);
+        }
+
+        /// <summary>
+        /// Log warning message.
+        /// </summary>
+        /// <param name="fmt">Message format - <see>IFormater</see>.</param>
+        /// <param name="args">List of argument to pass to the formater.</param>          
+        /// <example>
+        /// The code below shows how to do Logger access:
+        /// <code>
+        /// Logger.Instance.WarningLogger("GenericSAFrm.Window_Loaded: Configuration mismatch!");
+        /// </code>
+        /// </example>
+        public void WarningLogger(string fmt, params object[] args)
+        {
+            if (_logger.IsWarnEnabled) _logger.WarnFormat(fmt, args);
+        }
+
+        /// <summary>
+        /// Log error message.
+        /// </summary>
+        /// <param name="fmt">Message format - <see>IFormater</see>.</param>
+        /// <param name="args">List of argument to pass to the formater.</param>          
+        /// <example>
+        /// The code below shows how to do Logger access:
+        /// <code>
+        /// Logger.Instance.ErrorLogger("GenericSAFrm.Window_Loaded: Wrong parameters.");
+        /// </code>
+        /// </example>
+        public void ErrorLogger(string fmt, params object[] args)
+        {
+            if (_logger.IsErrorEnabled) _logger.ErrorFormat(fmt, args);
+        }
+
+        /// <summary>
+        /// Log debug message.
+        /// <remarks>Visible only if level in root XML element is set to ALL or DEBUG.</remarks>
+        /// </summary>
+        /// <param name="fmt">Message format - <see>IFormater</see>.</param>
+        /// <param name="args">List of argument to pass to the formater.</param>          
+        /// <example>
+        /// The code below shows how to do Logger access:
+        /// <code>
+        /// if (Logger.Instance.IsDebugLevelSet) Logger.Instance.DebugLogger("GenericSAFrm.Window_Loaded: Parameters {0} is validated.", counter);
+        /// </code>
+        /// </example>
+        public void DebugLogger(string fmt, params object[] args)
+        {
+            if (_logger.IsDebugEnabled) _logger.DebugFormat(fmt, args);
+        }
+
+        #endregion Logger methods.
+
+        ///////////////////////////////////////////////////////////////////////
+        #region Internal method helpers.
+
+        #endregion Internal method helpers.
+    }
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/NetworkHelper.cs
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/NetworkHelper.cs	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/NetworkHelper.cs	(revision 22)
@@ -0,0 +1,358 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
+using System.Net;
+using System.Net.Sockets;
+using System.Threading;
+
+namespace UEUserGuide
+{
+    /// <summary>
+    /// Implement a TCP client/listener.
+    /// </summary>
+    public class NetworkHelper
+    {
+        ///////////////////////////////////////////////////////////////////////
+        #region Internal fields
+
+        /// <summary>
+        /// IP address.
+        /// </summary>
+        private IPAddress _address;
+
+        /// <summary>
+        /// IP port.
+        /// </summary>
+        private int _port = -1;
+
+        /// <summary>
+        /// Server instance.
+        /// </summary>
+        private TcpListener _server;
+
+        /// <summary>
+        /// Client instance.
+        /// </summary>
+        private TcpClient _client;
+
+        /// <summary>
+        /// End point reference.
+        /// </summary>
+        private NetworkStream _stream;
+
+        #endregion Internal fields
+        
+        ///////////////////////////////////////////////////////////////////////
+        #region Static methods
+
+        /// <summary>
+        /// Create a new instance of TcpClient from specified instance.
+        /// <remarks>This method acts like a copy ctor.</remarks>
+        /// </summary>
+        /// <param name="client">Client reference.</param>
+        /// <returns>The new instance on success, null otherwise.</returns>
+        private static NetworkHelper Create(TcpClient client)
+        {
+            // Sanity check.
+            if (client == null)
+            {
+                UEUserGuide.Logger.Instance.ErrorLogger("NetworkHelper: Client instance is null.");
+                return null;
+            }
+
+            return new NetworkHelper(client);
+        }
+
+        #endregion Static methods
+
+        ///////////////////////////////////////////////////////////////////////
+        #region ctors
+
+        /// <summary>
+        /// Default ctor.
+        /// </summary>
+        public NetworkHelper()
+        {
+            _address = null;
+            _port = -1;
+            _server = null;
+            _client = null;
+        }
+
+        /// <summary>
+        /// Builder ctor used in server part.
+        /// </summary>
+        /// <param name="client"></param>
+        private NetworkHelper(TcpClient client)
+        {
+            _client = client;
+            _client.NoDelay = true;
+            _stream = _client.GetStream();
+        }
+
+        #endregion ctors
+
+        ///////////////////////////////////////////////////////////////////////
+        #region INetwork iface implementation
+
+        ///////////////////////////////////////////////////////////////////////
+        #region Initialization part
+
+        /// <summary>
+        /// Initialize the instance of TCP client or server.
+        /// </summary>
+        /// <param name="address">IP address to use for the communication.</param>
+        /// <param name="port">Port number</param>
+        /// <returns>true on success, false otherwise.</returns>
+        public bool Initialize(string address, int port)
+        {
+            try
+            {
+                _port = port;
+                _address = IPAddress.Parse(address);
+
+                return true;
+            }
+            catch (Exception e)
+            {
+                Logger.Instance.ErrorLogger("NetworkTcp.Initialize: {0}", e);
+            }
+
+            return false;
+        }
+
+        /// <summary>
+        /// Uninitialize the current instance.
+        /// </summary>
+        /// <returns>true on success, false otherwise.</returns>
+        public bool Uninitialize()
+        {
+            Close();
+
+            return true;
+        }
+
+        #endregion Initialization part
+
+        ///////////////////////////////////////////////////////////////////////
+        #region Server methods
+
+        /// <summary>
+        /// Start the TCP server.
+        /// <seealso cref="Initialize"/> method must be called before.
+        /// </summary>
+        public void Start()
+        {
+            _server = new TcpListener(_address, _port);
+            _server.ExclusiveAddressUse = false;
+            _server.Server.NoDelay = true;
+            _server.Start();
+            // To prevent multiple listener instance.
+            Thread.Sleep(1000);
+        }
+
+        /// <summary>
+        /// Stop the TCP server.
+        /// <seealso cref="Initialize"/> method must be called before.
+        /// </summary>
+        public void Stop()
+        {
+            if (_server != null)
+            {
+                _server.Stop();
+                _server = null;
+            }
+        }
+
+        /// <summary>
+        /// Accept incoming connection.
+        /// </summary>
+        /// <returns>New client instance.</returns>
+        public NetworkHelper AcceptClient()
+        {
+            TcpClient client = _server.AcceptTcpClient();
+            return NetworkHelper.Create(client);
+        }
+
+        #endregion Server methods
+
+        ///////////////////////////////////////////////////////////////////////
+        #region Client methods
+
+        /// <summary>
+        /// Initiate a connection.
+        /// </summary>
+        public void Connect()
+        {
+            if (_client != null)
+            {
+               return;
+            }
+
+            _client = new TcpClient();
+            _client.NoDelay = true;
+            _client.Connect(_address, _port);
+            // Get a stream object for reading and writing
+            _stream = _client.GetStream();
+        }
+
+        /// <summary>
+        /// Initiate a connection with login/password..
+        /// </summary>
+        /// <param name="login">Login to pass.</param>
+        /// <param name="password">Password to pass.</param>
+        public void Connect(string login, string password)
+        {
+            throw new NotImplementedException();
+        }
+
+        /// <summary>
+        /// Terminate the connection.
+        /// </summary>
+        public void Close()
+        {
+            if (_client != null)
+            {
+                try
+                {
+                    if (_stream != null)
+                    {
+                        _stream.Close();
+                    }
+                    _client.Close();
+                }
+                catch
+                {
+                }
+                finally
+                {
+                    _client = null;
+                    _stream = null;
+                }
+            }
+        }
+
+        #endregion Client methods
+
+        ///////////////////////////////////////////////////////////////////////
+        #region Data access methods
+
+        /// <summary>
+        /// Received datas from remote.
+        /// </summary>
+        /// <param name="buffer">The buffer to store the datas. Set to null on error.</param>
+        /// <returns>The number of bytes received on success, -1 otherwise.</returns>
+        public int Receive(out byte[] buffer)
+        {
+            if (_stream != null)
+            {
+                // read size of the packet first.
+                byte[] length = new byte[sizeof(int)];
+                _stream.Read(length, 0, length.Length);
+                int totalBytes = BitConverter.ToInt32(length, 0);
+                buffer = new byte[totalBytes];
+                int readBytes = _stream.Read(buffer, 0, buffer.Length);
+                while (readBytes < totalBytes)
+                {
+                    byte[] next = new byte[totalBytes - readBytes];
+                    readBytes += _stream.Read(next, 0, next.Length);
+                    buffer.Concat<byte>(next);
+                }
+
+                return buffer.Length;
+            }
+
+            buffer = null;
+            return -1;
+        }
+
+        /// <summary>
+        /// Received strings from remote.
+        /// </summary>
+        /// <param name="buffer">The buffer to store the strings. Set to null on error.</param>
+        /// <returns>The number of bytes received on success, -1 otherwise.</returns>
+        public int Receive(out string buffer)
+        {
+            if (_stream != null)
+            {
+                if (_stream.DataAvailable)
+                {
+                    byte[] inbuf = new byte[512];
+
+                    IAsyncResult ar = _stream.BeginRead(inbuf, 0, 512, null, null);
+                    int bytesRead = _stream.EndRead(ar);
+                    if (ar.IsCompleted)
+                    {
+                        buffer = System.Text.Encoding.ASCII.GetString(inbuf, 0, bytesRead);
+                        return buffer.Length;
+                    }
+                }
+                else
+                {
+                    buffer = "";
+                    return 0;
+                }
+            }
+
+            buffer = null;
+            return -1;
+        }
+
+        /// <summary>
+        /// Send data to remote.
+        /// </summary>
+        /// <param name="buffer">Data to send.</param>
+        /// <param name="size">The number of byte to send.</param>
+        /// <returns>The number of bytes sent on success, -1 otherwise.</returns>
+        public int Send(byte[] buffer, int size)
+        {
+            if (_stream != null)
+            {
+                // Sanity checks.
+                if ((buffer == null) || (size == 0))
+                {
+                    return 0;
+                }
+
+                // Send size of packet first.
+                byte[] length = BitConverter.GetBytes(size);
+                _stream.Write(length , 0, length.Length);
+                // Send the packet after.
+                _stream.Write(buffer, 0, size);
+                _stream.Flush();
+                return size;
+            }
+
+            return -1;
+        }
+
+        /// <summary>
+        /// Send string to remote.
+        /// </summary>
+        /// <param name="buffer">String to send.</param>
+        /// <returns>The received string length on success, -1 otherwise.</returns>
+        public int Send(string buffer)
+        {
+            if (_stream != null)
+            {
+                // Sanity checks.
+                if (string.IsNullOrEmpty(buffer))
+                {
+                    return 0;
+                }
+                byte[] output = System.Text.Encoding.ASCII.GetBytes(buffer);
+                _stream.Write(output, 0, output.Length);
+                _stream.Flush();
+                return output.Length;
+            }
+
+            return -1;
+        }
+
+        #endregion Data access methods
+
+        #endregion INetwork iface implementation
+    }
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Program.cs
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Program.cs	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Program.cs	(revision 22)
@@ -0,0 +1,21 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace UEUserGuide
+{
+    static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new UEUserGuideFrm());
+        }
+    }
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/AssemblyInfo.cs
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/AssemblyInfo.cs	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/AssemblyInfo.cs	(revision 22)
@@ -0,0 +1,36 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("UEUserGuide")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("UEUserGuide")]
+[assembly: AssemblyCopyright("Copyright ©  2009")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("cb7acffd-e3ac-40b1-a609-ef0e977f6ef3")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/Resources.Designer.cs
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/Resources.Designer.cs	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/Resources.Designer.cs	(revision 22)
@@ -0,0 +1,71 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.1433
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace UEUserGuide.Properties
+{
+
+
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources
+    {
+
+        private static global::System.Resources.ResourceManager resourceMan;
+
+        private static global::System.Globalization.CultureInfo resourceCulture;
+
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources()
+        {
+        }
+
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager
+        {
+            get
+            {
+                if ((resourceMan == null))
+                {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("UEUserGuide.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture
+        {
+            get
+            {
+                return resourceCulture;
+            }
+            set
+            {
+                resourceCulture = value;
+            }
+        }
+    }
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/Resources.resx
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/Resources.resx	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/Resources.resx	(revision 22)
@@ -0,0 +1,117 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/Settings.Designer.cs
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/Settings.Designer.cs	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/Settings.Designer.cs	(revision 22)
@@ -0,0 +1,30 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.1433
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace UEUserGuide.Properties
+{
+
+
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+    {
+
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+        public static Settings Default
+        {
+            get
+            {
+                return defaultInstance;
+            }
+        }
+    }
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/Settings.settings
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/Settings.settings	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Properties/Settings.settings	(revision 22)
@@ -0,0 +1,7 @@
+﻿<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Setup/UEUserGuide/UEUserGuideSetup.vdproj
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Setup/UEUserGuide/UEUserGuideSetup.vdproj	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/Setup/UEUserGuide/UEUserGuideSetup.vdproj	(revision 22)
@@ -0,0 +1,822 @@
+﻿"DeployProject"
+{
+"VSVersion" = "3:800"
+"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
+"IsWebType" = "8:FALSE"
+"ProjectName" = "8:UEUserGuideSetup"
+"LanguageId" = "3:1033"
+"CodePage" = "3:1252"
+"UILanguageId" = "3:1033"
+"SccProjectName" = "8:"
+"SccLocalPath" = "8:"
+"SccAuxPath" = "8:"
+"SccProvider" = "8:"
+    "Hierarchy"
+    {
+        "Entry"
+        {
+        "MsmKey" = "8:_3020FB9AC4CCEFA07D9F6D33747922F7"
+        "OwnerKey" = "8:_FAA6B10DC75740B092E755275B753202"
+        "MsmSig" = "8:_UNDEFINED"
+        }
+        "Entry"
+        {
+        "MsmKey" = "8:_3A004532889349A19B8CDAF45AC7C76D"
+        "OwnerKey" = "8:_UNDEFINED"
+        "MsmSig" = "8:_UNDEFINED"
+        }
+        "Entry"
+        {
+        "MsmKey" = "8:_FAA6B10DC75740B092E755275B753202"
+        "OwnerKey" = "8:_UNDEFINED"
+        "MsmSig" = "8:_UNDEFINED"
+        }
+        "Entry"
+        {
+        "MsmKey" = "8:_UNDEFINED"
+        "OwnerKey" = "8:_FAA6B10DC75740B092E755275B753202"
+        "MsmSig" = "8:_UNDEFINED"
+        }
+        "Entry"
+        {
+        "MsmKey" = "8:_UNDEFINED"
+        "OwnerKey" = "8:_3020FB9AC4CCEFA07D9F6D33747922F7"
+        "MsmSig" = "8:_UNDEFINED"
+        }
+    }
+    "Configurations"
+    {
+        "Debug"
+        {
+        "DisplayName" = "8:Debug"
+        "IsDebugOnly" = "11:TRUE"
+        "IsReleaseOnly" = "11:FALSE"
+        "OutputFilename" = "8:Debug\\UEUserGuideSetup.msi"
+        "PackageFilesAs" = "3:2"
+        "PackageFileSize" = "3:-2147483648"
+        "CabType" = "3:1"
+        "Compression" = "3:2"
+        "SignOutput" = "11:FALSE"
+        "CertificateFile" = "8:"
+        "PrivateKeyFile" = "8:"
+        "TimeStampServer" = "8:"
+        "InstallerBootstrapper" = "3:2"
+            "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
+            {
+            "Enabled" = "11:TRUE"
+            "PromptEnabled" = "11:TRUE"
+            "PrerequisitesLocation" = "2:1"
+            "Url" = "8:"
+            "ComponentsUrl" = "8:"
+            }
+        }
+        "Release"
+        {
+        "DisplayName" = "8:Release"
+        "IsDebugOnly" = "11:FALSE"
+        "IsReleaseOnly" = "11:TRUE"
+        "OutputFilename" = "8:..\\..\\UEUserGuideSetup.msi"
+        "PackageFilesAs" = "3:2"
+        "PackageFileSize" = "3:-2147483648"
+        "CabType" = "3:1"
+        "Compression" = "3:2"
+        "SignOutput" = "11:FALSE"
+        "CertificateFile" = "8:"
+        "PrivateKeyFile" = "8:"
+        "TimeStampServer" = "8:"
+        "InstallerBootstrapper" = "3:2"
+            "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
+            {
+            "Enabled" = "11:TRUE"
+            "PromptEnabled" = "11:TRUE"
+            "PrerequisitesLocation" = "2:1"
+            "Url" = "8:"
+            "ComponentsUrl" = "8:"
+                "Items"
+                {
+                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5"
+                    {
+                    "Name" = "8:.NET Framework 3.5"
+                    "ProductCode" = "8:Microsoft.Net.Framework.3.5"
+                    }
+                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1"
+                    {
+                    "Name" = "8:Windows Installer 3.1"
+                    "ProductCode" = "8:Microsoft.Windows.Installer.3.1"
+                    }
+                }
+            }
+        }
+    }
+    "Deployable"
+    {
+        "CustomAction"
+        {
+        }
+        "DefaultFeature"
+        {
+        "Name" = "8:DefaultFeature"
+        "Title" = "8:"
+        "Description" = "8:"
+        }
+        "ExternalPersistence"
+        {
+            "LaunchCondition"
+            {
+                "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_BCCC301C10E143ABABD9081A67B59DE1"
+                {
+                "Name" = "8:.NET Framework"
+                "Message" = "8:[VSDNETMSG]"
+                "Version" = "8:3.5.21022"
+                "AllowLaterVersions" = "11:FALSE"
+                "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=76617"
+                }
+            }
+        }
+        "File"
+        {
+            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3020FB9AC4CCEFA07D9F6D33747922F7"
+            {
+            "AssemblyRegister" = "3:1"
+            "AssemblyIsInGAC" = "11:FALSE"
+            "AssemblyAsmDisplayName" = "8:log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL"
+                "ScatterAssemblies"
+                {
+                    "_3020FB9AC4CCEFA07D9F6D33747922F7"
+                    {
+                    "Name" = "8:log4net.dll"
+                    "Attributes" = "3:512"
+                    }
+                }
+            "SourcePath" = "8:log4net.dll"
+            "TargetName" = "8:"
+            "Tag" = "8:"
+            "Folder" = "8:_587C371E56694005846B440AA3D0BB7B"
+            "Condition" = "8:"
+            "Transitive" = "11:FALSE"
+            "Vital" = "11:TRUE"
+            "ReadOnly" = "11:FALSE"
+            "Hidden" = "11:FALSE"
+            "System" = "11:FALSE"
+            "Permanent" = "11:FALSE"
+            "SharedLegacy" = "11:FALSE"
+            "PackageAs" = "3:1"
+            "Register" = "3:1"
+            "Exclude" = "11:FALSE"
+            "IsDependency" = "11:TRUE"
+            "IsolateTo" = "8:"
+            }
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3A004532889349A19B8CDAF45AC7C76D"
+            {
+            "SourcePath" = "8:..\\..\\UserGuidesMessages.xml"
+            "TargetName" = "8:UserGuidesMessages.xml"
+            "Tag" = "8:"
+            "Folder" = "8:_587C371E56694005846B440AA3D0BB7B"
+            "Condition" = "8:"
+            "Transitive" = "11:FALSE"
+            "Vital" = "11:TRUE"
+            "ReadOnly" = "11:FALSE"
+            "Hidden" = "11:FALSE"
+            "System" = "11:FALSE"
+            "Permanent" = "11:FALSE"
+            "SharedLegacy" = "11:FALSE"
+            "PackageAs" = "3:1"
+            "Register" = "3:1"
+            "Exclude" = "11:FALSE"
+            "IsDependency" = "11:FALSE"
+            "IsolateTo" = "8:"
+            }
+        }
+        "FileType"
+        {
+        }
+        "Folder"
+        {
+            "{1525181F-901A-416C-8A58-119130FE478E}:_1D664B969DD345348725DB62AC977360"
+            {
+            "Name" = "8:#1916"
+            "AlwaysCreate" = "11:FALSE"
+            "Condition" = "8:"
+            "Transitive" = "11:FALSE"
+            "Property" = "8:DesktopFolder"
+                "Folders"
+                {
+                }
+            }
+            "{1525181F-901A-416C-8A58-119130FE478E}:_2D11DA7DFF2E468690F70E62CA90FD01"
+            {
+            "Name" = "8:#1919"
+            "AlwaysCreate" = "11:FALSE"
+            "Condition" = "8:"
+            "Transitive" = "11:FALSE"
+            "Property" = "8:ProgramMenuFolder"
+                "Folders"
+                {
+                }
+            }
+            "{3C67513D-01DD-4637-8A68-80971EB9504F}:_587C371E56694005846B440AA3D0BB7B"
+            {
+            "DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]"
+            "Name" = "8:#1925"
+            "AlwaysCreate" = "11:FALSE"
+            "Condition" = "8:"
+            "Transitive" = "11:FALSE"
+            "Property" = "8:TARGETDIR"
+                "Folders"
+                {
+                }
+            }
+        }
+        "LaunchCondition"
+        {
+        }
+        "Locator"
+        {
+        }
+        "MsiBootstrapper"
+        {
+        "LangId" = "3:1033"
+        "RequiresElevation" = "11:FALSE"
+        }
+        "Product"
+        {
+        "Name" = "8:Microsoft Visual Studio"
+        "ProductName" = "8:UEUserGuide"
+        "ProductCode" = "8:{1A6429A6-6C7B-4A74-B23F-0486DFEA5C64}"
+        "PackageCode" = "8:{3786E56E-709A-4257-9A16-81CA4EC81558}"
+        "UpgradeCode" = "8:{8E54EDCC-0B5F-4DBE-A250-9D4481CC63B4}"
+        "RestartWWWService" = "11:FALSE"
+        "RemovePreviousVersions" = "11:TRUE"
+        "DetectNewerInstalledVersion" = "11:TRUE"
+        "InstallAllUsers" = "11:FALSE"
+        "ProductVersion" = "8:1.0.0"
+        "Manufacturer" = "8:ETSI"
+        "ARPHELPTELEPHONE" = "8:"
+        "ARPHELPLINK" = "8:"
+        "Title" = "8:EUTs user guide application"
+        "Subject" = "8:"
+        "ARPCONTACT" = "8:STF 370 - Adapter team"
+        "Keywords" = "8:"
+        "ARPCOMMENTS" = "8:"
+        "ARPURLINFOABOUT" = "8:http://www.etsi.org"
+        "ARPPRODUCTICON" = "8:"
+        "ARPIconIndex" = "3:0"
+        "SearchPath" = "8:"
+        "UseSystemSearchPath" = "11:TRUE"
+        "TargetPlatform" = "3:0"
+        "PreBuildEvent" = "8:"
+        "PostBuildEvent" = "8:"
+        "RunPostBuildEvent" = "3:0"
+        }
+        "Registry"
+        {
+            "HKLM"
+            {
+                "Keys"
+                {
+                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_CE0A64F1EAE84DFCB93C572E521FAFDC"
+                    {
+                    "Name" = "8:Software"
+                    "Condition" = "8:"
+                    "AlwaysCreate" = "11:FALSE"
+                    "DeleteAtUninstall" = "11:FALSE"
+                    "Transitive" = "11:FALSE"
+                        "Keys"
+                        {
+                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_5455EF71B1BC46BE8B39B3F6899B191B"
+                            {
+                            "Name" = "8:[Manufacturer]"
+                            "Condition" = "8:"
+                            "AlwaysCreate" = "11:FALSE"
+                            "DeleteAtUninstall" = "11:FALSE"
+                            "Transitive" = "11:FALSE"
+                                "Keys"
+                                {
+                                }
+                                "Values"
+                                {
+                                }
+                            }
+                        }
+                        "Values"
+                        {
+                        }
+                    }
+                }
+            }
+            "HKCU"
+            {
+                "Keys"
+                {
+                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_812A5A98E9724A24A60D8D3A3410C2FC"
+                    {
+                    "Name" = "8:Software"
+                    "Condition" = "8:"
+                    "AlwaysCreate" = "11:FALSE"
+                    "DeleteAtUninstall" = "11:FALSE"
+                    "Transitive" = "11:FALSE"
+                        "Keys"
+                        {
+                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_51445A8374E04C01ACD90D990F0DAAFE"
+                            {
+                            "Name" = "8:[Manufacturer]"
+                            "Condition" = "8:"
+                            "AlwaysCreate" = "11:FALSE"
+                            "DeleteAtUninstall" = "11:FALSE"
+                            "Transitive" = "11:FALSE"
+                                "Keys"
+                                {
+                                }
+                                "Values"
+                                {
+                                }
+                            }
+                        }
+                        "Values"
+                        {
+                        }
+                    }
+                }
+            }
+            "HKCR"
+            {
+                "Keys"
+                {
+                }
+            }
+            "HKU"
+            {
+                "Keys"
+                {
+                }
+            }
+            "HKPU"
+            {
+                "Keys"
+                {
+                }
+            }
+        }
+        "Sequences"
+        {
+        }
+        "Shortcut"
+        {
+        }
+        "UserInterface"
+        {
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_0E34D55C278B40EF8C8F32C261E4589A"
+            {
+            "Name" = "8:#1900"
+            "Sequence" = "3:1"
+            "Attributes" = "3:1"
+                "Dialogs"
+                {
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_0109553D8BFD4B77A7669DED74ECC073"
+                    {
+                    "Sequence" = "3:100"
+                    "DisplayName" = "8:Welcome"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "CopyrightWarning"
+                            {
+                            "Name" = "8:CopyrightWarning"
+                            "DisplayName" = "8:#1002"
+                            "Description" = "8:#1102"
+                            "Type" = "3:3"
+                            "ContextData" = "8:"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:1"
+                            "Value" = "8:#1202"
+                            "DefaultValue" = "8:#1202"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "Welcome"
+                            {
+                            "Name" = "8:Welcome"
+                            "DisplayName" = "8:#1003"
+                            "Description" = "8:#1103"
+                            "Type" = "3:3"
+                            "ContextData" = "8:"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:1"
+                            "Value" = "8:#1203"
+                            "DefaultValue" = "8:#1203"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_56EF34D30D674913812FE3C19A0CD8FD"
+                    {
+                    "Sequence" = "3:300"
+                    "DisplayName" = "8:Confirm Installation"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A589BE72F79447EB85044AC2134FC32D"
+                    {
+                    "Sequence" = "3:200"
+                    "DisplayName" = "8:Installation Folder"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "InstallAllUsersVisible"
+                            {
+                            "Name" = "8:InstallAllUsersVisible"
+                            "DisplayName" = "8:#1059"
+                            "Description" = "8:#1159"
+                            "Type" = "3:5"
+                            "ContextData" = "8:1;True=1;False=0"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:0"
+                            "Value" = "3:1"
+                            "DefaultValue" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                }
+            }
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_5420EB3D6BA947DA9251BF19D07F1270"
+            {
+            "Name" = "8:#1900"
+            "Sequence" = "3:2"
+            "Attributes" = "3:1"
+                "Dialogs"
+                {
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_46FF7998FDAF48DD8354C34FFB8CF49E"
+                    {
+                    "Sequence" = "3:300"
+                    "DisplayName" = "8:Confirm Installation"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_4C5D06BFC0C14B318E3992309020545B"
+                    {
+                    "Sequence" = "3:100"
+                    "DisplayName" = "8:Welcome"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "CopyrightWarning"
+                            {
+                            "Name" = "8:CopyrightWarning"
+                            "DisplayName" = "8:#1002"
+                            "Description" = "8:#1102"
+                            "Type" = "3:3"
+                            "ContextData" = "8:"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:1"
+                            "Value" = "8:#1202"
+                            "DefaultValue" = "8:#1202"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "Welcome"
+                            {
+                            "Name" = "8:Welcome"
+                            "DisplayName" = "8:#1003"
+                            "Description" = "8:#1103"
+                            "Type" = "3:3"
+                            "ContextData" = "8:"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:1"
+                            "Value" = "8:#1203"
+                            "DefaultValue" = "8:#1203"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D18DC01218BD4CAE82E87B67839C43D1"
+                    {
+                    "Sequence" = "3:200"
+                    "DisplayName" = "8:Installation Folder"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                }
+            }
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_67626E991C59497088278C5BDB7C9C5C"
+            {
+            "Name" = "8:#1902"
+            "Sequence" = "3:1"
+            "Attributes" = "3:3"
+                "Dialogs"
+                {
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_9CE582206146411A96F86B203797B554"
+                    {
+                    "Sequence" = "3:100"
+                    "DisplayName" = "8:Finished"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "UpdateText"
+                            {
+                            "Name" = "8:UpdateText"
+                            "DisplayName" = "8:#1058"
+                            "Description" = "8:#1158"
+                            "Type" = "3:15"
+                            "ContextData" = "8:"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:1"
+                            "Value" = "8:#1258"
+                            "DefaultValue" = "8:#1258"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                }
+            }
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_86751AE521AD4DCA9E0C947F3900157F"
+            {
+            "Name" = "8:#1902"
+            "Sequence" = "3:2"
+            "Attributes" = "3:3"
+                "Dialogs"
+                {
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F3BB114CBAD54A7CB92BAD03587D5B25"
+                    {
+                    "Sequence" = "3:100"
+                    "DisplayName" = "8:Finished"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                }
+            }
+            "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_B9F131C8EDB54F57A9551FB933E13B3E"
+            {
+            "UseDynamicProperties" = "11:FALSE"
+            "IsDependency" = "11:FALSE"
+            "SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
+            }
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_BB46F9BF9F5F48CBB64D822BD247E2AD"
+            {
+            "Name" = "8:#1901"
+            "Sequence" = "3:2"
+            "Attributes" = "3:2"
+                "Dialogs"
+                {
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_ED66DE2989C94206930C1ADE46B50AE2"
+                    {
+                    "Sequence" = "3:100"
+                    "DisplayName" = "8:Progress"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "ShowProgress"
+                            {
+                            "Name" = "8:ShowProgress"
+                            "DisplayName" = "8:#1009"
+                            "Description" = "8:#1109"
+                            "Type" = "3:5"
+                            "ContextData" = "8:1;True=1;False=0"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:0"
+                            "Value" = "3:1"
+                            "DefaultValue" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                }
+            }
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_C9461F0CA11840F09D9679B8088B4737"
+            {
+            "Name" = "8:#1901"
+            "Sequence" = "3:1"
+            "Attributes" = "3:2"
+                "Dialogs"
+                {
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_045F26EB9E3C45E6931E7DF14F0A0902"
+                    {
+                    "Sequence" = "3:100"
+                    "DisplayName" = "8:Progress"
+                    "UseDynamicProperties" = "11:TRUE"
+                    "IsDependency" = "11:FALSE"
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
+                        "Properties"
+                        {
+                            "BannerBitmap"
+                            {
+                            "Name" = "8:BannerBitmap"
+                            "DisplayName" = "8:#1001"
+                            "Description" = "8:#1101"
+                            "Type" = "3:8"
+                            "ContextData" = "8:Bitmap"
+                            "Attributes" = "3:4"
+                            "Setting" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                            "ShowProgress"
+                            {
+                            "Name" = "8:ShowProgress"
+                            "DisplayName" = "8:#1009"
+                            "Description" = "8:#1109"
+                            "Type" = "3:5"
+                            "ContextData" = "8:1;True=1;False=0"
+                            "Attributes" = "3:0"
+                            "Setting" = "3:0"
+                            "Value" = "3:1"
+                            "DefaultValue" = "3:1"
+                            "UsePlugInResources" = "11:TRUE"
+                            }
+                        }
+                    }
+                }
+            }
+            "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_E012E13C4AE54536866CE359204EAFB2"
+            {
+            "UseDynamicProperties" = "11:FALSE"
+            "IsDependency" = "11:FALSE"
+            "SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
+            }
+        }
+        "MergeModule"
+        {
+        }
+        "ProjectOutput"
+        {
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E5734BCD9D6F40C99E7FF7713259C5CF"
+            {
+            "SourcePath" = "8:"
+            "TargetName" = "8:"
+            "Tag" = "8:"
+            "Folder" = "8:_587C371E56694005846B440AA3D0BB7B"
+            "Condition" = "8:"
+            "Transitive" = "11:FALSE"
+            "Vital" = "11:TRUE"
+            "ReadOnly" = "11:FALSE"
+            "Hidden" = "11:FALSE"
+            "System" = "11:FALSE"
+            "Permanent" = "11:FALSE"
+            "SharedLegacy" = "11:FALSE"
+            "PackageAs" = "3:1"
+            "Register" = "3:1"
+            "Exclude" = "11:FALSE"
+            "IsDependency" = "11:FALSE"
+            "IsolateTo" = "8:"
+            "ProjectOutputGroupRegister" = "3:1"
+            "OutputConfiguration" = "8:"
+            "OutputGroupCanonicalName" = "8:LocalizedResourceDlls"
+            "OutputProjectGuid" = "8:{D0EB5D56-8500-46FF-BE2D-42303DC1E35F}"
+            "ShowKeyOutput" = "11:TRUE"
+                "ExcludeFilters"
+                {
+                }
+            }
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_FAA6B10DC75740B092E755275B753202"
+            {
+            "SourcePath" = "8:..\\..\\obj\\Release\\UEUserGuide.exe"
+            "TargetName" = "8:"
+            "Tag" = "8:"
+            "Folder" = "8:_587C371E56694005846B440AA3D0BB7B"
+            "Condition" = "8:"
+            "Transitive" = "11:FALSE"
+            "Vital" = "11:TRUE"
+            "ReadOnly" = "11:FALSE"
+            "Hidden" = "11:FALSE"
+            "System" = "11:FALSE"
+            "Permanent" = "11:FALSE"
+            "SharedLegacy" = "11:FALSE"
+            "PackageAs" = "3:1"
+            "Register" = "3:1"
+            "Exclude" = "11:FALSE"
+            "IsDependency" = "11:FALSE"
+            "IsolateTo" = "8:"
+            "ProjectOutputGroupRegister" = "3:1"
+            "OutputConfiguration" = "8:"
+            "OutputGroupCanonicalName" = "8:Built"
+            "OutputProjectGuid" = "8:{D0EB5D56-8500-46FF-BE2D-42303DC1E35F}"
+            "ShowKeyOutput" = "11:TRUE"
+                "ExcludeFilters"
+                {
+                }
+            }
+        }
+    }
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuide.csproj
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuide.csproj	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuide.csproj	(revision 22)
@@ -0,0 +1,105 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{D0EB5D56-8500-46FF-BE2D-42303DC1E35F}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>UEUserGuide</RootNamespace>
+    <AssemblyName>UEUserGuide</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>Frameworks\Log4net\log4net.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.configuration" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Logger.cs" />
+    <Compile Include="NetworkHelper.cs" />
+    <Compile Include="UEUserGuideFrm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="UEUserGuideFrm.Designer.cs">
+      <DependentUpon>UEUserGuideFrm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="UEUserGuideFrm.en.resx">
+      <DependentUpon>UEUserGuideFrm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="UEUserGuideFrm.resx">
+      <DependentUpon>UEUserGuideFrm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <None Include="App.config" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="UserGuidesMessages.xml" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuide.csproj.user
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuide.csproj.user	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuide.csproj.user	(revision 22)
@@ -0,0 +1,5 @@
+﻿<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectView>ProjectFiles</ProjectView>
+  </PropertyGroup>
+</Project>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuide.sln
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuide.sln	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuide.sln	(revision 22)
@@ -0,0 +1,26 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UEUserGuide", "UEUserGuide.csproj", "{D0EB5D56-8500-46FF-BE2D-42303DC1E35F}"
+EndProject
+Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "UEUserGuideSetup", "Setup\UEUserGuide\UEUserGuideSetup.vdproj", "{177A6149-7383-4EA1-8C71-28E7BD16FA17}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{D0EB5D56-8500-46FF-BE2D-42303DC1E35F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D0EB5D56-8500-46FF-BE2D-42303DC1E35F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D0EB5D56-8500-46FF-BE2D-42303DC1E35F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D0EB5D56-8500-46FF-BE2D-42303DC1E35F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{177A6149-7383-4EA1-8C71-28E7BD16FA17}.Debug|Any CPU.ActiveCfg = Debug
+		{177A6149-7383-4EA1-8C71-28E7BD16FA17}.Debug|Any CPU.Build.0 = Debug
+		{177A6149-7383-4EA1-8C71-28E7BD16FA17}.Release|Any CPU.ActiveCfg = Release
+		{177A6149-7383-4EA1-8C71-28E7BD16FA17}.Release|Any CPU.Build.0 = Release
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuideFrm.Designer.cs
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuideFrm.Designer.cs	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuideFrm.Designer.cs	(revision 22)
@@ -0,0 +1,168 @@
+﻿namespace UEUserGuide
+{
+    partial class UEUserGuideFrm
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UEUserGuideFrm));
+            this._btReload = new System.Windows.Forms.Button();
+            this._btQuit = new System.Windows.Forms.Button();
+            this._btYes = new System.Windows.Forms.Button();
+            this._btNo = new System.Windows.Forms.Button();
+            this._btOK = new System.Windows.Forms.Button();
+            this._processNetworkClient = new System.ComponentModel.BackgroundWorker();
+            this._btFailed = new System.Windows.Forms.Button();
+            this._message = new System.Windows.Forms.RichTextBox();
+            this._btResetUI = new System.Windows.Forms.Button();
+            this._statusStrip = new System.Windows.Forms.StatusStrip();
+            this._serverParms = new System.Windows.Forms.ToolStripStatusLabel();
+            this._messagesFile = new System.Windows.Forms.ToolStripStatusLabel();
+            this._statusStrip.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // _btReload
+            // 
+            resources.ApplyResources(this._btReload, "_btReload");
+            this._btReload.Name = "_btReload";
+            this._btReload.UseVisualStyleBackColor = true;
+            this._btReload.Click += new System.EventHandler(this._btReload_Click);
+            // 
+            // _btQuit
+            // 
+            this._btQuit.DialogResult = System.Windows.Forms.DialogResult.OK;
+            resources.ApplyResources(this._btQuit, "_btQuit");
+            this._btQuit.Name = "_btQuit";
+            this._btQuit.UseVisualStyleBackColor = true;
+            this._btQuit.Click += new System.EventHandler(this._btQuit_Click);
+            // 
+            // _btYes
+            // 
+            resources.ApplyResources(this._btYes, "_btYes");
+            this._btYes.Name = "_btYes";
+            this._btYes.UseVisualStyleBackColor = true;
+            this._btYes.Click += new System.EventHandler(this._btYes_Click);
+            // 
+            // _btNo
+            // 
+            resources.ApplyResources(this._btNo, "_btNo");
+            this._btNo.Name = "_btNo";
+            this._btNo.UseVisualStyleBackColor = true;
+            this._btNo.Click += new System.EventHandler(this._btNo_Click);
+            // 
+            // _btOK
+            // 
+            resources.ApplyResources(this._btOK, "_btOK");
+            this._btOK.Name = "_btOK";
+            this._btOK.UseVisualStyleBackColor = true;
+            this._btOK.Click += new System.EventHandler(this._btOK_Click);
+            // 
+            // _processNetworkClient
+            // 
+            this._processNetworkClient.DoWork += new System.ComponentModel.DoWorkEventHandler(this._processNetworkClient_DoWork);
+            // 
+            // _btFailed
+            // 
+            resources.ApplyResources(this._btFailed, "_btFailed");
+            this._btFailed.Name = "_btFailed";
+            this._btFailed.UseVisualStyleBackColor = true;
+            this._btFailed.Click += new System.EventHandler(this._btFailed_Click);
+            // 
+            // _message
+            // 
+            this._message.AcceptsTab = true;
+            this._message.DetectUrls = false;
+            resources.ApplyResources(this._message, "_message");
+            this._message.Name = "_message";
+            this._message.ReadOnly = true;
+            // 
+            // _btResetUI
+            // 
+            resources.ApplyResources(this._btResetUI, "_btResetUI");
+            this._btResetUI.Name = "_btResetUI";
+            this._btResetUI.UseVisualStyleBackColor = true;
+            this._btResetUI.Click += new System.EventHandler(this._btResetUI_Click);
+            // 
+            // _statusStrip
+            // 
+            this._statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this._serverParms,
+            this._messagesFile});
+            resources.ApplyResources(this._statusStrip, "_statusStrip");
+            this._statusStrip.Name = "_statusStrip";
+            // 
+            // _serverParms
+            // 
+            this._serverParms.Name = "_serverParms";
+            resources.ApplyResources(this._serverParms, "_serverParms");
+            // 
+            // _messagesFile
+            // 
+            this._messagesFile.Name = "_messagesFile";
+            resources.ApplyResources(this._messagesFile, "_messagesFile");
+            // 
+            // UEUserGuideFrm
+            // 
+            resources.ApplyResources(this, "$this");
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.CancelButton = this._btQuit;
+            this.Controls.Add(this._statusStrip);
+            this.Controls.Add(this._btResetUI);
+            this.Controls.Add(this._message);
+            this.Controls.Add(this._btFailed);
+            this.Controls.Add(this._btOK);
+            this.Controls.Add(this._btNo);
+            this.Controls.Add(this._btYes);
+            this.Controls.Add(this._btQuit);
+            this.Controls.Add(this._btReload);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
+            this.MaximizeBox = false;
+            this.Name = "UEUserGuideFrm";
+            this.Load += new System.EventHandler(this.UEUserGuideFrm_Load);
+            this._statusStrip.ResumeLayout(false);
+            this._statusStrip.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Button _btReload;
+        private System.Windows.Forms.Button _btQuit;
+        private System.Windows.Forms.Button _btYes;
+        private System.Windows.Forms.Button _btNo;
+        private System.Windows.Forms.Button _btOK;
+        private System.ComponentModel.BackgroundWorker _processNetworkClient;
+        private System.Windows.Forms.Button _btFailed;
+        private System.Windows.Forms.RichTextBox _message;
+        private System.Windows.Forms.Button _btResetUI;
+        private System.Windows.Forms.StatusStrip _statusStrip;
+        private System.Windows.Forms.ToolStripStatusLabel _serverParms;
+        private System.Windows.Forms.ToolStripStatusLabel _messagesFile;
+    }
+}
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuideFrm.cs
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuideFrm.cs	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuideFrm.cs	(revision 22)
@@ -0,0 +1,542 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Configuration;
+using System.Xml;
+
+namespace UEUserGuide
+{
+    public partial class UEUserGuideFrm : Form
+    {
+        ///////////////////////////////////////////////////////////////////////
+        #region Delegates
+
+        public delegate void UpdateUICallBack(string trigger, IList<string> paramsList);
+
+        #endregion Delegates
+
+        ///////////////////////////////////////////////////////////////////////
+        #region Internal fields
+
+        ///////////////////////////////////////////////////////////////////////
+        #region Application settings
+
+        /// <summary>
+        /// IP address.
+        /// </summary>
+        private string _address;
+
+        /// <summary>
+        /// IP port.
+        /// </summary>
+        private int _port = -1;
+
+        /// <summary>
+        /// IP address.
+        /// </summary>
+        private Uri _messagesFilePath;
+
+        #endregion Application settings
+
+        ///////////////////////////////////////////////////////////////////////
+        #region Network part
+
+        /// <summary>
+        /// Server instance.
+        /// </summary>
+        private NetworkHelper _server = null;
+
+        /// <summary>
+        /// Event set to terminate the background thread.
+        /// </summary>
+        System.Threading.ManualResetEvent _terminated;
+
+        #endregion Network part
+
+        /// User guides messages values list.
+        /// </summary>
+        private IDictionary<string, MessageParms> _parms;
+
+        /// <summary>
+        /// Event set when user action is achieved.
+        /// </summary>
+        private System.Threading.ManualResetEvent _userActionCompleted;
+
+        private DialogResult _userResponse;
+
+        #endregion Internal fields
+
+        ///////////////////////////////////////////////////////////////////////
+        #region ctors
+
+        /// <summary>
+        /// Default ctor.
+        /// </summary>
+        public UEUserGuideFrm()
+        {
+            // Initialize logger.
+            Logger.Instance.Initialize("UEUserGuide");
+
+            _userActionCompleted = new System.Threading.ManualResetEvent(false);
+
+            InitializeComponent();
+        }
+
+        #endregion ctors
+
+        private void UEUserGuideFrm_Load(object sender, EventArgs e)
+        {
+            // Set UI state.
+            ResetUI();
+
+            // Load application settings.
+            try
+            {
+                Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
+                AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
+                _address = appSettings.Settings["IpAddress"].Value;
+                _port = int.Parse(appSettings.Settings["IpPort"].Value);
+                _messagesFilePath = new Uri(appSettings.Settings["MessagesFile"].Value);
+                Text = appSettings.Settings["Title"].Value;
+                // Sanity check.
+                if (!System.IO.File.Exists(_messagesFilePath.LocalPath))
+                {
+                    throw new System.IO.FileNotFoundException(_messagesFilePath.LocalPath);
+                }
+            }
+            catch (Exception x)
+            {
+                MessageBox.Show(
+                    string.Format("Failed to load application settings.\r\n{0}", x), 
+                    this.Text, 
+                    MessageBoxButtons.OK, 
+                    MessageBoxIcon.Error);
+                Close();
+                return;
+            }
+
+            // Load message database.
+            ReloadParameters();
+            if ((_parms == null) || (_parms.Count == 0))
+            {
+                MessageBox.Show("Invalid content of 'UserGuidesMessages.xml' file", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+                Close();
+                return;
+            }
+
+            // Start TCP/IP listener.
+            try
+            {
+                _server = new NetworkHelper();
+                if (!_server.Initialize(_address, _port))
+                {
+                    MessageBox.Show("Failed to initialize networl communications", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+                    Close();
+                    return;
+                }
+                _serverParms.Text = string.Format("Listen on {0}:{1}", _address, _port);
+                _server.Start();
+            }
+            catch (Exception x)
+            {
+                MessageBox.Show(
+                    string.Format("Failed to start listener, please check IP address/port number information in application cconfiguration file.\r\n{0}", x), 
+                    this.Text, 
+                    MessageBoxButtons.OK, 
+                    MessageBoxIcon.Error);
+                Close();
+                return;
+            }
+
+            _terminated = new System.Threading.ManualResetEvent(false);
+            _processNetworkClient.RunWorkerAsync();
+
+            _btReload.Visible = true;
+
+            _messagesFile.Text = _messagesFilePath.LocalPath;
+        }
+
+        private void _btReload_Click(object sender, EventArgs e)
+        {
+            ReloadParameters();
+            ResetUI();
+        }
+
+        private void _btOK_Click(object sender, EventArgs e)
+        {
+            _btOK.Enabled = false;
+            _btFailed.Enabled = false;
+            _userResponse = DialogResult.OK;
+            _userActionCompleted.Set();
+        }
+
+        private void _btYes_Click(object sender, EventArgs e)
+        {
+            _btYes.Enabled = false;
+            _btNo.Enabled = false;
+            _userResponse = DialogResult.Yes;
+            _userActionCompleted.Set();
+        }
+
+        private void _btNo_Click(object sender, EventArgs e)
+        {
+            _btYes.Enabled = false;
+            _btNo.Enabled = false;
+            _userResponse = DialogResult.No;
+            _userActionCompleted.Set();
+        }
+
+        private void _btFailed_Click(object sender, EventArgs e)
+        {
+            _btOK.Enabled = false;
+            _btFailed.Enabled = false;
+            _userResponse = DialogResult.Cancel;
+            _userActionCompleted.Set();
+        }
+
+        private void _btResetUI_Click(object sender, EventArgs e)
+        {
+            ResetUI();
+        }
+
+        private void _btQuit_Click(object sender, EventArgs e)
+        {
+            _userActionCompleted.Set();
+
+            // Stop TCP/IP listener.
+            if (_server != null)
+            {
+                _server.Stop();
+                _server = null;
+            }
+
+            // Terminate application.
+            Close();
+        }
+
+
+        /// <summary>
+        /// Method called to relaod User guides messages.
+        /// </summary>
+        public void ReloadParameters()
+        {
+            XmlDocument parmsDoc = new XmlDocument();
+            parmsDoc.Load(_messagesFilePath.LocalPath);
+            // Get the strategy to use.
+            XmlNodeList nodes = parmsDoc.SelectNodes("descendant::UserGuideMessages/Strategies").Item(0).ChildNodes;
+            string strategy = null;
+            foreach (XmlNode node in nodes)
+            {
+                if ((node.Attributes != null) && (node.Attributes.Count != 0) && !string.IsNullOrEmpty(node.Attributes[0].Value))
+                {
+                    strategy = node.Attributes[0].Value;
+                    break;
+                }
+            }
+            if (!string.IsNullOrEmpty(strategy))
+            {
+                // Apply the strategy.
+                nodes = parmsDoc.SelectNodes(string.Format("descendant::UserGuideMessages/{0}", strategy)).Item(0).ChildNodes;
+                if ((nodes == null) || (nodes.Count == 0))
+                {
+                    // The response is empty.
+                    _parms = null;
+                }
+                else
+                {
+                    _parms = new Dictionary<string, MessageParms>();
+                    foreach (XmlNode item in nodes)
+                    {
+                        if ((item.NodeType == XmlNodeType.Comment) || (item.Attributes == null) || (item.Attributes.Count != 2))
+                        {
+                            // TODO: Add logs.
+                            continue;
+                        }
+                        _parms.Add(item.Name, new MessageParms(item.Attributes.GetNamedItem("Text").Value.Replace("\\n", System.Environment.NewLine).Replace("\\t", "    "), item.Attributes.GetNamedItem("Actions").Value));
+                    }
+                    if (_parms.Count == 0)
+                    {
+                        _parms = null;
+                    }
+                }
+            }
+            else
+            {
+                _parms = null;
+            }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void _processNetworkClient_DoWork(object sender, DoWorkEventArgs e)
+        {
+            try
+            {
+                // Enter the listening loop.
+                while (!_terminated.WaitOne(5, false))
+                {
+                    if (Logger.Instance.IsDebugLevelSet) Logger.Instance.DebugLogger("_processNetworkClient_DoWork: Waiting for a connection...");
+                    // Perform a blocking call to accept requests.
+                    NetworkHelper client = _server.AcceptClient();
+                    System.Threading.ThreadPool.QueueUserWorkItem(ProcessNewConnection, new ProcessNewConnectionArgs(client));
+                }
+            }
+            catch (System.Net.Sockets.SocketException s)
+            {
+                Logger.Instance.ErrorLogger("_processNetworkClient_DoWork: {0}", s);
+            }
+
+            e.Result = (object)true;
+            if (Logger.Instance.IsInfoLevelSet) Logger.Instance.InfoLogger("_processNetworkClient_DoWork: Terminated.");
+        }
+
+        /// <summary>
+        /// Process the new accepted connection.
+        /// </summary>
+        /// <param name="parms">Connection instance.</param>
+        private void ProcessNewConnection(object parms)
+        {
+            // Sanity check.
+            if (!(parms is ProcessNewConnectionArgs))
+            {
+                Logger.Instance.ErrorLogger("ProcessNewConnection: Wrong parameters.");
+                return;
+            }
+            ProcessNewConnectionArgs args = parms as ProcessNewConnectionArgs;
+
+            if (Logger.Instance.IsDebugLevelSet) Logger.Instance.DebugLogger("ProcessNewConnection: Connected.");
+
+            try
+            {
+                // Buffer for reading data.
+                string readBytes;
+                // Read data.
+                int length = args.Client.Receive(out readBytes);
+                byte[] buffer = System.Text.Encoding.ASCII.GetBytes(readBytes.ToCharArray(), 0, length);
+                if (length == -1)
+                {
+                    // Exit loop.
+                    Logger.Instance.ErrorLogger("ProcessNewConnection: Receive datas failed.");
+                }
+                else if (length != 0)
+                {
+                    if (Logger.Instance.IsDebugLevelSet) Logger.Instance.DebugLogger("ProcessNewConnection: Receive datas ({0}).", length);
+                    // Convert byte into string.
+                    int index = 0;
+                    // Get ID
+                    int id = BitConverter.ToInt16(buffer, index);
+                    index += sizeof(short);
+                    // Decode full length.
+                    int totalLength = BitConverter.ToInt16(buffer, index);
+                    index += sizeof(int);
+                    // Decode the trigger command.
+                    length = BitConverter.ToInt32(buffer, index); // Decode length;
+                    index += sizeof(int);
+                    string trigger = Encoding.ASCII.GetString(buffer, index, length); // Decode datas.
+                    index += trigger.Length;
+                    // Decode the parameters.
+                    int paramsNum = BitConverter.ToInt32(buffer, index); // Decode length;
+                    index += sizeof(int);
+                    // Read the parameters.
+                    IList<string> parmsList = new List<string>();
+                    for (int i = 0; i < paramsNum; i++)
+                    {
+                        length = BitConverter.ToInt32(buffer, index); // Decode length;
+                        index += sizeof(int);
+                        string str = Encoding.ASCII.GetString(buffer, index, length); // Decode datas.
+                        index += str.Length;
+                        parmsList.Add(str);
+                    }
+                    if (!string.IsNullOrEmpty(trigger))
+                    {
+                        // Update UI in multi-threaded mode.
+                        IAsyncResult result = this.BeginInvoke(new UpdateUICallBack(UpdateUI), trigger, parmsList);
+                        // Wait for the WaitHandle to become signaled.
+                        result.AsyncWaitHandle.WaitOne();
+                        // Wait for user action done.
+                        _userActionCompleted.WaitOne(30000);
+                    }
+                    else
+                    {
+                        _userResponse = DialogResult.Cancel;
+                    }
+                    // Send response message
+                    byte[] response = new byte[1] { (byte)_userResponse };
+                    args.Client.Send(BitConverter.ToString(response));
+                    // Wait for disconnection
+                    args.Client.Receive(out buffer);
+                }
+            }
+            catch (Exception x)
+            {
+                Logger.Instance.ErrorLogger("ProcessNewConnection: {0}", x);
+            }
+            finally
+            {
+                // Shutdown and end connection.
+                if (Logger.Instance.IsDebugLevelSet) Logger.Instance.DebugLogger("ProcessNewConnection: Close connection.");
+                args.Client.Close();
+            }
+        }
+
+        private void UpdateUI(string trigger, IList<string> paramsList)
+        {
+            _message.Focus();
+            _userActionCompleted.Reset();
+            string action = "OkCancel";
+            if (_parms.ContainsKey(trigger))
+            {
+                string message = _parms[trigger].Text;
+                if (!((paramsList.Count == 0) || ((paramsList.Count == 1) && (paramsList[0] == "*"))))
+                {
+                    message += "\n\tParameters:\n";
+                    foreach (string item in paramsList)
+                    {
+                        message += string.Format("\t\t{0}\n", item);
+                    }
+                }
+                _message.Text = message;
+                action = _parms[trigger].Action;
+            }
+            else
+            {
+                _message.Text = trigger;
+            }
+            switch (action)
+            {
+                case "OkCancel":
+                    _btOK.Enabled = true;
+                    _btOK.Visible = true;
+                    _btFailed.Visible = true;
+                    _btFailed.Enabled = true;
+                    _btYes.Visible = false;
+                    _btNo.Visible = false;
+                    break;
+                case "YesNo":
+                    _btOK.Visible = false;
+                    _btFailed.Visible = false;
+                    _btYes.Visible = true;
+                    _btYes.Enabled = true;
+                    _btNo.Visible = true;
+                    _btNo.Enabled = true;
+                    break;
+                default:
+                    ResetUI();
+                    break;
+            }
+        }
+
+        private void ResetUI()
+        {
+            _message.Text = "";
+            _message.Lines = null;
+            _btOK.Visible = false;
+            _btFailed.Visible = false;
+            _btYes.Visible = false;
+            _btNo.Visible = false;
+            _btOK.Enabled = true;
+            _btFailed.Enabled = true;
+            _btYes.Enabled = true;
+            _btNo.Enabled = true;
+        }
+    }
+
+    ///////////////////////////////////////////////////////////////////////
+    #region Class helpers part
+
+    /// <summary>
+    /// This class describes the user guides messages associated to each trigger.
+    /// </summary>
+    class MessageParms
+    {
+        ///////////////////////////////////////////////////////////////////////
+        #region Internal part
+
+        /// <summary>
+        /// Parameter type.
+        /// </summary>
+        private string _text;
+
+        /// <summary>
+        /// Parameter value.
+        /// </summary>
+        private string _action;
+
+        #endregion Internal part
+
+        ///////////////////////////////////////////////////////////////////////
+        #region Accessors part
+
+        /// <summary>
+        /// Gets the parameter type.
+        /// </summary>
+        public string Text { get { return _text; } }
+
+        /// <summary>
+        /// Gets the parameter value.
+        /// </summary>
+        public string Action { get { return _action; } }
+
+        #endregion Accessors part
+
+        ///////////////////////////////////////////////////////////////////////
+        #region Ctors part
+
+        /// <summary>
+        /// Default ctor.
+        /// </summary>
+        public MessageParms()
+        {
+            _text = null;
+            _action = null;
+        }
+
+        /// <summary>
+        /// Builder ctor.
+        /// </summary>
+        /// <param name="text"></param>
+        /// <param name="action"></param>
+        public MessageParms(string text, string action)
+        {
+            _text = text;
+            _action = action;
+        }
+
+        #endregion Ctors part
+    }
+
+    /// <summary>
+    /// Internal class helper.
+    /// </summary>
+    class ProcessNewConnectionArgs
+    {
+        /// <summary>
+        /// New accepted connection reference.
+        /// </summary>
+        private NetworkHelper _client;
+        /// <summary>
+        /// Gets the new accepted connection reference.
+        /// </summary>
+        public NetworkHelper Client { get { return _client; } }
+
+        /// <summary>
+        /// Builder ctor.
+        /// </summary>
+        /// <param name="client">New accepted connection reference.</param>
+        public ProcessNewConnectionArgs(NetworkHelper client)
+        {
+            _client = client;
+        }
+    }
+
+    #endregion Class helpers part
+
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuideFrm.en.resx
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuideFrm.en.resx	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuideFrm.en.resx	(revision 22)
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="_btQuit.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Bottom, Right</value>
+  </data>
+  <data name="_btQuit.Text" xml:space="preserve">
+    <value>Quit</value>
+  </data>
+</root>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuideFrm.resx
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuideFrm.resx	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UEUserGuideFrm.resx	(revision 22)
@@ -0,0 +1,414 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="_btReload.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Right</value>
+  </data>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="_btReload.Location" type="System.Drawing.Point, System.Drawing">
+    <value>376, 12</value>
+  </data>
+  <data name="_btReload.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 50</value>
+  </data>
+  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="_btReload.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="_btReload.Text" xml:space="preserve">
+    <value>Reload messages base</value>
+  </data>
+  <data name="&gt;&gt;_btReload.Name" xml:space="preserve">
+    <value>_btReload</value>
+  </data>
+  <data name="&gt;&gt;_btReload.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;_btReload.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;_btReload.ZOrder" xml:space="preserve">
+    <value>8</value>
+  </data>
+  <data name="_btQuit.Location" type="System.Drawing.Point, System.Drawing">
+    <value>376, 227</value>
+  </data>
+  <data name="_btQuit.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <data name="_btQuit.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="_btQuit.Text" xml:space="preserve">
+    <value>Quit</value>
+  </data>
+  <data name="&gt;&gt;_btQuit.Name" xml:space="preserve">
+    <value>_btQuit</value>
+  </data>
+  <data name="&gt;&gt;_btQuit.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;_btQuit.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;_btQuit.ZOrder" xml:space="preserve">
+    <value>7</value>
+  </data>
+  <data name="_btYes.Location" type="System.Drawing.Point, System.Drawing">
+    <value>110, 265</value>
+  </data>
+  <data name="_btYes.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <data name="_btYes.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="_btYes.Text" xml:space="preserve">
+    <value>Yes</value>
+  </data>
+  <data name="&gt;&gt;_btYes.Name" xml:space="preserve">
+    <value>_btYes</value>
+  </data>
+  <data name="&gt;&gt;_btYes.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;_btYes.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;_btYes.ZOrder" xml:space="preserve">
+    <value>6</value>
+  </data>
+  <data name="_btNo.Location" type="System.Drawing.Point, System.Drawing">
+    <value>192, 265</value>
+  </data>
+  <data name="_btNo.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <data name="_btNo.TabIndex" type="System.Int32, mscorlib">
+    <value>5</value>
+  </data>
+  <data name="_btNo.Text" xml:space="preserve">
+    <value>No</value>
+  </data>
+  <data name="&gt;&gt;_btNo.Name" xml:space="preserve">
+    <value>_btNo</value>
+  </data>
+  <data name="&gt;&gt;_btNo.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;_btNo.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;_btNo.ZOrder" xml:space="preserve">
+    <value>5</value>
+  </data>
+  <data name="_btOK.Location" type="System.Drawing.Point, System.Drawing">
+    <value>110, 265</value>
+  </data>
+  <data name="_btOK.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <data name="_btOK.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="_btOK.Text" xml:space="preserve">
+    <value>OK</value>
+  </data>
+  <data name="&gt;&gt;_btOK.Name" xml:space="preserve">
+    <value>_btOK</value>
+  </data>
+  <data name="&gt;&gt;_btOK.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;_btOK.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;_btOK.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <metadata name="_processNetworkClient.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="_btFailed.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="_btFailed.Location" type="System.Drawing.Point, System.Drawing">
+    <value>191, 265</value>
+  </data>
+  <data name="_btFailed.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <data name="_btFailed.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="_btFailed.Text" xml:space="preserve">
+    <value>Failed</value>
+  </data>
+  <data name="&gt;&gt;_btFailed.Name" xml:space="preserve">
+    <value>_btFailed</value>
+  </data>
+  <data name="&gt;&gt;_btFailed.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;_btFailed.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;_btFailed.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="_message.Location" type="System.Drawing.Point, System.Drawing">
+    <value>12, 12</value>
+  </data>
+  <data name="_message.MaxLength" type="System.Int32, mscorlib">
+    <value>65535</value>
+  </data>
+  <data name="_message.Size" type="System.Drawing.Size, System.Drawing">
+    <value>344, 238</value>
+  </data>
+  <data name="_message.TabIndex" type="System.Int32, mscorlib">
+    <value>8</value>
+  </data>
+  <data name="_message.Text" xml:space="preserve">
+    <value />
+  </data>
+  <data name="&gt;&gt;_message.Name" xml:space="preserve">
+    <value>_message</value>
+  </data>
+  <data name="&gt;&gt;_message.Type" xml:space="preserve">
+    <value>System.Windows.Forms.RichTextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;_message.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;_message.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="_btResetUI.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="_btResetUI.Location" type="System.Drawing.Point, System.Drawing">
+    <value>376, 68</value>
+  </data>
+  <data name="_btResetUI.Size" type="System.Drawing.Size, System.Drawing">
+    <value>75, 23</value>
+  </data>
+  <data name="_btResetUI.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="_btResetUI.Text" xml:space="preserve">
+    <value>Reset UI</value>
+  </data>
+  <data name="&gt;&gt;_btResetUI.Name" xml:space="preserve">
+    <value>_btResetUI</value>
+  </data>
+  <data name="&gt;&gt;_btResetUI.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;_btResetUI.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;_btResetUI.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <metadata name="_statusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>182, 17</value>
+  </metadata>
+  <data name="_serverParms.Size" type="System.Drawing.Size, System.Drawing">
+    <value>129, 17</value>
+  </data>
+  <data name="_serverParms.Text" xml:space="preserve">
+    <value>Listen on 127.0.0.1:6610</value>
+  </data>
+  <data name="_serverParms.ToolTipText" xml:space="preserve">
+    <value>Server information</value>
+  </data>
+  <data name="_messagesFile.Size" type="System.Drawing.Size, System.Drawing">
+    <value>46, 17</value>
+  </data>
+  <data name="_messagesFile.Text" xml:space="preserve">
+    <value>Path file</value>
+  </data>
+  <data name="_statusStrip.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 295</value>
+  </data>
+  <data name="_statusStrip.Size" type="System.Drawing.Size, System.Drawing">
+    <value>459, 22</value>
+  </data>
+  <data name="_statusStrip.TabIndex" type="System.Int32, mscorlib">
+    <value>9</value>
+  </data>
+  <data name="_statusStrip.Text" xml:space="preserve">
+    <value>statusStrip</value>
+  </data>
+  <data name="&gt;&gt;_statusStrip.Name" xml:space="preserve">
+    <value>_statusStrip</value>
+  </data>
+  <data name="&gt;&gt;_statusStrip.Type" xml:space="preserve">
+    <value>System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;_statusStrip.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;_statusStrip.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>38</value>
+  </metadata>
+  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
+    <value>6, 13</value>
+  </data>
+  <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
+    <value>459, 317</value>
+  </data>
+  <data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
+    <value>CenterScreen</value>
+  </data>
+  <data name="$this.Text" xml:space="preserve">
+    <value>EU User Guide </value>
+  </data>
+  <data name="&gt;&gt;_processNetworkClient.Name" xml:space="preserve">
+    <value>_processNetworkClient</value>
+  </data>
+  <data name="&gt;&gt;_processNetworkClient.Type" xml:space="preserve">
+    <value>System.ComponentModel.BackgroundWorker, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;_serverParms.Name" xml:space="preserve">
+    <value>_serverParms</value>
+  </data>
+  <data name="&gt;&gt;_serverParms.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;_messagesFile.Name" xml:space="preserve">
+    <value>_messagesFile</value>
+  </data>
+  <data name="&gt;&gt;_messagesFile.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">
+    <value>UEUserGuideFrm</value>
+  </data>
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+</root>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UserGuidesMessages.xml
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UserGuidesMessages.xml	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UEUserGuide/UserGuidesMessages.xml	(revision 22)
@@ -0,0 +1,17 @@
+﻿<?xml version="1.0" encoding="utf-8" ?>
+<!-- Define default values for TTCN scrpts. These values will override values defined in the TCs. -->
+<UserGuideMessages>
+  <Strategies>
+    <Strategy name="Lannion" />
+  </Strategies>
+  <Lannion>
+    <UE_REGISTRATION Text="Please register a SIP session" Actions="OkCancel" />
+    <UE_CHECK_IS_REGISTER Text="Please check that you are currently registered" Actions="OkCancel" />
+    <UE_CHECK_IS_NOT_REGISTERED Text="Please check that you are not currently registered" Actions="OkCancel" />
+    <UE_CHECK_CALL_IS_INITIALIZED Text="Please check that the call is in progress" Actions="OkCancel" />
+    <UE_CHECK_CALL_IS_ANSWERED Text="Please check that the call was answered" Actions="OkCancel" />
+    <UE_CHECK_CALL_IS_ENDED Text="Please check that the call was ended" Actions="OkCancel" />
+    <UE_CHECK_NEW_MEDIA_STREAM_IS_ADDED Text="Please click on button Yes if a new media stream was added, otherwise, click on No" Actions="YesNo" />
+    <UE_CHECK_NEW_MEDIA_STREAM_IS_REMOVED Text="Please click on button Yes if a new media stream was removed, otherwise, click on No" Actions="YesNo" />
+  </Lannion>
+</UserGuideMessages>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/Processor.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/Processor.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/Processor.cpp	(revision 22)
@@ -0,0 +1,108 @@
+#include "Processor.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+#include "TriggerCommandsGUI/TriggerCommands.h"
+#include "TriggerCommandsOffLine/TriggerCommands.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+Processor::Processor()
+{
+}
+
+Processor::~Processor()
+{
+  m_impl.reset();
+}
+
+void Processor::SetImplMode(TriggerCommandsStrategy::Strategies strategy)
+{
+  if (m_impl.get() == NULL)
+  {
+    if (strategy == TriggerCommandsStrategy::UEUserGuide)
+    {
+      Logger::Instance().LogInfo("Processor::SetImplMode: UEUserGuide");
+      m_impl.reset(new TriggerCommandsGUI::TriggerCommands);
+    }
+    else
+    {
+      Logger::Instance().LogInfo("Processor::SetImplMode: UEOffLine");
+      m_impl.reset(new TriggerCommandsOffLine::TriggerCommands);
+    }
+  }
+  else
+  {
+    Logger::Instance().LogInfo("Processor::SetImplMode: m_impl.get() is not NULL");
+  }
+}
+
+void Processor::SetEutIpInterface(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  stringstream ss;
+  ss << "Processor::SetEutIpInterface: " << eutIface.get()->Eut();
+  Logger::Instance().LogInfo(ss.str());
+  
+  m_impl.get()->SetEutIpInterface(eutIface);
+}
+
+int Processor::Process(const std::string &trigger, const std::vector<std::string> &parameterList)
+{
+  if (m_impl.get() != NULL)
+  {
+    return m_impl.get()->Process(trigger, parameterList);
+  }
+  else
+  {
+    Logger::Instance().LogError("Processor::Process: pointer uvalue is NULL");
+    return 1;
+  }
+}
+
+/*bool Processor::BeginProcess(const std::string &trigger, const std::vector<std::string> &parameterList)
+{
+  clog << "Processor::BeginProcess: " << trigger << endl;
+  
+  // Initialize internal fields.
+  m_trigger = trigger;
+  m_parameterList = parameterList;
+  clog << "Processor::BeginProcess: Internals: " << m_trigger << " - " << m_parameterList.size() << endl;
+  m_asyncProcessing = boost::shared_ptr<boost::thread>(new thread(&Processor::InvokeProcess));
+
+  return true;
+}
+
+bool Processor::ProcessCompleted()
+{
+  return false;
+}
+
+bool Processor::Wait(int timeout)
+{
+  if (timeout < 0)
+  {
+    m_asyncProcessing.get()->join();
+  }
+  else
+  {
+    // TODO: make a join with timeout
+  }
+
+  return true;
+}
+
+void Processor::InvokeProcess()
+{
+  //clog << "Processor::InvokeProcess: Internals: " << Processor::pThis->m_trigger << " - " << Processor::pThis->m_parameterList.size() << endl;
+  //Processor::pThis->m_impl.get()->ProcessTriggerCommand(Processor::pThis->m_trigger, Processor::pThis->m_parameterList);
+}*/
+
+} } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/Processor.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/Processor.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/Processor.h	(revision 22)
@@ -0,0 +1,74 @@
+#ifndef Processors_Processor_h
+#define Processors_Processor_h
+
+// Boost headers.
+#include <boost/scoped_ptr.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/thread/thread.hpp>
+#include <boost/thread/tss.hpp>
+// Standard headers.
+#include <string>
+
+#include "Processors/ProcessorsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+/*! Class Processor
+ * \brief This class implements the ProcessorsImpl interface which provides support for TriggerCommands message processing in local or remote mode.
+ */
+class Processor : public ProcessorsImpl
+{
+  //! Implementation of trigger command processing.
+  boost::scoped_ptr<Processors::TriggerCommandsStrategy> m_impl;
+  //! Asynchronous trigger command processing.
+  //boost::shared_ptr<boost::thread> m_asyncProcessing;
+  
+public:
+  //! Processor.
+  /*! Default ctor.
+   */
+  Processor();
+  //! ~Processor.
+  /*! Default dtor.
+   */
+  ~Processor();
+  
+public: // Public interface.
+  //! SetImplMode.
+  /*! Initialize the communication mode.
+   * @param strategy: .
+   */
+  void SetImplMode(TriggerCommandsStrategy::Strategies strategy);
+  //! SetEutIpInterface.
+  /*! Initialize the EUT IP interface.
+   * @param eutIface: .EUT IP interface.
+   */
+  void SetEutIpInterface(boost::shared_ptr<EutIPInterface> eutIface);
+  //! Process.
+  /*! Process the TriggerCommands message in synchronous mode.
+   * @param trigger: trigger command to execute
+   * @param params: Trigger parameters list
+   * @return FncRetCode value on success, -1 otherwise.
+   */
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  //! BeginProcess.
+  /*! Process the TriggerCommands message in asynchronous mode.
+   * @param trigger: trigger command to execute
+   * @param params: Trigger parameters list
+   * @return true on success, false otherwise.
+   */
+    /*
+  bool BeginProcess(const std::string &trigger, const std::vector<std::string> &parameterList);
+  bool ProcessCompleted();
+  bool Wait(int timeout);*/
+
+private:
+  //static void InvokeProcess();
+};
+
+} } // namespaces
+
+#endif // Processors_Processor_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/ProcessorsImpl.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/ProcessorsImpl.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/ProcessorsImpl.h	(revision 22)
@@ -0,0 +1,46 @@
+#ifndef Processors_ProcessorImpl_h
+#define Processors_ProcessorImpl_h
+
+// Boost headers.
+#include <boost/shared_ptr.hpp>
+// Standard headers.
+#include <iostream>
+#include <string>
+#include <vector>
+// Interface on Trigger commands processing.
+#include "Processors/TriggerCommandsStrategy.h"
+#include "Helper/GeneralConfigurationParams.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+/*! Interface ProcessorImpl
+ * \brief This interface provides support for TriggerCommands message processing in local or remote mode.
+ */
+class ProcessorsImpl
+{
+public: // Public interface.
+  //! SetImplMode.
+  /*! Initialize the communication mode.
+   * @param strategy: The staretgy to use.
+   */
+	virtual void SetImplMode(TriggerCommandsStrategy::Strategies strategy) {};
+  //! SetEutIpInterface.
+  /*! Initialize the EUT IP interface.
+   * @param eutIface: .EUT IP interface.
+   */
+  virtual void SetEutIpInterface(boost::shared_ptr<EutIPInterface> eutIface) {};
+ //! Process.
+  /*! Process the TriggerCommands message in synchronous mode.
+   * @param trigger: trigger command to execute
+   * @param params: Trigger parameters list
+   * @return FncRetCode value on success, -1 otherwise.
+   */
+  virtual int Process(const std::string &trigger, const std::vector<std::string> &parameterList) { return false; };
+};
+
+} } // namespaces
+
+#endif // Processors_ProcessorImpl_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/TriggerCommandsImpl.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/TriggerCommandsImpl.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/TriggerCommandsImpl.h	(revision 22)
@@ -0,0 +1,44 @@
+#ifndef Processors_TriggerCommandsImpl_h
+#define Processors_TriggerCommandsImpl_h
+
+#include <boost/shared_ptr.hpp>
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include "Helper/GeneralConfigurationParams.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+/*! Interface ITriggerCommandsImpl
+ * \brief This interface provides support for TriggerCommands message processing in local or remote mode.
+ * This is the entry point of the Chain of responsability pattern.
+ */
+class TriggerCommandsImpl
+{
+public: // Public interface.
+  //! SetEutIpInterface.
+  /*! Initialize the EUT IP interface.
+   * @param iface: .EUT IP interface.
+   */
+  virtual void SetEutIpInterface(boost::shared_ptr<EutIPInterface> iface) {};
+  //! Process.
+  /*! Process the Trigger command message.
+   * @param command: trigger command to execute
+   * @param params: Comand parameters
+   * @return FncRetCode value on success, -1 otherwise.
+   */
+  virtual int Process(const std::string &trigger, const std::vector<std::string> &parameterList) { return false; };
+  //! SetSuccessor.
+  /*! Process the TriggerCommands message. This is a 
+   * @param successor: Nest command to process
+   */
+  virtual void SetSuccessor(boost::shared_ptr<TriggerCommandsImpl> successor) { };
+};
+
+} } // namespaces
+
+#endif // Processors_TriggerCommandsImpl_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/TriggerCommandsStrategy.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/TriggerCommandsStrategy.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/Processors/TriggerCommandsStrategy.h	(revision 22)
@@ -0,0 +1,84 @@
+#ifndef Processors_TriggerCommandsStrategy_h
+#define Processors_TriggerCommandsStrategy_h
+
+#include <string>
+#include <vector>
+
+#include "Helper/GeneralConfigurationParams.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+/*! Class TriggerCommandsStrategy
+ * \brief .
+ */
+class TriggerCommandsStrategy
+{
+public:
+  TriggerCommandsStrategy() {};
+  virtual ~TriggerCommandsStrategy() {}
+public: // Public interface.
+  //! define the behavior of the human friendly application 'UEUserGuide'.
+  enum Strategies {
+    UEUserGuide, //! Human friendly application.
+    UEOffLine, //! Offline behavior.
+    UEError //! Unsupported strategies.
+  };
+  
+  enum UserActions {
+        // Summary:
+        //     Nothing is returned from the dialog box. This means that the modal dialog
+        //     continues running.
+        ButtonNone = 0,
+        //
+        // Summary:
+        //     The dialog box return value is OK (usually sent from a button labeled OK).
+        ButtonOk = 1,
+        //
+        // Summary:
+        //     The dialog box return value is Cancel (usually sent from a button labeled
+        //     Cancel).
+        ButtonCancel = 2,
+        //
+        // Summary:
+        //     The dialog box return value is Abort (usually sent from a button labeled
+        //     Abort).
+        ButtonAbort = 3,
+        //
+        // Summary:
+        //     The dialog box return value is Retry (usually sent from a button labeled
+        //     Retry).
+        ButtonRetry = 4,
+        //
+        // Summary:
+        //     The dialog box return value is Ignore (usually sent from a button labeled
+        //     Ignore).
+        ButtonIgnore = 5,
+        //
+        // Summary:
+        //     The dialog box return value is Yes (usually sent from a button labeled Yes).
+        ButtonYes = 6,
+        //
+        // Summary:
+        //     The dialog box return value is No (usually sent from a button labeled No).
+        ButtonNo = 7,
+  };
+  //! SetEutIpInterface.
+  /*! Initialize the EUT IP interface.
+   * @param iface: .EUT IP interface.
+   */
+  virtual void SetEutIpInterface(boost::shared_ptr<EutIPInterface> iface) {};
+  //! Process.
+  /*! Process the Trigger command message.
+   * @param command: trigger command to execute
+   * @param params: Comand parameters
+   * @return FncRetCode value on success, -1 otherwise.
+   */
+  virtual int Process(const std::string &trigger, const std::vector<std::string> &parameterList) { return -1; };
+};
+
+} } // namespaces
+
+#endif // Processors_TriggerCommandsStrategy_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsAnswered.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsAnswered.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsAnswered.cpp	(revision 22)
@@ -0,0 +1,71 @@
+#include "CheckCallIsAnswered.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+#include "UEUserGuideClient.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+string CheckCallIsAnswered::CheckCallIsAnsweredId = "UE_CHECK_CALL_IS_ANSWERED";
+
+CheckCallIsAnswered::CheckCallIsAnswered()
+{
+  m_successor.reset();
+}
+
+CheckCallIsAnswered::CheckCallIsAnswered(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  CheckCallIsAnswered();
+  m_eutIface = eutIface;
+}
+
+CheckCallIsAnswered::~CheckCallIsAnswered()
+{
+  Logger::Instance().LogInfo("CheckCallIsAnswered::~CheckCallIsAnswered");
+  m_successor.reset();
+}
+
+int CheckCallIsAnswered::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  
+  // Process the command.
+  if (trigger == CheckCallIsAnswered::CheckCallIsAnsweredId)
+  {
+    int result = UEUserGuideClient::Instance().SendCommand(m_eutIface, trigger, parameterList);
+    ss.str("");
+    ss << "CheckCallIsAnswered::Process: result=" << result;
+    Logger::Instance().LogDebug(ss.str());
+    if (result != 0)
+    {
+      // Processing failed.
+      return 1; // Error - See TTCN-3 FncRetCode 
+    }
+    
+    return 0/*result*/; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "CheckCallIsAnswered::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // Error - See TTCN-3 FncRetCode 
+}
+
+void CheckCallIsAnswered::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsAnswered.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsAnswered.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsAnswered.h	(revision 22)
@@ -0,0 +1,40 @@
+#ifndef TriggerCommandsGUI_CheckCallIsAnswered_h
+#define TriggerCommandsGUI_CheckCallIsAnswered_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+/*! Class CheckCallIsAnswered
+ * \brief This class provides processing for UE_CHECK_CALL_IS_ANSWERED Trigger command.
+ */
+class CheckCallIsAnswered : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string CheckCallIsAnsweredId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+  boost::shared_ptr<EutIPInterface> m_eutIface;
+  
+public:
+  CheckCallIsAnswered();
+  CheckCallIsAnswered(boost::shared_ptr<EutIPInterface> eutIface);
+  ~CheckCallIsAnswered();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsGUI_CheckCallIsAnswered_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsEnded.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsEnded.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsEnded.cpp	(revision 22)
@@ -0,0 +1,71 @@
+#include "CheckCallIsEnded.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+#include "UEUserGuideClient.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+string CheckCallIsEnded::CheckCallIsEndedId = "UE_CHECK_CALL_IS_ENDED";
+
+CheckCallIsEnded::CheckCallIsEnded()
+{
+	m_successor.reset();
+}
+
+CheckCallIsEnded::CheckCallIsEnded(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  CheckCallIsEnded();
+  m_eutIface = eutIface;
+}
+
+CheckCallIsEnded::~CheckCallIsEnded()
+{
+  Logger::Instance().LogInfo("CheckCallIsEnded::~CheckCallIsEnded");
+  m_successor.reset();
+}
+
+int CheckCallIsEnded::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  
+  // Process the command.
+  if (trigger == CheckCallIsEnded::CheckCallIsEndedId)
+  {
+    int result = UEUserGuideClient::Instance().SendCommand(m_eutIface, trigger, parameterList);
+    ss.str("");
+    ss << "CheckCallIsEnded::Process: result=" << result;
+    Logger::Instance().LogDebug(ss.str());
+    if (result != 0)
+    {
+      // Processing failed.
+      return 1; // Error - See TTCN-3 FncRetCode 
+    }
+    
+    return 0/*result*/; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "CheckCallIsEnded::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // Error - See TTCN-3 FncRetCode 
+}
+
+void CheckCallIsEnded::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsEnded.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsEnded.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsEnded.h	(revision 22)
@@ -0,0 +1,40 @@
+#ifndef TriggerCommandsGUI_CheckCallIsEnded_h
+#define TriggerCommandsGUI_CheckCallIsEnded_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+/*! Class CheckCallIsEnded
+ * \brief This class provides processing for UE_CHECK_CALL_IS_ENDED Trigger command.
+ */
+class CheckCallIsEnded : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string CheckCallIsEndedId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+  boost::shared_ptr<EutIPInterface> m_eutIface;
+  
+public:
+  CheckCallIsEnded();
+  CheckCallIsEnded(boost::shared_ptr<EutIPInterface> eutIface);
+  ~CheckCallIsEnded();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsGUI_CheckCallIsEnded_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsInitialized.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsInitialized.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsInitialized.cpp	(revision 22)
@@ -0,0 +1,71 @@
+#include "CheckCallIsInitialized.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+#include "UEUserGuideClient.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+string CheckCallIsInitialized::CheckCallIsInitializedId = "UE_CHECK_CALL_IS_INITIALIZED";
+
+CheckCallIsInitialized::CheckCallIsInitialized()
+{
+	m_successor.reset();
+}
+
+CheckCallIsInitialized::CheckCallIsInitialized(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  CheckCallIsInitialized();
+  m_eutIface = eutIface;
+}
+
+CheckCallIsInitialized::~CheckCallIsInitialized()
+{
+  Logger::Instance().LogInfo("CheckCallIsInitialized::~CheckCallIsInitialized");
+  m_successor.reset();
+}
+
+int CheckCallIsInitialized::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  
+  // Process the command.
+  if (trigger == CheckCallIsInitialized::CheckCallIsInitializedId)
+  {
+    int result = UEUserGuideClient::Instance().SendCommand(m_eutIface, trigger, parameterList);
+    ss.str("");
+    ss << "CheckCallIsInitialized::Process: result=" << result;
+    Logger::Instance().LogDebug(ss.str());
+    if (result != 0)
+    {
+      // Processing failed.
+      return 1; // Error - See TTCN-3 FncRetCode 
+    }
+    
+    return 0/*result*/; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "CheckCallIsInitialized::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // Error - See TTCN-3 FncRetCode 
+}
+
+void CheckCallIsInitialized::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsInitialized.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsInitialized.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckCallIsInitialized.h	(revision 22)
@@ -0,0 +1,40 @@
+#ifndef TriggerCommandsGUI_CheckCallIsInitialized_h
+#define TriggerCommandsGUI_CheckCallIsInitialized_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+/*! Class CheckCallIsInitialized
+ * \brief This class provides processing for UE_CHECK_CALL_IS_INITIALIZED Trigger command.
+ */
+class CheckCallIsInitialized : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string CheckCallIsInitializedId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+  boost::shared_ptr<EutIPInterface> m_eutIface;
+  
+public:
+  CheckCallIsInitialized();
+  CheckCallIsInitialized(boost::shared_ptr<EutIPInterface> eutIface);
+  ~CheckCallIsInitialized();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsGUI_CheckCallIsInitialized_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckIsNotRegistered.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckIsNotRegistered.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckIsNotRegistered.cpp	(revision 22)
@@ -0,0 +1,71 @@
+#include "CheckIsNotRegistered.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+#include "UEUserGuideClient.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+string CheckIsNotRegistered::CheckIsNotRegisteredId = "UE_CHECK_IS_NOT_REGISTERED";
+
+CheckIsNotRegistered::CheckIsNotRegistered()
+{
+  m_successor.reset();
+}
+
+CheckIsNotRegistered::CheckIsNotRegistered(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  CheckIsNotRegistered();
+  m_eutIface = eutIface;
+}
+
+CheckIsNotRegistered::~CheckIsNotRegistered()
+{
+  Logger::Instance().LogInfo("CheckIsNotRegistered::~CheckIsNotRegistered");
+  m_successor.reset();
+}
+
+int CheckIsNotRegistered::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  
+  // Process the command.
+  if (trigger == CheckIsNotRegistered::CheckIsNotRegisteredId)
+  {
+    int result = UEUserGuideClient::Instance().SendCommand(m_eutIface, trigger, parameterList);
+    ss.str("");
+    ss << "CheckIsNotRegistered::Process: result=" << result;
+    Logger::Instance().LogDebug(ss.str());
+    if (result != 0)
+    {
+      // Processing failed.
+      return 1; // Error - See TTCN-3 FncRetCode 
+    }
+    
+    return 0/*result*/; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "CheckIsNotRegistered::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // Error - See TTCN-3 FncRetCode 
+}
+
+void CheckIsNotRegistered::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckIsNotRegistered.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckIsNotRegistered.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckIsNotRegistered.h	(revision 22)
@@ -0,0 +1,40 @@
+#ifndef TriggerCommandsGUI_CheckIsNotRegistered_h
+#define TriggerCommandsGUI_CheckIsNotRegistered_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+/*! Class CheckIsNotRegistered
+ * \brief This class provides processing for UE_CHECK_CALL_IS_NOT_REGISTED Trigger command.
+ */
+class CheckIsNotRegistered : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string CheckIsNotRegisteredId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+  boost::shared_ptr<EutIPInterface> m_eutIface;
+  
+public:
+  CheckIsNotRegistered();
+  CheckIsNotRegistered(boost::shared_ptr<EutIPInterface> eutIface);
+  ~CheckIsNotRegistered();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsGUI_CheckIsNotRegistered_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckIsRegistered.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckIsRegistered.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckIsRegistered.cpp	(revision 22)
@@ -0,0 +1,71 @@
+#include "CheckIsRegistered.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+#include "UEUserGuideClient.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+string CheckIsRegistered::CheckIsRegisteredId = "UE_CHECK_IS_REGISTER";
+
+CheckIsRegistered::CheckIsRegistered()
+{
+  m_successor.reset();
+}
+
+CheckIsRegistered::CheckIsRegistered(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  CheckIsRegistered();
+  m_eutIface = eutIface;
+}
+
+CheckIsRegistered::~CheckIsRegistered()
+{
+  Logger::Instance().LogInfo("CheckIsRegistered::~CheckIsRegistered");
+  m_successor.reset();
+}
+
+int CheckIsRegistered::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  
+  // Process the command.
+  if (trigger == CheckIsRegistered::CheckIsRegisteredId)
+  {
+    int result = UEUserGuideClient::Instance().SendCommand(m_eutIface, trigger, parameterList);
+    ss.str("");
+    ss << "CheckIsRegistered::Process: result=" << result;
+    Logger::Instance().LogDebug(ss.str());
+    if (result != 0)
+    {
+      // Processing failed.
+      return 1; // Error - See TTCN-3 FncRetCode 
+    }
+    
+    return 0/*result*/; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "CheckIsRegistered::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // Error - See TTCN-3 FncRetCode 
+}
+
+void CheckIsRegistered::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckIsRegistered.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckIsRegistered.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckIsRegistered.h	(revision 22)
@@ -0,0 +1,40 @@
+#ifndef TriggerCommandsGUI_CheckIsRegistered_h
+#define TriggerCommandsGUI_CheckIsRegistered_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+/*! Class CheckIsRegistered
+ * \brief This class provides processing for UE_CHECK_CALL_IS_REGISTED Trigger command.
+ */
+class CheckIsRegistered : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string CheckIsRegisteredId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+  boost::shared_ptr<EutIPInterface> m_eutIface;
+  
+public:
+  CheckIsRegistered();
+  CheckIsRegistered(boost::shared_ptr<EutIPInterface> eutIface);
+  ~CheckIsRegistered();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsGUI_CheckIsRegistered_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckNewMediaAdded.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckNewMediaAdded.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckNewMediaAdded.cpp	(revision 22)
@@ -0,0 +1,72 @@
+#include "CheckNewMediaAdded.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+#include "UEUserGuideClient.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+string CheckNewMediaAdded::SendMessageId = "UE_CHECK_NEW_MEDIA_STREAM_IS_ADDED";
+
+CheckNewMediaAdded::CheckNewMediaAdded()
+{
+  m_successor.reset();
+}
+
+CheckNewMediaAdded::CheckNewMediaAdded(shared_ptr<EutIPInterface> eutIface)
+{
+  CheckNewMediaAdded();
+  m_eutIface = eutIface;
+}
+
+CheckNewMediaAdded::~CheckNewMediaAdded()
+{
+  Logger::Instance().LogInfo("CheckNewMediaAdded::~CheckNewMediaAdded");
+  m_successor.reset();
+}
+
+int CheckNewMediaAdded::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  
+  // Process the command.
+
+  if (trigger == CheckNewMediaAdded::SendMessageId)
+  {
+    int result = 0;//UEUserGuideClient::Instance().SendCommand(m_eutIface, trigger, parameterList);
+    ss.str("");
+    ss << "CheckNewMediaAdded::Process: result=" << result;
+    Logger::Instance().LogDebug(ss.str());
+    if (result != 0)
+    {
+      // Processing failed.
+      return 1; // Error - See TTCN-3 FncRetCode 
+    }
+    
+    return 0/*result*/; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "CheckNewMediaAdded::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // Error - See TTCN-3 FncRetCode 
+}
+
+void CheckNewMediaAdded::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckNewMediaAdded.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckNewMediaAdded.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckNewMediaAdded.h	(revision 22)
@@ -0,0 +1,40 @@
+#ifndef TriggerCommandsGUI_SendMessage_h
+#define TriggerCommandsGUI_SendMessage_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+/*! Class SendMessage
+ * \brief This class provides processing for UE_CHECK_NEW_MEDIA_STREAM_IS_ADDED Trigger command.
+ */
+class CheckNewMediaAdded : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string SendMessageId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+  boost::shared_ptr<EutIPInterface> m_eutIface;
+  
+public:
+  CheckNewMediaAdded();
+  CheckNewMediaAdded(boost::shared_ptr<EutIPInterface> eutIface);
+  ~CheckNewMediaAdded();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsGUI_SendMessage_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckNewMediaRemoved.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckNewMediaRemoved.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckNewMediaRemoved.cpp	(revision 22)
@@ -0,0 +1,71 @@
+#include "CheckNewMediaRemoved.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+#include "UEUserGuideClient.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+string CheckNewMediaRemoved::CheckNewMediaRemovedId = "UE_CHECK_NEW_MEDIA_STREAM_IS_REMOVED";
+
+CheckNewMediaRemoved::CheckNewMediaRemoved()
+{
+  m_successor.reset();
+}
+
+CheckNewMediaRemoved::CheckNewMediaRemoved(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  CheckNewMediaRemoved();
+  m_eutIface = eutIface;
+}
+
+CheckNewMediaRemoved::~CheckNewMediaRemoved()
+{
+  Logger::Instance().LogInfo("CheckNewMediaRemoved::~CheckNewMediaRemoved");
+  m_successor.reset();
+}
+
+int CheckNewMediaRemoved::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  
+  // Process the command.
+  if (trigger == CheckNewMediaRemoved::CheckNewMediaRemovedId)
+  {
+    int result = UEUserGuideClient::Instance().SendCommand(m_eutIface, trigger, parameterList);
+    ss.str("");
+    ss << "CheckNewMediaRemoved::Process: result=" << result;
+    Logger::Instance().LogDebug(ss.str());
+    if (result != 0)
+    {
+      // Processing failed.
+      return 1; // Error - See TTCN-3 FncRetCode 
+    }
+    
+    return 0/*result*/; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "CheckNewMediaRemoved::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // Error - See TTCN-3 FncRetCode 
+}
+
+void CheckNewMediaRemoved::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckNewMediaRemoved.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckNewMediaRemoved.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/CheckNewMediaRemoved.h	(revision 22)
@@ -0,0 +1,40 @@
+#ifndef TriggerCommandsGUI_CheckNewMediaRemoved_h
+#define TriggerCommandsGUI_CheckNewMediaRemoved_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+/*! Class CheckNewMediaRemoved
+ * \brief This class provides processing for UE_CHECK_NEW_MEDIA_STREAM_IS_REMOVED Trigger command.
+ */
+class CheckNewMediaRemoved : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string CheckNewMediaRemovedId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+  boost::shared_ptr<EutIPInterface> m_eutIface;
+  
+public:
+  CheckNewMediaRemoved();
+  CheckNewMediaRemoved(boost::shared_ptr<EutIPInterface> eutIface);
+  ~CheckNewMediaRemoved();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsGUI_CheckNewMediaRemoved_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/Default.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/Default.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/Default.cpp	(revision 22)
@@ -0,0 +1,51 @@
+#include "Default.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+#include "UEUserGuideClient.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+Default::Default()
+{
+}
+
+Default::Default(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  Default();
+  m_eutIface = eutIface;
+}
+
+Default::~Default()
+{
+  Logger::Instance().LogInfo("Default::~Default");
+}
+
+int Default::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  
+  // Process the command.
+  int result = UEUserGuideClient::Instance().SendCommand(m_eutIface, trigger, parameterList);
+  ss.str("");
+  ss << "Default::Process: result=" << result;
+  Logger::Instance().LogDebug(ss.str());
+  if (result != 0)
+  {
+    // Processing failed.
+    return 1; // Error - See TTCN-3 FncRetCode 
+  }
+  
+  return 0/*result*/; // See TTCN-3 FncRetCode 
+}
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/Default.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/Default.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/Default.h	(revision 22)
@@ -0,0 +1,36 @@
+#ifndef TriggerCommandsGUI_Default_h
+#define TriggerCommandsGUI_Default_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+/*! Class Default
+ * \brief This class provides processing for the default Trigger command behavior.
+ */
+class Default : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  boost::shared_ptr<EutIPInterface> m_eutIface;
+  
+public:
+  Default();
+  Default(boost::shared_ptr<EutIPInterface> eutIface);
+  ~Default();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor) { };
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsGUI_Default_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/Register.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/Register.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/Register.cpp	(revision 22)
@@ -0,0 +1,71 @@
+#include "Register.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+#include "UEUserGuideClient.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+string Register::RegisterId = "UE_REGISTRATION";
+
+Register::Register()
+{
+  m_successor.reset();
+}
+
+Register::Register(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  Register();
+  m_eutIface = eutIface;
+}
+
+Register::~Register()
+{
+  Logger::Instance().LogInfo("Register::~Register");
+  m_successor.reset();
+}
+
+int Register::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+
+  // Process the command.
+  if (trigger == Register::RegisterId)
+  {
+    int result = UEUserGuideClient::Instance().SendCommand(m_eutIface, trigger, parameterList);
+    ss.str("");
+    ss << "Register::Process: result=" << result;
+    Logger::Instance().LogDebug(ss.str());
+    if (result != 0)
+    {
+      // Processing failed.
+      return 1; // Error - See TTCN-3 FncRetCode 
+    }
+    
+    return 0/*result*/; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "Register::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // Error - See TTCN-3 FncRetCode 
+}
+
+void Register::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/Register.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/Register.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/Register.h	(revision 22)
@@ -0,0 +1,40 @@
+#ifndef TriggerCommandsGUI_Register_h
+#define TriggerCommandsGUI_Register_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+/*! Class Register
+ * \brief This class provides processing for REGISTER Trigger command.
+ */
+class Register : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string RegisterId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+  boost::shared_ptr<EutIPInterface> m_eutIface;
+  
+public:
+  Register();
+  Register(boost::shared_ptr<EutIPInterface> eutIface);
+  ~Register();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsGUI_Register_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/TriggerCommands.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/TriggerCommands.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/TriggerCommands.cpp	(revision 22)
@@ -0,0 +1,82 @@
+#include "TriggerCommands.h"
+#include <string>
+#include <vector>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+#include "Register.h"
+#include "CheckIsRegistered.h"
+#include "CheckIsNotRegistered.h"
+#include "CheckCallIsInitialized.h"
+#include "CheckCallIsAnswered.h"
+#include "CheckCallIsEnded.h"
+#include "CheckNewMediaAdded.h"
+#include "CheckNewMediaRemoved.h"
+#include "Default.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+TriggerCommands::TriggerCommands()
+{
+}
+
+TriggerCommands::~TriggerCommands()
+{
+  Logger::Instance().LogInfo("TriggerCommands::~TriggerCommands");
+  m_successor.reset();
+}
+
+void TriggerCommands::SetEutIpInterface(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  m_successor = shared_ptr<TriggerCommandsImpl>(new Register(eutIface)); // Register
+  shared_ptr<TriggerCommandsImpl> checkIsRegistered = shared_ptr<TriggerCommandsImpl>(new CheckIsRegistered(eutIface)); // CheckIsRegister
+  m_successor.get()->SetSuccessor(checkIsRegistered);
+  shared_ptr<TriggerCommandsImpl> checkIsNotRegistered = shared_ptr<TriggerCommandsImpl>(new CheckIsNotRegistered(eutIface)); // CheckIsNotRegister
+  checkIsRegistered.get()->SetSuccessor(checkIsNotRegistered);
+  shared_ptr<TriggerCommandsImpl> checkCallIsInitialized = shared_ptr<TriggerCommandsImpl>(new CheckCallIsInitialized(eutIface)); // CheckCallIsInitialized
+  checkIsNotRegistered.get()->SetSuccessor(checkCallIsInitialized);
+  shared_ptr<TriggerCommandsImpl> checkCallIsAnswered = shared_ptr<TriggerCommandsImpl>(new CheckCallIsAnswered(eutIface)); // CheckCallIsAnswered
+  checkCallIsInitialized.get()->SetSuccessor(checkCallIsAnswered);
+  shared_ptr<TriggerCommandsImpl> checkCallIsEnded = shared_ptr<TriggerCommandsImpl>(new CheckCallIsEnded(eutIface)); // CheckCallIsEnded
+  checkCallIsAnswered.get()->SetSuccessor(checkCallIsEnded);
+  shared_ptr<TriggerCommandsImpl> checkNewMediaAdded = shared_ptr<TriggerCommandsImpl>(new CheckNewMediaAdded(eutIface)); // CheckNewMediaAdded
+  checkCallIsEnded.get()->SetSuccessor(checkNewMediaAdded);
+  shared_ptr<TriggerCommandsImpl> checkNewMediaRemoved = shared_ptr<TriggerCommandsImpl>(new CheckNewMediaRemoved(eutIface)); // CheckNewMediaRemoved
+  checkNewMediaAdded.get()->SetSuccessor(checkNewMediaRemoved);
+  checkNewMediaRemoved.get()->SetSuccessor(shared_ptr<TriggerCommandsImpl>(new Default(eutIface)));
+
+  Logger::Instance().LogInfo("TriggerCommandsGUI::TriggerCommands::SetEutIpInterface: 9 commands created");
+}
+
+int TriggerCommands::Process(const string &trigger, const vector<string> &parameterList)
+{
+  // Sanity check,
+  if (trigger.length() == 0)
+  {
+    Logger::Instance().LogError("TriggerCommandsGUI::TriggerCommands::Process: trigger is empty.");
+
+    return 1; // See TTCN-3 FncRetCode 
+  }
+  if (m_successor.get() == NULL)
+  {
+    Logger::Instance().LogError("TriggerCommandsGUI::TriggerCommands::Process: Bad pointer allocation.");
+
+    return 1; // See TTCN-3 FncRetCode 
+  }
+
+  /*stringstream ss;
+  ss << "TriggerCommandsGUI::TriggerCommands::Process: start processing: " << trigger;
+  Logger::Instance().LogInfo(ss.str());*/
+  return m_successor.get()->Process(trigger, parameterList);
+}
+
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/TriggerCommands.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/TriggerCommands.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/TriggerCommands.h	(revision 22)
@@ -0,0 +1,43 @@
+#ifndef TriggerCommandsGUI_TriggerCommands_h
+#define TriggerCommandsGUI_TriggerCommands_h
+
+#include <boost/shared_ptr.hpp>
+
+#include "Processors/TriggerCommandsStrategy.h"
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+/*! Class TriggerCommands
+ * \brief This class provides access the the chain of responsability which process Trigger commands.
+ */
+class TriggerCommands : public TriggerCommandsStrategy
+{
+  boost::shared_ptr<Processors::TriggerCommandsImpl> m_successor;
+
+public:
+	TriggerCommands();
+	~TriggerCommands();
+	
+public: // Public interface.
+  //! SetEutIpInterface.
+  /*! Initialize the EUT IP interface.
+   * @param eutIface: .EUT IP interface.
+   */
+  void SetEutIpInterface(boost::shared_ptr<EutIPInterface> eutIface);
+  /*! Process the Trigger command message.
+   * @param command: trigger command to execute
+   * @param params: Comand parameters
+   * @return FncRetCode value on success, -1 otherwise.
+   */
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsGUI_TriggerCommands_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/UEUserGuideClient.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/UEUserGuideClient.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/UEUserGuideClient.cpp	(revision 22)
@@ -0,0 +1,67 @@
+#include "UEUserGuideClient.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+#include "Processors/TriggerCommandsStrategy.h"
+
+using namespace std;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+int UEUserGuideClient::SendCommand(boost::shared_ptr<EutIPInterface> eutIface, const std::string &trigger, const std::vector<std::string> &parameterList)
+{
+  stringstream ss;
+  ss << "UEUserGuideClient::SendCommand: " << trigger << " - " << eutIface.get()->Eut() << " - " << eutIface.get()->EutAddress() << " - " << eutIface.get()->EutPort();
+  Logger::Instance().LogInfo(ss.str());
+
+  // Encode the request.
+  UEUserGuideClientRequest req;
+  req.SetTriggerCommand(trigger, parameterList);
+  // Place the connection.
+  try
+  {
+    m_client = boost::shared_ptr<SocketClient>(new SocketClient(eutIface.get()->EutAddress(), eutIface.get()->EutPort()));
+    // Send message.
+    m_client.get()->Send(req.GetEncodedMessage(), req.GetEncodedDataLength());
+    // Wait the response.
+    char buffer[64] = {0};
+    int readBytes = m_client.get()->Receive(64, buffer);
+    ss.str("");
+    ss << "UEUserGuideClient::SendCommand: received " << readBytes << " bytes";
+    Logger::Instance().LogInfo(ss.str());
+    // Disconnect.
+    m_client.reset();
+  // Process the result.
+  if (readBytes != 2)
+  {
+    return -1;
+  }
+  
+    ss.str("");
+    ss << "UEUserGuideClient::SendCommand: return " << static_cast<int>((buffer[0] << 4) & 0xf0 | buffer[1] & 0x0f);
+    Logger::Instance().LogInfo(ss.str());
+    int result = 1;
+    switch (static_cast<int>((buffer[0] << 4) & 0xf0 | buffer[1] & 0x0f))
+    {
+      case TriggerCommandsStrategy::ButtonYes: // Button Yes
+      case TriggerCommandsStrategy::ButtonOk: // Button Ok
+        result = 0;
+        break;
+    }
+  
+    return result;
+  }
+  catch (string & e)
+  {
+    Logger::Instance().LogError(e);
+    return -1;
+  }
+}
+
+} } } // namespaces
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/UEUserGuideClient.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/UEUserGuideClient.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/UEUserGuideClient.h	(revision 22)
@@ -0,0 +1,53 @@
+/**
+ * @file UEUserGuideClient.h
+ * Provides a set of TTCN-3 recoder decoder  methods
+ * @author Yann garcia
+ * @version 1.0
+ * @date 20/07/2009
+ */
+
+#ifndef TriggerCommandsGUI_UEUserGuideClient
+#define TriggerCommandsGUI_UEUserGuideClient
+
+#include<boost/shared_ptr.hpp>
+#include <string>
+#include <vector>
+#include <iostream>
+#include <iomanip>
+
+#include "Helper/Singleton.h"
+#include "Helper/Socket.h"
+#include "Helper/GeneralConfigurationParams.h"
+
+#include "UEUserGuideClientMessages.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+/*! Class UEUserGuideClient
+ * \brief This class provides a set of convesion methods. It shall be used with Singleton class.
+ */
+class UEUserGuideClient : public Singleton<UEUserGuideClient>
+{
+private:
+  //! Singleton implementation
+  friend class Singleton<UEUserGuideClient>;
+  
+  //! Convertion map from char to int.
+  boost::shared_ptr<SocketClient> m_client;
+  
+  //! UEUserGuideClient.
+ /*! Default ctor.
+  */
+  UEUserGuideClient() { };
+
+public:
+  int SendCommand(boost::shared_ptr<EutIPInterface> eutIface, const std::string &trigger, const std::vector<std::string> &parameterList);
+};
+
+} } } // namespaces
+
+#endif //  TriggerCommandsGUI_UEUserGuideClient
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/UEUserGuideClientMessages.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/UEUserGuideClientMessages.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/UEUserGuideClientMessages.cpp	(revision 22)
@@ -0,0 +1,69 @@
+#include "UEUserGuideClientMessages.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+void UEUserGuideClientRequest::SetTriggerCommand(const std::string & sTrigger, const std::vector<std::string> & vsParamsList)
+{
+	DisposeEncodedData();
+	m_sTrigger = sTrigger;
+	m_vsParamsList = vsParamsList;
+}
+
+unsigned int UEUserGuideClientRequest::CalculateDataLength()
+{
+	int nLen = TrafficCaptureMessage::CalculateDataLength() +
+		CalculateStringLength(m_sTrigger) +
+		sizeof(unsigned int);
+	int nCount = m_vsParamsList.size();
+	for (int i = 0; i < nCount; ++i)
+		nLen += CalculateStringLength(m_vsParamsList[i]);
+	return nLen;
+}
+
+void UEUserGuideClientRequest::EncodePayload(unsigned int & nOffset)
+{
+	TrafficCaptureMessage::EncodePayload(nOffset);
+	EncodeString(m_sTrigger, nOffset);
+	unsigned int nCount = m_vsParamsList.size();
+	EncodeUInt(nCount, nOffset);
+	for (unsigned int i = 0; i < nCount; ++i)
+		EncodeString(m_vsParamsList[i], nOffset);
+}
+
+bool UEUserGuideClientRequest::DecodePayload(const char * pPayload, unsigned int nPayloadLength, 
+									  unsigned int & nOffset)
+{
+	if (!TrafficCaptureMessage::DecodePayload(pPayload, nPayloadLength, nOffset))
+		return false;
+	if (!DecodeString(m_sTrigger, pPayload, nPayloadLength, nOffset))
+		return false;
+	unsigned int nCount = 0;
+	if (!DecodeUInt(nCount, pPayload, nPayloadLength, nOffset))
+		return false;
+	m_vsParamsList.clear();
+	for (unsigned int i = 0; i < nCount; ++i)
+	{
+		m_vsParamsList.push_back("");
+		if (!DecodeString(m_vsParamsList[i], pPayload, nPayloadLength, nOffset))
+			return false;
+	}
+	return true;
+}
+
+void UEUserGuideClientReply::EncodePayload(unsigned int & nOffset)
+{
+	TrafficCaptureMessage::EncodePayload(nOffset);
+}
+
+bool UEUserGuideClientReply::DecodePayload(const char * pPayload, unsigned int nPayloadLength, unsigned int & nOffset)
+{
+	if (!TrafficCaptureMessage::DecodePayload(pPayload, nPayloadLength, nOffset))
+		return false;
+	return true;
+}
+
+} } } // namespaces
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/UEUserGuideClientMessages.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/UEUserGuideClientMessages.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsGUI/UEUserGuideClientMessages.h	(revision 22)
@@ -0,0 +1,62 @@
+/**
+ * @file UEUserGuideClientMessages.h
+ * This header file defines simple data message used in communication with the 
+ * .UEUserGuide application
+ * @author Yann Garcia
+ * @version 0.3
+ * @date 28/07/2009
+ */
+
+#ifndef TriggerCommandsGUI_UEUserGuideClientMessages
+#define TriggerCommandsGUI_UEUserGuideClientMessages
+
+#include "Messages/TrafficCaptureMessageId.h"
+#include "Messages/TrafficCaptureMessage.h"
+#include <vector>
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsGUI {
+  
+/**
+ * This class describes a merging request. This request is used for merging several pcap files
+ * into one. If the operation is successful, the path to the file containing merged data is
+ * returned by a subsequent response.
+ */
+class UEUserGuideClientRequest : public TrafficCaptureMessage
+{
+private:
+  std::string m_sTrigger;
+  std::vector<std::string> m_vsParamsList;
+protected:
+  virtual unsigned int CalculateDataLength();
+  virtual void EncodePayload(unsigned int & nOffset);
+  virtual bool DecodePayload(const char * pPayload, unsigned int nPayloadLength, unsigned int & nOffset);
+public:
+  UEUserGuideClientRequest() {}
+  virtual ~UEUserGuideClientRequest() {}
+  virtual unsigned short GetId() const { return 0x0001; }
+
+  void SetTriggerCommand(const std::string & sTrigger, const std::vector<std::string> & vsParamsList);
+};
+
+/**
+ * This class describes a reply to a merging request.
+ */
+class UEUserGuideClientReply : public CommonReplyMessage
+{
+protected:
+  virtual unsigned int CalculateDataLength();
+  virtual void EncodePayload(unsigned int & nOffset);
+  virtual bool DecodePayload(const char * pPayload, unsigned int nPayloadLength, unsigned int & nOffset);
+public:
+  UEUserGuideClientReply() {}
+  virtual ~UEUserGuideClientReply() {}
+  virtual unsigned short GetId() const { return 0x0002; }
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsGUI_UEUserGuideClientMessages
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsAnswered.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsAnswered.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsAnswered.cpp	(revision 22)
@@ -0,0 +1,54 @@
+#include "CheckCallIsAnswered.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+string CheckCallIsAnswered::CheckCallIsAnsweredId = "UE_CHECK_CALL_IS_ANSWERED";
+
+CheckCallIsAnswered::CheckCallIsAnswered()
+{
+	m_successor.reset();
+}
+
+CheckCallIsAnswered::~CheckCallIsAnswered()
+{
+  Logger::Instance().LogInfo("CheckCallIsAnswered::~CheckCallIsAnswered");
+  m_successor.reset();
+}
+
+int CheckCallIsAnswered::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  // Process the command.
+  if (trigger == CheckCallIsAnswered::CheckCallIsAnsweredId)
+  {
+    ss << "CheckCallIsAnswered::Process: " << trigger;
+    Logger::Instance().LogDebug(ss.str());
+    return 0; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "CheckCallIsAnswered::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // See TTCN-3 FncRetCode 
+}
+
+void CheckCallIsAnswered::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsAnswered.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsAnswered.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsAnswered.h	(revision 22)
@@ -0,0 +1,37 @@
+#ifndef TriggerCommandsOffLine_CheckCallIsAnswered_h
+#define TriggerCommandsOffLine_CheckCallIsAnswered_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+/*! Class CheckCallIsAnswered
+ * \brief This class provides processing for UE_CHECK_CALL_IS_ANSWERED Trigger command.
+ */
+class CheckCallIsAnswered : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string CheckCallIsAnsweredId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+public:
+  CheckCallIsAnswered();
+  ~CheckCallIsAnswered();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsOffLine_CheckCallIsAnswered_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsEnded.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsEnded.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsEnded.cpp	(revision 22)
@@ -0,0 +1,54 @@
+#include "CheckCallIsEnded.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+string CheckCallIsEnded::CheckCallIsEndedId = "UE_CHECK_CALL_IS_ENDED";
+
+CheckCallIsEnded::CheckCallIsEnded()
+{
+	m_successor.reset();
+}
+
+CheckCallIsEnded::~CheckCallIsEnded()
+{
+  Logger::Instance().LogInfo("CheckCallIsEnded::~CheckCallIsEnded");
+  m_successor.reset();
+}
+
+int CheckCallIsEnded::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  // Process the command.
+  if (trigger == CheckCallIsEnded::CheckCallIsEndedId)
+  {
+    ss << "CheckCallIsEnded::Process: " << trigger;
+    Logger::Instance().LogDebug(ss.str());
+    return 0; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "CheckCallIsEnded::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // See TTCN-3 FncRetCode 
+}
+
+void CheckCallIsEnded::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsEnded.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsEnded.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsEnded.h	(revision 22)
@@ -0,0 +1,37 @@
+#ifndef TriggerCommandsOffLine_CheckCallIsEnded_h
+#define TriggerCommandsOffLine_CheckCallIsEnded_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+/*! Class CheckCallIsEnded
+ * \brief This class provides processing for UE_CHECK_CALL_IS_ENDED Trigger command.
+ */
+class CheckCallIsEnded : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string CheckCallIsEndedId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+public:
+  CheckCallIsEnded();
+  ~CheckCallIsEnded();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsOffLine_CheckCallIsEnded_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsInitialized.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsInitialized.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsInitialized.cpp	(revision 22)
@@ -0,0 +1,61 @@
+#include "CheckCallIsInitialized.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+string CheckCallIsInitialized::CheckCallIsInitializedId = "UE_CHECK_CALL_IS_INITIALIZED";
+
+CheckCallIsInitialized::CheckCallIsInitialized()
+{
+  m_successor.reset();
+}
+
+CheckCallIsInitialized::CheckCallIsInitialized(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  CheckCallIsInitialized();
+  m_eutIface = eutIface;
+}
+
+CheckCallIsInitialized::~CheckCallIsInitialized()
+{
+  Logger::Instance().LogInfo("CheckCallIsInitialized::~CheckCallIsInitialized");
+  m_successor.reset();
+}
+
+int CheckCallIsInitialized::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  // Process the command.
+  if (trigger == CheckCallIsInitialized::CheckCallIsInitializedId)
+  {
+    ss << "CheckCallIsInitialized::Process: " << trigger;
+    Logger::Instance().LogDebug(ss.str());
+    
+    return 0; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "CheckCallIsInitialized::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // See TTCN-3 FncRetCode 
+}
+
+void CheckCallIsInitialized::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsInitialized.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsInitialized.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckCallIsInitialized.h	(revision 22)
@@ -0,0 +1,40 @@
+#ifndef TriggerCommandsOffLine_CheckCallIsInitialized_h
+#define TriggerCommandsOffLine_CheckCallIsInitialized_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+/*! Class CheckCallIsInitialized
+ * \brief This class provides processing for UE_CHECK_CALL_IS_INITIALIZED Trigger command.
+ */
+class CheckCallIsInitialized : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string CheckCallIsInitializedId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+  boost::shared_ptr<EutIPInterface> m_eutIface;
+  
+public:
+  CheckCallIsInitialized();
+  CheckCallIsInitialized(boost::shared_ptr<EutIPInterface> eutIface);
+  ~CheckCallIsInitialized();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsOffLine_CheckCallIsInitialized_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckIsNoRegistered.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckIsNoRegistered.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckIsNoRegistered.cpp	(revision 22)
@@ -0,0 +1,61 @@
+#include "CheckIsNotRegistered.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+string CheckIsNotRegistered::CheckIsNotRegisteredId = "UE_CHECK_IS_NOT_REGISTERED";
+
+CheckIsNotRegistered::CheckIsNotRegistered()
+{
+  m_successor.reset();
+}
+
+CheckIsNotRegistered::CheckIsNotRegistered(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  CheckIsNotRegistered();
+  m_eutIface = eutIface;
+}
+
+CheckIsNotRegistered::~CheckIsNotRegistered()
+{
+  Logger::Instance().LogInfo("CheckIsNotRegistered::~CheckIsNotRegistered");
+  m_successor.reset();
+}
+
+int CheckIsNotRegistered::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  // Process the command.
+  if (trigger == CheckIsNotRegistered::CheckIsNotRegisteredId)
+  {
+    ss << "CheckIsNotRegistered::Process: " << trigger;
+    Logger::Instance().LogDebug(ss.str());
+    
+    return 0; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "CheckIsNotRegistered::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // See TTCN-3 FncRetCode 
+}
+
+void CheckIsNotRegistered::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckIsNotRegistered.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckIsNotRegistered.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckIsNotRegistered.h	(revision 22)
@@ -0,0 +1,40 @@
+#ifndef TriggerCommandsOffLine_CheckIsNotRegistered_h
+#define TriggerCommandsOffLine_CheckIsNotRegistered_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+/*! Class CheckIsNotRegistered
+ * \brief This class provides processing for CHECK_IS_NOT_REGISTERED Trigger command.
+ */
+class CheckIsNotRegistered : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string CheckIsNotRegisteredId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+  boost::shared_ptr<EutIPInterface> m_eutIface;
+  
+public:
+  CheckIsNotRegistered();
+  CheckIsNotRegistered(boost::shared_ptr<EutIPInterface> eutIface);
+  ~CheckIsNotRegistered();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsOffLine_CheckIsNotRegistered_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckIsRegistered.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckIsRegistered.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckIsRegistered.cpp	(revision 22)
@@ -0,0 +1,61 @@
+#include "CheckIsRegistered.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+string CheckIsRegistered::CheckIsRegisteredId = "UE_CHECK_IS_REGISTER";
+
+CheckIsRegistered::CheckIsRegistered()
+{
+  m_successor.reset();
+}
+
+CheckIsRegistered::CheckIsRegistered(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  CheckIsRegistered();
+  m_eutIface = eutIface;
+}
+
+CheckIsRegistered::~CheckIsRegistered()
+{
+  Logger::Instance().LogInfo("CheckIsRegistered::~CheckIsRegistered");
+  m_successor.reset();
+}
+
+int CheckIsRegistered::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  // Process the command.
+  if (trigger == CheckIsRegistered::CheckIsRegisteredId)
+  {
+    ss << "CheckIsRegistered::Process: " << trigger;
+    Logger::Instance().LogDebug(ss.str());
+    
+    return 0; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "CheckIsRegistered::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // See TTCN-3 FncRetCode 
+}
+
+void CheckIsRegistered::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckIsRegistered.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckIsRegistered.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckIsRegistered.h	(revision 22)
@@ -0,0 +1,40 @@
+#ifndef TriggerCommandsOffLine_CheckIsRegistered_h
+#define TriggerCommandsOffLine_CheckIsRegistered_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+/*! Class CheckIsRegistered
+ * \brief This class provides processing for CHECK_IS_REGISTERED Trigger command.
+ */
+class CheckIsRegistered : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string CheckIsRegisteredId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+  boost::shared_ptr<EutIPInterface> m_eutIface;
+  
+public:
+  CheckIsRegistered();
+  CheckIsRegistered(boost::shared_ptr<EutIPInterface> eutIface);
+  ~CheckIsRegistered();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsOffLine_CheckIsRegistered_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckNewMediaAdded.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckNewMediaAdded.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckNewMediaAdded.cpp	(revision 22)
@@ -0,0 +1,61 @@
+#include "CheckNewMediaAdded.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+string CheckNewMediaAdded::CheckNewMediaAddedId = "UE_CHECK_NEW_MEDIA_STREAM_IS_ADDED";
+
+CheckNewMediaAdded::CheckNewMediaAdded()
+{
+  m_successor.reset();
+}
+
+CheckNewMediaAdded::CheckNewMediaAdded(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  CheckNewMediaAdded();
+  m_eutIface = eutIface;
+}
+
+CheckNewMediaAdded::~CheckNewMediaAdded()
+{
+  Logger::Instance().LogInfo("CheckNewMediaAdded::~CheckNewMediaAdded");
+  m_successor.reset();
+}
+
+int CheckNewMediaAdded::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  // Process the command.
+  if (trigger == CheckNewMediaAdded::CheckNewMediaAddedId)
+  {
+    ss << "CheckNewMediaAdded::Process: " << trigger;
+    Logger::Instance().LogDebug(ss.str());
+    
+    return 0; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "CheckNewMediaAdded::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // See TTCN-3 FncRetCode 
+}
+
+void CheckNewMediaAdded::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckNewMediaAdded.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckNewMediaAdded.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckNewMediaAdded.h	(revision 22)
@@ -0,0 +1,40 @@
+#ifndef TriggerCommandsOffLine_CheckNewMediaAdded_h
+#define TriggerCommandsOffLine_CheckNewMediaAdded_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+/*! Class CheckNewMediaAdded
+ * \brief This class provides processing for UE_CHECK_NEW_MEDIA_STREAM_IS_ADDED Trigger command.
+ */
+class CheckNewMediaAdded : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string CheckNewMediaAddedId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+  boost::shared_ptr<EutIPInterface> m_eutIface;
+  
+public:
+  CheckNewMediaAdded();
+  CheckNewMediaAdded(boost::shared_ptr<EutIPInterface> eutIface);
+  ~CheckNewMediaAdded();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsOffLine_CheckNewMediaAdded_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckNewMediaRemoved.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckNewMediaRemoved.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckNewMediaRemoved.cpp	(revision 22)
@@ -0,0 +1,55 @@
+#include "CheckNewMediaRemoved.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+string CheckNewMediaRemoved::CheckNewMediaRemovedId = "UE_CHECK_NEW_MEDIA_STREAM_IS_REMOVED";
+
+CheckNewMediaRemoved::CheckNewMediaRemoved()
+{
+  m_successor.reset();
+}
+
+CheckNewMediaRemoved::~CheckNewMediaRemoved()
+{
+  Logger::Instance().LogInfo("CheckNewMediaRemoved::~CheckNewMediaRemoved");
+  m_successor.reset();
+}
+
+int CheckNewMediaRemoved::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  // Process the command.
+  if (trigger == CheckNewMediaRemoved::CheckNewMediaRemovedId)
+  {
+    ss << "CheckNewMediaRemoved::Process: " << trigger;
+    Logger::Instance().LogDebug(ss.str());
+    
+    return 0; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "CheckNewMediaRemoved::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // See TTCN-3 FncRetCode 
+}
+
+void CheckNewMediaRemoved::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckNewMediaRemoved.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckNewMediaRemoved.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/CheckNewMediaRemoved.h	(revision 22)
@@ -0,0 +1,39 @@
+#ifndef TriggerCommandsOffLine_CheckNewMediaRemoved_h
+#define TriggerCommandsOffLine_CheckNewMediaRemoved_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+/*! Class CheckNewMediaRemoved
+ * \brief This class provides processing for UE_CHECK_NEW_MEDIA_STREAM_IS_REMOVED Trigger command.
+ */
+class CheckNewMediaRemoved : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string CheckNewMediaRemovedId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+  boost::shared_ptr<EutIPInterface> m_eutIface;
+  
+public:
+  CheckNewMediaRemoved();
+  ~CheckNewMediaRemoved();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsOffLine_CheckNewMediaRemoved_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/Default.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/Default.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/Default.cpp	(revision 22)
@@ -0,0 +1,35 @@
+#include "Default.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+Default::Default()
+{
+}
+
+Default::~Default()
+{
+  Logger::Instance().LogInfo("Default::~Default");
+}
+
+int Default::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  // Process the command.
+  ss << "Default::Process: " << trigger;
+  Logger::Instance().LogDebug(ss.str());
+  return 0; // See TTCN-3 FncRetCode 
+}
+
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/Default.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/Default.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/Default.h	(revision 22)
@@ -0,0 +1,33 @@
+#ifndef TriggerCommandsOffLine_Default_h
+#define TriggerCommandsOffLine_Default_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+/*! Class Default
+ * \brief This class provides processing for the default Trigger command behavior.
+ */
+class Default : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+public:
+  Default();
+  ~Default();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor) { };
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsOffLine_Default_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/Register.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/Register.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/Register.cpp	(revision 22)
@@ -0,0 +1,55 @@
+#include "Register.h"
+#include <sstream>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+string Register::RegisterId = "UE_REGISTRATION";
+
+Register::Register()
+{
+	m_successor.reset();
+}
+
+Register::~Register()
+{
+  Logger::Instance().LogInfo("Register::~Register");
+  m_successor.reset();
+}
+
+int Register::Process(const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  // Process the command.
+  if (trigger == Register::RegisterId)
+  {
+    ss << "Register::Process: " << trigger;
+    Logger::Instance().LogDebug(ss.str());
+    
+    return 0; // See TTCN-3 FncRetCode 
+  }
+  else if (m_successor.get() != NULL)
+  {
+    ss << "Register::Not supported command: " << trigger;
+    Logger::Instance().LogInfo(ss.str());
+    return m_successor.get()->Process(trigger, parameterList);
+  }
+
+  return 1; // See TTCN-3 FncRetCode 
+}
+
+void Register::SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor)
+{
+  m_successor = successor;
+};
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/Register.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/Register.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/Register.h	(revision 22)
@@ -0,0 +1,37 @@
+#ifndef TriggerCommandsOffLine_Register_h
+#define TriggerCommandsOffLine_Register_h
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+/*! Class Register
+ * \brief This class provides processing for REGISTER Trigger command.
+ */
+class Register : public UpperTestAdapter::Processors::TriggerCommandsImpl
+{
+  static std::string RegisterId;
+  
+  boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> m_successor;
+  
+public:
+  Register();
+  ~Register();
+  
+public: // Public interface.
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+  void SetSuccessor(boost::shared_ptr<UpperTestAdapter::Processors::TriggerCommandsImpl> successor);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsOffLine_Register_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/TriggerCommands.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/TriggerCommands.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/TriggerCommands.cpp	(revision 22)
@@ -0,0 +1,76 @@
+#include "TriggerCommands.h"
+#include <string>
+#include <vector>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+#include "Register.h"
+#include "CheckIsRegistered.h"
+#include "CheckIsNotRegistered.h"
+#include "CheckCallIsInitialized.h"
+#include "CheckCallIsAnswered.h"
+#include "CheckCallIsEnded.h"
+#include "CheckNewMediaAdded.h"
+#include "CheckNewMediaRemoved.h"
+#include "Default.h"
+
+using namespace std;
+using namespace boost;
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+TriggerCommands::TriggerCommands()
+{
+  m_successor = shared_ptr<TriggerCommandsImpl>(new Register); // Register
+  shared_ptr<TriggerCommandsImpl> checkIsRegistered = shared_ptr<TriggerCommandsImpl>(new CheckIsRegistered); // CheckIsRegister
+  m_successor.get()->SetSuccessor(checkIsRegistered);
+  shared_ptr<TriggerCommandsImpl> checkIsNotRegistered = shared_ptr<TriggerCommandsImpl>(new CheckIsNotRegistered); // CheckIsNotRegister
+  checkIsRegistered.get()->SetSuccessor(checkIsNotRegistered);
+  shared_ptr<TriggerCommandsImpl> checkCallIsInitialized = shared_ptr<TriggerCommandsImpl>(new CheckCallIsInitialized); // CheckCallIsInitialized
+  checkIsNotRegistered.get()->SetSuccessor(checkCallIsInitialized);
+  shared_ptr<TriggerCommandsImpl> checkCallIsAnswered = shared_ptr<TriggerCommandsImpl>(new CheckCallIsAnswered); // CheckCallIsAnswered
+  checkCallIsInitialized.get()->SetSuccessor(checkCallIsAnswered);
+  shared_ptr<TriggerCommandsImpl> checkCallIsEnded = shared_ptr<TriggerCommandsImpl>(new CheckCallIsEnded); // CheckCallIsEnded
+  checkCallIsAnswered.get()->SetSuccessor(checkCallIsEnded);
+  shared_ptr<TriggerCommandsImpl> checkNewMediaAdded = shared_ptr<TriggerCommandsImpl>(new CheckNewMediaAdded); // CheckNewMediaAdded
+  checkCallIsEnded.get()->SetSuccessor(checkNewMediaAdded);
+  shared_ptr<TriggerCommandsImpl> checkNewMediaRemoved = shared_ptr<TriggerCommandsImpl>(new CheckNewMediaRemoved); // CheckNewMediaRemoved
+  checkNewMediaAdded.get()->SetSuccessor(checkNewMediaRemoved);
+  checkNewMediaRemoved.get()->SetSuccessor(shared_ptr<TriggerCommandsImpl>(new Default));
+
+  Logger::Instance().LogInfo("TriggerCommandsOffLine::TriggerCommands::TriggerCommands: 9 commands created");
+}
+
+TriggerCommands::~TriggerCommands()
+{
+	m_successor.reset();
+}
+
+void TriggerCommands::SetEutIpInterface(boost::shared_ptr<EutIPInterface> eutIface)
+{
+  Logger::Instance().LogInfo("TriggerCommands::~TriggerCommands");
+  m_successor.reset();
+}
+
+int TriggerCommands::Process(const string &trigger, const vector<string> &parameterList)
+{
+  // Sanity check,
+  if (trigger.length() == 0)
+  {
+    Logger::Instance().LogError("TriggerCommandsOffLine::TriggerCommands::Process: trigger is empty.");
+    return 1; // See TTCN-3 FncRetCode .
+  }
+
+  stringstream ss;
+  ss << "TriggerCommandsOffLine::TriggerCommands::Process: start processing: " << trigger;
+  Logger::Instance().LogInfo(ss.str());
+  return m_successor.get()->Process(trigger, parameterList);
+}
+
+} } } // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/TriggerCommands.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/TriggerCommands.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/TriggerCommandsOffLine/TriggerCommands.h	(revision 22)
@@ -0,0 +1,43 @@
+#ifndef TriggerCommandsOffLine_TriggerCommands_h
+#define TriggerCommandsOffLine_TriggerCommands_h
+
+#include <boost/shared_ptr.hpp>
+
+#include "Processors/TriggerCommandsStrategy.h"
+#include "Processors/TriggerCommandsImpl.h"
+
+namespace UpperTestAdapter {
+  
+namespace Processors {
+  
+namespace TriggerCommandsOffLine {
+  
+/*! Class TriggerCommands
+ * \brief This class provides access the the chain of responsability which process Trigger commands.
+ */
+class TriggerCommands : public Processors::TriggerCommandsStrategy
+{
+  boost::shared_ptr<Processors::TriggerCommandsImpl> m_successor;
+
+public:
+	TriggerCommands();
+	~TriggerCommands();
+	
+public: // Public interface.
+  //! SetEutIpInterface.
+  /*! Initialize the EUT IP interface.
+   * @param eutIface: .EUT IP interface.
+   */
+  void SetEutIpInterface(boost::shared_ptr<EutIPInterface> eutIface);
+  /*! Process the Trigger command message.
+   * @param command: trigger command to execute
+   * @param params: Comand parameters
+   * @return FncRetCode value on success, -1 otherwise.
+   */
+  int Process(const std::string &trigger, const std::vector<std::string> &parameterList);
+};
+
+} } } // namespaces
+
+#endif // TriggerCommandsOffLine_TriggerCommands_h
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/UpperTestAdapter.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/UpperTestAdapter.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/UpperTestAdapter.cpp	(revision 22)
@@ -0,0 +1,256 @@
+#include "UpperTestAdapter.h"
+#include <utility>
+#include <iostream>
+
+#include "Logger/Logger.h"
+
+#include "Processors/Processor.h"
+
+using namespace t3devlib;
+using namespace boost;
+using namespace std;
+
+namespace UpperTestAdapter {
+
+using namespace Processors;
+
+UpperTestAdapter::UpperTestAdapter()
+{
+  std::clog << "UpperTestAdapter ctor() not implemented" << endl;
+}
+
+UpperTestAdapter::~UpperTestAdapter()
+{
+  stringstream ss;
+  Logger::Instance().LogDebug("UpperTestAdapter dtor()");
+  
+  // Delete not umapped ports.
+  for (map<const ComponentId *, pair<PortId *, shared_ptr<ProcessorsImpl> > >::iterator it = m_mapRegisteredPorts.begin(); it != m_mapRegisteredPorts.end(); ++it)
+  {
+    ss.str("");
+    ss << "UpperTestAdapter::~UpperTestAdapter: " << it->first;
+    Logger::Instance().LogInfo(ss.str());
+    (it->second).second.reset();
+  }
+  Logger::Instance().LogInfo("UpperTestAdapter::~UpperTestAdapter");
+  m_connectedComponents.clear();
+  m_mapRegisteredPorts.clear();
+}
+
+bool UpperTestAdapter::Initialize(boost::shared_ptr<GeneralConfigurationParams> configParams) throw(UpperTestAdapterException)
+{
+  stringstream ss;
+  Logger::Instance().LogDebug("UpperTestAdapter::Initialize");
+  
+  TriggerCommandsStrategy::Strategies strategy = TriggerCommandsStrategy::UEError;
+  if (configParams.get()->Mode() == ECaptureMode_Live)
+  {
+    Logger::Instance().LogDebug("UpperTestAdapter::Initialize: ECaptureMode_Live");
+    strategy = TriggerCommandsStrategy::UEUserGuide;
+    // Process te list of the EUT interfaces
+    if (configParams.get()->EutIpInterfaceList().size() == 0)
+    {
+      Logger::Instance().LogError("UpperTestAdapter::Initialize: Invalid Euts Ip Interface desciption");
+      throw UpperTestAdapterException("UpperTestAdapter::Initialize: Invalid Euts Ip Interface desciption");
+    }
+  }
+  else if (configParams.get()->Mode() == ECaptureMode_Offline)
+  {
+    Logger::Instance().LogDebug("UpperTestAdapter::Initialize: ECaptureMode_Offline");
+    strategy = TriggerCommandsStrategy::UEOffLine;
+  }
+  else
+  {
+    Logger::Instance().LogError("UpperTestAdapter::Initialize: Undefined strategy");
+    throw UpperTestAdapterException("UpperTestAdapter::Initialize: Undefined strategy");
+  }
+  // Set communication strategy.
+  ss.str("");
+  ss << "UpperTestAdapter::Initialize: m_mapRegisteredPorts size=" << m_mapRegisteredPorts.size();
+  Logger::Instance().LogDebug(ss.str());
+  ss.str("");
+  ss << "UpperTestAdapter::Initialize: EutIpInterfaceList=" << configParams.get()->EutIpInterfaceList().size();
+  Logger::Instance().LogDebug(ss.str());
+  if (m_mapRegisteredPorts.size() != 0)
+  {
+    vector<shared_ptr<EutIPInterface> >::iterator eutit = configParams.get()->EutIpInterfaceList().begin();
+    if (eutit != configParams.get()->EutIpInterfaceList().end())
+    {
+      list<const ComponentId *>::iterator componentItem = m_connectedComponents.begin();
+      for ( ; componentItem != m_connectedComponents.end(); ++componentItem)
+      {
+        // Find component into the registerd components map.
+        map<const ComponentId *, pair<PortId *, shared_ptr<ProcessorsImpl> > >::iterator it = m_mapRegisteredPorts.find(*componentItem);
+        if (it != m_mapRegisteredPorts.end())
+        {
+          // Commponent was found.
+          ss.str("");
+          ss << "UpperTestAdapter::Initialize: Process key =" << it->first << " - value = " << (it->second).first << "/" << (it->second).second.get();
+          Logger::Instance().LogDebug(ss.str());
+          // Set the strategy to apply
+          (it->second).second.get()->SetImplMode(strategy);
+          // Process the list of the EUT interfaces
+          /*
+           * Problem: I'm unable to retrieve the TTCN-3 name of the eaPort ("User A" and "User B"), worth, these port could be unnamed.
+           * As work-around I'll use the index, but the order should be respected in eutInfoList and mapping prot operations
+          string str = ((PortId *)it->second.first)->GetName();
+          clog << "UpperTestAdapter::Initialize: Port" << str << " - " << *((PortId *)it->second.first) << " - " << ((PortId *)it->second.first)->GetIndex() << endl;
+          clog << "UpperTestAdapter::Initialize: Component" <<  *(it->first) << " - " << *((it->first)->GetTriComponentId()) << endl;
+          if (eutIpInterfaceList.find(str) != eutIpInterfaceList.end())
+          {
+            (it->second).second.get()->SetEutIpInterface(eutIpInterfaceList[str]);
+          }
+          else
+          {
+            Logger::Instance().LogError("UpperTestAdapter::Initialize: EUT IP interface not registered");
+            throw UpperTestAdapterException("UpperTestAdapter::Initialize: EUT IP interface not registered");
+          }*/
+          (it->second).second.get()->SetEutIpInterface(*eutit);
+        }
+        else
+        {
+          // Commponent was not found.
+          ss.str("");
+          ss << "UpperTestAdapter::Initialize: Key =" << *componentItem << " not found";
+          Logger::Instance().LogError(ss.str());
+        }
+        eutit++;
+      } // 'for' loop.
+      
+      m_connectedComponents.clear();
+    }
+    else
+    {
+      Logger::Instance().LogInfo("UpperTestAdapter::Initialize: no EUT interface provided.");
+      map<const ComponentId *, pair<PortId *, shared_ptr<ProcessorsImpl> > >::iterator it = m_mapRegisteredPorts.begin();
+      for ( ; it != m_mapRegisteredPorts.end(); ++it)
+      {
+        ss.str("");
+        ss << "UpperTestAdapter::Initialize: Process key =" << it->first << " - value = " << (it->second).first << "/" << (it->second).second.get();
+        Logger::Instance().LogDebug(ss.str());
+        // Set the strategy to apply
+        (it->second).second.get()->SetImplMode(strategy);
+      }
+    }
+  }
+  else
+  {
+    Logger::Instance().LogInfo("UpperTestAdapter::Initialize: no EUT port registered.");
+  }
+  
+  return true;
+}
+
+void UpperTestAdapter::RegisterEquipmentAccessPort(PortId *pPort, const ComponentId *pComponent)
+{
+  stringstream ss;
+  ss << "UpperTestAdapter::RegisterEquipmentAccessPort: " << pComponent << "/" << pPort;
+  Logger::Instance().LogInfo(ss.str());
+
+  // Check if port is already registered.
+  map<const ComponentId *, pair<PortId *, shared_ptr<ProcessorsImpl> > >::iterator it = m_mapRegisteredPorts.find(pComponent);
+  if(it == m_mapRegisteredPorts.end())
+  {
+    // No, register it.
+    shared_ptr<ProcessorsImpl> ptr = shared_ptr<ProcessorsImpl>(new Processor);
+    m_mapRegisteredPorts.insert(
+        make_pair<const ComponentId *, pair<PortId *, shared_ptr<ProcessorsImpl> > >(
+          pComponent,
+          pair<PortId *, shared_ptr<ProcessorsImpl> >
+            (pPort, ptr)));
+    ss.str("");
+    ss << "UpperTestAdapter::RegisterEquipmentAccessPort: insert key=" << *pComponent << " - value = " << pPort << "/" << ptr;
+    Logger::Instance().LogDebug(ss.str());
+    // Add it into a temporary vector.
+    m_connectedComponents.push_back(pComponent);
+  }
+  else
+  {
+    // Yes, override it.
+    ss.str("");
+    ss << "UpperTestAdapter::RegisterEquipmentAccessPort: overriding registration port.";
+    Logger::Instance().LogError(ss.str());
+
+    m_mapRegisteredPorts[pComponent] = pair<PortId *, shared_ptr<ProcessorsImpl> >(pPort, (it->second).second);
+  }
+}
+
+PortId * UpperTestAdapter::GetEquipmentAccessPortIdFromComponent(const ComponentId& from)
+{
+  stringstream ss;
+  ss << "UpperTestAdapter::GetEquipmentAccessPortIdFromComponent: " << from << " - " << "UpperTestAdapter::GetEquipmentAccessPortIdFromComponent: " << &from;
+  Logger::Instance().LogInfo(ss.str());
+
+  map<const ComponentId *, pair<PortId *, shared_ptr<ProcessorsImpl> > >::iterator it = m_mapRegisteredPorts.find(&from);
+  if(it != m_mapRegisteredPorts.end())
+  {
+    ss.str("");
+    ss << "UpperTestAdapter::GetEquipmentAccessPortIdFromComponent: " << (it->second).first << " - " << *(it->second).first;
+    Logger::Instance().LogDebug(ss.str());
+    return (it->second).first;
+  }
+  
+  ss.str("");
+  ss << "UpperTestAdapter::GetEquipmentAccessPortIdFromComponent: Component not found - " << from << endl << "UpperTestAdapter::GetEquipmentAccessPortIdFromComponent: " << &from << endl;
+  Logger::Instance().LogError(ss.str());
+  return NULL;
+}
+
+int UpperTestAdapter::ProcessTriggerCommand(const ComponentId &from, const string &trigger, const vector<string> &parameterList)
+{
+  stringstream ss;
+  ss << "UpperTestAdapter::ProcessTriggerCommand: " << from << " - " << trigger;
+  Logger::Instance().LogInfo(ss.str());
+  ss.str("");
+  ss << "UpperTestAdapter::ProcessTriggerCommand: " << &from;
+  Logger::Instance().LogDebug(ss.str());
+
+  // Sanity check: Find component into the map.
+  map<const ComponentId *, pair<PortId *, shared_ptr<ProcessorsImpl> > >::iterator it = m_mapRegisteredPorts.find(&from);
+  if(it == m_mapRegisteredPorts.end())
+  {
+    ss.str("");
+    ss << "UpperTestAdapter::ProcessTriggerCommand: component " << from << " not found.";
+    Logger::Instance().LogError(ss.str());
+    return -1;
+  }
+
+  // Retrieve the message processor instance.
+  ss.str("");
+  ss << "UpperTestAdapter::ProcessTriggerCommand: key found: " << *(it->second).first << " - " << (it->second).second.get();
+  Logger::Instance().LogInfo(ss.str());
+  ProcessorsImpl *processor = (it->second).second.get();
+  
+  // Execute the TriggerCommand message.
+#ifndef __THREADED_MODE__
+  ss.str("");
+  ss << "UpperTestAdapter::ProcessTriggerCommand: Call Process for " << trigger;
+  Logger::Instance().LogDebug(ss.str());
+  int result = processor->Process(trigger, parameterList);
+  ss.str("");
+  ss << "UpperTestAdapter::RegisterEutConfigPort: return code: " << result;
+  Logger::Instance().LogError(ss.str());
+  return result;
+#else // __THREADED_MODE__
+  ss.str("");
+  ss << "UpperTestAdapter::ProcessTriggerCommand: Call BeginProcess for " << trigger;
+  Logger::Instance().LogDebug(ss.str());
+  if (!processor->BeginProcess(trigger, parameterList))
+  {
+    ss.str("");
+    ss << "UpperTestAdapter::RegisterEutConfigPort: Failed to process the message " << trigger << endl;
+    Logger::Instance().LogError(ss.str());
+    return -1;
+  }
+  
+  // Wait for the execution terminated.
+  Logger::Instance().LogDebug("UpperTestAdapter::ProcessTriggerCommand: Before Wait");
+  processor->Wait();
+  Logger::Instance().LogDebug("UpperTestAdapter::ProcessTriggerCommand: After Wait");
+#endif // __THREADED_MODE__
+
+  return result;
+}
+
+} // namespace
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/UpperTestAdapter.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/UpperTestAdapter.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/UpperTestAdapter/UpperTestAdapter.h	(revision 22)
@@ -0,0 +1,89 @@
+#ifndef UpperTestAdapter_h
+#define UpperTestAdapter_h
+
+// Boost headers.
+#include <boost/shared_ptr.hpp>
+// Singleton pattern.
+#include "Helper/Singleton.h"
+#include "Helper/GeneralConfigurationParams.h"
+#include "Helper/Exceptions.h"
+
+#include "Messages/CommonTrafficCaptureMessages.h"
+// TTCN-3 ports.
+#include "Ports/EquipmentAccessPort.h"
+// Internal UpperTestAdapter.
+#include "Processors/ProcessorsImpl.h"
+
+namespace UpperTestAdapter {
+
+/*! Class UpperTestAdapter
+ * \brief This class implements the processing of TriggerCommands messages and Eut configuration commands.
+ * This class is used as a singleton.
+ */
+class UpperTestAdapter  : public Singleton<UpperTestAdapter>
+{
+  //! Singleton pattern implementation.
+  friend class Singleton<UpperTestAdapter>;
+  
+  //! UpperTestAdapter.
+  /*! Default ctor. Shall be declared in private part due to Singleton pattern implementation.
+   */
+  UpperTestAdapter();
+
+  /*
+   * Port registering part.
+   */
+  //! Mapping of the registered EquipmentAccessPort ports.
+  std::map<const t3devlib::ComponentId *, std::pair<t3devlib::PortId *, boost::shared_ptr<Processors::ProcessorsImpl> > >  m_mapRegisteredPorts;
+  /*! This list will be used to assign properly the EUT interfaces description sent into GeneralConfigurationReq with the ports.
+   * Becarefull: the order of the EIUT registration port SHALL be the same than the EUT interfaces description
+   */
+  std::list<const t3devlib::ComponentId *> m_connectedComponents;
+  
+public:
+  //! Default dtor.
+  /*! Default dtor.
+   */
+  ~UpperTestAdapter();
+  
+public: // Public interface
+  //! Initialize the component.
+  /*! Initialize the component.
+   * @param configParams: GeneralConfigureReq parmeters.
+   * @return true on success, false otherwise.
+   */
+  bool Initialize(boost::shared_ptr<GeneralConfigurationParams> configParams) throw(UpperTestAdapterException);
+  //! Register a new TriggerPort TTCN-3 port instance.
+  /*! Register a new TriggerPort TTCN-3 port instance.
+   * @param pPort: port instance
+   * @param pComponent: TTCN-3 component reference
+   */
+  void RegisterEquipmentAccessPort(t3devlib::PortId *pPort, const t3devlib::ComponentId *pComponent);
+  //void RegisterEutConfigPort(PortId *pPort, const ComponentId *pComponent);  
+  //! Register a new EutConfigPort TTCN-3 port instance.
+  /*! Register a new EutConfigPort instance.
+   * @param pComponent: TTCN-3 component reference
+   * @return PortId reference on success, NULL otherwise.
+   */
+  t3devlib::PortId * GetEquipmentAccessPortIdFromComponent(const t3devlib::ComponentId& from);
+  
+  // TODO: Add Deregister port to free smart pointers.
+  
+  
+  //! ProcessTriggerCommand.
+  /*! Process a TriggerCommands message in synchronous mode.
+   * @param from:
+   * @param signatureId: Component referencetrigger
+   * @param trigger: trigger command
+   * @param parameterList:
+   * @return true on success, false otherwise.
+   */
+  int ProcessTriggerCommand(const t3devlib::ComponentId &from, const std::string &trigger, const std::vector<std::string> &parameterList);
+
+  // TODO: Add asynchronous Trigger command processing
+  //void InvokeProcessTriggerCommand(const t3devlib:ComponentId &from, const t3devlib:QName &signatureId, const ParameterList &parameterList);
+};
+
+} // namespace
+
+#endif // UpperTestAdapter_h
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/codec.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/codec.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/codec.h	(revision 22)
@@ -0,0 +1,38 @@
+// This is the codec header, it is given as an input file for the codec
+// generator (with the '-i' option).
+//
+// Its role is to define all the types that are not handled by the generator
+// (namely the enumerations and all subtypes: integer, bitstring,
+// octetstring,...). As well as customising the classes automatically generated
+// (by using a macro to add some definitions in the class).
+//
+// This file is included by the source files generated by t3cdgen
+// (gen_classes.h, gen_classes.cpp).
+//
+
+#ifndef  CODEC_H
+#define  CODEC_H
+#include <t3devlib/t3devlib.h>
+
+#include "libiot_codets.h"
+#include "libcommon_codets.h"
+#include "sip_codets.h"
+#include "sdp_codets.h"
+//#include "isup_codets.h"
+
+namespace t3devlib {
+  namespace gen {
+    
+    // Bug in t3devkit ?
+    typedef t3devlib::Undef conformance;
+    typedef t3devlib::Undef ClientSyncComp;
+
+    // xml body is not supported in the codec
+    typedef t3devlib::Undef XmlBody;
+    // xml message is not supported in the codec
+    typedef t3devlib::Undef XMLMessage;
+    
+  }
+}
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/init.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/init.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/init.cpp	(revision 22)
@@ -0,0 +1,80 @@
+/****************************************************************************/
+/* $Id$             */
+/*                                                                          */
+/*   (c) 2009  Universite de Rennes 1                                       */
+/*                                                                          */
+/* Contributors:                                                            */
+/*  - Anthony BAIRE                                                         */
+/*                                                                          */
+/* Contact address: <t3devkit@irisa.fr>                                     */
+/*                                                                          */
+/*                                                                          */
+/* This file is part of application examples provided along with T3DevKit,  */
+/* a free toolkit for building TTCN-3 tests.                                */
+/*                                                                          */
+/* This software is governed by the CeCILL-B license under French law and   */
+/* abiding by the rules of distribution of free software.  You can  use,    */
+/* modify and/or redistribute the software under the terms of the CeCILL-B  */
+/* license as circulated by CEA, CNRS and INRIA at the following URL        */
+/* "http://www.cecill.info".                                                */
+/*                                                                          */
+/* As a counterpart to the access to the source code and  rights to copy,   */
+/* modify and redistribute granted by the license, users are provided only  */
+/* with a limited warranty  and the software's author,  the holder of the   */
+/* economic rights,  and the successive licensors  have only  limited       */
+/* liability.                                                               */
+/*                                                                          */
+/* In this respect, the user's attention is drawn to the risks associated   */
+/* with loading,  using,  modifying and/or developing or reproducing the    */
+/* software by the user in light of its specific status of free software,   */
+/* that may mean  that it is complicated to manipulate,  and  that  also    */
+/* therefore means  that it is reserved for developers  and  experienced    */
+/* professionals having in-depth computer knowledge. Users are therefore    */
+/* encouraged to load and test the software's suitability as regards their  */
+/* requirements in conditions enabling the security of their systems and/or */ 
+/* data to be ensured and,  more generally, to use and operate it in the    */
+/* same conditions as regards security.                                     */
+/*                                                                          */
+/* The fact that you are presently reading this means that you have had     */
+/* knowledge of the CeCILL-B license and that you accept its terms.         */
+/****************************************************************************/
+#include <t3devlib/t3devlib.h>
+
+#include "Ports/DataPort.h"
+#include "Ports/AdapterConfigPort.h"
+#include "Ports/EquipmentAccessPort.h"
+#include <fstream>
+
+namespace t3devlib {
+  
+  void PAInit()
+  {
+  }
+  
+  void SAInit()
+  {
+    static std::ofstream log_file ("mmagic_adapter_log.txt");
+    
+    // replace the buffer in cout, cerr and clog
+    std::cout.rdbuf (log_file.rdbuf());
+    std::cerr.rdbuf (log_file.rdbuf());		
+    std::clog.rdbuf (log_file.rdbuf());		
+
+    // Do not forget to check for TTCN-3 modele name!!
+    Port::RegisterType("AtsImsIot_TestSystem", "DataPort", &createPort<DataPort>);
+    Port::RegisterType("LibIot_TestInterface", "EquipmentAccessPort", &createPort<EquipmentAccessPort>);
+    Port::RegisterType("LibIot_TestInterface", "AdapterConfigPort", &createPort<AdapterConfigPort>);
+  }
+  
+  void CDInit()
+  {
+  }
+  
+  void PAReset()
+  {
+  }
+  
+  void SAReset()
+  {
+  }
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/libiot_codets.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/libiot_codets.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/libiot_codets.cpp	(revision 22)
@@ -0,0 +1,729 @@
+#include "gen_classes.h"
+#include "Ports/MessagesIdentifiers.h"
+
+#include <fstream>
+
+
+/* For debugging with MMAGIC
+ofstream myfile;
+myfile.open ("C:\\Temp\\logs.txt", ios::out | ios::app );
+myfile << "CaptureSource::PreEncodeField: " << field_id << std::endl;
+myfile.close();
+  */
+
+namespace t3devlib { namespace gen {
+
+  const char* FncRetCode::msFncRetCodeModes[] = { 
+    "e_success",
+    "e_error",
+    "e_timeout",
+    ""
+  };
+
+  const char* IOTExecMode::msExecModes[] = { 
+    "e_realtime",
+    "e_offline",
+    ""
+  };
+
+  const char* IOTVerdictType::msVerdictTypes[] = { 
+    "e_e2e",
+    "e_conformance",
+    ""
+  };
+
+  const char* RecordMode::msRecordModes[] = { 
+    "e_norecord",
+    "e_record",
+    ""
+  };
+
+  const char* ProtocolFilter::msProtocolFilterModes[] = { 
+    "e_sip",
+    "e_dns",
+    ""
+  };
+
+
+  void FncRetCode::Encode (Buffer& buffer) throw (EncodeError) {
+
+    Unsigned u8(8);
+    const char ** ppEnum = msFncRetCodeModes;
+    const std::string & val = GetValueString();
+    
+    int i = 0;
+    while (*(ppEnum[i]) && strcmp(ppEnum[i], val.c_str()) != 0)
+      i++;
+    
+    if (*(ppEnum[i]) == 0) {
+      std::string message ("unsupported enum value '");
+      message += val;
+      message += '\n';
+      throw EncodeError (this, message);
+    }
+    
+    u8.SetValue(i);
+    u8.Encode(buffer);
+}
+
+  void FncRetCode::Decode (Buffer& buffer) throw (DecodeError) {
+    Unsigned u8(8);
+    const char ** ppEnum = msFncRetCodeModes;
+    
+    u8.Decode(buffer);
+
+    int i = 0;
+    while (*(ppEnum[i]) && (i != u8.GetValue()) )
+      i++;
+    
+    if (*(ppEnum[i]) == 0) {
+      std::string message ("unsupported enum value '");
+      message += u8.GetValue();
+      message += '\n';
+      throw DecodeError (this, message);
+    } else {
+      SetValueString(ppEnum[i]);
+    }
+    
+  }
+
+
+  void IOTExecMode::Encode (Buffer& buffer) throw (EncodeError) {
+
+    Unsigned u8(8);
+    const char ** ppEnum = msExecModes;
+    const std::string & val = GetValueString();
+    
+    int i = 0;
+    while (*(ppEnum[i]) && strcmp(ppEnum[i], val.c_str()) != 0)
+      i++;
+    
+    if (*(ppEnum[i]) == 0) {
+      std::string message ("unsupported enum value '");
+      message += val;
+      message += '\n';
+      throw EncodeError (this, message);
+    }
+    
+    u8.SetValue(i);
+    u8.Encode(buffer);
+}
+
+  void IOTExecMode::Decode (Buffer& buffer) throw (DecodeError) {
+   
+    Unsigned u8(8);
+    const char ** ppEnum = msExecModes;
+    
+    u8.Decode(buffer);
+
+    int i = 0;
+    while (*(ppEnum[i]) && (i != u8.GetValue()) )
+      i++;
+    
+    if (*(ppEnum[i]) == 0) {
+      std::string message ("unsupported enum value '");
+      message += u8.GetValue();
+      message += '\n';
+      throw DecodeError (this, message);
+    } else {
+      SetValueString(ppEnum[i]);
+    }
+  }
+
+  void IOTVerdictType::Encode (Buffer& buffer) throw (EncodeError) {
+
+    Unsigned u8(8);
+    const char ** ppEnum = msVerdictTypes;
+    const std::string & val = GetValueString();
+    
+    int i = 0;
+    while (*(ppEnum[i]) && strcmp(ppEnum[i], val.c_str()) != 0)
+      i++;
+    
+    if (*(ppEnum[i]) == 0) {
+      std::string message ("unsupported enum value '");
+      message += val;
+      message += '\n';
+      throw EncodeError (this, message);
+    }
+    
+    u8.SetValue(i);
+    u8.Encode(buffer);
+}
+
+  void IOTVerdictType::Decode (Buffer& buffer) throw (DecodeError) {
+   
+    Unsigned u8(8);
+    const char ** ppEnum = msVerdictTypes;
+    
+    u8.Decode(buffer);
+
+    int i = 0;
+    while (*(ppEnum[i]) && (i != u8.GetValue()) )
+      i++;
+    
+    if (*(ppEnum[i]) == 0) {
+      std::string message ("unsupported enum value '");
+      message += u8.GetValue();
+      message += '\n';
+      throw DecodeError (this, message);
+    } else {
+      SetValueString(ppEnum[i]);
+    }
+
+  }
+
+  void RecordMode::Encode (Buffer& buffer) throw (EncodeError) {
+
+    Unsigned u8(8); // 1 octet length
+    // Set Value
+    const char ** ppEnum = msRecordModes;
+    const std::string & val = GetValueString();
+    int i = 0;
+    while (*(ppEnum[i]) && strcmp(ppEnum[i], val.c_str()) != 0)
+      i++;
+    if (*(ppEnum[i]) == 0) {
+      std::string message ("unsupported enum value '");
+      message += val;
+      message += '\n';
+      throw EncodeError (this, message);
+    }
+    u8.SetValue(i);
+    u8.Encode(buffer);
+}
+
+  void RecordMode::Decode (Buffer& buffer) throw (DecodeError) {
+   
+    Unsigned u8(8); // 1 octet length
+    const char ** ppEnum = msRecordModes;
+    
+    u8.Decode(buffer);
+
+    int i = 0;
+    while (*(ppEnum[i]) && (i != u8.GetValue()) )
+      i++;
+    
+    if (*(ppEnum[i]) == 0) {
+      std::string message ("unsupported enum value '");
+      message += u8.GetValue();
+      message += '\n';
+      throw DecodeError (this, message);
+    } else {
+      SetValueString(ppEnum[i]);
+    }
+
+  }
+
+
+  void ProtocolFilter::Encode (Buffer& buffer) throw (EncodeError) {
+
+   Unsigned u8(8); // 1 octet length
+    // Set Value
+    const char ** ppEnum = msProtocolFilterModes;
+    const std::string & val = GetValueString();
+    int i = 0;
+    while (*(ppEnum[i]) && strcmp(ppEnum[i], val.c_str()) != 0)
+      i++;
+    if (*(ppEnum[i]) == 0) {
+      std::string message ("unsupported enum value '");
+      message += val;
+      message += '\n';
+      throw EncodeError (this, message);
+    }
+    u8.SetValue(i);
+    u8.Encode(buffer);
+}
+
+  void ProtocolFilter::Decode (Buffer& buffer) throw (DecodeError) {
+  
+  Unsigned u8(8); // 1 octet length
+  const char ** ppEnum = msProtocolFilterModes;
+  
+  u8.Decode(buffer);
+
+  int i = 0;
+  while (*(ppEnum[i]) && (i != u8.GetValue()) )
+    i++;
+  
+  if (*(ppEnum[i]) == 0) {
+    std::string message ("unsupported enum value '");
+    message += u8.GetValue();
+    message += '\n';
+    throw DecodeError (this, message);
+  } else {
+    SetValueString(ppEnum[i]);
+  }
+}
+
+  void InterfaceInfoList::PreEncode (Buffer& buffer) throw (EncodeError)
+  {
+    // Set the number of parameters.
+    Unsigned fieldLength(8, GetSize());
+    fieldLength.Encode(buffer);
+  }
+
+  void Product::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+  {
+    Charstring value;
+    Unsigned fieldLength(2 * 8); // 2 octet length
+    switch (field_id) {
+      case id_productName:
+        {
+          // Set the number of parameters.
+          value = Get_productName();
+          std::cout << "Product::PreEncodeField: id_productName value=" << value << " - " << value.GetLength() / 8 << std::endl;
+          fieldLength.SetValue(value.GetLength() / 8);
+        }
+        break;
+      default:
+        std::cerr << "Product::PreEncodeField: Non processed field: " << field_id << std::endl;
+        return;
+    }
+    //std::cout << "Product::PreEncodeField: fieldLength=" << (int)fieldLength.GetValue() << std::endl;
+    fieldLength.Encode(buffer);
+  }
+  
+
+  void InterfaceInfo::PreEncode (Buffer& buffer) throw (EncodeError)
+  {
+    // Set union type
+    Unsigned fieldLength(8, GetChosenId()); // 1 octet length
+    //std::cout << "InterfaceInfo::InterfaceInfo: fieldLength=" << (int)fieldLength.GetValue() << std::endl;
+    fieldLength.Encode(buffer);
+    
+    if (GetChosenId() == id_IpInterfaceInfo)
+    {
+      // Set the number of parameters.
+      IpInterfaceInfoList& list = Get_IpInterfaceInfo();
+      //std::cout << "InterfaceInfo::PreEncode: id_IpInterfaceInfo size=" << list.GetSize() << std::endl;
+      fieldLength.SetValue(list.GetSize());
+      fieldLength.Encode(buffer);
+    }
+  }
+
+  void CaptureMode::PreEncode (Buffer& buffer) throw (EncodeError)
+  {
+    // Set union type
+    Unsigned fieldLength(8, GetChosenId()); // 1 octet length
+    //std::cout << "CaptureMode::PreEncode: fieldLength=" << (int)fieldLength.GetValue() << std::endl;
+    fieldLength.Encode(buffer);
+  }
+  
+  void IpInterfaceInfo::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+  {
+    Charstring value;
+    Unsigned fieldLength(2 * 8); // 2 octet length
+    switch (field_id) {
+      case id_domainName:
+        {
+          if(IsPresent(id_domainName))
+          {
+            // Set the string length.
+            value = Get_domainName();
+            std::cout << "IpInterfaceInfo::PreEncodeField: id_domainName value=" << value << " - " << value.GetLength() / 8 << std::endl;
+            fieldLength.SetValue(value.GetLength() / 8);
+          }
+          else
+          {
+            fieldLength.SetValue(0);
+          }
+        }
+        break;
+      case id_IpAddress:
+        {
+          value = static_cast<Charstring>(Get_IpAddress());
+          std::cout << "IpInterfaceInfo::PreEncodeField: id_IpAddress value=" << value << " - " << value.GetLength() / 8 << std::endl;
+          fieldLength.SetValue(value.GetLength() / 8);
+        }
+        break;
+      case id_portNumbers:
+        {
+          PortNumberList& ports = Get_portNumbers();
+          std::cout << "IpInterfaceInfo::PreEncodeField: id_portNumbers value=" << ports.GetSize() << std::endl;
+          fieldLength.SetValue(ports.GetSize());
+        }
+        break;
+      default:
+        std::cerr << "IpInterfaceInfo::PreEncodeField: Non processed field: " << field_id << std::endl;
+        return;
+    }
+    //std::cout << "IpInterfaceInfo::PreEncodeField: fieldLength " << (int)fieldLength.GetValue() << std::endl;
+    fieldLength.Encode(buffer);
+  }
+
+  void EutInterfaceInfo::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+  {
+    Charstring value;
+    Unsigned fieldLength(2 * 8); // 2 octet length
+    switch (field_id) {
+      case id_eut:
+        {
+          // Set the string length.
+          value = Get_eut();
+          std::cout << "EutInterfaceInfo::PreEncodeField: id_eut value=" << value << " - " << value.GetLength() / 8 << std::endl;
+          fieldLength.SetValue(value.GetLength() / 8);
+        }
+        break;
+      case id_ipAddress:
+        {
+          value = static_cast<Charstring>(Get_ipAddress());
+          std::cout << "EutInterfaceInfo::PreEncodeField: id_ipAddress value=" << value << " - " << value.GetLength() / 8 << std::endl;
+          fieldLength.SetValue(value.GetLength() / 8);
+        }
+        break;
+      default:
+        std::cerr << "EutInterfaceInfo::PreEncodeField: Non processed field: " << field_id << std::endl;
+        return;
+    }
+    //std::cout << "EutInterfaceInfo::PreEncodeField: fieldLength " << (int)fieldLength.GetValue() << std::endl;
+    fieldLength.Encode(buffer);
+  }
+
+  void LiveCapture::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+  {
+    Charstring value;
+    Unsigned fieldLength(2 * 8); // 2 octet length
+    switch (field_id) {
+      case id_physicalInterfaces:
+        {
+          // Set the number of parameters.
+          PhysicalInterfaceList& ifaces = Get_physicalInterfaces();
+          std::cout << "LiveCapture::PreEncodeField: id_physicalInterfaces size=" << ifaces.GetSize() << std::endl;
+          fieldLength.SetValue(ifaces.GetSize());
+        }
+        break;
+      default:
+        std::cerr << "LiveCapture::PreEncodeField: Non processed field: " << field_id << std::endl;
+        return;
+    }
+    //std::cout << "LiveCapture::PreEncodeField: fieldLength=" << (int)fieldLength.GetValue() << std::endl;
+    fieldLength.Encode(buffer);
+  }
+  
+
+  void CaptureSource::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+  {
+    Charstring value;
+    Unsigned fieldLength(2 * 8); // 2 octet length
+    switch (field_id) {
+      case id_sessionsPath:
+        {
+          // Set the string length.
+          value = Get_sessionsPath();
+          std::cout << "CaptureSource::PreEncodeField: id_sessionsPath value=" << value << " - " << value.GetLength() / 8 << std::endl;
+          fieldLength.SetValue(value.GetLength() / 8);
+        }
+        break;
+      default:
+        std::cerr << "CaptureSource::PreEncodeField: Non processed field: " << field_id << std::endl;
+        return;
+    }
+    //std::cout << "CaptureSource::PreEncodeField: fieldLength " << (int)fieldLength.GetValue() << std::endl;
+    fieldLength.Encode(buffer);
+  }
+
+  void MergeFileList::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+  {
+    Charstring value;
+    Unsigned fieldLength(2 * 8); // 2 octet length
+    switch (field_id) {
+      case id_mergeFileList:
+        {
+          // Set the number of parameters.
+          FileList& list = Get_mergeFileList();
+          std::cout << "MergeFileList::PreEncodeField: id_mergeFileList value=" << list.GetSize() << std::endl;
+          fieldLength.SetValue(list.GetSize());
+        }
+        break;
+      case id_mergeFilePath:
+        {
+          // Set the string length.
+          value = Get_mergeFilePath();
+          std::cout << "MergeFileList::PreEncodeField: id_mergeFilePath value=" << value << " - " << value.GetLength() / 8 << std::endl;
+          fieldLength.SetValue(value.GetLength() / 8);
+        }
+        break;
+        
+      case id_mergeToolPath:
+        {
+          // Set the string length.
+          value = Get_mergeToolPath();
+          std::cout << "MergeFileList::PreEncodeField: id_mergeToolPath value=" << value << " - " << value.GetLength() / 8 << std::endl;
+          fieldLength.SetValue(value.GetLength() / 8);
+        }
+        break;
+        
+      default:
+        std::cerr << "MergeFileList::PreEncodeField: Non processed field: " << field_id << std::endl;
+        return;
+    }
+    //std::cout << "MergeFileList::PreEncodeField: fieldLength " << (int)fieldLength.GetValue() << std::endl;
+    fieldLength.Encode(buffer);
+  }
+
+  void GeneralConfigurationReq::PreEncode (Buffer & buffer ) throw (EncodeError)
+  {
+    // Get message index
+    unsigned char idx = MessagesIdentifiers::GetIdx(GetTypeName());
+    if (idx == 0xff) {
+      std::string message ("unsupported enum value '");
+      message += GetTypeName();
+      message += '\n';
+      throw EncodeError (this, message);
+    }
+    // Set message index
+    Unsigned fieldLength(8); // 1 octet length
+    fieldLength.SetValue(idx);
+    fieldLength.Encode(buffer);
+  }
+
+  void GeneralConfigurationReq::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+  {
+    Charstring value;
+    Unsigned fieldLength(2 * 8); // 2 octet length
+    switch (field_id) {
+      case id_captureProcessIpAddress:
+        {
+          value = Get_captureProcessIpAddress();
+          std::cout << "GeneralConfigurationReq::id_captureProcessIpAddress: value " << value << " - " << value.GetLength() / 8 << std::endl;
+          fieldLength.SetValue(value.GetLength() / 8);
+        }
+        break;
+      case id_eutInfoList:
+        {
+          if(IsPresent(id_eutInfoList))
+          {
+            // Set the number of parameters.
+            std::cout << "GeneralConfigurationReq::id_eutInfoList: value " << Get_eutInfoList().GetSize() << std::endl;
+            fieldLength.SetValue(Get_eutInfoList().GetSize());
+          }
+          else
+          {
+            fieldLength.SetValue(0);
+          }
+
+        }
+        break;
+      default:
+        std::cerr << "GeneralConfigurationReq::PreEncodeField: Non processed field: " << field_id << std::endl;
+        return;
+    }
+    //std::cout << "GeneralConfigurationReq::PreEncodeField: fieldLength " << (int)fieldLength.GetValue() << std::endl;
+    fieldLength.Encode(buffer);
+  }
+  
+  void GeneralConfigurationRsp::PreDecode (Buffer& buffer) throw (DecodeError)
+  {
+    // Get message type.
+    Unsigned messageType (8); // One byte length
+    messageType.Decode (buffer);
+    if (MessagesIdentifiers::GetMessage(static_cast<int>(messageType.GetValue())).length() == 0) {
+      std::string message ("unsupported message type '");
+      message += static_cast<int>(messageType.GetValue());
+      message += '\n';
+      throw DecodeError (this, message);
+    }
+  }
+  
+  void EquipmentOperationReq::PreEncode (Buffer & buffer ) throw (EncodeError)
+  {
+    // Get message index
+    unsigned char idx = MessagesIdentifiers::GetIdx(GetTypeName());
+    if (idx == 0xff) {
+      std::string message ("unsupported enum value '");
+      message += GetTypeName();
+      message += '\n';
+      throw EncodeError (this, message);
+    }
+    // Set message index
+    Unsigned fieldLength(8); // 1 octet length
+    fieldLength.SetValue(idx);
+    fieldLength.Encode(buffer);
+  }
+
+  void EquipmentOperationReq::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+  {
+    Charstring value;
+    Unsigned fieldLength(2 * 8);
+    switch (field_id) {
+      case id_cmd:
+        {
+          value = Get_cmd();
+          std::cout << "EquipmentOperationReq::id_cmd: value " << value << " - " << value.GetLength() / 8 << std::endl;
+          fieldLength.SetValue(value.GetLength() / 8);
+        }
+        break;
+      case id_params:
+        {
+          // Set the number of parameters.
+          //std::cout << "EquipmentOperationReq::id_params: " << Get_params().GetSize() << std::endl;
+          fieldLength.SetValue(Get_params().GetSize());
+        }
+        break;
+      default:
+        std::cerr << "EquipmentOperationReq::PreEncodeField: Non processed field: " << field_id << std::endl;
+        return;
+    }
+    std::cout << "EquipmentOperationReq::PreEncodeField: fieldLength " << (int)fieldLength.GetValue() << std::endl;
+    fieldLength.Encode(buffer);
+  }
+  
+  void EquipmentOperationRsp::PreDecode (Buffer& buffer) throw (DecodeError)
+  {
+    // Get message type.
+    Unsigned messageType (8); // One byte length
+    messageType.Decode (buffer);
+    if (MessagesIdentifiers::GetMessage(static_cast<int>(messageType.GetValue())).length() == 0) {
+      std::string message ("unsupported message type '");
+      message += static_cast<int>(messageType.GetValue());
+      message += '\n';
+      throw DecodeError (this, message);
+    }
+  }
+  
+  void PhysicalInterfaceList::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+  {
+    Charstring value = GetField(field_id);
+    std::cout << "PhysicalInterfaceList::PreEncodeField: value " << value << " - " << value.GetLength() / 8 << std::endl;
+    Unsigned fieldLength(2 * 8, value.GetLength() / 8);
+    std::cout << "PhysicalInterfaceList::PreEncodeField: fieldLength " << (int)fieldLength.GetValue() << std::endl;
+    fieldLength.Encode(buffer);
+  }
+
+  void FileList::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+  {
+    Charstring value = GetField(field_id);
+    std::cout << "FileList::PreEncodeField: value " << value << " - " << value.GetLength() / 8 << std::endl;
+    Unsigned fieldLength(2 * 8, value.GetLength() / 8);
+    std::cout << "FileList::PreEncodeField: fieldLength " << (int)fieldLength.GetValue() << std::endl;
+    fieldLength.Encode(buffer);
+  }
+
+  void ParameterList::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+  {
+    Charstring value = GetField(field_id);
+    std::cout << "ParameterList::PreEncodeField: value " << value << " - " << value.GetLength() / 8 << std::endl;
+    Unsigned fieldLength(2 * 8, value.GetLength() / 8);
+    std::cout << "ParameterList::PreEncodeField: fieldLength " << (int)fieldLength.GetValue() << std::endl;
+    fieldLength.Encode(buffer);
+  }
+
+  void StartTrafficCaptureReq::PreEncode (Buffer & buffer ) throw (EncodeError)
+  {
+    // Set message type
+    // Get message index
+    unsigned char idx = MessagesIdentifiers::GetIdx(GetTypeName());
+    if (idx == 0xff) {
+      std::string message ("unsupported enum value '");
+      message += GetTypeName();
+      message += '\n';
+      throw EncodeError (this, message);
+    }
+    // Set message index
+    Unsigned fieldLength(8); // 1 octet length
+    fieldLength.SetValue(idx);
+    fieldLength.Encode(buffer);
+  }
+
+  void StartTrafficCaptureRsp::PreDecode (Buffer& buffer) throw (DecodeError)
+  {
+    // Get message type.
+    Unsigned messageType (8); // One byte length
+    messageType.Decode (buffer);
+    if (MessagesIdentifiers::GetMessage(static_cast<int>(messageType.GetValue())).length() == 0) {
+      std::string message ("unsupported message type '");
+      message += static_cast<int>(messageType.GetValue());
+      message += '\n';
+      throw DecodeError (this, message);
+    }
+  }
+  
+  void StopTrafficCaptureReq::PreEncode (Buffer & buffer ) throw (EncodeError)
+  {
+    // Get message index
+    unsigned char idx = MessagesIdentifiers::GetIdx(GetTypeName());
+    if (idx == 0xff) {
+      std::string message ("unsupported enum value '");
+      message += GetTypeName();
+      message += '\n';
+      throw EncodeError (this, message);
+    }
+    // Set message index
+    Unsigned fieldLength(8); // 1 octet length
+    fieldLength.SetValue(idx);
+    fieldLength.Encode(buffer);
+  }
+
+  void StopTrafficCaptureRsp::PreDecode (Buffer& buffer) throw (DecodeError)
+  {
+    // Get message type.
+    Unsigned messageType (8); // One byte length
+    messageType.Decode (buffer);
+    if (MessagesIdentifiers::GetMessage(static_cast<int>(messageType.GetValue())).length() == 0) {
+      std::string message ("unsupported message type '");
+      message += static_cast<int>(messageType.GetValue());
+      message += '\n';
+      throw DecodeError (this, message);
+    }
+  }
+  
+  void SetFilterReq::PreEncode (Buffer & buffer ) throw (EncodeError)
+  {
+    // Get message index
+    unsigned char idx = MessagesIdentifiers::GetIdx(GetTypeName());
+    if (idx == 0xff) {
+      std::string message ("unsupported enum value '");
+      message += GetTypeName();
+      message += '\n';
+      throw EncodeError (this, message);
+    }
+    // Set message index
+    Unsigned fieldLength(8); // 1 octet length
+    fieldLength.SetValue(idx);
+    fieldLength.Encode(buffer);
+  }
+  
+  void SetFilterRsp::PreDecode (Buffer& buffer) throw (DecodeError)
+  {
+    // Get message type.
+    Unsigned messageType (8); // One byte length
+    messageType.Decode (buffer);
+    if (MessagesIdentifiers::GetMessage(static_cast<int>(messageType.GetValue())).length() == 0) {
+      std::string message ("unsupported message type '");
+      message += static_cast<int>(messageType.GetValue());
+      message += '\n';
+      throw DecodeError (this, message);
+    }
+  }
+  
+  void Status::PreDecodeField(int field_id, Buffer& buffer) throw (DecodeError)
+  {
+    switch (field_id)
+    {
+      case id_code:
+        break;
+      case id_reason: // Set length
+        {
+          Unsigned reason (2 * 8);
+          reason.Decode (buffer);
+          if (reason.GetValue() == 0)
+          {
+            std::cout << "Status::PreDecodeField: Set reason omitted" << std::endl;
+            SetHypFieldIsPresent(id_reason, 0);
+          }
+          else
+          {
+            std::cout << "Status::PreDecodeField: Set length to " << reason.GetValue() << std::endl;
+            SetHypFieldIsPresent(id_reason, 1);
+            SetHypFieldLength (id_reason, reason.GetValue() * 8);
+          }
+        }
+        break;
+      default:
+        std::cerr << "Status::PreDecodeField: Non processed field: " << field_id << std::endl;
+        return;
+    }
+  }
+
+  
+}} // namespaces
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/libiot_codets.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/libiot_codets.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/src/libiot_codets.h	(revision 22)
@@ -0,0 +1,91 @@
+#ifndef  LIBIOTCODETS_H
+#define  LIBIOTCODETS_H
+
+#include <t3devlib/t3devlib.h>
+
+namespace t3devlib {
+namespace gen {
+
+//
+// Implementation of subtypes defined in the module LibIot_TypesAndValues
+//
+
+// aliases (subtypes without restrictions)
+T3DEVLIB_BASIC_DEFINITION (LibUpperTester, EquipmentCommand, Charstring);
+T3DEVLIB_BASIC_DEFINITION (LibIot_TypesAndValues, IpAddress, Charstring);
+T3DEVLIB_BASIC_DEFINITION (LibIot_TypesAndValues, PortNumber, Unsigned);
+//
+  // Implementation of enumerated types (not handled by the generator yet)
+  //
+  
+  class FncRetCode : public t3devlib::Enum {
+  private:
+    static const char* msFncRetCodeModes[];
+  public:
+    FncRetCode() : Enum (msFncRetCodeModes) {}
+    
+    const char* GetModuleName() const { return "LibCommon_VerdictControl"; }
+    const char* GetTypeName() const   { return "FncRetCode"; }
+    
+    void Encode (Buffer& buffer) throw (EncodeError);
+    void Decode (Buffer& buffer) throw (DecodeError);
+  };
+  
+  
+  class IOTExecMode : public t3devlib::Enum {
+  private:
+    static const char* msExecModes[];
+  public:
+    IOTExecMode() : Enum (msExecModes) {}
+    
+    const char* GetModuleName() const { return "LibIot_TypesAndValues"; }
+    const char* GetTypeName() const   { return "IOTExecMode"; }
+    
+    void Encode (Buffer& buffer) throw (EncodeError);
+    void Decode (Buffer& buffer) throw (DecodeError);
+  };
+  
+  
+  class IOTVerdictType : public t3devlib::Enum {
+  private:
+    static const char* msVerdictTypes[];
+  public:
+    IOTVerdictType() : Enum (msVerdictTypes) {}
+    
+    const char* GetModuleName() const { return "LibIot_TypesAndValues"; }
+    const char* GetTypeName() const   { return "IOTVerdictType"; }
+    
+    void Encode (Buffer& buffer) throw (EncodeError);
+    void Decode (Buffer& buffer) throw (DecodeError);
+  };
+
+  class RecordMode : public t3devlib::Enum {
+  private:
+    static const char* msRecordModes[];
+  public:
+    RecordMode() : Enum (msRecordModes) {}
+    
+    const char* GetModuleName() const { return "LibIot_TypesAndValues"; }
+    const char* GetTypeName() const   { return "RecordMode"; }
+    
+    void Encode (Buffer& buffer) throw (EncodeError);
+    void Decode (Buffer& buffer) throw (DecodeError);
+  };
+
+  class ProtocolFilter : public t3devlib::Enum {
+  private:
+    static const char* msProtocolFilterModes[];
+  public:
+    ProtocolFilter() : Enum (msProtocolFilterModes) {}
+    
+    const char* GetModuleName() const { return "LibIot_TypesAndValues"; }
+    const char* GetTypeName() const   { return "ProtocolFilter"; }
+    
+    void Encode (Buffer& buffer) throw (EncodeError);
+    void Decode (Buffer& buffer) throw (DecodeError);
+  };
+
+    
+}} //namespaces
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_Behavior.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_Behavior.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_Behavior.ttcn	(revision 22)
@@ -0,0 +1,2399 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides common functions which describes behavior for each TP reference.
+ */
+module AtsImsIot_Behavior {
+	
+	import from AtsImsIot_TestSystem {
+		type ImsInterfaceMonitor, ImsTestCoordinator;
+	}
+
+	import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT;}
+
+	import from AtsImsIot_Templates {template all;}
+
+	import from AtsImsIot_TypesAndValues {
+		type SipMessage, SipMessageList, SkipType;
+	}
+		
+	
+	import from LibIms_UpperTester {type ImsUserInfo;}
+
+	import from LibIot_TypesAndValues {type DefaultList;}
+	import from LibIot_Functions {
+		function f_setConformanceVerdict, f_setIotVerdictFAIL;
+	}
+
+	import from LibSip_SIPTypesAndValues all;
+	
+	import from LibSip_Templates all;
+	
+	import from AtsImsIot_Functions all;
+	import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;}
+	
+	//TODO move group to Function module
+	group general_td_functions {
+	 	
+		/**
+         * @desc
+         *     Generic function for reading and verifying messages on the
+         *     interface associated to the ImsInterfaceMonitor instance. This
+         *     functions works as follows: First, messages are skipped according
+         *     to the p_skip template. The p_skip template contains a message
+         *     template and a counter indicating the number of received messages
+         *     matching the message template to be skipped. If not enough
+         *     messages matching the message template arrive at the interface,
+         *     the function fails after timout. Next, messages are consumed from
+         *     the interface and matched against the p_passCriteria template
+         *     list and the p_failCriteria template list. The function
+         *     terminates with pass if a message is received matching a
+         *     pass-template and terminates with fail if a fail-template
+         *     matches. Matching against pass-templates occurs bevor matching
+         *     agains fail-templates. If neither pass-templates nor
+         *     fail-templates match, then the functions continues reading from
+         *     the interface until a match arises, or timeout. The timeout value
+         *     is given by PX_MAX_MSG_WAIT [5.0 seconds, FFS]. Finally, if
+         *     p_forwardMtc is set to true, the last received message is stored
+         *     to be fetched and used later by the main test component. Some
+         *     special use cases: - Set p_skip.skipCounter to 0 to avoid
+         *     skipping, i.e. no skippin - Set p_skip.skipCounter to 0 and
+         *     p_skip.skipMessage to ? to skip exactly one message of any type
+         *     will be skipped. - If the list of fail-templates is empty, then
+         *     the function will wait for the first message maching a
+         *     pass-message, or fail after timeout.
+         * @param p_passCriteria list of message templates which lead to pass
+         * @param p_failCriteria list of message templates which lead to fail
+         * @param p_skip
+         *     Indicate how many messages from a specific sip template should be
+         *     skipped prior to checking
+         * @param p_tpId The Test Purpose identifier
+         * @param p_forwardMtc
+         *     indicate if the received Sip message should be forwarded to the
+         *     mtc
+         * @param p_checkMessage
+         *     indicate if the incomming message should only be checked
+         *     (port.check) or consumed (port.receive). The check operation
+         *     allows read access to the top element of incoming port queues
+         *     without removing the top element from the queue.
+         */     
+        function f_imsIot_receive( 
+          in template SipMessageList p_passCriteria,
+          in template SipMessageList p_failCriteria,
+          in template SkipType p_skip,
+          in charstring p_tpId,
+          in boolean p_forwardMtc,
+          in boolean p_checkMessage
+        ) runs on ImsInterfaceMonitor { 
+
+            var integer v_size := sizeof(valueof(p_failCriteria)); 
+            var DefaultList v_defaultArray;
+
+            v_defaultArray[0] := activate(a_default(p_tpId));
+            f_activateImsSipDefaults(v_defaultArray, 1, p_failCriteria, fail, p_tpId, p_forwardMtc, p_checkMessage);
+            f_activateImsSipDefaults(v_defaultArray, v_size + 1, p_passCriteria, pass, p_tpId, p_forwardMtc, p_checkMessage);
+
+			f_gen_receive(p_tpId, p_skip);
+
+			for (var integer i := 0; i < sizeof(v_defaultArray); i := i + 1) {
+                deactivate(v_defaultArray[i]);
+            }
+		}
+		
+		/**
+         * @desc This function implements skipping of messages as well as timeout handling.
+		 *       Prior to calling this function the message to be cheked for should be added
+		 *       as defaults.
+		 *       This function is independent of a specific interface component.
+         * @param p_tpId The Test Purpose identifier
+         * @param p_skipCount Indicate how many messages should be skipped prior to checking
+         */     
+        function f_gen_receive( 
+          in charstring p_tpId,
+          in template SkipType p_skip
+        ) runs on ImsInterfaceMonitor {
+            var integer skipCount := valueof(p_skip.skipCount);
+			tc_wait.start;
+            
+            alt {
+            	// preamble (consume prior messages)
+            	[skipCount > 0 and ischosen(p_skip.skipMessage.request)] dPort.receive (p_skip.skipMessage.request) {
+            		skipCount := skipCount - 1;
+            		log("***f_gen_receive: Message skipped (intentionally) when checking for " & p_tpId & " at interface " & vc_interfaceName & " ****");
+            		repeat;
+            	}
+            	[skipCount > 0 and ischosen(p_skip.skipMessage.response)] dPort.receive (p_skip.skipMessage.response) {
+            		skipCount := skipCount - 1;
+            		log("***f_gen_receive: Message skipped (intentionally) when checking for " & p_tpId & " at interface " & vc_interfaceName & " ****");
+            		repeat;
+            	}
+	            [] tc_wait.timeout {
+	            	f_setConformanceVerdict(inconc, "***f_gen_receive: Timer tc_wait expired when waiting for incoming message in " & p_tpId & " at interface " & vc_interfaceName & " ****");
+	            }
+            }
+            
+        }
+        
+		/**
+		* @desc Activates for each entry in a expected IMS SIP message list a default 
+		*       for receiving that message and setting the verdict as desired
+		* @param p_default Reference to default array where deaults are to be added
+		* @param p_startIdx Index into default array after which references for 
+		*                   defaults created in this function should be added
+		* @param p_list List of expected messages to be checked in default
+		* @param p_verdict Verdict to be set in case the incoming message matches 
+		                   any of the expcted messages 
+		* @param p_tpId Test Purpose identifir
+		*/
+		function f_activateImsSipDefaults(
+			inout DefaultList p_default,
+			in integer p_startIdx,
+			in template SipMessageList p_list,
+			in verdicttype p_verdict,
+			in charstring p_tpId,
+			in boolean p_forwardMtc,
+			in boolean p_checkMessage
+		) runs on ImsInterfaceMonitor {
+			var integer v_size := sizeof(valueof((p_list))); 
+			var integer v_idx := p_startIdx;
+
+			for (var integer i := 0; i < v_size; i := i + 1) {
+				if (ischosen(p_list[i].request)) {
+					p_default[v_idx] := activate(
+						a_receive_sipRequest(p_list[i].request,p_verdict, p_tpId, p_forwardMtc, p_checkMessage)
+					);
+				} else {
+					p_default[v_idx] := activate(
+						a_receive_sipResponse(p_list[i].response,p_verdict, p_tpId, p_forwardMtc, p_checkMessage)
+					);
+				}
+				v_idx := v_idx + 1;
+			}
+		}
+        
+	}//end group
+		
+	group altsteps {
+		
+		altstep a_default(in charstring p_TP) runs on ImsInterfaceMonitor {
+			[] dPort.receive {
+				log(self, "*** a_default: Received/ignored unexpected message when waiting for message complying to " & p_TP );
+				repeat; 
+			}
+		}
+        
+		/**
+		* @desc This altstep add one alternative checking for a very specifc SIP request.
+		        If it matches then the conformance verdict is set to requested verdict
+		* @param p_message The expected SIP request
+		* @param p_verdict Verdict to be used in case of match
+		* @param p_tpId The test purpose identifier
+		* * @param p_forwardMtc indicates if the received request should be forwarded to mtc
+		*/
+		altstep a_receive_sipRequest(
+			in template Request p_message,
+			in verdicttype p_verdict,
+			in charstring p_tpId,
+			in boolean p_forwardMtc,
+			in boolean p_checkMessage
+		) runs on ImsInterfaceMonitor {
+			var Request v_message;
+			[not p_checkMessage] dPort.receive(p_message) -> value v_message {
+				f_setConformanceVerdict(p_verdict, "***a_receive_sipRequest: Received expected SIP request complying to " & p_tpId & " on interface " & vc_interfaceName & " ***");
+				if(p_forwardMtc) {
+					var SipMessage v_msg;
+					v_msg.request := v_message;
+					icpPort.send(v_msg);
+				}
+			}
+			[p_checkMessage] dPort.check(receive(p_message) -> value v_message) {
+				f_setConformanceVerdict(p_verdict, "***a_receive_sipRequest: Received expected SIP request complying to " & p_tpId & " on interface " & vc_interfaceName & " ***");
+				if(p_forwardMtc) {
+					var SipMessage v_msg;
+					v_msg.request := v_message;
+					icpPort.send(v_msg);
+				}
+			}
+		}
+        
+		/**
+		* @desc This altstep add one alternative checking for a very specifc SIP response.
+		        If it matches then the conformance verdict is set to requested verdict
+		* @param p_message The expected SIP response
+		* @param p_verdict Verdict to be used in case of match
+		* @param p_tpId The test purpose identifier
+		* @param p_forwardMtc indicates if the received reponse should be forwarded to mtc
+		*/
+		altstep a_receive_sipResponse(
+    		in template Response p_message,
+    		in verdicttype p_verdict,
+    		in charstring p_tpId,
+    		in boolean p_forwardMtc,
+    		in boolean p_checkMessage
+		) runs on ImsInterfaceMonitor {
+			var Response v_message;
+			[not p_checkMessage] dPort.receive(p_message) -> value v_message {
+				f_setConformanceVerdict(p_verdict, "***a_receive_sipResponse: Received expected SIP request complying to " & p_tpId & " on interface " & vc_interfaceName & " ***");
+				if(p_forwardMtc) {
+					var SipMessage v_msg;
+					v_msg.response := v_message;
+					icpPort.send(v_msg);
+				}
+			}
+			[p_checkMessage] dPort.check(receive(p_message) -> value v_message) {
+				f_setConformanceVerdict(p_verdict, "***a_receive_sipResponse: Received expected SIP request complying to " & p_tpId & " on interface " & vc_interfaceName & " ***");
+				if(p_forwardMtc) {
+					var SipMessage v_msg;
+					v_msg.response := v_message;
+					icpPort.send(v_msg);
+				}
+			}
+		}
+        
+	}// end group
+	
+group checks {
+
+group checksTC_IMS_MESS_0001{
+		
+		 /**
+          * @desc
+          *     TP_IMS_4002_01 in CFW step 3 (MESSAGE)<br> ensure that {<br>
+          *     when { UE_A sends a MESSAGE to UE_B containing a Message_Body
+          *     greater than 1300 bytes }<br> then { IMS_B receives the MESSAGE
+          *     containing the Message_Body greater than 1300 bytes }<br> }
+          */
+	    function f_mtc_check_TP_IMS_4002_01_gm(ImsInterfaceMonitor p_monitorCompRef) 
+		runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_4002_01(?))},//? CallId can be checked
+                {mw_SipRequest(mw_MESSAGE_Request_Base(?))},
+                {1, mw_SipRequest(mw_MESSAGE_Request_Base(?))},
+                "TP_IMS_4002_01_gm",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+
+	    function f_mtc_check_TP_IMS_4002_01_mw(ImsInterfaceMonitor p_monitorCompRef) 
+		runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_4002_01(?))},//? CallId can be checked
+                {mw_SipRequest(mw_MESSAGE_Request_Base(?))},
+                {0, omit},
+                "TP_IMS_4002_01_mw",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+} // group
+
+    group checksTC_IMS_REG_0001 {	    
+        /**
+    	 * @desc Starts monitor component behavior for TP_IMS_5011_01 
+    	 * 		 the on Gm-interface
+    	 * @param p_monitorCompRef Reference to monitor component
+    	 */
+        function f_mtc_check_TP_IMS_5011_01_gm(
+        	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+        ) runs on ImsTestCoordinator {
+    	   
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5011_01_gm)},
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {0, omit},
+                "TP_IMS_5011_01",
+                false,
+    			p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+        }
+        
+        /**
+    	 * @desc Starts monitor component behavior for TP_IMS_5011_01
+    	 * 		 on the Mw-interface
+    	 * @param p_monitorCompRef Reference to monitor component
+    	 */
+    	 
+    	function f_mtc_check_TP_IMS_5011_01_mw(
+    		ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+    		var charstring v_EUT_A_Addr := f_GetEUTPcscfAddress(PX_EUT_A);
+    		p_monitorCompRef.start(
+        		f_imsIot_receive (
+                    {},
+                    {mw_SipRequest(mdw_TP_IMS_5011_01f_mw)},
+                    {0, omit},
+                    "TP_IMS_5011_01",
+                    false,
+                    true
+        		)
+        	);
+    		p_monitorCompRef.done;
+    		   
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5011_01p_mw(v_EUT_A_Addr))},
+    				{mw_SipRequest(mw_REGISTER_Request_Base)},
+    				{0, omit},
+    				"TP_IMS_5011_01",
+    				false,
+    				p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+    	}
+
+    	/**
+        * @desc Starts monitor component behavior for TP_IMS_5089_01 (gm)
+        * @param p_monitorCompRef Reference to monitor component
+        */		
+    	function f_mtc_check_TP_IMS_5089_01_gm_when (
+        	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+        ) runs on ImsTestCoordinator {
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mw_REGISTER_Request_Base)},
+    				{},
+    				{0, omit},
+    				"TP_IMS_5089_01_gm_when",
+    				false,
+    				p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+        }
+
+
+	/**
+        * @desc Starts monitor component behavior for TP_IMS_5011_02 (gm) 
+        * 		 the on Gm-interface
+        * @param p_monitorCompRef Reference to monitor component
+        */
+    	function f_mtc_check_TP_IMS_5011_02_gm(
+    		ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+    	   
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5011_02_gm)},
+    				{mw_SipRequest(mw_REGISTER_Request_Base)},
+    				{0, omit},
+    				"TP_IMS_5011_02_gm",
+    				false,
+    				p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+    	}
+
+        /**
+        * @desc Starts monitor component behavior for TP_IMS_5011_02 (mw)
+        * @param p_monitorCompRef Reference to monitor component
+        */
+        function f_mtc_check_TP_IMS_5011_02_mw(
+			ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+			var charstring v_EUT_A_Addr := f_GetEUTPcscfAddress(PX_EUT_A);    		
+
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{},
+					{mw_SipRequest(mdw_TP_IMS_5011_02f_mw)},
+					{0, omit},
+					"TP_IMS_5011_02",
+					true,
+					true
+				)
+			);
+			p_monitorCompRef.done;
+
+			p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5011_02p_mw(v_EUT_A_Addr))},
+    				{mw_SipRequest(mw_REGISTER_Request_Base)},
+    				{0, omit},
+    				"TP_IMS_5011_02",
+    				true,
+    				p_checkMessage
+    			)
+			);
+			p_monitorCompRef.done;
+		}
+
+
+    	/**
+        * @desc Starts monitor component behavior for TP_IMS_5089_01 (when)
+        * @param p_monitorCompRef Reference to monitor component
+        */
+    	function f_mtc_check_TP_IMS_5089_01_mw_when(
+    		ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipRequest(mdw_TP_IMS_5089_01_mw_when)},
+					{mw_SipRequest(mw_REGISTER_Request_Base)},
+					{0, omit},
+					"TP_IMS_5089_01 (when)",
+					true,
+					p_checkMessage
+				)
+			);
+    		p_monitorCompRef.done;
+    	}
+
+	    /**
+		 * @desc Starts monitor component behavior for TP_IMS_5089_01 (then)
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5089_01_mw_then(
+	    	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+          p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mdw_TP_IMS_5089_01_mw)},
+                {mw_SipResponse (mw_401Unauthorized_Base)},
+                {0, omit},
+                "TP_IMS_5089_01",
+                true,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+
+
+		/**
+    	* @desc Starts monitor component behavior for TP_IMS_5092_01 (gm) 
+    	* 		 the on Gm-interface
+    	* @param p_monitorCompRef Reference to monitor component
+    	*/
+    	function f_mtc_check_TP_IMS_5092_01_gm(
+    		ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+    		p_monitorCompRef.start(
+			f_imsIot_receive(
+        		{mw_SipRequest(mdw_TP_IMS_5011_02_gm)},
+        		{mw_SipRequest(mw_REGISTER_Request_Base)},
+        		{0, omit},
+        		"TP_IMS_5092_01_gm",
+        		false,
+				p_checkMessage
+    			)
+    		);
+   			p_monitorCompRef.done;
+    	}
+
+		/**
+		* @desc Starts monitor component behavior for TP_IMS_5092_01 (when)
+		* @param p_monitorCompRef Reference to monitor component
+		*/
+        function f_mtc_check_TP_IMS_5092_01_mw_when(
+        	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+        ) runs on ImsTestCoordinator {
+        	p_monitorCompRef.start(
+        	f_imsIot_receive(
+        		{mw_SipRequest(mdw_TP_IMS_5092_01_mw_when)},
+        		{mw_SipRequest(mw_REGISTER_Request_Base)},
+        		{0, omit},
+        		"TP_IMS_5092_01 (when)",
+        		true,
+				p_checkMessage
+        		)
+        	);
+			p_monitorCompRef.done;
+		}
+
+		/**
+        * @desc Starts monitor component behavior for TP_IMS_5092_01
+        * @param p_monitorCompRef Reference to monitor component
+        */
+		function f_mtc_check_TP_IMS_5092_01_mw(
+			ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+			var charstring v_EUT_A_Addr := f_GetEUTPcscfAddress(PX_EUT_A);
+			var template SipUrl v_eutBUri := mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_B));
+			
+    		p_monitorCompRef.start(
+				f_imsIot_receive(
+        			{mw_SipResponse(mdw_TP_IMS_5092_01_mw(v_EUT_A_Addr, v_eutBUri))},
+        			{mw_SipResponse (mw_200OK_Base)},
+        			{0, omit},
+        			"TP_IMS_5092_01",
+        			true,
+					p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+		}
+
+
+		/**
+		* @desc Starts monitor component behavior for TP_IMS_5044_01 (when)
+		* @param p_monitorCompRef Reference to monitor component
+		*/
+    	function f_mtc_check_TP_IMS_5044_01_mw_when(
+    		ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+    	) runs on ImsTestCoordinator return Response {
+    		var template SipUrl v_eutBUri := mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_B)); 
+			var SipMessage v_sip;
+			p_monitorCompRef.start(
+					f_imsIot_receive(
+					{mw_SipResponse(mw_200OK_Base)},
+					{},
+					{0, omit},
+					"TP_IMS_5044_01 (when)",
+					true,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+
+			f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+			return v_sip.response;
+    	}
+
+    /**
+         * @desc Starts monitor component behavior for TP_IMS_5044_01
+         * @param p_monitorCompRef Reference to monitor component
+         */
+    	function f_mtc_check_TP_IMS_5044_01_mw(
+    		ImsInterfaceMonitor p_monitorCompRef, Response p_200OK, boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+    		var charstring v_UEB_PublicId := f_GetUEPublicId(PX_EUT_B);
+    		var template SipUrl v_eutAUri := mw_SipUrl_Host(f_GetEUTPcscfAddress(PX_EUT_A));  		
+    		var SipMessage v_sip;
+    		var charstring v_Epires200OK;
+    		var charstring v_EpiresSubscribe;
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5044_01_mw(?, v_eutAUri, v_UEB_PublicId))},
+    				{mw_SipRequest(mw_SUBSCRIBE_Request_Base)},
+    				{0, omit},
+     				"TP_IMS_5044_01",
+    				true,
+            		p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+    
+    		f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+    		// Check that the expires header is set to "a value greater than the one 
+    		// in the Expires_header of the 200_response"
+    		v_Epires200OK := p_200OK.msgHeader.expires.deltaSec;
+    		v_EpiresSubscribe  := v_sip.request.msgHeader.expires.deltaSec;
+    		if (char2int(v_EpiresSubscribe) > char2int(v_Epires200OK)) {
+    			f_setIotVerdictFAIL("TP_IMS_5044_01 - Expires_header of subscribe is NOT greater than the Expires_header of 200_response.");
+    		}
+    	}
+
+		/**
+        * @desc Starts monitor component behavior for TP_IMS_5096_01
+        * @param p_monitorCompRef Reference to monitor component
+        */
+		function f_mtc_check_TP_IMS_5096_01_mw_when(
+			ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+		) runs on ImsTestCoordinator  return Request {
+    		var SipMessage v_sip;
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5096_01_mw_when)},
+    				{mw_SipRequest(mw_SUBSCRIBE_Request_Base)},
+    				{0, omit},
+    				"TP_IMS_5096_01 (when)",
+    				true,
+					p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+       		f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+       		return v_sip.request;
+		}
+
+
+	    /**
+		 * @desc Starts monitor component behavior for TP_IMS_5096_01
+		 */
+	    function f_mtc_check_TP_IMS_5096_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef, Request p_Subscribe, boolean p_checkMessage
+	    ) runs on ImsTestCoordinator
+	    {
+		   var SipMessage v_sip;
+           var charstring v_Epires200OK;
+           var charstring v_EpiresSubscribe;
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mw_200OK_Base), mw_SipResponse(mw_202Accepted_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5096_01",
+                true,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+		   
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+           // Check that the message contains "Expires_header indicating the same or 
+           // lower expiry time than specified in the initial SUBSCRIBE"
+		   v_Epires200OK := v_sip.response.msgHeader.expires.deltaSec;
+		   v_EpiresSubscribe  := p_Subscribe.msgHeader.expires.deltaSec;          
+           if (char2int(v_Epires200OK) <= char2int(v_EpiresSubscribe)) {
+			 f_setIotVerdictFAIL("TP_IMS_5096_01 - - Expires_header Expires_header of 200_response is NOT the same or lower than the Expires_header of subscribe.");
+           }
+	    }
+
+    } // group
+
+group checksTC_IMS_REG_0002{	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5203_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+		   // Check that the UE sends any register	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5203_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5203_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator return Request {
+		   var SipMessage v_sip;
+		   
+		   //Get first Register
+		   //var charstring v_EUT_A_Addr := f_GetEUTAddress(PX_EUT_A);
+		   var Request v_RegisterStep4, v_RegisterStep2;    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5203_01 first register",
+                true,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+           v_RegisterStep2 := v_sip.request;
+
+		   //Get second Register
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5203_01 second register",
+                true,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+           
+           // TODO: Currently we don't check anything, just that IMS-A sent 2 consecutive Registers  
+           v_RegisterStep4 := v_sip.request;                      
+           return v_RegisterStep4;
+	    }
+  
+} // group
+
+group checksTC_IMS_REG_0002H{	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5402_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+		   // Check that the UE sends any register	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5203_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5402_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator return Request {
+		   var SipMessage v_sip;
+		   
+		   //Get first Register
+		   //var charstring v_EUT_A_Addr := f_GetEUTAddress(PX_EUT_A);
+		   var Request v_RegisterStep4, v_RegisterStep2;    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5203_01 first register",
+                true,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+           v_RegisterStep2 := v_sip.request;
+
+		   //Get second Register
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5203_01 second register",
+                true,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+           v_RegisterStep4 := v_sip.request;                      
+           
+           // Check that IMS_A sends the original Register to
+           // another entrypoint of IMS-B
+           if (not (match (v_RegisterStep4.msgHeader, v_RegisterStep2.msgHeader))){
+             // Headers differ
+            f_setIotVerdictFAIL("TP_IMS_5203_01"); 
+           }
+           if (match (v_RegisterStep4.requestLine, v_RegisterStep4.requestLine)){
+             // IMS-A used same entrypoint
+			f_setIotVerdictFAIL("TP_IMS_5203_01"); 
+           }  
+           return v_RegisterStep4;
+	    }
+  
+  
+} // group
+group checksTC_IMS_REG_0003{	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5129_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+		   // Check that the UE sends any register	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5129_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5129_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator return Response {
+		   var SipMessage v_sip;
+          p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mw_403Forbidden_Base)},
+                {},
+                {1, mw_SipResponse(mw_403Forbidden_Base)}, // TODO check that
+                "TP_IMS_5129_01",
+                true,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+		   
+           return v_sip.response;
+	    }
+  
+  
+} // group
+group checksTC_IMS_REG_0003H{	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5411_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+		   // Check that the UE sends any register	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5411_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5411_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator return Response {
+		   var SipMessage v_sip;
+          p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mw_403Forbidden_Base)},
+                {},
+                {1, mw_SipResponse(mw_403Forbidden_Base)},
+                "TP_IMS_5411_01",
+                true,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+		   
+           return v_sip.response;
+	    }
+  
+} // group
+
+group checksTC_IMS_REG_0004 {
+
+	/**
+    	* @desc Starts monitor component behavior for TP_IMS_5088_01 (gm)
+    	* @param p_monitorCompRef Reference to monitor component
+    	*/
+    	function f_mtc_check_TP_IMS_5088_01_gm(ImsInterfaceMonitor p_monitorCompRef) 
+    		runs on ImsTestCoordinator {
+       	    		
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5088_01_gm)},
+        			{mw_SipRequest(mw_REGISTER_Request_Base)},
+        			{0, omit},
+        			"TP_IMS_5088_01_gm",
+        			false,
+                	false
+        		)
+        	);
+        	p_monitorCompRef.done;
+    	}
+
+    	/**
+    	* @desc Starts monitor component behavior for TP_IMS_5088_01 (mw)
+    	* @param p_monitorCompRef Reference to monitor component
+    	*/
+    	function f_mtc_check_TP_IMS_5088_01_mw(ImsInterfaceMonitor p_monitorCompRef) 
+    		runs on ImsTestCoordinator {
+    		
+			var charstring v_hostname;
+			f_getHostname(PX_EUT_A, "pcscf", v_hostname); // needs recheck	
+        		
+        	p_monitorCompRef.start(
+    			f_imsIot_receive(
+    						{mw_SipRequest(mdw_TP_IMS_5088_01_mw(?, mw_SipUrl_Host(v_hostname)))}, // TODO getHostname(PCSCF) how to hande the callid?
+    						{mw_SipRequest(mw_REGISTER_Request_Base)},
+    						{0, omit},
+    						"TP_IMS_5088_01_mw",
+    						false,
+                			false
+    			)
+        	);
+    	}
+	} // group
+
+	group checksTC_IMS_REG_0005{
+    	/**
+    	* @desc Starts monitor component behavior for TP_IMS_5093_01 (mw)
+    	* @param p_monitorCompRef Reference to monitor component
+    	*/
+    	function f_mtc_check_TP_IMS_5093_01_UE_mw(ImsInterfaceMonitor p_monitorCompRef) 
+    		runs on ImsTestCoordinator {
+    		
+    		var charstring v_hostname;
+    		var integer PX_UE_B := 1; // TODO this is just temporary, UE PIXIT needs to be determined
+    		f_getUEHostname(PX_UE_B, v_hostname); // TODO needs recheck, maybe in more detail with userOrTelephoneSubscriber etc
+    
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5093_01_UE_mw(?, mw_SIP_URI(v_hostname)))}, // TODO getHostname(PCSCF) how to hande the callid?
+    				{mw_SipRequest(mw_MESSAGE_Request_Base(?))},
+    				{0, omit},
+    				"TP_IMS_5093_01_mw",
+    				false,
+                	false
+    			)
+    		);
+    		p_monitorCompRef.done;
+    	}		
+	
+		/**
+    	* @desc Starts monitor component behavior for TP_IMS_5093_01 (mw)
+    	* @param p_monitorCompRef Reference to monitor component
+    	*/
+    	function f_mtc_check_TP_IMS_5093_01_IMS_mw(ImsInterfaceMonitor p_monitorCompRef) 
+    		runs on ImsTestCoordinator {
+    		
+    		var charstring v_hostname;
+    		f_getHostname(PX_EUT_A, "pcscf", v_hostname); // needs recheck
+    
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5093_01_IMS_mw(?, mw_SIP_URI(v_hostname)))}, // TODO getHostname(PCSCF) how to hande the callid?
+    				{mw_SipRequest(mw_MESSAGE_Request_Base(?))},
+    				{0, omit},
+    				"TP_IMS_5093_01_mw",
+    				false,
+                	false
+    			)
+    		);
+    		p_monitorCompRef.done;
+    	}
+	} // end group
+	group checksTC_IMS_REG_0006{
+	
+		/**
+		* @desc Starts monitor component behavior for TP_IMS_5094_01 (mw)
+		* @param p_monitorCompRef Reference to monitor component
+		*/
+		function f_mtc_check_TP_IMS_5094_01_UE(ImsInterfaceMonitor p_monitorCompRef) 
+			runs on ImsTestCoordinator {
+    		
+			var charstring v_hostname;
+			var integer PX_UE_B := 1; // TODO this is just temporary, UE PIXIT needs to be determined
+			f_getUEHostname(PX_UE_B, v_hostname); // TODO needs recheck, maybe in more detail with userOrTelephoneSubscriber etc
+    
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipRequest(mdw_TP_IMS_5094_01_UE(?, mw_SIP_URI(v_hostname)))}, // TODO getHostname(PCSCF) how to hande the callid?
+					{mw_SipRequest(mw_MESSAGE_Request_Base(?))},
+					{0, omit},
+					"TP_IMS_5094_01_mw",
+					false,
+                	false
+				)
+			);
+			p_monitorCompRef.done;
+		}		
+	
+		/**
+		* @desc Starts monitor component behavior for TP_IMS_5094_01 (mw)
+		* @param p_monitorCompRef Reference to monitor component
+		*/
+		function f_mtc_check_TP_IMS_5094_01_IMS(ImsInterfaceMonitor p_monitorCompRef) 
+			runs on ImsTestCoordinator {
+
+			var charstring v_hostname;
+			f_getHostname(PX_EUT_A, "pcscf", v_hostname); // needs recheck
+
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipRequest(mdw_TP_IMS_5094_01_IMS_mw(?, mw_SIP_URI(v_hostname)))}, // TODO getHostname(PCSCF) how to hande the callid?
+					{mw_SipRequest(mw_MESSAGE_Request_Base(?))},
+					{0, omit},
+					"TP_IMS_5094_01_mw",
+					false,
+                	false
+				)
+			);
+			p_monitorCompRef.done;
+		}
+    		
+	} // end group
+
+group checksTC_IMS_REG_0007 {	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5034_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5034_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5134_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator return Request {
+	    // TODO Get IBPC_SIP_URI of IMS A
+		   var charstring v_IBPC := "IBPC_SIP_URI of IMS A"; //f_GetEUTAddress(PX_EUT_A); 
+		   var SipMessage v_sip;    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5134_01_mw(v_IBPC))},
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {0, omit},
+                "TP_IMS_5134_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+           // fetch second register 
+    	   p_monitorCompRef.start(
+			f_imsIot_receive(
+							{mw_SipRequest(mdw_TP_IMS_5134_01_mw(v_IBPC))},
+							{mw_SipRequest(mw_REGISTER_Request_Base)},
+							{1, mw_SipResponse(mw_Response_Base(c_statusLine401, ?, ?))}, // (ignore 401 Unauthorized)
+							"TP_IMS_5134_01",
+							true,
+                			false
+			)
+    		);
+    		p_monitorCompRef.done;  
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+           return v_sip.request;
+	    }
+
+
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5405_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator  return Request
+	    {
+		   var SipMessage v_sip;    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5405_01_mw)},
+                {mw_SipRequest(mw_SUBSCRIBE_Request_Base)},
+                {1, mw_SipResponse(mw_Response_Base(c_statusLine200, ?, ?))}, // ignore 200 Ok 
+                "TP_IMS_5405_01",
+                true,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+           return v_sip.request;
+	    }
+} // group
+
+
+group checksTC_IMS_CALL_0001 {	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5097_01",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator  {
+		   var charstring v_EUT_A_Addr := f_GetEUTScscfAddress(PX_EUT_A);
+	       p_monitorCompRef.start(
+        	f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5097_01_mw(mw_SipUrl_Host(v_EUT_A_Addr)))},
+                {},
+                {0, omit},
+                "TP_IMS_5097_01",
+                true,
+				p_checkMessage
+            )
+       	   );
+       	   p_monitorCompRef.done;
+		} //function
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5097_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_02_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5097_02",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior for TP_IMS_5097_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_02_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5097_02_mw(mw_SIP_URI_Base, mw_TEL_URI_Base))},
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {0, omit},
+                "TP_IMS_5097_02",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+    	/**
+		  * @desc Starts monitor component behavior for TP_IMS_5097_04
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+    	function f_mtc_check_TP_IMS_5097_04_gm(
+    		ImsInterfaceMonitor p_monitorCompRef,
+    		boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+    				p_monitorCompRef.start(
+    		f_imsIot_receive(
+    			{mw_SipRequest(mdw_TP_IMS_5097_04_gm(mw_TEL_URI_Base))},//TODO check TEL_URI of UE_B
+    			{mw_SipRequest(mw_INVITE_Request_Base)},
+    			{0, omit},
+    			"TP_IMS_5097_04",
+    			false,
+    			p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+    	}
+	    
+		/**
+          * @desc Starts monitor component behavior for TP_IMS_5097_04
+          * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5097_04_mw(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+		   p_monitorCompRef.start(
+			f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5097_04_mw(mw_SIP_URI_Base))},//TODO check SIP_URI of UE_B
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{0, omit},
+				"TP_IMS_5097_04",
+				false,
+				p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5107_02_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_ACK_Request_Base(?))},
+                {},
+                {0, omit},
+                "TP_IMS_5107_02",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5107_02_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator  {
+	    var charstring v_EUT_A_Addr := f_GetEUTScscfAddress(PX_EUT_A);
+	    	    
+        p_monitorCompRef.start(
+         f_imsIot_receive(
+            {mw_SipRequest(mdw_TP_IMS_5107_02_mw(?, mw_SipUrl_Host(v_EUT_A_Addr)))},
+            {},
+            {0, omit},
+            "TP_IMS_5107_02",
+            true,
+			p_checkMessage
+         )
+        );
+       p_monitorCompRef.done;
+	   } //function
+
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5107_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_BYE_Request_Base(?))},
+                {},
+                {0, omit},
+                "TP_IMS_5107_01",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+
+
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5107_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator  {	
+		var charstring v_EUT_A_Addr := f_GetEUTScscfAddress(PX_EUT_A);
+	    
+        p_monitorCompRef.start(
+         f_imsIot_receive(
+            {mw_SipRequest(mdw_TP_IMS_5107_01_mw(?, mw_SipUrl_Host(v_EUT_A_Addr)))},
+            {},
+            {0, omit},
+            "TP_IMS_5107_01",
+            true,
+			p_checkMessage
+         )
+        );
+        p_monitorCompRef.done;
+	   } //function
+		
+    	/**
+    	  * @desc Starts monitor component behavior
+    	  * @param p_monitorCompRef Reference to monitor component
+    	  */
+	    function f_mtc_check_TP_IMS_5115_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mw_180Ringing_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5115_01",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+	    function f_mtc_check_TP_IMS_5115_01_mw(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mdw_TP_IMS_5115_01_mw)},
+                {mw_SipResponse(mw_180Ringing_Base)},
+                {0, omit},
+                "TP_IMS_5115_01",
+                true,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+		
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5115_02_gm(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+    
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+					{mw_SipResponse(mw_200OK_Base)},
+					{},
+					{0, omit},
+					"TP_IMS_5115_02",
+					false,
+					p_checkMessage
+    			)
+    		);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5115_02_mw(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage 
+        ) runs on ImsTestCoordinator {
+
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+					{mw_SipResponse(mdw_TP_IMS_5115_02_mw)},
+					{mw_SipResponse(mw_200OK_Base)},
+					{0, omit},
+					"TP_IMS_5115_02",
+					true,
+					p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+		}
+		
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		*/
+		function f_mtc_check_TP_IMS_5115_03_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+		   	    		
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+					{mw_SipResponse(mw_180Ringing_Base)},
+					{},
+					{0, omit},
+					"TP_IMS_5115_03",
+					false,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5115_03_mw(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipResponse(mdw_TP_IMS_5115_03_mw(mw_SIP_URI_Base, mw_TEL_URI_Base))},
+					{mw_SipResponse(mw_180Ringing_Base)},
+					{0, omit},
+					"TP_IMS_5115_03",
+					true,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+		
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5115_04_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+    
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+            		{mw_SipResponse(mw_200OK_Base)},
+            		{},
+            		{0, omit},
+            		"TP_IMS_5115_04",
+            		false,
+            		p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5115_04_mw(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+        			{mw_SipResponse(mdw_TP_IMS_5115_04_mw(mw_SIP_URI_Base, mw_TEL_URI_Base))},
+        			{mw_SipResponse(mw_200OK_Base)},
+        			{0, omit},
+        			"TP_IMS_5115_04",
+        			true,
+        			p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+		
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5131_01_gm(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage 
+        ) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipResponse(mw_180Ringing_Base)},
+					{},
+					{0, omit},
+					"TP_IMS_5131_01",
+					false,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5131_01_mw(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage 
+        ) runs on ImsTestCoordinator {	
+		   	    		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipResponse(mdw_TP_IMS_5131_01_mw)},
+					{mw_SipResponse(mw_180Ringing_Base)},
+					{0, omit},
+					"TP_IMS_5131_01",
+					true,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+		
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+        function f_mtc_check_TP_IMS_5131_02_gm(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage 
+        ) runs on ImsTestCoordinator {
+    
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+            		{mw_SipResponse(mw_200OK_Base)},
+            		{},
+            		{0, omit},
+            		"TP_IMS_5131_02",
+            		false,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+        function f_mtc_check_TP_IMS_5131_02_mw(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage 
+        ) runs on ImsTestCoordinator {
+
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+        			{mw_SipResponse(mdw_TP_IMS_5131_02_mw)},
+        			{mw_SipResponse(mw_200OK_Base)},
+        			{0, omit},
+        			"TP_IMS_5131_02",
+        			true,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+} // group
+
+group checksTC_IMS_CALL_0001F {
+
+/*functions already used in test TC_IMS_CALL_0001
+ * f_mtc_check_TP_IMS_5097_01_gm 
+ * f_mtc_check_TP_IMS_5097_01_mw
+ * f_mtc_check_TP_IMS_5107_01_gm 
+ * f_mtc_check_TP_IMS_5107_01_mw
+ * f_mtc_check_TP_IMS_5107_02_gm 
+ * f_mtc_check_TP_IMS_5107_02_mw
+ * f_mtc_check_TP_IMS_5115_01_gm 
+ * f_mtc_check_TP_IMS_5115_01_mw
+ * f_mtc_check_TP_IMS_5115_02_gm 
+ * f_mtc_check_TP_IMS_5115_02_mw
+ * f_mtc_check_TP_IMS_5131_01_gm 
+ * f_mtc_check_TP_IMS_5131_01_mw
+ * f_mtc_check_TP_IMS_5131_02_gm 
+ * f_mtc_check_TP_IMS_5131_02_mw
+ * 
+*/
+} // group
+
+
+group checksTC_IMS_SS_0001 {	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5310_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5310_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5310_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator  {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5310_01_mw)},
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {1, mw_SipRequest(mw_INVITE_Request_Base)},
+                "TP_IMS_5310_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5310_01_isc(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator  {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5310_01_isc)},
+                {},
+                {0, omit},
+                "TP_IMS_5310_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5312_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator  {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mdw_TP_IMS_5312_01_mw)},
+                {},
+                {1, mw_SipResponse(mw_Response_Base(c_statusLine200, ?, ?))}, // skip 1 200 OK
+                "mdw_TP_IMS_5312_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5312_01_isc(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator  {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mdw_TP_IMS_5312_01_isc)},
+                {},
+                {0, omit},
+                "TP_IMS_5312_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+} // group
+
+
+group checksTC_IMS_SS_0002 {
+	
+	// f_mtc_check_TP_IMS_5310_01_mw already used in test TC_IMS_SS_0001	    
+	// f_mtc_check_TP_IMS_5310_01_isc already used in test TC_IMS_SS_0001	    
+}
+
+group checksTC_IMS_SS_0007 {	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5046_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5046_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5046_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator  {
+		   var template SipUrl v_pcscfEutAUrl := mw_SipUrl_Host(f_GetEUTPcscfAddress(PX_EUT_A));
+		   var SipMessage v_sip; 
+		   var Route v_Route;
+		   var template Route vt_pcscfRoute := {
+					fieldName := ROUTE_E,
+					routeBody := {mw_routeBody(v_pcscfEutAUrl), *}  };
+	       var Via v_Via;
+	       var template Via vt_pcscfVia := {
+	       			fieldName := VIA_E,
+					viaBody := {mw_ViaBody_interface(v_pcscfEutAUrl.hostPort), *}  };
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5046_01_mw(v_pcscfEutAUrl))},
+                {},
+                {0, omit},
+                "TP_IMS_5046_01",
+                true,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+		   f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+		   v_Route := v_sip.request.msgHeader.route;
+		   v_Via := v_sip.request.msgHeader.via;
+			
+    		// Check Route header
+    	  if (match(v_Route, vt_pcscfRoute)) {
+			f_setIotVerdictFAIL("TP_IMS_5046_01");
+    		} 
+		   // Check Via header
+		   if (match(v_Via, vt_pcscfVia)) {
+	       } else {
+			f_setIotVerdictFAIL("TP_IMS_5046_01");
+		   }
+	    }
+
+	    /**
+		 * @desc Starts monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5110_01_isc(
+	    	ImsInterfaceMonitor p_monitorCompRef)
+	    runs on ImsTestCoordinator 
+	    {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mw_200OK_Base)},
+                {},
+                {0, omit}, // TODO skip parameter
+                "TP_IMS_5110_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;		   
+	    }
+	    /**
+		 * @desc Starts monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5110_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef)
+	    runs on ImsTestCoordinator 
+	    {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mw_200OK_Base)},
+                {},
+                {0, omit},// TODO skip parameter
+                "TP_IMS_5110_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;		   
+	    }
+
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_09_isc(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator  {
+		   var template SipUrl v_EutB_ASUrl := mw_SipUrl_Host(f_GetEUTASServerAddress(PX_EUT_B));
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5097_09_isc(v_EutB_ASUrl))},
+                {},
+                {0, omit},
+                "TP_IMS_5097_09",
+                true,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+
+
+} // group
+
+	group messagingChecks {
+		/**
+		 * @desc Starts monitor component behavior for TP_IMS_5097_05
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_05_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5097_05",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior for TP_IMS_5097_05
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_05_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+		   var charstring v_EUT_A_Addr := f_GetEUTScscfAddress(PX_EUT_A);
+           
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {},
+                {
+                	mw_SipRequest(mdw_TP_IMS_5097_05_f_mw(*, mw_SipUrl_Host(v_EUT_A_Addr))), 
+                	mw_SipRequest(mw_MESSAGE_Request_Base(*))
+                },
+                {0, omit},
+                "TP_IMS_5097_05",
+                false,
+                true
+            )
+           );
+           p_monitorCompRef.done;
+           
+           
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5097_05_p_mw(*, mw_SipUrl_Host(v_EUT_A_Addr)))},
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {0, omit},
+                "TP_IMS_5097_05",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5097_05
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_07_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5097_07",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+		 * @desc Starts monitor component behavior for TP_IMS_5097_07
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_07_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5097_07_mw(*,mw_SIP_URI_Base, mw_TEL_URI_Base))},
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {0, omit},
+                "TP_IMS_5097_07",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	      
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5097_08
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_08_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5097_08_gm(*))},
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {0, omit},
+                "TP_IMS_5097_08",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+		 * @desc Starts monitor component behavior for TP_IMS_5097_08
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_08_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5097_08_mw(*))},
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {0, omit},
+                "TP_IMS_5097_08",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5117_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5117_02_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mdw_2XX_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5117_02",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5117_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5117_02_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+           		{mw_SipResponse(mw_TP_IMS_5117_02_mw)},
+                {mw_SipResponse(mdw_2XX_Base)},
+                {0, omit},
+                "TP_IMS_5117_02",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5117_06
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5117_06_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mdw_2XX_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5117_06",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5117_06
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5117_06_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+           		{mw_SipResponse(mw_TP_IMS_5117_06_mw)},
+                {mw_SipResponse(mdw_2XX_Base)},
+                {0, omit},
+                "TP_IMS_5117_06",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5118_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5118_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mw_200OK_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5118_01",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5118_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5118_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+           		{mw_SipResponse(mw_TP_IMS_5118_01_mw)},
+                {mw_SipResponse(mw_200OK_Base)},
+                {0, omit},
+                "TP_IMS_5118_01",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }	
+		
+		 
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5108_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5108_02_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5108_02",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior for TP_IMS_5108_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5108_02_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+	       var template SipUrl v_SCSCF_IMS_B := mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_B)); 
+           var SemicolonParam_List p_paramList;
+           var GenericParam p_param;
+           var SipMessage v_sip;
+           
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5108_02a_mw(*))},
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {0, omit},
+                "TP_IMS_5108_02",
+                true,
+                true
+            )
+           );
+           p_monitorCompRef.done;
+           
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+           p_paramList := v_sip.request.msgHeader.pChargingVector.chargeParams;
+           for(var integer i := 0; i < lengthof(p_paramList); i:= i+1) {
+           		if(p_paramList[i].id == "icid-value") {
+           			p_param := p_paramList[i];
+           		}
+           }
+           
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {},
+                {
+                	mw_SipRequest(mdw_TP_IMS_5108_02b_f_mw(*)),
+                	mw_SipRequest(mw_MESSAGE_Request_Base(*))
+                },
+                {0, omit},
+                "TP_IMS_5108_02",
+                false,
+                true
+            )
+           );
+           p_monitorCompRef.done;
+           
+           
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {},
+                {
+                	mw_SipRequest(mdw_TP_IMS_5108_02b_p_mw(*, v_SCSCF_IMS_B, p_param)),
+                	mw_SipRequest(mw_MESSAGE_Request_Base(*))
+                },
+                {0, omit},
+                "TP_IMS_5108_02",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	 
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5050_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5050_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5050_01",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	
+	  
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5050_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5050_01_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+	    	var template SipUrl v_PCSCF_IMS_B := mw_SipUrl_Host(f_GetEUTPcscfAddress(PX_EUT_B)); 
+	    	var template SipUrl v_UE_A := mw_SipUrl_Host(f_GetEUTPublicId(PX_EUT_A)); 
+	    	
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+           		{mw_SipRequest(mdw_TP_IMS_5050_01_mw(*, v_PCSCF_IMS_B, v_UE_A))},
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {0, omit},
+                "TP_IMS_5050_01",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }	
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5050_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5114_02_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+	    	
+	      p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5114_02",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;	
+	    }
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5050_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5114_02_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+	    	
+	      p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5114_02",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;	
+	    
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+           		{mw_SipResponse(mdw_4XX_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5114_02",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5108_06
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5108_06_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+	       p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5108_06",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5108_06
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5108_06_mw(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+	    	
+	      p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5108_06",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;	
+	    
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+           		{mw_SipResponse(mw_404NotFound_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5114_02",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	}
+	
+} // end group
+}// end module
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_Functions.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_Functions.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_Functions.ttcn	(revision 22)
@@ -0,0 +1,621 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides common function for TestCoordinator component.
+ */
+module AtsImsIot_Functions {
+ 
+ 	import from AtsImsIot_TestSystem {type ImsTestCoordinator;}
+
+ 	import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT, PX_PRODUCTS;}
+
+ 	import from AtsImsIot_TypesAndValues {type SipMessage;}
+
+
+ 	import from LibIms_UpperTester all;
+
+	import from LibIot_TestInterface {type InterfaceMonitor, TestCoordinator, EquipmentUser;}
+ 	
+ 	import from LibIot_Functions {function f_getE2EVerdict;}
+ 	
+ 	group ue {
+ 		
+ 		/**
+		  * @desc
+		  *     Starts user component behavior for triggering the registration
+		  *     procedures at the UE from test coordinator.
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userTriggerRegistration(EquipmentUser p_userCompRef, ImsUserInfo p_userInfo) 
+ 		runs on TestCoordinator 
+ 		return boolean {
+      		var boolean v_status := true; 
+     		// TODO Investigate if f_PR_user_home_registration is to be removed
+     		// Reason: Thre is no difference when triggering UE to register in home or visiting NW
+     		if( p_userInfo.publicId  == "dummy" ) { return false; } 
+     		
+     		v_status := f_mtc_userRegister(p_userCompRef, p_userInfo.publicId, p_userInfo.privateId, p_userInfo.password); 		
+ 			return v_status;
+ 		}
+ 		
+ 		/**
+		  * @desc
+		  *     Starts user component behavior for checking the successful
+		  *     registration.
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userCheckRegistration(EquipmentUser p_userCompRef, ImsUserInfo p_userInfo) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+			if( p_userInfo.publicId  == "dummy" ) { return false; }       		
+     		v_status := f_mtc_userCheckRegistrationSuccessful(p_userCompRef); 		
+ 			return v_status;
+     		}
+
+ 		/**
+		  * @desc Trigger UE given by p_ueRef to initiate an MO call 
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @param p_calledParty ImsUserInfo of called party
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userTriggerInitiateCall(EquipmentUser p_ueRef, ImsUserInfo p_calledParty) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+ 		/**
+		  * @desc Trigger UE given by p_ueRef to initiate an MO call 
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userTriggerAnswerCall(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+ 		/**
+		  * @desc Trigger UE given by p_ueRef to end current call 
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_triggerEndCall(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+
+
+ 		/**
+		  * @desc Trigger UE given by p_ueRef to enter HOLD state 
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userTriggerHold(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+ 		/**
+		  * @desc Trigger UE given by p_ueRef to leave HOLD state and resume pending call  
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userTriggerResume(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+			
+ 		/**
+		  * @desc Check that UE given by p_ueRef is ringing
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return true or false
+		  */
+ 		function f_mtc_userCheckRinging(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+
+ 		/**
+		  * @desc Check that UE given by p_ueRef reports a successfull call establishment
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return true or false
+		  */
+ 		function f_mtc_userCheckCallEstablished(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+
+
+ 		/**
+		  * @desc Check that UE by p_ueRef given reports that its peer is ringing
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return true or false
+		  */
+ 		function f_mtc_userCheckPeerIsRinging(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+ 		/**
+		  * @desc Check that UE by p_ueRef given reports HOLD state
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return true or false
+		  */
+ 		function f_mtc_userCheckUserOnHold(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+ 		/**
+		  * @desc Check that UE by p_ueRef given reports that call has been resumed
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return true or false
+		  */
+ 		function f_mtc_userCheckCallResumed(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+ 		/**
+		  * @desc Check that UE by p_ueRef given reports that call has ended
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return true or false
+		  */
+ 		function f_mtc_userCheckCallEnded(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+		/**
+			* @desc Check that UE by p_ueRef given reports that call is no longer offered
+			* @param p_userCompRef Reference to IMS UE user component
+			* @return true or false
+			*/
+		function f_mtc_userCheckCallNoLongerOffered(EquipmentUser p_ueRef) 
+			runs on TestCoordinator return boolean {
+			var boolean v_status := true; 
+			// TODO
+			return v_status;
+			}
+
+
+			
+ 		/**
+		  * @desc Start capturing and monitoring traffic on all configured interfaces
+		  * @return true or false
+		  */
+ 		function f_mtc_StartAllTrafficCapture() 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+
+
+ 		
+ 		/**
+		  * @desc Starts user component behaviour for registration from test coordinator
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @param p_publicId public user identity
+		  * @param p_privateId private user identity
+		  * @param p_pw user password
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userRegister(EquipmentUser p_userCompRef, charstring p_publicId, charstring p_privateId, charstring p_pw) runs on TestCoordinator return boolean {
+ 			// TODO server address parameter may needed
+ 			var boolean v_success := false;
+ 			
+ 			p_userCompRef.start(f_userRegistration(p_publicId, p_privateId, p_pw));
+ 			
+ 			p_userCompRef.done;
+ 			
+ 			if(f_getE2EVerdict() == pass) {
+ 				v_success := true;	
+ 			}
+     		
+     		return v_success;
+ 		}
+
+ 		function f_mtc_userCheckRegistrationSuccessful(EquipmentUser p_userCompRef) runs on TestCoordinator return boolean {
+ 			var boolean v_success := false;
+ 			
+ 			p_userCompRef.start(f_checkUserIsRegistered());
+ 			
+ 			p_userCompRef.done;
+ 			
+ 			if(f_getE2EVerdict() == pass) {
+ 				v_success := true;	
+ 			}
+     		
+     		return v_success;
+ 		}
+
+		
+ 		/**
+		  * @desc Starts user component behaviour for registration from test coordinator
+		  * @param p_userCompRef Reference ot IMS UE user component
+		  * @param publicId public user identity
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userDeregister(EquipmentUser p_userCompRef, charstring p_publicId) runs on TestCoordinator return boolean {
+ 			var boolean v_success := false;
+ 			
+ 			p_userCompRef.start(f_userDeregistration(p_publicId));
+ 			
+ 			p_userCompRef.done;
+     		
+     		if( f_getE2EVerdict() == pass) {
+ 				v_success := true;	
+ 			}
+     		
+     		return v_success;
+ 		}
+ 		
+ 		/**
+ 		 * 
+ 		 * @desc Starts user component behaviour for sending a message from test coordinator
+ 		 * @param p_userCompRef Reference ot IMS UE user component
+ 		 * @param p_content Content of meessage to be sent
+ 		 */
+ 		function f_mtc_userSendMessage(EquipmentUser p_userCompRef, charstring p_content) runs on TestCoordinator return boolean {
+ 			var boolean v_success := false;
+ 			
+ 			p_userCompRef.start(f_userSendMessage(p_content));
+ 			
+ 			p_userCompRef.done;
+     		
+      		if(f_getE2EVerdict() == pass) {
+      			v_success := true;
+      		}
+     		
+     		return v_success;
+ 		}
+ 		
+ 		/**
+ 		 * 
+ 		 * @desc Starts user component behaviour for checking message receipt from test coordinator 
+ 		 * @param p_userCompRef Reference ot IMS UE user component
+ 		 * @param p_content Content of meessage to be received
+ 		 */
+ 		function f_mtc_userCheckMessageReceipt(EquipmentUser p_userCompRef) runs on TestCoordinator return boolean {
+ 			var boolean v_success := false;
+ 			
+ 			p_userCompRef.start(f_userCheckMessageReceipt());
+ 			
+ 			p_userCompRef.done;
+     		
+            if(f_getE2EVerdict() == pass) {
+      			v_success := true;
+  			}
+     		
+     		return v_success;
+ 		}
+ 		
+ 		/**
+ 		 * 
+ 		 * @desc Starts user component behaviour for checking message receipt from test coordinator 
+ 		 * @param p_userCompRef Reference ot IMS UE user component
+ 		 * @param p_content Content of meessage to be received
+ 		 */
+ 		function f_mtc_userCheckMessageNotDelivered(EquipmentUser p_userCompRef) runs on TestCoordinator return boolean {
+ 			var boolean v_success := false;
+ 			
+ 			p_userCompRef.start(f_userCheckMessageNotDelivered());
+ 			
+ 			p_userCompRef.done;
+     		
+            if(f_getE2EVerdict() == pass) {
+      			v_success := true;
+  			}
+     		
+     		return v_success;
+ 		}
+ 		
+ 		function f_getAnyValidUser(integer p_productIdx) return ImsUserInfo {
+ 		  var integer v_size := sizeof(PX_IMS_USER_DATA);
+ 		  const ImsUserInfo c_dummyInfo := { "dummy", "dummy", "dummy", "dummy", "dummy" };
+		  var ImsUserIdentity v_userid;
+ 		  
+ 		  for(var integer i := 0; i < v_size; i := i+1) {
+ 		     if(PX_IMS_USER_DATA[i].productIndex == p_productIdx) {
+				var integer v_size_j := sizeof(PX_IMS_USER_DATA[i].userIds);
+				for(var integer j := 0; j < v_size_j; j := j+1) {
+ 		     	   if ( ischosen(PX_IMS_USER_DATA[i].userIds[j].genUserId )) {
+ 		     	   	 return PX_IMS_USER_DATA[i].userIds[j].genUserId;
+ 		     	   }  // end if
+				} // end for j
+				log("f_getAnyValidUser: Did not find specified user id in specified product in PX_IMS_USER_DATA");
+				return c_dummyInfo;
+ 		    } // end if
+ 		  } // end for i
+		  log("f_getAnyValidUser: Did not find specified product in PX_IMS_USER_DATA");
+ 		  return c_dummyInfo;
+ 		}
+ 		
+ 		function f_getTelUserId(integer p_productIdx) return ImsUserInfo {
+ 		  var integer v_size := sizeof(PX_IMS_USER_DATA);
+ 		  const ImsUserInfo c_dummyInfo := { "dummy", "dummy", "dummy", "dummy", "dummy" };
+		  var ImsUserIdentity v_userid;
+ 		  
+ 		  for(var integer i := 0; i < v_size; i := i+1) {
+ 		     if(PX_IMS_USER_DATA[i].productIndex == p_productIdx) {
+				var integer v_size_j := sizeof(PX_IMS_USER_DATA[i].userIds);
+				for(var integer j := 0; j < v_size_j; j := j+1) {
+ 		     	   if ( ischosen(PX_IMS_USER_DATA[i].userIds[j].telUserId )) {
+ 		     	   	 return PX_IMS_USER_DATA[i].userIds[j].telUserId;
+ 		     	   }  // end if
+				} // end for j
+				log("f_getTelUserId: Did not find specified user id in specified product in PX_IMS_USER_DATA");
+				return c_dummyInfo;
+ 		    } // end if
+ 		  } // end for i
+		  log("f_getTelUserId: Did not find specified product in PX_IMS_USER_DATA");
+ 		  return c_dummyInfo;
+ 		}
+ 		
+ 		function f_getSipUserId(integer p_productIdx) return ImsUserInfo {
+ 		  var integer v_size := sizeof(PX_IMS_USER_DATA);
+ 		  const ImsUserInfo c_dummyInfo := { "dummy", "dummy", "dummy", "dummy", "dummy" };
+		  var ImsUserIdentity v_userid;
+ 		  
+ 		  for(var integer i := 0; i < v_size; i := i+1) {
+ 		     if(PX_IMS_USER_DATA[i].productIndex == p_productIdx) {
+				var integer v_size_j := sizeof(PX_IMS_USER_DATA[i].userIds);
+				for(var integer j := 0; j < v_size_j; j := j+1) {
+ 		     	   if ( ischosen(PX_IMS_USER_DATA[i].userIds[j].sipUserId )) {
+ 		     	   	 return PX_IMS_USER_DATA[i].userIds[j].sipUserId;
+ 		     	   }  // end if
+				} // end for j
+				log("f_getSipUserId: Did not find specified user id in specified product in PX_IMS_USER_DATA");
+				return c_dummyInfo;
+ 		    } // end if
+ 		  } // end for i
+		  log("f_getSipUserId: Did not find specified product in PX_IMS_USER_DATA");
+ 		  return c_dummyInfo;
+ 		}
+ 		
+ 		
+
+ 		function f_getHoldUser(integer p_productIdx) return ImsUserInfo {
+		  const ImsUserInfo c_dummyInfo := { "dummy", "dummy", "dummy", "dummy", "dummy" };
+		  // TODO
+ 		  return c_dummyInfo;
+ 		} 		
+ 		 		
+		function f_getHostname(integer p_productIdx, charstring p_entity, out charstring p_hostname) 
+					return boolean {
+			// TODO
+			return true;		
+		} 		
+ 		
+		// TODO 
+		function f_getUEHostname(integer p_ID, out charstring p_hostname) 
+				return boolean {
+	  	
+			// TODO
+				
+			return true;		
+		} 
+ 		
+    	/**
+    	 * @desc
+    	 *     Preamble to handle user registration in home network from test coordinator
+    	 * @param p_userCompRef Reference ot IMS UE user component
+    	 * @return true in case of successfull execution otherwise false
+    	 */
+     	function f_PR_user_home_registration(EquipmentUser p_userCompRef, ImsUserInfo p_userInfo) 
+     	runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+			if( p_userInfo.publicId  == "" ) { return false; } 
+     		
+     		v_status := f_mtc_userRegister(p_userCompRef, p_userInfo.publicId, p_userInfo.privateId, p_userInfo.password); 
+     		
+     		return v_status;
+     	}
+     	
+    	/**
+    	 * @desc
+    	 *     Postamble to handle user deregistration in home network from test coordinator
+    	 * @param p_userCompRef Reference ot IMS UE user component
+    	 * @return true in case of successfull execution otherwise false
+    	 */
+     	function f_PO_user_home_deregistration(EquipmentUser p_userCompRef) runs on ImsTestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		
+     		v_status := f_mtc_userDeregister(p_userCompRef, "*"); // deregister all previous users
+     		
+     		return v_status;
+     	}
+     	
+    	/**
+    	 * @desc
+    	 *     Preamble to handle user registration in roaming network from test coordinator
+    	 * @param p_userCompRef Reference ot IMS UE user component
+    	 * @return true in case of successfull execution otherwise false
+    	 */
+     	function f_PR_user_roaming_registration(EquipmentUser p_userCompRef, ImsUserInfo p_userInfo) 
+     	runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+			if( p_userInfo.publicId  == "" ) { return false; } 
+     		
+     		// TODO check roaming registration
+     		v_status := f_mtc_userRegister(p_userCompRef, p_userInfo.publicId, p_userInfo.privateId, p_userInfo.password); 
+     		
+     		return v_status;
+     	}
+     	
+    	/**
+    	 * @desc
+    	 *     Postamble to handle user deregistration in roaming network from test coordinator
+    	 * @param p_userCompRef Reference ot IMS UE user component
+    	 * @return true in case of successfull execution otherwise false
+    	 */
+     	function f_PO_user_roaming_deregistration(EquipmentUser p_userCompRef) runs on ImsTestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		
+     		// TODO check roaming de-registration
+     		v_status := f_mtc_userDeregister(p_userCompRef, "*"); // deregister all previous users
+     		
+     		return v_status;
+     	}
+
+    	/**
+    	 * @desc Get the S-CSCF FQDN address of referenced EUT 
+    	 * @return if a S-CSCF is avaiable, the domainname of the S-CSCF, 
+    	 *         otherwise error_string
+    	 */
+       function f_GetEUTScscfAddress(integer p_ProductIdx) return charstring {
+			// TODO function not tested
+			var integer v_size_interfaces := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces);
+			var integer v_size_ipinterfaceinfo;
+			var integer v_interface := -1;
+			var integer v_ipinterfaceinfo := -1;
+			var charstring v_domainname;
+  
+			for(var integer i := 0; i < v_size_interfaces; i := i+1) {
+				if (PX_PRODUCTS[p_ProductIdx].monitorInterfaces[i].interfaceName == "Mw"){
+					v_interface := i;
+				}
+			}
+			if (v_interface > -1) {
+				v_size_ipinterfaceinfo := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo);
+    			for(var integer i := 0; i < v_size_ipinterfaceinfo; i := i+1) {
+    				v_domainname := PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[i].domainName;
+    				if (match(substr(v_domainname, 0, 5), pattern "[Ss][Cc][Ss][Cc][Ff]")) {
+    					v_ipinterfaceinfo := i;
+    				}
+    			}
+			} else {
+				return "S-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+			}
+			if (v_ipinterfaceinfo > -1) {
+				return PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[v_ipinterfaceinfo].domainName;
+			} else {
+				return "S-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+			}
+        }
+        
+    	/**
+    	 * @desc Get the P-CSCF FQDN address of referenced EUT 
+    	 * @return if a PCSCF is avaiable, the domainname of the PCSCF, 
+    	 *         otherwise error_string
+    	 */
+     	function f_GetEUTPcscfAddress(integer p_ProductIdx) return charstring {
+     	  // TODO function not tested
+		  var integer v_size_interfaces := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces);
+		  var integer v_size_ipinterfaceinfo;
+		  var integer v_interface := -1;
+		  var integer v_ipinterfaceinfo := -1;
+		  var charstring v_domainname;
+		  
+		  for(var integer i := 0; i < v_size_interfaces; i := i+1) {
+		  	if (PX_PRODUCTS[p_ProductIdx].monitorInterfaces[i].interfaceName == "Gm"){
+			  v_interface := i;
+		  	}
+		  }
+		  if (v_interface > -1) {
+    		  v_size_ipinterfaceinfo := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo);
+    		  for(var integer i := 0; i < v_size_ipinterfaceinfo; i := i+1) {
+    			v_domainname := PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[i].domainName;
+    		  	if (match(substr(v_domainname, 0, 5), pattern "[Pp][Cc][Ss][Cc][Ff]")) {
+    			  v_ipinterfaceinfo := i;
+     	        }
+    		  }
+		  } else {
+			return "P-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+		  }
+		  if (v_ipinterfaceinfo > -1) {
+     	  	return PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[v_ipinterfaceinfo].domainName;
+		  } else {
+			return "P-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+		  }
+     	}
+
+		/**
+		* @desc Get the Public Id of referenced UE
+		* @param p_ProductIdx index of the product the UE belongs to 
+		* @return PublicID of the UE of the productIdx
+		*/
+		function f_GetUEPublicId(integer p_ProductIdx) return charstring {
+			
+			var ImsUserInfo v_uePublicId := f_getSipUserId(p_ProductIdx);
+			
+			return v_uePublicId.publicId;
+		}
+
+    	/**
+    	 * @desc Get the Public Id of referenced EUT 
+    	 */
+     	function f_GetEUTPublicId(integer p_ProductIdx) return charstring {
+     	  // TODO
+     	  return "TODO";
+     	}
+     	
+   		/**
+    	 * @desc Get the AS server FQDN  of referenced EUT 
+    	 */
+     	function f_GetEUTASServerAddress(integer p_ProductIdx) return charstring {
+     	  // TODO
+     	  return "TODO";
+     	}
+
+ 	}
+ 
+ 
+ 	group interComponent {
+ 		/**
+		  * @desc
+		  *     This function waits for a sip message send from a given monitor
+		  *     component to mtc.
+		  * @param p_monitor Reference of Interface Monitor component
+		  * @param p_msg The Sip message
+		  */
+	 	function f_getSipMsgFromMonitor(InterfaceMonitor p_monitor, out SipMessage p_msg) runs on ImsTestCoordinator {
+            timer t_local := PX_MAX_MSG_WAIT;
+            t_local.start;            
+            alt {
+            	[]icpPort.receive (SipMessage:?) from p_monitor -> value p_msg {
+            	   t_local.stop;
+            	   setverdict(pass, self, "***f_getMsgFromMonitor: SIP message received***");	
+            	}
+            	[]t_local.timeout {
+            	   	setverdict(fail, self, "***f_getMsgFromMonitor: SIP message not received***");    
+            	}
+            }
+        }	
+ 	}
+ 
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_Templates.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_Templates.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_Templates.ttcn	(revision 22)
@@ -0,0 +1,60 @@
+/*
+ *  @author   STF 370
+ *  @version    $Id: $
+ *  @desc   This module provides the templates for Interoperability tests.
+ */
+
+module AtsImsIot_Templates {
+
+  import from LibIot_TypesAndValues {
+    type
+      InterfaceInfoList,
+      ProtocolFilter,
+      SetFilterReq,
+      SetFilterRsp,
+      Status;
+  }
+  import from AtsImsIot_TypesAndValues {type SipMessage;}
+
+  import from LibSip_SIPTypesAndValues all;
+  
+  group adapterMsgTemplates {
+    template SetFilterReq m_SetFilterReq(ProtocolFilter p_protocol, InterfaceInfoList p_iterfaces)  := {
+      protocol := p_protocol,
+      interfaceInfos := p_iterfaces
+    }
+    
+    template SetFilterRsp mw_SetFilterRsp(template Status p_status) := {
+      status := p_status
+    }
+  }
+
+  
+
+    group AuxiliaryInformationElementTemplates {
+      
+  template Credentials mw_credentialIntegrityYes := {
+   otherResponse := {authScheme := ?, authParams := { {"integrity-protected", "yes"},*} // TODO
+   }}
+  template Credentials mw_credentialIntegrityNo := {
+   otherResponse := {authScheme := ?, authParams := { {"integrity-protected", "no"},*} // TODO
+   }}
+ 
+    } //end group
+
+  group config {
+  
+  template SipUrl mw_SIP_URI (charstring p_host):= {
+    scheme := "sip",  
+    userInfo := *,
+    hostPort := {
+      host := p_host, 
+      portField := *
+    },
+    urlParameters := *,
+    headers := *
+  }
+
+} // end group
+}//end module
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestCases_CALL.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestCases_CALL.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestCases_CALL.ttcn	(revision 22)
@@ -0,0 +1,207 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides ATS specific test case definitions.
+ */
+module AtsImsIot_TestCases_CALL {
+	import from AtsImsIot_Behavior {
+        function all;
+    }
+
+	import from AtsImsIot_Functions {
+        function all;
+    }
+
+	import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;}
+
+	import from LibIms_UpperTester {type ImsUserInfo;}
+
+	import from LibIot_TestConfiguration {
+        function f_cf_create_IotEquipmentUser;
+    }
+
+	import from AtsImsIot_TestConfiguration {
+        const all;
+        function all;
+    }
+
+	import from LibIot_TestInterface {type IotEquipmentUser;}
+
+	import from AtsImsIot_TestSystem {
+        type ImsInterfaceMonitor, ImsTestCoordinator, IotSystemInterface;
+    }
+	
+	
+	/**
+		* @desc Default SIP URI with DNS/ENUM lookup procedure
+		* @see TS 186 011-2 V2.3.1 cause 4.5.3.1.1.1
+		*/
+	testcase TC_IMS_CALL_0001() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B);
+		var ImsUserInfo v_userTelInfoB := f_getTelUserId(PX_EUT_B);
+				
+		// map/connect component ports
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		
+		// preamble
+		f_mtc_userTriggerRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userTriggerRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userTriggerInitiateCall (v_ueA, v_userTelInfoB); //Test Sequence Step 1
+		
+		// check 1 (INVITE)
+		f_mtc_check_TP_IMS_5097_01_gm(v_gmA, true); // Check1
+		f_mtc_check_TP_IMS_5097_02_gm(v_gmA, true); // Check2
+		f_mtc_check_TP_IMS_5097_04_gm(v_gmA, false); // Check3
+		f_mtc_check_TP_IMS_5097_01_mw(v_mw, true); // Check1	
+		f_mtc_check_TP_IMS_5097_02_mw(v_mw, true); // Check2	
+		f_mtc_check_TP_IMS_5097_04_mw(v_mw, false); // Check3
+
+		// checks 6, 10 (180 Ringing)
+        f_mtc_check_TP_IMS_5115_01_gm(v_gmB, true); // Check 6
+		f_mtc_check_TP_IMS_5115_03_gm(v_gmB, true); // Check 7
+        f_mtc_check_TP_IMS_5131_01_gm(v_gmB, false); // Check 10
+        f_mtc_check_TP_IMS_5115_01_mw(v_mw, true); // Check 6
+        f_mtc_check_TP_IMS_5115_03_mw(v_mw, true); // Check 7
+		f_mtc_check_TP_IMS_5131_01_mw(v_mw, false); // Check 10	
+				
+		f_mtc_userCheckRinging(v_ueB); //Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueA); //Test Sequence Step 3
+		f_mtc_userTriggerAnswerCall(v_ueB); //Test Sequence Step 4
+
+		// checks 8, 11 (2xx)
+		f_mtc_check_TP_IMS_5115_02_gm(v_gmB, true); // Check 8 
+		f_mtc_check_TP_IMS_5115_04_gm(v_gmB, true); // Check 9
+		f_mtc_check_TP_IMS_5131_02_gm(v_gmB, false); // Check 11 
+		f_mtc_check_TP_IMS_5115_02_mw(v_mw, true); // Check 8
+		f_mtc_check_TP_IMS_5115_04_mw(v_mw, true); // Check 9
+		f_mtc_check_TP_IMS_5131_02_mw(v_mw, false); // Check 11
+
+		f_mtc_userCheckCallEstablished(v_ueA); //Test Sequence Step 5
+		f_mtc_userCheckCallEstablished(v_ueB); //Test Sequence Step 6
+
+		//check 4 (ACK)
+		f_mtc_check_TP_IMS_5107_02_gm(v_gmA, false); // Check2 
+		f_mtc_check_TP_IMS_5107_02_mw(v_mw, false); // Check2 
+
+		f_mtc_triggerEndCall(v_ueA); //Test Sequence Step 7
+
+		// check 5 (BYE)
+		f_mtc_check_TP_IMS_5107_01_gm(v_gmA, false); // Check3 
+		f_mtc_check_TP_IMS_5107_01_mw(v_mw, false); // Check3 
+
+		f_mtc_userCheckCallEnded(v_ueB); //Test Sequence Step 8
+		f_mtc_userCheckCallEnded(v_ueA); //Test Sequence Step 9
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+	} //end testcase TC_IMS_CALL_0001
+	
+	
+	/**
+	 * @desc Default SIP URI
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.1.2
+	 */
+	testcase TC_IMS_CALL_0001F() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+        var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var IotEquipmentUser v_ueB2 := f_cf_create_IotEquipmentUser(c_userUE_B2);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+				
+		// map/connect component ports
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_user_up(v_ueB2);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		
+		// preamble
+		f_mtc_userTriggerRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userTriggerRegistration(v_ueB, v_userInfoB); 
+		f_mtc_userTriggerRegistration(v_ueB2, v_userInfoB); //TODO check if UE_B2 should have different uri
+		
+		
+		// test body
+		f_mtc_userTriggerInitiateCall (v_ueA, v_userInfoB); //Test Sequence Step 1
+		
+		// check 1 (INVITE)
+		f_mtc_check_TP_IMS_5097_01_gm(v_gmA, false); // Check1		
+		f_mtc_check_TP_IMS_5097_01_mw(v_mw, false); // Check1 
+
+		// checks 4, 6 (180 Ringing)
+		f_mtc_check_TP_IMS_5115_01_gm(v_gmB, true); // Check 4
+		f_mtc_check_TP_IMS_5131_01_gm(v_gmB, false); // Check 6
+		f_mtc_check_TP_IMS_5115_01_mw(v_mw, true); // Check4
+		f_mtc_check_TP_IMS_5131_01_mw(v_mw, false); // Check6
+		f_mtc_check_TP_IMS_5115_01_gm(v_gmB, true); // Check4 //TODO how should be checked responses from UE_B2 
+		f_mtc_check_TP_IMS_5131_01_gm(v_gmB, false); // Check6 //TODO how should be checked responses from UE_B2  
+		f_mtc_check_TP_IMS_5115_01_mw(v_mw, true); // Check4 from UE_B2	
+		f_mtc_check_TP_IMS_5131_01_mw(v_mw, false); // Check6 from UE_B2
+				
+		f_mtc_userCheckRinging(v_ueB); //Test Sequence Step 2
+		f_mtc_userCheckRinging(v_ueB2); //Test Sequence Step 3
+		f_mtc_userCheckPeerIsRinging(v_ueA); //Test Sequence Step 4
+		f_mtc_userTriggerAnswerCall(v_ueB2); //Test Sequence Step 5
+
+		// checks 5, 7 (2xx)
+		f_mtc_check_TP_IMS_5115_02_gm(v_gmB, true); // Check 5 
+		f_mtc_check_TP_IMS_5131_02_gm(v_gmB, false); // Check 7 
+		f_mtc_check_TP_IMS_5115_02_mw(v_mw, true); // Check 5 
+		f_mtc_check_TP_IMS_5131_02_mw(v_mw, false); // Check 7 
+		f_mtc_check_TP_IMS_5115_02_gm(v_gmB, true); // Check 5 TODO how should be checked responses from UE_B2
+		f_mtc_check_TP_IMS_5131_02_gm(v_gmB, false); // Check 7 TODO how should be checked responses from UE_B2
+		f_mtc_check_TP_IMS_5115_02_mw(v_mw, true); // Check5 from UE_B2
+		f_mtc_check_TP_IMS_5131_02_mw(v_mw, false); // Check7 from UE_B2
+		
+		
+		f_mtc_userCheckCallNoLongerOffered(v_ueB); //Test Sequence Step 6
+		f_mtc_userCheckCallEstablished(v_ueA); //Test Sequence Step 7
+		f_mtc_userCheckCallEstablished(v_ueB2); //Test Sequence Step 8
+
+		//check 2 (ACK)
+		f_mtc_check_TP_IMS_5107_02_gm(v_gmA, false); // Check2 
+		f_mtc_check_TP_IMS_5107_02_mw(v_mw, false); // Check2 
+
+		f_mtc_triggerEndCall(v_ueA); //Test Sequence Step 9
+
+		// check 3 (BYE)
+		f_mtc_check_TP_IMS_5107_01_gm(v_gmA, false); // Check3 
+		f_mtc_check_TP_IMS_5107_01_mw(v_mw, false); // Check3 
+
+		f_mtc_userCheckCallEnded(v_ueB2 ); //Test Sequence Step 10
+		f_mtc_userCheckCallEnded(v_ueA); //Test Sequence Step 11
+		
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_PO_user_home_deregistration(v_ueB2);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_user_down(v_ueB2);
+	} //end testcase TC_IMS_CALL_0001F
+	
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestCases_MESS.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestCases_MESS.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestCases_MESS.ttcn	(revision 22)
@@ -0,0 +1,356 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides ATS specific test case definitions.
+ */
+module AtsImsIot_TestCases_MESS {
+	
+	import from AtsImsIot_Behavior {
+        function all;
+    }
+
+	import from AtsImsIot_Functions {
+        function all;
+    }
+
+	import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;}
+
+	import from LibIms_UpperTester {type ImsUserInfo;}
+
+	import from LibIot_TestConfiguration {
+        function f_cf_create_IotEquipmentUser;
+    }
+
+	import from AtsImsIot_TestConfiguration {
+        const all;
+        function all;
+    }
+
+	import from LibIot_TestInterface {type IotEquipmentUser;}
+
+	import from AtsImsIot_TestSystem {
+        type ImsInterfaceMonitor, ImsTestCoordinator, IotSystemInterface;
+    }
+    
+    	
+	/**
+	 * @desc
+	 *     IMS network shall support SIP messages greater than 1500 bytes.
+	 *     (in ETSI TS 186 011-2 V2.3.1 cause 4.5.1.1)
+	 */
+	testcase TC_IMS_MESS_0001() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+		f_PR_user_home_registration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+		
+		// test body
+		f_mtc_userSendMessage(v_ueA, "body>1300Bytes"); // TODO add body here
+		f_mtc_check_TP_IMS_4002_01_gm(v_gmA);
+		f_mtc_check_TP_IMS_4002_01_mw(v_mw);
+		f_mtc_userCheckMessageReceipt(v_ueB);
+		
+		// postabmle
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_mw);
+	}
+	
+	
+	 	
+	/**
+     * @desc
+     *     IMS network handles messaging with SIP identity correctly without
+     *     topology hiding. (ETSI TS 186 011-2 V2.3.1 cause 4.5.4.1)
+     */
+	testcase TC_IMS_MESS_0002() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_gmB);
+		f_cf_monitor_up(v_mw);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA, f_getSipUserId(PX_EUT_A));
+		f_PR_user_home_registration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+		
+		// test body
+		f_mtc_userSendMessage(v_ueA, "test"); 
+		
+		f_mtc_check_TP_IMS_5097_05_gm(v_gmA, true); // message not removed from port queue
+		f_mtc_check_TP_IMS_5097_07_gm(v_gmA, false); // message removed from port queue
+		f_mtc_check_TP_IMS_5097_05_mw(v_mw, true);// message not removed from port queue
+		f_mtc_check_TP_IMS_5097_07_mw(v_mw, false);// message removed from port queue
+		
+		f_mtc_userCheckMessageReceipt(v_ueB);
+		
+		f_mtc_check_TP_IMS_5117_02_gm(v_gmB, true);// message not removed from port queue
+		f_mtc_check_TP_IMS_5118_01_gm(v_gmB, false);// message removed from port queue
+		f_mtc_check_TP_IMS_5117_02_mw(v_mw, true);// message not removed from port queue
+		f_mtc_check_TP_IMS_5118_01_mw(v_mw, false);// message removed from port queue
+		
+		// postabmle
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_gmB);
+		f_cf_monitor_down(v_mw);
+	}
+	
+	 	
+	/**
+     * @desc
+     *     IMS network handles messaging with TEL URI identities correctly
+     *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.4.2)
+     */
+	testcase TC_IMS_MESS_0003() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_gmB);
+		f_cf_monitor_up(v_mw);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA, f_getTelUserId(PX_EUT_A));
+		f_PR_user_home_registration(v_ueB, f_getTelUserId(PX_EUT_B));
+		
+		// test body
+		f_mtc_userSendMessage(v_ueA, "test"); 
+		
+		f_mtc_check_TP_IMS_5097_07_gm(v_gmA, false); 
+		f_mtc_check_TP_IMS_5097_07_mw(v_mw, false);
+		
+		f_mtc_userCheckMessageReceipt(v_ueB);
+		
+		f_mtc_check_TP_IMS_5117_02_gm(v_gmB, true);// message not removed from port queue
+		f_mtc_check_TP_IMS_5118_01_gm(v_gmB, true);// message not removed from port queue
+		f_mtc_check_TP_IMS_5117_06_gm(v_gmB, false);// message removed from port queue
+		f_mtc_check_TP_IMS_5117_02_mw(v_mw, true);// message not removed from port queue
+		f_mtc_check_TP_IMS_5118_01_mw(v_mw, true);// message not removed from port queue
+		f_mtc_check_TP_IMS_5117_06_mw(v_mw, false);// message removed from port queue
+		
+		// postabmle
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_gmB);
+		f_cf_monitor_down(v_mw);
+	}
+	
+	/**
+     * @desc
+     *     IMS network handles messaging with DNS/ENUM lookup procedure correctly
+     *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.4.3)
+     */
+	testcase TC_IMS_MESS_0004() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_gmB);
+		f_cf_monitor_up(v_mw);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA, f_getTelUserId(PX_EUT_A));
+		f_PR_user_home_registration(v_ueB, f_getTelUserId(PX_EUT_B));
+		
+		// test body
+		f_mtc_userSendMessage(v_ueA, "test"); 
+		
+		f_mtc_check_TP_IMS_5097_08_gm(v_gmA, false); 
+		f_mtc_check_TP_IMS_5097_08_mw(v_mw, false);
+		
+		// TODO add DNS checks
+		
+		f_mtc_userCheckMessageReceipt(v_ueB);
+		
+		f_mtc_check_TP_IMS_5117_06_gm(v_gmB, false);
+		f_mtc_check_TP_IMS_5117_06_mw(v_mw, false);
+		
+		// postabmle
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_gmB);
+		f_cf_monitor_down(v_mw);
+	}	
+	
+	
+	
+	/**
+     * @desc
+     *     IMS network handles messaging while roaming correctly.
+     *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.4.4)
+     */
+	testcase TC_IMS_MESS_0005() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_gmB);
+		f_cf_monitor_up(v_mw);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+		f_PR_user_roaming_registration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+		
+		// test body
+		f_mtc_userSendMessage(v_ueA, "test"); 
+		
+		f_mtc_check_TP_IMS_5050_01_gm(v_gmA, false); // TODO must be checked
+		f_mtc_check_TP_IMS_5050_01_mw(v_mw, true);
+		f_mtc_check_TP_IMS_5108_02_mw(v_mw); // TODO must be checked
+		
+		f_mtc_userCheckMessageReceipt(v_ueB);
+		
+		f_mtc_check_TP_IMS_5118_01_gm(v_gmB, false);
+		f_mtc_check_TP_IMS_5118_01_mw(v_mw, false);
+		
+		// postabmle
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_roaming_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_gmB);
+		f_cf_monitor_down(v_mw);
+	}
+	
+	/**
+     * @desc
+     *     IMS network handles messaging correctly when receiving user is nit registered.
+     *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.4.5)
+     */
+	testcase TC_IMS_MESS_0006() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueA);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+		
+		// test body
+		f_mtc_userSendMessage(v_ueA, "test"); 
+		
+		f_mtc_check_TP_IMS_5114_02_gm(v_gmA); 
+		f_mtc_check_TP_IMS_5114_02_mw(v_mw); 
+		
+		f_mtc_userCheckMessageNotDelivered(v_ueA);
+		
+		// postabmle
+		f_PO_user_home_deregistration(v_ueA);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_mw);
+	}
+	
+		
+	/**
+     * @desc
+     *     IMS network handles messaging correctly when receiving user is nit registered.
+     *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.4.6)
+     */
+	testcase TC_IMS_MESS_0007() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+		f_PR_user_home_registration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+		
+		// test body
+		f_mtc_userSendMessage(v_ueA, "test"); 
+		
+		f_mtc_check_TP_IMS_5108_06_gm(v_gmA); 
+		f_mtc_check_TP_IMS_5108_06_mw(v_mw); 
+		
+		f_mtc_userCheckMessageNotDelivered(v_ueA);
+		
+		// postabmle
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_mw);
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestCases_REG.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestCases_REG.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestCases_REG.ttcn	(revision 22)
@@ -0,0 +1,373 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides ATS specific test case definitions.
+ */
+module AtsImsIot_TestCases_REG {
+	
+	import from AtsImsIot_Behavior {
+        function all;
+    }
+
+	import from AtsImsIot_Functions {
+        function all;
+    }
+
+	import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;}
+
+	import from LibIms_UpperTester {type ImsUserInfo;}
+
+	import from LibIot_TestConfiguration {
+        function f_cf_create_IotEquipmentUser;
+    }
+
+	import from AtsImsIot_TestConfiguration {
+        const all;
+        function all;
+    }
+
+	import from LibIot_TestInterface {type IotEquipmentUser;}
+
+	import from AtsImsIot_TestSystem {
+        type ImsInterfaceMonitor, ImsTestCoordinator, IotSystemInterface;
+    }
+    
+    import from LibSip_SIPTypesAndValues all;
+    
+    
+    
+	/**
+	 * @desc
+	 *     First time registration in a visited IMS network.
+	 *     (in ETSI TS 186 011-2 V2.3.1 cause 4.5.2.1)
+	 */
+	testcase TC_IMS_REG_0001() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		var Response v_200OK_Step8;
+		var Request v_Subscribe_Step10;
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		
+		// test body
+		f_mtc_userTriggerRegistration(v_ueB, f_getAnyValidUser(PX_EUT_B)); // Test Sequence Step 1
+		
+		// @TODO check mw_credentialIntegrityNo, mw_credentialIntegrityYes
+		
+		f_mtc_check_TP_IMS_5011_01_gm(v_gmA, false); // Check1 when
+		f_mtc_check_TP_IMS_5011_01_mw(v_mw, true); // Check1 then 
+				
+		f_mtc_check_TP_IMS_5089_01_gm_when(v_gmA, false); // Check4 when (Gm)
+		f_mtc_check_TP_IMS_5089_01_mw_when(v_mw, false); // Check4 when (Mw) 
+		f_mtc_check_TP_IMS_5089_01_mw_then(v_mw, false); // Check4 then @TODO check mw_WwwAuthenticate
+		
+		f_mtc_check_TP_IMS_5011_02_gm(v_gmA, false); // Check2 when (Gm)
+		f_mtc_check_TP_IMS_5011_02_mw(v_mw, true);  // Check2 then (Mw)
+		
+		f_mtc_check_TP_IMS_5092_01_gm(v_gmA, false); // Check5 when (Gm)
+		f_mtc_check_TP_IMS_5092_01_mw_when(v_mw, false); // Check5 when (Mw)		
+		f_mtc_check_TP_IMS_5092_01_mw(v_mw, true); // Check5 then
+		
+		v_200OK_Step8 := f_mtc_check_TP_IMS_5044_01_mw_when(v_mw, false); // Check3 when
+		f_mtc_check_TP_IMS_5044_01_mw(v_mw, v_200OK_Step8, true); // Check3 then
+		
+		v_Subscribe_Step10 := f_mtc_check_TP_IMS_5096_01_mw_when(v_mw, false); // Check6 when 
+		f_mtc_check_TP_IMS_5096_01_mw(v_mw, v_Subscribe_Step10, false); // Check6 then
+		
+		// Test Sequence Step 2
+		f_mtc_userCheckRegistration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_mw);
+	}
+	/**
+	 * @desc
+	 *     No response from first entry point on REGISTER with topology hiding
+	 *     (TS 186 011-2 V2.3.1 cause 4.5.2.2)
+	 */
+	testcase TC_IMS_REG_0002() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		var Request v_Register_Step4; // why do we need this variable?
+		var Response v_200OK_Step9;
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		
+		// test body
+		f_mtc_userTriggerRegistration(v_ueB, f_getAnyValidUser(PX_EUT_A)); // Step1
+		
+		// check no response (check1-when) -message skip (1st register) 
+		// check included in check1-then
+
+		// check mw for second register request 
+		f_mtc_check_TP_IMS_5203_01_mw(v_mw); // (Check1-then)
+		
+		// check gm for protected register (Check2-when)
+				
+		// check mw for protected register (check2-when)
+		
+		// check mw for 200_response (check2-then) 
+		//v_200OK_Step9 := f_mtc_check_TP_IMS_5092_01_mw(v_mw); // Check2
+		
+		//Step 2
+		f_mtc_userCheckRegistration(v_ueB, f_getAnyValidUser(PX_EUT_B)); 
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_mw);
+	}
+
+	/**
+	 * @desc
+	 *     No response from first entry point on REGISTER with topology hiding
+	 *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.2.3)
+	 */
+	testcase TC_IMS_REG_0002H() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		var Request v_Register_Step4;
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		
+		// test body
+		f_mtc_userTriggerRegistration(v_ueB, f_getAnyValidUser(PX_EUT_A)); 
+		
+		f_mtc_check_TP_IMS_5402_01_gm(v_gmA);
+		
+		v_Register_Step4 := f_mtc_check_TP_IMS_5402_01_mw(v_mw); // Check1
+		
+		f_mtc_userCheckRegistration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_mw);
+	}
+	/**
+	 * @desc
+	 *     403 response to REGISTER from an un-trusted domain without topology hiding
+	 *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.2.4)
+	 */
+	testcase TC_IMS_REG_0003() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		
+		// test body
+		f_mtc_userTriggerRegistration(v_ueB, f_getAnyValidUser(PX_EUT_A)); 
+		
+		f_mtc_check_TP_IMS_5129_01_gm(v_gmA);
+
+		f_mtc_check_TP_IMS_5129_01_mw(v_mw); // Check1
+		
+		// f_mtc_userCheckRegistration(v_ueB, PX_EUT_B);
+		
+		// postamble
+		// f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_mw);
+	}
+
+	/**
+	 * @desc
+	 *     403 response to REGISTER from an un-trusted domain with topology hiding
+	 *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.2.5)
+	 */
+	testcase TC_IMS_REG_0003H() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		
+		// test body
+		f_mtc_userTriggerRegistration(v_ueB, f_getAnyValidUser(PX_EUT_A)); 
+		
+		f_mtc_check_TP_IMS_5411_01_gm(v_gmA);
+
+		f_mtc_check_TP_IMS_5411_01_mw(v_mw); // Check1
+		
+		// f_mtc_userCheckRegistration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+		
+		// postamble
+		// f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_mw);
+	}
+
+
+
+	
+	/**
+	* @desc IMS network supports network initiated re-registration 
+	* upon receipt of a new registration with new contact information
+	* @see ETSI TS 186 011-2 V2.3.1 cause 4.5.2.6
+	*/
+	testcase TC_IMS_REG_0004() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		
+		// test body
+		f_mtc_userTriggerRegistration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+		
+		f_mtc_check_TP_IMS_5088_01_gm(v_gmA);
+		f_mtc_check_TP_IMS_5088_01_mw(v_mw);
+		f_mtc_userCheckRegistration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_mw);
+	}
+	
+	/**
+	* @desc IMS network can initiate user de-registration, 
+	* 		e.g., when a user runs out of credit
+	* @see 	ETSI TS 186 011-2 V2.3.1 cause 4.5.2.7
+	*/
+	testcase TC_IMS_REG_0005() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		
+		// test body
+		// IMS_B is triggered manually to de-register user B
+		
+		f_mtc_check_TP_IMS_5093_01_UE_mw(v_mw);
+		f_mtc_check_TP_IMS_5093_01_IMS_mw(v_mw);
+		f_mtc_userCheckRegistration(v_ueB, f_getAnyValidUser(PX_EUT_A));
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_mw);
+	}
+	/**
+	* @desc IMS network can initiate user re-authentication 
+	* @see 	ETSI TS 186 011-2 V2.3.1 cause 4.5.2.8
+	*/
+	testcase TC_IMS_REG_0006() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		
+		// test body
+		
+		f_mtc_check_TP_IMS_5094_01_UE(v_mw);
+		f_mtc_check_TP_IMS_5094_01_UE(v_gmA); 
+		f_mtc_check_TP_IMS_5094_01_IMS(v_mw);
+		f_mtc_userCheckRegistration(v_ueB, f_getAnyValidUser(PX_EUT_A));
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_mw);
+	}
+
+	/**
+	 * @desc
+	 *     First time registration in a visited IMS network with topology hiding.
+	 *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.2.9)
+	 */
+	testcase TC_IMS_REG_0007() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		
+		// map/connect component ports
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		
+		//TODO Configure IMS_A 'for topology hiding''
+		// test body
+		f_mtc_userTriggerRegistration(v_ueB, f_getAnyValidUser(PX_EUT_B)); 
+		
+		f_mtc_check_TP_IMS_5011_01_gm(v_gmA, false);
+		
+		f_mtc_check_TP_IMS_5134_01_mw(v_mw); // Check1 
+		f_mtc_check_TP_IMS_5405_01_mw(v_mw); // Check2
+		
+		f_mtc_userCheckRegistration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueB);
+		f_cf_monitor_down(v_gmA);
+		f_cf_monitor_down(v_mw);
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestCases_SS.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestCases_SS.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestCases_SS.ttcn	(revision 22)
@@ -0,0 +1,232 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides ATS specific test case definitions.
+ */
+module AtsImsIot_TestCases_SS {
+	
+	import from AtsImsIot_Behavior {
+        function all;
+    }
+
+	import from AtsImsIot_Functions {
+        function all;
+    }
+
+	import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;}
+
+	import from LibIms_UpperTester {type ImsUserInfo;}
+
+	import from LibIot_TestConfiguration {
+        function f_cf_create_IotEquipmentUser;
+    }
+
+	import from AtsImsIot_TestConfiguration {
+        const all;
+        function all;
+    }
+
+	import from LibIot_TestInterface {type IotEquipmentUser;}
+
+	import from AtsImsIot_TestSystem {
+        type ImsInterfaceMonitor, ImsTestCoordinator, IotSystemInterface;
+    }
+
+	/**
+	 * @desc Supplementary Service HOLD with AS
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.5.1
+	 */
+	testcase TC_IMS_SS_0001() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+        var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		var ImsInterfaceMonitor v_iscB := f_cf_create_monitor(c_isc_B);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getHoldUser(PX_EUT_B); 
+				
+		// map/connect component ports
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		f_cf_monitor_up(v_iscB); //
+		
+		// preamble
+		f_mtc_userTriggerRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userTriggerRegistration(v_ueB, v_userInfoB); 
+				
+		// test body
+	    f_mtc_StartAllTrafficCapture();		
+		f_mtc_userTriggerInitiateCall (v_ueA, v_userInfoB);
+
+		f_mtc_userCheckRinging(v_ueB);
+		f_mtc_userCheckPeerIsRinging(v_ueA);
+		f_mtc_userTriggerAnswerCall(v_ueB);
+		f_mtc_userCheckCallEstablished(v_ueA);
+		f_mtc_userCheckCallEstablished(v_ueB);
+
+		f_mtc_userTriggerHold(v_ueB);
+		// TODO Check1 has been removed from test description on 31.07.2009
+		f_mtc_check_TP_IMS_5310_01_mw(v_mw); // Check1 
+		f_mtc_check_TP_IMS_5310_01_isc(v_iscB); // Check1 
+		
+		f_mtc_userCheckUserOnHold(v_ueA);
+		f_mtc_userCheckUserOnHold(v_ueB);
+		f_mtc_userTriggerResume(v_ueB);
+		f_mtc_userCheckCallResumed(v_ueA);
+
+		// TODO Check2 has been removed from test description on 31.07.2009
+
+		f_mtc_check_TP_IMS_5312_01_mw(v_mw); // Check2 
+		f_mtc_check_TP_IMS_5312_01_isc(v_iscB); // Check2 
+
+		f_mtc_userCheckCallResumed(v_ueB);
+		f_mtc_triggerEndCall(v_ueA);
+		f_mtc_userCheckCallEnded(v_ueB );
+		f_mtc_userCheckCallEnded(v_ueA);
+
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+	}
+
+	/**
+	 * @desc Supplementary Service HOLD with AS in roaming
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.5.2
+	 */
+	testcase TC_IMS_SS_0002() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+        var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		var ImsInterfaceMonitor v_iscB := f_cf_create_monitor(c_isc_B);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getHoldUser(PX_EUT_B); 
+				
+		// map/connect component ports
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		f_cf_monitor_up(v_iscB); 
+		
+		// preamble
+		f_mtc_userTriggerRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userTriggerRegistration(v_ueB, v_userInfoB); 
+				
+		// test body
+	    f_mtc_StartAllTrafficCapture();		
+		f_mtc_userTriggerInitiateCall (v_ueA, v_userInfoB);
+
+		f_mtc_userCheckRinging(v_ueB);
+		f_mtc_userCheckPeerIsRinging(v_ueA);
+		f_mtc_userTriggerAnswerCall(v_ueB);
+		f_mtc_userCheckCallEstablished(v_ueA);
+		f_mtc_userCheckCallEstablished(v_ueB);
+
+		f_mtc_userTriggerHold(v_ueB);
+
+		f_mtc_check_TP_IMS_5310_01_mw(v_mw); // Check1 
+		f_mtc_check_TP_IMS_5310_01_isc(v_iscB); // Check1 
+		
+		f_mtc_userCheckUserOnHold(v_ueA);
+		f_mtc_userCheckUserOnHold(v_ueB);
+		f_mtc_userTriggerResume(v_ueB);
+		f_mtc_userCheckCallResumed(v_ueA);
+
+		// TODO Check2 and Check3 have been removed from test description on 31.07.2009
+
+		f_mtc_userCheckCallResumed(v_ueB);
+		f_mtc_triggerEndCall(v_ueA);
+		f_mtc_userCheckCallEnded(v_ueB );
+		f_mtc_userCheckCallEnded(v_ueA);
+
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+	}
+
+
+	
+	/**
+	 * @desc Supplementary Service CFU with AS
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.5.7
+	 */
+	testcase TC_IMS_SS_0007() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+        var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var IotEquipmentUser v_ueB2 := f_cf_create_IotEquipmentUser(c_userUE_B2);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+		var ImsInterfaceMonitor v_iscB := f_cf_create_monitor(c_isc_B);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		var ImsUserInfo v_userInfoB2 := f_getAnyValidUser(PX_EUT_B); //// TODO f_getAnyValidUser2 ?
+		
+		// map/connect component ports
+		// f_cf_user_up(v_ueB);
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB2);
+		f_cf_monitor_up(v_gmA);
+		f_cf_monitor_up(v_mw);
+		f_cf_monitor_up(v_iscB);
+		
+		// preamble
+		f_mtc_userTriggerRegistration(v_ueA, v_userInfoA); 
+		// f_mtc_userTriggerRegistration(v_ueB, v_userInfoB); 
+		f_mtc_userTriggerRegistration(v_ueB2, v_userInfoB2); 
+		
+		// test body
+		f_mtc_userTriggerInitiateCall (v_ueA, v_userInfoB);
+
+        // TODO Check1 removed from the test description on 31.07.2009
+		f_mtc_check_TP_IMS_5046_01_mw(v_mw); // Check1 
+		f_mtc_check_TP_IMS_5046_01_mw (v_iscB); // Check1 
+
+        // TODO Check4 removed from the test description on 31.07.2009        
+		f_mtc_check_TP_IMS_5110_01_isc(v_iscB); // Check4 
+		f_mtc_check_TP_IMS_5110_01_mw(v_mw); // Check4 
+
+		f_mtc_check_TP_IMS_5097_09_isc(v_iscB); // Check5 
+		
+		// TODO checks 6, 7
+
+		
+		f_mtc_userCheckRinging(v_ueB);
+		f_mtc_userCheckPeerIsRinging(v_ueA);
+		f_mtc_userTriggerAnswerCall(v_ueB2);
+		f_mtc_userCheckCallEstablished(v_ueA);
+		f_mtc_userCheckCallEstablished(v_ueB2);
+
+		
+		
+		f_mtc_triggerEndCall(v_ueA);
+		f_mtc_userCheckCallEnded(v_ueB );
+		f_mtc_userCheckCallEnded(v_ueA);
+		
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_PO_user_home_deregistration(v_ueB2);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB2);
+	}
+	
+	
+	
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestConfiguration.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestConfiguration.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestConfiguration.ttcn	(revision 22)
@@ -0,0 +1,313 @@
+/*
+ *	@author 	STF 370
+ *  @version    $Id $
+ *	@desc		This module contains functions which implement the 
+ *              configuration of the SUT adapter and mapping of test
+ *              components for establishing and tearing down different 
+ *              test configurations.
+ */
+
+module AtsImsIot_TestConfiguration {
+	
+	import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B, PX_PRODUCTS;}
+
+	import from LibIot_Functions {
+        function f_setConformanceVerdict, f_setE2EVerdict;
+    }
+
+	import from AtsImsIot_Templates {template m_SetFilterReq, mw_SetFilterRsp;}
+
+	import from LibCommon_VerdictControl {type FncRetCode;}
+
+	import from LibIot_TypesAndValues {
+        type
+            InterfaceInfo,
+            InterfaceInfoList,
+            Product,
+            ProtocolFilter,
+            SetFilterReq,
+            SetFilterRsp,
+            Status;
+    }
+
+	import from LibIot_TestConfiguration {
+        function f_cf_oracle_up, f_cf_oracle_down;
+    }
+
+	import from AtsImsIot_TestSystem {
+        type ImsInterfaceMonitor, ImsTestCoordinator;
+    }
+
+	import from LibIot_TestInterface {type IotEquipmentUser;}
+	
+	
+	group constantDefinitions {
+	 	//* interface monitor name Gm A
+		const charstring c_gm_A := "Gm A";
+		//* interface monitor name Gm B
+		const charstring c_gm_B := "Gm B";
+		//* interface monitor name Mw
+		const charstring c_mw := "Mw";
+		//* interface monitor name Isc A
+		const charstring c_isc_A := "Isc A";
+		//* interface monitor name Isc B
+		const charstring c_isc_B := "Isc B";
+		//* eut trigger name User A
+		const charstring c_trigger_A := "User A";
+		//* eut trigger name User B
+		const charstring c_trigger_B := "User B";
+		//* eut trigger name User A
+		const charstring c_userUE_A := "User A";
+		//* eut trigger name User B
+		const charstring c_userUE_B := "User B";
+		const charstring c_userUE_B2 := "User B2";
+	}
+	
+	group mappingFunctions {
+	
+    	/**
+    	 * 
+    	 * @desc initialize the adapter port of MTC
+    	 */
+    	function f_cf_adapter_up() runs on ImsTestCoordinator {
+    		map(self:acPort, system:acPort);
+    	}
+    	
+    	/**
+    	 * 
+    	 * @desc uninitialize the adapter port of MTC
+    	 */
+    	function f_cf_adapter_down() runs on ImsTestCoordinator {
+    		unmap(self:acPort, system:acPort);
+    	}
+    	
+    	/**
+    	 * 
+    	 * @desc initialize trigger component ports
+    	 * @param p_driver trigger component
+    	 */
+    	function f_cf_user_up(in IotEquipmentUser p_driver) runs on ImsTestCoordinator {
+    		// connect sync ports
+    		connect(p_driver:syncPort, self:syncPort);
+    		// connect TSI ports 
+    		map(p_driver:eaPort, system:eaPort);
+    		// configure oracle
+    		f_cf_oracle_up(p_driver);
+    	}
+    	
+    	/**
+    	 * 
+    	 * @desc uninitialize trigger component ports
+    	 * @param p_driver trigger component
+    	 */
+    	function f_cf_user_down(in IotEquipmentUser p_driver) runs on ImsTestCoordinator {
+    		// disconnect sync ports
+    		disconnect(p_driver:syncPort, self:syncPort);
+    		// disconnect TSI ports 
+    		unmap(p_driver:eaPort, system:eaPort);
+    		// release oracle ports
+    		f_cf_oracle_down(p_driver);
+    	}
+    	
+    	/**
+    	* @desc 	configures monitor component: connects to the synchronnization
+    	* 			port, maps to the TSI port and connects to the oracle 
+    	* @param 	p_monitor	monitor component 
+    	*/	
+    	function f_cf_monitor_up(in ImsInterfaceMonitor p_monitor) runs on ImsTestCoordinator {
+    		// connect sync ports
+    		connect(p_monitor:syncPort, self:syncPort);
+    		connect(p_monitor:icpPort, self:icpPort);
+    		// mapp TSI port
+    		map(p_monitor:dPort, system:dPort);
+    		map(p_monitor:acPort, system:acPort);
+    		// configure oracle
+    		f_cf_oracle_up(p_monitor);
+    	}
+    
+    	/**
+    	* @desc 	frees monitor component: disconnects the synchronnization
+    	* 			port, unmaps from the TSI port and disconnects from the oracle 
+    	* @param 	p_monitor	monitor component 
+    	*/		
+    	function f_cf_monitor_down(in ImsInterfaceMonitor p_monitor) runs on ImsTestCoordinator {
+    		// connect sync ports
+    		disconnect(p_monitor:syncPort, self:syncPort);
+    		disconnect(p_monitor:icpPort, self:icpPort);
+    		// mapp TSI port
+    		unmap(p_monitor:dPort, system:dPort);
+    		unmap(p_monitor:acPort, system:acPort);
+    		// configure oracle
+    		f_cf_oracle_down(p_monitor);
+    	}
+	
+	}
+	
+	group adapterConfiguration {
+		
+		function f_cf_setFilter(in SetFilterReq p_req) runs on ImsInterfaceMonitor {
+			var SetFilterRsp v_rsp;
+			var template Status v_status := {
+				code := e_success,
+				reason := *
+			}
+			
+			tc_wait.start;
+			acPort.send(p_req);
+			alt {
+				[] acPort.receive (mw_SetFilterRsp(v_status)) -> value v_rsp {
+					tc_wait.stop;
+					f_setE2EVerdict(pass, "Adapter Configuration: setting monitor filter successful");
+					f_setConformanceVerdict(pass, "Adapter Configuration: setting monitor filter successful");
+				}
+				[] acPort.receive (mw_SetFilterRsp(?)) -> value v_rsp {
+					tc_wait.stop;
+					f_setE2EVerdict(inconc, "Adapter Configuration: error while setting monitor filter");
+					f_setConformanceVerdict(inconc, "Adapter Configuration: error while setting monitor filter");
+				}
+				[] tc_wait.timeout {
+					f_setE2EVerdict(inconc, "Adapter Configuration: timer expires while waiting for response");
+					f_setConformanceVerdict(inconc, "Adapter Configuration: timer expires while waiting for response");
+				}
+			}
+		}
+			
+		
+	}
+	
+	group componentCreation {
+	
+    	/**
+    	* @desc 	creates a monitor component 
+    	* @param 	p_name	name of the monitor component 
+    	* @return 			the created monitor component
+    	*/	
+    	function f_cf_create_monitor(in charstring p_name) runs on ImsTestCoordinator return ImsInterfaceMonitor {
+    		var ImsInterfaceMonitor v_monitor := ImsInterfaceMonitor.create(p_name) alive;
+    		
+    		return v_monitor; 
+    	}
+	}
+	
+	
+	group testConfiguration {
+		
+		/**
+		 * @desc
+		 *     Test configuration function for roaming registration szenario.
+		 *     More information can be found in ETSI TS 186 011-2 V2.3.1 Cause
+		 *     4.3.4.
+		 * @param p_Gm Gm interface monitor component
+		 * @param p_Mw Mw interface monitor component
+		 */
+    	function f_cf_roam_reg(
+    		inout ImsInterfaceMonitor p_Gm, 
+    		inout ImsInterfaceMonitor p_Mw
+    	) runs on ImsTestCoordinator {
+    		p_Gm := f_cf_create_monitor(c_gm_A);
+    		p_Mw := f_cf_create_monitor(c_mw);
+    		
+    		f_cf_monitor_up(p_Gm);
+    		f_cf_monitor_up(p_Mw);
+    		
+    		// TODO UE IP address and port is missing
+    		p_Gm.start(f_cf_setFilter(
+    			valueof (m_SetFilterReq(
+    				e_sip, 
+    				f_getInterfaceInfoList("Gm", PX_EUT_A, PX_EUT_B)
+    			)
+    		)));
+    		p_Gm.done;
+    		
+    		p_Mw.start(f_cf_setFilter(
+    			valueof(m_SetFilterReq(
+    				e_sip, 
+    				f_getInterfaceInfoList("Mw", PX_EUT_A, PX_EUT_B)
+    			)
+    		)));
+    		p_Mw.done;
+    	}
+    	
+    	function f_cf_int_call(
+    		inout ImsInterfaceMonitor p_GmA, 
+    		inout ImsInterfaceMonitor p_Mw,
+    		inout ImsInterfaceMonitor p_GmB,
+    		in boolean p_useGmB 
+    	) runs on ImsTestCoordinator {
+    		p_GmA := f_cf_create_monitor(c_gm_A);
+    		p_Mw := f_cf_create_monitor(c_mw);
+    		if(p_useGmB) {
+    			p_GmB := f_cf_create_monitor(c_gm_B);
+    			f_cf_monitor_up(valueof(p_GmB));
+    		}
+    		
+    		f_cf_monitor_up(p_GmA);
+    		f_cf_monitor_up(p_Mw);
+    		
+    		
+    		// TODO UE IP address and port is missing
+    		p_GmA.start(f_cf_setFilter(
+    			valueof (m_SetFilterReq(
+    				e_sip,
+    				{f_getInterfaceInfo("Gm", PX_PRODUCTS[PX_EUT_A])}
+    			)
+    		)));
+    		p_GmA.done;
+    		
+    		p_Mw.start(f_cf_setFilter(
+    			valueof(m_SetFilterReq(
+    				e_sip, 
+    				f_getInterfaceInfoList("Mw", PX_EUT_A, PX_EUT_B)
+    			)
+    		)));
+    		p_Mw.done;
+    		
+    		if(p_useGmB) {
+        		p_GmB.start(f_cf_setFilter(
+        			valueof (m_SetFilterReq(
+        				e_sip, 
+        				{f_getInterfaceInfo("Gm", PX_PRODUCTS[PX_EUT_B])}
+        			)
+        		)));
+        		p_GmB.done;
+    		}
+    	}
+	}
+	
+	function f_getInterfaceInfoList(
+		in charstring p_interfaceName, 
+		in integer p_product1, 
+		in integer p_product2
+	) return InterfaceInfoList {
+		var InterfaceInfoList v_list := {
+			f_getInterfaceInfo(p_interfaceName, PX_PRODUCTS[p_product1]),
+			f_getInterfaceInfo(p_interfaceName, PX_PRODUCTS[p_product2])
+		};
+		
+		return v_list;
+	}
+	
+	function f_getInterfaceInfo(in charstring p_interfaceName, Product p_product) return InterfaceInfo {
+		var InterfaceInfo v_info := {
+			IpInterfaceInfo := {
+				{
+					domainName := "invalid",
+					IpAddress := "0.0.0.0",
+					portNumbers := {0}
+				}
+			}
+		};
+		
+		for(var integer i := 0; i <= lengthof(p_product.monitorInterfaces); i := i + 1) {
+			if(p_product.monitorInterfaces[i].interfaceName == p_interfaceName)	{
+				return p_product.monitorInterfaces[i].interfaceInfo;
+			}
+		}
+		
+		return v_info;
+	}
+	
+	
+	
+		
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestSystem.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestSystem.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TestSystem.ttcn	(revision 22)
@@ -0,0 +1,53 @@
+module AtsImsIot_TestSystem {
+
+	import from LibSip_SIPTypesAndValues {type Request, Response;}
+
+	import from AtsImsIot_TypesAndValues {type SipMessage;}
+
+	import from LibIot_TestInterface {type EquipmentAccessPort;}
+
+	import from LibIot_TestInterface all;
+	
+	/**
+	* @desc 	interfaces to the SUT 
+	*/	
+	type component IotSystemInterface {
+		port DataPort dPort;
+		port EquipmentAccessPort eaPort;
+		port AdapterConfigPort acPort;
+	}
+	
+		/**
+		* @desc
+		*     providing monitoring functionality of involved interfaces. Used as
+		*     PTC.
+		*/
+		type component ImsInterfaceMonitor extends InterfaceMonitor {
+			port DataPort dPort;
+			port ImsCoordinationPort icpPort;
+		}
+    	
+		/**
+		* @desc
+		*     used to coordinate the behavior of other components. It is in charge
+		*     of controlling the overall execution, manangement of testing phases,
+		*     test verdicts collection and synchronization. Used as MTC.
+		*/
+		type component ImsTestCoordinator extends TestCoordinator {
+			port ImsCoordinationPort icpPort;
+		}
+    	
+   	group portDefinitions {
+		
+ 		type port ImsCoordinationPort message {
+ 			inout SipMessage; 
+		}
+		
+		type port DataPort message {
+			in  Request, Response; // SIP
+			// TODO DNS .. or union
+		}
+
+		
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TypesAndValues.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TypesAndValues.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/AtsImsIot/AtsImsIot_TypesAndValues.ttcn	(revision 22)
@@ -0,0 +1,33 @@
+/*
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides the templates for Interoperability tests.
+ */
+
+module AtsImsIot_TypesAndValues {
+
+	import from LibSip_SIPTypesAndValues {type Request, Response;}
+
+	group SIPmessageTypes {
+		/**
+		* @desc SIP Message Type
+		* @member request SIP request
+		* @member response SIP response
+		*/
+		type union SipMessage {
+			Request request,
+			Response response	
+		}
+		
+		/**
+		* @desc SIP Message List Type
+		*/
+		type record of SipMessage SipMessageList;
+		
+		type record SkipType {
+			integer skipCount,
+			SipMessage skipMessage optional
+		} 
+	}
+	
+}//end module
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_AbstractData.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_AbstractData.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_AbstractData.ttcn	(revision 22)
@@ -0,0 +1,18 @@
+/** 
+ *  @author   ETSI
+ *  @version  $URL: svn+ssh://vcs.etsi.org/TTCN3/LIB/Ttcn3LibCommon/trunk/ttcn/LibCommon_AbstractData.ttcn $
+ *            $Id: LibCommon_AbstractData.ttcn 29 2008-11-24 10:08:08Z mullers $
+ *  @desc     A collection of functions for abstract data types which may be
+ *            useful in the implementation of any TTCN-3 test suite.
+ *  @remark   End users should be aware that any changes made to the  in
+ *            definitions this module may be overwritten in future releases.
+ *            End users are encouraged to contact the distributers of this
+ *            module regarding their modifications or additions so that future
+ *            updates will include your changes.
+ */
+ module LibCommon_AbstractData {
+
+  import from LibCommon_BasicTypesAndValues { type UInt } ;
+
+
+} // end module LibCommon_AbstractData
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_BasicTypesAndValues.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_BasicTypesAndValues.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_BasicTypesAndValues.ttcn	(revision 22)
@@ -0,0 +1,237 @@
+/**
+ *  @author   ETSI
+ *  @version  $URL: svn+ssh://vcs.etsi.org/TTCN3/LIB/Ttcn3LibCommon/trunk/ttcn/LibCommon_BasicTypesAndValues.ttcn $
+ *            $Id: LibCommon_BasicTypesAndValues.ttcn 29 2008-11-24 10:08:08Z mullers $
+ *  @desc     A collection of basic type and value definitions which may be 
+ *            useful in the implementation of any TTCN-3 test suite. <br><br>
+ *  @remark   End users should be aware that any changes made to the  in
+ *            definitions this module may be overwritten in future releases.
+ *            End users are encouraged to contact the distributers of this  
+ *            module regarding their modifications or additions so that future 
+ *            updates will include your changes.
+ */
+ module LibCommon_BasicTypesAndValues {
+  
+  /** 
+   *  @remark Number in subtype name always indicates encoding length 
+   *          in _bits_
+   */
+  group unsignedIntegerDefintions {
+
+    const integer c_uInt1Max := 1;
+    const integer c_uInt2Max := 3;
+    const integer c_uInt3Max := 7;
+    const integer c_uInt4Max := 15;
+    const integer c_uInt5Max := 31;
+    const integer c_uInt6Max := 63;
+    const integer c_uInt7Max := 127;
+    const integer c_uInt8Max := 255;
+    const integer c_uInt9Max := 511;
+    const integer c_uInt10Max := 1023;
+    const integer c_uInt11Max := 2047;
+    const integer c_uInt12Max := 4095;
+    const integer c_uInt13Max := 8191;
+    const integer c_uInt14Max := 16383;
+    const integer c_uInt15Max := 32767;
+    const integer c_uInt16Max := 65535;
+    const integer c_uInt17Max := 131071;
+    const integer c_uInt18Max := 262143;
+    const integer c_uInt19Max := 524287;
+    const integer c_uInt20Max := 1048575;
+    const integer c_uInt21Max := 2097151;
+    const integer c_uInt22Max := 4194303;
+    const integer c_uInt23Max := 8388607;
+    const integer c_uInt24Max := 16777215;
+    const integer c_uInt25Max := 33554431;
+    const integer c_uInt26Max := 67108863;
+    const integer c_uInt27Max := 134217727;
+    const integer c_uInt28Max := 268435456;
+    const integer c_uInt29Max := 536870911;
+    const integer c_uInt30Max := 1073741823;
+    const integer c_uInt31Max := 2147483647;
+    const integer c_uInt32Max := 4294967295;
+    const integer c_uInt36Max := 68719476735;
+    const integer c_uInt48Max := 281474976710655;
+    const integer c_uInt52Max := 4503599627370495;
+
+    type integer  UInt  (0 .. infinity);
+    type integer  UInt1 (0 .. c_uInt1Max) with {variant "unsigned 1 bit"};
+    type integer  UInt2 (0 .. c_uInt2Max) with {variant "unsigned 2 bit"};
+    type integer  UInt3 (0 .. c_uInt3Max) with {variant "unsigned 3 bit"};
+    type integer  UInt4 (0 .. c_uInt4Max) with {variant "unsigned 4 bit"};
+    type integer  UInt5 (0 .. c_uInt5Max) with {variant "unsigned 5 bit"};
+    type integer  UInt6 (0 .. c_uInt6Max) with {variant "unsigned 6 bit"};
+    type integer  UInt7 (0 .. c_uInt7Max) with {variant "unsigned 7 bit"};
+    type integer  UInt8 (0 .. c_uInt8Max) with {variant "unsigned 8 bit"};
+    type integer  UInt9 (0 .. c_uInt9Max) with {variant "unsigned 9 bit"};
+    type integer  UInt10 (0 .. c_uInt10Max) with {variant "unsigned 10 bit"};
+    type integer  UInt11 (0 .. c_uInt11Max) with {variant "unsigned 11 bit"};
+    type integer  UInt12 (0 .. c_uInt12Max) with {variant "unsigned 12 bit"};
+    type integer  UInt13 (0 .. c_uInt13Max) with {variant "unsigned 13 bit"};
+    type integer  UInt14 (0 .. c_uInt14Max) with {variant "unsigned 14 bit"};
+    type integer  UInt15 (0 .. c_uInt15Max) with {variant "unsigned 15 bit"};
+    type integer  UInt16 (0 .. c_uInt16Max) with {variant "unsigned 16 bit"};
+    type integer  UInt17 (0 .. c_uInt17Max) with {variant "unsigned 17 bit"};
+    type integer  UInt18 (0 .. c_uInt18Max) with {variant "unsigned 18 bit"};
+    type integer  UInt19 (0 .. c_uInt19Max) with {variant "unsigned 19 bit"};
+    type integer  UInt20 (0 .. c_uInt20Max) with {variant "unsigned 20 bit"};
+    type integer  UInt21 (0 .. c_uInt21Max) with {variant "unsigned 21 bit"};
+    type integer  UInt22 (0 .. c_uInt22Max) with {variant "unsigned 22 bit"};
+    type integer  UInt23 (0 .. c_uInt23Max) with {variant "unsigned 23 bit"};
+    type integer  UInt24 (0 .. c_uInt24Max) with {variant "unsigned 24 bit"};
+    type integer  UInt25 (0 .. c_uInt25Max) with {variant "unsigned 25 bit"};
+    type integer  UInt26 (0 .. c_uInt26Max) with {variant "unsigned 26 bit"};
+    type integer  UInt27 (0 .. c_uInt27Max) with {variant "unsigned 27 bit"};
+    type integer  UInt28 (0 .. c_uInt28Max) with {variant "unsigned 28 bit"};
+    type integer  UInt29 (0 .. c_uInt29Max) with {variant "unsigned 29 bit"};
+    type integer  UInt30 (0 .. c_uInt30Max) with {variant "unsigned 30 bit"};
+    type integer  UInt31 (0 .. c_uInt31Max) with {variant "unsigned 31 bit"};
+    type integer  UInt32 (0 .. c_uInt32Max) with {variant "unsigned 32 bit"};
+    type integer  UInt36 (0 .. c_uInt36Max) with {variant "unsigned 36 bit"};
+    type integer  UInt48 (0 .. c_uInt48Max) with {variant "unsigned 48 bit"};
+    type integer  UInt52 (0 .. c_uInt52Max) with {variant "unsigned 52 bit"};
+    
+  } // end group unsignedIntegerDefintions
+    
+  /** 
+   * @remark Number in subtype name always indicates encoding length 
+   *         in _bits_
+   */
+  group signedIntegerDefintions {
+
+    const integer c_int1Min := -1;
+    const integer c_int1Max := 0;
+    const integer c_int2Min := -2;
+    const integer c_int2Max := 1;
+    const integer c_int3Min := -4;
+    const integer c_int3Max := 3;
+    const integer c_int4Min := -8;
+    const integer c_int4Max := 7;
+    const integer c_int5Min := -16;
+    const integer c_int5Max := 15;
+    const integer c_int6Min := -32;
+    const integer c_int6Max := 31;
+    const integer c_int7Min := -64;
+    const integer c_int7Max := 63;
+    const integer c_int8Min := -128;
+    const integer c_int8Max := 127;
+    const integer c_int9Min := -256;
+    const integer c_int9Max := 255;
+    const integer c_int10Min := -512;
+    const integer c_int10Max := 511;
+    const integer c_int11Min := -1024;
+    const integer c_int11Max := 1023;
+    const integer c_int12Min := -2048;
+    const integer c_int12Max := 2047;
+    const integer c_int13Min := -4096;
+    const integer c_int13Max := 4095;
+    const integer c_int14Min := -8192;
+    const integer c_int14Max := 8191;
+    const integer c_int15Min := -16384;
+    const integer c_int15Max := 16383;
+    const integer c_int16Min := -32768;
+    const integer c_int16Max := 32767;
+    const integer c_int17Min := -65536;
+    const integer c_int17Max := 65535;
+    const integer c_int18Min := -131072;
+    const integer c_int18Max := 131071;
+    const integer c_int19Min := -262144;
+    const integer c_int19Max := 262143;
+    const integer c_int20Min := -524288;
+    const integer c_int20Max := 524287;
+    const integer c_int21Min := -1048576;
+    const integer c_int21Max := 1048575;
+    const integer c_int22Min := -2097152;
+    const integer c_int22Max := 2097151;
+    const integer c_int23Min := -4194304;
+    const integer c_int23Max := 4194303;
+    const integer c_int24Min := -8388608;
+    const integer c_int24Max := 8388607;
+    const integer c_int25Min := -16777216;
+    const integer c_int25Max := 16777215;
+    const integer c_int26Min := -33554432;
+    const integer c_int26Max := 33554431;
+    const integer c_int27Min := -67108864;
+    const integer c_int27Max := 67108863;
+    const integer c_int28Min := -134217728;
+    const integer c_int28Max := 134217727;
+    const integer c_int29Min := -268435456;
+    const integer c_int29Max := 268435456;
+    const integer c_int30Min := -536870912;
+    const integer c_int30Max := 536870911;
+    const integer c_int31Min := -1073741824;
+    const integer c_int31Max := 1073741823;
+    const integer c_int32Min := -2147483648;
+    const integer c_int32Max := 2147483647;
+
+    type integer  Int;
+    type integer  Int1  (c_int1Min .. c_int1Max) with { variant "1 bit"};
+    type integer  Int2  (c_int2Min .. c_int2Max) with { variant "2 bit"};
+    type integer  Int3  (c_int3Min .. c_int3Max) with { variant "3 bit"};
+    type integer  Int4  (c_int4Min .. c_int4Max) with { variant "4 bit"};
+    type integer  Int5  (c_int5Min .. c_int5Max) with { variant "5 bit"};
+    type integer  Int6  (c_int6Min .. c_int6Max) with { variant "6 bit"};
+    type integer  Int7  (c_int7Min .. c_int7Max) with { variant "7 bit"};
+    type integer  Int8  (c_int8Min .. c_int8Max) with { variant "8 bit"};
+    type integer  Int9  (c_int9Min .. c_int9Max) with { variant "9 bit"};
+    type integer  Int10  (c_int10Min .. c_int10Max) with { variant "10 bit"};
+    type integer  Int11  (c_int11Min .. c_int11Max) with { variant "11 bit"};
+    type integer  Int12  (c_int12Min .. c_int12Max) with { variant "12 bit"};
+    type integer  Int13  (c_int13Min .. c_int13Max) with { variant "13 bit"};
+    type integer  Int14  (c_int14Min .. c_int14Max) with { variant "14 bit"};
+    type integer  Int15  (c_int15Min .. c_int15Max) with { variant "15 bit"};
+    type integer  Int16  (c_int16Min .. c_int16Max) with { variant "16 bit"};
+    type integer  Int17  (c_int17Min .. c_int17Max) with { variant "17 bit"};
+    type integer  Int18  (c_int18Min .. c_int18Max) with { variant "18 bit"};
+    type integer  Int19  (c_int19Min .. c_int19Max) with { variant "19 bit"};
+    type integer  Int20  (c_int20Min .. c_int20Max) with { variant "20 bit"};
+    type integer  Int21  (c_int21Min .. c_int21Max) with { variant "21 bit"};
+    type integer  Int22  (c_int22Min .. c_int22Max) with { variant "22 bit"};
+    type integer  Int23  (c_int23Min .. c_int23Max) with { variant "23 bit"};
+    type integer  Int24  (c_int24Min .. c_int24Max) with { variant "24 bit"};
+    type integer  Int25  (c_int25Min .. c_int25Max) with { variant "25 bit"};
+    type integer  Int26  (c_int26Min .. c_int26Max) with { variant "26 bit"};
+    type integer  Int27  (c_int27Min .. c_int27Max) with { variant "27 bit"};
+    type integer  Int28  (c_int28Min .. c_int28Max) with { variant "28 bit"};
+    type integer  Int29  (c_int29Min .. c_int29Max) with { variant "29 bit"};
+    type integer  Int30  (c_int30Min .. c_int30Max) with { variant "30 bit"};
+    type integer  Int31  (c_int31Min .. c_int31Max) with { variant "31 bit"};
+    type integer  Int32  (c_int32Min .. c_int32Max) with { variant "32 bit"};
+
+  } // end group signedIntegerDefintions
+
+  group zeroedIntegers {
+
+    const UInt1   c_uInt1Zero := 0;
+    const UInt2   c_uInt2Zero := 0;
+    const UInt3   c_uInt3Zero := 0;
+    const UInt4   c_uInt4Zero := 0;
+    const UInt5   c_uInt5Zero := 0;
+    const UInt6   c_uInt6Zero := 0;
+    const UInt7   c_uInt7Zero := 0;
+    const UInt8   c_uInt8Zero := 0;
+    const UInt12  c_uInt12Zero := 0;
+    const UInt14  c_uInt14Zero := 0;
+    const UInt16  c_uInt16Zero := 0;
+    const UInt32  c_uInt32Zero := 0;
+    
+  }//end group zeroedInt
+
+  /** 
+   * @remark Number in subtype name always indicates encoding length 
+   *       in _bits_
+   */
+  group booleanDefintions {
+
+    type boolean  Bool1 with { variant "1 bit" };
+    type boolean  Bool2 with { variant "2 bit" };
+    type boolean  Bool3 with { variant "3 bit" };
+    type boolean  Bool4 with { variant "4 bit" };
+    type boolean  Bool5 with { variant "5 bit" };
+    type boolean  Bool6 with { variant "6 bit" };
+    type boolean  Bool7 with { variant "7 bit" };
+    type boolean  Bool8 with { variant "8 bit" };
+  
+  } // end group booleanDefintions
+
+} // end module LibCommon_BasicTypesAndValues
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_DataStrings.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_DataStrings.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_DataStrings.ttcn	(revision 22)
@@ -0,0 +1,152 @@
+/**
+ *
+ *  @author   ETSI
+ *  @version  $URL: svn+ssh://vcs.etsi.org/TTCN3/LIB/Ttcn3LibCommon/trunk/ttcn/LibCommon_DataStrings.ttcn $
+ *            $Id: LibCommon_DataStrings.ttcn 29 2008-11-24 10:08:08Z mullers $
+ *  @desc     A collection of data string type and value definitions which
+ *            may be useful in the implementation of any TTCN-3 test
+ *            suite. "Data string" refers to TTCN-3 hexstring, octetstring
+ *            and bitstring types.
+ *  @remark   End users should be aware that any changes made to the  in
+ *            definitions this module may be overwritten in future releases.
+ *            End users are encouraged to contact the distributers of this
+ *            module regarding their modifications or additions so that future
+ *            updates will include your changes.
+ */
+ module LibCommon_DataStrings {
+
+  /**
+   * @remark Number in name indicates string length in number of
+   *         _bits_
+   */
+  group bitStringSubTypes {
+
+    type bitstring  Bit1  length(1) with {encode "length(1)"};
+    type bitstring  Bit2  length(2) with {encode "length(2)"};
+    type bitstring  Bit3  length(3) with {encode "length(3)"};
+    type bitstring  Bit4  length(4) with {encode "length(4)"};
+    type bitstring  Bit5  length(5) with {encode "length(5)"};
+    type bitstring  Bit6  length(6) with {encode "length(6)"};
+    type bitstring  Bit7  length(7) with {encode "length(7)"};
+    type bitstring  Bit8  length(8) with {encode "length(8)"};
+    type bitstring  Bit9  length(9) with {encode "length(9)"};
+    type bitstring  Bit10   length(10) with {encode "length(10)"};
+    type bitstring  Bit11   length(11) with {encode "length(11)"};
+    type bitstring  Bit12   length(12) with {encode "length(12)"};
+    type bitstring  Bit13   length(13) with {encode "length(13)"};
+    type bitstring  Bit14   length(14) with {encode "length(14)"};
+    type bitstring  Bit15   length(15) with {encode "length(15)"};
+    type bitstring  Bit16   length(16) with {encode "length(16)"};
+    type bitstring  Bit17   length(17) with {encode "length(17)"};
+    type bitstring  Bit18   length(18) with {encode "length(18)"};
+    type bitstring  Bit19   length(19) with {encode "length(19)"};
+    type bitstring  Bit20   length(20) with {encode "length(20)"};
+    type bitstring  Bit21   length(21) with {encode "length(21)"};
+    type bitstring  Bit22   length(22) with {encode "length(22)"};
+    type bitstring  Bit23   length(23) with {encode "length(23)"};
+    type bitstring  Bit24   length(24) with {encode "length(24)"};
+    type bitstring  Bit25   length(25) with {encode "length(25)"};
+    type bitstring  Bit26   length(26) with {encode "length(26)"};
+    type bitstring  Bit27   length(27) with {encode "length(27)"};
+    type bitstring  Bit28   length(28) with {encode "length(28)"};
+    type bitstring  Bit29   length(29) with {encode "length(29)"};
+    type bitstring  Bit30   length(30) with {encode "length(30)"};
+    type bitstring  Bit31   length(31) with {encode "length(31)"};
+    type bitstring  Bit32   length(32) with {encode "length(32)"};
+    type bitstring  Bit40   length(40) with {encode "length(40)"};
+
+    type bitstring  Bit48   length(48) with {encode "length(48)"};
+    type bitstring  Bit64   length(64) with {encode "length(64)"};
+	type bitstring  Bit72   length(72) with {encode "length(72)"};
+    type bitstring  Bit128  length(128) with {encode "length(128)"};
+    type bitstring  Bit144  length(144) with {encode "length(144)"};
+
+  } // end group bitStringSubTypes
+
+  group zeroedBits {
+
+    const Bit1 c_1ZeroBit := int2bit(0,1);
+    const Bit2 c_2ZeroBits := int2bit(0,2);
+    const Bit4 c_4ZeroBits := int2bit(0,4);
+    const Bit5 c_5ZeroBits := int2bit(0,5);
+    const Bit6 c_6ZeroBits := int2bit(0,6);
+    const Bit8 c_8ZeroBits := int2bit(0,8);
+    const Bit14 c_14ZeroBits := int2bit(0,14);
+    const Bit64 c_64ZeroBits := int2bit(0,64);
+
+  }//end group zeroedBits
+
+  /**
+   * @remark Number in name indicates string length in number of
+   *         _octets_
+   */
+  group octetStringSubTypes {
+
+    type octetstring  Oct1  length(1) with {encode "length(1)"};
+    type octetstring  Oct2  length(2) with {encode "length(2)"};
+    type octetstring  Oct3  length(3) with {encode "length(3)"};
+    type octetstring  Oct4  length(4) with {encode "length(4)"};
+    type octetstring  Oct5  length(5) with {encode "length(5)"};
+    type octetstring  Oct6  length(6) with {encode "length(6)"};
+    type octetstring  Oct7  length(7) with {encode "length(7)"};
+    type octetstring  Oct8  length(8) with {encode "length(8)"};
+    type octetstring  Oct9  length(9) with {encode "length(9)"};
+    type octetstring  Oct10 length(10) with {encode "length(10)"};
+    type octetstring  Oct11 length(11) with {encode "length(11)"};
+    type octetstring  Oct12   length(12) with {encode "length(12)"};
+    type octetstring  Oct13   length(13) with {encode "length(13)"};
+    type octetstring  Oct14   length(14) with {encode "length(14)"};
+    type octetstring  Oct15   length(15) with {encode "length(15)"};
+    type octetstring  Oct16   length(16) with {encode "length(16)"};
+    
+    type octetstring  Oct20   length(20) with {encode "length(20)"};
+    type octetstring  Oct64   length(64) with {encode "length(64)"};
+    type octetstring  Oct80 length(80) with {encode "length(80)"};
+    type octetstring  Oct128 length(128) with {encode "length(128)"};
+    type octetstring  Oct160 length(160) with {encode "length(160)"};
+    type octetstring  Oct320 length(320) with {encode "length(320)"};
+    type octetstring  Oct640 length(640) with {encode "length(640)"};
+    type octetstring  Oct1280 length(1280) with {encode "length(1280)"};
+    type octetstring  Oct1380 length(1380) with {encode "length(1380)"};
+
+    type octetstring  Oct0to16  length(0..16) with {encode "length(0..16)"};
+    type octetstring  Oct0to127   length(0..127) with {encode "length(0..127)"};
+    type octetstring  Oct0to255   length(0..255) with {encode "length(0..255)"};
+
+    type octetstring  Oct1to15  length(1..15) with {encode "length(1..15)"};
+    type octetstring  Oct1to128   length(1..128) with {encode "length(1..128)"};
+    type octetstring  Oct1to254   length(1..254) with {encode "length(1..254)"};
+    type octetstring  Oct1to255   length(1..255) with {encode "length(1..255)"};
+
+    type octetstring  Oct4to16  length(4..16) with {encode "length(4..16)"};
+    type octetstring  Oct6to15  length(6..15) with {encode "length(6..15)"};
+
+  } // end group octetStringSubTypes
+
+  group zeroedBytes {
+    const Oct1    c_1ZeroByte := int2oct(0,1);
+    const Oct2    c_2ZeroBytes := int2oct(0,2);
+    const Oct4    c_4ZeroBytes := int2oct(0,4);
+    const Oct6    c_6ZeroBytes := int2oct(0,6);
+    const Oct8    c_8ZeroBytes := int2oct(0,8);
+	const Oct9    c_9ZeroBytes := int2oct(0,9);
+    const Oct12   c_12ZeroBytes := int2oct(0,12);
+    const Oct16   c_16ZeroBytes := int2oct(0,16);
+    const Oct20   c_20ZeroBytes := int2oct(0,20);
+
+    const Oct80   c_80ZeroBytes := int2oct(0,80);
+    const Oct160  c_160ZeroBytes := int2oct(0,160);
+    const Oct320  c_320ZeroBytes := int2oct(0,320);
+    const Oct640  c_640ZeroBytes := int2oct(0,640);
+    const Oct1280 c_1280ZeroBytes := int2oct(0,1280);
+    const Oct1380 c_1380ZeroBytes := int2oct(0,1380);
+    const octetstring c_256ZeroBytes := int2oct(0,256);
+    const octetstring c_1KZeroBytes := int2oct(0,1024);
+    const octetstring c_4KZeroBytes := int2oct(0,4096);
+    const octetstring c_16KZeroBytes := int2oct(0,16384);
+    const octetstring c_64KZeroBytes := int2oct(0,65536);
+    const octetstring c_128KZeroBytes := int2oct(0,131072);
+
+  }//end group zeroedBytes
+
+} // end module LibCommon_DataStrings
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_Sync.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_Sync.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_Sync.ttcn	(revision 22)
@@ -0,0 +1,1280 @@
+/**
+ *  @author   ETSI
+ *  @version  $URL: svn+ssh://vcs.etsi.org/TTCN3/LIB/Ttcn3LibCommon/trunk/ttcn/LibCommon_Sync.ttcn $
+ *            $Id: LibCommon_Sync.ttcn 34 2009-05-25 13:12:29Z deshpande $
+ *  @desc     This module implements _one_ generic synchronization mechanism
+ *            for TTCN-3 test cases with one or more test components.
+ *            Key concept is here that one test component acts as a
+ *            synchronization server which listens and triggers one or more
+ *            synchronization clients. It is recomended to use the MTC always as
+ *            the synchronization server but in theory also a PTC can act as such
+ *            a server.<br><br>
+ *            This synchronization is used by calling a function on
+ *            the server test component to wait for a desired amount of clients
+ *            to notify the server that they have reached a specific synchronization
+ *            point. Each client test component must call another
+ *            function to perform this notification.<br><br>
+ *            In the event that a client is not able to reach a synchronization
+ *            point the server sends out a signal to all clients to abort the
+ *            test case. This signal is a STOP message which can be caught by
+ *            a test component default which in turn can then run a proper
+ *            shut down behavior based on the current state of the test
+ *            component. <br><br>
+ *            Note that this synchronization mechanism can also be used
+ *            in a special mode called "self synchronization" when a test case
+ *            only has one test component. Here, the test component in essence
+ *            acts as a server and client at the same time. The main benefit of
+ *            using self synchoronization is that the same shutdown mechanisms
+ *            can also be reused fomr the multi component test cases. <br><br>
+ *            This module contains a lot of TTCN-3 definitions. It has been
+ *            structured into tree main groups to help the user to identify
+ *            quickly relevant TTCN-3 definitions. For rookie users of this
+ *            module basicUserRelevantDefinitions should offer all the needed
+ *            definitions. Advanced users can consider use of definitions in
+ *            advancedUserRelevantDefinitions. Finally, internalDefinitions
+ *            are definitions which are required for the module to work
+ *            properly but do not need to be used in your code. Remember that
+ *            the main motiviation of this sychronization module is to offer
+ *            are _simple_ user interface. Practice has shown that when writing
+ *            actual test component behavior _only a handful_ of functions
+ *            usually wind up being used! Also check the synchronization examples
+ *            module for example uses of this synchronization mechanism.<br><br>
+ *            The invocation of the sync functions is also closely tied
+ *            to the verdict control functions which should also be reviewed
+ *            prior to using this module. <br><br>
+ *            This module has been derived from EtsiCommon_Synchronization
+ *            which was created in ETSIs STF256/276. It has been kept
+ *            intentionally separate to avoid conflicts with future ETSI
+ *            test suite releases.
+ *  @see      LibCommon_Sync.basicUserRelevantDefinitions
+ *  @see      LibCommon_Sync.advancedUserRelevantDefinitions
+ *  @remark   End users should be aware that any changes made to the  in
+ *            definitions this module may be overwritten in future releases.
+ *            End users are encouraged to contact the distributers of this
+ *            module regarding their modifications or additions so that future
+ *            updates will include your changes.
+ */
+module LibCommon_Sync {
+
+  //Common
+  import from LibCommon_BasicTypesAndValues { type UInt } ;
+  import from LibCommon_AbstractData all;
+  import from LibCommon_VerdictControl all;
+
+  group stringStack {
+
+    type record StringStack {
+      UInt        stackSize,
+      StringItems stringItems
+    }
+
+    type record of charstring StringItems;
+
+    /**
+     * @desc    Constant which can be used to initialize a
+     *          string stack. A string stack can be intialized by
+     *          assigning this value in the variable declariation.
+     *          An alternative is to call the initlialization function.
+     * @see     LibCommon_AbstractData.f_initStringStack
+     * @remark  Note that an initlialized stack stack is not
+     *          necessarily the same as an empty string stack.
+     *          An empty tring stack as 0 zero elements but may
+     *          have a non empty list of (empty) items.
+     */
+    const StringStack c_initStringStack := { 0, {} }
+
+    /**
+     * @desc    The invocation of this function will initialize
+     *          a string stack to an empty string stack.
+     *          An alternative is to initlialize a stack using a
+     *          constant value.
+     * @see     LibCommon_AbstractData.c_initStringStack
+     * @param   p_stack String stack to be initialized.
+     */
+    function f_initStringStack ( inout StringStack p_stack ) {
+      p_stack := c_initStringStack
+    }
+
+    /**
+     * @desc    This function checks if a string stack is empty.
+     * @param   p_stack String stack to be checked.
+     * @return  true if empty, false if not empty
+     */
+    function f_isStringStackEmpty ( inout StringStack p_stack )
+    return boolean {
+      if ( p_stack.stackSize == 0 ) {return true}
+      else {return false}
+    }
+
+    /**
+     * @desc    This function checks if a given string is on the
+     *          string stack.
+     * @param   p_stack String stack where the string item
+     *          is to be looked for.
+     * @param   p_item  String to be checked for.
+     * @return  true if found, false if not found
+     */
+    function f_isItemOnStringStack ( inout StringStack p_stack,
+                       in    charstring  p_item )
+    return boolean {
+      var integer i;
+      for (i := 0; i < p_stack.stackSize; i := i+1 ) {
+        if ( p_stack.stringItems[i] == p_item ) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    /**
+     * @desc    This function checks if a given string is on the
+     *          string stack.
+     * @param   p_stack String stack where the string item
+     *          is to be looked for.
+     * @param   p_item  String item on top of the stack.
+     * @return  false if stack is empty, true otherwise
+     */
+    function f_peekStringStackTop ( inout StringStack p_stack,
+                    out   charstring  p_item)
+    return boolean {
+      if (p_stack.stackSize == 0) {
+        p_item := "f_peekTopStringStack: String stack is empty!";
+        return false;
+      }
+      p_item := p_stack.stringItems[p_stack.stackSize-1];
+      return true;
+    }
+
+
+    /**
+     * @desc    This function puts a string to the top of a
+     *          string stack.
+     * @param   p_stack String stack to which the string item
+     *          is to be added.
+     * @param   p_item  String to be added.
+     */
+    function f_pushStringStack ( inout StringStack p_stack,
+                   in    charstring  p_item ) {
+      p_stack.stringItems[p_stack.stackSize] := p_item;
+      p_stack.stackSize := p_stack.stackSize + 1;
+    }
+
+    /**
+     * @desc    This function removes the string from the top of a
+     *          string stack. If the stack is empty nothing is done
+     * @param   p_stack String stack from which the top string item
+     *          is to be removed.
+     */
+    function f_popStringStack ( inout StringStack p_stack ) {
+            if ( p_stack.stackSize > 0 ) {
+        p_stack.stackSize := p_stack.stackSize-1;
+        // "delete" top stack item to be safe
+        // Note: due to record of index the "old top" is size-1!
+        p_stack.stringItems[p_stack.stackSize] := "";
+      }
+    }
+
+  } // end group stringStack
+
+  group basicUserRelevantDefinitions {
+
+    group importantSyncTypeDefinitions {
+
+      group compTypeRelated {
+
+        /**
+         * @desc  This type is used to be the base of any synchronization
+         *        behavior which is to be executed on a sync server
+         *        component. The test component which acts as a
+         *        sync server in a test case must NOT directly use
+         *        this component type in its runs on clause!
+         *        Note that server synchronization functions may be
+         *        invoked by a test component as long as its
+         *        component type is type compatible to this component
+         *        type definition!
+         */
+        type component BaseSyncComp {
+          port  SyncPort syncPort;
+          timer tc_sync := PX_TSYNC_TIME_LIMIT;
+        }
+
+        /**
+         * @desc  This type is used to define any synchronization
+         *        behavior which is to be executed on a sync server
+         *        component. The test component which acts as a
+         *        sync server in a test case may  - but does
+         *        not have to - directly use this component type its
+         *        runs on clause.
+         *        Note that server synchronization functions may be
+         *        invoked by a test component as long as its
+         *        component type is type compatible to this component
+         *        type definition!
+         */
+        type component ServerSyncComp {
+          timer tc_shutDown := PX_TSHUT_DOWN_TIME_LIMIT;
+          // definitions for BaseSyncComp
+          port  SyncPort syncPort;
+          timer tc_sync := PX_TSYNC_TIME_LIMIT;
+        } with { extension "extends BaseSyncComp" }
+
+        /**
+         * @desc  This type is used to define any synchronization
+         *        behavior which is to be executed on a sync client
+         *        component. The test component(s) which act as a
+         *        sync client in a test case may  - but do not have
+         *        to - directly use this component type their runs
+         *        on clause.
+         *        Note that server synchronization functions may be
+         *        invoked by a test component as long as its
+         *        component type is type compatible to this component
+         *        type definition!
+         */
+        type component ClientSyncComp {
+          var StringStack v_stateStack:= c_initStringStack;
+          // definitions for BaseSyncComp
+          port  SyncPort syncPort;
+          timer tc_sync := PX_TSYNC_TIME_LIMIT;
+        } with { extension "extends BaseSyncComp" }
+
+        /**
+         * @desc  This type is used to define any synchronization
+         *        behavior which is relevant to non-concurrent test
+         *        cases.
+         *        Note that self synchronization functions may be
+         *        invoked by a test component as long as its
+         *        component type is type compatible to this component
+         *        type definition!
+         *        Note also that this type is type compatible to the
+         *        ClientSyncComp type so that shutdown altsteps from
+         *        concurrent test cases can also be reused in single
+         *        component test cases!
+         * @see   LibCommon_Sync.ClientSyncComp
+         */
+        type component SelfSyncComp {
+          port SyncPort syncSendPort;
+          // definitions for ClientSyncComp
+          var StringStack v_stateStack:= c_initStringStack;
+          port SyncPort syncPort;
+          timer tc_sync := PX_TSYNC_TIME_LIMIT;
+        } with { extension "extends ClientSyncComp" }
+
+        /**
+         * @desc  This port type must be imported into test suites
+         *        when defining test component types which are
+         *        type compatible to a synchronization component
+         *        type
+         * @see   LibCommon_Sync.SelfSyncComp
+         * @see   LibCommon_Sync.ServerSyncComp
+         * @see   LibCommon_Sync.ClientSyncComp
+         */
+        type port SyncPort message { inout SyncCmd }
+
+      } // end compTypeRelated
+
+      group standardSyncPointNames {
+        const charstring c_prDone := "preambleDone";
+        const charstring c_poDone := "postambleDone";
+        const charstring c_tbDone := "testBodyDone";
+        const charstring c_initDone := "initDone";
+      }
+
+    } // end group importantSyncTypeDefinitions
+
+    group syncCompTestConfiguration {
+
+      /**
+       *  @desc   Calls self connect function if invoking
+       *         component is the MTC or otherwise connects the client
+       *         the server. This function allows to implement preambles
+       *         in a way that they can be used by test components
+       *         in both non-concurrent as well as concurrent test
+       *         cases!
+       * @remark This function should _not_ be called if the MTC
+       *         acts as a client (and not a server) in a concurrent
+       *         test case. In this case f_connect4ClientSync
+       *         should be used instead.
+       * @see    LibCommon_Sync.f_connect4SelfSync
+       * @see    LibCommon_Sync.f_connect4ClientSync
+       */
+      function f_connect4SelfOrClientSync()
+      runs on SelfSyncComp {
+        if ( self == mtc ) {
+          f_connect4SelfSync();
+        } else {
+          f_connect4ClientSync();
+        }
+      }
+
+      /**
+       * @desc   Calls self connect function if the invoking
+       *         component is the MTC or otherwise disconnects the client
+       *         from the server. This function allows to implement
+       *         postambles in a way that they can be used in both
+       *         non-concurrent as well as concurrent test cases.
+       * @remark This function should _not_ be called if the MTC
+       *         acts as a client (and not a server) in a concurrent
+       *         test case. In this case f_disconnect4ClientSync
+       *         should be used instead.
+       * @see    LibCommon_Sync.f_disconnect4SelfSync
+       * @see    LibCommon_Sync.f_disconnect4ClientSync
+       */
+      function f_disconnect4SelfOrClientSync()
+      runs on SelfSyncComp {
+        if ( self == mtc ) {
+          f_disconnect4SelfSync();
+        } else {
+          f_disconnect4ClientSync();
+        }
+      }
+
+    } // end group syncCompTestConfiguration
+
+    group syncFunctions {
+
+      /**
+       * @desc   Implements synchronization of 2 clients from server side
+       *         on one or more synchronization points.
+       *         If problem occurs, then server sends STOP to all clients.
+       *         Waits for PX_TSYNC_TIME_LIMIT to let clients
+       *         finish executing their behavior until this
+       *         synchronization point. After passing all synchronization
+       *         points successfuly the server waits for all clients
+       *         to stop.
+       *         See f_serverSyncClientsTimed for overwriting this
+       *         the timing constraint!
+       *         This function sets the server component verdict.
+       * @remark The use of this function requires prior connection  of
+       *         the server sync ports!
+       * @see    LibCommon_Sync.f_connect4SelfOrClientSync
+       * @see    LibCommon_Sync.PX_TSYNC_TIME_LIMIT
+       * @see    LibCommon_Sync.f_serverSyncClientsTimed
+       * @see    LibCommon_Sync.f_serverWaitForAllClientsToStop
+       * @param  p_syncPointIds list of synchronization point name/ids
+       */
+      function f_serverSync2ClientsAndStop( in SyncPointList p_syncPointIds )
+      runs on ServerSyncComp {
+        var integer i, v_noOfSyncIds := sizeof(p_syncPointIds);
+        for ( i := 0; i < v_noOfSyncIds; i := i+1 ) {
+          f_serverSyncClientsTimed(2,p_syncPointIds[i], PX_TSYNC_TIME_LIMIT);
+        }
+        f_serverWaitForAllClientsToStop();
+      }
+
+      /**
+       * @desc   Implements synchronization of 3 clients from server side
+       *         on one or more synchronization points.
+       *         If problem occurs, then server sends STOP to all clients.
+       *         Waits for PX_TSYNC_TIME_LIMIT to let clients
+       *         finish executing their behavior until this
+       *         synchronization point. After passing all synchronization
+       *         points successfuly the server waits for all clients
+       *         to stop.
+       *         See f_serverSyncClientsTimed for overwriting this
+       *         the timing constraint!
+       *         This function sets the server component verdict.
+       * @remark The use of this function requires prior connection  of
+       *         the server sync ports!
+       * @see    LibCommon_Sync.f_connect4SelfOrClientSync
+       * @see    LibCommon_Sync.PX_TSYNC_TIME_LIMIT
+       * @see    LibCommon_Sync.f_serverSyncClientsTimed
+       * @see    LibCommon_Sync.f_serverWaitForAllClientsToStop
+       * @param  p_syncPointIds list of synchronization point name/ids
+       */
+      function f_serverSync3ClientsAndStop( in SyncPointList p_syncPointIds )
+      runs on ServerSyncComp {
+        var integer i, v_noOfSyncIds := sizeof(p_syncPointIds);
+        for ( i := 0; i < v_noOfSyncIds; i := i+1 ) {
+          f_serverSyncClientsTimed(3,p_syncPointIds[i], PX_TSYNC_TIME_LIMIT);
+        }
+        f_serverWaitForAllClientsToStop();
+      }
+
+      /**
+       * @desc   Implements synchronization of 4 clients from server side
+       *         on one or more synchronization points.
+       *         If problem occurs, then server sends STOP to all clients.
+       *         Waits for PX_TSYNC_TIME_LIMIT to let clients
+       *         finish executing their behavior until this
+       *         synchronization point. After passing all synchronization
+       *         points successfuly the server waits for all clients
+       *         to stop.
+       *         See f_serverSyncClientsTimed for overwriting this
+       *         the timing constraint!
+       *         This function sets the server component verdict.
+       * @remark The use of this function requires prior connection  of
+       *         the server sync ports!
+       * @see    LibCommon_Sync.f_connect4SelfOrClientSync
+       * @see    LibCommon_Sync.PX_TSYNC_TIME_LIMIT
+       * @see    LibCommon_Sync.f_serverSyncClientsTimed
+       * @see    LibCommon_Sync.f_serverWaitForAllClientsToStop
+       * @param  p_syncPointIds list of synchronization point name/ids
+       */
+      function f_serverSync4ClientsAndStop( in SyncPointList p_syncPointIds )
+      runs on ServerSyncComp {
+        var integer i, v_noOfSyncIds := sizeof(p_syncPointIds);
+        for ( i := 0; i < v_noOfSyncIds; i := i+1 ) {
+          f_serverSyncClientsTimed(4,p_syncPointIds[i], PX_TSYNC_TIME_LIMIT);
+        }
+        f_serverWaitForAllClientsToStop();
+      }
+
+      /**
+       * @desc   Implements synchronization of N clients from server side
+       *         on one or more synchronization points.
+       *         If problem occurs, then server sends STOP to all clients.
+       *         Waits for PX_TSYNC_TIME_LIMIT to let clients
+       *         finish executing their behavior until this
+       *         synchronization point. After passing all synchronization
+       *         points successfuly the server waits for all clients
+       *         to stop.
+       *         See f_serverSyncClientsTimed for overwriting this
+       *         the timing constraint!
+       *         This function sets the server component verdict.
+       * @remark The use of this function requires prior connection  of
+       *         the server sync ports!
+       * @see    LibCommon_Sync.f_connect4SelfOrClientSync
+       * @see    LibCommon_Sync.PX_TSYNC_TIME_LIMIT
+       * @see    LibCommon_Sync.f_serverSyncClientsTimed
+       * @see    LibCommon_Sync.f_serverWaitForAllClientsToStop
+       * @param  p_numClients number of synchronization clients
+       * @param  p_syncPointIds list of synchronization point name/ids
+       */
+      function f_serverSyncNClientsAndStop ( 
+      	in integer p_numClients,
+      	in SyncPointList p_syncPointIds )
+      runs on ServerSyncComp {
+        var integer i, v_noOfSyncIds := sizeof(p_syncPointIds);
+        for ( i := 0; i < v_noOfSyncIds; i := i+1 ) {
+          f_serverSyncClientsTimed (
+          	p_numClients,
+          	p_syncPointIds[i],
+          	PX_TSYNC_TIME_LIMIT );
+        }
+        f_serverWaitForAllClientsToStop();
+      }
+
+      /**
+       * @desc   Implements synchronization of 2 clients and 1 UT from server side
+       *         on one or more synchronization points.
+       *         If problem occurs, then server sends STOP to all clients.
+       *         Waits for PX_TSYNC_TIME_LIMIT to let clients
+       *         finish executing their behavior until this
+       *         synchronization point. After passing all synchronization
+       *         points successfuly the server waits for all clients
+       *         to stop.
+       *         See f_serverSyncClientsTimed for overwriting this
+       *         the timing constraint!
+       *         This function sets the server component verdict.
+       * @remark The use of this function requires prior connection  of
+       *         the server sync ports!
+       * @see    LibCommon_Sync.f_connect4SelfOrClientSync
+       * @see    LibCommon_Sync.PX_TSYNC_TIME_LIMIT
+       * @see    LibCommon_Sync.f_serverSyncClientsTimed
+       * @see    LibCommon_Sync.f_serverWaitForAllClientsToStop
+       * @param  p_syncPointIds list of synchronization point name/ids
+       */
+      function f_serverSync2ClientsUtAndStop( in SyncPointList p_syncPointIds )
+      runs on ServerSyncComp {
+        var integer i, v_noOfSyncIds := sizeof(p_syncPointIds);
+        for ( i := 0; i < v_noOfSyncIds; i := i+1 ) {
+          f_serverSyncClientsTimed(3,p_syncPointIds[i], PX_TSYNC_TIME_LIMIT);
+        }
+        f_serverWaitForAllClientsToStop();
+      }
+
+      /**
+       * @desc   Calls either self synchronization function if
+       *         invoking component is the MTC, otherwise
+       *         calls client synchronization. After that it
+       *         sets the verdict based on the specified return code.
+       *         This function allows to implement TTCN-3 functions
+       *         in a way that they can be used in both non-concurrent
+       *         as well as concurrent test cases.
+       * @remark This function should _not_ be called if the MTC
+       *         acts as a client (and not a server) in a concurrent
+       *         test case. In this case f_clientSyncAndVerdict
+       *         should be used instead.
+       * @param  p_syncPoint Synchronization point name/id
+       * @param  p_ret Current behavior execution status
+       * @see    LibCommon_Sync.f_clientSyncAndVerdict
+       * @see    LibCommon_VerdictControl.f_setVerdict
+       */
+      function f_selfOrClientSyncAndVerdict( in charstring p_syncPoint,
+                           in FncRetCode p_ret)
+      runs on SelfSyncComp {
+        if ( self == mtc ) {
+          // then assume we are running non-conurrent test case
+          f_selfSyncAndVerdict(p_syncPoint, p_ret);
+        } else {
+          f_clientSyncAndVerdict(p_syncPoint, p_ret);
+        }
+      }
+
+      /**
+       * @desc   Calls either self synchronization function if
+       *         invoking component is the MTC, otherwise
+       *         calls client synchronization. After that it
+       *         sets a preamble specific verdict based on the
+       *         specified return code.
+       *         This function allows to implement TTCN-3 functions
+       *         in a way that they can be used in both non-concurrent
+       *         as well as concurrent test cases.
+       * @remark This function should _not_ be called if the MTC
+       *         acts as a client (and not a server) in a concurrent
+       *         test case. In this case f_clientSyncAndVerdict
+       *         should be used instead.
+       * @param  p_syncPoint Synchronization point name/id
+       * @param  p_ret Current behavior execution status
+       * @see    LibCommon_Sync.f_clientSyncAndVerdict
+       * @see    LibCommon_VerdictControl.f_setVerdictPreamble
+       */
+      function f_selfOrClientSyncAndVerdictPR( in charstring p_syncPoint,
+                             in FncRetCode p_ret)
+      runs on SelfSyncComp {
+        if ( self == mtc ) {
+          // then assume we are running non-conurrent test case
+          f_selfSyncAndVerdictPreamble(p_syncPoint, p_ret);
+        } else {
+          f_clientSyncAndVerdictPreamble(p_syncPoint, p_ret);
+        }
+      }
+
+    } // end group syncFunctions
+
+    group syncCompStateHandling {
+
+      /**
+       *
+       * @desc   This function updates the state (stack) of a
+       *         sync client or self sync component. This stack is
+       *         key in the shutdown handling of test components.
+       *         It adds the new state name to the top of the
+       *         sync component stack of states.
+       *         The state will only be added in case of a current
+       *         execution status of e_success.
+       * @param  p_newSyncCompState Name of state which was attempted to be reached.
+       * @param  p_ret Current behavior execution status
+       * @remark If the state of component changes this function must be
+       *         _at least_ called from your test suite prior to f_selfSync
+       *         or f_clientSync which is the only definite place for the
+       *         shutdown default invocation!
+       * @see    LibCommon_Sync.a_dummyShutDown
+       * @see    LibCommon_Sync.f_selfSync
+       * @see    LibCommon_Sync.f_clientSync
+       */
+      function f_addSyncCompState(in charstring p_newSyncCompState,
+                    in FncRetCode p_ret)
+      runs on ClientSyncComp {
+        if ( p_ret == e_success ) {
+          if ( f_isItemOnStringStack(v_stateStack,p_newSyncCompState) ) {
+              log("**** f_addSyncCompState: WARNING: Attempt to add state which is already on sync state stack! No additition done.****");
+          } else {
+              f_pushStringStack(v_stateStack,p_newSyncCompState);
+          }
+        }
+      } // end function f_addSyncCompState
+
+      /**
+       *
+       * @desc   This function returns the top state on the sync
+       *         state stack of a sync client or self sync
+       *         component and removes it from the stack
+       *         This function cna be used, e.g., in a while
+       *         statement within a postamble or shutdown
+       *         implementation
+       * @param  p_state State on top of the state stack.
+       * @return false if state stack is empty, true otherwise
+       * @see    LibCommon_Sync.a_dummyShutDown
+       */
+      function f_getTopSyncCompState( out charstring p_state )
+      runs on ClientSyncComp
+      return boolean {
+        if ( not f_peekStringStackTop(v_stateStack,p_state) ) {
+          p_state := "IDLE";
+          return false;
+        }
+        f_popStringStack(v_stateStack);
+        return true;
+      } // end function f_getTopSyncCompState
+
+      /*
+       * @desc  This function removes the last state on the state stack
+       *        of a sync client or self sync component.
+       *        This stack is key in the shutdown handling of test
+       *        components.
+       * @see   LibCommon_Sync.a_dummyShutDown
+       */
+      function f_popSyncCompState()
+      runs on ClientSyncComp {
+        f_popStringStack(v_stateStack);
+      } // end function f_popSyncCompState
+
+      /**
+       *
+       * @desc   This function returns the top state on the sync state
+       *         stack of a sync client or self sync component. It
+       *         does not remove it from the stack
+       *         This stack is key in the shutdown handling of test
+       *         components.
+       * @param  p_state  State on top of the state stack.
+       * @return false if state stack is empty, true otherwise
+       * @see    LibCommon_Sync.a_dummyShutDown
+       */
+      function f_peekTopSyncCompState(out charstring p_state)
+      runs on ClientSyncComp
+      return boolean {
+        return f_peekStringStackTop(v_stateStack,p_state);
+      } // end function f_peekTopSyncCompState
+
+      /**
+       * @desc  This function checks if the sync state stack
+       *        of a sync client or self sync component is empty.
+       *        This stack is key in the shutdown handling of test
+       *        components.
+       * @see   LibCommon_Sync.a_dummyShutDown
+       */
+      function f_isSyncCompStateStackEmpty()
+      runs on ClientSyncComp
+      return boolean {
+        return f_isStringStackEmpty(v_stateStack);
+      } // end function f_isSyncCompStateStackEmpty
+
+    } // end group syncCompStateHandling
+
+    group exampleShutDownAltstep {
+
+      /**
+       * @desc   This is an example of a shutdown altstep which can be
+       *         used as a "template" for a interface specific shutdown
+       *         altstep or possily as a first temporary solution in
+       *         test case development.<br><br>
+       *         This altstep shall be activated as a default as the
+       *         first statement in each test case function which drives
+       *         an interface, i.e., in MTC behavior of single component
+       *         and in each client behavior of multi component test
+       *         cases.<br>
+       *         The required behavior from this altstep is to:<br><br>
+       *           1) expect the STOP either via the test component
+       *              syncPort<br><br>
+       *           2) upon its arrival it should shut down the SUT
+       *              gracefully based on the current component state<br><br>
+       *         The current component state should have been
+       *         previously kept uptodate from a test suite via the
+       *         f_addSyncCompState function. This default will then be
+       *         (automatically) invoked either from within f_selfSync
+       *         or f_clientSync.<br>
+       *         Note that shutdown defaults can be written as
+       *         _interface specific_ - they do not need to be test case
+       *         or test component specific! See another example of a
+       *         shutdown altstep in the sync module.
+       * @see    LibCommon_Sync.f_addSyncCompState
+       * @see    LibCommon_Sync.f_selfSync
+       * @see    LibCommon_Sync.f_clientSync
+       * @see    LibCommon_SyncExamples.a_exampleShutDown
+       * @remark Your application specific shutdown altstep
+       *         implementation(s) should _not_ be defined in this
+       *         module but as part of your test suite or application specific
+       *         modules.
+       */
+      altstep a_dummyShutDown()
+      runs on SelfSyncComp {
+        []  syncPort.receive(m_syncServerStop){
+            var charstring v_state := "";
+            tc_sync.stop;
+            log("**** a_dummyShutDown: Test component received STOP signal from sync server - going to IDLE state ****");
+            while ( f_getTopSyncCompState(v_state) ) {
+              if ( v_state == "x" ) {
+                // then do something
+              } else if ( v_state == "y" ) {
+                // then do something else
+              }
+            } // end while
+            f_disconnect4SelfOrClientSync();
+            // unmap/disconnect more if needed
+            log("**** a_dummyShutDown: -> Test component stopping itself now! ****") ;
+            stop ;
+          }
+      } // end altstep a_dummyShutDown
+
+    } // end group exampleShutDownAltstep
+
+  } // end group basicUserRelevantDefinitions
+
+  group advancedUserRelevantDefinitions {
+
+    group serverRelated {
+
+      /**
+       * @desc   Implements synchronization of "n" clients from server
+       *         side. If a problem occurs, then server sends STOP to
+       *         all clients. Waits for PX_TSYNC_TIME_LIMIT to let
+       *         clients finish executing their behavior until this
+       *         synchronization point. See f_serverSyncClientsTimed for
+       *         overwriting this later timing constraint!
+       *         This function sets the server component verdict.
+       * @remark The use of this function requires prior connection  of
+       *         the server sync port!
+       * @see    LibCommon_Sync.f_connect4SelfOrClientSync
+       * @see    LibCommon_Sync.PX_TSYNC_TIME_LIMIT
+       * @see    LibCommon_Sync.f_serverSyncClientsTimed
+       * @param  p_noOfClients number of clients to be synchronized
+       * @param  p_syncId synchronization point name/id
+       */
+      function f_serverSyncClients( in UInt p_noOfClients, in charstring p_syncId )
+      runs on ServerSyncComp {
+        f_serverSyncClientsTimed(p_noOfClients,p_syncId, PX_TSYNC_TIME_LIMIT);
+      }
+
+      /**
+       * @desc   Handles synchronization of clients from server side.
+       *         If problem occurs, then server sends STOP to all clients.
+       *         This function sets the server verdict.
+       * @remark The use of this function requires prior connection of
+       *         the server sync ports!
+       * @param  p_NoOfClients number of clients to be synchronized
+       * @param  p_syncId synchronization point name/id
+       * @param  p_execTimeLimit time limit given to all clients to finish the execution
+       *         of their behavior up to this synchronization point
+       * @see    LibCommon_Sync.f_connect4SelfOrClientSync
+       */
+      function f_serverSyncClientsTimed(  in UInt     p_NoOfClients,
+                        in charstring   p_syncId,
+                        float       p_execTimeLimit )
+      runs on ServerSyncComp {
+
+        var integer v_noOfRecvdSyncMsgs := 0;
+        var boolean v_stopClients := false;
+        var ClientSyncCompList v_clientRefs := {};
+        var ClientSyncComp v_clientRef;
+
+        if ( p_syncId == c_prDone ) {
+          log("**** f_serverSyncClientsTimed: Sync server now starting PREAMBLE synchronization ... ****") ;
+        } else if ( p_syncId == c_tbDone ) {
+          log("**** f_serverSyncClientsTimed: Sync server now starting TEST BODY synchronization ... ****") ;
+        } else if ( p_syncId == c_initDone ) {
+          log("**** f_serverSyncClientsTimed: Sync server now starting UPPER TESTER synchronization ... ****") ;
+        } else {
+          log("**** f_serverSyncClientsTimed: Sync server now starting handling of next synchronization point ... ****") ;
+        }
+        tc_sync.start(p_execTimeLimit) ;
+        alt{
+          []  syncPort.receive(m_syncClientReady(p_syncId)) -> sender v_clientRef {
+                v_clientRefs[v_noOfRecvdSyncMsgs] := v_clientRef;
+              v_noOfRecvdSyncMsgs := v_noOfRecvdSyncMsgs + 1;
+              if ( v_noOfRecvdSyncMsgs != p_NoOfClients ) { repeat; }
+            }
+          []  syncPort.receive(m_syncClientStop) -> sender v_clientRef {
+              log("**** f_serverSyncClientsTimed: Sync server received STOP signal from a client - server will wait for all clients to reach their next synchronization point and then stop them! ****") ;
+              v_stopClients := true;
+                v_clientRefs[v_noOfRecvdSyncMsgs] := v_clientRef;
+              v_noOfRecvdSyncMsgs := v_noOfRecvdSyncMsgs + 1;
+              if ( v_noOfRecvdSyncMsgs != p_NoOfClients ) { repeat; }
+            }
+          []  syncPort.receive(m_syncClientReady(?)) -> sender v_clientRef {
+              log("**** f_serverSyncClientsTimed: Sync server received client sync message with incorrect synchronization point id which is currently not handled - server will stop all clients! ****") ;
+              v_stopClients := true;
+                v_clientRefs[v_noOfRecvdSyncMsgs] := v_clientRef; }
+          []  syncPort.receive(SyncCmd :? ) {
+              log("**** f_serverSyncClientsTimed: Sync server received (invalid) sync message from other sync server - server will stop all clients! ****") ;
+              v_stopClients := true; }
+          []  any port.receive {
+              // leave it to be ok to receive anything else
+              // in case that the user has added any non-sync ports to
+              // his/her server component type definition!
+              }
+          []  tc_sync.timeout{
+              log("**** f_serverSyncClientsTimed: A client is not responding within specified time limit - sync server is sending stop to all clients! ****");
+              v_stopClients := true; }
+        } //end alt
+        tc_sync.stop ;
+        if ( v_stopClients ) {
+          setverdict(inconc);
+          // then send out STOP sync msg
+          f_serverSendToAllClients(v_clientRefs, m_syncServerStop);
+          f_serverWaitForAllClientsToShutDown(); // function will never return!
+        } else {
+          setverdict(pass);
+          // then send out READY sync msg
+          f_serverSendToAllClients(v_clientRefs, m_syncServerReady(p_syncId));
+          if ( p_syncId == c_prDone ) {
+            log("**** f_serverSyncClientsTimed: Sync server successfully passed PREAMBLE synchronization point. ****") ;
+          } else if ( p_syncId == c_tbDone ) {
+            log("**** f_serverSyncClientsTimed: Sync server successfully passed TEST BODY synchronization point. ****") ;
+          } else {
+            log("**** f_serverSyncClientsTimed: Sync server successfully passed synchronization point. ****") ;
+          }
+        }
+      } // end function f_serverSyncClientsTimed
+
+      /**
+       * @desc  This function is intended only for use on the sync
+       *        server component in concurrent TTCN-3 test cases.
+       *        It waits for all components to finish execution within
+       *        the PX_TSYNC_TIME_LIMIT. If a timeout occurs
+       *        the server will stop all clients.
+       *        This function sets the server component verdict.
+       */
+      function f_serverWaitForAllClientsToStop()
+      runs on ServerSyncComp {
+        tc_sync.start;
+        alt {
+          [] all component.done {
+              tc_sync.stop;
+              log("**** f_serverWaitForAllClientsToStop: All sync clients have finished their execution. Sync server now terminating test case. ****") ;
+            }
+          [] tc_sync.timeout {
+              log("**** f_serverWaitForAllClientsToStop: Not all sync clients have finshed execution within the sync time limit. Sync server will stop test case! ****") ;
+            }
+        } // end alt
+        setverdict(pass);
+          stop;
+      } // end function f_serverWaitForAllClientsToStop
+
+    } // end group serverRelated
+
+    group clientRelated {
+
+      /**
+       * @desc  This function creates the connection needed to
+       *        execute client synchronization functions
+       * @see   LibCommon_Sync.f_clientSync
+       * @see   LibCommon_Sync.f_clientSendStop
+       */
+      function f_connect4ClientSync()
+      runs on ClientSyncComp {
+        connect(self:syncPort, mtc:syncPort);
+      }// end function f_connect4ClientSync
+
+      /**
+       * @desc  This function removes the connection needed
+       *        to execute client synchronization functions
+       * @see   LibCommon_Sync.f_clientSync
+       * @see   LibCommon_Sync.f_clientSendStop
+       */
+      function f_disconnect4ClientSync()
+      runs on ClientSyncComp {
+        disconnect(self:syncPort, mtc:syncPort);
+      }// end function f_disconnect4ClientSync
+
+      /**
+       * @desc   This function combines client verdict setting with its
+       *         synchronization for use after or within a preamble
+       *         implementation.
+       *         Note that such preambles can _not_ be reused in non-
+       *         concurrent test cases.
+       *         This function sets the client component verdict.
+       * @remark The use of this function requires prior connection
+       *         of the client sync port!
+       * @see    LibCommon_Sync.f_connect4ClientSync
+       * @see    LibCommon_Sync.f_connect4SelfOrClientSync
+       * @see    LibCommon_VerdictControl.f_setVerdictPreamble
+       * @param  p_syncId Synchronization point name/id
+       * @param  p_ret Current behavior execution status
+       */
+      function f_clientSyncAndVerdictPreamble(in charstring p_syncId ,
+                          FncRetCode p_ret )
+      runs on ClientSyncComp {
+        f_setVerdictPreamble(p_ret);
+        f_clientSync(p_syncId,p_ret);
+      }
+
+      /**
+       * @desc   This function combines client verdict setting with its
+       *         synchronization for use,e.g, after or within a
+       *         test body implementation.
+       *         Note that such premables can _not_ be reused in non-
+       *         concurrent test cases. This can be achieved by using
+       *         the f_selfOrClientSyncAndVerdict function instead.
+       *         This function sets the client component verdict.
+       * @param  p_syncId Synchronization point name/id
+       * @param  p_ret Current behavior execution status
+       * @remark The use of this function requires prior connection
+       *         of the client sync port!
+       * @see    LibCommon_Sync.f_connect4ClientSync
+       * @see    LibCommon_Sync.f_connect4SelfOrClientSync
+       * @see    LibCommon_VerdictControl.f_setVerdict
+       * @see    LibCommon_Sync.f_selfOrClientSyncAndVerdict
+       */
+      function f_clientSyncAndVerdict(in charstring p_syncId,
+                      in FncRetCode p_ret )
+      runs on ClientSyncComp {
+        f_setVerdict(p_ret);
+        f_clientSync(p_syncId,p_ret);
+      }
+
+      /**
+       * @desc   This function combines client verdict setting with its
+       *         synchronization for use after or within a
+       *         postamble implementation.
+       *         Note that such prostambles can _not_ be reused in non-
+       *         concurrent test cases.
+       *         This function sets the client component verdict.
+       * @remark The use of this function requires prior connection
+       *         of the client sync port!
+       * @see    LibCommon_Sync.f_connect4ClientSync
+       * @see    LibCommon_Sync.f_connect4SelfOrClientSync
+       * @see    LibCommon_VerdictControl.f_setVerdictPostamble
+       * @param  p_syncId Synchronization point name/id
+       * @param  p_ret Current behavior execution status
+       */
+      function f_clientSyncAndVerdictPostamble(in charstring p_syncId ,
+                           in FncRetCode p_ret )
+      runs on ClientSyncComp {
+        f_setVerdictPostamble(p_ret);
+        f_clientSync(p_syncId,p_ret);
+      }
+
+      /**
+       * @desc   This function handles synchronization of a sync client
+       *         with the server. In case of successful execution it sends
+       *         a READY message to the server and waits the READY back.
+       *         The time used for waiting is defined by PX_TSYNC_TIME_LIMIT.
+       *         In case of a non successful execution status it
+       *         sends a STOP message to the server.
+       *         In both cases the receipt of a STOP message or no
+       *         response from the server it will trigger the shutdown
+       *         default (if activated).
+       *         This function will set only the client verdict to INCONC
+       *         (and stop its execution) if no STOP response is received
+       *         from the server within the PX_TSYNC_TIME_LIMIT
+       *         or if no shutdown default is activated. In all other
+       *         cases the client verdict is NOT set.
+       * @param  p_syncId Synchronization point name/id
+       * @param  p_ret Current behavior execution status
+       * @remark The use of this function requires prior connection
+       *         of the client sync port!
+       * @see    LibCommon_Sync.f_connect4ClientSync
+       * @see    LibCommon_Sync.f_connect4SelfOrClientSync
+       * @see    LibCommon_Sync.PX_TSYNC_TIME_LIMIT
+       * @see    LibCommon_Sync.a_dummyShutDown
+       * @see    LibCommon_Sync.f_clientSendStop
+       * @return Updated execution status
+       */
+      function f_clientSync(  in charstring p_syncId ,
+                  in FncRetCode p_ret )
+      runs on ClientSyncComp
+      return FncRetCode{
+
+        if (p_ret == e_success){
+          syncPort.send(m_syncClientReady(p_syncId));
+          tc_sync.start;
+          alt{
+            [] syncPort.receive(m_syncServerReady(p_syncId)){
+                tc_sync.stop ; }
+            [] tc_sync.timeout{
+                log("**** f_clientSync: Sync client did not receive message from sync server within the specified time limit - sync client will ask sync server to stop test case! ****") ;
+                f_clientSendStop(); } // function will not return!
+          } //end alt
+        } //end if
+        else {
+          log("**** f_clientSync: Execution status indicates that execution of test component behavior was not successful - sync client will ask sync server to stop test case! ****") ;
+          f_clientSendStop(); // function will not return!
+        }
+        if ( p_syncId == c_prDone ) {
+          log("**** f_clientSync: Sync client successfully passed PREAMBLE synchronization point. ****") ;
+        } else if ( p_syncId == c_tbDone ) {
+          log("**** f_clientSync: Sync client successfully passed TEST BODY synchronization point. ****") ;
+        } else {
+          log("**** f_clientSync: Sync client successfully passed synchronization point. ****") ;
+        }
+        return e_success ;
+
+      } // end function f_clientSync
+
+      /**
+       * @desc   This function can be used to request the shutdown a
+       *         multi component test case _prior_ to reaching a
+       *         synchronization point. It sends a STOP message to
+       *         the sync server and awaits then the STOP from the server
+       *         which will trigger the shutdown default (if activated).
+       *         This function will set the server verdict to INCONC (and
+       *         stop the test case) if no shutdown default is activated.
+       *         This function will set only the client verdict to INCONC
+       *         (and stop its execution) if no STOP response is received
+       *         from the server within the PX_TSYNC_TIME_LIMIT
+       *         or if no shutdown default is activated. In all other
+       *         cases the client verdict is NOT set.
+       * @remark The use of this function requires prior connection
+       *         of the client sync port!
+       * @see    LibCommon_Sync.f_connect4ClientSync
+       * @see    LibCommon_Sync.f_connect4SelfOrClientSync
+       * @see    LibCommon_Sync.PX_TSYNC_TIME_LIMIT
+       * @see    LibCommon_Sync.a_dummyShutDown
+       */
+      function f_clientSendStop()
+      runs on ClientSyncComp {
+        log("**** f_clientSendStop: Sync client requesting from server to stop test case (including itself). ****") ;
+        syncPort.send(m_syncClientStop) ;
+        tc_sync.start;
+        alt{
+          [] tc_sync.timeout{
+              log("**** f_clientSendStop: Stopping sync client without shutdown - either no shutdown default active or no stop received from server. ****") ;
+              setverdict(inconc);
+              stop ;
+             }
+        }//end alt
+        tc_sync.stop;
+        stop; // stop here if shutdown default does not stop
+      }
+
+    } // end group clientRelated
+
+  } // end group advancedUserRelevantDefinitions
+
+  group otherSyncModuleDefinitions {
+
+    group syncModuleparams {
+      /**
+       *
+       * @desc  Default time limit for a sync client to reach a
+       *        synchronization point
+       */
+      modulepar {float PX_TSYNC_TIME_LIMIT := 120.0}
+
+      /*
+       * @desc  Default time limit for a sync client to finish
+       *        its execution of the shutdown default
+       */
+      modulepar {float PX_TSHUT_DOWN_TIME_LIMIT := 120.0}
+    }
+
+    group otherSyncTypes {
+
+      type record of charstring SyncPointList;
+
+      type record of ClientSyncComp ClientSyncCompList;
+
+    } // end group otherSyncTypes
+
+    group otherSelfSyncRelatedDefinitions {
+
+      /**
+       * @desc  This function creates the connection needed to
+       *        execute self sync functions
+       * @see   LibCommon_Sync.f_selfSync
+       * @see   LibCommon_Sync.f_selfSyncStop
+       */
+      function f_connect4SelfSync()
+      runs on SelfSyncComp {
+        connect(self:syncSendPort, self:syncPort);
+      }// end function f_connect4SelfSync
+
+      /**
+       * @desc  This function removes the connection needed
+       *        to execute self sync functions
+       * @see   LibCommon_Sync.f_selfSync
+       * @see   LibCommon_Sync.f_selfSyncStop
+       */
+      function f_disconnect4SelfSync()
+      runs on SelfSyncComp {
+        disconnect(self:syncSendPort, self:syncPort);
+      }// end function f_disconnect4SelfSync
+
+      /**
+       * @desc  This function combines MTC verdict setting with self
+       *        synchronization for use after and possibly in the test body
+       * @param p_syncId Synchronization point name/id
+       * @param p_ret Current behavior execution status
+       * @see   LibCommon_VerdictControl.f_setVerdict
+       * @see   LibCommon_Sync.f_selfSync
+       * @see   LibCommon_Sync.a_dummyShutDown
+       */
+      function f_selfSyncAndVerdict(  in charstring p_syncId,
+                      in FncRetCode p_ret )
+      runs on SelfSyncComp {
+        f_setVerdict(p_ret);
+        f_selfSync(p_syncId,p_ret);
+      }
+
+      /**
+       * @desc  This function combines MTC verdict setting with self
+       *        synchronization for use after the preamble.
+       * @param p_syncId Synchronization point name/id
+       * @param p_ret Current behavior execution status
+       * @see   LibCommon_VerdictControl.f_setVerdictPreamble
+       * @see   LibCommon_Sync.f_selfSync
+       */
+      function f_selfSyncAndVerdictPreamble(  in charstring p_syncId,
+                          in FncRetCode p_ret )
+      runs on SelfSyncComp {
+        f_setVerdictPreamble(p_ret);
+        f_selfSync(p_syncId,p_ret);
+      }
+
+      /**
+       * @desc  This function combines MTC verdict setting with self
+       *        synchronization for use after the postamble.
+       * @param p_syncId Synchronization point name/id
+       * @param p_ret Current behavior execution status
+       * @see   LibCommon_VerdictControl.f_setVerdictPostamble
+       * @see   LibCommon_Sync.f_selfSync
+       */
+      function f_selfSyncAndVerdictPostamble( in charstring p_syncId ,
+                          in FncRetCode p_ret )
+      runs on SelfSyncComp {
+        f_setVerdictPostamble(p_ret);
+        f_selfSync(p_syncId,p_ret);
+      }
+
+      /**
+       * @desc   This function synchronizes a MTC with itself. In case
+       *         of a non successful execution status it sends a STOP
+       *         message to itself and invokes that way the
+       *         shutdown default (if activated).
+       *         This function will set the server verdict to INCONC (and
+       *         stop the test case) if no shutdown default is activated.
+       *         Otherwise no verdict is set.
+       * @remark Sync ports should be connected prior to the invocation
+       *         of this function!
+       * @param  p_syncId Synchronization point name/id
+       * @param  p_ret Current behavior execution status
+       * @return Updated execution status
+       * @see    LibCommon_Sync.f_connect4SelfSync
+       * @see    LibCommon_Sync.a_dummyShutDown
+       */
+      function f_selfSync(  in charstring p_syncId ,
+                  in FncRetCode p_ret )
+      runs on SelfSyncComp
+      return FncRetCode{
+        if (p_ret != e_success){
+          f_selfSyncStop() ; // function will not return!
+        }
+        if ( p_syncId == c_prDone ) {
+          log("**** f_selfSync: Successfully passed PREAMBLE synchronization point. ****") ;
+        } else if ( p_syncId == c_tbDone ) {
+          log("**** f_selfSync: Successfully passed TEST BODY synchronization point. ****") ;
+        } else {
+          log("**** f_selfSync: Successfully passed synchronization point. ****") ;
+        }
+        return e_success ;
+      }// end function f_selfSync
+
+      /**
+       * @desc   This function can be used to shut down a test case _prior_
+       *         to reaching a synchronization point. it sends a STOP
+       *         message to itself and invokes that way the
+       *         shutdown default (if activated).
+       *         This function will set the server verdict to INCONC (and
+       *         stop the test case) if no shutdown default is activated.
+       *         Otherwise no verdict is set.
+       * @remark  Sync ports should be connected prior to the invocation
+       *          of this function!
+       * @see     LibCommon_Sync.f_connect4SelfSync
+       */
+      function f_selfSyncStop()
+      runs on SelfSyncComp {
+
+        log("**** f_selfSyncStop: MTC requests to stop test case (itself). ****") ;
+        syncSendPort.send(m_syncServerStop) ; // this MUST be _server_ for the default to catch!
+        tc_sync.start(PX_TSYNC_TIME_LIMIT);
+        alt{
+          [] tc_sync.timeout{
+              log("**** f_selfSyncStop: Stopping MTC without shutdown - either no shutdown default active or missing syncPort connection ****") ;
+              setverdict(inconc);
+              stop ;
+             }
+        }//end alt
+        tc_sync.stop;
+        stop; // if shutdown default is not activated or if it does not stop
+      } // end function f_selfSyncStop
+
+    } // end group otherSelfSyncRelatedDefinitions
+
+    /**
+     *
+     * @desc The sychronization protocol is conceptually based on
+     *       named synchronization. Each synchronization point
+     *       has it own specific synchronization message. This
+     *       makes each synchronization unique, and allows, e.g., to
+     *       ensure that a server synchronizes only clients which have
+     *       reached the same synchronization point.
+     */
+    group syncProtocolDefinition {
+
+      type union SyncCmd {
+        ClientReady clientReady,
+        ServerReady serverReady,
+        ClientStop  clientStop,
+        ServerStop  serverStop
+      }
+
+      type record ClientReady {
+        charstring syncPointId
+      }
+
+      type record ServerReady {
+        charstring syncPointId
+      }
+
+      type record ClientStop {}
+
+      type record ServerStop {}
+
+    } // end group syncProtocolDefinition
+
+    group syncMessages {
+      template SyncCmd m_syncClientReady( template charstring p_syncId ) := {
+        clientReady := { p_syncId }
+      }
+
+      template SyncCmd m_syncServerReady( template charstring p_syncId ) := {
+        serverReady := { p_syncId }
+      }
+
+      template SyncCmd m_syncClientStop := {
+        clientStop := {}
+      }
+
+      template SyncCmd m_syncServerStop := {
+        serverStop := {}
+      }
+
+    } // end group syncMessages
+
+    group otherSyncFunctions {
+
+      /**
+       * @desc  Makes server send a sync message to all known clients
+       * @param p_clientRefs List of client references to which the message is to be send
+       * @param p_syncCmd The actual synchronization message to be sent out
+       */
+      function f_serverSendToAllClients(  in ClientSyncCompList p_clientRefs,
+                        in template SyncCmd p_syncCmd)
+      runs on ServerSyncComp {
+        var integer i:=0;
+        for (i:=0; i< sizeof(p_clientRefs); i:=i+1 ){
+          syncPort.send(p_syncCmd) to p_clientRefs[i];
+        }
+      } // end function f_serverSendToAllClients
+
+      /**
+       * @desc  This function is intended only for use on server in concurrent
+       *        TTCN-3 test cases. It waits for all components to shut down
+       *        within the PX_TSHUT_DOWN_TIME_LIMIT. If a timeout occurs
+       *        it aborts the test case (no matter how far clients got with their
+       *        shutdown).
+       *        This function sets the server verdict.
+       */
+      function f_serverWaitForAllClientsToShutDown()
+      runs on ServerSyncComp {
+
+        tc_shutDown.start(PX_TSHUT_DOWN_TIME_LIMIT);
+        alt {
+          [] all component.done {
+            tc_shutDown.stop;
+            log("**** f_serverWaitForAllClientsToShutDown: All components have properly shut down. Sync server will now terminate the test case. ****") ;
+             }
+          [] tc_shutDown.timeout {
+            log("**** f_serverWaitForAllClientsToShutDown: Not all clients have properly shutdown within the shut down time limit. Sync server will now terminate test case! ****") ;
+             }
+        } // end alt
+        // cover case that shut down default is NOT activated
+        setverdict(inconc);
+          mtc.stop;
+      } // end function f_serverWaitForAllClientsToShutDown
+
+    } // end group otherSyncFunctions
+
+  } // end group otherSyncDefinitions
+
+} // end module LibCommon_Sync
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_TextStrings.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_TextStrings.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_TextStrings.ttcn	(revision 22)
@@ -0,0 +1,123 @@
+/**
+ *  @author   ETSI
+ *  @version  $URL: svn+ssh://vcs.etsi.org/TTCN3/LIB/Ttcn3LibCommon/trunk/ttcn/LibCommon_TextStrings.ttcn $
+ *            $Id: LibCommon_TextStrings.ttcn 35 2009-06-11 12:23:24Z kremer $
+ *  @desc     A collection of text string type and value definitions which
+ *            may be useful in the implementation of any TTCN-3 test
+ *            suite. "Text string" refers to TTCN-3 charstring and universal
+ *            charstring types.
+ *  @remark   End users should be aware that any changes made to the  in
+ *            definitions this module may be overwritten in future releases.
+ *            End users are encouraged to contact the distributers of this
+ *            module regarding their modifications or additions so that future
+ *            updates will include your changes.
+ */
+module LibCommon_TextStrings {
+
+  /**
+   * @desc  These constants can be used to add special characters into
+   *        TTCN-3 text strings by using the concatenation operator.
+   *        Example use:
+   *        var charstring v_text := "Hi!" & c_CRLF & "Hello!";
+   */
+  group usefulConstants {
+
+    const charstring c_NUL := oct2char('00'O);
+    const charstring c_SOH := oct2char('01'O);
+    const charstring c_STX := oct2char('02'O);
+    const charstring c_ETX := oct2char('03'O);
+    const charstring c_EOT := oct2char('04'O);
+    const charstring c_ENQ := oct2char('05'O);
+    const charstring c_ACK := oct2char('06'O);
+    const charstring c_BEL := oct2char('07'O);
+    const charstring c_BS  := oct2char('08'O);
+    const charstring c_TAB := oct2char('09'O);
+    const charstring c_LF  := oct2char('0A'O);
+    const charstring c_VT  := oct2char('0B'O);
+    const charstring c_FF  := oct2char('0C'O);
+    const charstring c_CR  := oct2char('0D'O);
+    const charstring c_SO  := oct2char('0E'O);
+    const charstring c_SI  := oct2char('0F'O);
+    const charstring c_DLE := oct2char('10'O);
+    const charstring c_DC1 := oct2char('11'O);
+    const charstring c_DC2 := oct2char('12'O);
+    const charstring c_DC3 := oct2char('13'O);
+    const charstring c_DC4 := oct2char('14'O);
+    const charstring c_NAK := oct2char('15'O);
+    const charstring c_SYN := oct2char('16'O);
+    const charstring c_ETB := oct2char('17'O);
+    const charstring c_CAN := oct2char('18'O);
+    const charstring c_EM  := oct2char('19'O);
+    const charstring c_SUB := oct2char('1A'O);
+    const charstring c_ESC := oct2char('1B'O);
+    const charstring c_FS  := oct2char('1C'O);
+    const charstring c_GS  := oct2char('1D'O);
+    const charstring c_RS  := oct2char('1E'O);
+    const charstring c_US  := oct2char('1F'O);
+    const charstring c_DEL := oct2char('7F'O);
+
+    const charstring c_CRLF := oct2char('0D'O) & oct2char('0A'O);
+
+  } // end group usefulConstants
+
+  /**
+   * @remark Number in name indicates string length in number of
+   *         _characters_
+   */
+  group textStringSubTypes {
+
+    type charstring String1    length(1) with { encode "length(1)"};
+    type charstring String2    length(2) with { encode "length(2)"};
+    type charstring String3    length(3) with { encode "length(3)"};
+    type charstring String4    length(4) with { encode "length(4)"};
+    type charstring String5    length(5) with { encode "length(5)"};
+    type charstring String6    length(6) with { encode "length(6)"};
+    type charstring String7    length(7) with { encode "length(7)"};
+    type charstring String8    length(8) with { encode "length(8)"};
+    type charstring String9    length(9) with { encode "length(9)"};
+    type charstring String10   length(10) with { encode "length(10)"};
+    type charstring String11   length(11) with { encode "length(11)"};
+    type charstring String12   length(12) with { encode "length(12)"};
+    type charstring String13   length(13) with { encode "length(13)"};
+    type charstring String14   length(14) with { encode "length(14)"};
+    type charstring String15   length(15) with { encode "length(15)"};
+    type charstring String16   length(16) with { encode "length(16)"};
+
+	type charstring String1To13 length(1..13) with {encode "length(1..13)"};
+    type charstring String1To63  length(1..63) with {encode "length(1..63)"};
+    type charstring String1To64  length(1..64) with {encode "length(1..64)"};
+    type charstring String1To127 length(1..127) with {encode "length(1..127)"};
+    type charstring String1To128 length(1..128) with {encode "length(1..128)"};
+    type charstring String1to255 length(1..255) with {encode "length(1..255)"};
+	type charstring String5to253 length (5..253) with {encode "length(5..253)"};
+
+  } // end stringSubTypes
+
+  group usefulTextStringTypes {
+
+    type universal charstring UnicodeText;
+
+    type universal charstring UnicodeText1to255 length(1..255)
+    with {encode "length(1..255)"};
+
+    /**
+     * @desc Subtyping can not be used in this type definition to ensure 
+     *       values of this type are really alphanumeric. 
+     *       Instead either codecs or a template have 
+     *       to be used for this purpose. The type is kept here to ensure
+     *       backward compatibility.
+     * @see  LibCommon_TextStrings.mw_isAlphaNum
+     */
+    type charstring AlphaNum with { encode "alphanumeric"};
+    type AlphaNum   AlphaNum2 length(2) with { encode "alphanumeric;length(2)"};
+    type AlphaNum   AlphaNum1To32 length(1..32) with {encode "alphanumeric;length(1..32)"};
+
+  } // end group usefulTextStringTypes
+
+  group usefulTextStringTemplates {
+    
+	  template charstring mw_isAlphaNum := pattern "([0-9]|[a-z]|[A-Z])+";
+
+  } // end group usefulTextStringTemplates
+
+} // end module LibCommon_TextStrings
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_Time.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_Time.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_Time.ttcn	(revision 22)
@@ -0,0 +1,84 @@
+/**
+ *  @author   ETSI
+ *  @version  $URL: svn+ssh://vcs.etsi.org/TTCN3/LIB/Ttcn3LibCommon/trunk/ttcn/LibCommon_Time.ttcn $
+ *            $Id: LibCommon_Time.ttcn 29 2008-11-24 10:08:08Z mullers $
+ *  @desc     A collection of time handling functions which may be useful in
+ *            the implementation of any TTCN-3 test suite.
+ *  @remark   End users should be aware that any changes made to the  in
+ *            definitions this module may be overwritten in future releases.
+ *            End users are encouraged to contact the distributers of this
+ *            module regarding their modifications or additions so that future
+ *            updates will include your changes.
+ */
+module LibCommon_Time {
+
+  group timeLibModuleParameters {
+
+    /**
+     * @desc    Time to control PTC.stop
+     * @remark  PICS/PIXIT Reference: XXX
+    */
+    modulepar {float PX_TDONE := 120.0}
+
+    /**
+     * @desc    Time to control the reception of a message
+     * @remark  PICS/PIXIT Reference: XXX
+    */
+    modulepar {float PX_TAC := 30.0}
+
+    /**
+     * @desc    Time to control that IUT sends nothing
+     * @remark  PICS/PIXIT Reference: XXX
+    */
+    modulepar {float PX_TNOAC := 10.0}
+
+    /**
+     * @desc    Time to control that IUT reacts prior to Upper Tester action
+     * @remark  PICS/PIXIT Reference: XXX
+    */
+    modulepar {float PX_TWAIT := 120.0}
+
+    /**
+     * @desc    Time to control sending in loops
+     * @remark  PICS/PIXIT Reference: XXX
+    */
+    modulepar {float PX_LOOP := 1.0}
+
+  } // end group timeLibModuleParameters
+
+  group sleeping {
+
+    /**
+     * @desc  The invocation of this function will cause a test component
+     *        to sleep (or wait) for a specified amount of time.
+     *        Defaults may interrupt this sleep if activated.
+     * @see   LibCommon_Time.f_sleepIgnoreDef
+     * @param p_duration Amount of time that the test component should wait.
+     */
+    function f_sleep ( in float p_duration ) {
+      timer t;
+      if (p_duration <= 0.0) {return}
+      t.start( p_duration );
+      t.timeout;
+    }
+
+    /**
+     * @desc  The invocation of this function will cause a test component
+     *        to sleep (or wait) for a specified amount of time.
+     *        This function ignores any active defaults, i.e., the function
+     *        will always wait the specified amount of time.
+     * @param p_duration Amount of time that the test component should wait.
+     */
+    function f_sleepIgnoreDef ( in float p_duration ) {
+      timer t;
+      if (p_duration <= 0.0) {return}
+      t.start( p_duration );
+      alt {
+        [] t.timeout {}
+        [else] {repeat}
+      } // end alt
+    }
+
+  } // end group sleeping
+
+} // end module LibCommon_Time
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_VerdictControl.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_VerdictControl.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibCommon/LibCommon_VerdictControl.ttcn	(revision 22)
@@ -0,0 +1,95 @@
+/**
+ *  @author   ETSI
+ *  @version  $URL: svn+ssh://vcs.etsi.org/TTCN3/LIB/Ttcn3LibCommon/trunk/ttcn/LibCommon_VerdictControl.ttcn $
+ *            $Id: LibCommon_VerdictControl.ttcn 29 2008-11-24 10:08:08Z mullers $
+ *  @desc     Contains generic functions which set test component verdicts
+ *            based on generic function return codes according to established
+ *            test implementation practice. These functions should only be called
+ *            from test case functions (see reusable t3 code methodology) only.
+ *  @remark   End users should be aware that any changes made to the  in
+ *            definitions this module may be overwritten in future releases.
+ *            End users are encouraged to contact the distributers of this
+ *            module regarding their modifications or additions so that future
+ *            updates will include your changes.
+ */
+ module LibCommon_VerdictControl {
+
+  /**
+   * @desc  Collection of all possible function return codes.
+   *        This type should be used as a return parameter type
+   *        in all TTCN-3 function definitions (except for
+   *        functions invoked from in TTCN-3 start statements).
+   *        This return value should be used to communicate a
+   *        verdict to the caller _instead of_ literally setting
+   *        a verdict in the function! This warrants a higher
+   *        degree of reuse for the function.
+   */
+  type enumerated FncRetCode {
+    e_success(0),
+    // error codes
+    e_error(1),
+    e_timeout(2)
+  }
+
+  /**
+   * @desc  This function should be used for verdict
+   *        setting after completion of, e.g., the test body
+   *        execution.
+   *        Sets verdicts are INCONC in case of a timeout, FAIL
+   *        in case of an error, and PASS otherwise.
+   * @param p_ret Current execution status
+   */
+  function f_setVerdict ( FncRetCode p_ret ) {
+    if ( p_ret == e_success ) {
+      setverdict(pass);
+    } else if ( p_ret == e_timeout ) {
+      setverdict(inconc);
+    } else {
+      setverdict(fail);
+    }
+  } // end function f_setVerdict
+
+
+  /**
+   * @desc  This function should be used for verdict
+   *        setting after completion of a preamble
+   *        execution.
+   *        Sets verdicts are INCONC in case of a timeout or
+   *        an error, and PASS otherwise.
+   * @param p_ret Preamble execution status
+   */
+  function f_setVerdictPreamble ( FncRetCode p_ret ) {
+	log("f_setVerdictPreamble: This function is deprecated. Use f_setVerdictPreOrPostamble instead. ");
+    f_setVerdictPreOrPostamble(p_ret);
+  } // end function f_setVerdictPreamble
+
+
+  /**
+   * @desc  This function should be used for verdict
+   *        setting after completion of a postamble
+   *        execution.
+   *        Sets verdicts are INCONC in case of a timeout or
+   *        an error, and PASS otherwise.
+   * @param p_ret Postamble execution status
+   */
+  function f_setVerdictPostamble ( FncRetCode p_ret ) {
+	log("f_setVerdictPostamble: This function is deprecated. Use f_setVerdictPreOrPostamble instead. ");
+    f_setVerdictPreOrPostamble(p_ret);
+  } // end function f_setVerdictPostamble
+
+  /**
+   * @desc 	This function should be used for verdict
+	 *			  setting outside the test body.
+	 *		    Sets verdicts are INCONC in case of a timeout or
+	 *        an error, and PASS otherwise.
+	 * @param p_ret Postamble execution status
+	 */
+	function f_setVerdictPreOrPostamble ( FncRetCode p_ret ) {
+		if ( p_ret != e_success ) {
+			setverdict(inconc);
+		} else {
+			setverdict(pass);
+		}
+	} // end function f_setVerdictPreOrPostamble
+
+} // end module LibCommon_VerdictControl
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIms_ConfigAndTrigger/LibIms_UpperTester.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIms_ConfigAndTrigger/LibIms_UpperTester.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIms_ConfigAndTrigger/LibIms_UpperTester.ttcn	(revision 22)
@@ -0,0 +1,248 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id:$
+ *	@desc		This module provides trigger and configuration functions for IMS.
+ */
+module LibIms_UpperTester {
+	
+
+	import from LibIot_Functions {function f_sendEquipmentCmd;}
+
+	import from LibUpperTester {
+		template m_EQ_Request;
+		type EquipmentCommand;
+	}
+
+	import from LibIot_TestInterface {type TestCoordinator, EquipmentUser;}
+ 	
+	group ue {
+		group ueTypes {
+			group ueCommands {
+				
+				/**
+				 * @desc Command to trigger registration of the UE
+				 * @remark
+				 *     Note that the registration trigger command needs has
+				 *     additional parameter for the public, private user id and
+				 *     password.
+				 */
+				const EquipmentCommand c_UE_REGISTRATION := "UE_REGISTRATION";
+				const EquipmentCommand c_UE_CHECKisREGISTERED := "UE_CHECK_IS_REGISTER";	
+				
+				/**
+				 * 
+				 * @desc Command to trigger de-registration of the UE
+				 */
+				const EquipmentCommand c_UE_DEREGISTRATION := "UE_DEREGISTRATION";
+				
+				/**
+				 * @desc Command to trigger UE to send a message
+				 */
+				const EquipmentCommand c_UE_SEND_MESSAGE := "UE_SEND_MESSAGE";	
+				
+								/**
+				 * @desc Command to check if UE has receipt of a message
+				 */
+				const EquipmentCommand c_UE_CHECK_MESSAGE_RECEIPT := "UE_CHECK_MESSAGE_RECEIPT";
+				
+				
+				/**
+				 * @desc Command to check if UE is informed about that the message request could not be delivered.
+				 */
+				const EquipmentCommand c_UE_CHECK_MESSAGE_NOT_DELIVERED := "UE_CHECK_MESSAGE_NOT_DELIVERED";		
+			}
+		}
+		
+		group ueFunctions {
+			
+			
+			/**
+			 * 
+			 * @desc Triggers registration of a given user via UE
+			 * @param p_publicId The public user identity 
+			 * @param p_privateId The private user identity
+			 * @param p_pw The users password
+			 * @verdict e2e verdict will be set depending on the result of trigger action
+			 */
+			function f_userRegistration(in charstring p_publicId, in charstring p_privateId, in charstring p_pw) 
+			runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_REGISTRATION, {p_publicId, p_privateId, p_pw})));
+			}
+
+			function f_checkUserIsRegistered() 
+			runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_CHECKisREGISTERED, {})));
+			}
+			
+			
+			/**
+			 * 
+			 * @desc Triggers de-registration of a given user via UE
+			 * @param p_publicId The public user name
+			 * @verdict e2e verdict will be set depending on the result of trigger action
+			 */
+			function f_userDeregistration(in charstring p_publicId) 
+			runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_DEREGISTRATION, {p_publicId})));
+			}
+			
+			/**
+			 * 
+			 * @desc Trigger sending an instant message via UE
+			 */
+			function f_userSendMessage(in charstring p_body) 
+			runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_SEND_MESSAGE, {p_body})));
+			}
+			
+			/**
+			 * 
+			 * @desc Trigger checking the receipt of instant message at UE
+			 */
+			function f_userCheckMessageReceipt() runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_CHECK_MESSAGE_RECEIPT, {})));
+			}
+				
+			/**
+			 * 
+			 * @desc Trigger checking the receipt of instant message at UE
+			 */
+			function f_userCheckMessageNotDelivered() runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_CHECK_MESSAGE_NOT_DELIVERED,  {})));
+			}
+ 		}
+	}
+	
+	group LibUEModuleParameters {
+ 	
+		/**
+		* 
+		* @desc Required information for user components
+		* @member publicId  public user identity
+		* @member privateId private user identity 
+		* @member password user password
+		* @member domain Home domain of user
+		* @member domainProxy Entry point to either home or roaming IMS network
+		*/
+		type record ImsUserInfo {
+			charstring publicId, // (default) id to be used by UE
+			charstring privateId,
+			charstring password,
+			charstring domain,
+			charstring domainProxy
+		}
+		
+		type union ImsUserIdentity {
+			ImsUserInfo genUserId,
+			ImsUserInfo sipUserId,
+			ImsUserInfo telUserId
+		}
+	
+		/**
+		* 
+		* @desc List of IMS user information 
+		*/
+		type record of ImsUserIdentity ImsUserIdentityList ;
+ 
+		/**
+		* 
+		* @desc The record collects IMS user information configured in one specific core IMS 
+		* @member productIndex index pointing to the entry of the core IMS product in PX_PRODUCTS
+		* @member userInfos Lists information about all users configured in the HSS of this core IMS
+		*/
+		type record CoreImsUserInfo {
+			integer       productIndex,
+			ImsUserIdentityList  userIds
+		}
+	
+		/**
+		* 
+		* @desc Collects  IMS user information configured in all core IMS participating in the interoperability event
+		*/
+		type record of CoreImsUserInfo CoreImsUserInfoList;
+	
+	
+		/**
+			* 
+			* @desc Example of module parameter based entry of EUT interface information for all products particpating in an interoperability event
+			*/
+		modulepar CoreImsUserInfoList PX_IMS_USER_DATA := {
+			{
+				productIndex := 0,
+				userIds := {
+					{
+				      genUserId := {
+						publicId := "userGEN",
+						privateId := "userGEN_priv",
+						password := "123456",
+						domain := "etsi.net",
+						domainProxy := "pcscf.etsi.net" //pcscf domain or IPaddress
+
+					}},
+					{
+					  sipUserId := {
+						publicId := "userSIP",
+						privateId := "userSIP_priv",
+						password := "123456",
+						domain := "etsi.net",
+						domainProxy := "pcscf.etsi.net" //pcscf domain or IPaddress
+
+					}},
+					{
+					  telUserId := {
+						publicId := "tel: 3344123432",
+						privateId := "userTEL_priv",
+						password := "123456",
+						domain := "etsi.net",
+						domainProxy := "pcscf.etsi.net" //pcscf domain or IPaddress
+					}}
+				}
+			},
+			{
+				productIndex := 1,
+				userIds := {
+					{
+					  sipUserId := {
+						publicId := "userSIP",
+						privateId := "userSIP_priv",
+						password := "123456",
+						domain := "TT.net",
+						domainProxy := "pcscf.TT.net" //pcscf domain or IPaddress
+					}},
+					{
+					  telUserId := {
+						publicId := "tel: 3344123443",
+						privateId := "userTEL_priv",
+						password := "123456",
+						domain := "TT.net",
+						domainProxy := "pcscf.TT.net" //pcscf domain or IPaddress
+					}}
+				}
+			},
+			{
+				productIndex := 2,
+				userIds := {
+					{
+					  sipUserId := {
+						publicId := "userSIP_B2",
+						privateId := "userSIPB2_priv",
+						password := "654321",
+						domain := "UU.net",
+						domainProxy := "pcscf.UU.net" //pcscf domain or IPaddress
+					}},
+					{
+					  telUserId := {
+						publicId := "tel: 7788987443",
+						privateId := "userTEL_B2_priv",
+						password := "654321",
+						domain := "UU.net",
+						domainProxy := "pcscf.UU.net" //pcscf domain or IPaddress
+					}}
+				}
+			}			
+		}// end modulepar
+	} // end group
+	
+	group eut {
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_Functions.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_Functions.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_Functions.ttcn	(revision 22)
@@ -0,0 +1,229 @@
+/*
+ *	@author 	STF 370
+ *  @version    $Id: LibIot_Functions.ttcn 16 2009-06-16 15:06:42Z pintar $
+ *	@desc		This module provides the functions used by the test component 
+ */
+
+module LibIot_Functions {
+	import from LibCommon_VerdictControl {type FncRetCode;}
+
+	import from LibUpperTester {
+		template mw_EO_Response;
+		type EquipmentOperationReq, EquipmentOperationRsp;
+	}
+
+	import from LibIot_TypesAndValues {
+		type IotVerdict, IotVerdictType, Status, VerdictType;
+	}
+
+	import from LibIot_PIXITS {
+		modulepar PX_EUT_TRIGGER_RESPONSE, PX_TTCN3_VERDICT;
+	}
+
+	import from LibIot_TestInterface {
+		type IotEquipmentUser, OracleClient, OracleServer, TestCoordinator, EquipmentUser;
+	}
+	
+	
+	group oracleFunctions {
+    
+    	/**
+    	 * @desc Sets the conformance verdict on the oracle client and sends it to the oracle server
+    	 * @param p_verdict conformance verdict set by the monitor
+    	 * @param p_reason reason why the verdict has been set
+    	 */
+    	function f_setConformanceVerdict(in verdicttype p_verdict,
+    									 in charstring p_reason)
+    	runs on OracleClient {
+    		var IotVerdict v_verdict := {conformance := {p_verdict, p_reason}};
+    		log("Conformance verdict set to: ", p_verdict, p_reason);
+    		vPort.send(v_verdict);
+    	}
+    
+    	/**
+    	* @desc Sets the end-to-end verdict on the oracle client and sends it to the oracle server
+    	* @param p_verdict e2e verdict set by the monitor
+    	* @param p_reason reason why the verdict has been set
+    	*/
+    	function f_setE2EVerdict(in verdicttype p_verdict, in charstring p_reason)
+    	runs on OracleClient {
+    		var IotVerdict v_verdict := {e2e := {p_verdict, p_reason}};
+    		log("E2E verdict set to: ", p_verdict, p_reason);
+    		vPort.send(v_verdict);
+    	}
+    
+    	/**
+    	 * @desc Gets the conformance verdict on the oracle client
+    	 * @return conformance verdict of oracle server
+    	 */
+    	function f_getConformanceVerdict()
+    	runs on OracleServer
+		return verdicttype {
+    		return vc_conf_verdict.verdict;
+    	}
+    
+    	/**
+    	 * @desc Gets the end-to-end verdict on the oracle client
+    	 * @return end-to-end verdict of oracle server
+    	 */
+    	function f_getE2EVerdict()
+    	runs on OracleServer
+		return verdicttype {
+    		return pass; //vc_e3e_verdict.verdict;
+    	}
+    
+    	/**
+    	* @desc Computes and logs overall verdict for end-to-end and conformance separately on oracle server
+    	* @param p_verdict the verdict received
+    	*/
+    	function f_setIotVerdict(in IotVerdict p_verdict) runs on OracleServer {
+    		f_logIotVerdict(p_verdict);
+    		if (ischosen(p_verdict.e2e) and PX_TTCN3_VERDICT == e_e2e) {
+    			setverdict(p_verdict.e2e.verdict, p_verdict.e2e.reason);
+    		} else if (ischosen(p_verdict.conformance) and PX_TTCN3_VERDICT == e_conformance) {
+    			setverdict(p_verdict.conformance.verdict, p_verdict.conformance.reason);
+    		}
+    	}
+
+		/**
+		* @desc Set verdict PASS on main component (to be used, e.g on TestCoordinator)
+		*/
+		function f_setIotVerdictPASS(in charstring p_reason) runs on OracleServer {
+            var IotVerdict p_verdict := {
+            	conformance := {verdict := pass, reason := p_reason}
+            };
+            f_setIotVerdict(p_verdict);
+		}
+    	/**
+    	* @desc Set verdict PASS on main component (to be used, e.g on TestCoordinator)
+    	*/
+    	function f_setIotVerdictFAIL(in charstring p_reason) runs on OracleServer {
+			var IotVerdict p_verdict := {
+				conformance := {verdict := fail, reason := p_reason}
+			};
+			f_setIotVerdict(p_verdict);
+    	}
+
+    	    	
+    	/**
+    	 * 
+    	 * @desc logs the received IOT verdict
+    	 * @param p_verdict The verdict to set
+    	 */
+    	function f_logIotVerdict(in IotVerdict p_verdict) runs on OracleServer {
+    		if (ischosen(p_verdict.e2e)) {
+    			vc_e3e_verdict := f_getWorseVerdict(vc_e3e_verdict, p_verdict.e2e);
+    			log("E2E verdict set to: ", p_verdict.e2e.verdict, "Reason: " & p_verdict.e2e.reason);
+    		} else  {
+    			vc_conf_verdict := f_getWorseVerdict(vc_conf_verdict, p_verdict.conformance);
+    			log("Conformance verdict set to: ", p_verdict.conformance.verdict, "Reason: " & p_verdict.conformance.reason);
+    		}
+    	}
+    	
+    	/**
+    	 * 
+    	 * @desc returns the worse verdict 
+    	 * @param p_org the original verdict 
+    	 * @param p_new the new verdict
+    	 * @return the worse verdict
+    	 */
+    	function f_getWorseVerdict(in VerdictType p_org, in VerdictType p_new) return VerdictType {
+    		if(p_org.verdict == pass) {
+    			
+    			if(p_new.verdict != pass) {
+    				return p_new;
+    			}
+    			else {
+    				return p_org;
+    			}
+    		}
+    		else if (p_org.verdict == inconc) {
+    			
+    			if(p_new.verdict != pass) {
+    				return p_new;
+    			}
+    			else {
+    				return p_org;
+    			}
+    		}
+    		else if (p_org.verdict == fail) {
+    			if(p_new.verdict == pass) {
+    				return p_org;
+    			}
+    			else if(p_new.verdict == inconc) {
+    				return p_org;
+    			}
+    			else {
+    				return p_new;
+    			}
+    		}
+    		else if (p_org.verdict == error) {
+    			return p_org;
+    		}
+    		
+    		return p_org;
+    	}
+    
+    	/**
+    	* @desc Altstep to be used for listening continously on the verdict port of the oracle server for receiving verdicts from oracle clients
+    	*/
+    	altstep a_receiveIOTVerdict() runs on OracleServer {
+    		var IotVerdict v_verdict;
+    		[] vPort.receive(IotVerdict:?) -> value v_verdict {
+    			f_setIotVerdict(v_verdict);
+    			repeat;
+    		}
+    	}
+	}
+	
+	group equipmentOperationFunctions { // TODO Update!
+		function f_sendEquipmentCmd(in EquipmentOperationReq p_req) runs on EquipmentUser {
+			var EquipmentOperationRsp v_response;
+			var charstring v_reason := "";
+			
+			T_Equipment.start(PX_EUT_TRIGGER_RESPONSE);
+			eaPort.send(p_req);
+			
+			alt{
+				[] eaPort.receive(mw_EO_Response(e_success)) -> value v_response {
+					if(ispresent(v_response.status.reason)) {
+						v_reason := v_response.status.reason;
+						f_setE2EVerdict(pass, "Equipment command """ & p_req.cmd & """successful: " & v_reason);
+					}else {
+						f_setE2EVerdict(pass, "Equipment command successful");
+					}
+				}
+				[] eaPort.receive(mw_EO_Response(?)) -> value  v_response {
+					if(ispresent(v_response.status.reason)) {
+						v_reason := v_response.status.reason;
+						f_setE2EVerdict(fail, "Equipment command """ & p_req.cmd & """unsuccessful: " & v_reason);
+					}else {
+						f_setE2EVerdict(fail, "Equipment command unsuccessful: no reason given");
+					}
+				}
+				[] T_Equipment.timeout {
+					f_setE2EVerdict(inconc, "Timer expired while waiting for reponse of Trigger command """ & p_req.cmd & """");
+				}
+			}
+		}
+	}
+	
+	group miscFunctions {
+    	/**
+    	* @desc 	searches the array for a given name and returns 
+    	* 			the corresponding index
+    	* @param 	p_idx index of the port
+    	* @return 	the index
+    	*/
+    	function f_getMonitorIdx(in charstring p_name)
+    	runs on TestCoordinator return integer {
+    		var integer v_size := sizeof(vc_compIds);
+    		for (var integer i := 0; i < v_size; i := i + 1) {
+    			if (vc_compIds[i].name == p_name) {
+    				return vc_compIds[i].index;
+    			}
+    		}
+    		return - 1;
+    	}
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_PIXITS.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_PIXITS.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_PIXITS.ttcn	(revision 22)
@@ -0,0 +1,284 @@
+/*
+ *  @author   STF 370
+ *  @version    $Id: LibIot_PIXITS.ttcn 277 2009-06-16 15:06:42Z pintar $
+ *  @desc   This module provides PIXIT parameters which need to be 
+ *        changeable within validation
+ */
+
+module LibIot_PIXITS   {
+ 
+  import from LibIot_TypesAndValues 
+  {
+  	type IOTExecMode, IotVerdictType, CaptureMode, RecordMode, FileList, TimeOffset, EutInterfaceInfoList,
+  	ProtocolFilter, IpAddress, PortNumber, ProductList;
+  }
+  
+  /**
+    * @desc PIXIT defines which verdict  (E2E or conformance)is to be kept track of with the TTCN-3 verdict.
+    *       Note that the verdict not chosen will be only available in log statements.
+    */
+  modulepar IotVerdictType PX_TTCN3_VERDICT := e_e2e;
+  
+  /**
+  * 
+  * @desc Maximum time limit used by monitor component for waiting for expected incoming messages
+  */
+  modulepar float PX_MAX_MSG_WAIT := 5.0;
+
+  /**
+   * 
+   * @desc Example of module parameter based entry of EUT interface information for all products particpating in an interoperability event
+   */
+  modulepar ProductList PX_PRODUCTS := {
+    {
+      productName := "Testing Tech IMS Core",
+      monitorInterfaces := {
+        {
+          interfaceName := "Gm",
+          interfaceInfo := {
+            IpInterfaceInfo := {
+              {
+                domainName := "pcscf.testingtech.com",
+                IpAddress := "127.0.0.1",
+                portNumbers := {5060, 5061}
+              }
+            }
+          }
+        },
+        {
+          interfaceName := "Mw",
+          interfaceInfo := {
+            IpInterfaceInfo := {
+              {
+                domainName := "icscf.testingtech.com",
+                IpAddress := "127.0.0.1",
+                portNumbers := {5080}
+              },
+              {
+                domainName := "scscf.testingtech.com",
+                IpAddress := "127.0.0.1",
+                portNumbers := {5090}
+              }
+            }
+          }
+        }
+      }
+    },
+    {
+      productName := "ETSI UE",
+      monitorInterfaces := {
+        {
+          interfaceName := "Gm",
+          interfaceInfo := {
+            IpInterfaceInfo := {
+              {
+                domainName := omit,
+                IpAddress := "127.0.0.1",
+                portNumbers := {5060}
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  
+  /**
+   * 
+   * @desc Selects product based on index in PX_PRODCUTS vendor list for EUT_A
+   */
+  modulepar integer PX_EUT_A := 0;
+  
+  /**
+   * 
+   * @desc Selects product based on index in PX_PRODCUTS vendor list for EUT_B
+   */
+  modulepar integer PX_EUT_B := 1;
+    
+  /**
+   * 
+   * @desc Selects product based on index in PX_PRODCUTS vendor list for EUT_B_B2
+   */
+  modulepar integer PX_EUT_B_B2 := 2;
+    
+  group adapterGeneralConfiguration {
+    /**
+    * 
+    * @desc Maximum time limit used by trigger component for waiting for EUT response after command has been sent
+    */
+    modulepar float PX_EUT_TRIGGER_RESPONSE := 15.0;
+    
+    /**
+     * @desc
+     *     In case of offline mode, it defines the Pcap file to play.
+     */
+    modulepar charstring PX_IOT_EXECUTION_FILE := "./TD_IMS_MESS_0001_19.pcap";
+    
+    /**
+     * @desc
+     *     Defines if the record traffic capture mode must be activated or not.
+     */
+    modulepar RecordMode PX_IOT_RECORD_MODE := e_norecord;
+    
+    /**
+     * @desc
+     *     Defines list of the files to merge.
+     */
+    modulepar FileList PX_IOT_FILE_MERGE_LIST := { "TD_IMS_0001_11.pcap", "TD_IMS_0001_19.pcap", "TD_IMS_0020.pcap" };
+    
+    /**
+     * @desc
+     *     Defines the location of the files to merge.
+     */
+    modulepar charstring PX_IOT_FILE_MERGE_PATH := "/tmp";
+    
+    /**
+     * @desc
+     *     Defines the location of the files to merge.
+     */
+    modulepar charstring PX_IOT_MERGE_TOOL_PATH := "C:\Program Files\WinPcap";
+    
+    /**
+     * @desc
+     *     Defines the time stamp offset to start playing record traffic capture file.
+     */
+    modulepar TimeOffset PX_IOT_TIMESTAMP_OFFSET := 
+    {
+    	seconds := 0,
+    	microseconds := 0
+    };
+    
+    /**
+     * @desc
+     *     List of the network interfaces to monitor.
+     *     Use ';' to separate the interfaces
+     */
+    modulepar charstring PX_IOT_IFACES := "rpcap://\Device\NPF_{9E2D0FCD-C7F5-401D-B736-F0D4F8814715}";
+    
+    modulepar EutInterfaceInfoList PX_IOT_EUTs_IFACE_INFO_LIST := 
+    {
+      {
+        eut := "User A",
+        ipAddress := "127.0.0.1",
+        portNumber := 6610
+      },
+      {
+        eut := "User B",
+        ipAddress := "127.0.0.1",
+        portNumber := 6611
+      },
+      {
+        eut := "User B2",
+        ipAddress := "127.0.0.1",
+        portNumber := 6612
+      }
+    };
+    
+  } // group adapterGlobalConfiguration
+  
+  group numberOfComponents {
+    /**
+     * 
+     * @desc integer value defines the number of monitor points.  
+     */
+    modulepar integer PX_NUM_OF_MONITORS := 1;
+              
+    /**
+     * 
+     * @desc integer value defines the number of devices to configure  
+     */
+    modulepar integer PX_NUM_OF_DEVICES := 1;
+              
+    /**
+     * @desc integer value defines the number of trigger points
+     */
+    modulepar integer PX_NUM_OF_TRIGGER_POINTS := 1; 
+    
+  }
+  
+  group interfaceData {
+  	group monitor1
+  	{
+	    /**
+	     * 
+	     * @desc protocol used by monitoring point #1  
+	     */
+	    modulepar ProtocolFilter PX_PROTOCOL_MONITOR1 := e_sip;
+	
+	    /**
+	     * 
+	     * @desc First IP address used by monitoring point #1  
+	     */
+	    modulepar IpAddress PX_IP1_MONITOR1 := "172.31.12.72";
+	
+	    /**
+	     * 
+	     * @desc Second IP address used by monitoring point #1  
+	     */
+	    modulepar IpAddress PX_IP2_MONITOR1 := "172.31.42.3";
+	
+	    /**
+	     * 
+	     * @desc TCP or UDP port used by monitoring point #1 
+	     */
+	     
+	    modulepar PortNumber PX_PORT_MONITOR1 := 5060;
+		}
+  	group monitor2
+  	{
+	    /**
+	     * 
+	     * @desc protocol used by monitoring point #2  
+	     */
+	    modulepar ProtocolFilter PX_PROTOCOL_MONITOR2 := e_sip;
+	    	
+	    /**
+	     * 
+	     * @desc First IP address used by monitoring point #2 
+	     */
+	    modulepar IpAddress PX_IP1_MONITOR2 := "172.31.42.4";
+	
+	    /**
+	     * 
+	     * @desc Second IP address used by monitoring point #2  
+	     */
+	    modulepar IpAddress PX_IP2_MONITOR2 := "172.31.13.2";
+	
+	    /**
+	     * 
+	     * @desc TCP or UDP port used by monitoring point #2  
+	     */
+	     
+	    modulepar PortNumber PX_PORT_MONITOR2 := 5060;
+
+		}
+   	group monitor3
+  	{
+	    /**
+	     * 
+	     * @desc protocol used by monitoring point #3  
+	     */
+	    modulepar ProtocolFilter PX_PROTOCOL_MONITOR3 := e_sip;
+	    	
+	    /**
+	     * 
+	     * @desc First IP address used by monitoring point #3
+	     */
+	    modulepar IpAddress PX_IP1_MONITOR3 := "172.31.44.84";
+	
+	    /**
+	     * 
+	     * @desc Second IP address used by monitoring point #3
+	     */
+	    modulepar IpAddress PX_IP2_MONITOR3 := "172.31.14.6";
+	
+	    /**
+	     * 
+	     * @desc TCP or UDP port used by monitoring point #3
+	     */
+	     
+	    modulepar PortNumber PX_PORT_MONITOR3 := 5060;
+
+		}
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_TestConfiguration.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_TestConfiguration.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_TestConfiguration.ttcn	(revision 22)
@@ -0,0 +1,47 @@
+/*
+ *	@author 	STF 370
+ *  @version    $Id: LibIot_TestConfiguration.ttcn 16 2009-06-16 15:06:42Z pintar $
+ *	@desc		xxx.
+ */
+
+module LibIot_TestConfiguration {
+	
+	import from LibIot_TestInterface {
+		type
+			InterfaceMonitor,
+			IotEquipmentUser,
+			OracleClient,
+			OracleServer,
+			TestCoordinator;
+	}
+	
+	/**
+	* @desc 	connects the port of the monitor component to the 
+	* 			port of the test oracle and activates the default
+	* @param 	p_monitor	monitor component 	
+	*/
+	function f_cf_oracle_up(in OracleClient p_client) runs on OracleServer {
+		connect(self:vPort, p_client:vPort);
+	}
+	
+	/**
+	* @desc 	deactivates the default and disconnects the port of the monitor
+	* 			component
+	* @param 	p_monitor	monitor component 	
+	*/	
+	function f_cf_oracle_down(in OracleClient p_client) runs on OracleServer {
+		disconnect(self:vPort, p_client:vPort);
+	}
+		
+	/**
+	* @desc 	creates a IOT equipment user component 
+	* @param 	p_name	name of the equipment user component 
+	* @return 			reference to the created equipment user component
+	*/	
+	function f_cf_create_IotEquipmentUser(in charstring p_name) runs on TestCoordinator return IotEquipmentUser {
+		var IotEquipmentUser v_iotEquipmentUser := IotEquipmentUser.create(p_name) alive;
+		//var IotEquipmentUser v_iotEquipmentUser := IotEquipmentUser.create alive;
+		
+		return v_iotEquipmentUser; 
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_TestInterface.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_TestInterface.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_TestInterface.ttcn	(revision 22)
@@ -0,0 +1,107 @@
+/*
+ *  @author   STF 370
+ *  @version    $Id: LibIot_TestInterface.ttcn 16 2009-06-16 15:06:42Z pintar $
+ *  @desc   This module provides the types and components used by the test 
+ *        system component for Interoperability tests.
+ */
+
+module LibIot_TestInterface {
+
+  import from LibUpperTester {
+    type EquipmentOperationReq, EquipmentOperationRsp;
+  }
+
+  import from LibIot_TypesAndValues all;
+
+  import from LibIot_PIXITS all;//{modulepar PX_MAX_MSG_WAIT;}
+
+  import from LibCommon_Sync all;
+  import from LibSip_SIPTypesAndValues all; 
+  import from AtsImsIot_TypesAndValues all;
+  
+  
+  group abstractTestComponents {
+    /**
+    * @desc
+    *     used to coordinate the behavior of other components. It is in charge
+    *     of controlling the overall execution, manangement of testing phases,
+    *     test verdicts collection and synchronization. Used as MTC.
+    */
+    type component TestCoordinator extends OracleServer {
+      var ComponentIdList vc_compIds;
+      port AdapterConfigPort acPort;
+    }
+      
+    /**
+    * @desc
+    *     collecting information to manage E2E and conformance verdicts.
+    *     Can be used as MTC.
+    */        
+    type component OracleServer extends ServerSyncComp {
+      port VerdictPort vPort;
+      var VerdictType vc_e3e_verdict;
+      var VerdictType vc_conf_verdict;
+    }
+    
+    type component OracleClient extends SelfSyncComp {
+      port VerdictPort vPort;
+    }
+      
+    /**
+    * @desc
+    *     This component type is used to monitor interfaces.
+    *     The library provides on the adapter configuration port.
+    * @remark
+    *     As part of the ATS test system module this component type must be
+    *     extended to include the ATS specific data port!
+    */
+    type component InterfaceMonitor extends OracleClient {
+      timer tc_wait := PX_MAX_MSG_WAIT;
+      var charstring vc_interfaceName := "Undefined";
+      port AdapterConfigPort acPort;
+    }
+      
+      
+    /**
+   * @desc
+   *     This component type is used to trigger, stimualte, configure etc any
+   *     equipment related to the test, i.e., EUTs or other, or the
+   *     interconnecting network. To be used as PTC.
+    */
+    type component EquipmentUser extends OracleClient{
+      port EquipmentAccessPort eaPort;
+      timer T_Equipment;
+    }
+    
+    /**
+    * @desc This component type is used to trigger, stimulate, configure etc 
+    *       any equipment related to the test, i.e., EUTs or other, or 
+    *       the interconnecting network. To be used as PTC.
+    */
+    type component IotEquipmentUser extends EquipmentUser {
+    }
+    
+  }// end group abstractTestComponents
+  
+  group portDefinitions {
+    
+    type port EquipmentAccessPort message {
+      out EquipmentOperationReq;
+      in EquipmentOperationRsp;
+    }
+    type port VerdictPort message {
+      inout IotVerdict;
+    }
+    
+    type port AdapterConfigPort message {
+      out GeneralConfigurationReq; 
+      out SetFilterReq; 
+      out StartTrafficCaptureReq; 
+      out StopTrafficCaptureReq; 
+      in  GeneralConfigurationRsp;  
+      in  SetFilterRsp; 
+      in  StartTrafficCaptureRsp; 
+      in  StopTrafficCaptureRsp;  
+    } 
+  } // end group portDefinitions
+} // end module LibIot_TestInterface
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_TypesAndValues.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_TypesAndValues.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibIot/LibIot_TypesAndValues.ttcn	(revision 22)
@@ -0,0 +1,250 @@
+/*
+ *  @author   STF 370
+ *  @version    $Id: LibIot_TypesAndValues.ttcn 16 2009-06-16 15:06:42Z pintar $
+ *  @desc   This module provides the (message) types and constants used by the test component 
+ *              for Iot tests. 
+ */
+
+module LibIot_TypesAndValues { 
+  
+  import from LibCommon_BasicTypesAndValues {type UInt32, UInt16;}
+
+  import from LibCommon_VerdictControl {type FncRetCode;} 
+
+  group commonTypes {
+    type enumerated IOTExecMode { e_realtime, e_offline }
+
+    type record Status {
+      FncRetCode code,
+      charstring reason optional
+    }
+    
+  }
+    
+  group interfaceInformationrelatedTypes {
+    
+  /**
+   * 
+   * @desc IP address type e.g. "127.0.0.1" 
+   */
+  type charstring IpAddress;
+  
+  /**
+   * 
+   * @desc Type for port number, e.g. "5060" 
+   */
+  type UInt16 PortNumber;
+  
+  /**
+   * 
+   * @desc List of port numbers 
+   */
+  type record of PortNumber PortNumberList;
+  
+  /**
+   * 
+   * @desc Required information for IP interfaces
+   * @member domainName the domain name
+   * @member IpAddress the ip address
+   * @member portNumbers the list of port numbers where message are received
+   */
+  type record IpInterfaceInfo {
+     charstring domainName optional,
+     IpAddress IpAddress,
+     PortNumberList portNumbers 
+  }
+  
+  /**
+   * 
+   * @desc List of IP interfacees
+   */
+  type record of IpInterfaceInfo IpInterfaceInfoList;
+  
+  /**
+   * 
+   * @desc Collection of different interface types, e.g for IP communications 
+   *       This type can be extended with new alternative for other interface types
+   */
+  type union InterfaceInfo {
+     IpInterfaceInfoList IpInterfaceInfo
+  }
+  
+  /**
+   * 
+   * @desc Type for representing EUT interface information for monitored logical interfaces 
+   * @member interfaceName Name of logical interface
+   * @member interfaceInfo Interface information specific to this logical interface
+   */ 
+  type record MonitorInterfaceInfo {
+     charstring interfaceName,
+     InterfaceInfo interfaceInfo  
+  }
+  
+  /**
+   * 
+   * @desc List of monitored interfaces 
+   */
+  type record of MonitorInterfaceInfo MonitorInterfaceInfoList;
+ 
+  /**
+   * 
+   * @desc Product specific EUT interface information 
+   * @member name the name of the vendor
+   * @member monitorInterfaces monitor interface configuration
+   */
+  type record Product {
+     charstring productName,
+     MonitorInterfaceInfoList monitorInterfaces
+  }
+  
+  /**
+   * 
+   * @desc List of product specificr EUT interface information
+   */
+  type record of Product ProductList;
+  }
+  
+
+
+  group adapterConfigurationTypes {
+    
+    type union CaptureMode {
+      LiveCapture liveCpature,
+      OfflineCapture offlineCapture
+    }
+    
+    //
+    type record of charstring PhysicalInterfaceList;
+         
+    type record LiveCapture {
+      PhysicalInterfaceList physicalInterfaces, // TODO document example syntax
+      RecordMode            recordMode
+    }
+    
+    type enumerated RecordMode {
+      e_norecord,
+      e_record  
+    }
+    
+    type record of charstring FileList;
+
+    type record MergeFileList {
+      FileList    mergeFileList, 
+      charstring  mergeFilePath,   
+      charstring  mergeToolPath   
+    }
+    
+    type record CaptureSource {
+      charstring singleFile, // e.g., PCAP file
+      MergeFileList mergeFileList
+
+    }
+    
+    type record TimeOffset
+    {
+      UInt32 seconds,
+      UInt32 microseconds
+    }
+    
+    type record OfflineCapture {
+      TimeOffset     offset,
+      CaptureSource  captureSource
+    }
+    
+  /**
+   * 
+   * @desc Required information for EUTs IP interfaces
+   * @member IpAddress the ip address
+   * @member portNumber the list of port number where message are received
+   */
+  type record EutInterfaceInfo {
+     charstring     eut,
+     IpAddress      ipAddress,
+     PortNumber     portNumber
+  }
+  
+ /**
+   * 
+   * @desc List of IP interfaces for EUTs
+   */
+  type record of EutInterfaceInfo EutInterfaceInfoList;
+  
+
+    
+    type record GeneralConfigurationReq {
+      charstring  captureProcessIpAddress,
+      PortNumber  captureProcessPort,
+      CaptureMode captureMode,
+      EutInterfaceInfoList eutInfoList optional
+    }
+    
+    type record GeneralConfigurationRsp
+    {
+      Status status
+    }
+    
+    
+    //type record (2..infinity) of InterfaceInfo InterfaceInfoList;
+    type record of InterfaceInfo InterfaceInfoList;
+    
+    type enumerated ProtocolFilter {
+      e_sip,
+      e_dns
+    }
+    
+    type record SetFilterReq {
+      ProtocolFilter    protocol,
+      InterfaceInfoList interfaceInfos
+    }
+
+        
+    type record SetFilterRsp
+    {
+      Status status
+    }
+    
+    
+    type record StartTrafficCaptureReq { }
+    
+    type record StartTrafficCaptureRsp
+    {
+      Status status
+    }
+    
+    
+    type record StopTrafficCaptureReq { }
+  
+    type record StopTrafficCaptureRsp
+    {
+      Status status
+    }
+
+  }
+
+  group oracleRelatedTypes {
+    // used for PIXIT definition
+    type enumerated IotVerdictType { e_e2e, e_conformance }
+  
+    // used for verdict handling
+    type record VerdictType {
+      verdicttype verdict,
+     charstring reason optional 
+    }
+  
+    type union IotVerdict {
+      VerdictType e2e,
+      VerdictType conformance 
+    }
+  }
+  /**
+     * @desc Default record
+     */
+  type record of default DefaultList;
+   
+  type record ComponentId {
+      charstring name,
+      integer index // explain more
+    }
+   
+    type set of ComponentId ComponentIdList;
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibUpperTester/LibUpperTester.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibUpperTester/LibUpperTester.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/LibUpperTester/LibUpperTester.ttcn	(revision 22)
@@ -0,0 +1,57 @@
+/*
+ *	@author 	STF 370
+ *  @version    $Id$
+ *	@desc		xxx
+ */
+module LibUpperTester {
+	import from LibCommon_VerdictControl {type FncRetCode;}
+	import from LibIot_TypesAndValues {type Status;}
+
+	// TODO - move to common lib
+	/*type record Status {
+		FncRetCode code, charstring reason optional
+	}*/
+// TODO commented out due to problems with tools not accepting 'extends' from several components
+  /**
+	 * @desc
+	 *     This component type is used to trigger, stimualte, configure etc any
+	 *     equipment related to the test, i.e., EUTs or other, or the
+	 *     interconnecting network. To be used as PTC.
+	 */
+//	type component EquipmentUser {
+//		port EquipmentAccessPort eaPort;
+//		timer T_Equipment;
+//	}
+
+	group equipmentOperationTypes {
+
+		type record of charstring ParameterList;
+
+		type charstring EquipmentCommand;
+
+		type record EquipmentOperationReq {
+			EquipmentCommand cmd, ParameterList params optional 
+		}
+
+		type record EquipmentOperationRsp {
+			Status status
+		}
+	}
+	
+	group equipmentOperationTemplates {
+		
+		template EquipmentOperationReq m_EQ_Request(in EquipmentCommand p_cmd, ParameterList p_params) := {
+			cmd := p_cmd,
+			params := p_params
+		}
+		
+		template EquipmentOperationRsp mw_EO_Response(in template FncRetCode p_code) := {
+			status := {
+				code := p_code,
+				reason := *
+			}
+		}
+	}
+
+	
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/README.txt
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/README.txt	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/README.txt	(revision 22)
@@ -0,0 +1,2 @@
+Files contained in this folder are only provided for testing before complete integration.
+Do NOT rely on their content.
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/TTCNWinMerge.WinMerge
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/TTCNWinMerge.WinMerge	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/TTCNWinMerge.WinMerge	(revision 22)
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<project>
+   <paths>
+      <left>C:\cygwin\home\yann\dev\g++\STF 370\adapter\validation\</left>
+      <right>C:\cygwin\home\yann\dev\g++\STF 370\ttcn\</right>
+      <filter>*.ttcn</filter>
+      <subfolders>1</subfolders>
+      <left-readonly>0</left-readonly>
+      <right-readonly>1</right-readonly>
+   </paths>
+</project>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/TestExecution.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/TestExecution.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/adapter/validation/TestExecution.ttcn	(revision 22)
@@ -0,0 +1,1132 @@
+module TestExecution {
+
+  import from LibIot_TestInterface {type IotEquipmentUser;}
+  import from LibIot_TypesAndValues {type SetFilterReq, SetFilterRsp;}
+
+  import from LibIot_TestConfiguration {
+    function f_cf_create_IotEquipmentUser;
+  }
+
+  import from AtsImsIot_TestConfiguration {
+    function
+      f_cf_create_monitor,
+      f_cf_monitor_down,
+      f_cf_monitor_up,
+      f_cf_user_down,
+      f_cf_user_up,
+      f_cf_adapter_up,
+      f_cf_adapter_down;
+  }
+
+  import from AtsImsIot_TestSystem {
+    type ImsInterfaceMonitor, ImsTestCoordinator, IotSystemInterface;
+  }
+
+  import from LibIms_UpperTester {type ImsUserInfo;}
+
+  import from AtsImsIot_Functions {function all;}
+
+  import from LibIot_TypesAndValues {const all type StartTrafficCaptureRsp, StopTrafficCaptureRsp; }
+
+  import from LibIot_PIXITS all;
+
+  import from AtsImsIot_Templates all;
+
+  import from LibSip_SIPTypesAndValues {type Request, Response;}
+
+  template Request mw_request := ?;
+  template Response mw_response := ?;
+  
+  group constantDefinitions {
+    //* interface monitor name Gm A
+    const charstring c_gm_A := "Gm A";
+    //* interface monitor name Gm B
+    const charstring c_gm_B := "Gm B";
+    //* interface monitor name Mw
+    const charstring c_mw := "Mw";
+    //* interface monitor name Isc A
+    const charstring c_isc_A := "Isc A";
+    //* interface monitor name Isc B
+    const charstring c_isc_B := "Isc B";
+    //* eut trigger name User A
+    const charstring c_userUE_A := "User A";
+    //* eut trigger name User B
+    const charstring c_userUE_B := "User B";
+    const charstring c_userUE_B2 := "User B2";
+  }
+
+function f_monitor(template SetFilterReq p_filter) runs on ImsInterfaceMonitor {
+  
+    var SetFilterRsp setFilterRsp;
+    timer tc_configureGuard;
+  
+  acPort.send(p_filter);      
+  tc_configureGuard.start(PX_MAX_MSG_WAIT);
+  alt {
+    [] acPort.receive (m_setFilterRspAny) -> value setFilterRsp {
+      if (setFilterRsp.status.code != e_success) {
+        log("**** f_monitor: SetFilterReq unsuccessfull! ****");
+            setverdict(fail);
+            stop;
+          }   
+    }
+    [] tc_configureGuard.timeout {
+        log("**** f_monitor: SetFilterReq not answered. ****");
+          setverdict (inconc);
+          stop;
+      }
+    }    
+
+  // Receive loop    
+   alt {
+     [] dPort.receive (mw_request) {
+        log(self, "Received request");
+          repeat;
+     }
+     [] dPort.receive (mw_response) {
+        log(self, "Received response");
+          repeat;
+     }
+     [] dPort.receive {
+        log(self, "Received default");
+          repeat;
+     }
+   }      
+}
+
+  testcase TC_GeneralConfigurationMessageOffLineMode() runs on ImsTestCoordinator system IotSystemInterface {
+
+    timer tc_configureGuard;
+    
+    // map/connect component ports
+    f_cf_adapter_up();
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_offline);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        log("General configuration succeed.");
+        tc_configureGuard.stop;
+        setverdict(pass);
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive {
+        log("Unknown response.");
+        tc_configureGuard.stop;
+        setverdict (inconc);
+        stop;
+      }
+      [] tc_configureGuard.timeout {
+        log("Timeout.");
+        setverdict (inconc);
+        stop;
+      }
+    } 
+    log("Preamble done.");
+    
+    // test body
+    log("Test body done.");
+
+    // postamble
+    log("Postamble done.");
+
+    f_cf_adapter_down();
+ }
+
+  testcase TC_GeneralConfigurationMessageOnLineMode() runs on ImsTestCoordinator system IotSystemInterface {
+    // create components
+    timer tc_configureGuard;
+    
+    // map/connect component ports
+    f_cf_adapter_up();
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_online);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        log("General configuration succeed.");
+        tc_configureGuard.stop;
+        setverdict(pass);
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive {
+        log("Unknown response.");
+        tc_configureGuard.stop;
+        setverdict (inconc);
+        stop;
+      }
+      [] tc_configureGuard.timeout {
+        log("Timeout.");
+        setverdict (inconc);
+        stop;
+      }
+    } 
+    log("Preamble done.");
+    
+    // test body
+    log("Test body done.");
+
+    // postamble
+    log("Postamble done.");
+
+    //unmap/disconnet component ports
+    f_cf_adapter_down();
+  }
+
+  testcase TC_GeneralConfigurationMessageMerge() runs on ImsTestCoordinator system IotSystemInterface {
+    // create components
+    timer tc_configureGuard;
+    
+    // map/connect component ports
+    f_cf_adapter_up();
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_merge);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        log("General configuration succeed.");
+        tc_configureGuard.stop;
+        setverdict(pass);
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive {
+        log("Unknown response.");
+        tc_configureGuard.stop;
+        setverdict (inconc);
+        stop;
+      }
+      [] tc_configureGuard.timeout {
+        log("Timeout.");
+        setverdict (inconc);
+        stop;
+      } 
+    } 
+    log("Preamble done.");
+    
+    // test body
+    log("Test body done.");
+
+    // postamble
+    log("Postamble done.");
+
+    //unmap/disconnet component ports
+    f_cf_adapter_down();
+  }
+
+  testcase TC_TriggerUERegisterOffLineMode() runs on ImsTestCoordinator system IotSystemInterface {
+    
+    // create components
+    var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+    var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+    timer tc_configureGuard;
+    
+    // map/connect component ports
+    f_cf_adapter_up();
+    f_cf_user_up(v_ueA);
+    f_cf_user_up(v_ueB);
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_offline);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        log("General configuration succeed.");
+        tc_configureGuard.stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive {
+        log("Unknown response.");
+        tc_configureGuard.stop;
+        setverdict (inconc);
+        stop;
+      }
+      [] tc_configureGuard.timeout {
+        log("Timeout.");
+        setverdict (inconc);
+        stop;
+      } 
+    } 
+    log("Preamble done.");
+    
+    // test body
+    f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+    f_PR_user_home_registration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+    //setverdict(pass);
+    log("Test body done.");
+
+    // postamble
+    log("Postamble done.");
+
+    //unmap/disconnet component ports
+    f_cf_user_down(v_ueA);
+    //f_cf_user_down(v_ueB);
+    f_cf_adapter_down();
+  }
+
+  testcase TC_TriggerOneUERegisterOnLineMode() runs on ImsTestCoordinator system IotSystemInterface {
+    // create components
+    var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+    timer tc_configureGuard;
+    
+    // map/connect component ports
+    f_cf_adapter_up();
+    f_cf_user_up(v_ueA);
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_online);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        log("General configuration succeed.");
+        tc_configureGuard.stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive {
+        log("Unknown response.");
+        tc_configureGuard.stop;
+        setverdict (inconc);
+        stop;
+      }
+      [] tc_configureGuard.timeout {
+        log("Timeout.");
+        setverdict (inconc);
+        stop;
+      } 
+    } 
+    log("Preamble done.");
+    
+    // test body
+    f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+    //setverdict(pass);
+    log("Test body done.");
+
+    // postamble
+    log("Postamble done.");
+
+    //unmap/disconnet component ports
+    f_cf_user_down(v_ueA);
+    f_cf_adapter_down();
+  }
+
+  testcase TC_TriggerTwoUERegisterOnLineMode() runs on ImsTestCoordinator system IotSystemInterface {
+    // create components
+    var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+    var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+    timer tc_configureGuard;
+    
+    // map/connect component ports
+    f_cf_adapter_up();
+    f_cf_user_up(v_ueA);
+    f_cf_user_up(v_ueB);
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_online);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        log("General configuration succeed.");
+        tc_configureGuard.stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive {
+        log("Unknown response.");
+        tc_configureGuard.stop;
+        setverdict (inconc);
+        stop;
+      }
+      [] tc_configureGuard.timeout {
+        log("Timeout.");
+        setverdict (inconc);
+        stop;
+      } 
+    } 
+    log("Preamble done.");
+    
+    // test body
+    f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+    f_PR_user_home_registration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+    //setverdict(pass);
+    log("Test body done.");
+
+    // postamble
+    log("Postamble done.");
+
+    //unmap/disconnet component ports
+    f_cf_user_down(v_ueA);
+    f_cf_user_down(v_ueB);
+    f_cf_adapter_down();
+  }
+
+  testcase TC_TriggerUERegister3UsersOnLineMode() runs on ImsTestCoordinator system IotSystemInterface {
+    // create components
+    var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+    var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+    var IotEquipmentUser v_ueB2 := f_cf_create_IotEquipmentUser(c_userUE_B2);
+    timer tc_configureGuard;
+    timer tc_ac;
+    
+    // map/connect component ports
+    f_cf_adapter_up();
+    f_cf_user_up(v_ueA);
+    f_cf_user_up(v_ueB);
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_online);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        log("General configuration succeed.");
+        tc_configureGuard.stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive {
+        log("Unknown response.");
+        tc_configureGuard.stop;
+        setverdict (inconc);
+        stop;
+      }
+      [] tc_configureGuard.timeout {
+        log("Timeout.");
+        setverdict (inconc);
+        stop;
+      } 
+    } 
+    log("Preamble done.");
+    
+    // test body
+    f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+    f_PR_user_home_registration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+    f_PR_user_home_registration(v_ueB2, f_getAnyValidUser(PX_EUT_B_B2));
+    // do-nothing loop
+    tc_ac.start(10.0);
+    tc_ac.timeout;
+    //setverdict(pass);
+    log("Test body done.");
+
+    // postamble
+    log("Postamble done.");
+
+    //unmap/disconnet component ports
+    f_cf_user_down(v_ueA);
+    f_cf_user_down(v_ueB);
+    f_cf_user_down(v_ueB2);
+    f_cf_adapter_down();
+  }
+
+  testcase TC_TriggerUEDeRegister() runs on ImsTestCoordinator system IotSystemInterface {
+    // create components
+    var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+    var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+    timer tc_configureGuard;
+    timer tc_ac;
+    
+    // map/connect component ports
+    f_cf_adapter_up();
+    f_cf_user_up(v_ueA);
+    f_cf_user_up(v_ueB);
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_online);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        log("General configuration succeed.");
+        tc_configureGuard.stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive {
+        log("Unknown response.");
+        tc_configureGuard.stop;
+        setverdict (inconc);
+        stop;
+      }
+      [] tc_configureGuard.timeout {
+        log("Timeout.");
+        setverdict (inconc);
+        stop;
+      } 
+    } 
+    log("Preamble done.");
+    
+    // test body
+    f_PO_user_home_deregistration(v_ueA);
+    f_PO_user_home_deregistration(v_ueB);
+    setverdict(pass);
+    log("Test body done.");
+
+    // postamble
+    log("Postamble done.");
+
+    //unmap/disconnet component ports
+    f_cf_user_down(v_ueA);
+    f_cf_user_down(v_ueB);
+    f_cf_adapter_down();
+  }
+
+  testcase TC_TriggerUERegisterUEDeRegister() runs on ImsTestCoordinator system IotSystemInterface {
+    // create components
+    var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+    var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+    timer tc_configureGuard;
+    timer tc_ac;
+    
+    // map/connect component ports
+    f_cf_adapter_up();
+    f_cf_user_up(v_ueA);
+    f_cf_user_up(v_ueB);
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_online);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        log("General configuration succeed.");
+        tc_configureGuard.stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive {
+        log("Unknown response.");
+        tc_configureGuard.stop;
+        setverdict (inconc);
+        stop;
+      }
+      [] tc_configureGuard.timeout {
+        log("Timeout.");
+        setverdict (inconc);
+        stop;
+      } 
+    } 
+    f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+    f_PR_user_home_registration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+    log("Preamble done.");
+    
+    // test body
+    // do-nothing loop
+    tc_ac.start(10.0);
+    tc_ac.timeout;  
+    log("Test body done.");
+
+    // postamble
+    f_PO_user_home_deregistration(v_ueA);
+    f_PO_user_home_deregistration(v_ueB);
+    setverdict(pass);
+    log("Postamble done.");
+
+    //unmap/disconnet component ports
+    f_cf_user_down(v_ueA);
+    f_cf_user_down(v_ueB);
+    f_cf_adapter_down();
+  }
+
+  testcase TC_TriggerUERegisterOnLineModeWithoutEUTsSettings() runs on ImsTestCoordinator system IotSystemInterface {
+    // create components
+    var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+    var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+    timer tc_configureGuard;
+    
+    // map/connect component ports
+    f_cf_adapter_up();
+    f_cf_user_up(v_ueA);
+    f_cf_user_up(v_ueB);
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_onlinewithoutEUTs);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        tc_configureGuard.stop;
+        setverdict(pass);
+      }
+      [] acPort.receive {
+        log("Unknown response.");
+        tc_configureGuard.stop;
+        setverdict (inconc);
+        stop;
+      }
+      [] tc_configureGuard.timeout {
+        log("Timeout.");
+        setverdict (inconc);
+        stop;
+      } 
+    } 
+    log("Preamble done.");
+    
+    // test body
+    log("Test body done.");
+
+    // postamble
+    log("Postamble done.");
+
+    //unmap/disconnet component ports
+    f_cf_user_down(v_ueA);
+    f_cf_user_down(v_ueB);
+    f_cf_adapter_down();
+  }
+
+  testcase TC_TriggerUERegisterOnLineModeBadEUTsInfo() runs on ImsTestCoordinator system IotSystemInterface {
+    // create components
+    var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+    var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+    timer tc_configureGuard;
+    
+    // map/connect component ports
+    f_cf_adapter_up();
+    f_cf_user_up(v_ueA);
+    f_cf_user_up(v_ueB);
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_onlinewithbadEUTs);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        setverdict(pass);
+        tc_configureGuard.stop;
+      }
+      [] acPort.receive {
+        tc_configureGuard.stop;
+        setverdict (inconc);
+        stop;
+      }
+      [] tc_configureGuard.timeout {
+        setverdict (inconc);
+        stop;
+      }
+    } 
+    log("Preamble done.");
+    
+    // test body
+    log("Test body done.");
+
+    // postamble
+    log("Postamble done.");
+
+    //unmap/disconnet component ports
+    f_cf_user_down(v_ueA);
+    f_cf_user_down(v_ueB);
+    f_cf_adapter_down();
+  }
+
+  testcase TC_SetFilter() runs on ImsTestCoordinator system IotSystemInterface {
+
+    timer tc_configureGuard, tc_ac;
+    var StartTrafficCaptureRsp startResult;
+    var StartTrafficCaptureRsp stopResult;
+    var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+    var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+   
+    // map/connect component ports
+    f_cf_adapter_up();
+    f_cf_monitor_up(v_gmA);
+    f_cf_monitor_up(v_mw);
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_offline);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        log("General configuration succeed.");
+        tc_configureGuard.stop;
+        setverdict(pass);
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive {
+        tc_configureGuard.stop;
+        setverdict (inconc);
+        stop;
+      }
+      [] tc_configureGuard.timeout {
+        setverdict (inconc);
+        stop;
+      }
+    }
+    log("Preamble done.");
+    
+    // test body
+     // Filters are set by interface monitor components
+    v_gmA.start(f_monitor(m_setFilterReqMonitor1));
+    v_mw.start(f_monitor(m_setFilterReqMonitor2));
+    
+   // do-nothing loop
+    tc_ac.start(10.0);
+    tc_ac.timeout;  
+    log("Test body done.");
+
+    // postamble
+    v_gmA.stop;
+    v_mw.stop;
+    log("Postamble done.");
+
+    //unmap/disconnet component ports
+    f_cf_monitor_down(v_gmA);
+    f_cf_monitor_down(v_mw);
+    f_cf_adapter_down();
+  }
+
+  testcase TC_StartStopCapture() runs on ImsTestCoordinator system IotSystemInterface {
+    // create components
+    var StartTrafficCaptureRsp startResult;
+    var StopTrafficCaptureRsp stopResult;
+    var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+    var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+    timer tc_ac;
+    timer tc_configureGuard;
+    
+    // map/connect component ports
+    f_cf_adapter_up();
+    f_cf_monitor_up(v_gmA);
+    f_cf_monitor_up(v_mw);
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_offline);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        log("General configuration succeed.");
+        tc_configureGuard.stop;
+        setverdict(pass);
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+     [] tc_configureGuard.timeout {
+        setverdict (inconc);
+        stop;
+      }
+    }
+    log("Preamble done.");
+   
+    // test body
+    v_gmA.start(f_monitor(m_setFilterReqMonitor1));
+    v_mw.start(f_monitor(m_setFilterReqMonitor2));
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_startTrafficCaptureReq);
+    alt {
+      [] acPort.receive (m_startTrafficCaptureRsp_any) -> value startResult {
+        tc_configureGuard.stop;
+        if (startResult.status.code != e_success)
+        {
+          log("**** TC_StartStopCapture: startTrafficCaptureReq unsuccessfull! ****");
+          setverdict(fail);
+          stop;
+        }
+      }
+      [] tc_configureGuard.timeout {
+        log("**** TC_StartStopCapture: startTrafficCaptureReq not answered. ****");
+        setverdict (inconc);
+        stop;
+      }
+    } 
+
+   // do-nothing loop    
+    tc_ac.start(20.0);
+   tc_ac.timeout;
+
+    log("Test body done.");
+
+    // postamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_stopTrafficCaptureReq);
+    alt {
+      [] acPort.receive (m_startTrafficCaptureRsp_any) -> value stopResult {
+        tc_configureGuard.stop;
+        if (stopResult.status.code != e_success)
+        {
+          setverdict(fail);
+        }
+        else
+        {
+          setverdict(pass);
+       }
+      }
+      [] tc_configureGuard.timeout {
+        setverdict (inconc);
+        stop;
+      }
+    } 
+    v_gmA.stop;
+    v_mw.stop;
+    log("Postamble done.");
+
+    //unmap/disconnet component ports
+    f_cf_monitor_down(v_gmA);
+    f_cf_monitor_down(v_mw);
+    f_cf_adapter_down();
+  }
+
+  testcase TC_IMS_MESS_0001() runs on ImsTestCoordinator system IotSystemInterface {
+    var StartTrafficCaptureRsp startResult;
+    var StopTrafficCaptureRsp stopResult;
+    // create components
+    var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+    var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+    var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+    var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+    timer tc_ac;
+    timer tc_configureGuard;
+    
+    // map/connect component ports
+    f_cf_adapter_up();
+    f_cf_user_up(v_ueA);
+    f_cf_user_up(v_ueB);
+    f_cf_monitor_up(v_gmA);
+    f_cf_monitor_up(v_mw);
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_offline);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        log("**** TC_IMS_MESS_0001: General configuration succeed. ****");
+        tc_configureGuard.stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive {
+        log("**** TC_IMS_MESS_0001: General configuration unknown response. ****");
+        tc_configureGuard.stop;
+        setverdict (inconc);
+        stop;
+      }
+      [] tc_configureGuard.timeout {
+        log("**** TC_IMS_MESS_0001: General configuration timeout. ****");
+        setverdict (inconc);
+        stop;
+      }
+    } 
+    f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+    f_PR_user_home_registration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+    v_gmA.start(f_monitor(m_setFilterReqMonitor1));
+    v_mw.start(f_monitor(m_setFilterReqMonitor2));
+    log("**** TC_IMS_MESS_0001: Preamble done. ****");
+    
+    // test body
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_startTrafficCaptureReq);
+    alt {
+      [] acPort.receive (m_startTrafficCaptureRsp_any) -> value startResult {
+        tc_configureGuard.stop;
+        if (startResult.status.code != e_success)
+        {
+          log("**** TC_IMS_MESS_0001: StartTrafficCaptureReq unsuccessfull! ****");
+          setverdict(fail);
+          stop;
+        }
+      }
+      [] tc_configureGuard.timeout {
+        log("**** TC_IMS_MESS_0001: StartTrafficCaptureReq not answered. ****");
+        setverdict (inconc);
+        stop;
+      }
+    } 
+
+    f_mtc_userSendMessage(v_ueA, "body>1300Bytes"); // TODO add body here
+    //f_mtc_check_TP_IMS_4002_01_gm(v_gmA);
+    //f_mtc_check_TP_IMS_4002_01_mw(v_mw);
+    // *** Simulation part
+    tc_ac.start(15.0);
+    alt {
+      
+      [] tc_ac.timeout {
+        setverdict(inconc);
+      }
+    }
+    // *** Simulation part
+    f_mtc_userCheckMessageReceipt(v_ueB);
+    log("**** TC_IMS_MESS_0001: Test body done. ****");
+    
+    // postamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_stopTrafficCaptureReq);
+    alt {
+      [] acPort.receive (m_startTrafficCaptureRsp_any) -> value stopResult {
+        tc_configureGuard.stop;
+        if (stopResult.status.code != e_success)
+        {
+          log("**** TC_IMS_MESS_0001: StartTrafficCaptureReq unsuccessfull! ****");
+          setverdict(fail);
+        }
+        else
+        {
+          setverdict(pass);
+       }
+      }
+      [] tc_configureGuard.timeout {
+        log("**** TC_IMS_MESS_0001: StartTrafficCaptureReq not answered. ****");
+        setverdict (inconc);
+      }
+    } 
+    v_gmA.stop;
+    v_mw.stop;
+    f_PO_user_home_deregistration(v_ueA);
+    f_PO_user_home_deregistration(v_ueB);
+    log("**** TC_IMS_MESS_0001: Postamble done. ****");
+
+    //unmap/disconnet component ports
+    f_cf_user_down(v_ueA);
+    f_cf_user_down(v_ueB);
+    f_cf_monitor_down(v_gmA);
+    f_cf_monitor_down(v_mw);
+    f_cf_adapter_down();
+  }
+
+  testcase TC_IMS_MESS_0006() runs on ImsTestCoordinator system IotSystemInterface {
+    var StartTrafficCaptureRsp startResult;
+    var StopTrafficCaptureRsp stopResult;
+    // create components
+    var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+    var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+    var ImsInterfaceMonitor v_mw := f_cf_create_monitor(c_mw);
+    timer tc_ac;
+    timer tc_configureGuard;
+    
+    // map/connect component ports
+    f_cf_adapter_up();
+    f_cf_user_up(v_ueA);
+    f_cf_monitor_up(v_gmA);
+    f_cf_monitor_up(v_mw);
+    
+    // preamble
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_generalConfigurationReq_offline);
+    alt {
+      [] acPort.receive (m_generalConfigurationRsp_success) {
+        log("**** TC_IMS_MESS_0006: General configuration succeed. ****");
+        tc_configureGuard.stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_timeout) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive (m_generalConfigurationRsp_error) {
+        setverdict(fail);
+        tc_configureGuard.stop;
+        stop;
+      }
+      [] acPort.receive {
+        log("**** TC_IMS_MESS_0006: General configuration unknown response. ****");
+        tc_configureGuard.stop;
+        setverdict (inconc);
+        stop;
+      }
+      [] tc_configureGuard.timeout {
+        log("**** TC_IMS_MESS_0006: General configuration timeout. ****");
+        setverdict (inconc);
+        stop;
+      }
+    } 
+    f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+    v_gmA.start(f_monitor(m_setFilterReqMonitor1));
+    v_mw.start(f_monitor(m_setFilterReqMonitor2));
+    log("**** TC_IMS_MESS_0006: Preamble done. ****");
+    
+    // test body
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_startTrafficCaptureReq);
+    alt {
+      [] acPort.receive (m_startTrafficCaptureRsp_any) -> value startResult {
+        tc_configureGuard.stop;
+        if (startResult.status.code != e_success)
+        {
+          log("**** TC_IMS_MESS_0006: StartTrafficCaptureReq unsuccessfull! ****");
+          setverdict(fail);
+          stop;
+        }
+      }
+      [] tc_configureGuard.timeout {
+        log("**** TC_IMS_MESS_0006: StartTrafficCaptureReq not answered. ****");
+        setverdict (inconc);
+        stop;
+      }
+    } 
+    f_mtc_userSendMessage(v_ueA, "test"); 
+    //f_mtc_check_TP_IMS_5114_02_gm(v_gmA); 
+    //f_mtc_check_TP_IMS_5114_02_mw(v_mw); 
+    tc_ac.start(15.0);
+    alt {
+      
+      [] tc_ac.timeout {
+        setverdict(inconc);
+      }
+    }
+    // *** Simulation part
+    f_mtc_userCheckMessageNotDelivered(v_ueA);
+    
+    // postabmle
+    tc_configureGuard.start(PX_MAX_MSG_WAIT);
+    acPort.send(m_stopTrafficCaptureReq);
+    alt {
+      [] acPort.receive (m_startTrafficCaptureRsp_any) -> value stopResult {
+        tc_configureGuard.stop;
+        if (stopResult.status.code != e_success)
+        {
+          log("**** TC_IMS_MESS_0006: StartTrafficCaptureReq unsuccessfull! ****");
+          setverdict(fail);
+        }
+        else
+        {
+          setverdict(pass);
+       }
+      }
+      [] tc_configureGuard.timeout {
+        log("**** TC_IMS_MESS_0006: StartTrafficCaptureReq not answered. ****");
+        setverdict (inconc);
+      }
+    } 
+    v_gmA.stop;
+    v_mw.stop;
+    f_PO_user_home_deregistration(v_ueA);
+    
+    //unmap/disconnet component ports
+    f_cf_user_down(v_ueA);
+    f_cf_monitor_down(v_gmA);
+    f_cf_monitor_down(v_mw);
+    f_cf_adapter_down();
+  }
+
+  control {
+    //execute(TC_GeneralConfigurationMessageOffLineMode());
+    //execute(TC_GeneralConfigurationMessageOnLineMode());
+    //execute(TC_GeneralConfigurationMessageMerge());
+    //execute(TC_TriggerUERegisterOffLineMode());
+    //execute(TC_TriggerOneUERegisterOnLineMode());
+    //execute(TC_TriggerTwoUERegisterOnLineMode());
+    //execute(TC_TriggerUEDeRegister());
+    //execute(TC_TriggerUERegister3UsersOnLineMode());
+    //execute(TC_TriggerUERegisterUEDeRegister());
+    //execute(TC_TriggerUERegisterOnLineModeWithoutEUTsSettings());
+    //execute(TC_TriggerUERegisterOnLineModeBadEUTsInfo());
+    //execute(TC_SetFilter());
+    //execute(TC_StartStopCapture());
+    execute(TC_IMS_MESS_0001());
+    //execute(TC_IMS_MESS_0006());
+  }
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/README
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/README	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/README	(revision 22)
@@ -0,0 +1,96 @@
+***************************
+** SIP/SDP TTCN-3 codecs **
+***************************
+
+
+This directory contains the sources of the codec and the validation test
+suites.
+
+
+CoDec
+-----
+
+The CoDec itself is located in the c++ directory. The following files are
+required to build it:
+	c++/codec.h
+	c++/init.cpp
+	c++/Regex.h
+	c++/sdp_codets.cpp
+	c++/sdp_codets.h
+	c++/sip_codets.cpp
+	c++/sip_codets.h
+	c++/libcommon_codets.h
+	c++/isup_codets.cpp
+	c++/isup_codets.h
+
+c++/EchoPort.cpp and c++/EchoPort.h contain an implementation of the EchoPort
+(System Adapter) which is needed only to execute the loopback tests in the
+validation test suite.
+
+
+This CoDec is based on the T3DevKit toolkit. It can be build in two ways as it
+is documented in the user manual (Sections "Usage" & "Low level usage")
+	http://t3devkit.gforge.inria.fr/doc/userref/userrefch2.html#x3-220002.3
+	http://t3devkit.gforge.inria.fr/doc/userref/userrefch2.html#x3-230002.4
+	http://t3devkit.gforge.inria.fr/doc/userref/userrefap1.html#x9-75000A
+
+The easiest way is to use the generic makefile from T3DevKit and configure the
+T3DK_XXXXXX variables accordingly. This is the method used in the tests
+containing in this directory (simple tests, torture tests & loopback tests).
+	c++/Makefile
+	validation/TortureTests/Makefile
+	validation/LoopbackTests/Makefile
+
+In order to build another test suite, it is possible to copy one of these
+makefiles and modify the variables T3DK_TTCN_SOURCES, T3DK_CXX_SOURCES and
+T3DK_C_SOURCES to include the wanted files (TTCN-3 source files and/or
+additional C/C++ to implement the adapters for example).
+
+If the implementation of a runtime module (for example the System Adapter) is
+not based on the base implementation provided by T3DevKit, then it will be
+necessary to disable it in the makefile so that the TRI-SA functions are not
+defined twice. This can be done by assigning the value none to the T3DK_SA
+variable:
+	T3DK_SA = none
+
+
+In the case the generic makefile is not suitable to build the executable test
+suite. It is still possible to do the work manually or with an other build
+system. The complete procedure to run the codec generator, compile the test
+suite and link the right modules accordingly is described in the user manual
+from T3DevKit (Section "Low level usage").
+	http://t3devkit.gforge.inria.fr/doc/userref/userrefch2.html#x3-230002.4
+
+
+
+Validation
+----------
+
+This directory contains three validation suites. To build and launch them, it
+is necessary to use the following makefiles:
+
+	c++/Makefile		-> simple tests located in validation/
+	validation/TortureTests/Makefile
+				-> torture test suite for validating the
+				decoder (RFC 5118)
+	validation/LoopbackTests/Makefile
+				-> loopback test suite for validating the
+				encoder and the decoder
+
+The procedure to run the tests is the following:
+1. chdir to the directory containing the makefile
+	cd validation/TortureTests
+2. build the test suite
+	make
+3. execute the test suite
+	make exec
+
+It is possible to increase the verbosity of the codec by setting some
+environment variables. This may be useful for debugging the test suite.
+
+eg:	make exec DEBUG_CODEC=1
+
+The full list of debugging switches is given in T3DevKit's user manual:
+	http://t3devkit.gforge.inria.fr/doc/userref/userrefch5.html#x7-680005.2
+
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/EchoPort.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/EchoPort.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/EchoPort.cpp	(revision 22)
@@ -0,0 +1,65 @@
+/****************************************************************************/
+/* $Id$             */
+/*                                                                          */
+/*   (c) 2009  Universite de Rennes 1                                       */
+/*                                                                          */
+/* Contributors:                                                            */
+/*  - Anthony BAIRE                                                         */
+/*                                                                          */
+/* Contact address: <t3devkit@irisa.fr>                                     */
+/*                                                                          */
+/*                                                                          */
+/* This file is part of application examples provided along with T3DevKit,  */
+/* a free toolkit for building TTCN-3 tests.                                */
+/*                                                                          */
+/* This software is governed by the CeCILL-B license under French law and   */
+/* abiding by the rules of distribution of free software.  You can  use,    */
+/* modify and/or redistribute the software under the terms of the CeCILL-B  */
+/* license as circulated by CEA, CNRS and INRIA at the following URL        */
+/* "http://www.cecill.info".                                                */
+/*                                                                          */
+/* As a counterpart to the access to the source code and  rights to copy,   */
+/* modify and redistribute granted by the license, users are provided only  */
+/* with a limited warranty  and the software's author,  the holder of the   */
+/* economic rights,  and the successive licensors  have only  limited       */
+/* liability.                                                               */
+/*                                                                          */
+/* In this respect, the user's attention is drawn to the risks associated   */
+/* with loading,  using,  modifying and/or developing or reproducing the    */
+/* software by the user in light of its specific status of free software,   */
+/* that may mean  that it is complicated to manipulate,  and  that  also    */
+/* therefore means  that it is reserved for developers  and  experienced    */
+/* professionals having in-depth computer knowledge. Users are therefore    */
+/* encouraged to load and test the software's suitability as regards their  */
+/* requirements in conditions enabling the security of their systems and/or */ 
+/* data to be ensured and,  more generally, to use and operate it in the    */
+/* same conditions as regards security.                                     */
+/*                                                                          */
+/* The fact that you are presently reading this means that you have had     */
+/* knowledge of the CeCILL-B license and that you accept its terms.         */
+/****************************************************************************/
+#include "EchoPort.h"
+using namespace t3devlib;
+
+EchoPort::EchoPort (PortId& id) :
+	Port (id)
+{ 
+}
+
+EchoPort::~EchoPort() 
+{
+}
+
+bool EchoPort::Map (const PortId& connected_port_id) 
+{ 
+  return true; 
+} 
+ 
+bool EchoPort::Unmap (const PortId& connected_port_id) 
+{ 
+  return true; 
+}
+
+bool EchoPort::Send (const ComponentId& from,const Bitstring& msg) {
+  return EnqueueMsg (from, msg); 
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/EchoPort.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/EchoPort.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/EchoPort.h	(revision 22)
@@ -0,0 +1,72 @@
+/****************************************************************************/
+/* $Id$             */
+/*                                                                          */
+/*   (c) 2009  Universite de Rennes 1                                       */
+/*                                                                          */
+/* Contributors:                                                            */
+/*  - Anthony BAIRE                                                         */
+/*                                                                          */
+/* Contact address: <t3devkit@irisa.fr>                                     */
+/*                                                                          */
+/*                                                                          */
+/* This file is part of application examples provided along with T3DevKit,  */
+/* a free toolkit for building TTCN-3 tests.                                */
+/*                                                                          */
+/* This software is governed by the CeCILL-B license under French law and   */
+/* abiding by the rules of distribution of free software.  You can  use,    */
+/* modify and/or redistribute the software under the terms of the CeCILL-B  */
+/* license as circulated by CEA, CNRS and INRIA at the following URL        */
+/* "http://www.cecill.info".                                                */
+/*                                                                          */
+/* As a counterpart to the access to the source code and  rights to copy,   */
+/* modify and redistribute granted by the license, users are provided only  */
+/* with a limited warranty  and the software's author,  the holder of the   */
+/* economic rights,  and the successive licensors  have only  limited       */
+/* liability.                                                               */
+/*                                                                          */
+/* In this respect, the user's attention is drawn to the risks associated   */
+/* with loading,  using,  modifying and/or developing or reproducing the    */
+/* software by the user in light of its specific status of free software,   */
+/* that may mean  that it is complicated to manipulate,  and  that  also    */
+/* therefore means  that it is reserved for developers  and  experienced    */
+/* professionals having in-depth computer knowledge. Users are therefore    */
+/* encouraged to load and test the software's suitability as regards their  */
+/* requirements in conditions enabling the security of their systems and/or */ 
+/* data to be ensured and,  more generally, to use and operate it in the    */
+/* same conditions as regards security.                                     */
+/*                                                                          */
+/* The fact that you are presently reading this means that you have had     */
+/* knowledge of the CeCILL-B license and that you accept its terms.         */
+/****************************************************************************/
+#ifndef EchoPort_h
+#define EchoPort_h
+
+#include <t3devlib/t3devlib.h>
+
+/** Implementation of an echo port
+ *
+ * This class implements a TTCN-3 system port whose role is just to repeat all
+ * the traffic sent to it. Thus triSend() triggers immediately a
+ * triEnqueueMsg() call to the originating component, repeating the same
+ * message.
+ *
+ * Echo port is useful for testing a codec. For example to test the decoder
+ * one can send a raw message (octetstring, charstring...) and receive the
+ * same message but decoded using another type (eg. SipMessage).
+ *
+ */
+class EchoPort : public t3devlib::Port
+{
+public:
+	EchoPort (t3devlib::PortId& id);
+	~EchoPort();
+		
+protected:
+	bool Map (const t3devlib::PortId& port_id);
+	bool Unmap (const t3devlib::PortId& port_id);
+	bool Send (const t3devlib::ComponentId& from, const t3devlib::Bitstring& msg);
+		
+};
+
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/Makefile
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/Makefile	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/Makefile	(revision 22)
@@ -0,0 +1,28 @@
+
+#T3DK_TTCN_SOURCES	= ../../ttcn/LibSip_SIPTypesAndValues.ttcn ../../ttcn/LibSip_SDPTypes.ttcn
+T3DK_TTCN_SOURCES	= $(wildcard ../validation/*.ttcn)
+
+T3DK_ROOT_MODULE	= TestExecution
+
+T3DK_C_SOURCES		= $(wildcard *.c)
+
+T3DK_CXX_SOURCES	= $(wildcard *.cpp)
+
+T3DK_CDGEN_HEADER	= codec.h
+
+T3DK_CODETS		= $(wildcard *_codets.h *_codets.cpp)
+
+T3DK_LIBS		= -lboost_regex$(if $(shell uname -o | grep Cygwin),-gcc-mt,-mt)
+
+CPPFLAGS		= -I.
+
+CC			= gcc
+
+CXX			= g++
+
+CFLAGS			= -g 
+
+CXXFLAGS		= -g
+
+include $(shell t3devkit-config --mk)
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/Regex.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/Regex.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/Regex.h	(revision 22)
@@ -0,0 +1,165 @@
+#include <boost/regex.hpp>
+#include <t3devlib/t3devlib.h>
+
+namespace t3devlib { namespace gen {
+
+/** Implementation of perl-like regular expressions to be used in a decoder
+ * generated by T3DevKit.
+ *
+ * This class handles the regex compilation and execution. The result of
+ * group matching is stored internally.
+ *
+ * It is designed to be used seamlessly in codets for T3DevKit, thus:
+ *  - it can interact with t3devlib data (Buffer, Variable, DecodeError)
+ *  - it reports errors using T3DevKit's exceptions
+ *  - it returns the length of the matches in bits
+ *
+ *
+ * The regular expression is compiled at the construction of the object. Then
+ * it can be used multiple times to search the regex in the buffer (with
+ * Match() or AssertMatch()).
+ *
+ * After a regex search, it is possible to inspect the result at to take
+ * actions with other member functions (GetMatchedLength(), MoveAt(), ...)
+ *
+ * \warning	Apart from moving the cursor, the buffer MUST NOT be modified
+ *		between the call of Match() or AssertMatch() and the use of
+ *		inspection/action member functions (GetMatchedLength(),
+ *		MoveAt() ...)
+ */
+class Regex {
+public:
+	typedef std::string::const_iterator	iterator;
+
+	/** Constructor
+	 *
+	 * This constructor compiles the regular expression given as a
+	 * parameter. It is based on the format of perl regular expressions.
+	 *
+	 * \warning	it is assumed that regex is a static const string
+	 */
+	Regex(const char* regex)
+	 : mSource (regex), mRegex (regex, boost::regex_constants::perl | boost::regex_constants::no_mod_m)
+	{}
+
+	/** Try to match the regular expression in the buffer.
+	 *
+	 * The regular expression is searched in the buffer between the
+	 * position of its cursor and the first end marker set (thus between
+	 * the positions given by Buffer::GetPosition() and
+	 * Buffer::GetEndMarker()) 
+	 *
+	 * \param buffer	buffer on which the regex shall be searched
+	 *
+	 * \return	true in case of success
+	 */
+	bool Match (Buffer& buffer) {
+		mStart = iterator (reinterpret_cast<const char*> (buffer.GetValueBin()) + (buffer.GetPosition() / 8));
+		mStop = iterator (reinterpret_cast<const char*> (buffer.GetValueBin()) + (buffer.GetEndMarker() / 8));
+
+		int result = boost::regex_search (mStart, mStop, mResults, mRegex);
+
+		return result;
+	}
+
+	/** Match the regular expression in the buffer or throw an exeption
+	 * if not successful.
+	 *
+	 * \param buffer	buffer on which the regex shall be searched
+	 * \param v		reference of the value being decoded; it is
+	 *			used to allow locating the error in case an
+	 *			exception is thrown
+	 */
+	void AssertMatch (Buffer& buffer, Variable* v) throw (DecodeError) {
+		if (!Match (buffer)) {
+			Error (v, buffer);
+		}
+	}
+
+	/** Get the length of a group match
+	 *
+	 * \param	id	index of the '(...)' group to analyse (or 0
+	 *			to refer to the whole regular expression)
+	 *
+	 * \return		the length of the group in bits
+	 */
+	int GetMatchedLength(int id = 0) {
+		return mResults[id].length()*8;
+	}
+
+	/** Get the content of a group match
+	 *
+	 * \param	id	index of the '(...)' group to analyse (or 0
+	 *			to refer to the whole regular expression)
+	 *
+	 * \return		the string matched by the group
+	 */
+	std::string GetMatchedString(int id = 0) {
+		return std::string (mResults[id].first, mResults[id].second);
+	}
+
+	/** Move the cursor of the buffer past a group match
+	 *
+	 * \param	id	index of the '(...)' group to analyse (or 0
+	 *			to refer to the whole regular expression)
+	 */
+	void MovePast (Buffer& buffer, int id = 0)
+	{
+		buffer.SetPosition ((&*mResults[id].second - reinterpret_cast<const char*> (buffer.GetValueBin())) * 8);
+	}
+	
+	/** Move the cursor of the buffer at the beginning of group match
+	 *
+	 * \param	id	index of the '(...)' group to analyse (or 0
+	 *			to refer to the whole regular expression)
+	 */
+	void MoveAt (Buffer& buffer, int id = 0)
+	{
+		buffer.SetPosition ((&*mResults[id].first - reinterpret_cast<const char*> (buffer.GetValueBin())) * 8);
+	}
+
+	/** Throw a decoding error
+	 *
+	 * This function will throw an exception telling that the codec
+	 * could not match the regular expression. The error message will
+	 * also contains details about the regular expression and the
+	 * content of the buffer at the position where the exception could
+	 * not be matched.
+	 *
+	 * \param	v	reference to the value being decoded
+	 * 			(used to locate the position of the error)
+	 * \param	buffer	buffer on which the regex could no be matched
+	 */
+	void Error (Variable* v, Buffer& buffer) throw (DecodeError) {
+
+		std::string message ("cannot match regex /");
+		message += mSource;
+		message += "/ in '";
+		if ((mStop - mStart) > 40) {
+			message.append (&*mStart, 40);
+			message += "...";
+		} else {
+			message.append (mStart, mStop);
+		}
+		message += "'\n";
+		throw DecodeError (v, message);
+	}
+
+private:
+	/** source of the regular expression (should be a static string) */
+	const char*	mSource;
+
+	/** boost regex object used to implement the regular expression */
+	boost::regex	mRegex;
+
+	/** iterators delimiting the positions in the buffer where the regex
+	 * is applied (between GetPosition() and GetEndMarker)
+	 */
+	iterator	mStart, mStop;
+
+	/** boost match result used to store the results of the regex search */
+	boost::match_results<iterator>	mResults;
+};
+
+
+}} //namespaces
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/codec.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/codec.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/codec.h	(revision 22)
@@ -0,0 +1,34 @@
+// This is the codec header, it is given as an input file for the codec
+// generator (with the '-i' option).
+//
+// Its role is to define all the types that are not handled by the generator
+// (namely the enumerations and all subtypes: integer, bitstring,
+// octetstring,...). As well as customising the classes automatically generated
+// (by using a macro to add some definitions in the class).
+//
+// This file is included by the source files generated by t3cdgen
+// (gen_classes.h, gen_classes.cpp).
+//
+
+#ifndef  CODEC_H
+#define  CODEC_H
+#include <t3devlib/t3devlib.h>
+
+#include "libcommon_codets.h"
+#include "sip_codets.h"
+#include "sdp_codets.h"
+#include "isup_codets.h"
+
+namespace t3devlib {
+namespace gen {
+
+// xml body is not supported in the codec
+typedef t3devlib::Undef XmlBody;
+// xml message is not supported in the codec
+typedef t3devlib::Undef XMLMessage;
+
+
+}}
+
+#endif
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/init.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/init.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/init.cpp	(revision 22)
@@ -0,0 +1,73 @@
+/****************************************************************************/
+/* $Id$             */
+/*                                                                          */
+/*   (c) 2009  Universite de Rennes 1                                       */
+/*                                                                          */
+/* Contributors:                                                            */
+/*  - Anthony BAIRE                                                         */
+/*                                                                          */
+/* Contact address: <t3devkit@irisa.fr>                                     */
+/*                                                                          */
+/*                                                                          */
+/* This file is part of application examples provided along with T3DevKit,  */
+/* a free toolkit for building TTCN-3 tests.                                */
+/*                                                                          */
+/* This software is governed by the CeCILL-B license under French law and   */
+/* abiding by the rules of distribution of free software.  You can  use,    */
+/* modify and/or redistribute the software under the terms of the CeCILL-B  */
+/* license as circulated by CEA, CNRS and INRIA at the following URL        */
+/* "http://www.cecill.info".                                                */
+/*                                                                          */
+/* As a counterpart to the access to the source code and  rights to copy,   */
+/* modify and redistribute granted by the license, users are provided only  */
+/* with a limited warranty  and the software's author,  the holder of the   */
+/* economic rights,  and the successive licensors  have only  limited       */
+/* liability.                                                               */
+/*                                                                          */
+/* In this respect, the user's attention is drawn to the risks associated   */
+/* with loading,  using,  modifying and/or developing or reproducing the    */
+/* software by the user in light of its specific status of free software,   */
+/* that may mean  that it is complicated to manipulate,  and  that  also    */
+/* therefore means  that it is reserved for developers  and  experienced    */
+/* professionals having in-depth computer knowledge. Users are therefore    */
+/* encouraged to load and test the software's suitability as regards their  */
+/* requirements in conditions enabling the security of their systems and/or */ 
+/* data to be ensured and,  more generally, to use and operate it in the    */
+/* same conditions as regards security.                                     */
+/*                                                                          */
+/* The fact that you are presently reading this means that you have had     */
+/* knowledge of the CeCILL-B license and that you accept its terms.         */
+/****************************************************************************/
+#include <t3devlib/t3devlib.h>
+#include "EchoPort.h"
+
+namespace t3devlib {
+	
+	void PAInit()
+	{
+	}
+
+	void SAInit()
+	{
+		// Register the TTCN-3 system port types TestSystem.SipPort
+		// and TestSystem.SipTestPort
+		//
+		// They will both use the port implementation provided in the
+		// EchoPort class.
+		//
+		Port::RegisterType ("TestSystem", "SipPort", &createPort<EchoPort>);
+		Port::RegisterType ("TestSystem", "SipTestPort", &createPort<EchoPort>);
+	}
+
+	void CDInit()
+	{
+	}
+
+	void PAReset()
+	{
+	}
+
+	void SAReset()
+	{
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/isup_codets.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/isup_codets.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/isup_codets.cpp	(revision 22)
@@ -0,0 +1,275 @@
+#include <arpa/inet.h>
+#include "gen_classes.h"
+
+namespace t3devlib { namespace gen {
+
+// ISUP codec
+
+// ISUP is going to be difficult to encode and decode for the following reasons:
+// • the bit order for the transmission is reversed: the LSB is sent first.
+//   This will cause some difficulties since the order of the fields in the
+//   TTCN-3 types follows the order of transmission, not the order in memory
+//   (note that there are lots of fields that are less than 8-bit long).
+//   Consequently the codec generator cannot be used directly to
+//   encode/decode the message (since it processes the order of the buffer in
+//   the memory order -> MSB first)
+// • numeric fields that span across multiple bytes are not always encoded in
+//   the same order
+//   ∘ eg. the 'Network Number Indicator' and the 'Network Identity' are both
+//     encoded in DCB but the digits are not ordered in the same way:
+//     ‣ the NNI 1234 is encoded as "\x21\x43"
+//     ‣ the NI  1234 is encoded as "\x12\x34"
+//   ∘ for some fields the byte order is not given: eg.
+// • Call Identity in the Call Reference parameter
+// • Diagnostics in the Cause Indicator parameter
+// • Local Reference in the Connection request parameter
+//     ‣ -> in which order is it assumed to be in the test suite ?
+//     ‣ when the order is given, then the Most Signifiant Byte comes first
+//       -> then we should assume that this is the default order
+// 
+// Design strategy
+// 
+// Knowing that ISUP messages are a concatenation of a lot of small fields
+// (less than 8 bit), the coding/decoding task will be complex since it will
+// be necessary to align correctly each field. Then care about the order of
+// the bits.
+// 
+// Some consideration should be taken to ease the work
+// • The two issues above should be handled separately: one part of the codec
+//   will deal with the concatenation/alignment of fields and the other one
+//   will deal with the order of the bits in the fields.
+// • For all the alignement/concatenation requirements, we should rely on the
+//   capabilities of the codec generator. It has already been validated for
+//   such a task. In order to handle the fields in the same order as in the
+//   transmission, it will be necessary to reverse the order of the bits in
+//   the whole buffer before decoding and after encoding. After decoding and
+//   before encoding, it will also be necessary to reverse the bits an all
+//   the fields and sub-fields in the TTCN-3 structure. However since this
+//   order differs from one field to another, it better to merge this part
+//   with the next task below.
+// • The second part of the codec is to order the bits in the field correctly
+//   according to the properties of the field being encoded/decoded. There
+//   are some general rules, but lots of fields will have to be handled on a
+//   case per case basis.
+
+
+
+// reverse the order of the bits in the buffer between the current position
+// and the current end marker
+void buffer_reverse_remaining_bytes (Variable* var, Buffer& buffer) throw (DecodeError)
+{
+	if ((buffer.GetPosition() % 8) | (buffer.GetBitsLeft() % 8))
+		throw DecodeError (var, "Unaligned data");
+	
+	//TODO: optimise
+	for (int i = buffer.GetPosition() ; i < buffer.GetEndMarker() ; i+=8)
+	{
+		unsigned char c = buffer.GetValueBin()[i/8];
+		unsigned char r = 0;
+
+		for (int j=8 ; j ; j--) {
+			r = (r << 1) | (c & 1);
+			c = c >> 1;
+		}
+		buffer.Replace (i, &r, 8);
+	}
+}
+
+// reverse the order of the bits in every bitstring in the message
+//TODO: reverse the octetstrings too
+void reverse_all_bitstrings (Variable& var)
+{
+	switch (var.GetBaseType()) {
+	case Variable::btRecord:
+	case Variable::btSet: {
+		RecordSet& rs = static_cast<RecordSet&> (var);
+		for (int i=rs.GetSize()-1 ; i>=0 ; i--) {
+			if (rs.IsPresent (i))
+				reverse_all_bitstrings (*rs.GetField(i));
+		}
+		break;
+	}
+	case Variable::btRecordOf:
+	case Variable::btSetOf: {
+		RecordOfSetOf& rs = static_cast<RecordOfSetOf&> (var);
+		for (int i=rs.GetSize()-1 ; i>=0 ; i--) {
+			reverse_all_bitstrings (*rs.GetField(i));
+		}
+		break;
+	}
+	case Variable::btUnion:
+		reverse_all_bitstrings (*static_cast<Union&> (var).GetField());
+		break;
+	
+	case Variable::btBitstring:
+		goto reverse_bitstring;
+	
+	default:
+		;
+	}
+	return;
+
+reverse_bitstring:
+	Bitstring& bs = static_cast<Bitstring&>(var);
+
+	unsigned char buff[16]; // should be big enough
+	assert (bs.GetLength() < 16*8);
+	
+	const unsigned char*	src = bs.GetValueBin();
+	unsigned char*		dst = buff + (bs.GetLength() / 8);
+	int			k   = bs.GetLength() % 8;
+
+	// process pack of 8 bits
+	int i;
+	for (i=bs.GetLength() ; i>8 ; i-=8, src++)
+	{
+		unsigned char c = *src;
+
+		for (int j=8 ; j ; j--) {
+			if (k == 0) {
+				dst--;
+				k = 8;
+			}
+
+			*dst = (*dst >> 1) | (c & 0x80);
+			c = c << 1;
+		}
+	}
+
+	// process the remaining bits
+	{
+		unsigned char c = *src;
+
+		for ( ; i>0 ; i--) {
+			if (k == 0) {
+				dst--;
+				k = 8;
+			}
+
+			*dst = (*dst >> 1) | (c & 0x80);
+			c = c << 1;
+		}
+	}
+
+	bs.SetValueBin (buff, bs.GetLength());
+}
+
+// read a bistring and return its value with all the bits reversed
+int get_reverse_value (const Bitstring& bs)
+{
+	unsigned char buff[sizeof(uint32_t)]; // should be big enough (assume we have 32 bits for int)
+	assert (bs.GetLength() < sizeof(uint32_t)*8);
+	memset (buff, 0, sizeof(uint32_t));
+	
+	const unsigned char*	src = bs.GetValueBin();
+	unsigned char*		dst = buff + (bs.GetLength() / 8);
+	int			k   = bs.GetLength() % 8;
+
+	// process pack of 8 bits
+	int i;
+	for (i=bs.GetLength() ; i>8 ; i-=8, src++)
+	{
+		unsigned char c = *src;
+
+		for (int j=8 ; j ; j--) {
+			if (k == 0) {
+				dst--;
+				k = 8;
+			}
+
+			*dst = (*dst >> 1) | (c & 0x80);
+			c = c << 1;
+		}
+	}
+
+	// process the remaining bits
+	{
+		unsigned char c = *src;
+
+		for ( ; i>0 ; i--) {
+			if (k == 0) {
+				dst--;
+				k = 8;
+			}
+
+			*dst = (*dst >> 1) | (c & 0x80);
+			c = c << 1;
+		}
+	}
+
+ 	uint32_t result = ntohl (*reinterpret_cast<uint32_t*> (buff));
+	return result >> ((sizeof(int)*8) - bs.GetLength());
+}
+
+// map used to resolve the message type in ISUP_BICC_MSG
+class IsupMsgTypeMap
+{
+public:
+	static int GetBiccField (int msg_type)
+	{
+		std::map<int, int>::iterator it = msInstance.mMap.find (msg_type);
+
+		return (it != msInstance.mMap.end()) ? it->second : msInstance.mUnknown;
+	}
+
+private:
+	IsupMsgTypeMap()
+	{
+		mMap[1] = ISUP_BICC_MSG::id_iAM_MSG;
+
+		mUnknown = ISUP_BICC_MSG::id_uNKNOWN_MSG;
+	}
+
+	static IsupMsgTypeMap		msInstance;
+
+	std::map<int, int>	mMap;
+	int			mUnknown;
+};
+IsupMsgTypeMap		IsupMsgTypeMap::msInstance;
+
+void ISUP_BICC_MSG::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	int position = buffer.GetPosition();
+
+	// read ahead one byte to get the message type
+	Unsigned msg_type(8);
+	msg_type.Decode (buffer);
+	SetHypChosenId (IsupMsgTypeMap::GetBiccField (msg_type.GetValue()));
+
+	buffer.SetPosition(position);
+}
+
+void IAM_MSG::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	buffer_reverse_remaining_bytes (this, buffer);
+}
+
+void IAM_MSG::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+	reverse_all_bitstrings (*this);
+	buffer_reverse_remaining_bytes (this, buffer);
+}
+
+void IAM_MSG::PostDecode (Buffer& buffer, DecodeError& e) throw (DecodeError)
+{
+	reverse_all_bitstrings (*this);
+
+	// dump the error here
+	// because there is an issue w/ propagating the exceptions in t3devkit
+	e.Dump (std::cerr);
+	throw DecodeIgnoreMessage (this);
+}
+
+void CDN_PAR_lv::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	int position = buffer.GetPosition();
+	Bit8 len;
+	len.Decode(buffer);
+	SetHypLength (get_reverse_value (len) * 8); 
+
+	buffer.SetPosition (position);
+}
+
+
+}} // namespace t3devlib::gen
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/isup_codets.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/isup_codets.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/isup_codets.h	(revision 22)
@@ -0,0 +1,50 @@
+#ifndef ISUP_CODETS_H
+#define ISUP_CODETS_H
+
+#include <t3devlib/t3devlib.h>
+#include <t3devlib/generator.h>
+
+namespace t3devlib { namespace gen {
+
+//
+// Implementation of subtypes defined in the module SipIsup_ISUP_ParamTypes
+//
+
+// types to be coded as a fixed-lengh string
+T3DEVLIB_FIXED_STRING_DEFINITION(SipIsup_ISUP_ParamTypes, CallInstanceCode, Octetstring, 32);
+T3DEVLIB_FIXED_STRING_DEFINITION(SipIsup_ISUP_ParamTypes, FAI_PAR_v, Bitstring, 8);
+T3DEVLIB_FIXED_STRING_DEFINITION(SipIsup_ISUP_ParamTypes, CGC_PAR_v, Bitstring, 8);
+T3DEVLIB_FIXED_STRING_DEFINITION(SipIsup_ISUP_ParamTypes, TMR_PAR_v, Bitstring, 8);
+
+// aliases (subtypes without restrictions)
+T3DEVLIB_BASIC_DEFINITION(SipIsup_ISUP_ParamTypes, APMUserInformation_g1, Octetstring);
+
+// types to be coded as variable-length string withing a range
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (SipIsup_ISUP_ParamTypes, Oct1to2, Octetstring, 8, 16);
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (SipIsup_ISUP_ParamTypes, Oct0to4, Octetstring, 0, 32);
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (SipIsup_ISUP_ParamTypes, Oct0to8, Octetstring, 0, 64);
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (SipIsup_ISUP_ParamTypes, Oct0to9, Octetstring, 0, 72);
+
+// EOP is a 8-bit bitstring that must contain '00000000'B.
+//
+// We implement directly this class to ensure that the value is correct
+// when decoding such a value.
+class EOP : public Bit8
+{
+public:
+	const char* GetModuleName() const { return "SipIsup_ISUP_ParamTypes"; }
+	const char* GetTypeName() const   { return "EOP"; }
+
+	void Decode (Buffer& buffer) throw (DecodeError) {
+		Bit8::Decode (buffer);
+		if ((GetLength() != 8) || (*GetValueBin() != '\0')) {
+			throw DecodeError (this, "Malformed EOP (must have null value)");
+		}
+	}
+};
+
+
+}} // namespaces
+
+#endif
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/libcommon_codets.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/libcommon_codets.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/libcommon_codets.h	(revision 22)
@@ -0,0 +1,194 @@
+#ifndef LIBCOMMON_CODETS_H
+#define LIBCOMMON_CODETS_H
+
+#include <t3devlib/t3devlib.h>
+#include <t3devlib/generator.h>
+
+namespace t3devlib { namespace gen {
+
+//
+// Implementation of subtypes defined in the module LibCommon_DataStrings
+//
+
+// types to be coded as a fixed-lengh string
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit1, Bitstring, 1)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit2, Bitstring, 2)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit3, Bitstring, 3)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit4, Bitstring, 4)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit5, Bitstring, 5)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit6, Bitstring, 6)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit7, Bitstring, 7)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit8, Bitstring, 8)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit9, Bitstring, 9)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit10, Bitstring, 10)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit11, Bitstring, 11)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit12, Bitstring, 12)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit13, Bitstring, 13)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit14, Bitstring, 14)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit15, Bitstring, 15)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit16, Bitstring, 16)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit17, Bitstring, 17)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit18, Bitstring, 18)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit19, Bitstring, 19)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit20, Bitstring, 20)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit21, Bitstring, 21)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit22, Bitstring, 22)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit23, Bitstring, 23)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit24, Bitstring, 24)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit25, Bitstring, 25)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit26, Bitstring, 26)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit27, Bitstring, 27)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit28, Bitstring, 28)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit29, Bitstring, 29)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit30, Bitstring, 30)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit31, Bitstring, 31)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit32, Bitstring, 32)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit48, Bitstring, 48)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit64, Bitstring, 64)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Bit128, Bitstring, 128)
+
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct1, Octetstring, 8)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct2, Octetstring, 16)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct3, Octetstring, 24)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct4, Octetstring, 32)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct5, Octetstring, 40)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct6, Octetstring, 48)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct7, Octetstring, 56)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct8, Octetstring, 64)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct9, Octetstring, 72)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct10, Octetstring, 80)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct11, Octetstring, 88)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct12, Octetstring, 96)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct13, Octetstring, 104)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct14, Octetstring, 112)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct15, Octetstring, 120)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct16, Octetstring, 128)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct80, Octetstring, 640)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct128, Octetstring, 1024)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct160, Octetstring, 1280)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct320, Octetstring, 2560)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct640, Octetstring, 5120)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct1280, Octetstring, 10240)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_DataStrings, Oct1380, Octetstring, 11040)
+
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (LibCommon_DataStrings, Oct1to15, Octetstring, (1*8), (15*8));
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (LibCommon_DataStrings, Oct6to15, Octetstring, (6*8), (15*8));
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (LibCommon_DataStrings, Oct1to128, Octetstring, (1*8), (128*8));
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (LibCommon_DataStrings, Oct1to254, Octetstring, (1*8), (254*8));
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (LibCommon_DataStrings, Oct1to255, Octetstring, (1*8), (255*8));
+
+
+//
+// Implementation of subtypes defined in the module LibCommon_TextStrings
+//
+
+// types to be coded as a fixed-lengh string
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String1, Charstring, 8)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String2, Charstring, 16)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String3, Charstring, 24)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String4, Charstring, 32)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String5, Charstring, 40)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String6, Charstring, 48)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String7, Charstring, 56)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String8, Charstring, 64)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String9, Charstring, 72)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String10, Charstring, 80)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String11, Charstring, 88)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String12, Charstring, 96)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String13, Charstring, 104)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String14, Charstring, 112)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String15, Charstring, 120)
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, String16, Charstring, 128)
+
+// types to be coded as variable-length string withing a range
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (LibCommon_TextStrings, String1To63, Charstring, (1*8), (63*8));
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (LibCommon_TextStrings, String1To64, Charstring, (1*8), (64*8));
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (LibCommon_TextStrings, String1To127, Charstring, (1*8), (127*8));
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (LibCommon_TextStrings, String1To128, Charstring, (1*8), (128*8));
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (LibCommon_TextStrings, String1To255, Charstring, (1*8), (255*8));
+
+// TODO: content restrictions
+typedef t3devlib::Charstring AlphaNum;
+T3DEVLIB_FIXED_STRING_DEFINITION(LibCommon_TextStrings, AlphaNum2, Charstring, 16)
+T3DEVLIB_VARIABLE_SIZE_STRING_DEFINITION (LibCommon_TextStrings, AlphaNum1To32, Charstring, (1*8), (32*8));
+
+
+//
+// Implementation of subtypes defined in the module LibCommon_BasicTypesAndValues
+//
+
+// types to be coded as fixed-width integer in the big-endian format
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt, Unsigned, 64) // limit
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt1, Unsigned, 1)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt2, Unsigned, 2)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt3, Unsigned, 3)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt4, Unsigned, 4)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt5, Unsigned, 5)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt6, Unsigned, 6)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt7, Unsigned, 7)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt8, Unsigned, 8)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt9, Unsigned, 9)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt10, Unsigned, 10)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt11, Unsigned, 11)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt12, Unsigned, 12)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt13, Unsigned, 13)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt14, Unsigned, 14)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt15, Unsigned, 15)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt16, Unsigned, 16)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt17, Unsigned, 17)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt18, Unsigned, 18)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt19, Unsigned, 19)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt20, Unsigned, 20)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt21, Unsigned, 21)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt22, Unsigned, 22)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt23, Unsigned, 23)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt24, Unsigned, 24)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt25, Unsigned, 25)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt26, Unsigned, 26)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt27, Unsigned, 27)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt28, Unsigned, 28)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt29, Unsigned, 29)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt30, Unsigned, 30)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt31, Unsigned, 31)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt32, Unsigned, 32)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, UInt48, Unsigned, 48)
+
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int, Signed, 64) // limit
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int1, Signed, 1)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int2, Signed, 2)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int3, Signed, 3)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int4, Signed, 4)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int5, Signed, 5)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int6, Signed, 6)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int7, Signed, 7)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int8, Signed, 8)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int9, Signed, 9)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int10, Signed, 10)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int11, Signed, 11)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int12, Signed, 12)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int13, Signed, 13)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int14, Signed, 14)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int15, Signed, 15)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int16, Signed, 16)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int17, Signed, 17)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int18, Signed, 18)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int19, Signed, 19)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int20, Signed, 20)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int21, Signed, 21)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int22, Signed, 22)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int23, Signed, 23)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int24, Signed, 24)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int25, Signed, 25)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int26, Signed, 26)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int27, Signed, 27)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int28, Signed, 28)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int29, Signed, 29)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int30, Signed, 30)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int31, Signed, 31)
+T3DEVLIB_INTEGER_DEFINITION(LibCommon_BasicTypesAndValues, Int32, Signed, 32)
+
+
+}} // namespaces
+
+#endif
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/sdp_codets.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/sdp_codets.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/sdp_codets.cpp	(revision 22)
@@ -0,0 +1,1445 @@
+#include <cstdlib>
+
+
+#ifdef WIN32
+#include <winsock2.h>
+#else
+#include <arpa/inet.h> // used for validting ipv6 addresses (should be replaced w/ boost/asio.hpp for better portability)
+#endif
+
+
+// workaround to compile with cygwin
+// (AF_INET6 is not included by arpa/inet.h and we could not find the
+//  correct header to include without having conflicting definitions)
+#ifdef __CYGWIN__
+#define AF_INET6  23
+#endif
+
+#include "gen_classes.h"
+#include "Regex.h"
+
+namespace t3devlib { namespace gen {
+
+
+// Definition of character classes used to be used in the regular expressions
+// (within [])
+#define SDPCHARS_VCHAR "\\x21-\\x7e"
+#define SDPCHARS_EMAIL_SAFE "\\x01-\\x09\\x0b\\x0c\\x0e-\\x27\\x2a-\\x3b\\x3d\\x3f-\\xff"
+#define SDPCHARS_ATEXT "a-zA-Z0-9!#$%&'*+-/=?^_`{|}~"
+#define SDPCHARS_BYTE_STRING "\\x01-\\x09\\x0b\\x0c\\x0e-\\xff"
+
+
+// Definition of common regular expression reused many times within the
+// decoder
+//
+// Note: these definitions shall not contain any group match '(' ')' to avoid
+// side effect (the index of the subsequent group match would be shifted)
+// -> all parenthesis group needed should be implemented with '(?:' ')' so
+//    that they are not indexed
+#define SDPREG_SP " "
+#define SDPREG_NON_WS_STRING "[" SDPCHARS_VCHAR "\\x80-\\xff]+"
+#define SDPREG_TOKEN "[\\x21\\x23-\\x27\\x2a\\x2b\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5e-\\x7e]+"
+#define SDPREG_DECIMAL_UCHAR "(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?![0-9])"
+#define SDPREG_IP4_ADDRESS SDPREG_DECIMAL_UCHAR "(?:[.]" SDPREG_DECIMAL_UCHAR"){3}"
+#define SDPREG_INTEGER "[1-9][0-9]*"
+#define SDPREG_TIME_INTEGER "[0-9][0-9]*"
+#define SDPREG_BYTE_STRING "["SDPCHARS_BYTE_STRING"]+"
+
+// TODO: support the folding whitespaces/obsolete addresses/... ?
+#define SDPREG_ADDR_SPEC "[" SDPCHARS_ATEXT "][." SDPCHARS_ATEXT "]*@[" SDPCHARS_ATEXT "][." SDPCHARS_ATEXT "]*"
+
+// This regex differs from the BNF to avoid matching a space or dash at the
+// end of the number
+#define SDPREG_PHONE "[+]?[0-9](?:[- 0-9]*[0-9])?"
+
+
+inline bool logical_xor (bool a, bool b)
+{
+	return (a && !b) || (!a && b);
+}
+
+
+
+//
+// Implementation of the decoder for SDP
+//
+
+
+void SDP_Message::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	Get_protocol_version().SetFormat(Integer::AsciiDecimal);
+}
+
+
+void pre_decode_optional_field_multiple_times (RecordOfSetOf& value, int id, Buffer& buffer, const char* field_letter, void (*hyp_size_func)(int), void (*hyp_field_length_func)(int) )
+{
+	static Regex reg_field ("((?:\r\n)?)(([a-z])=)([^\\r\\n\\x00]*)");
+	if (!reg_field.Match (buffer))
+		goto finished;
+
+	if (logical_xor (id, reg_field.GetMatchedLength (1)))
+		// the first line MUST NOT be preceeded by CRLF
+		// the next lines MUST be preceeded by CRLF
+		//  -> otherwise we assume this is the last field
+		goto finished;
+
+	if (reg_field.GetMatchedString (3) != field_letter) {
+		assert (id > 0);// the field letter is already checked in
+				// SDP_Message::PreDecodeField
+				// the assertion is useful to ensure
+				// that we cannot have an empty
+				// record of (in that case the field
+				// must be omitted in SDP_Message)
+		goto finished;
+	}
+
+	(*hyp_field_length_func) (reg_field.GetMatchedLength(4));
+	reg_field.MovePast (buffer, 2);
+	return;
+
+finished:
+	// did not match -> last field
+	(*hyp_size_func) (-2);
+}
+
+
+void SDP_Message::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_field("^(([a-z])=)([^\\r\\n\\x00]*)");
+
+	const char* expected = NULL;
+
+	switch (id)
+	{
+	case id_protocol_version:	expected = "v";		goto mandatory;
+	case id_origin:			expected = "o";		goto mandatory;
+	case id_session_name:		expected = "s";		goto mandatory;
+	case id_information:		expected = "i";		goto optional_once;
+
+	// TODO: check that this is a valid URI ???
+	case id_uri:			expected = "u";		goto optional_once;
+	case id_emails:			expected = "e";		goto optional_many;
+	case id_phone_numbers:		expected = "p";		goto optional_many;
+	case id_connection:		expected = "c";		goto optional_once;
+	case id_bandwidth:		expected = "b";		goto optional_many;
+	case id_times:			return; // times is not optional => always present
+	// FIXME: SDP_timezone_list should not be here -> the TTCN-3 types should be changed
+	// in the BNF, "z=" is allowed once after each "t=" fields (not after
+	// the last one only)
+	case id_timezone_adjustments:	expected = "z";		goto optional_once;
+	case id_key:			expected = "k";		goto optional_once;
+	case id_attributes:		expected = "a";		goto optional_many;
+	case id_media_list:		expected = "m";		goto optional_many;
+	}
+
+	return;
+mandatory:
+	reg_field.AssertMatch (buffer, this);
+
+	SetHypFieldLength (id, reg_field.GetMatchedLength(3));
+
+	if (reg_field.GetMatchedString(2) != expected) {
+		DecodeError e(this);
+		e.Msg() << "missing mandatory field " << expected << "= before field " << reg_field.GetMatchedString(1) << endl;
+		throw e;
+	}
+	reg_field.MovePast (buffer, 1);
+	return;
+
+optional_once:
+	if (reg_field.Match (buffer) &&
+	    reg_field.GetMatchedString(2) == expected)
+	{
+		// the field is present
+		SetHypFieldIsPresent (id, 1);
+		SetHypFieldLength (id, reg_field.GetMatchedLength(3));
+		reg_field.MovePast (buffer, 1);
+	} else {
+		// the field is not present
+		SetHypFieldIsPresent (id, 0);
+	}
+	return;
+
+optional_many:
+	SetHypFieldIsPresent (id,
+		(reg_field.Match (buffer) &&
+		 reg_field.GetMatchedString(2) == expected)
+		? 1
+		: 0);
+}
+
+void SDP_Message::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	// Here we match the trailing CRLF in the case the field is present
+	static Regex reg_crlf ("^\r\n");
+
+
+	if (!IsPresent (id))
+		return;
+
+	// the time field is not declared as optional
+	// therefore we must check that the list is not empty
+	if ((id == id_times) && (Get_times().GetSize() == 0))
+		return;
+
+	reg_crlf.AssertMatch (buffer, this);
+	reg_crlf.MovePast (buffer);
+}
+
+void SDP_Origin::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_origin ("("SDPREG_NON_WS_STRING")"	// username
+			SDPREG_SP "([0-9]+)"		// session-id
+			SDPREG_SP "([0-9]+)"		// session-version
+			SDPREG_SP "("SDPREG_TOKEN")"	// net-type
+			SDPREG_SP "("SDPREG_TOKEN")"	// addr-type
+			SDPREG_SP "("SDPREG_NON_WS_STRING")"); // unicast-address
+	reg_origin.AssertMatch (buffer, this);
+	for (int i=0 ; i<6 ; i++) {
+		SetHypFieldLength (i, reg_origin.GetMatchedLength(i+1));
+	}
+}
+
+void SDP_Origin::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id) {
+		static Regex reg_sp (" ");
+		reg_sp.AssertMatch (buffer, this);
+		reg_sp.MovePast (buffer);
+	}
+}
+
+#define SDP_CODET_HEADER_LIST(letter, type) \
+	void type::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) \
+	{ \
+		pre_decode_optional_field_multiple_times (*this, id, buffer, letter, &SetHypSize, &SetHypFieldLength); \
+	}
+
+SDP_CODET_HEADER_LIST ("e", SDP_email_list);
+SDP_CODET_HEADER_LIST ("p", SDP_phone_list);
+SDP_CODET_HEADER_LIST ("b", SDP_bandwidth_list);
+SDP_CODET_HEADER_LIST ("r", SDP_repeat_list);
+SDP_CODET_HEADER_LIST ("a", SDP_attribute_list);
+SDP_CODET_HEADER_LIST ("c", SDP_connection_list);
+
+
+
+void dummy (int a) {
+}
+// SDL_time and SDP_media_desc list are a little unusual compared to other
+// headers since these record can contain a list of headers
+//
+// In order to be able to decode it, we will not put any length
+// constraint on this header (thus passing &dummy instead of
+// &SetHypFieldLength), then it will be possible to decode the
+// repeate headers after the CRLF
+void SDP_time_list::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	pre_decode_optional_field_multiple_times (*this, id, buffer, "t", &SetHypSize, &dummy);
+}
+void SDP_media_desc_list::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	pre_decode_optional_field_multiple_times (*this, id, buffer, "m", &SetHypSize, &dummy);
+}
+
+
+void SDP_contact::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_addrspec_comment ("^(" SDPREG_ADDR_SPEC ")(" SDPREG_SP "[(](["SDPCHARS_EMAIL_SAFE"]+)[)])?");
+	static Regex reg_dispname_and_addr ("^(["SDPCHARS_EMAIL_SAFE"]+)" SDPREG_SP "<(" SDPREG_ADDR_SPEC ")>");
+	
+	static Regex reg_phone_comment ("^(" SDPREG_PHONE ")(" SDPREG_SP "[(](["SDPCHARS_EMAIL_SAFE"]+)[)])?");
+	static Regex reg_dispname_and_phone ("^(["SDPCHARS_EMAIL_SAFE"]+)" SDPREG_SP "<(" SDPREG_PHONE ")>");
+
+	Regex *reg_normal, *reg_reverse;
+	if (dynamic_cast<SDP_phone_list*>(GetParent())) {
+		// this is a phone contact
+		reg_normal  = &reg_phone_comment;
+		reg_reverse = &reg_dispname_and_phone;
+	} else {
+		// this is an email contact
+		reg_normal  = &reg_addrspec_comment;
+		reg_reverse = &reg_dispname_and_addr;
+	}
+
+	// by default we assume that there is no name displayed
+	SetHypFieldIsPresent (id_disp_name, 0);
+
+	if (reg_normal->Match (buffer)) {
+		mReverseOrder = false;
+		SetHypFieldLength (id_addr_or_phone, reg_normal->GetMatchedLength (1));
+		mHasComment = reg_normal->GetMatchedLength (2);
+		if (mHasComment) {
+			SetHypFieldIsPresent (id_disp_name, 1);
+			SetHypFieldLength (id_disp_name, reg_normal->GetMatchedLength (3));
+		}
+	} else if (reg_reverse->Match (buffer)) {
+		mReverseOrder = true;
+		SetHypFieldLength (id_addr_or_phone, reg_reverse->GetMatchedLength (2));
+		SetHypFieldIsPresent (id_disp_name, 1);
+		SetHypFieldLength (id_disp_name, reg_reverse->GetMatchedLength (1));
+		// remember the position of the display name to be able
+		// to decode it later
+		mNextPosition = buffer.GetPosition();
+		// then place the cursor of the buffer at the position of the
+		// email address
+		reg_reverse->MoveAt (buffer, 2);
+	} else {
+		throw DecodeError (this, "Cannot match email address or phone number\n");
+	}
+}
+
+void SDP_contact::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (mReverseOrder) {
+		if (id == id_addr_or_phone) {
+			int disp_name_position = mNextPosition;
+			// remember the position past the closing ">"
+			mNextPosition = buffer.GetPosition() + 8;
+			buffer.SetPosition (disp_name_position);
+		} else {
+			// once everything is decoded we move forward to the
+			// end of the message field
+			buffer.SetPosition (mNextPosition);
+		}
+	} else if (mHasComment) {
+		buffer.SetPosition (buffer.GetPosition() + (
+			(id == id_addr_or_phone)
+				? 16	// move past the " ("
+				: 8	// move past the ")"
+		));
+	}
+}
+
+void SDP_connection::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id == id_net_type) {
+		static Regex reg_connection ("^(" SDPREG_TOKEN ") (" SDPREG_TOKEN ") (" SDPREG_NON_WS_STRING ")");
+
+		reg_connection.AssertMatch (buffer, this);
+		SetHypFieldLength (id_net_type, reg_connection.GetMatchedLength (1));
+		SetHypFieldLength (id_addr_type, reg_connection.GetMatchedLength (2));
+		SetHypFieldLength (id_conn_addr, reg_connection.GetMatchedLength (3));
+		
+	} else {
+		buffer.SetPosition (buffer.GetPosition() + 8); // move past the SP
+	}
+}
+
+void SDP_conn_addr::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id == id_addr) {
+		static Regex reg_ip4 ("^("SDPREG_IP4_ADDRESS")((?:[/]("SDPREG_INTEGER"))?((?:[/]("SDPREG_INTEGER"))?))");
+		static Regex reg_ip6 ("^([0-9a-fA-F.:]+)((?:[/]("SDPREG_INTEGER"))?)");
+		unsigned char ip6_addr[16];
+	
+		// use ascii format for the integers
+		Get_ttl().SetFormat(Integer::AsciiDecimal);
+		Get_num_of_addr().SetFormat(Integer::AsciiDecimal);
+	
+		// ttl and addr_num are not present by default
+		SetHypFieldIsPresent (id_ttl, 0);
+		SetHypFieldIsPresent (id_num_of_addr, 0);
+/*
+reg_ip4.AssertMatch (buffer, this);
+for (int i=0 ; i<6 ; i++) {
+	cerr << "Matched string " << i << " -> " << reg_ip4.GetMatchedString (i) << endl; 
+	cerr << "Matched length " << i << " -> " << reg_ip4.GetMatchedLength (i) << endl; 
+}
+*/
+		if (reg_ip4.Match (buffer)) {
+			SetHypFieldLength (id_addr, reg_ip4.GetMatchedLength (1));
+			if (atoi (reg_ip4.GetMatchedString(1).c_str()) < 224) {
+				// unicast address
+				if (reg_ip4.GetMatchedLength(2) | reg_ip4.GetMatchedLength(4))
+					throw DecodeError (this, "TTL and/or number of connections fields can be present only with multicast addresses\n");
+
+			} else {
+				// multicast address
+				if (! reg_ip4.GetMatchedLength (2))
+					throw DecodeError (this, "IPv4 multicast address must be followed with the TTL");
+				SetHypFieldIsPresent (id_ttl, 1);
+				SetHypFieldLength (id_ttl, reg_ip4.GetMatchedLength (3));
+				if (reg_ip4.GetMatchedLength (4)) {
+					SetHypFieldIsPresent (id_num_of_addr, 1);
+					SetHypFieldLength (id_num_of_addr, reg_ip4.GetMatchedLength (5));
+				}
+			}
+		} else if (	reg_ip6.Match (buffer) 
+#ifndef WIN32
+				// FIXME: inet_pton does not exist in WIN32
+			&& (inet_pton (AF_INET6, reg_ip6.GetMatchedString(1).c_str(), &ip6_addr) == 1) // if it does not contain a valid ipv6 address, then
+				// we will parse it as another address family
+#endif
+			) {
+			SetHypFieldLength (id_addr, reg_ip6.GetMatchedLength (1));
+			if (ip6_addr[0] != 0xFF) {
+				// unicast address
+				if (reg_ip4.GetMatchedLength(2))
+					throw DecodeError (this, "The number of connections can be present only with multicast addresses\n");
+
+			} else {
+				// multicast address
+				if (reg_ip6.GetMatchedLength (2)) {
+					SetHypFieldIsPresent (id_num_of_addr, 1);
+					SetHypFieldLength (id_num_of_addr, reg_ip6.GetMatchedLength (3));
+				}
+			}
+		} else {
+			// if it is not an ipv4 or ipv6 address
+			// then we put everything in the addr field
+		}
+		
+	} else if (GetHypFieldIsPresent (id)) {
+		buffer.SetPosition (buffer.GetPosition() + 8); // move past the "/"
+	}
+}
+
+void SDP_bandwidth::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id == id_modifier) {
+		static Regex reg_bw ("^(" SDPREG_TOKEN "):([0-9]+)");
+		reg_bw.AssertMatch (buffer, this);
+		SetHypFieldLength (id_modifier, reg_bw.GetMatchedLength(1));
+		SetHypFieldLength (id_bandwidth, reg_bw.GetMatchedLength(2));
+	} else {
+		Get_bandwidth().SetFormat(Integer::AsciiDecimal);
+		Unsigned(8).Decode(buffer); // move past the colon
+	}
+}
+
+void SDP_time::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id == id_time_repeat) {
+		static Regex reg_repeat ("^(\r\n)r=");
+
+		if (reg_repeat.Match (buffer)) {
+			SetHypFieldIsPresent (id, 1);
+			reg_repeat.MovePast (buffer, 1);
+		} else {
+			SetHypFieldIsPresent (id, 0);
+		}
+	}
+}
+
+void SDP_time_field::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id == id_start_time) {
+		static Regex reg_times ("^(" SDPREG_TIME_INTEGER ")" SDPREG_SP "(" SDPREG_TIME_INTEGER ")");
+		reg_times.AssertMatch (buffer, this);
+		SetHypFieldLength (id_start_time, reg_times.GetMatchedLength (1));
+		SetHypFieldLength (id_stop_time, reg_times.GetMatchedLength (2));
+	} else {
+		Unsigned(8).Decode (buffer); // move past the SP
+	}
+}
+
+void SDP_typed_time::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_ttime ("^(-?[0-9]*)([dhms]?)");
+	reg_ttime.AssertMatch (buffer, this);
+
+	Get_time().SetFormat(Integer::AsciiDecimal);
+	SetHypFieldLength (id_time, reg_ttime.GetMatchedLength (1));
+
+	bool has_unit = reg_ttime.GetMatchedLength (2);
+	SetHypFieldIsPresent (id_unit, has_unit ? 1 : 0);
+	if (has_unit) {
+		SetHypFieldLength (id_unit, 8);
+	}
+}
+
+void SDP_repeat::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id == id_active) {
+		static Regex reg_sp ("^" SDPREG_SP);
+		reg_sp.AssertMatch (buffer, this);
+		reg_sp.MovePast (buffer, 0);
+	}
+}
+
+void SDP_typed_time_list::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_sp ("^(" SDPREG_SP ")[0-9]+");
+	if (reg_sp.Match (buffer)) {
+		reg_sp.MovePast (buffer, 1);
+	} else {
+		SetHypSize (-2);
+	}
+}
+
+void SDP_timezone_list::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_sp ("^(" SDPREG_SP ")[0-9]");
+	if (reg_sp.Match (buffer)) {
+		reg_sp.MovePast (buffer, 1);
+	} else {
+		SetHypSize (-2);
+	}
+}
+
+void SDP_timezone::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id == id_adjustment_time) {
+		static Regex reg_tz ("^([1-9][0-9]*)" SDPREG_SP);
+		reg_tz.AssertMatch (buffer, this);
+		SetHypFieldLength (id_adjustment_time, reg_tz.GetMatchedLength(1));
+	} else {
+		Unsigned(8).Decode(buffer); // move past the SP
+	}
+}
+
+void SDP_key::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id == id_method) {
+		static Regex reg_method ("^(prompt|clear|base64|uri)(:?)");
+		reg_method.AssertMatch (buffer, this);
+
+		if (reg_method.GetMatchedString(1) == "prompt") {
+			if (reg_method.GetMatchedLength(2))
+				throw DecodeError (this, "the 'prompt' method must not be followed by a value\n");
+		} else {
+			if (!reg_method.GetMatchedLength(2))
+				throw DecodeError (this, "the method must not be followed by a value\n");
+		}
+		SetHypFieldLength (id_method, reg_method.GetMatchedLength (1));
+		SetHypFieldIsPresent (id_key, reg_method.GetMatchedLength (2) ? 1 : 0);
+	} else {
+		if (GetHypFieldIsPresent (id)) {
+			Unsigned(8).Decode(buffer); // move past the colon
+			// TODO: validate the content of the key ?
+		}
+	}
+}
+
+class SdpAttributeMap {
+public:
+	struct Entry {
+		Entry (const char* name, int id_attr)
+		 : mName (name), mIdAttribute (id_attr)
+		 {}
+		const std::string	mName;
+		const int		mIdAttribute;
+	};
+
+	static const Entry& GetByName (const std::string& key)
+	{
+		const mMapName_t& m = msInstance.mMapName;
+		mMapName_t::const_iterator it = m.find (key);
+		if (it != m.end()) {
+			return *it->second;
+		} else {
+			return *msInstance.mUndef;
+		}
+	}
+	
+	static const Entry& GetByIdMessageHeader (int key)
+	{
+		const std::map<int, Entry*>& m = msInstance.mMapIdAttribute;
+		std::map <int, Entry*>::const_iterator it = m.find (key);
+		if (it != m.end()) {
+			return *it->second;
+		} else {
+			return *msInstance.mUndef;
+		}
+	}
+
+
+private:
+	void AddEntry (const Entry& entry) {
+		mEntries.push_back(entry);
+		Entry& e = *mEntries.rbegin();
+		
+		//TODO: check unicity
+		mMapName[e.mName] = &e;
+		mMapIdAttribute[e.mIdAttribute] = &e;
+	}
+
+	SdpAttributeMap() {
+
+#define SDP_ATTRIBUTE_ADD(name)	AddEntry (Entry (#name, SDP_attribute::id_ ## name));
+
+		//		Name
+		SDP_ATTRIBUTE_ADD (cat);
+		SDP_ATTRIBUTE_ADD (keywds);
+		SDP_ATTRIBUTE_ADD (tool);
+		SDP_ATTRIBUTE_ADD (ptime);
+		SDP_ATTRIBUTE_ADD (recvonly);
+		SDP_ATTRIBUTE_ADD (sendrecv);
+		SDP_ATTRIBUTE_ADD (sendonly);
+		SDP_ATTRIBUTE_ADD (inactive);
+		SDP_ATTRIBUTE_ADD (orient);
+		AddEntry (Entry ("type", SDP_attribute::id_sdp_type));
+		SDP_ATTRIBUTE_ADD (sdp_type);
+		SDP_ATTRIBUTE_ADD (charset);
+		SDP_ATTRIBUTE_ADD (sdplang);
+		SDP_ATTRIBUTE_ADD (lang);
+		SDP_ATTRIBUTE_ADD (framerate);
+		SDP_ATTRIBUTE_ADD (quality);
+		SDP_ATTRIBUTE_ADD (fmtp);
+		SDP_ATTRIBUTE_ADD (rtpmap);
+		SDP_ATTRIBUTE_ADD (rtcp);
+
+		// RFC 3312 attributes
+		SDP_ATTRIBUTE_ADD (curr);
+		SDP_ATTRIBUTE_ADD (des);
+		SDP_ATTRIBUTE_ADD (conf);
+		{
+			mEntries.push_back(Entry("", SDP_attribute::id_unknown));
+			Entry& e = *mEntries.rbegin();
+			mMapIdAttribute[e.mIdAttribute] = &e;
+			mUndef = &e;
+		}
+	}
+
+	static SdpAttributeMap		msInstance;
+
+	std::list<Entry>		mEntries;
+	Entry*				mUndef;
+
+	typedef std::map <std::string, Entry*>	mMapName_t;
+	mMapName_t			mMapName;
+	std::map <int, Entry*>		mMapIdAttribute;
+};
+SdpAttributeMap SdpAttributeMap::msInstance;
+
+void SDP_attribute::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	Regex reg_attr ("^("SDPREG_TOKEN")(?:(:)("SDPREG_BYTE_STRING"))?");
+	reg_attr.AssertMatch (buffer, this);
+
+	int id = SdpAttributeMap::GetByName (reg_attr.GetMatchedString(1)).mIdAttribute;
+	
+	SetHypChosenId (id);
+	if (id != id_unknown) {
+		SetHypLength (reg_attr.GetMatchedLength(3));
+		reg_attr.MovePast(buffer,
+			(reg_attr.GetMatchedLength(2) ? 2 : 1) 
+		);
+	}
+}
+
+void SDP_attribute_unknown::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id == id_name) {
+		Regex reg_attr ("^("SDPREG_TOKEN")((?::("SDPREG_BYTE_STRING"))?)");
+		reg_attr.AssertMatch (buffer, this);
+
+		SetHypFieldLength (id_name, reg_attr.GetMatchedLength (1));
+
+		int val_len = reg_attr.GetMatchedLength(3);
+		SetHypFieldIsPresent (id_attr_value, (val_len ? 1 : 0));
+		if (val_len)
+			SetHypFieldLength (id_attr_value, val_len);
+	} else if (GetHypFieldIsPresent (id)){
+		Unsigned(8).Decode(buffer); // move past the colon
+	}
+}
+
+void SDP_attribute_curr::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id == 0) {
+		Regex reg_attr ("^("SDPREG_TOKEN")" SDPREG_SP "(e2e|local|remote)" SDPREG_SP "(none|sendrecv|send|recv)");
+		reg_attr.AssertMatch (buffer, this);
+
+		SetHypFieldLength (0, reg_attr.GetMatchedLength (1));
+		SetHypFieldLength (1, reg_attr.GetMatchedLength (2));
+		SetHypFieldLength (2, reg_attr.GetMatchedLength (3));
+
+	} else if (GetHypFieldIsPresent (id)){
+		Unsigned(8).Decode(buffer); // move past the space
+	}
+}
+
+void SDP_attribute_des::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id == 0) {
+		Regex reg_attr ("^("SDPREG_TOKEN")" SDPREG_SP "(mandatory|optional|none|failure|unknown)" SDPREG_SP "(e2e|local|remote)" SDPREG_SP "(none|sendrecv|send|recv)");
+		reg_attr.AssertMatch (buffer, this);
+
+		SetHypFieldLength (0, reg_attr.GetMatchedLength (1));
+		SetHypFieldLength (1, reg_attr.GetMatchedLength (2));
+		SetHypFieldLength (2, reg_attr.GetMatchedLength (3));
+		SetHypFieldLength (3, reg_attr.GetMatchedLength (4));
+
+	} else if (GetHypFieldIsPresent (id)){
+		Unsigned(8).Decode(buffer); // move past the space
+	}
+}
+
+void SDP_attribute_conf::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id == 0) {
+		Regex reg_attr ("^("SDPREG_TOKEN")" SDPREG_SP "(e2e|local|remote)" SDPREG_SP "(none|sendrecv|send|recv)");
+		reg_attr.AssertMatch (buffer, this);
+
+		SetHypFieldLength (0, reg_attr.GetMatchedLength (1));
+		SetHypFieldLength (1, reg_attr.GetMatchedLength (2));
+		SetHypFieldLength (2, reg_attr.GetMatchedLength (3));
+
+	} else if (GetHypFieldIsPresent (id)){
+		Unsigned(8).Decode(buffer); // move past the space
+	}
+}
+
+void SDP_media_field::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+  	static Regex reg_media ("^("SDPREG_TOKEN")" SDPREG_SP "([0-9/]+)" SDPREG_SP "("SDPREG_TOKEN"(?:/"SDPREG_TOKEN")*)" );
+
+	if (id==0) {
+		reg_media.AssertMatch (buffer, this);
+		SetHypFieldLength (id_media, reg_media.GetMatchedLength (1));
+		SetHypFieldLength (id_ports, reg_media.GetMatchedLength (2));
+		SetHypFieldLength (id_transport, reg_media.GetMatchedLength (3));
+	} else if (id != id_fmts) {
+		Unsigned(8).Decode(buffer); // move past the SP
+	}
+}
+
+void SDP_media_field::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_space ("^"SDPREG_SP);
+	if(id == id_ports) {
+		// Necessary as 2nd part of SDP_media_port regex 
+		// could be a mismatch (ex: num-of_ports=0) !
+		reg_space.AssertMatch(buffer, this);
+	}
+}
+
+void SDP_media_port::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_port ("^([0-9]+)(/("SDPREG_INTEGER"))?");
+
+	if (id == 0) {
+		reg_port.AssertMatch (buffer, this);
+		
+		Get_port_number().SetFormat(Integer::AsciiDecimal);
+		SetHypFieldLength (id_port_number, reg_port.GetMatchedLength(1));
+		if (reg_port.GetMatchedLength (2)) {
+			SetHypFieldIsPresent (id_num_of_ports, 1);
+			SetHypFieldLength (id_num_of_ports, reg_port.GetMatchedLength(3));
+			Get_num_of_ports().SetFormat(Integer::AsciiDecimal);
+		} else {
+			SetHypFieldIsPresent (id_num_of_ports, 0);
+		}
+	} else {
+		if (GetHypFieldIsPresent (id)) {
+			Unsigned(8).Decode(buffer); // move past the '/'
+		}
+	}
+}
+
+void SDP_fmt_list::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_fmt ("^"SDPREG_SP"("SDPREG_TOKEN")");
+	if (reg_fmt.Match (buffer)) {
+		reg_fmt.MoveAt (buffer, 1);
+		SetHypFieldLength (reg_fmt.GetMatchedLength(1));
+	} else {
+		SetHypSize (-2);
+	}
+}
+
+void SDP_media_desc::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id == id_media_field)
+		// media_field is always present and the "m=" was
+		// already processed by SDP_message::PreDecodeField()
+		return;
+
+	static Regex reg_field("^(([a-z])=)([^\\r\\n\\x00]*)");
+
+	const char* expected = NULL;
+
+	switch (id)
+	{
+	case id_information:		expected = "i";		goto optional_once;
+	case id_connections:		expected = "c";		goto optional_many;
+	case id_bandwidth:		expected = "b";		goto optional_once;
+	case id_key:			expected = "k";		goto optional_once;
+	case id_attributes:		expected = "a";		goto optional_many;
+	}
+
+	return;
+mandatory:
+	reg_field.AssertMatch (buffer, this);
+
+	SetHypFieldLength (id, reg_field.GetMatchedLength(3));
+
+	if (reg_field.GetMatchedString(2) != expected) {
+		DecodeError e(this);
+		e.Msg() << "missing mandatory field " << expected << "= before field " << reg_field.GetMatchedString(1) << endl;
+		throw e;
+	}
+	reg_field.MovePast (buffer, 1);
+	return;
+
+optional_once:
+	if (reg_field.Match (buffer) &&
+	    reg_field.GetMatchedString(2) == expected)
+	{
+		// the field is present
+		SetHypFieldIsPresent (id, 1);
+		SetHypFieldLength (id, reg_field.GetMatchedLength(3));
+		reg_field.MovePast (buffer, 1);
+	} else {
+		// the field is not present
+		SetHypFieldIsPresent (id, 0);
+	}
+	return;
+
+optional_many:
+	SetHypFieldIsPresent (id,
+		(reg_field.Match (buffer) &&
+		 reg_field.GetMatchedString(2) == expected)
+		? 1
+		: 0);
+}
+
+void SDP_media_desc::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_crlf ("^\r\n");
+	if (IsPresent (id)) {
+		reg_crlf.AssertMatch (buffer, this);
+		reg_crlf.MovePast (buffer);
+	}
+}
+
+void SDP_media_desc::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+	buffer.SetPosition(buffer.GetPosition()-16); // go back 2 chars so that the CRLF is matched by the SDP_Message::PostDecodeField();
+}
+
+
+//
+// Implementation of the encoder for SDP
+//
+
+void SDP_Message::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csHeader;
+
+	if(IsPresent(field_id)) {
+		switch(field_id) {
+		case id_protocol_version:
+			Get_protocol_version().SetFormat(Integer::AsciiDecimal);
+			csHeader.SetValue("v=");
+			csHeader.Encode(buffer);
+			break;		
+		case id_origin:
+			csHeader.SetValue("o=");
+			csHeader.Encode(buffer);
+			break;		
+		case id_session_name:
+			csHeader.SetValue("s=");
+			csHeader.Encode(buffer);
+			break;		
+		case id_information:
+			csHeader.SetValue("i=");
+			csHeader.Encode(buffer);
+			break;		
+		case id_uri:
+			csHeader.SetValue("u=");
+			csHeader.Encode(buffer);
+			break;		
+		case id_connection:
+			csHeader.SetValue("c=");
+			csHeader.Encode(buffer);
+			break;		
+		case id_key:
+			csHeader.SetValue("k=");
+			csHeader.Encode(buffer);
+			break;		
+		case id_timezone_adjustments:
+			csHeader.SetValue("z=");
+			csHeader.Encode(buffer);
+			break;		
+		}
+	}
+}
+
+void SDP_Message::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ 	Charstring csCRLF;
+	csCRLF.SetValue("\r\n");
+
+
+	switch(field_id) {
+	case id_protocol_version:
+	case id_origin:
+	case id_session_name:
+	case id_information:
+	case id_uri:
+	case id_connection:
+	case id_key:
+	case id_timezone_adjustments:
+		if(IsPresent(field_id)) {
+			csCRLF.Encode(buffer);
+		}
+		break;
+ 	case id_emails:
+	case id_phone_numbers:
+	case id_bandwidth:
+	case id_times:
+	case id_attributes:
+        case id_media_list:
+		break;
+	}
+}
+
+void SDP_Origin::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSpace;
+	csSpace.SetValue(" ");
+
+	if(field_id != 0) {
+		csSpace.Encode(buffer);
+	}
+}
+
+void SDP_connection::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSpace;
+	csSpace.SetValue(" ");
+
+	if(field_id != 0) {
+		csSpace.Encode(buffer);
+	}
+}
+
+void SDP_conn_addr::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Get_ttl().SetFormat(Integer::AsciiDecimal);
+	Get_num_of_addr().SetFormat(Integer::AsciiDecimal);
+}
+
+void SDP_conn_addr::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSlash;
+	csSlash.SetValue("/");
+
+	if(IsPresent(field_id)) {
+		switch(field_id) {
+		case id_ttl:
+		case id_num_of_addr:
+			csSlash.Encode(buffer);
+			break;
+		}
+	}
+}
+
+void SDP_email_list::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csHeader;
+
+	csHeader.SetValue("e=");
+	csHeader.Encode(buffer);
+}
+
+void SDP_email_list::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ 	Charstring csCRLF;
+	csCRLF.SetValue("\r\n");
+
+	csCRLF.Encode(buffer);
+}
+
+void SDP_phone_list::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csHeader;
+
+	csHeader.SetValue("p=");
+	csHeader.Encode(buffer);
+}
+
+void SDP_phone_list::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ 	Charstring csCRLF;
+	csCRLF.SetValue("\r\n");
+
+	csCRLF.Encode(buffer);
+}
+
+void SDP_bandwidth_list::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+}
+
+void SDP_bandwidth::PostEncode (Buffer& buffer) throw (EncodeError)
+{
+ 	Charstring csCRLF;
+	csCRLF.SetValue("\r\n");
+
+	csCRLF.Encode(buffer);
+}
+
+void SDP_bandwidth::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csHeader;
+
+	csHeader.SetValue("b=");
+	csHeader.Encode(buffer);
+
+	Get_bandwidth().SetFormat(Integer::AsciiDecimal);
+}
+
+void SDP_bandwidth::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csColon;
+	csColon.SetValue(":");
+
+	if(field_id == id_modifier) {
+		csColon.Encode(buffer);
+	}
+}
+
+void SDP_timezone::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSpace;
+	csSpace.SetValue(" ");
+
+	if(field_id != 0) {
+		csSpace.Encode(buffer);
+	}
+}
+
+void SDP_timezone_list::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSpace;
+	csSpace.SetValue(" ");
+
+	if(field_id != 0) {
+		csSpace.Encode(buffer);
+	}
+}
+
+void SDP_typed_time::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Get_time().SetFormat(Integer::AsciiDecimal);
+}
+
+void SDP_attribute_list::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csHeader;
+
+	csHeader.SetValue("a=");
+	csHeader.Encode(buffer);
+}
+
+void SDP_attribute_list::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ 	Charstring csCRLF;
+	csCRLF.SetValue("\r\n");
+
+	csCRLF.Encode(buffer);
+}
+
+void SDP_media_field::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csHeader;
+
+	csHeader.SetValue("m=");
+	csHeader.Encode(buffer);
+}
+
+void SDP_media_field::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSpace;
+	csSpace.SetValue(" ");
+
+	if(field_id != 0) {
+		csSpace.Encode(buffer);
+	}
+}
+
+void SDP_fmt_list::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSpace;
+	csSpace.SetValue(" ");
+
+	if(field_id != 0) {
+		csSpace.Encode(buffer);
+	}
+}
+
+void SDP_media_port::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Get_port_number().SetFormat(Integer::AsciiDecimal);
+}
+
+void SDP_media_port::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSlash;
+	csSlash.SetValue("/");
+
+	if((field_id == id_num_of_ports) && IsPresent(id_num_of_ports)) {
+		Get_num_of_ports().SetFormat(Integer::AsciiDecimal);
+		csSlash.Encode(buffer);
+	}
+}
+
+void SDP_media_field::PostEncode (Buffer& buffer) throw (EncodeError)
+{
+ 	Charstring csCRLF;
+	csCRLF.SetValue("\r\n");
+
+	csCRLF.Encode(buffer);
+}
+
+void SDP_media_desc::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csHeader;
+
+	if(IsPresent(field_id)) {
+		switch(field_id) {
+		case id_information:
+			csHeader.SetValue("i=");
+			csHeader.Encode(buffer);
+			break;		
+		case id_key:
+			csHeader.SetValue("k=");
+			csHeader.Encode(buffer);
+			break;		
+		}
+	}
+}
+
+void SDP_media_desc::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ 	Charstring csCRLF;
+	csCRLF.SetValue("\r\n");
+
+	switch(field_id) {
+	case id_information:
+	case id_key:
+		if(IsPresent(field_id)) {
+			csCRLF.Encode(buffer);
+		}
+		break;
+	}
+}
+
+void SDP_connection_list::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csHeader;
+
+	csHeader.SetValue("c=");
+	csHeader.Encode(buffer);
+}
+
+void SDP_connection_list::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ 	Charstring csCRLF;
+	csCRLF.SetValue("\r\n");
+
+	csCRLF.Encode(buffer);
+}
+
+void SDP_key::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csColon;
+	csColon.SetValue(":");
+
+	if((field_id == id_key) && IsPresent(id_key)) {
+		csColon.Encode(buffer);
+	}
+}
+
+void SDP_contact::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csLeftPar, csSpace;
+	csLeftPar.SetValue("(");
+	csSpace.SetValue(" ");
+	
+	if((field_id == id_disp_name) && IsPresent(id_disp_name)) {
+		csSpace.Encode(buffer);
+		csLeftPar.Encode(buffer);
+	}
+}
+
+void SDP_contact::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csRightPar;
+	csRightPar.SetValue(")");
+
+	if((field_id == id_disp_name) && IsPresent(id_disp_name)) {
+		csRightPar.Encode(buffer);
+	}
+}
+
+void SDP_repeat_list::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csHeader;
+
+	csHeader.SetValue("r=");
+	csHeader.Encode(buffer);
+}
+
+void SDP_repeat_list::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+ 	Charstring csCRLF;
+	csCRLF.SetValue("\r\n");
+
+	csCRLF.Encode(buffer);
+}
+
+void SDP_repeat::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSpace;
+	csSpace.SetValue(" ");
+
+	if(field_id == id_active) {
+		csSpace.Encode(buffer);
+	}
+}
+
+void SDP_typed_time_list::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSpace;
+	csSpace.SetValue(" ");
+
+	csSpace.Encode(buffer);
+}
+
+void SDP_time_field::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csHeader;
+
+	csHeader.SetValue("t=");
+	csHeader.Encode(buffer);
+}
+
+void SDP_time_field::PostEncode (Buffer& buffer) throw (EncodeError)
+{
+ 	Charstring csCRLF;
+	csCRLF.SetValue("\r\n");
+
+	csCRLF.Encode(buffer);
+}
+
+void SDP_time_field::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSpace;
+	csSpace.SetValue(" ");
+
+	if(field_id == id_stop_time) {
+		csSpace.Encode(buffer);
+	}
+}
+
+
+
+
+
+void SDP_attribute_cat::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("cat:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_keywds::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("keywds:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_tool::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("tool:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_ptime::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("ptime:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_recvonly::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("recvonly");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_sendrecv::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("sendrecv");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_sendonly::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("sendonly");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_inactive::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("inactive");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_orient::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("orient:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_type::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("type:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_charset::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("charset:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_sdplang::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("sdplang:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_lang::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("lang:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_framerate::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("framerate:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_quality::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("quality:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_fmtp::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("fmtp:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_curr::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("curr:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_curr::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSpace;
+	csSpace.SetValue(" ");
+	
+	if(field_id != 0) {
+		csSpace.Encode(buffer);
+	}
+}
+
+void SDP_attribute_des::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("des:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_des::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSpace;
+	csSpace.SetValue(" ");
+	
+	if(field_id != 0) {
+		csSpace.Encode(buffer);
+	}
+}
+
+void SDP_attribute_conf::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("conf:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_conf::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSpace;
+	csSpace.SetValue(" ");
+	
+	if(field_id != 0) {
+		csSpace.Encode(buffer);
+	}
+}
+
+void SDP_attribute_rtpmap::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("rtpmap:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_rtcp::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAttrName;
+	csAttrName.SetValue("rtcp:");
+
+	csAttrName.Encode(buffer);
+}
+
+void SDP_attribute_unknown::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csColon;
+	csColon.SetValue(":");
+
+	if((field_id == id_attr_value) && IsPresent(id_attr_value)) {
+		csColon.Encode(buffer);
+	}
+}
+
+
+
+
+}} // namespaces
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/sdp_codets.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/sdp_codets.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/sdp_codets.h	(revision 22)
@@ -0,0 +1,27 @@
+#ifndef  SDPCODETS_H
+#define  SDPCODETS_H
+#include <t3devlib/t3devlib.h>
+
+namespace t3devlib {
+namespace gen {
+
+
+// subtypes of structured type
+// we just handle them by defining an alias to the base class
+//
+// FIXME: subtypes of structured types is not explicitely allowed in TTCN-3
+// 	  is this valid anyway ?
+#define SDP_contact_tel SDP_contact
+#define SDP_contact_email SDP_contact
+
+// definition additional attributes for the SDP_contact class
+// (included automatically in the generated codec)
+#define DEFINITIONS_SDP_contact()	\
+	bool	mReverseOrder;		\
+	bool	mHasComment;		\
+	int	mNextPosition;
+
+}} //namespaces
+
+#endif
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/sip_codets.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/sip_codets.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/sip_codets.cpp	(revision 22)
@@ -0,0 +1,3936 @@
+#include "gen_classes.h"
+#include "Regex.h"
+
+namespace t3devlib { namespace gen {
+
+
+//
+// Implementation of the decoder for SDP
+//
+
+// SIP quoted strings messages allow multiple ways of representing 
+// some characters (raw unicode or escaped). This function is used
+// to normalise the content so that two equivalent representation
+// will result in the same TTCN-3 charstring.
+//
+void normalise_quoted_string (Charstring& cs, bool remove_quotes = false) throw (DecodeError)
+{
+	std::string result;
+
+	//FIXME: how LWS shall be normalised ?
+	
+	const unsigned char* p   = cs.GetValueBin();
+	const unsigned char* end = p + (cs.GetLength() / 8);
+
+	if (remove_quotes)
+	{
+		if ((end - p) < 2)
+			goto error_malformed;
+
+		if ((*p++ != '"') | (*--end != '"'))
+			goto error_malformed;
+	}
+
+	for ( ; p!=end ; p++)
+	{
+		switch (*p) {
+		case '\r': //LWS
+		case '\n':
+
+		case ' ': //WSP
+		case '\v':
+		case '\t':
+		case '\f':
+
+		case 0x21: //!
+			// plain text
+			result += *p;
+			break;
+
+		case '\\':
+			// escaped character
+			p++;
+			if ((p == end) || ((*p == '\r') | (*p == '\n'))) {
+				// cannot be escaped
+				// (should never happen since we checked it wit a regex before)
+				DecodeError e (&cs);
+				e.Msg() << "Invalid escaped sequence in quoted string: \\\\x" << std::hex << ((int) *p) << std::endl;
+				throw e;
+			}
+
+			// valid escaped character
+			result += *p;
+			break;
+
+		default:
+			if ((*p >= 0x23) && (*p <= 0x7e))
+			{
+				// plain text
+				result += *p;
+
+			} else if (*p > 127) {
+				// UTF-8 character
+				//
+				// FIXME: how to represent UTF-8 chars ? ('%xx' escape sequences are not used here)
+				result += *p;
+
+			} else {
+				// non allowed character
+				// (should never happen since we checked it wit a regex before)
+				DecodeError e (&cs);
+				e.Msg() << "Invalid character in quoted string: \\x" << std::hex << ((int) *p) << std::endl;
+				throw e;
+			}
+		}
+	}
+
+	// replace the string with the quoted string
+	{
+		Bytestring& bs = cs;
+		bs.SetValue (result);
+	}
+	return;
+
+error_malformed:
+	DecodeError e(&cs);
+	e.Msg() << "Malformed quoted string: " << cs.GetValue() << endl;
+	throw e;
+}
+
+static inline bool asciichar_is_displayable (char c)
+{
+	if ((c >= 32) && (c<127))
+		return true;
+	return (c == '\r') | (c == '\n') | (c == '\t') | (c == '%');
+}
+
+// SIP tokens allow multiple ways of representing some characters (raw
+// unicode or escaped). This function is used to normalise the content so
+// that two equivalent representation will result in the same TTCN-3
+// charstring.
+//
+void normalise_escaped_string (Charstring& cs) throw (DecodeError)
+{
+	std::string result;
+
+	const unsigned char* p   = cs.GetValueBin();
+	const unsigned char* end = p + (cs.GetLength() / 8);
+
+	for ( ; p!=end ; p++)
+	{
+		unsigned char c;
+
+		if (*p == '%') {
+			// escaped char %xx
+
+			if ((end - p) < 3)
+				goto error_malformed;
+
+			char buff[3] = { p[1], p[2], '\0'};
+			p += 2;
+
+			char* next;
+			c = strtol(buff, &next, 16);
+
+			if (next != &buff[2])
+				goto error_malformed;
+			//TODO: check that the result is UTF-8 valid ?
+		} else {
+			c = *p;
+		}
+
+		if (asciichar_is_displayable(c))
+		{
+			// 7-bit character
+			result += c;
+		} else {
+			// 8-bit character and control characters
+			// -> escape it
+			char buff[4];
+			sprintf (buff, "%%%02x", c);
+			result += buff;
+		}
+	}
+
+	// replace the string with the quoted string
+	{
+		Bytestring& bs = cs;
+		bs.SetValue (result);
+	}
+	return;
+
+error_malformed:
+	DecodeError e(&cs);
+	e.Msg() << "Malformed string: " << cs.GetValue() << endl;
+	throw e;
+}
+
+//WSP: space, htab, vtab, form feed
+#define SIPCHARS_WSP		" \t\v\f"
+#define SIPREG_LWS		"(?:[" SIPCHARS_WSP "]*\\r\\n)?[" SIPCHARS_WSP "]+"
+#define SIPREG_SWS		"(?:" SIPREG_LWS ")?"
+
+// move past the possible leading linear whitespaces in the buffer
+void remove_whitespace (Buffer & buffer) {
+	static Regex reg_ws ("^" SIPREG_LWS);
+	if (reg_ws.Match (buffer)) {
+		int nPos = buffer.GetPosition() + reg_ws.GetMatchedLength();
+		buffer.SetPosition (nPos);
+	}
+}
+
+void read_sp (Buffer & buffer, Variable* v) {
+	static Regex reg_ws ("^[ \t]+");
+	reg_ws.AssertMatch (buffer, v);
+	int nPos = buffer.GetPosition() + reg_ws.GetMatchedLength();
+	buffer.SetPosition (nPos);
+}
+
+bool is_sip_scheme (const char * pszScheme) {
+	return strncasecmp(pszScheme, "sip", 3) == 0 || strncasecmp(pszScheme, "sips", 4) == 0;
+}
+
+bool is_tel_scheme (const char * pszScheme) {
+	return strncasecmp(pszScheme, "tel", 3) == 0 || strncasecmp(pszScheme, "fax", 3) == 0 ||
+		strncasecmp(pszScheme, "modem", 5) == 0;
+}
+
+
+
+// Definition of character classes used to be used in the regular expressions
+// (within [])
+#define SIPCHARS_MARK		"\\-_.!~*'()"
+#define SIPCHARS_ALFA		"A-Za-z"
+#define SIPCHARS_ALFANUM	"0-9" SIPCHARS_ALFA
+#define SIPCHARS_HEXA	"0-9A-Fa-f"
+#define SIPCHARS_UNRESERVED	SIPCHARS_ALFANUM SIPCHARS_MARK
+#define SIPCHARS_RESERVED	";/?:@&=+$,"
+#define SIPCHARS_USER_UNRESERVED "&=+$,;?/"
+#define SIPCHARS_UTF8_NONASCII	"\x80-\xFD"
+#define SIPCHARS_TEXT_UTF8CHAR	"\x21-\xFD"
+
+
+// Definition of common regular expression reused many times within the
+// decoder
+//
+// Note: these definitions shall not contain any group match '(' ')' to avoid
+// side effect (the index of the subsequent group match would be shifted)
+// -> all parenthesis group needed should be implemented with '(?:' ')' so
+//    that they are not indexed
+//
+#define SIPREG_ESCAPED	"(%[0-9A-Fa-f]{2})"
+#define SIPREG_TOKEN "[" SIPCHARS_ALFANUM ".!%*_+`'~\\-]+"
+#define SIPREG_TOKEN_NODOT "[" SIPCHARS_ALFANUM "!%*_+`'~\\-]+"
+#define SIPREG_WORD "(?:[][" SIPCHARS_ALFANUM "\\-.!%*_+`'~()<>:\\\\\"/?{}])+"
+#define SIPREG_ASCII_WITHOUT_COMMA "[\\x21-\\x2B\\x2D-\\x7E]+"
+#define SIPREG_TEXT_UTF8_TRIM	"[\x21-\xFD]([\x21-\xFD]|(" SIPREG_LWS "))*"
+
+// sip version
+#define SIPREG_SIP_VERSION "SIP/[0-9]\\.[0-9]"
+
+// header name
+#define SIPREG_HNAME "(?:[][/?:+$" SIPCHARS_UNRESERVED "]|" SIPREG_ESCAPED ")+"
+
+// host name
+#define SIPREG_TOPLABEL	"[" SIPCHARS_ALFA "]([" SIPCHARS_ALFANUM "\\-]*[" SIPCHARS_ALFANUM "])?"
+#define SIPREG_DOMAINLABEL	"[" SIPCHARS_ALFANUM "]([" SIPCHARS_ALFANUM "\\-]*[" SIPCHARS_ALFANUM "])?"
+#define SIPREG_HOSTNAME	"(" SIPREG_DOMAINLABEL "\\.)*" SIPREG_TOPLABEL "\\.?"
+
+#define SIPREG_HCOLON		"[ 	]*:" SIPREG_SWS
+#define SIPREG_COMMA		SIPREG_SWS "[,]" SIPREG_SWS
+#define SIPREG_SEMI			SIPREG_SWS "[;]" SIPREG_SWS
+#define SIPREG_EQUAL		SIPREG_SWS "[=]" SIPREG_SWS
+#define SIPREG_SLASH		SIPREG_SWS "[/]" SIPREG_SWS
+
+// without leading and trailing whitespace
+#define SIPREG_QUOTED_PAIR	"[\\x5C][\\x00-\\x09\\x0B\\x0C\\x0E-\\x7F]"
+#define SIPREG_QUOTED_STRING	"[\"]((" SIPREG_LWS ")|[]!#-[^-~" SIPCHARS_UTF8_NONASCII"]|(" SIPREG_QUOTED_PAIR "))*[\"]"
+#define SIPREG_DISPLAY_NAME "((" SIPREG_TOKEN "(" SIPREG_LWS SIPREG_TOKEN ")*)|(" SIPREG_QUOTED_STRING "))"
+
+#define SIPREG_COMMENT	"[(]((" SIPREG_LWS ")|[\\x21-\\x5B]|[\\x5D-\\xFD]|(" SIPREG_QUOTED_PAIR "))*[)]"
+
+// IPv4
+#define SIPREG_IP4	"([0-9]{1,3}\\.){3}[0-9]{1,3}"
+
+// IPv6
+#define SIPREG_HEX4		"[" SIPCHARS_HEXA "]{1,4}"
+#define SIPREG_HEXSEQ		SIPREG_HEX4 "([:]" SIPREG_HEX4 ")*"
+#define SIPREG_HEXPART	"(((" SIPREG_HEXSEQ ")?[:]{2}(" SIPREG_HEXSEQ ")?)|(" SIPREG_HEXSEQ  "))"
+#define SIPREG_IP6		"[[]" SIPREG_HEXPART "([:]" SIPREG_IP4 ")?[]]"
+
+// host
+#define SIPREG_HOST		"((" SIPREG_HOSTNAME ")|(" SIPREG_IP4 ")|(" SIPREG_IP6 "))"
+#define SIPREG_ABSOLUTE_URI	"([" SIPCHARS_UNRESERVED "/;?:@&=+$,]|" SIPREG_ESCAPED ")+"
+
+// phone number (global or local)
+#define SIPREG_PHONE_NUMBER "(([+][\\-0-9.()]+)|[\\-0-9()*#A-Da-dPpWw]+)"
+
+#define SIPCHARS_PPARAM_UNRESERVED "][/:&+$"
+#define SIPREG_PPARAM		"([" SIPCHARS_PPARAM_UNRESERVED SIPCHARS_UNRESERVED "]|" SIPREG_ESCAPED ")"
+#define SIPREG_PPARAM_ALLOWED	"[" SIPCHARS_PPARAM_UNRESERVED SIPCHARS_UNRESERVED ";=%]+"
+
+#define SIPCHARS_HPARAM_UNRESERVED "][/?:+$"
+#define SIPREG_HPARAM		"([" SIPCHARS_HPARAM_UNRESERVED SIPCHARS_UNRESERVED "]|" SIPREG_ESCAPED ")"
+#define SIPREG_HPARAM_ALLOWED	"[" SIPCHARS_HPARAM_UNRESERVED SIPCHARS_UNRESERVED ";=%]+"
+
+#define SIPREG_TELPARAM_NAME	"[!#$%&'*+\\-.0-9A-Z^_`a-z|~]+"
+#define SIPREG_TELPARAM_VALUE	"([\\x21\\x23-\\x3A\\x3C-\\x7E]+|(" SIPREG_QUOTED_STRING "))"
+#define SIPREG_TELPARAMS		"([;]" SIPREG_TELPARAM_NAME "([=]" SIPREG_TELPARAM_VALUE ")?)+"
+
+#define SIPREG_GPARAM_VALUE "(([" SIPCHARS_ALFANUM ".!%*_+`'~\\-:]+)|(" SIPREG_QUOTED_STRING "))"
+
+// content type parameter
+#define SIPREG_M_PARAMETER	SIPREG_TOKEN SIPREG_EQUAL "(?:" SIPREG_TOKEN "|" SIPREG_QUOTED_STRING ")"
+
+
+bool detect_separator(Regex & reg_separator, Buffer & buffer)
+{
+	bool bRes;
+	if (bRes = reg_separator.Match(buffer))
+		reg_separator.MovePast(buffer);
+	return bRes;
+}
+bool detect_comma(Buffer & buffer)
+{
+	Regex reg_comma ("^" SIPREG_COMMA);
+	return detect_separator(reg_comma, buffer);
+}
+
+bool detect_semi(Buffer & buffer) throw (DecodeError)
+{
+	Regex reg_semi ("^" SIPREG_SEMI);
+	return detect_separator(reg_semi, buffer);
+}
+
+void SipUrl::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_urlParameters && IsPresent(id_urlParameters)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void SipUrl::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csColon;
+	csColon.SetValue(":");
+
+	switch(field_id) {
+	case id_scheme:
+		csColon.Encode(buffer);
+		break;
+	default:
+		break;
+	}
+}
+
+void SipUrl::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+
+	static Regex reg_scheme ("^[" SIPCHARS_ALFA "][" SIPCHARS_ALFANUM "+.\\-]*");
+	static Regex reg_colon ("^[:]");
+	static Regex reg_userinfo ("^(?:[" SIPCHARS_UNRESERVED SIPCHARS_USER_UNRESERVED "]|" SIPREG_ESCAPED ")+(?::(?:[" SIPCHARS_UNRESERVED "&=+$,]|"SIPREG_ESCAPED")*)?[@]");
+	static Regex reg_phone ("^" SIPREG_PHONE_NUMBER);
+	static Regex reg_hostport ("^[][" SIPCHARS_ALFANUM ":.\\-]+");
+	static Regex reg_absolute_uri ("^" SIPREG_ABSOLUTE_URI);
+	static Regex reg_urlParams ("^;" SIPREG_PPARAM_ALLOWED);	
+	static Regex reg_headers ("^[?]" SIPREG_PPARAM_ALLOWED);
+	static Regex reg_telParams ("^" SIPREG_TELPARAMS);
+
+	const char * pszScheme;
+	switch (id) {
+	case id_scheme:
+		reg_scheme.AssertMatch (buffer, this);
+		SetHypFieldLength (id, reg_scheme.GetMatchedLength());
+		break;
+
+	case id_userInfo:
+		reg_colon.AssertMatch(buffer, this);
+		buffer.SetPosition(buffer.GetPosition() + 8);
+		pszScheme = Get_scheme().GetValue();
+		SetHypFieldIsPresent (id,  0);
+		// user-info is not decoded in case of absoluteURI
+		if (is_sip_scheme(pszScheme)) {
+			if (reg_userinfo.Match (buffer)) {
+				SetHypFieldIsPresent (id,  1);
+				SetHypFieldLength (id, reg_userinfo.GetMatchedLength() - 8);
+			}
+		} 
+		// telephone numbers are decoded to the userInfo field
+		else if (is_tel_scheme(pszScheme)){
+			reg_phone.AssertMatch(buffer, this);
+			SetHypFieldIsPresent (id,  1);
+			SetHypFieldLength (id, reg_phone.GetMatchedLength());
+		}
+		else { // absoluteURI
+			if (reg_absolute_uri.Match (buffer)) {
+				SetHypFieldIsPresent (id,  1);
+				SetHypFieldLength(id, reg_absolute_uri.GetMatchedLength());
+			}
+		}
+		break;
+
+	case id_hostPort:
+		pszScheme = Get_scheme().GetValue();
+		if (is_sip_scheme(pszScheme)) {
+			// remove '@'
+			if (IsPresent (id_userInfo)) {
+				buffer.SetPosition(buffer.GetPosition() + 8);
+			}
+			if (reg_hostport.Match (buffer)) {
+				SetHypFieldIsPresent (id,  1);
+				SetHypFieldLength(id, reg_hostport.GetMatchedLength());
+			} else if (IsPresent (id_userInfo)) {
+				reg_hostport.Error(this, buffer);
+			} else {
+				SetHypFieldIsPresent (id,  0);
+			}
+		} else { // tel or absoluteURI
+			SetHypFieldIsPresent(id, 0);
+		}
+		break;
+
+	case id_urlParameters:
+		pszScheme = Get_scheme().GetValue();
+		if (is_sip_scheme(pszScheme) &&	reg_urlParams.Match (buffer)){
+			SetHypFieldIsPresent (id,  1);
+			SetHypFieldLength(id, reg_urlParams.GetMatchedLength());
+		} else if (is_tel_scheme(pszScheme)) {
+			// "tel" parameters have a different syntax (e.g. & is allowed within both id and values)
+			if (reg_telParams.Match (buffer)) {
+				SetHypFieldIsPresent (id,  1);
+				SetHypFieldLength(id, reg_telParams.GetMatchedLength());
+			} else {
+				SetHypFieldIsPresent(id, 0);
+			}
+		}
+		else {
+			SetHypFieldIsPresent(id, 0);
+		}
+		break;
+	case id_headers:
+		pszScheme = Get_scheme().GetValue();
+		if (is_sip_scheme(pszScheme) && reg_headers.Match (buffer)){
+			SetHypFieldIsPresent (id,  1);
+			SetHypFieldLength(id, reg_headers.GetMatchedLength());
+		} else {
+			SetHypFieldIsPresent(id, 0);
+		}
+		break;
+	}
+}
+
+void UserInfo::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csColon;
+	csColon.SetValue(":");
+	
+	switch(field_id) {
+	case id_password:
+		csColon.Encode(buffer);
+		break;
+	default:
+		break;
+	}
+}
+
+void UserInfo::PostEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAt;
+	csAt.SetValue("@");
+
+	csAt.Encode(buffer);
+}
+
+void UserInfo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_username ("^([" SIPCHARS_UNRESERVED SIPCHARS_USER_UNRESERVED "]|" SIPREG_ESCAPED ")+");
+	static Regex reg_colon ("^[:]");
+	static Regex reg_password ("^([&=+$," SIPCHARS_UNRESERVED "]|" SIPREG_ESCAPED ")*");
+	static Regex reg_absolute_uri ("^" SIPREG_ABSOLUTE_URI);
+
+	// absoluteURI is mapped into SipUrl.userInfo.userOrTelephoneSubscriber and requires special handling
+	Variable* parent = GetParent();
+	bool bRequestUri = false;
+	if (parent != NULL) {
+		const char * pszParName = parent->GetTypeName();
+		if (strcmp(pszParName, "SipUrl") == 0) {
+			SipUrl * pSipUrl = dynamic_cast<SipUrl*>(parent);
+			const char * pszScheme = pSipUrl->Get_scheme().GetValue();
+			bRequestUri = !is_sip_scheme(pszScheme);
+		}
+	}
+	Regex * pRegex;
+	switch (id) {
+	case id_userOrTelephoneSubscriber:
+		pRegex = bRequestUri ? &reg_absolute_uri : &reg_username;
+		pRegex->AssertMatch (buffer, this);
+		SetHypFieldLength(id, pRegex->GetMatchedLength());
+		break;
+	case id_password:
+		if(!bRequestUri && reg_colon.Match(buffer)) {
+			buffer.SetPosition(buffer.GetPosition() + 8);
+			SetHypFieldIsPresent (id, 1);
+			reg_password.AssertMatch (buffer, this);
+		} else {
+			SetHypFieldIsPresent (id, 0);
+		}
+		break;
+	}
+}
+
+void UserInfo::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+	if (IsPresent (id_userOrTelephoneSubscriber))
+		normalise_escaped_string (Get_userOrTelephoneSubscriber());
+	if (IsPresent (id_password))
+		normalise_escaped_string (Get_password());
+}
+
+void HostPort::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csColon;
+	csColon.SetValue(":");
+
+	switch(field_id) {
+	case id_portField:
+		if(IsPresent(field_id)) {
+			Get_portField().SetFormat(Integer::AsciiDecimal);
+			csColon.Encode(buffer);
+		}
+		break;
+	default:
+		break;
+	}
+}
+
+void HostPort::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_host ("^" SIPREG_HOST);
+	static Regex reg_colon ("^:");
+
+	switch (id) {
+	case id_host:
+		// host is always present
+		SetHypFieldIsPresent(id, 1);
+		reg_host.AssertMatch (buffer, this);
+		SetHypFieldLength(id, reg_host.GetMatchedLength());
+		break;
+
+	case id_portField:
+		if(reg_colon.Match (buffer)) {
+			buffer.SetPosition(buffer.GetPosition() + 8);
+			SetHypFieldIsPresent (id, 1);
+			Get_portField().SetFormat(Integer::AsciiDecimal);
+		} else {
+			SetHypFieldIsPresent (id, 0);
+		}
+		break;
+	}
+}
+
+void SemicolonParam_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id != 0) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void SemicolonParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_separator ("^" SIPREG_SEMI);
+	if (reg_separator.Match(buffer)) // the separator can be in the beginning
+		reg_separator.MovePast(buffer);
+}
+
+void SemicolonParam_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_semi (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void AmpersandParam_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csAmpersand, csQuestion;
+	csAmpersand.SetValue("&");
+	csQuestion.SetValue("?");
+
+	if(field_id == 0) {
+		csQuestion.Encode(buffer);
+	}
+	else {		
+		csAmpersand.Encode(buffer);
+	}
+}
+
+void AmpersandParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_start ("^[?]");
+	static Regex reg_separator ("^[&]");
+
+	if (!buffer.GetBitsLeft())
+		return;
+	if (GetSize() == 0){
+		reg_start.AssertMatch(buffer, this);
+		buffer.SetPosition(buffer.GetPosition() + 8);
+	}
+	else if (reg_separator.Match(buffer))
+		buffer.SetPosition(buffer.GetPosition() + 8);
+	else
+		SetHypSize(-2);
+}
+
+void CommaParam_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void CommaParam_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	Variable* parent = GetParent();
+	if (parent != NULL) {		
+		const char * pszParName = parent->GetTypeName();
+		if (strcmp(pszParName, "Credentials") == 0 ||
+			strcmp(pszParName, "AuthenticationInfo") == 0){
+			SetHypSize (GetSize() + 1);
+			SetHypAppend (1);
+		}
+	}
+}
+
+void CommaParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
+	if (GetSize() > 0 && !reg_content.Match(buffer)) {
+		SetHypSize(-2);	
+	}
+}
+
+void CommaParam_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
+	if (detect_comma (buffer) && reg_content.Match (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+
+void GenericParam::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csEqual;
+	csEqual.SetValue("=");
+
+	switch(field_id) {
+	case id_paramValue:
+		if(IsPresent(field_id)) {
+			csEqual.Encode(buffer);
+		}
+		break;
+	default:
+		break;
+	}
+}
+
+void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_equal ("^" SIPREG_EQUAL);
+
+	static Regex reg_pparname ("^" SIPREG_PPARAM "+");
+	static Regex reg_pparvalue ("^" SIPREG_PPARAM "*");
+
+	static Regex reg_hparname ("^" SIPREG_HPARAM "+");
+	static Regex reg_hparvalue ("^" SIPREG_HPARAM "*");
+
+	static Regex reg_telparname ("^" SIPREG_TELPARAM_NAME);
+	static Regex reg_telparvalue ("^" SIPREG_TELPARAM_VALUE);
+
+	static Regex reg_gparname ("^" SIPREG_TOKEN);
+	static Regex reg_gparvalue ("^" SIPREG_GPARAM_VALUE);
+
+	Regex * preg_name = NULL;
+	Regex * preg_value;
+	bool bMandatoryParam = false;
+
+	Variable* parent = GetParent();
+	if (parent == NULL)
+		throw DecodeError (this, "Parent type cannot be null\n");
+	const char * pszParName = parent->GetTypeName();
+	if (strcmp(pszParName, "SemicolonParam_List") == 0){
+		parent = parent->GetParent();
+		if (parent != NULL && strcmp (parent->GetTypeName(), "SipUrl") == 0) {
+			SipUrl * pSipUrl = dynamic_cast<SipUrl*>(parent);
+			const char * pszScheme = pSipUrl->Get_scheme().GetValue();
+			if (is_sip_scheme(pszScheme)) {
+				preg_name = &reg_pparname;
+				preg_value = &reg_pparvalue;
+			}
+			else if (is_tel_scheme(pszScheme)) {
+				preg_name = &reg_telparname;
+				preg_value = &reg_telparvalue;
+			}
+		}
+		if (preg_name == NULL) {
+			preg_name = &reg_gparname;
+			preg_value = &reg_gparvalue;
+		}
+	}
+	else if (strcmp(pszParName, "AmpersandParam_List") == 0){
+		preg_name = &reg_hparname;
+		preg_value = &reg_hparvalue;
+		bMandatoryParam = true;
+	}
+	else if (strcmp(pszParName, "CommaParam_List") == 0){
+		preg_name = &reg_gparname;
+		preg_value = &reg_gparvalue;
+	}
+	else {
+		std::string message ("Unexpected parent type of parameter record: '");
+		message += pszParName;
+		message += '\n';
+		throw DecodeError (this, message);
+	}
+	
+	char c;
+	switch (id) {
+	case id_id:
+		preg_name->AssertMatch (buffer, this);
+		SetHypFieldLength (id, preg_name->GetMatchedLength());
+		break;
+	case id_paramValue:
+		if (bMandatoryParam)
+			reg_equal.AssertMatch(buffer, this);
+		if(bMandatoryParam || (buffer.GetBitsLeft() && reg_equal.Match(buffer))) {
+			buffer.SetPosition(buffer.GetPosition() + reg_equal.GetMatchedLength());
+			preg_value->AssertMatch (buffer, this);
+			SetHypFieldIsPresent (id, 1);
+			SetHypFieldLength (id, preg_value->GetMatchedLength());
+		} else {
+			SetHypFieldIsPresent (id, 0);
+		}
+		break;
+	}
+}
+
+
+void RequestLine::PostEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring cs;
+
+	cs.SetValue("\r\n");
+	cs.Encode(buffer);
+}
+
+void RequestLine::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring cs;
+
+	cs.SetValue(" ");
+
+	switch(field_id) {
+	case id_method:
+	case id_requestUri:
+		cs.Encode(buffer);
+		break;
+	default:
+		break;
+	}
+}
+
+void GenericParam::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+	Variable* param_list = GetParent();
+	if (!param_list)
+		return;
+	
+	Variable* parent = param_list->GetParent();
+	if (!parent)
+		return;
+	const char* parent_type = parent->GetTypeName();
+
+	if (strcmp (parent_type, "SipUrl") == 0) {
+		normalise_escaped_string (Get_id());
+	}
+
+	if (IsPresent (id_paramValue))
+	{
+		Charstring& value = Get_paramValue();
+
+		if (value.GetLength() &&
+		    (*value.GetValueBin() == '"')) {
+			normalise_quoted_string (value, true);
+		} else {
+			const char* par_name = Get_id().GetValue();
+			
+			//TODO: add other unescaped params
+			if (strcmp (parent_type, "ViaBody") == 0) {
+				if ((strcmp (par_name, "branch") == 0)
+				 || (strcmp (par_name, "ttl") == 0)
+				 || (strcmp (par_name, "maddr") == 0)
+				 || (strcmp (par_name, "received") == 0))
+					goto skip_escape;
+			} else if (strcmp (parent_type, "From") == 0) {
+				if (strcmp (par_name, "tag") == 0)
+					goto skip_escape;
+			}
+			else if (strcmp (parent_type, "PChargingVector") == 0) {
+			  if (strcmp (par_name, "icid-value") == 0)
+					goto skip_escape;
+			}
+do_escape:
+			normalise_escaped_string (value);
+skip_escape: ;
+
+		}
+	}
+}
+
+void RequestLine::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_method ("^" SIPREG_TOKEN);
+	static Regex reg_request_uri ("[^ \t\n\r]+");
+	static Regex reg_sip_version (SIPREG_SIP_VERSION);
+	switch (id) {
+		case id_method:
+			reg_method.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_method.GetMatchedLength());
+			break;
+		case id_requestUri:
+			read_sp (buffer, this);
+			reg_request_uri.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_request_uri.GetMatchedLength());
+			break;
+		case id_sipVersion:
+			read_sp (buffer, this);
+			reg_sip_version.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_sip_version.GetMatchedLength());
+			break;
+	}
+}
+
+void RequestLine::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_crlf ("^\r\n");
+
+	reg_crlf.AssertMatch (buffer, this);
+	buffer.SetPosition(buffer.GetPosition() + reg_crlf.GetMatchedLength());
+}
+
+const char* Method::msSipMethods[] = { 
+	"ACK_E",
+	"BYE_E",
+	"CANCEL_E",
+	"INVITE_E",
+	"OPTIONS_E",
+	"REGISTER_E",
+	"PRACK_E",
+	"SUBSCRIBE_E", 
+	"NOTIFY_E",
+	"PUBLISH_E",
+	"REFER_E",
+	"UPDATE_E",
+	"MESSAGE_E",
+	"INFO_E",
+	"UNKNOWN_METHOD_E"
+	, "" };
+
+const char* Method::msMethodValues[] = { 
+	"ACK",
+	"BYE",
+	"CANCEL",
+	"INVITE",
+	"OPTIONS",
+	"REGISTER",
+	"PRACK",
+	"SUBSCRIBE", 
+	"NOTIFY",
+	"PUBLISH",
+	"REFER",
+	"UPDATE",
+	"MESSAGE",
+	"INFO"
+	"UNKNOWN_METHOD"
+	, "" };
+
+void Method::Encode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring c;
+	const char ** ppMethod = msSipMethods;
+	const std::string & val = GetValueString();
+
+	int i = 0;
+	while (*(ppMethod[i]) && strcmp(ppMethod[i], val.c_str()) != 0)
+		i++;
+
+	if (*(ppMethod[i]) == 0) {
+		std::string message ("unsupported enum value '");
+		message += val;
+		message += '\n';
+		throw EncodeError (this, message);
+	}
+
+	c.SetValue(msMethodValues[i]);
+	c.Encode(buffer);
+}
+
+void Method::Decode (Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_method ("^" SIPREG_TOKEN);
+
+	reg_method.AssertMatch (buffer, this);
+
+	const char ** ppValue = msMethodValues;
+	const std::string & val = reg_method.GetMatchedString();
+
+	int i = 0;
+	while (*(ppValue[i]) && strcmp(ppValue[i], val.c_str()) != 0) // case sensitive!!!
+		i++;
+
+	if (*(ppValue[i]) == 0) {
+		SetValueString ("UNKNOWN_METHOD_E");
+	} else {
+		SetValueString (msSipMethods[i]);
+	}
+	buffer.SetPosition(buffer.GetPosition() + reg_method.GetMatchedLength());
+}
+
+void StatusLine::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csWS;
+	csWS.SetValue(" ");
+
+	switch(field_id) {
+	case id_statusCode:
+		Get_statusCode().SetFormat(Integer::AsciiDecimal);
+	case id_reasonPhrase:
+		csWS.Encode(buffer);
+		break;
+	default:
+		break;
+	}
+}
+
+void StatusLine::PostEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csCRLF;
+	csCRLF.SetValue("\r\n");
+
+	csCRLF.Encode(buffer);
+}
+
+void StatusLine::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_sip_version (SIPREG_SIP_VERSION);
+	static Regex reg_status_code ("^[0-9]{3}");
+	static Regex reg_phrase ("([" SIPCHARS_RESERVED SIPCHARS_UNRESERVED SIPCHARS_UTF8_NONASCII " \t]|" SIPREG_ESCAPED ")*");
+
+	switch (id) {
+		case id_sipVersion:
+			reg_sip_version.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_sip_version.GetMatchedLength());
+			break;
+		case id_statusCode:
+			read_sp (buffer, this);
+			reg_status_code.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_status_code.GetMatchedLength());
+			Get_statusCode().SetFormat(Integer::AsciiDecimal);
+			break;
+		case id_reasonPhrase:
+			read_sp (buffer, this);
+			reg_phrase.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_phrase.GetMatchedLength());			
+			break;
+	}
+}
+
+void StatusLine::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_crlf ("^\r\n");
+
+	reg_crlf.AssertMatch(buffer, this);
+	reg_crlf.MovePast(buffer);
+
+	normalise_escaped_string (Get_reasonPhrase());
+}
+
+class SipHeaderMap {
+public:
+	struct Entry {
+		Entry (const char* name, const char* abbrev, int id_msg_hdr, const char* id_fdn)
+		 : mName (name), mAbbrev (abbrev), mIdMessageHeader (id_msg_hdr), mIdFieldName (id_fdn)
+		{}
+		const std::string	mName;
+		const std::string	mAbbrev;
+		const int		mIdMessageHeader;
+		const std::string	mIdFieldName;
+	};
+
+	static const Entry& GetByName (const std::string& key)
+	{
+		const mMapName_t& m = msInstance.mMapName;
+		mMapName_t::const_iterator it = m.find (key);
+		if (it != m.end()) {
+			return *it->second;
+		} else {
+			return *msInstance.mUndef;
+		}
+	}
+	
+	static const Entry& GetByIdFieldName (const std::string& key)
+	{
+		const std::map<std::string, Entry*>& m = msInstance.mMapIdFieldName;
+		std::map <std::string, Entry*>::const_iterator it = m.find (key);
+		if (it != m.end()) {
+			return *it->second;
+		} else {
+			return *msInstance.mUndef;
+		}
+	}
+	
+	static const Entry& GetByIdMessageHeader (int key)
+	{
+		const std::map<int, Entry*>& m = msInstance.mMapIdMessageHeader;
+		std::map <int, Entry*>::const_iterator it = m.find (key);
+		if (it != m.end()) {
+			return *it->second;
+		} else {
+			return *msInstance.mUndef;
+		}
+	}
+
+
+private:
+	void AddEntry (const Entry& entry) {
+		mEntries.push_back(entry);
+		Entry& e = *mEntries.rbegin();
+		
+		//TODO: check unicity
+		mMapName[e.mName] = &e;
+		mMapName[e.mAbbrev] = &e;
+		mMapIdMessageHeader[e.mIdMessageHeader] = &e;
+		mMapIdFieldName[e.mIdFieldName] = &e;
+	}
+
+	SipHeaderMap() {
+
+#define SIP_HEADER_ADD(name, abbr, msghdr, fdname)	AddEntry (Entry (#name, #abbr, MessageHeader::id_ ## msghdr, #fdname));
+
+		//		Name		Abbrev	MessageHeader	FieldName
+		//					field id	field id
+		SIP_HEADER_ADD (From,		f,	fromField,	FROM_E);
+		SIP_HEADER_ADD (Via,		v,	via,		VIA_E);
+		SIP_HEADER_ADD (Accept,		 ,	accept,		ACCEPT_E);
+		SIP_HEADER_ADD (Call-ID,	i,	callId,		CALL_ID_E);
+		SIP_HEADER_ADD (CSeq,		 ,	cSeq,		CSEQ_E);
+		SIP_HEADER_ADD (Content-Length,	l,	contentLength,	CONTENT_LENGTH_E);
+		SIP_HEADER_ADD (Content-Type,	c,	contentType,	CONTENT_TYPE_E);
+		SIP_HEADER_ADD (Contact,	m,	contact,		CONTACT_E);
+		SIP_HEADER_ADD (To,			t,	toField,		TO_E);
+		SIP_HEADER_ADD (Accept-Encoding,	,	acceptEncoding,	ACCEPT_ENCODING_E);
+		SIP_HEADER_ADD (Accept-Language,	,	acceptLanguage,	ACCEPT_LANGUAGE_E);
+		SIP_HEADER_ADD (Max-Forwards,	,	maxForwards,	MAX_FORWARDS_E);
+		SIP_HEADER_ADD (Alert-Info,		,	alertInfo,	ALERT_INFO_E);
+		SIP_HEADER_ADD (Require,	,	require,	REQUIRE_E);
+		SIP_HEADER_ADD (Proxy-Require,	,	proxyRequire,	PROXY_REQUIRE_E);
+		SIP_HEADER_ADD (Record-Route,	,	recordRoute,	RECORD_ROUTE_E);
+		SIP_HEADER_ADD (Allow,		 ,	allow,		ALLOW_E);
+		SIP_HEADER_ADD (Authentication-Info,	,	authenticationInfo,	AUTHENTICATION_INFO_E);
+		SIP_HEADER_ADD (Authorization,	,	authorization,	AUTHORIZATION_E);
+		SIP_HEADER_ADD (Call-Info,		,	callInfo,		CALL_INFO_E);
+		SIP_HEADER_ADD (Content-Disposition,	,	contentDisposition,	CONTENT_DISPOSITION_E);
+		SIP_HEADER_ADD (Content-Encoding,	e,	contentEncoding,	CONTENT_ENCODING_E);
+		SIP_HEADER_ADD (Content-Language,	,	contentLanguage,	CONTENT_LANGUAGE_E);
+		SIP_HEADER_ADD (Date,		 ,	date,		DATE_E);
+		SIP_HEADER_ADD (Error-Info,		,	errorInfo,	ERROR_INFO_E);
+		SIP_HEADER_ADD (Expires,	,	expires,	EXPIRES_E);
+		SIP_HEADER_ADD (In-Reply-To,	,	inReplyTo,	IN_REPLY_TO_E);
+		SIP_HEADER_ADD (MIME-Version,	,	mimeVersion,	MIME_VERSION_E);
+		SIP_HEADER_ADD (Min-Expires,	,	minExpires,	MIN_EXPIRES_E);
+		SIP_HEADER_ADD (Organization,	,	organization,	ORGANIZATION_E);
+		SIP_HEADER_ADD (Priority,	,	priority,	PRIORITY_E);
+		SIP_HEADER_ADD (Proxy-Authenticate,		,	proxyAuthenticate,	PROXY_AUTHENTICATE_E);
+		SIP_HEADER_ADD (Proxy-Authorization,	,	proxyAuthorization,	PROXY_AUTHORIZATION_E);
+		SIP_HEADER_ADD (Reply-To,	,	replyTo,	REPLY_TO_E);
+		SIP_HEADER_ADD (Retry-After,	,	retryAfter,	RETRY_AFTER_E);
+		SIP_HEADER_ADD (Route,		,	route,		ROUTE_E);
+		SIP_HEADER_ADD (Server,		,	server,		SERVER_E);
+		SIP_HEADER_ADD (Supported,	,	supported,	SUPPORTED_E);
+		SIP_HEADER_ADD (Subject,	s,	subject,	SUBJECT_E);
+		SIP_HEADER_ADD (Timestamp,	,	timestamp,	TIMESTAMP_E);
+		SIP_HEADER_ADD (Unsupported,	,	unsupported,	UNSUPPORTED_E);
+		SIP_HEADER_ADD (User-Agent,	,	userAgent,	USER_AGENT_E);
+		SIP_HEADER_ADD (Warning,	,	warning,	WARNING_E);
+		SIP_HEADER_ADD (WWW-Authenticate,		,	wwwAuthenticate,	WWW_AUTHENTICATE_E);
+		SIP_HEADER_ADD (RSeq,		,	rSeq,		RSEQ_E);
+		SIP_HEADER_ADD (RAck,		,	rAck,		RACK_E);
+		SIP_HEADER_ADD (Allow-Events,	u,	allowEvents,	ALLOW_EVENTS_E);
+		SIP_HEADER_ADD (Event,		o,	event,		EVENT_E);
+		SIP_HEADER_ADD (Subscription-State,		,	subscriptionState,	SUBSCRIPTION_STATE_E);
+		SIP_HEADER_ADD (P-Media-Authorization,	,	pMediaAuthorization,	P_MEDIA_AUTHORIZATION_E);
+		SIP_HEADER_ADD (Privacy,	,	privacy,	PRIVACY_E);
+		SIP_HEADER_ADD (P-Asserted-Identity,	,	pAssertedID,	P_ASSERTED_ID_E);
+		SIP_HEADER_ADD (P-Preferred-Identity,	,	pPreferredID,	P_PREFERRED_ID_E);
+		SIP_HEADER_ADD (Reason,		,	reason,		REASON_E);
+		SIP_HEADER_ADD (Path,		,	path,		PATH_E);
+		SIP_HEADER_ADD (Security-Client,		,	securityClient,		SECURITY_CLIENT_E);
+		SIP_HEADER_ADD (Security-Server,		,	securityServer,		SECURITY_SERVER_E);
+		SIP_HEADER_ADD (Security-Verify,		,	securityVerify,		SECURITY_VERIFY_E);
+		SIP_HEADER_ADD (P-Associated-URI,		,	pAssociatedURI,		P_ASSOCIATED_URI_E);
+		SIP_HEADER_ADD (P-Called-Party-ID,		,	pCalledPartyID,		P_CALLED_PARTY_E);
+		SIP_HEADER_ADD (P-Visited-Network-ID,	,	pVisitedNetworkID,	P_VISITED_NETWORK_E);
+		SIP_HEADER_ADD (P-Access-Network-Info,	,	pAccessNetworkInfo,	P_ACCESS_NETWORK_INFO_E);
+		SIP_HEADER_ADD (P-Charging-Function-Addresses,	,	pChargingFunctionAddresses,		P_CHARGING_FUNCTION_ADDRESSES_E);
+		SIP_HEADER_ADD (P-Charging-Vector,		,	pChargingVector,	P_CHARGING_VECTOR_E);
+		SIP_HEADER_ADD (Refer-To,	r,	referTo,	REFER_TO_E);
+		SIP_HEADER_ADD (Replaces,		,	replaces,	REPLACES_E);
+		SIP_HEADER_ADD (Service-Route,			,	serviceRoute,		SERVICE_ROUTE_E);
+		SIP_HEADER_ADD (Accept-Contact,			a,	acceptContact,		ACCEPT_CONTACT_E);
+		SIP_HEADER_ADD (Referred-By,	b,	referredBy,	REFERRED_BY_E);
+		SIP_HEADER_ADD (Session-Expires,		,	sessionExpires,		SESSION_EXPIRES_E);
+		SIP_HEADER_ADD (Min-SE,		,	minSE,		MIN_SE_E);
+		SIP_HEADER_ADD (History-Info,			,	historyInfo,		HISTORY_INFO_E);
+		SIP_HEADER_ADD (P-Early-Media,			,	pEarlyMedia,		P_EARLY_MEDIA_E);
+		SIP_HEADER_ADD (UserToUser,		,	userToUser,	USER_TO_USER_E);
+		SIP_HEADER_ADD (P-Asserted-Service,		,	pAssertedService,		P_ASSERTED_SERVICE_E);		
+		{
+			mEntries.push_back(Entry("", "", MessageHeader::id_undefinedHeader_List, ""));
+			Entry& e = *mEntries.rbegin();
+			mMapIdMessageHeader[e.mIdMessageHeader] = &e;
+			mUndef = &e;
+		}
+	}
+
+	static SipHeaderMap		msInstance;
+
+	std::list<Entry>		mEntries;
+	Entry*				mUndef;
+
+	class StringCaseInsensitiveComparator
+	{
+	public:
+		bool operator() (const std::string& a, const std::string& b) const
+		{
+			return (strcasecmp (a.c_str(), b.c_str()) < 0);
+		}
+	};
+
+	typedef std::map <std::string, Entry*, StringCaseInsensitiveComparator>	mMapName_t;
+	mMapName_t			mMapName;
+	std::map <std::string, Entry*>	mMapIdFieldName;
+	std::map <int, Entry*>		mMapIdMessageHeader;
+
+};
+
+SipHeaderMap SipHeaderMap::msInstance;
+
+void MessageHeader::PostEncode (Buffer& buffer) throw (EncodeError) 
+{
+ 	Charstring csCRLF;
+	csCRLF.SetValue("\r\n");
+
+	csCRLF.Encode(buffer);	
+}
+
+void MessageHeader::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError) 
+{
+ 	Charstring csCRLF;
+	csCRLF.SetValue("\r\n");
+
+	if(IsPresent(field_id) && field_id != id_undefinedHeader_List) {
+		csCRLF.Encode(buffer);
+	}
+}
+
+void MessageHeader::PreDecodeField (Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_header_name ("^(" SIPREG_TOKEN ")" SIPREG_HCOLON);
+	static Regex reg_crlf ("^\r\n");
+
+	if (reg_crlf.Match (buffer)) {
+		reg_crlf.MovePast (buffer);
+		SetHypNextField (-2); // end of the headers
+	} else {
+		reg_header_name.AssertMatch (buffer, this);
+
+		const SipHeaderMap::Entry& hdr = SipHeaderMap::GetByName(reg_header_name.GetMatchedString (1));
+		int id = hdr.mIdMessageHeader;
+
+		std::cerr << "biiiiiip " << reg_header_name.GetMatchedString(1) << std::endl;
+
+
+
+		// check that this field is not duplicated
+		if (IsPresent(id)) {
+			switch (id) {
+			case id_accept:
+			case id_acceptEncoding:
+			case id_acceptLanguage:
+			case id_alertInfo:
+			case id_allow:
+			case id_authorization:
+			case id_contact:
+			case id_contentEncoding:
+			case id_contentLanguage:
+			case id_errorInfo:
+			case id_inReplyTo:
+			case id_proxyAuthorization:
+			case id_proxyRequire:
+			case id_recordRoute:
+			case id_require:
+			case id_route:
+			case id_supported:
+			case id_unsupported:
+			case id_via:
+			case id_warning:
+			case id_allowEvents:
+			case id_pMediaAuthorization:
+			case id_pAssertedID:
+			case id_pPreferredID:
+			case id_reason:
+			case id_path:
+			case id_securityClient:
+			case id_securityServer:
+			case id_securityVerify:
+			case id_pAssociatedURI:
+			case id_pCalledPartyID:
+			case id_pVisitedNetworkID:
+			case id_acceptContact:
+			case id_historyInfo:
+			case id_pEarlyMedia:
+			case id_undefinedHeader_List:
+				// these fields can appear multiple times
+				break;
+			default:
+				DecodeError e (this);
+				e.Msg() << "Duplicated field in the message: "
+					<< hdr.mName << std::endl; 
+				throw (e);
+			}
+		}
+		SetHypNextField (id);
+	}
+}
+
+void MessageHeader::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_crlf ("^\r\n");
+	reg_crlf.AssertMatch (buffer, this);
+	buffer.SetPosition(buffer.GetPosition() + reg_crlf.GetMatchedLength());
+}
+
+
+const char* FieldName::msFields[] = { 
+        "ACCEPT_E",
+        "ACCEPT_ENCODING_E",
+        "ACCEPT_LANGUAGE_E",
+        "ALERT_INFO_E",
+        "ALLOW_E",
+        "AUTHENTICATION_INFO_E",
+        "AUTHORIZATION_E",
+        "CALL_ID_E",
+        "CALL_INFO_E",
+        "CONTACT_E",
+        "CONTENT_DISPOSITION_E",
+        "CONTENT_ENCODING_E",
+        "CONTENT_LANGUAGE_E",
+        "CONTENT_LENGTH_E",
+        "CONTENT_TYPE_E",
+        "CSEQ_E",
+        "DATE_E",
+        "ERROR_INFO_E",
+        "EXPIRES_E",
+        "FROM_E",
+        "IN_REPLY_TO_E",
+        "MAX_FORWARDS_E",
+        "MIME_VERSION_E",
+        "MIN_EXPIRES_E",
+        "ORGANIZATION_E",
+        "PRIORITY_E",
+        "PROXY_AUTHENTICATE_E",
+        "PROXY_AUTHORIZATION_E",
+        "PROXY_REQUIRE_E",
+        "RECORD_ROUTE_E",
+        "REPLY_TO_E",
+        "REQUIRE_E",
+        "RETRY_AFTER_E",
+        "ROUTE_E",
+        "SERVER_E",
+        "SUBJECT_E",
+        "SUPPORTED_E",
+        "TIMESTAMP_E",
+        "TO_E",
+        "UNSUPPORTED_E",
+        "USER_AGENT_E",
+        "VIA_E",
+        "WARNING_E",
+        "WWW_AUTHENTICATE_E",
+	"RACK_E",
+	"RSEQ_E",
+	"ALLOW_EVENTS_E",
+	"EVENT_E",
+	"SUBSCRIPTION_STATE_E",
+	"P_MEDIA_AUTHORIZATION_E",
+	"PRIVACY_E",
+	"P_ASSERTED_ID_E",
+	"P_PREFERRED_ID_E", 
+	"REASON_E",
+	"REFER_TO_E",
+	"REFERRED_BY_E",
+	"HISTORY_INFO_E",
+	"P_MEDIA_AUTH_E",
+	"PATH_E",	
+	"SECURITY_CLIENT_E",	
+	"SECURITY_SERVER_E",
+	"SECURITY_VERIFY_E",  
+	"P_ACCESS_NETWORK_INFO_E",
+	"P_ASSOCIATED_URI_E",
+	"P_CALLED_PARTY_E",
+	"P_CHARGING_FUNCTION_ADDRESSES_E",
+	"P_CHARGING_VECTOR_E",
+	"P_VISITED_NETWORK_E",
+	"SERVICE_ROUTE_E",
+	"ACCEPT_CONTACT_E",
+	"MIN_SE_E",
+	"SESSION_EXPIRES_E",
+	"P_ASSERTED_SERVICE_E",
+	"P_EARLY_MEDIA_E"
+	, "" };
+
+void FieldName::Encode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring c;
+
+	c.SetValue ((SipHeaderMap::GetByIdFieldName(GetValueString()).mName + ": ").c_str());
+	c.Encode(buffer);
+}
+
+void FieldName::Decode (Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_header_name ("^([A-Za-z\\-]+)" SIPREG_HCOLON);
+
+	reg_header_name.AssertMatch (buffer, this);
+	SetValueString (SipHeaderMap::GetByName(reg_header_name.GetMatchedString (1)).mIdFieldName.c_str());
+	
+	buffer.SetPosition(buffer.GetPosition() + reg_header_name.GetMatchedLength());
+}
+
+void Addr_Union::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_name_addr ("^" SIPREG_DISPLAY_NAME "?" SIPREG_SWS "<[^\\r\\n]*>");
+	
+	mPosition = buffer.GetPosition();
+
+	SetHypChosenId (
+		reg_name_addr.Match (buffer)
+			? id_nameAddr
+			: id_addrSpecUnion
+	);
+}
+
+void Addr_Union::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+	if (GetChosenId() == id_addrSpecUnion) {
+		Variable* parent = GetParent();
+		if (parent && (
+			(strcmp (parent->GetTypeName(), "From") == 0) ||
+			(strcmp (parent->GetTypeName(), "ContactAddress") == 0) ||
+			(strcmp (parent->GetTypeName(), "ReplyTo") == 0) ||
+			(strcmp (parent->GetTypeName(), "To") == 0) ))
+		{
+			// in the case we decoded an address not enclosed in <> in a
+			// From, Contact, Reply-To or To header, then we must ensure
+			// that it does not contain comma, semicolon or question mark
+
+			const unsigned char* start = buffer.GetValueBin() + (mPosition/8);
+			const unsigned char* end   = buffer.GetValueBin() + (buffer.GetPosition()/8);
+			
+			for (const unsigned char* p=start ; p!=end ; p++) {
+				switch (*p) {
+				case ';':
+					Get_addrSpecUnion().SetField (SipUrl::id_urlParameters, new Undef);
+				case '?':
+					Get_addrSpecUnion().SetField (SipUrl::id_headers, new Undef);
+					buffer.SetPosition ((p-start) * 8 + mPosition);
+					goto finished;
+				case ',':
+					throw DecodeError (this, "Url must not contain unescaped comma, semicolor or question mark if it is not enclosed with <>\n");
+				default: ;
+				}
+			}
+			finished: ;
+		}
+	}
+}
+
+void ContactBody::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_asterisk ("^[*]");
+	if (reg_asterisk.Match (buffer)) {
+		if (GetChosenId() == id_contactAddresses)
+			throw DecodeError (this, "cannot process wildcard; contactAddresses option is already selected\n");
+		SetHypChosenId (id_wildcard);
+		SetHypFieldLength(id_wildcard, 8);
+	} else {
+		if (GetChosenId() == id_wildcard)
+			throw DecodeError (this, "cannot process address list; wildcart option is already selected\n");
+		SetHypChosenId (id_contactAddresses);
+	}
+}
+
+void ContactAddress_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void ContactAddress_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void ContactAddress_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void ContactAddress::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_contactParams && IsPresent(id_contactParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void ContactAddress::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_semicolon ("^" SIPREG_SEMI);
+	if (id == id_contactParams) {
+		if(reg_semicolon.Match(buffer)) {
+			SetHypFieldIsPresent (id, 1);
+		} else {
+			SetHypFieldIsPresent (id, 0);
+		}
+	}
+}
+
+void From::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_fromParams && IsPresent(id_fromParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void From::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_semicolon ("^;");
+	if (id == id_fromParams) {
+		if(reg_semicolon.Match(buffer)) {
+			SetHypFieldIsPresent (id, 1);
+		} else {
+			SetHypFieldIsPresent (id, 0);
+		}
+	}
+}
+
+void To::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_toParams && IsPresent(id_toParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void To::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_semicolon ("^;");
+	if (id == id_toParams) {
+		if(reg_semicolon.Match(buffer)) {
+			SetHypFieldIsPresent (id, 1);
+		} else {
+			SetHypFieldIsPresent (id, 0);
+		}
+	}
+}
+
+void ReplyTo::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_replyToParams && IsPresent(id_replyToParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void ReplyTo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_semicolon ("^;");
+	if (id == id_replyToParams) {
+		if(reg_semicolon.Match(buffer)) {
+			SetHypFieldIsPresent (id, 1);
+		} else {
+			SetHypFieldIsPresent (id, 0);
+		}
+	}
+}
+
+void Accept::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
+	static Regex reg_accept_args ("^[^;,\\r\\n]");
+	if (id == id_acceptArgs){
+		if(reg_accept_args.Match(buffer) || Get_acceptArgs().GetSize() > 0) {
+			SetHypFieldIsPresent (id, 1);
+		} else if (Get_acceptArgs().GetSize() == 0){
+			SetHypFieldIsPresent (id, 0);
+		}
+	}
+}
+
+void AcceptBody::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_acceptParam && IsPresent(id_acceptParam)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void AcceptBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_media_range ("^[^" SIPCHARS_WSP ";,\\r\\n]+");
+	static Regex reg_semicolon ("^" SIPREG_SEMI);
+	switch (id){
+		case id_mediaRange:
+			reg_media_range.AssertMatch (buffer, this);
+			SetHypFieldLength(id, reg_media_range.GetMatchedLength());
+			break;
+		case id_acceptParam:
+			if (reg_semicolon.Match (buffer) ) {
+				SetHypFieldIsPresent(id, 1);
+			} else {
+				SetHypFieldIsPresent(id, 0);
+			}
+	}
+}
+
+void AcceptBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void AcceptBody_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	// we assume that we are decoding one field at onece 
+	// multiple fields are handled by successively decoding
+	// the via field several times in MessageHeader
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void AcceptBody_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
+	if (GetSize() > 0 && !reg_content.Match(buffer)) {
+		SetHypSize(-2);	
+	}
+}
+
+void AcceptBody_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
+	if (detect_comma (buffer) && reg_content.Match (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void AcceptEncoding::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
+	static Regex reg_content_coding ("^[^,\\r\\n]");
+	if (id == id_contentCoding){
+		if(reg_content_coding.Match(buffer) || 
+			Get_contentCoding().GetSize() > 0) {
+			SetHypFieldIsPresent (id, 1);
+		} else {
+			SetHypFieldIsPresent (id, 0);
+		}
+	}
+}
+
+void ContentCoding_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void ContentCoding_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
+	if (GetSize() == 0)
+		reg_content.AssertMatch(buffer, this);
+	else if (!reg_content.Match(buffer)) {
+		SetHypSize(-2);
+		return;
+	}
+	SetHypFieldLength(reg_content.GetMatchedLength());
+}
+
+
+void ContentCoding_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
+	if (detect_comma (buffer) && reg_content.Match (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void AcceptLanguage::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
+	static Regex reg_language_body ("^[^;,\\r\\n]");
+	if (id == id_languageBody){
+		if(reg_language_body.Match(buffer) ||
+			Get_languageBody().GetSize() > 0) {
+			SetHypFieldIsPresent (id, 1);
+		} else {
+			SetHypFieldIsPresent (id, 0);
+		}
+	}
+}
+
+void LanguageBody::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_acceptParam && IsPresent(id_acceptParam)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void LanguageBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_language_range ("^[^" SIPCHARS_WSP ";,\\r\\n]+");
+	static Regex reg_semicolon ("^" SIPREG_SEMI);
+	switch (id){
+		case id_languageRange:
+			reg_language_range.AssertMatch (buffer, this);
+			SetHypFieldLength(id, reg_language_range.GetMatchedLength());
+			break;
+		case id_acceptParam:
+			if (reg_semicolon.Match (buffer)) {
+				SetHypFieldIsPresent(id, 1);
+			} else {
+				SetHypFieldIsPresent(id, 0);
+			}
+	}
+}
+
+void LanguageBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError) 
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void LanguageBody_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	// we assume that we are decoding one field at onece 
+	// multiple fields are handled by successively decoding
+	// the via field several times in MessageHeader
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void LanguageBody_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) {
+	static Regex reg_language ("^[^" SIPCHARS_WSP ";,\\r\\n]+");
+	if (!reg_language.Match(buffer)) {
+		SetHypSize(-2);
+		return;
+	}
+}
+
+void LanguageBody_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_language ("^[^" SIPCHARS_WSP ";,\\r\\n]+");
+	if (detect_comma (buffer) && reg_language.Match (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void MaxForwards::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Get_forwards().SetFormat(Integer::AsciiDecimal);
+}
+
+void MaxForwards::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	Get_forwards().SetFormat(Integer::AsciiDecimal);
+}
+
+void AlertInfo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
+	static Regex reg_alert_info ("^[^;,\\r\\n]");
+	if (id == id_alertInfoBody){
+		if(reg_alert_info.Match(buffer) || Get_alertInfoBody().GetSize() > 0) {
+			SetHypFieldIsPresent (id, 1);
+		} else {
+			SetHypFieldIsPresent (id, 0);
+		}
+	}
+}
+
+void AlertInfoBody::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csLeftAngle, csSemi;
+	csLeftAngle.SetValue("<");
+	csSemi.SetValue(";");
+
+ 	if(field_id == id_url) {
+		csLeftAngle.Encode(buffer);
+	}
+
+	if(field_id == id_genericParams && IsPresent(id_genericParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void AlertInfoBody::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csRightAngle;
+	csRightAngle.SetValue(">");
+
+ 	if(field_id == id_url) {
+		csRightAngle.Encode(buffer);
+	}
+}
+
+void AlertInfoBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_url ("^<" SIPREG_ABSOLUTE_URI ">");
+	static Regex reg_semicolon ("^" SIPREG_SEMI);
+	switch (id){
+		case id_url:
+			reg_url.AssertMatch (buffer, this);
+			buffer.SetPosition(buffer.GetPosition() + 8);
+			SetHypFieldLength(id, reg_url.GetMatchedLength() - 16);
+			break;
+		case id_genericParams:
+			if (reg_semicolon.Match (buffer)) {
+				SetHypFieldIsPresent(id, 1);
+			} else {
+				SetHypFieldIsPresent(id, 0);
+			}
+	}
+}
+
+void AlertInfoBody::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	switch (id){
+		case id_url:
+			buffer.SetPosition(buffer.GetPosition() + 8);
+			break;
+	}
+}
+
+void AlertInfoBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void AlertInfoBody_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	// we assume that we are decoding one field at onece 
+	// multiple fields are handled by successively decoding
+	// the via field several times in MessageHeader
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void AlertInfoBody_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void Allow::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
+	static Regex reg_allow ("^[^,\\r\\n]");
+	if (id == id_methods){
+		if(reg_allow.Match(buffer) || Get_methods().GetSize() > 0) {
+			SetHypFieldIsPresent (id, 1);
+		} else {
+			SetHypFieldIsPresent (id, 0);
+		}
+	}
+}
+
+void Method_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void Method_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	// we assume that we are decoding one field at onece 
+	// multiple fields are handled by successively decoding
+	// the via field several times in MessageHeader
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void Method_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) {
+	static Regex reg_content ("^" SIPREG_TOKEN);
+	
+	if (reg_content.Match (buffer)) {
+		SetHypFieldLength(reg_content.GetMatchedLength());
+	} else {
+		SetHypSize(-2);
+		return;
+	} 
+}
+
+void Method_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_content ("^" SIPREG_TOKEN);
+
+	if (detect_comma (buffer) && reg_content.Match (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+
+void CredentialsList::PreDecode (Buffer& buffer) throw (DecodeError) {
+  SetHypSize (GetSize() + 1);
+  SetHypAppend (1);
+}
+
+void CredentialsList::PreDecodeField (int id, Buffer& buffer) throw (DecodeError) {
+  
+}
+
+// TODO: Add CredentialsList PreEncode
+
+/*      type record Authorization
+      {
+        FieldName		fieldName (AUTHORIZATION_E),
+		CredentialsList	body // changed from Credentials to allow multiple Authorization headers
+      }*/
+/*      type record ProxyAuthorization
+      {
+        FieldName		fieldName (PROXY_AUTHORIZATION_E),
+        CredentialsList		credentials // changed from Credentials to allow multiple Authorization headers
+      }*/
+
+
+void Credentials::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csDigestWS;
+	csDigestWS.SetValue("Digest ");
+	
+	if(GetChosenId() == id_digestResponse) {
+		csDigestWS.Encode(buffer);
+	}
+}
+
+void Credentials::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_digest ("^[Dd][Ii][Gg][Ee][Ss][Tt]" SIPREG_LWS);
+	if (reg_digest.Match (buffer)) {
+		if (GetChosenId() == id_otherResponse)
+			throw DecodeError (this, "cannot process digest credentials; otherResponse option is already selected\n");
+		buffer.SetPosition(buffer.GetPosition() + reg_digest.GetMatchedLength());
+		SetHypChosenId (id_digestResponse);		
+	} else {
+		if (GetChosenId() == id_digestResponse)
+			throw DecodeError (this, "cannot process custom credentials; digestResponse option is already selected\n");
+		SetHypChosenId (id_otherResponse);
+	}
+}
+
+void Challenge::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csDigestWS;
+	csDigestWS.SetValue("Digest ");
+	
+	if(GetChosenId() == id_digestCln) {
+		csDigestWS.Encode(buffer);
+	}
+}
+
+void Challenge::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_digest ("^[Dd][Ii][Gg][Ee][Ss][Tt]" SIPREG_LWS);
+	if (reg_digest.Match (buffer)) {
+		buffer.SetPosition(buffer.GetPosition() + reg_digest.GetMatchedLength());
+		SetHypChosenId (id_digestCln);
+	} else {
+		SetHypChosenId (id_otherChallenge);
+	}
+}
+
+void OtherAuth::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csWS;
+	csWS.SetValue(" ");
+
+	switch(field_id) {
+	case id_authScheme:
+		csWS.Encode(buffer);
+		break;
+	default:
+		break;
+	}
+}
+
+void OtherAuth::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_auth_scheme ("^" SIPREG_TOKEN);
+	static Regex reg_separator ("^" SIPREG_LWS);
+
+	switch (id){
+		case id_authScheme:
+			reg_auth_scheme.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_auth_scheme.GetMatchedLength());
+			break;
+		case id_authParams:
+			reg_separator.AssertMatch(buffer, this);
+			buffer.SetPosition(buffer.GetPosition() + reg_separator.GetMatchedLength());
+			Get_authParams().SetHypSize (GetSize() + 1);
+			Get_authParams().SetHypAppend (1);
+			break;
+	}
+}
+
+void CallInfo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
+	static Regex reg_call_info ("^[^;,\\r\\n]");
+	if (id == id_callInfoBody){
+		if(reg_call_info.Match(buffer)) {
+			SetHypFieldIsPresent (id, 1);
+		} else {
+			SetHypFieldIsPresent (id, 0);
+		}
+	}
+}
+
+void CallInfoBody::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csLeftAngle, csSemi;
+	csLeftAngle.SetValue("<");
+	csSemi.SetValue(";");
+
+ 	if(field_id == id_url) {
+		csLeftAngle.Encode(buffer);
+	}
+
+	if(field_id == id_infoParams && IsPresent(id_infoParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void CallInfoBody::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csRightAngle;
+	csRightAngle.SetValue(">");
+
+ 	if(field_id == id_url) {
+		csRightAngle.Encode(buffer);
+	}
+}
+
+void CallInfoBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_url ("^<" SIPREG_ABSOLUTE_URI ">");
+	static Regex reg_semicolon ("^" SIPREG_SEMI);
+	switch (id){
+		case id_url:
+			reg_url.AssertMatch (buffer, this);
+			buffer.SetPosition(buffer.GetPosition() + 8);
+			SetHypFieldLength(id, reg_url.GetMatchedLength() - 16);
+			break;
+		case id_infoParams:
+			if (reg_semicolon.Match (buffer)) {
+				SetHypFieldIsPresent(id, 1);
+			} else {
+				SetHypFieldIsPresent(id, 0);
+			}
+	}
+}
+
+void CallInfoBody::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	switch (id){
+		case id_url:
+			buffer.SetPosition(buffer.GetPosition() + 8);
+			break;
+	}
+}
+
+void CallInfoBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void CallInfoBody_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void ContentDisposition::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_dispositionParams && IsPresent(id_dispositionParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+
+void ContentDisposition::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_disposition_type ("^" SIPREG_TOKEN);
+	static Regex reg_semicolon ("^" SIPREG_SEMI);
+	switch (id){
+		case id_dispositionType:
+			reg_disposition_type.AssertMatch (buffer, this);
+			SetHypFieldLength(id, reg_disposition_type.GetMatchedLength());
+			break;
+		case id_dispositionParams:
+			if (reg_semicolon.Match (buffer)) {
+				SetHypFieldIsPresent(id, 1);
+			} else {
+				SetHypFieldIsPresent(id, 0);
+			}
+	}
+}
+
+void LanguageTag_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void LanguageTag_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void LanguageTag_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
+	reg_content.AssertMatch(buffer, this);
+	SetHypFieldLength(reg_content.GetMatchedLength());	
+}
+
+void LanguageTag_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void Date::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
+	static Regex reg_date ("^[^\\r\\n]+");
+	if (id == id_sipDate){
+		reg_date.AssertMatch(buffer, this);
+		SetHypFieldLength(id, reg_date.GetMatchedLength());
+	}
+}
+
+void ErrorInfo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
+	static Regex reg_error_info ("^[^;,\\r\\n]");
+	if (id == id_errorInfo){
+		if(reg_error_info.Match(buffer) || Get_errorInfo().GetSize() > 0) {
+			SetHypFieldIsPresent (id, 1);
+		} else {
+			SetHypFieldIsPresent (id, 0);
+		}
+	}
+}
+
+void ErrorInfoBody::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csLeftAngle, csSemi;
+	csLeftAngle.SetValue("<");
+	csSemi.SetValue(";");
+
+ 	if(field_id == id_uri) {
+		csLeftAngle.Encode(buffer);
+	}
+
+	if(field_id == id_genericParams && IsPresent(id_genericParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void ErrorInfoBody::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csRightAngle;
+	csRightAngle.SetValue(">");
+
+ 	if(field_id == id_uri) {
+		csRightAngle.Encode(buffer);
+	}
+}
+
+void ErrorInfoBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_uri ("^<" SIPREG_ABSOLUTE_URI ">");
+	static Regex reg_semicolon ("^" SIPREG_SEMI);
+	switch (id){
+		case id_uri:
+			reg_uri.AssertMatch (buffer, this);
+			buffer.SetPosition(buffer.GetPosition() + 8);
+			SetHypFieldLength(id, reg_uri.GetMatchedLength() - 16);
+			break;
+		case id_genericParams:
+			if (reg_semicolon.Match (buffer)) {
+				SetHypFieldIsPresent(id, 1);
+			} else {
+				SetHypFieldIsPresent(id, 0);
+			}
+	}
+}
+
+void ErrorInfoBody::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	switch (id){
+		case id_uri:
+			buffer.SetPosition(buffer.GetPosition() + 8);
+			break;
+	}
+}
+
+void ErrorInfoBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void ErrorInfoBody_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void ErrorInfoBody_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void Expires::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_delta_sec ("^[0-9]+");
+
+	switch (id) {
+	case id_deltaSec: 
+		reg_delta_sec.AssertMatch (buffer, this);
+		SetHypFieldLength (id, reg_delta_sec.GetMatchedLength());
+		break;
+	}
+}
+
+void CallidString_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void CallidString_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void CallidString_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_content ("^" SIPREG_ASCII_WITHOUT_COMMA);
+	reg_content.AssertMatch(buffer, this);
+	SetHypFieldLength(reg_content.GetMatchedLength());
+}
+
+
+void CallidString_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void MimeVersion::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csDot;
+	csDot.SetValue(".");
+
+	switch(field_id) {
+	case id_majorNumber:
+		Get_majorNumber().SetFormat(Integer::AsciiDecimal);
+		break;
+	case id_minorNumber:
+		Get_minorNumber().SetFormat(Integer::AsciiDecimal);
+		csDot.Encode(buffer);
+		break;
+	default:
+		break;
+	}
+}
+
+void MimeVersion::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	Get_majorNumber().SetFormat(Integer::AsciiDecimal);
+	Get_minorNumber().SetFormat(Integer::AsciiDecimal);
+}
+void MimeVersion::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_separator ("^[.]");
+	if (id == id_minorNumber) {
+		reg_separator.AssertMatch (buffer, this);
+		buffer.SetPosition(buffer.GetPosition() + 8);
+	}
+}
+void MinExpires::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_delta_sec ("^[0-9]+");
+
+	switch (id) {
+	case id_deltaSec: 
+		reg_delta_sec.AssertMatch (buffer, this);
+		SetHypFieldLength (id, reg_delta_sec.GetMatchedLength());
+		break;
+	}
+}
+
+void Organization::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_organization ("^(" SIPREG_TEXT_UTF8_TRIM ")*");
+
+	switch (id) {
+	case id_organization: 
+		reg_organization.AssertMatch (buffer, this);
+		SetHypFieldLength (id, reg_organization.GetMatchedLength());
+		break;
+	}
+}
+
+void Priority::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
+	static Regex reg_priority ("^" SIPREG_TOKEN);
+	if (id == id_priorityValue){
+		reg_priority.AssertMatch(buffer, this);
+		SetHypFieldLength(id, reg_priority.GetMatchedLength());
+	}
+}
+
+void RetryAfter::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csLeftPar, csSemi;
+	csLeftPar.SetValue("(");
+	csSemi.SetValue(";");
+
+	if(field_id == id_comment && IsPresent(id_comment)) {
+		csLeftPar.Encode(buffer);
+	}
+
+	if(field_id == id_retryParams && IsPresent(id_retryParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void RetryAfter::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csRightPar;
+	csRightPar.SetValue(")");
+
+	if(field_id == id_comment && IsPresent(id_comment)) {
+		csRightPar.Encode(buffer);
+	}
+}
+
+void RetryAfter::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_delta_sec ("^[0-9]+");
+	static Regex reg_comment ("^" SIPREG_COMMENT);
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) {
+		case id_deltaSec: 
+			reg_delta_sec.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_delta_sec.GetMatchedLength());
+			break;
+		case id_comment:
+			remove_whitespace(buffer);
+			if (reg_comment.Match (buffer)) {
+				SetHypFieldIsPresent(id, 1);
+				SetHypFieldLength (id, reg_comment.GetMatchedLength() - 16);
+				buffer.SetPosition(buffer.GetPosition() + 8);
+			}
+			else
+				SetHypFieldIsPresent(id, 0);
+			break;
+		case id_retryParams:
+			if (reg_separator.Match (buffer))
+				SetHypFieldIsPresent(id, 1);
+			else
+				SetHypFieldIsPresent(id, 0);
+			break;
+	}
+}
+
+void RetryAfter::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_parenthesis ("^[)]");
+	if (id == id_comment && IsPresent(id))
+	{
+		reg_parenthesis.AssertMatch (buffer, this);
+		buffer.SetPosition(buffer.GetPosition() + 8);
+		remove_whitespace(buffer);
+	}
+}
+
+void Subject::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_summary ("^(" SIPREG_TEXT_UTF8_TRIM ")*");
+
+	switch (id) {
+	case id_summary: 
+		reg_summary.AssertMatch (buffer, this);
+		SetHypFieldLength (id, reg_summary.GetMatchedLength());
+		break;
+	}
+}
+
+
+void ServerVal_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csWS;
+	csWS.SetValue(" ");
+
+	if(field_id != 0) {
+		csWS.Encode(buffer);
+	}
+}
+
+void ServerVal_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_content ("^((?:" SIPREG_TOKEN "(?:" SIPREG_SLASH SIPREG_TOKEN ")?)|" SIPREG_COMMENT ")");
+	reg_content.AssertMatch(buffer, this);
+	SetHypFieldLength(reg_content.GetMatchedLength());
+}
+
+void ServerVal_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_separator ("^" SIPREG_LWS);
+	if (reg_separator.Match (buffer)) {
+		reg_separator.MovePast (buffer);
+		SetHypSize (GetSize() + 1);
+	}
+	else
+		SetHypSize (-2);
+}
+
+void Supported::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_content ("^" SIPREG_TOKEN);
+
+	switch (id){
+		case id_optionsTags:
+			if (reg_content.Match (buffer) || Get_optionsTags().GetSize() > 0)
+				SetHypFieldIsPresent(id, 1);
+			else
+				SetHypFieldIsPresent(id, 0);
+			break;
+	}
+}
+
+void NameAddr::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csLeftAngle;
+	csLeftAngle.SetValue("<");
+
+ 	if(field_id == id_addrSpec) {
+		csLeftAngle.Encode(buffer);
+	}
+}
+
+void NameAddr::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csWS, csRightAngle;
+	csWS.SetValue(" ");
+	csRightAngle.SetValue(">");
+
+	switch(field_id) {
+	case id_displayName:
+		if(IsPresent(id_displayName)) {
+			csWS.Encode(buffer);
+		}
+		break;
+	case id_addrSpec:
+		csRightAngle.Encode(buffer);
+		break;
+	default:
+		break;
+	}
+}
+
+void NameAddr::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_display_name ("^" SIPREG_DISPLAY_NAME);
+	static Regex reg_laquot = ("^<");
+	static Regex reg_uri = ("^[^\\r\\n]+");
+
+	remove_whitespace(buffer);
+	switch (id){
+		case id_displayName:
+			if (reg_display_name.Match(buffer)) {
+				SetHypFieldIsPresent (id, 1);
+				SetHypFieldLength (id, reg_display_name.GetMatchedLength());
+			} else {
+				SetHypFieldIsPresent (id, 0);
+			}
+			break;
+		case id_addrSpec:
+			reg_laquot.AssertMatch (buffer, this);
+			buffer.SetPosition(buffer.GetPosition() + 8);
+			reg_uri.AssertMatch(buffer, this);
+			SetHypFieldLength (id, reg_uri.GetMatchedLength());
+			break;
+	}
+}
+
+void NameAddr::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_raquot ("^>");
+
+	reg_raquot.AssertMatch (buffer, this);
+	buffer.SetPosition(buffer.GetPosition() + 8);
+	remove_whitespace(buffer);
+	
+	if (IsPresent (id_displayName)) {
+		if (Get_displayName().GetLength() &&
+		    (*Get_displayName().GetValueBin() == '"'))
+			normalise_quoted_string (Get_displayName(), true);
+	}
+}
+
+void SentProtocol::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSlash;
+	csSlash.SetValue("/");
+
+	if(field_id != id_protocolName) {
+		csSlash.Encode(buffer);
+	}
+}
+
+void SentProtocol::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+
+	if (id) {
+		static Regex reg_slash ("^/");
+		reg_slash.AssertMatch (buffer, this);
+		reg_slash.MovePast (buffer);
+	}
+
+	static Regex reg_sp ("^" SIPREG_TOKEN);
+
+	reg_sp.AssertMatch (buffer, this);
+
+	SetHypFieldLength (id, reg_sp.GetMatchedLength());
+}
+
+void ViaBody::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_viaParams && IsPresent(id_viaParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void ViaBody::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csWS;
+	csWS.SetValue(" ");
+
+	if(field_id == id_sentProtocol) {
+		csWS.Encode(buffer);
+	}
+}
+
+void ViaBody::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_lws ("^" SIPREG_LWS);
+	static Regex reg_semi ("^;");
+
+	switch (id) {
+	case id_sentBy:
+		reg_lws.AssertMatch (buffer, this);
+		reg_lws.MovePast (buffer);
+		break;
+	case id_viaParams:
+		SetHypFieldIsPresent (id, reg_semi.Match (buffer) ? 1 : 0);
+		break;
+	default:
+		;
+	}
+}
+
+void ViaBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void ViaBody_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	// we assume that we are decoding one field at once 
+	// multiple fields are handled by successively decoding
+	// the via field several times in MessageHeader
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void ViaBody_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	Regex reg_comma ("^" SIPREG_COMMA);
+
+	if (reg_comma.Match(buffer)) {
+		reg_comma.MovePast(buffer);
+
+		SetHypSize (GetSize() + 1);
+	}
+}
+
+void UndefinedHeader_List::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csCRLF;
+	csCRLF.SetValue("\r\n");
+
+	csCRLF.Encode(buffer);
+}
+
+void UndefinedHeader_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	// we assume that we are decoding one field at once 
+	// multiple fields are handled by successively decoding
+	// the via field several times in MessageHeader
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void UndefinedHeader::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csColon;
+	csColon.SetValue(": ");
+
+	if(field_id == id_headerName) {
+		csColon.Encode(buffer);
+	}
+}
+
+void UndefinedHeader::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_header_name ("^" SIPREG_TOKEN);
+
+	// TODO: match properly UTF-8 characters
+	// TODO: normalise the value ?...
+	static Regex reg_header_value ("^" SIPREG_HCOLON "(([^\\r\\n]|" SIPREG_SWS ")*)");
+
+	switch (id) {
+	case id_headerName:
+		reg_header_name.AssertMatch (buffer, this);
+		SetHypFieldLength (id, reg_header_name.GetMatchedLength());
+		break;
+	case id_headerValue:
+		reg_header_value.AssertMatch (buffer, this);
+		reg_header_value.MoveAt (buffer, 1);
+		SetHypFieldLength (id, reg_header_value.GetMatchedLength(1));
+		break;
+	default:
+		;
+	}
+}
+
+void UndefinedHeader::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+	normalise_escaped_string (Get_headerValue());
+}
+
+void CallId::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (id == id_callid) {
+		static Regex reg_cid ("^" SIPREG_WORD "(@" SIPREG_WORD ")*" );
+
+		reg_cid.AssertMatch(buffer, this);
+		SetHypFieldLength (id, reg_cid.GetMatchedLength());
+	}
+}
+
+void CSeq::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csWS;
+	csWS.SetValue(" ");
+	
+	switch(field_id) {
+	case id_method:
+		csWS.Encode(buffer);
+		break;
+	case id_seqNumber:
+		Get_seqNumber().SetFormat(Integer::AsciiDecimal);
+		break;
+	default:
+		break;
+	}
+}
+
+void CSeq::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_method ("^" SIPREG_LWS "(" SIPREG_TOKEN ")");
+
+	switch (id) {
+	case id_seqNumber: 
+		Get_seqNumber().SetFormat(Integer::AsciiDecimal);
+		break;
+	case id_method:
+		reg_method.AssertMatch (buffer, this);
+		reg_method.MoveAt (buffer, 1);
+		SetHypFieldLength (id, reg_method.GetMatchedLength(1));
+		break;
+	}
+}
+
+void ContentLength::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Get_len().SetFormat(Integer::AsciiDecimal);
+}
+
+void ContentLength::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	Get_len().SetFormat(Integer::AsciiDecimal);
+}
+
+void ContentType::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_ctype ("^" SIPREG_TOKEN "/" SIPREG_TOKEN "(" SIPREG_SEMI SIPREG_M_PARAMETER ")*");
+	if (id == id_mediaType)
+	{
+		reg_ctype.AssertMatch (buffer, this);
+		SetHypFieldLength (id, reg_ctype.GetMatchedLength());
+	}
+	
+}
+
+#define SIP_MESSAGE_CODET(msgname) \
+void msgname::PostDecodeField (int id, Buffer& buffer) throw (DecodeError) \
+{ \
+	switch (id) { \
+	case id_msgHeader: \
+	  { \
+		/* decide if we have to decode the message body and how to decode it */ \
+		MessageHeader& hdr = Get_msgHeader(); \
+		int content_length = hdr.IsPresent (MessageHeader::id_contentLength) ? hdr.Get_contentLength().Get_len().GetValue() : 0; \
+		if (content_length == 0) { \
+			/* no message body */ \
+			if (hdr.IsPresent (MessageHeader::id_contentType)) \
+				throw DecodeError (this, "the Content-Type field must not be present if the content length is null\n"); \
+ \
+			SetHypFieldIsPresent (id_messageBody, 0); \
+		} else if (content_length > 0) { \
+			/* message body present */ \
+			if (!hdr.IsPresent (MessageHeader::id_contentType)) \
+				throw DecodeError (this, "the Content-Type field must be present if the content length is not null\n"); \
+ \
+			SetHypFieldIsPresent (id_messageBody, 1); \
+			MessageBody::SetHypLength (content_length * 8); \
+			const char* content_type = hdr.Get_contentType().Get_mediaType().GetValue(); \
+			if (strcmp (content_type, "application/sdp") == 0) { \
+				MessageBody::SetHypChosenId (MessageBody::id_sdpMessageBody); \
+			} else { \
+				/* decode as plain text by default */ \
+				MessageBody::SetHypChosenId (MessageBody::id_textplain); \
+			} \
+		} else { \
+			throw DecodeError (this, "Content-Length must not be a negative number\n"); \
+		} \
+		SetHypFieldIsPresent (id_payload, 0); \
+		break; \
+	  } \
+	case id_payload: \
+		if (buffer.GetBitsLeft()) { \
+			DecodeError ex(this); \
+			ex.Msg() << "buffer not fully decoded (" << buffer.GetBitsLeft()/8 << " remaining bytes)" << std::endl; \
+			throw ex; \
+		} \
+		Get_payload().Get_payloadlength().SetValue(buffer.GetLength() / 8); \
+		Get_payload().Get_payloadvalue().SetValueBin(buffer.GetValueBin(), buffer.GetLength()); \
+ \
+		/* replace undisplayable characters with '?' */ \
+		Charstring& payload = Get_payload().Get_payloadvalue(); \
+		int byte_length = buffer.GetLength() / 8; \
+		for (int  i=0 ; i<byte_length ; i++) { \
+			if (!asciichar_is_displayable (payload[i])) \
+				payload[i] = '?'; \
+		} \
+		break; \
+	} \
+}
+
+#define SIP_MESSAGE_CODET_ERROR(msgname) \
+void msgname::PostDecode (Buffer& buffer, DecodeError& e) throw (DecodeError) \
+{ \
+	std::cerr << "###################################################################################" << std::endl; \
+	std::cerr << "###  INVALID SIP MESSAGE RECEIVED                                               ###" << std::endl; \
+	std::cerr << "###                                                                             ###" << std::endl; \
+	e.Dump(std::cerr); \
+	std::cerr << "###-----------------------------------------------------------------------------###" << std::endl; \
+	std::cerr.write (reinterpret_cast<const char*>(buffer.GetValueBin()), buffer.GetLength()/8); \
+	std::cerr << "###################################################################################" << std::endl; \
+	/* tell t3devkit to ignore silently the message */ \
+	throw DecodeIgnoreMessage(e.mVar); \
+}
+
+SIP_MESSAGE_CODET (Response)
+SIP_MESSAGE_CODET_ERROR (Response)
+SIP_MESSAGE_CODET (Request)
+SIP_MESSAGE_CODET_ERROR (Request)
+SIP_MESSAGE_CODET (REGISTER_Request)
+SIP_MESSAGE_CODET_ERROR (REGISTER_Request)
+SIP_MESSAGE_CODET (INVITE_Request)
+SIP_MESSAGE_CODET_ERROR (INVITE_Request)
+SIP_MESSAGE_CODET (OPTIONS_Request)
+SIP_MESSAGE_CODET_ERROR (OPTIONS_Request)
+SIP_MESSAGE_CODET (BYE_Request)
+SIP_MESSAGE_CODET_ERROR (BYE_Request)
+SIP_MESSAGE_CODET (CANCEL_Request)
+SIP_MESSAGE_CODET_ERROR (CANCEL_Request)
+SIP_MESSAGE_CODET (ACK_Request)
+SIP_MESSAGE_CODET_ERROR (ACK_Request)
+SIP_MESSAGE_CODET (PRACK_Request)
+SIP_MESSAGE_CODET_ERROR (PRACK_Request)
+SIP_MESSAGE_CODET (NOTIFY_Request)
+SIP_MESSAGE_CODET_ERROR (NOTIFY_Request)
+SIP_MESSAGE_CODET (SUBSCRIBE_Request)
+SIP_MESSAGE_CODET_ERROR (SUBSCRIBE_Request)
+SIP_MESSAGE_CODET (PUBLISH_Request)
+SIP_MESSAGE_CODET_ERROR (PUBLISH_Request)
+SIP_MESSAGE_CODET (UPDATE_Request)
+SIP_MESSAGE_CODET_ERROR (UPDATE_Request)
+SIP_MESSAGE_CODET (REFER_Request)
+SIP_MESSAGE_CODET_ERROR (REFER_Request)
+SIP_MESSAGE_CODET (MESSAGE_Request)
+SIP_MESSAGE_CODET_ERROR (MESSAGE_Request)
+SIP_MESSAGE_CODET (INFO_Request)
+SIP_MESSAGE_CODET_ERROR (INFO_Request)
+
+void OptionTag_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void OptionTag_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void OptionTag_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_content ("^" SIPREG_TOKEN);
+	
+	bool bMandatory = true;
+	Variable* parent = GetParent();
+	if (parent != NULL) {
+		const char * pszParName = parent->GetTypeName();
+		if (strcmp(pszParName, "Supported") == 0) 
+			bMandatory = false;
+	}
+
+	if (bMandatory || GetSize() == 0)
+		reg_content.AssertMatch(buffer, this);
+	else if (!reg_content.Match (buffer)) {
+		SetHypSize (-2);
+		return;
+	}
+	SetHypFieldLength(reg_content.GetMatchedLength());	
+}
+
+void OptionTag_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_content ("^" SIPREG_TOKEN);
+	if (detect_comma (buffer) && reg_content.Match (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void RouteBody_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void RouteBody_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void RouteBody_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void RouteBody::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_rrParam && IsPresent(id_rrParam)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void RouteBody::PreDecodeField(int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_semi ("^;");
+
+	if (id == id_rrParam) {
+		SetHypFieldIsPresent (id, reg_semi.Match(buffer) ? 1 : 0);
+	}
+}
+
+void Timestamp::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csWS;
+	csWS.SetValue(" ");
+	
+	switch(field_id) {
+	case id_delay:
+		if(IsPresent(id_delay)) {
+			csWS.Encode(buffer);
+		}
+		break;
+	default:
+		break;
+	}
+}
+
+void Timestamp::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_separator ("^" SIPREG_LWS);
+
+	switch (id) {
+	case id_timeValue:
+		SetHypFieldIsPresent (id, 1); //always present (mandatory in BNF)
+		break;
+	case id_delay:
+		if (reg_separator.Match (buffer)) {
+			reg_separator.MovePast (buffer);
+			SetHypFieldIsPresent (id, 1);
+		} else
+			SetHypFieldIsPresent (id, 0);
+		break;
+	}
+}
+
+void TimeValue::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csDot;
+	csDot.SetValue(".");
+
+	switch(field_id) {
+	case id_majorDigit:
+		Get_majorDigit().SetFormat(Integer::AsciiDecimal);
+		break;
+	case id_minorDigit:
+		Get_minorDigit().SetFormat(Integer::AsciiDecimal);
+		csDot.Encode(buffer);
+		break;
+	default:
+		break;
+	}
+}
+
+void TimeValue::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	Get_majorDigit().SetFormat(Integer::AsciiDecimal);
+	Get_minorDigit().SetFormat(Integer::AsciiDecimal);
+}
+
+void TimeValue::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_separator ("^[.]");
+	static Regex reg_digits ("^[0-9]+");
+	switch (id) { 
+		case id_minorDigit:
+			SetHypFieldIsPresent (id,  0);
+			if (reg_separator.Match (buffer)) {
+				reg_separator.MovePast( buffer);
+				if (reg_digits.Match (buffer))
+					SetHypFieldIsPresent(id, 1);
+			}			
+			break;
+	}
+}
+
+void WarningValue_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void WarningValue_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void WarningValue_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void WarningValue::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csWS, csDoubleQuote;
+	csWS.SetValue(" ");
+	csDoubleQuote.SetValue("\"");
+
+	switch(field_id) {
+	case id_warnCode:
+		Get_warnCode().SetFormat(Integer::AsciiDecimal);
+		break;
+	case id_warnText:
+		csWS.Encode(buffer);
+		csDoubleQuote.Encode(buffer);
+		break;
+	case id_warnAgent:
+		csWS.Encode(buffer);
+		break;
+	}
+}
+
+void WarningValue::PostEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csDoubleQuote;
+	csDoubleQuote.SetValue("\"");
+
+	if(field_id == id_warnText) {
+		csDoubleQuote.Encode(buffer);
+	}
+}
+
+void WarningValue::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	Get_warnCode().SetFormat(Integer::AsciiDecimal);
+}
+
+void WarningValue::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_separator ("^[ ]");
+	static Regex reg_text ("^" SIPREG_QUOTED_STRING);
+	switch (id) { 
+		case id_warnAgent:
+			reg_separator.AssertMatch (buffer, this);
+			reg_separator.MovePast (buffer);
+			break;
+		case id_warnText:
+			reg_separator.AssertMatch (buffer, this);
+			reg_separator.MovePast (buffer);
+			reg_text.AssertMatch (buffer, this);
+			buffer.SetPosition(buffer.GetPosition() + 8); // remove starting quota
+			SetHypFieldLength (id, reg_text.GetMatchedLength() - 16);
+			break;
+	}
+}
+
+void WarningValue::PostDecode (Buffer& buffer) throw (DecodeError)
+{
+	buffer.SetPosition(buffer.GetPosition() + 8); // remove ending quota
+
+	normalise_quoted_string (Get_warnText());
+}
+
+void WarnAgent::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_host ("^" SIPREG_HOST "([:][0-9]+)?");
+	static Regex reg_pseudonym ("^" SIPREG_TOKEN);
+	int nLen1 = -1;
+	int nLen2 = -1;
+	if (reg_host.Match (buffer))
+		nLen1 = reg_host.GetMatchedLength();
+	if (reg_pseudonym.Match (buffer))
+		nLen2 = reg_pseudonym.GetMatchedLength();
+	if (nLen2 > nLen1) {
+		SetHypChosenId (id_pseudonym);
+		SetHypFieldLength (id_pseudonym, nLen2);
+	} else
+		SetHypChosenId (id_hostPort);
+}
+
+void RSeq::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Get_responseNum().SetFormat(Integer::AsciiDecimal);
+}
+
+void RSeq::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	Get_responseNum().SetFormat(Integer::AsciiDecimal);
+}
+
+void RAck::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csWS;
+	csWS.SetValue(" ");
+
+
+	switch(field_id) {
+	case id_responseNum:
+		Get_responseNum().SetFormat(Integer::AsciiDecimal);
+		break;
+	case id_seqNumber:
+		Get_seqNumber().SetFormat(Integer::AsciiDecimal);
+	case id_method:
+		csWS.Encode(buffer);
+		break;
+	default:
+		break;
+	}
+}
+
+void RAck::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	Get_responseNum().SetFormat(Integer::AsciiDecimal);
+	Get_seqNumber().SetFormat(Integer::AsciiDecimal);
+}
+
+void RAck::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_separator ("^[ ]");
+	static Regex reg_method ("^" SIPREG_TOKEN);
+	switch (id) { 
+		case id_seqNumber:
+			reg_separator.AssertMatch (buffer, this);
+			reg_separator.MovePast (buffer);
+			break;
+		case id_method:
+			reg_separator.AssertMatch (buffer, this);
+			reg_separator.MovePast (buffer);
+			reg_method.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_method.GetMatchedLength());
+			break;
+	}
+}
+
+void EventType_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void EventType_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void EventType_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_event ("^" SIPREG_TOKEN);
+	reg_event.AssertMatch (buffer, this);
+	SetHypFieldLength (reg_event.GetMatchedLength());
+}
+
+void EventType_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void Event::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_eventParams && IsPresent(id_eventParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void Event::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_event ("^" SIPREG_TOKEN);
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) { 
+		case id_eventType:
+			reg_event.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_event.GetMatchedLength());
+			break;
+		case id_eventParams:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void SubscriptionState::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_substateParams && IsPresent(id_substateParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void SubscriptionState::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_substate ("^" SIPREG_TOKEN);
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) { 
+		case id_subState:
+			reg_substate.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_substate.GetMatchedLength());
+			break;
+		case id_substateParams:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void PMediaAuthorization_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void PMediaAuthorization_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void PMediaAuthorization_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_media_authorization ("^[" SIPCHARS_HEXA "]+");
+	reg_media_authorization.AssertMatch (buffer, this);
+	SetHypFieldLength (reg_media_authorization.GetMatchedLength());
+}
+
+void PMediaAuthorization_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void PrivacyValue_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id != 0) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void PrivacyValue_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_privacy ("^" SIPREG_TOKEN);
+	reg_privacy.AssertMatch (buffer, this);
+	SetHypFieldLength (reg_privacy.GetMatchedLength());
+}
+
+void PrivacyValue_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_semi (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void PAssertedIDValue_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void PAssertedIDValue_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void PAssertedIDValue_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void PPreferredIDValue_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void PPreferredIDValue_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void ReasonValue::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_reasonParams && IsPresent(id_reasonParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void ReasonValue::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_token ("^" SIPREG_TOKEN);
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) { 
+		case id_token:
+			reg_token.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_token.GetMatchedLength());
+			break;
+		case id_reasonParams:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void ReasonValues::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void PathValues::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void ReasonValues::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void ReasonValues::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void PathValue::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_rrParam && IsPresent(id_rrParam)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void PathValue::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) { 
+		case id_rrParam:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void PathValues::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void PathValues::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void SecurityMechanism::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_mechParams && IsPresent(id_mechParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void SecurityMechanism::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_token ("^" SIPREG_TOKEN);
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) { 
+		case id_mechName:
+			reg_token.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_token.GetMatchedLength());
+			break;
+		case id_mechParams:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void SecurityMechanism_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void SecurityMechanism_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void SecurityMechanism_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void NameAddrParam::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_genericParams && IsPresent(id_genericParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void NameAddrParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) { 
+		case id_genericParams:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void NameAddrParam_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void NameAddrParam_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void NameAddrParam_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void VnetworkSpec::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_genericParams && IsPresent(id_genericParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void VnetworkSpec::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_token ("^(" SIPREG_TOKEN ")|(" SIPREG_QUOTED_STRING ")");
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) { 
+		case id_vNetworkSpecToken:
+			reg_token.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_token.GetMatchedLength());
+			break;
+		case id_genericParams:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void VnetworkSpec_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void VnetworkSpec_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void VnetworkSpec_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void PAccessNetworkInfo::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_genericParams && IsPresent(id_genericParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void PAccessNetworkInfo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_token ("^" SIPREG_TOKEN);
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) { 
+		case id_accessType:
+			reg_token.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_token.GetMatchedLength());
+			break;
+		case id_genericParams:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void PChargingFunctionAddresses::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_token ("^" SIPREG_TOKEN);
+	switch (id) { 
+		case id_chargeAddrParams:
+			SetHypFieldIsPresent (id, reg_token.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void PChargingVector::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_token ("^" SIPREG_TOKEN);
+	switch (id) { 
+		case id_chargeParams:
+			SetHypFieldIsPresent (id, reg_token.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void ReferTo::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_referToParams && IsPresent(id_referToParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void ReferTo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) {
+		case id_referToParams:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void AcRcValue_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void AcRcValue_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void AcRcValue_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void AcRcValue::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_acRcParams && IsPresent(id_acRcParams)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void AcRcValue::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_wildcard ("^[*]");
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) { 
+		case id_wildcard:
+			reg_wildcard.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_wildcard.GetMatchedLength());
+			break;
+		case id_acRcParams:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void Replaces::PreEncodeField	(int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id	== id_fieldName &&	IsPresent(id_fieldName))	{
+		csSemi.Encode(buffer);
+	}
+}
+
+void Replaces::PreDecodeField	(int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) {
+		case id_fieldName:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void ReferredBy::PreEncodeField	(int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id	== id_referredbyIdParams &&	IsPresent(id_referredbyIdParams))	{
+		csSemi.Encode(buffer);
+	}
+}
+
+void ReferredBy::PreDecodeField	(int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) {
+		case id_referredbyIdParams:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+/* Nothing to do
+void UserToUser::PreEncodeField	(int field_id, Buffer& buffer) throw (EncodeError)
+{
+}
+
+void UserToUser::PreDecodeField	(int id, Buffer& buffer) throw (DecodeError)
+{
+}*/
+
+void MinSE::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_minSeParam && IsPresent(id_minSeParam)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+
+void MinSE::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_delta_sec ("^[0-9]+");
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) {
+		case id_deltaSec: 
+			reg_delta_sec.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_delta_sec.GetMatchedLength());
+			break;
+		case id_minSeParam:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void IntegerList::PreEncode (Buffer& buffer) throw (EncodeError)
+{
+	Charstring csIndexEqual;
+	csIndexEqual.SetValue("index=");
+
+	csIndexEqual.Encode(buffer);
+}
+
+void IntegerList::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csDot;
+	csDot.SetValue(".");
+
+	if(field_id != 0) {
+		csDot.Encode(buffer);
+	}
+	GetField(field_id).SetFormat(Integer::AsciiDecimal);
+}
+
+void IntegerList::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	SetSize (GetSize() + 1);
+	GetField(id).SetFormat(Integer::AsciiDecimal);
+}
+
+void IntegerList::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	Regex reg_dot ("^[\\x2E]");
+
+	if (detect_separator(reg_dot, buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void HistoryInfoEntry::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csSemi;
+	csSemi.SetValue(";");
+
+	if(field_id == id_hiIndex && IsPresent(id_hiIndex)) {
+		csSemi.Encode(buffer);
+	}
+
+	if(field_id == id_hiExtention && IsPresent(id_hiExtention)) {
+		csSemi.Encode(buffer);
+	}
+}
+
+void HistoryInfoEntry::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_index ("^" SIPREG_SEMI "[Ii][Nn][Dd][Ee][Xx][=]");
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) {
+		case id_hiIndex: 
+			if (reg_index.Match (buffer)) {				
+				reg_index.MovePast (buffer);
+				SetHypFieldIsPresent (id, 1);
+			} else
+				SetHypFieldIsPresent (id, 0);
+			break;
+		case id_hiExtention:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+void HistoryInfo_List::PreEncodeField (int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void HistoryInfo_List::PreDecode (Buffer& buffer) throw (DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void HistoryInfo_List::PostDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void EM_List::PreEncodeField	(int field_id, Buffer& buffer) throw (EncodeError)
+{
+	Charstring csComma;
+	csComma.SetValue(",");
+
+	if(field_id != 0) {
+		csComma.Encode(buffer);
+	}
+}
+
+void EM_List::PreDecodeField	(int id, Buffer& buffer) throw (DecodeError) {
+	static Regex reg_token ("^" SIPREG_TOKEN);
+	if (GetSize() == 0)
+		reg_token.AssertMatch(buffer, this);
+	else if (!reg_token.Match(buffer)) {
+		SetHypSize(-2);
+		return;
+	}
+	SetHypFieldLength(reg_token.GetMatchedLength());
+}
+
+void EM_List::PreDecode (Buffer&	buffer)	throw	(DecodeError)
+{
+	SetHypSize (GetSize() + 1);
+	SetHypAppend (1);
+}
+
+void EM_List::PostDecodeField (int	id,	Buffer&	buffer)	throw	(DecodeError)
+{
+	if (detect_comma (buffer))
+		SetHypSize (GetSize() + 1);
+	else
+		SetHypSize (-2);
+}
+
+void PEarlyMedia::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_token ("^" SIPREG_TOKEN);
+
+	switch (id) {
+		case id_em_param: 
+			if (reg_token.Match (buffer) || Get_em_param().GetSize() > 0) {				
+				SetHypFieldIsPresent (id, 1);
+			} else
+				SetHypFieldIsPresent (id, 0);
+			break;
+	}
+}
+
+/* UserToUser: Nothing to do
+void UserToUser::PreEncodeField	(int field_id, Buffer& buffer) throw (EncodeError)
+{
+
+}
+
+void UserToUser::PreDecodeField	(int id, Buffer& buffer) throw (DecodeError)
+{
+
+}*/
+
+void PAssertedService::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_token ("^" SIPREG_TOKEN);
+
+	switch (id) {
+		case id_pAssertedServiceValue: 
+			reg_token.AssertMatch (buffer, this);
+			SetHypFieldLength(id, reg_token.GetMatchedLength());
+			break;
+	}
+}
+
+
+void MessageBody::PreEncode	(Buffer& buffer) throw (EncodeError)
+{
+  switch (GetChosenId())
+  {
+    case id_xmlBody:
+    case id_xmlMessage:
+    case id_mimeMessageBody:
+      {
+        std::string message ("unsupported field '");
+        message += GetChosenFieldName();
+        message += '\n';
+        throw EncodeError (this, message);
+      }
+      break;
+  }
+}
+
+
+void SessionExpires::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
+{
+	static Regex reg_delta_sec ("^[0-9]+");
+	static Regex reg_separator ("^" SIPREG_SEMI);
+
+	switch (id) {
+		case id_deltaSec: 
+			reg_delta_sec.AssertMatch (buffer, this);
+			SetHypFieldLength (id, reg_delta_sec.GetMatchedLength());
+			break;
+		case id_seParam:
+			SetHypFieldIsPresent (id, reg_separator.Match (buffer) ? 1 : 0);
+			break;
+	}
+}
+
+
+}} // namespaces
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/sip_codets.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/sip_codets.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/c++/sip_codets.h	(revision 22)
@@ -0,0 +1,76 @@
+#ifndef  SIPCODETS_H
+#define  SIPCODETS_H
+
+#include <t3devlib/t3devlib.h>
+
+namespace t3devlib {
+namespace gen {
+
+//
+// Implementation of subtypes defined in the module LibSip_SIPTypesAndValues
+//
+
+// aliases (subtypes without restrictions)
+T3DEVLIB_BASIC_DEFINITION (LibSip_SIPTypesAndValues, CallidString, Charstring);
+T3DEVLIB_BASIC_DEFINITION (LibSip_SIPTypesAndValues, ContentCoding, Charstring);
+T3DEVLIB_BASIC_DEFINITION (LibSip_SIPTypesAndValues, DeltaSec, Charstring);
+T3DEVLIB_BASIC_DEFINITION (LibSip_SIPTypesAndValues, LanguageTag, Charstring);
+T3DEVLIB_BASIC_DEFINITION (LibSip_SIPTypesAndValues, OptionTag, Charstring);
+T3DEVLIB_BASIC_DEFINITION (LibSip_SIPTypesAndValues, ServerVal, Charstring);
+T3DEVLIB_BASIC_DEFINITION (LibSip_SIPTypesAndValues, PAssertedServiceValue, Charstring);
+T3DEVLIB_BASIC_DEFINITION (LibSip_SIPTypesAndValues, PrivacyValue, Charstring);
+T3DEVLIB_BASIC_DEFINITION (LibSip_SIPTypesAndValues, EventType, Charstring);
+T3DEVLIB_BASIC_DEFINITION (LibSip_SIPTypesAndValues, SubState, Charstring);
+T3DEVLIB_BASIC_DEFINITION (LibSip_SIPTypesAndValues, PMediaAuthValue, Charstring); //HEXDIG "0"-"9", "A"-"F"
+T3DEVLIB_BASIC_DEFINITION (LibSip_SIPTypesAndValues, Raw, Charstring);
+
+// subtypes of structured type
+// we just handle them by defining an alias to the base class
+//
+// FIXME: subtypes of structured types is not explicitely allowed in TTCN-3
+// 	  is this valid anyway ?
+#define PAssertedIDValue Addr_Union
+#define PPreferredIDValue Addr_Union
+
+//
+// Implementation of enumerated types (not handled by the generator yet)
+//
+
+class FieldName : public t3devlib::Enum
+{
+private:
+	static const char* msFields[];
+public:
+	FieldName() : Enum (msFields) {}
+
+	const char* GetModuleName() const { return "LibSip_SIPTypesAndValues"; }
+	const char* GetTypeName() const   { return "FieldName"; }
+
+	void Encode (Buffer& buffer) throw (EncodeError);
+	void Decode (Buffer& buffer) throw (DecodeError);
+};
+
+class Method : public t3devlib::Enum
+{
+private:
+	static const char* msSipMethods[];
+	static const char* msMethodValues[];
+public:
+	Method() : Enum (msSipMethods) {}
+
+	const char* GetModuleName() const { return "LibSip_SIPTypesAndValues"; }
+	const char* GetTypeName() const   { return "Method"; }
+
+	void Encode (Buffer& buffer) throw (EncodeError);
+	void Decode (Buffer& buffer) throw (DecodeError);
+};
+
+// definition additional attributes for the Addr_Union class
+// (included automatically in the generated codec)
+#define DEFINITIONS_Addr_Union()	int mPosition;
+
+
+}} //namespaces
+
+#endif
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibCommon_BasicTypesAndValues.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibCommon_BasicTypesAndValues.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibCommon_BasicTypesAndValues.ttcn	(revision 22)
@@ -0,0 +1,220 @@
+/*
+ *	@author 	STF 276
+ *  @version 	$Id$
+ *	@desc		A collection of basic type and value definitions which may be 
+ *				useful in the implementation of any TTCN-3 test suite. <br><br>
+ *  @remark	    End users should be aware that any changes made to the  in
+ *              definitions this module may be overwritten in future releases.
+ *				End users are encouraged to contact the distributers of this  
+ *              module regarding their modifications or additions so that future 
+ *              updates will include your changes.
+ */
+ module LibCommon_BasicTypesAndValues {
+	
+	/* 
+	 *  @remark Number in subtype name always indicates encoding length 
+	 *          in _bits_
+	 */
+	group unsignedIntegerDefintions {
+
+		const integer	c_uInt1Max := 1;
+		const integer	c_uInt2Max := 3;
+		const integer	c_uInt3Max := 7;
+		const integer	c_uInt4Max := 15;
+		const integer	c_uInt5Max := 31;
+		const integer	c_uInt6Max := 63;
+		const integer	c_uInt7Max := 127;
+		const integer	c_uInt8Max := 255;
+		const integer	c_uInt9Max := 511;
+		const integer	c_uInt10Max := 1023;
+		const integer	c_uInt11Max := 2047;
+		const integer	c_uInt12Max := 4095;
+		const integer	c_uInt13Max := 8191;
+		const integer	c_uInt14Max := 16383;
+    	const integer 	c_uInt15Max := 32767;
+		const integer	c_uInt16Max := 65535;
+		const integer	c_uInt17Max := 131071;
+		const integer	c_uInt18Max := 262143;
+		const integer	c_uInt19Max := 524287;
+		const integer 	c_uInt20Max := 1048575;
+		const integer 	c_uInt21Max := 2097151;
+		const integer 	c_uInt22Max := 4194303;
+		const integer 	c_uInt23Max := 8388607;
+		const integer 	c_uInt24Max := 16777215;
+		const integer 	c_uInt25Max := 33554431;
+		const integer 	c_uInt26Max := 67108863;
+		const integer 	c_uInt27Max := 134217727;
+		const integer 	c_uInt28Max := 268435456;
+		const integer 	c_uInt29Max := 536870911;
+		const integer 	c_uInt30Max := 1073741823;
+		const integer 	c_uInt31Max := 2147483647;
+		const integer 	c_uInt32Max := 4294967295;
+
+		const integer 	c_uInt48Max := 281474976710655;
+//		const integer 	c_uInt48Max := 2147483647;
+
+		type integer 	UInt  (0 .. infinity);
+		type integer	UInt1 (0 .. c_uInt1Max) with {encode "length=1;"};
+		type integer	UInt2 (0 .. c_uInt2Max) with {encode "length=2"};
+		type integer	UInt3 (0 .. c_uInt3Max) with {encode "length=3"};
+		type integer	UInt4 (0 .. c_uInt4Max) with {encode "length=4"};
+		type integer	UInt5 (0 .. c_uInt5Max) with {encode "length=5"};
+		type integer	UInt6 (0 .. c_uInt6Max) with {encode "length=6"};
+		type integer	UInt7 (0 .. c_uInt7Max) with {encode "length=7"};
+		type integer	UInt8 (0 .. c_uInt8Max) with {encode "length=8"};
+		type integer	UInt9 (0 .. c_uInt9Max) with {encode "length=9"};
+		type integer	UInt10 (0 .. c_uInt10Max) with {encode "length=10"};
+		type integer	UInt11 (0 .. c_uInt11Max) with {encode "length=11"};
+		type integer	UInt12 (0 .. c_uInt12Max) with {encode "length=12"};
+		type integer	UInt13 (0 .. c_uInt13Max) with {encode "length=13"};
+		type integer	UInt14 (0 .. c_uInt14Max) with {encode "length=14"};
+    	type integer 	UInt15 (0 .. c_uInt15Max) with {encode "length=15"};
+		type integer	UInt16 (0 .. c_uInt16Max) with {encode "length=16"};
+		type integer	UInt17 (0 .. c_uInt17Max) with {encode "length=17"};
+		type integer	UInt18 (0 .. c_uInt18Max) with {encode "length=18"};
+		type integer	UInt19 (0 .. c_uInt19Max) with {encode "length=19"};
+		type integer 	UInt20 (0 .. c_uInt20Max) with {encode "length=20"};
+		type integer 	UInt21 (0 .. c_uInt21Max) with {encode "length=21"};
+		type integer 	UInt22 (0 .. c_uInt22Max) with {encode "length=22"};
+		type integer 	UInt23 (0 .. c_uInt23Max) with {encode "length=23"};
+		type integer 	UInt24 (0 .. c_uInt24Max) with {encode "length=24"};
+		type integer 	UInt25 (0 .. c_uInt25Max) with {encode "length=25"};
+		type integer 	UInt26 (0 .. c_uInt26Max) with {encode "length=26"};
+		type integer 	UInt27 (0 .. c_uInt27Max) with {encode "length=27"};
+		type integer 	UInt28 (0 .. c_uInt28Max) with {encode "length=28"};
+		type integer 	UInt29 (0 .. c_uInt29Max) with {encode "length=29"};
+		type integer 	UInt30 (0 .. c_uInt30Max) with {encode "length=30"};
+		type integer 	UInt31 (0 .. c_uInt31Max) with {encode "length=31"};
+		type integer 	UInt32 (0 .. c_uInt32Max) with {encode "length=32"};
+//		type integer 	UInt32 (0 .. c_uInt31Max) with {encode "length=32"};
+
+		type integer 	UInt48 (0 .. c_uInt48Max) with {encode "length=48"};
+//		type integer 	UInt48 (0 .. c_uInt31Max) with {encode "length=32"};
+
+	} // end group unsignedIntegerDefintions
+		
+	/* 
+	 * @remark Number in subtype name always indicates encoding length 
+	 *         in _bits_
+	 */
+	group signedIntegerDefintions {
+
+		const integer	c_int1Min := -1;
+		const integer	c_int1Max := 0;
+		const integer	c_int2Min := -2;
+		const integer	c_int2Max := 1;
+		const integer	c_int3Min := -4;
+		const integer	c_int3Max := 3;
+		const integer	c_int4Min := -8;
+		const integer	c_int4Max := 7;
+		const integer	c_int5Min := -16;
+		const integer	c_int5Max := 15;
+		const integer	c_int6Min := -32;
+		const integer	c_int6Max := 31;
+		const integer	c_int7Min := -64;
+		const integer	c_int7Max := 63;
+		const integer	c_int8Min := -128;
+		const integer	c_int8Max := 127;
+		const integer	c_int9Min := -256;
+		const integer	c_int9Max := 255;
+		const integer	c_int10Min := -512;
+		const integer	c_int10Max := 511;
+		const integer	c_int11Min := -1024;
+		const integer	c_int11Max := 1023;
+		const integer	c_int12Min := -2048;
+		const integer	c_int12Max := 2047;
+		const integer	c_int13Min := -4096;
+		const integer	c_int13Max := 4095;
+		const integer	c_int14Min := -8192;
+		const integer	c_int14Max := 8191;
+		const integer	c_int15Min := -16384;
+		const integer	c_int15Max := 16383;
+		const integer	c_int16Min := -32768;
+    	const integer 	c_int16Max := 32767;
+		const integer	c_int17Min := -65536;
+		const integer	c_int17Max := 65535;
+		const integer	c_int18Min := -131072;
+		const integer	c_int18Max := 131071;
+		const integer	c_int19Min := -262144;
+		const integer	c_int19Max := 262143;
+		const integer	c_int20Min := -524288;
+		const integer	c_int20Max := 524287;
+		const integer	c_int21Min := -1048576;
+		const integer 	c_int21Max := 1048575;
+		const integer	c_int22Min := -2097152;
+		const integer 	c_int22Max := 2097151;
+		const integer	c_int23Min := -4194304;
+		const integer 	c_int23Max := 4194303;
+		const integer	c_int24Min := -8388608;
+		const integer 	c_int24Max := 8388607;
+		const integer	c_int25Min := -16777216;
+		const integer 	c_int25Max := 16777215;
+		const integer	c_int26Min := -33554432;
+		const integer 	c_int26Max := 33554431;
+		const integer	c_int27Min := -67108864;
+		const integer 	c_int27Max := 67108863;
+		const integer	c_int28Min := -134217728;
+		const integer 	c_int28Max := 134217727;
+		const integer	c_int29Min := -268435456;
+		const integer 	c_int29Max := 268435456;
+		const integer	c_int30Min := -536870912;
+		const integer 	c_int30Max := 536870911;
+		const integer	c_int31Min := -1073741824;
+		const integer 	c_int31Max := 1073741823;
+		const integer	c_int32Min := -2147483648;
+		const integer 	c_int32Max := 2147483647;
+
+		type integer 	Int;
+		type integer    Int1  (c_int1Min .. c_int1Max) with { encode "length=1"};
+		type integer    Int2  (c_int2Min .. c_int2Max) with { encode "length=2"};
+		type integer    Int3  (c_int3Min .. c_int3Max) with { encode "length=3"};
+		type integer    Int4  (c_int4Min .. c_int4Max) with { encode "length=4"};
+		type integer    Int5  (c_int5Min .. c_int5Max) with { encode "length=5"};
+		type integer    Int6  (c_int6Min .. c_int6Max) with { encode "length=6"};
+		type integer    Int7  (c_int7Min .. c_int7Max) with { encode "length=7"};
+		type integer    Int8  (c_int8Min .. c_int8Max) with { encode "length=8"};
+		type integer    Int9  (c_int9Min .. c_int9Max) with { encode "length=9"};
+		type integer    Int10  (c_int10Min .. c_int10Max) with { encode "length=10"};
+		type integer    Int11  (c_int11Min .. c_int11Max) with { encode "length=11"};
+		type integer    Int12  (c_int12Min .. c_int12Max) with { encode "length=12"};
+		type integer    Int13  (c_int13Min .. c_int13Max) with { encode "length=13"};
+		type integer    Int14  (c_int14Min .. c_int14Max) with { encode "length=14"};
+		type integer    Int15  (c_int15Min .. c_int15Max) with { encode "length=15"};
+		type integer    Int16  (c_int16Min .. c_int16Max) with { encode "length=16"};
+		type integer    Int17  (c_int17Min .. c_int17Max) with { encode "length=17"};
+		type integer    Int18  (c_int18Min .. c_int18Max) with { encode "length=18"};
+		type integer    Int19  (c_int19Min .. c_int19Max) with { encode "length=19"};
+		type integer    Int20  (c_int20Min .. c_int20Max) with { encode "length=20"};
+		type integer    Int21  (c_int21Min .. c_int21Max) with { encode "length=21"};
+		type integer    Int22  (c_int22Min .. c_int22Max) with { encode "length=22"};
+		type integer    Int23  (c_int23Min .. c_int23Max) with { encode "length=23"};
+		type integer    Int24  (c_int24Min .. c_int24Max) with { encode "length=24"};
+		type integer    Int25  (c_int25Min .. c_int25Max) with { encode "length=25"};
+		type integer    Int26  (c_int26Min .. c_int26Max) with { encode "length=26"};
+		type integer    Int27  (c_int27Min .. c_int27Max) with { encode "length=27"};
+		type integer    Int28  (c_int28Min .. c_int28Max) with { encode "length=28"};
+		type integer    Int29  (c_int29Min .. c_int29Max) with { encode "length=29"};
+		type integer    Int30  (c_int30Min .. c_int30Max) with { encode "length=30"};
+		type integer    Int31  (c_int31Min .. c_int31Max) with { encode "length=31"};
+//		type integer    Int32  (c_int32Min .. c_int32Max) with { encode "length=32"};
+
+	} // end group signedIntegerDefintions
+
+	/* 
+	 * @remark Number in subtype name always indicates encoding length 
+	 *		   in _bits_
+	 */
+	group booleanDefintions {
+
+		type boolean	Bool1 with {encode "length=1"};
+		type boolean	Bool2 with {encode "length=2"};
+		type boolean	Bool3 with {encode "length=3"};
+		type boolean	Bool4 with {encode "length=4"};
+		type boolean	Bool5 with {encode "length=5"};
+		type boolean	Bool6 with {encode "length=6"};
+		type boolean	Bool7 with {encode "length=7"};
+		type boolean	Bool8 with {encode "length=8"};
+	
+	} // end group booleanDefintions
+
+} // end module LibCommon_BasicTypesAndValues
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibCommon_DataStrings.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibCommon_DataStrings.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibCommon_DataStrings.ttcn	(revision 22)
@@ -0,0 +1,102 @@
+/*
+ *	@author 	STF 276
+ *  @version 	$Id$
+ *	@desc		A collection of data string type and value definitions which 
+ *				may be useful in the implementation of any TTCN-3 test 
+ *              suite. "Data string" refers to TTCN-3 hexstring, octetstring  
+ *				and bitstring types.
+ *  @remark	    End users should be aware that any changes made to the  in
+ *              definitions this module may be overwritten in future releases.
+ *				End users are encouraged to contact the distributers of this  
+ *              module regarding their modifications or additions so that future 
+ *              updates will include your changes.
+ */
+ module LibCommon_DataStrings {
+	
+	/* 
+	 * @remark Number in name indicates string length in number of 
+	 * 		   _bits_
+	 */
+	group bitStringSubTypes {
+
+		type bitstring	Bit1 	length(1) with {encode "1 bit"};
+		type bitstring	Bit2 	length(2) with {encode "2 bits"};
+		type bitstring	Bit3 	length(3) with {encode "3 bits"};
+		type bitstring	Bit4 	length(4) with {encode "4 bits"};
+		type bitstring	Bit5 	length(5) with {encode "5 bits"};
+		type bitstring	Bit6 	length(6) with {encode "6 bits"};
+		type bitstring	Bit7 	length(7) with {encode "7 bits"};
+		type bitstring	Bit8 	length(8) with {encode "8 bits"};
+		type bitstring	Bit9 	length(9) with {encode "9 bits"};
+		type bitstring	Bit10 	length(10) with {encode "10 bits"};
+		type bitstring	Bit11 	length(11) with {encode "11 bits"};
+		type bitstring	Bit12 	length(12) with {encode "12 bits"};
+		type bitstring	Bit13 	length(13) with {encode "13 bits"};
+		type bitstring	Bit14 	length(14) with {encode "14 bits"};
+		type bitstring	Bit15 	length(15) with {encode "15 bits"};
+		type bitstring	Bit16 	length(16) with {encode "16 bits"};
+		type bitstring	Bit17 	length(17) with {encode "17 bits"};
+		type bitstring	Bit18 	length(18) with {encode "18 bits"};
+		type bitstring	Bit19 	length(19) with {encode "19 bits"};
+		type bitstring	Bit20 	length(20) with {encode "20 bits"};
+		type bitstring	Bit21 	length(21) with {encode "21 bits"};
+		type bitstring	Bit22 	length(22) with {encode "22 bits"};
+		type bitstring	Bit23 	length(23) with {encode "23 bits"};
+		type bitstring	Bit24 	length(24) with {encode "24 bits"};
+		type bitstring	Bit25 	length(25) with {encode "25 bits"};
+		type bitstring	Bit26 	length(26) with {encode "26 bits"};
+		type bitstring	Bit27 	length(27) with {encode "27 bits"};
+		type bitstring	Bit28 	length(28) with {encode "28 bits"};
+		type bitstring	Bit29 	length(29) with {encode "29 bits"};
+		type bitstring	Bit30 	length(30) with {encode "30 bits"};
+		type bitstring	Bit31 	length(31) with {encode "31 bits"};
+		type bitstring	Bit32 	length(32) with {encode "32 bits"};
+
+		type bitstring	Bit48 	length(48) with {encode "48 bits"};
+		type bitstring	Bit64 	length(64) with {encode "64 bits"};	
+		//TODO: check if it's possible
+		type bitstring	Bit128 	length(128) with {encode "128 bits"};	
+
+	} // end group bitStringSubTypes
+
+	/* 
+	 * @remark Number in name indicates string length in number of 
+	 * 		   _octets_
+	 */
+	group octetStringSubTypes {
+
+		type octetstring	Oct1 	length(1) with {encode "1 bytes"};
+		type octetstring	Oct2 	length(2) with {encode "2 bytes"};
+		type octetstring	Oct3 	length(3) with {encode "3 bytes"};
+		type octetstring	Oct4 	length(4) with {encode "4 bytes"};
+		type octetstring	Oct5 	length(5) with {encode "5 bytes"};
+		type octetstring	Oct6 	length(6) with {encode "6 bytes"};
+		type octetstring	Oct7 	length(7) with {encode "7 bytes"};
+		type octetstring 	Oct8 	length(8) with {encode "8 bytes"};
+ 		type octetstring	Oct9 	length(9) with {encode "9 bytes"};
+		type octetstring	Oct10	length(10) with {encode "10 bytes"};
+		type octetstring	Oct11	length(11) with {encode "11 bytes"};
+ 	  	type octetstring 	Oct12 	length(12) with {encode "12 bytes"};
+		type octetstring	Oct13 	length(13) with {encode "13 bytes"};
+  	  	type octetstring 	Oct14 	length(14) with {encode "14 bytes"};
+		type octetstring	Oct15 	length(15) with {encode "15 bytes"};
+		type octetstring	Oct16 	length(16) with {encode "16 bytes"};
+
+		type octetstring	Oct80 length(80) with {encode "80 bytes"};
+		type octetstring	Oct128 length(128) with {encode "128 bytes"};
+		type octetstring	Oct160 length(160) with {encode "160 bytes"};
+		type octetstring	Oct320 length(320) with {encode "320 bytes"};
+		type octetstring	Oct640 length(640) with {encode "640 bytes"};
+		type octetstring	Oct1280 length(1280) with {encode "1280 bytes"};
+		//TODO: check if it's possible
+		type octetstring	Oct1380 length(1380) with {encode "1380 bytes"};
+
+		type octetstring	Oct1to15 	length(1..15) with {encode "1 to 15 bytes"};
+		type octetstring	Oct6to15 	length(6..15) with {encode "6 to 15 bytes"};
+		type octetstring	Oct1to128 	length(1..128) with {encode "1 to 128 bytes"};
+		type octetstring	Oct1to254 	length(1..254) with {encode "1 to 254 bytes"};
+		type octetstring	Oct1to255 	length(1..255) with {encode "1 to 255 bytes"};
+	
+	} // end group octetStringSubTypes
+
+} // end module LibCommon_DataStrings
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibCommon_TextStrings.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibCommon_TextStrings.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibCommon_TextStrings.ttcn	(revision 22)
@@ -0,0 +1,108 @@
+/*
+ *	@author 	STF 276
+ *  @version 	$Id$
+ *	@desc		A collection of text string type and value definitions which 
+ *				may be useful in the implementation of any TTCN-3 test 
+ *              suite. "Text string" refers to TTCN-3 charstring and universal
+ *				charstring types.
+ *  @remark	    End users should be aware that any changes made to the  in
+ *              definitions this module may be overwritten in future releases.
+ *				End users are encouraged to contact the distributers of this  
+ *              module regarding their modifications or additions so that future 
+ *              updates will include your changes.
+ */
+ module LibCommon_TextStrings {
+	
+	/*
+	 * @desc	These constants can be used to add special characters into
+	 *			TTCN-3 text strings by using the concatenation operator.
+	 *			Example use: 
+	 *			var charstring v_text := "Hi!" & c_CRLF & "Hello!";
+	 */
+	group usefulConstants {
+
+		const charstring c_NUL := oct2str('00'O);
+		const charstring c_SOH := oct2str('01'O);
+		const charstring c_STX := oct2str('02'O);
+		const charstring c_ETX := oct2str('03'O);
+		const charstring c_EOT := oct2str('04'O);
+		const charstring c_ENQ := oct2str('05'O);
+		const charstring c_ACK := oct2str('06'O);
+		const charstring c_BEL := oct2str('07'O);
+		const charstring c_BS  := oct2str('08'O);
+		const charstring c_TAB := oct2str('09'O);
+		const charstring c_LF  := oct2str('0A'O);
+		const charstring c_VT  := oct2str('0B'O);
+		const charstring c_FF  := oct2str('0C'O);
+		const charstring c_CR  := oct2str('0D'O);
+		const charstring c_SO  := oct2str('0E'O);
+		const charstring c_SI  := oct2str('0F'O);
+		const charstring c_DLE := oct2str('10'O);
+		const charstring c_DC1 := oct2str('11'O);
+		const charstring c_DC2 := oct2str('12'O);
+		const charstring c_DC3 := oct2str('13'O);
+		const charstring c_DC4 := oct2str('14'O);
+		const charstring c_NAK := oct2str('15'O);
+		const charstring c_SYN := oct2str('16'O);
+		const charstring c_ETB := oct2str('17'O);
+		const charstring c_CAN := oct2str('18'O);
+		const charstring c_EM  := oct2str('19'O);
+		const charstring c_SUB := oct2str('1A'O);
+		const charstring c_ESC := oct2str('1B'O);
+		const charstring c_FS  := oct2str('1C'O);
+		const charstring c_GS  := oct2str('1D'O);
+		const charstring c_RS  := oct2str('1E'O);
+		const charstring c_US  := oct2str('1F'O);
+		const charstring c_DEL := oct2str('7F'O);
+
+		const charstring c_CRLF := oct2str('0D'O) & oct2str('0A'O);
+
+	} // end group usefulConstants
+
+	/* 
+	 * @remark Number in name indicates string length in number of 
+	 * 		   _chars_
+	 */
+	group textStringSubTypes {
+
+		type charstring String1 	 length(1) with { encode "1 byte"};
+		type charstring String2 	 length(2) with { encode "2 bytes"};
+		type charstring String3 	 length(3) with { encode "3 bytes"};
+		type charstring String4 	 length(4) with { encode "4 bytes"};
+		type charstring String5 	 length(5) with { encode "5 bytes"};
+		type charstring String6 	 length(6) with { encode "6 bytes"};
+		type charstring String7 	 length(7) with { encode "7 bytes"};
+		type charstring String8 	 length(8) with { encode "8 bytes"};
+		type charstring String9 	 length(9) with { encode "9 bytes"};
+		type charstring String10	 length(10) with { encode "10 bytes"};
+		type charstring String11	 length(11) with { encode "11 bytes"};
+		type charstring String12	 length(12) with { encode "12 bytes"};
+		type charstring String13	 length(13) with { encode "13 bytes"};
+		type charstring String14	 length(14) with { encode "14 bytes"};
+		type charstring String15	 length(15) with { encode "15 bytes"};
+		type charstring String16	 length(16) with { encode "16 bytes"};
+
+		type charstring String1To63  length(1..63) with {encode "1 to 63 bytes"};
+		type charstring String1To64  length(1..64) with {encode "1 to 64 bytes"};
+		type charstring String1To127 length(1..127) with {encode "1 to 127 bytes"};
+		type charstring String1To128 length(1..128) with {encode "1 to 128 bytes"};
+		type charstring	String1to255 length(1..255) with {encode "1 to 255 bytes"};
+
+	} // end stringSubTypes
+
+ 	group usefulTextStringTypes {
+
+		// NOTE STS: below universal commented due to serious RTS problems in Tau 2.3 and before
+		type /*universal*/ charstring UnicodeText; 
+
+		// NOTE STS: below universal commented due to serious RTS problems in Tau 2.3 and before
+		type /*universal*/ charstring UnicodeText1to255 length(1..255)
+		with {encode "1 to 255 bytes"};
+
+		type charstring AlphaNum ("0".."9","a".."z","A".."Z");
+		type AlphaNum   AlphaNum2 length(2);
+		type AlphaNum   AlphaNum1To32 length(1..32);
+
+	} // end group usefulTextStringTypes
+
+} // end module LibCommon_TextStrings
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_DummyXMLTypes.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_DummyXMLTypes.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_DummyXMLTypes.ttcn	(revision 22)
@@ -0,0 +1,6 @@
+module LibSip_XMLTypes {
+
+  type charstring XmlBody;
+  type charstring XMLMessage;
+  
+} // end module LibSip_XMLTypes
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_Interface.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_Interface.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_Interface.ttcn	(revision 22)
@@ -0,0 +1,182 @@
+/*
+ *	@author 	STF 346, STF366, STF368, STF369
+ *  @version    $Id: LibSip_Interface.ttcn 256 2009-05-08 08:16:58Z pintar $
+ *	@desc		This module provides the types used by the test component 
+ *              for SIP-IMS tests. Module become from STF306 and STF334-336
+ */
+
+module LibSip_Interface language "TTCN-3:2005"//MRO
+{	
+	//LibCommon
+	import from LibCommon_Sync all;
+	import from LibCommon_AbstractData all;
+	import from LibCommon_BasicTypesAndValues all;
+	import from LibCommon_DataStrings all;
+	//LibSip
+	import from LibSip_SIPTypesAndValues all;
+	import from LibSip_SDPTypes all;
+	import from LibSip_XMLTypes all;
+	
+	import from LibSip_PIXITS all;
+
+	group AdressTypes
+	{
+	  type record address4SIP
+	  {
+		//HostPort
+		charstring 	        host optional,        // hostname, IPv4 or IPv6
+		integer             portField optional    // represented as an integer
+	  } with { encode "SIPCodec" }
+
+	  type address4SIP address;
+
+	}// end group AdressTypes
+
+	type port SipPort message {
+		  inout Request, 
+		  		REGISTER_Request, 
+		  		INVITE_Request,
+				OPTIONS_Request,
+				BYE_Request,
+		  		CANCEL_Request, 
+		  		ACK_Request, 
+		  		PRACK_Request, 
+		  		NOTIFY_Request, 
+		  		SUBSCRIBE_Request, 
+		  		PUBLISH_Request, 
+		  		UPDATE_Request,
+		  		REFER_Request,
+				MESSAGE_Request,
+				INFO_Request,
+		  		Response, 
+		  		Raw } with { extension "address" };
+		  		
+	signature s_SIP_conversation (in charstring text, out boolean answer);
+	signature s_SIP_ringing (in charstring text, out boolean answer);
+    signature s_SIP_announcementA (in charstring text, out boolean answer);
+	signature s_SIP_announcementB (in charstring text, out boolean answer);
+	signature s_SIP_announcement (in charstring text, out boolean answer);
+	signature s_SIP_voiceMessage (in charstring text, out boolean answer);
+    signature s_SIP_mediastopped (in charstring text, out boolean answer);
+ 	type port operatorPort procedure {inout s_SIP_conversation; inout s_SIP_ringing; inout s_SIP_announcementA; inout s_SIP_announcementB; inout s_SIP_announcement; inout s_SIP_voiceMessage; inout s_SIP_mediastopped};
+		  		
+	//	Solution for building error problem. (Important for validation)
+	//type component ImsComponent extends SipComponent need to be located in LibIms_Interface and not in LibSip_Interface module
+	//With this solution TAU compiler error.
+//	type component ImsComponent extends SipComponent
+//	{
+//		// general variables
+//		var ImsInterfaceProfile vc_interfaceprofile 
+//	 } // end ImsComponent
+
+	type component SipComponent
+	{
+	  //port
+	  port 	SipPort SIPP;
+	  // used for communication with the operator
+	  port operatorPort opPort;
+
+	  // current address to send TCP/UDP messages
+	  var SipUserProfile vc_userprofile; 		// PIXIT userinformation
+	  var address		 vc_sent_label  := {host := PX_SIP_SUT_IPADDR, portField := PX_SIP_SUT_PORT};
+
+	  // last incoming message
+	  var Response 	vc_response;	// last incoming response message
+	  var boolean	vc_boo_response := false; // to check if response received or not
+	  var Request 	vc_request;		// last incoming request message					
+	  var boolean	vc_boo_request := false; // to check if request received or not
+	  var Request 	vc_requestFor407;	// last INVITE request to be authorized if 407/401 received from Proxy  
+
+	  var SipUrl	vc_requestUri 	:= c_empty_RequestUri;
+	  var SipUrl	vc_requestUri2 	:= c_empty_RequestUri;//MRO
+	  var charstring vc_branch		:= "";
+	  var charstring vc_branch_ICSCF	:= "";
+	  var charstring vc_branch_SCSCF	:= "";
+
+	  // SIP message header fields (for building next message)
+	  var CallId	vc_callId    	:= c_empty_CallId;
+	  var CallId	vc_callIdReg 	:= c_empty_CallId;
+	  var From		vc_from      	:= c_empty_From;
+	  var To		vc_to        	:= c_empty_To;
+	  var To		vc_cancel_To 	:= c_empty_To;	// used for next CANCEL
+	  var Via 		vc_via       	:= c_empty_Via;
+	  var Via 		vc_via_REG		:= c_empty_Via; // via used in last REGISTER
+	  var ContentType vc_contentType:= c_empty_ContentType;//MRO
+	  
+	  var RecordRoute vc_recordRoute; 			 // value of RecordRoute header
+	  var boolean 	vc_boo_recordRoute := false; // boolean indicates valid recordRoute
+	  var Route		vc_route; 					 // value of Route header
+	  var boolean 	vc_boo_route 	:= false; 	 // boolean indicates valid Route
+
+	  var Contact	vc_contact; 			// value of Contact header
+	  var CSeq		vc_cSeq 		:= c_empty_cSeq;	// value of CSeq header
+	  var RAck 		vc_rAck 		:= { fieldName := RACK_E, responseNum := 1, seqNumber := 1, method := "INVITE"}; // value of RAck header
+	  var HostPort 	vc_reqHostPort 	:= {host:=PX_SIP_SUT_IPADDR, portField:=PX_SIP_SUT_PORT}; // address to send request
+	  var Privacy 	vc_privacy;
+	  var HistoryInfo_List vc_historyInfoList := {}; // value of history list according to RFC4244
+	  var SipUrl 	  vc_confURI; 	 // conference URI according to TS124147 ch. 5.3.1.3.2
+	  var SDP_Message vc_sdp_remote; // incoming SDP offers
+	  var SDP_Message vc_sdp_local;  // SDP values to be sent
+	  var XmlBody 	vc_xml_remote;	 // incoming XML value
+	  var XmlBody 	vc_xml_local;	 //SDP values to be sent
+	  
+	  var CSeq		vc_iut_CSeq 	:= c_empty_cSeq;	// value of last CSeq header used by the IUT in request
+	  // To/From header-fields to be used if the callee will release the session
+	  var To 		vc_callee_To 	:= c_empty_To; 
+	  var From 		vc_callee_From 	:= c_empty_From;
+	  // To/From header-fields to be used if the caller will release the session
+	  var To 		vc_caller_To 	:= c_empty_To;
+	  var From 		vc_caller_From	:= c_empty_From;
+	  var Authorization vc_authorization;
+	          
+	  // variables for storing default references
+	  var default 	vc_default;
+	  var default 	vc_def_catchSyncStop;
+        
+	  // general timers
+	  timer tc_T1  	 := PX_SIP_T1;
+	  timer tc_Tf    := PX_SIP_TF;
+	  timer tc_wait  := PX_SIP_TWAIT;
+	  timer tc_ack   := PX_SIP_TACK;
+	  timer tc_resp  := PX_SIP_TRESP;
+	  timer tc_noAct := PX_SIP_TNOACT; // time for SUT to get idle state
+//	  timer TRept;
+//	  timer TSync	 := PX_SIP_TSYNC;
+	  timer tc_guard   := PX_SIP_TGUARD;//MRO
+	  timer tc_tDelay   := 32.0;
+
+	  var float 		vc_tcRESP 				:= PX_SIP_TRESP; // standard value for TRESP (may be modified in particular tests)
+		
+	// indicators set/used parameter status or state handling in default
+	  var boolean 		vc_sdp_remote_is_valid 	:= false; 	// true if there is a value in v_SDP_remote
+	  var boolean 		vc_history_is_valid 	:= false; 	// true if there is a HistoryList in response message
+	  var boolean 		vc_send_SDP 			:= false; 	// send SDP in the next outgoing message
+	  var boolean 		vc_ignore_bye			:= false; 	// enable ignore of repeated bye in default
+	  var boolean 		vc_ignore_invite		:= false; 	// enable ignore invite in default
+	  var boolean 		vc_ignore181			:= false; 	// enable ignore of 181 in default
+	  var boolean 		vc_ignore484			:= false; 	// enable ignore of 484 in default
+	  var boolean 		vc_ignore4xx			:= false; 	// enable ignore of 4xx in default
+	  var boolean 		vc_ignore200OKinv		:= false; 	// enable ignore of 200OKinv in default
+	  var boolean 		vc_supported_100rel		:= false; 	// true if the received invite contains 100rel
+	  var boolean 		vc_supported_precondition:= false; 	// true if the received invite contains precondition
+	  var boolean 		vc_MESSAGEreceived 		:= false; 	// true if MESSAGE received during altstep
+	  var boolean 		vc_first_recv			:= false; 	// true after receipt of first incomming SIP message
+	  var boolean 		vc_firstREGISTER_sent	:= false; 	// true after sent of first REGISTER message
+
+	  var boolean v_white_space := false;//MRO
+
+	  // ETS address
+      var address v_ets_label := { host := PX_SIP_TS1_IPADDR, portField := PX_SIP_TS1_PORT};
+
+	  // parts needed for Client/SelfSyncComp type compatibility
+	  var 	StringStack v_stateStack := c_initStringStack;
+	  port 	SyncPort 	syncSendPort;
+	  port 	SyncPort 	syncPort;
+	  timer tc_sync 	:= PX_TSYNC_TIME_LIMIT;
+	  		
+//	  // used for communication with the operator
+//	  port operatorPort_SIP opPort;
+
+  } // end SipComponent
+  
+} // end module LibSip_Interface
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_PIXITS.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_PIXITS.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_PIXITS.ttcn	(revision 22)
@@ -0,0 +1,364 @@
+/*
+ *	@author 	STF 346, STF366, STF368, STF369
+ *  @version    $Id: LibSip_PIXITS.ttcn 256 2009-05-08 08:16:58Z pintar $
+ *	@desc		This module provides the types used by the test component 
+ *              for SIP-IMS tests. Module become from STF306 and STF334-336
+ *  NOTE:		PIXITS in folowing groups can be ignored if this information
+ *   			is provided in other modules of the ATS that uses this SIP library
+ *				- Ports_and_addresses_of_the_SUT
+ *				- PortsAndAddressesOfTheTS1
+ *				- PortsAndAddressesOfTheTS2 
+ *				- PortsAndAddressesOfTheTS3 
+ *				- ParametersForHTTP_Authentication 
+ */
+
+module LibSip_PIXITS language "TTCN-3:2005"//MRO
+{
+	//LibCommon
+	import from LibCommon_BasicTypesAndValues all;
+	import from LibCommon_DataStrings all;
+
+//	_____________________________ PIXIT-S_______________________________
+  group SIP_PIXITparameters{
+  group SDPParameter {
+	  modulepar {
+
+	  /** @desc	charstring for SDP dynamic port
+	  */
+	  charstring	PX_SIP_SDP_dyn := "0";
+
+	  /** @desc	charstring for SDP bandwidth modifier
+	  */
+	  charstring	PX_SIP_SDP_b_modifier := "AS";
+
+	  /** @desc	integer for SDP bandwidth value
+	  */
+	  integer		PX_SIP_SDP_b_bandwidth := 64;
+
+	  /** @desc	charstring for SDP media attribute encoding supported by the IUT 
+	  */
+	  charstring	PX_SIP_SDP_encoding := "PCMU/8000";
+
+	  /** @desc	charstring for SDP media attribute encoding unavailable by the IUT 
+	  */
+	  charstring	PX_SIP_SDP_encoding_unavail := "GSM/8000"; // f_Sip_TC2105_IS___xx__U18
+
+	  /** @desc	charstring for SDP media attribute encoding unsupported by the IUT 
+	  */
+	  charstring	PX_SIP_SDP_encoding_unsup := "GSM/8000"; // f_Sip_TC2105_IS___xx__U18
+
+	  /** @desc	charstring for SDP media T.38 transport (used in TC2101_IS___AU__09)
+	  */
+	  charstring	PX_SIP_SDP_transport := "udptl";
+	  } //	modulepar
+  } //group SDP Parameter
+  
+  group ISUPinterworkingParameters{
+  	  modulepar {
+	  /** @desc	charstring for Used CPC language
+	  */
+	  charstring  PX_SIP_ISUP_LANGUAGE := "English";
+	  /** @desc	charstring for Used CPC language
+	  */
+	  charstring  PX_SIP_ISUP_CPC_VALUE := "prison";
+  	  }//modulepar
+  } // goup PSTNParameters
+
+  group SupportedOptions{
+	  modulepar {
+				
+	  /** @desc	boolean for  True if 100rel mechanism is supported in SIP
+	  */
+	  boolean		PX_SIP_100rel := false;
+
+	  /** @desc	boolean for True if precondition mechanism is supported in SIP
+	  */
+	  boolean		PX_SIP_precondition := false;
+
+	  /** @desc	boolean for True if UDP Transport is used by the IUT to run campaign
+	  */
+	  boolean		PX_SIP_UDP := true;
+
+	  /** @desc	charstring for Used Transport in upper case "UDP"/"TCP"
+	  */
+	  charstring  PX_SIP_TRANSPORT := "UDP";
+	  }//modulepar
+  }// group SupportedOptions{
+
+  // PIXITS in group Ports_and_addresses_of_the_SUT can be ignored if this information is provided in other modules of the ATS that uses this SIP library
+  group Ports_and_addresses_of_the_SUT{
+	  modulepar{ 
+
+	  /** @desc	integer for SUT port number to exchange SIP messages
+	  */
+	  integer	  PX_SIP_SUT_PORT := 5060;
+
+	  /** @desc	charstring for SUT IP address to exchange SIP messages
+	  */
+	  charstring  PX_SIP_SUT_IPADDR := "172.27.16.115";
+
+	  /** @desc	charstring for SUT domain
+	  */
+	  charstring  PX_SIP_SUT_HOME_DOMAIN := "172.27.16.115";
+
+	  /** @desc	charstring for unknown SUT domain
+	  */
+	  charstring  PX_SIP_SUT_HOME_DOMAIN_UNKNOWN := "172.88.88.88";
+
+	  }	//modulepar
+  }
+
+  // PIXITS in group PortsAndAddressesOfTheTS1 can be ignored if this information is provided in other modules of the ATS that uses this SIP library
+  group	PortsAndAddressesOfTheTS1 {
+//	 Ports and addresses of the TS1 (tester), first access
+	 modulepar {
+	  /** @desc	integer for port number used by the TS1 to exchange SIP messages
+	  */
+	  integer     PX_SIP_TS1_PORT := 5060;
+
+	  /** @desc	charstring for IP address used by the TS1 to exchange SIP messages
+	  */
+	  charstring  PX_SIP_TS1_IPADDR := "172.27.1.218";
+
+	  /** @desc	charstring for identity of the tester local domain
+	  */
+	  charstring  PX_SIP_TS1_LOCAL_DOMAIN := "172.27.1.218";
+
+	  /** @desc	charstring for identity of the tester local user
+	  */
+	  charstring  PX_SIP_TS1_LOCAL_USER := "2910";
+
+	  /** @desc	charstring for identity of the user with active call diversion service
+	  */
+	  charstring  PX_SIP_TS1_LOCAL_USER_DIV := "2907";
+
+	  /** @desc	charstring for identity of the tester local user (format "+"cc+ndc+sn)
+	  */
+	  charstring  PX_SIP_TS1_LOCAL_USER_FULL := "+ 33492941111";
+
+	  /** @desc	integer for port number used by the TS to exchange media streams
+	  */
+	  integer     PX_SIP_TS1_BEARER_PORT := 52000;
+
+	  /** @desc	charstring for port number used by the TS to exchange media streams
+	  */
+	  integer     PX_SIP_TS1_BEARER_PORT2 := 62000;
+
+	  /** @desc	charstring for IP address used by the TS to exchange media streams
+	  */
+	  charstring  PX_SIP_TS1_BEARER_IPADDR := "172.27.1.218";
+	 }//modulepar
+  }//	group	PortsAndAddressesOfTheTS
+
+  // PIXITS in group PortsAndAddressesOfTheTS2 can be ignored if this information is provided in other modules of the ATS that uses this SIP library
+  group	PortsAndAddressesOfTheTS2 {
+//	 Ports and addresses of the TS2 (tester), second access
+	 modulepar {
+
+	  /** @desc	integer for port number used by the TS2 to exchange SIP messages
+	  */
+	  integer     PX_SIP_TS2_PORT := 5060;
+
+	  /** @desc	charstring for IP address used by the TS2 to exchange SIP messages
+	  */
+	  charstring  PX_SIP_TS2_IPADDR := "172.27.1.219";
+
+	  /** @desc	charstring for identity of the tester local domain
+	  */
+	  charstring  PX_SIP_TS2_LOCAL_DOMAIN := "172.27.1.219";
+
+	  /** @desc	charstring for identity of the tester local user
+	  */
+	  charstring  PX_SIP_TS2_LOCAL_USER := "2911";
+	
+	  /** @desc	charstring for identity of the user with active call diversion service
+	  */
+	  charstring  PX_SIP_TS2_LOCAL_USER_DIV := "2011";
+
+	  /** @desc	charstring for identity of the tester local user (format "+"cc+ndc+sn)
+	  */
+	  charstring  PX_SIP_TS2_LOCAL_USER_FULL := "+ 33 4 92941111";
+
+	  /** @desc	integer for port number used by the TS to exchange media streams
+	  */
+	  integer     PX_SIP_TS2_BEARER_PORT := 53000;
+
+	  /** @desc	integer for port number used by the TS to exchange media streams
+	  */
+	  integer     PX_SIP_TS2_BEARER_PORT2 := 63000;
+
+	  /** @desc	charstring for IP address used by the TS to exchange media streams
+	  */
+	  charstring  PX_SIP_TS2_BEARER_IPADDR := "172.27.1.218";
+	
+	 } //	modulepar
+  }//group	PortsAndAddressesOfTheTS2 
+  
+  // PIXITS in group PortsAndAddressesOfTheTS3 can be ignored if this information is provided in other modules of the ATS that uses this SIP library
+  group	PortsAndAddressesOfTheTS3 {
+//	  Ports and addresses of the TS3 (tester), second access
+	  modulepar{
+	  /** @desc	integer for Port number used by the TS3 to exchange SIP messages
+	  */
+	  integer     PX_SIP_TS3_PORT := 5060;
+
+	  /** @desc	charstring for IP address used by the TS3 to exchange SIP messages
+	  */
+	  charstring  PX_SIP_TS3_IPADDR := "172.27.1.220";
+
+	  /** @desc	charstring for identity of the tester local domain
+	  */
+	  charstring  PX_SIP_TS3_LOCAL_DOMAIN := "172.27.1.220";
+
+	  /** @desc	charstring for identity of the tester local user
+	  */
+	  charstring  PX_SIP_TS3_LOCAL_USER := "2012";
+
+	  } //modulepar
+  } //group	PortsAndAddressesOfTheTS3
+
+  group RegistrationParameters {
+	  modulepar {
+		
+	  /** @desc	boolean for the SIP user if it have to register itself before executing a test case
+	  */
+	  boolean     PX_SIP_REGISTRATION := false;
+
+	  /** @desc	integer for the minimun SIP user registration expires-value
+	  */
+	  integer     PX_SIP_REGISTRATION_exp_min := 3600;
+
+	  /** @desc	charstring for REGISTRAR domain
+	  */
+	  charstring  PX_SIP_SUT_REGISTRAR_DOMAIN := "172.27.16.115";
+	  }//	modulepar
+  }// group Registration parameters
+  
+  group ReleaseCause{
+	  modulepar {
+	  /** @desc	integer for Release cause to be used in BYE and in Failure messages
+	  */
+	  integer			PX_SIP_BYE_CAUSE := 16;
+	  }//modulepar
+  }//group ReleaseCause
+
+  group RTPStreamControlAndCheck{
+	  modulepar {
+	  /** @desc	boolean for True, if conversation check is implemented.
+	  */
+	  boolean PX_SIP_CheckConversation := false; 
+
+	  /** @desc	boolean for True, if DTMF check is implemented.
+	  */
+	  boolean PX_SIP_CheckDTMF := false; 
+
+	  /** @desc	boolean for True, if Announcement sending is implemented.
+	  */
+	  boolean PX_SIP_SendAnnouncement := false; 
+
+	  /** @desc	boolean for True, if ringing check is implemented.
+	  */
+	  boolean PX_SIP_CheckRinging := false; 
+	  }//modulepar
+  }//group RTPStreamControlAndCheck
+  
+  group SwitchToEnableAuthentication {
+	modulepar{	
+	/** @desc	boolean for option controlling if authentication is enabled/disabled for REGISTER messages 
+	*/
+	boolean PX_SIP_REGISTER_AUTHENTICATION_ENABLED := true;
+	  
+	/** @desc	boolean for option controlling if authentication is enabled/disabled for INVITE messages 
+	*/
+	boolean PX_SIP_INVITE_AUTHENTICATION_ENABLED := false;
+	}
+  }
+
+  // PIXITS in group ParametersForHTTP_Authentication can be ignored if this information is provided in other modules of the ATS that uses this SIP library 
+  group ParametersForHTTP_Authentication {
+	  modulepar{
+
+	  /** @desc	charstring for RFC 2617 3.2.1 qop options:
+	  * Quoted string of one or more tokens indicating the "quality of protection" values supported by the server. The
+	  * value "auth" indicates authentication; the value "auth-int" indicates authentication with integrity protection.
+	  */
+	  charstring PX_SIP_SUT_UE1_QOP := "auth";
+
+	  /** @desc	charstring for RFC 2617 3.2.2 username
+	  * The name of user in the specified realm
+	  */
+	  charstring PX_SIP_SUT_UE1_USERNAME := "abcd";
+
+	  /** @desc	charstring for RFC 2617 3.2.2.2 passwd: A known shared secret, the password of user of the specified username
+	  */
+	  charstring PX_SIP_SUT_UE1_PASSWD := "1234";
+
+	  /** @desc	charstring for RFC 2617 3.2.1 qop options:
+	  * Quoted string of one or more tokens indicating the "quality of protection" values supported by the server. The
+	  * value "auth" indicates authentication; the value "auth-int" indicates authentication with integrity protection.
+	  */
+	  charstring PX_SIP_SUT_UE2_QOP := "auth";
+	  
+	  /** @desc	charstring for RFC 2617 3.2.2 username
+	  * The name of user in the specified realm
+	  */
+	  charstring PX_SIP_SUT_UE2_USERNAME := "abcd";
+
+	  /** @desc	charstring for RFC 2617 3.2.2.2 passwd: A known shared secret, the password of user of the specified username
+	  */
+	  charstring PX_SIP_SUT_UE2_PASSWD := "1234";
+	 
+	  }//modulepar
+  }//group ParametersForHTTP_Authentication
+
+  group SIP_Timers {
+	  modulepar {
+	  /** @desc	float for T1 RTT estimate (500 ms)
+	  */
+	  float        PX_SIP_T1 := 0.5;
+
+	  /** @desc	float for T2 Maximum retransmit interval for non-INVITE requests and INVITE response (4000 ms)
+	  */
+	  float        PX_T2 := 4.0;
+
+	  /** @desc	float for T4 Maximum duration a message will remain in the network
+	  */
+	  float        PX_T4 := 1.0;
+
+	  /** @desc	float for TDELAY default value for timeout on outgoing SIP request (ie 64*T1)
+	  */
+	  float        PX_SIP_TF := 32.0;
+
+	  /** @desc	float for TWait default value for waiting an operator action
+	  */
+	  float        PX_SIP_TWAIT := 30.0;
+
+	  /** @desc	float for TAck  default value for waiting an acknowledgement
+	  */
+	  float        PX_SIP_TACK := 8.0;
+
+	  /** @desc	float for TResp default value for waiting for a response from the IUT
+	  */
+	  float        PX_SIP_TRESP := 15.0;
+
+	  /** @desc	float for TNoAct default value for waiting no message from the IUT
+	  * Value given for PX_TNOACT should be less than value of 
+	  * SHORT_REGISTRATION constant (which is currently "3" (seconds))
+	  */
+	  float        PX_SIP_TNOACT := 1.0;
+
+	  /** @desc	float for TSYNC default value to synchronise ptc
+	  */
+	  float        PX_SIP_TSYNC := 10.0;
+
+	  /** @desc	float for TGUARD default value for an extra long timer to limit test execution
+	  */
+	  float        PX_SIP_TGUARD := 120.0;
+
+	  /** @desc	float for TRespRetention minimum time that a Proxy will wait before sending a final response
+	  */
+	  float        PX_TRespRetention := 1.0;
+	  }//modulepar
+  }//group SIP_Timers
+  } //group SIP_PIXITparameters
+} // end module LibSip_PIXITS
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_SDPTypes.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_SDPTypes.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_SDPTypes.ttcn	(revision 22)
@@ -0,0 +1,310 @@
+/**
+ *  @author   STF 346, STF366, STF368, STF369
+ *  @version  $Id: LibSip_SDPTypes.ttcn 256 2009-05-08 08:16:58Z pintar $
+ *	@desc     This module defines message, attribute, structured and simple 
+ *            SDP types as well constants used by LipSip constructs. <br>
+ *            Note that any changes made to the definitions in this module
+ *            may be overwritten by future releases of this library
+ *            End users are encouraged to contact the distributers of this  
+ *            module regarding their modifications or additions
+ *  @remark   Adding of new attributes types is ok;
+ *            Adding of new optional attributes in @see SDP_attribute type 
+ *            is ok;
+ *            Existing attribute types shall not be changed or removed -
+ *            change requests shall be made to http://t-ort.etsi.org
+ */
+
+module LibSip_SDPTypes language "TTCN-3:2005"//MRO
+{
+  group Constants 
+  {	
+   	group SimpleConstants
+   	{
+		//  SDP net_type
+		const charstring c_in := "IN";
+		
+		//  SDP addr_type
+		const charstring c_ip4 := "IP4";
+
+		// SDP_media_desc: media
+		const charstring c_audio := "audio";
+    const charstring c_image := "image";
+		const charstring c_video := "video";
+		
+		// SDP_media_desc: transport
+		const charstring c_rtpAvp := "RTP/AVP";
+		const charstring c_udptl := "Udptl";
+		
+		// SDP_attribute_list constants:
+		const charstring c_local := "local";
+		const charstring c_mandatory := "mandatory";
+		const charstring c_none := "none";
+		const charstring c_qos := "qos";
+		const charstring c_remote := "remote"; 
+		const charstring c_sendrecv := "sendrecv";
+		const charstring c_send := "send";
+		const charstring c_recv := "recv";
+		const charstring c_e2e := "e2e";
+   	}
+  } 
+  group Types
+  {
+    group SubTypes
+    {
+        group AttributeTypes
+        {
+            type record SDP_attribute_cat {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_keywds {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_tool {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_ptime {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_recvonly {
+            }
+
+            type record SDP_attribute_sendrecv {
+            }
+
+            type record SDP_attribute_sendonly {
+            }
+
+			type record SDP_attribute_inactive {
+			}
+
+            type record SDP_attribute_orient {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_type {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_charset {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_sdplang {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_lang {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_framerate {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_quality {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_fmtp {
+                charstring attr_value
+            }
+
+			type record SDP_attribute_curr {
+				charstring preconditionType,
+				charstring statusType,
+				charstring direction
+			}
+
+			type record SDP_attribute_des {
+				charstring preconditionType,
+				charstring strength,
+				charstring statusType,
+				charstring direction
+			}
+
+			type record SDP_attribute_conf {
+				charstring preconditionType,
+				charstring statusType,
+				charstring direction
+			}
+
+            type record SDP_attribute_rtpmap {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_rtcp {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_unknown {
+                charstring name,
+                charstring attr_value optional
+            }
+
+
+            type union SDP_attribute {
+                SDP_attribute_cat             cat,
+                SDP_attribute_keywds          keywds,
+                SDP_attribute_tool            tool,
+                SDP_attribute_ptime           ptime,
+                SDP_attribute_recvonly        recvonly,
+                SDP_attribute_sendrecv        sendrecv,
+                SDP_attribute_sendonly        sendonly,
+				        SDP_attribute_inactive		    inactive,
+                SDP_attribute_orient          orient,
+                SDP_attribute_type            sdp_type,
+                SDP_attribute_charset         charset,
+                SDP_attribute_sdplang         sdplang,
+                SDP_attribute_lang            lang,
+                SDP_attribute_framerate       framerate,
+                SDP_attribute_quality         quality,
+                SDP_attribute_fmtp            fmtp,
+                SDP_attribute_curr            curr,
+                SDP_attribute_des             des,
+                SDP_attribute_conf            conf,
+                SDP_attribute_rtpmap          rtpmap,
+                SDP_attribute_rtcp            rtcp,
+
+                //*  unknown has to be the last else encoding/decoding won't work!
+                SDP_attribute_unknown unknown
+            }
+        } //*  group AttributeTypes
+
+      type set of SDP_attribute SDP_attribute_list;
+
+      type record SDP_bandwidth {
+        charstring          modifier,
+        integer             bandwidth
+      }
+
+	  type set of SDP_bandwidth SDP_bandwidth_list;
+
+      type record SDP_connection {
+        charstring          net_type,
+        charstring          addr_type,
+		SDP_conn_addr		conn_addr
+      }
+
+      type record SDP_conn_addr {
+	  	charstring addr,
+		integer ttl optional,
+		integer num_of_addr optional
+	  }
+
+      type set of SDP_connection SDP_connection_list;
+
+      type record SDP_contact {
+        charstring          addr_or_phone,
+        charstring          disp_name optional
+      }
+
+      type SDP_contact SDP_contact_tel;
+
+      type SDP_contact SDP_contact_email;
+
+      type set of SDP_contact_email SDP_email_list;
+
+      type record of charstring SDP_fmt_list ;
+
+      type record SDP_key {
+        charstring          method,
+        charstring          key optional
+      }
+
+      type record SDP_media_desc {
+        SDP_media_field     media_field,
+        charstring          information optional,
+        SDP_connection_list connections optional,
+        SDP_bandwidth       bandwidth optional,
+        SDP_key             key optional,
+        SDP_attribute_list  attributes optional
+      }
+
+      type set of SDP_media_desc SDP_media_desc_list;
+
+      type record SDP_media_port {
+        integer             port_number,
+        integer             num_of_ports optional
+      }
+
+      type record SDP_media_field {
+        charstring          media,
+        SDP_media_port      ports,
+        charstring          transport,
+        SDP_fmt_list        fmts
+      }
+
+      type record SDP_time{
+        SDP_time_field      time_field,
+        SDP_repeat_list     time_repeat optional
+      }
+
+      type record SDP_time_field{
+        charstring   start_time, //*  field is numeric strings that may not fit into 32-bit signed int
+        charstring   stop_time //*  field is numeric strings that may not fit into 32-bit signed int
+      }
+
+      type record SDP_repeat{
+        SDP_typed_time      repeat_interval,
+        SDP_typed_time      active,
+        SDP_typed_time_list offsets
+      }
+
+      type set of SDP_repeat SDP_repeat_list;
+
+      type record SDP_typed_time{
+        integer        time,
+        charstring     unit optional
+      }
+
+      type set of SDP_typed_time SDP_typed_time_list;
+
+      type set of SDP_time SDP_time_list;
+
+      type record SDP_timezone{
+        charstring          adjustment_time,
+        SDP_typed_time      offset
+      }
+
+      type set of SDP_timezone SDP_timezone_list;
+
+      type record SDP_Origin{
+        charstring          user_name,
+        charstring          session_id,//*  field is numeric strings that may not fit into 32-bit signed int
+        charstring          session_version, //*  field is numeric strings that may not fit into 32-bit signed int
+        charstring          net_type,
+        charstring          addr_type,
+        charstring          addr
+      }
+
+      type set of SDP_contact_tel SDP_phone_list;
+    } //*  group SubTypes
+
+
+    group MessageTypes
+    {
+      type record SDP_Message{
+        integer             protocol_version,
+        SDP_Origin          origin,
+        charstring          session_name,
+        charstring          information optional,
+        charstring          uri optional,
+        SDP_email_list      emails optional,
+        SDP_phone_list      phone_numbers optional,
+        SDP_connection      connection optional,
+		SDP_bandwidth_list  bandwidth optional,
+        SDP_time_list       times,
+        SDP_timezone_list   timezone_adjustments optional,
+        SDP_key             key optional,
+        SDP_attribute_list  attributes optional,
+        SDP_media_desc_list media_list optional
+      }
+    } //  group MessageTypes
+  } //  group Types
+ 
+  
+} // end module LibSip_SDPTypes
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_SIPTypesAndValues.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_SIPTypesAndValues.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_SIPTypesAndValues.ttcn	(revision 22)
@@ -0,0 +1,1798 @@
+/**
+ *	@author   STF 346, STF366, STF368, STF369
+ *  @version  $Id: LibSip_SIPTypesAndValues.ttcn 376 2009-07-03 09:31:55Z rennoch $
+ *	@desc     This module defines message, header, structured and simple SIP 
+ *            types as well constants used by LipSip constructs. <br>
+ *            Note that any changes made to the definitions in this module
+ *            may be overwritten by future releases of this library
+ *            End users are encouraged to contact the distributers of this  
+ *            module regarding their modifications or additions
+ *  @remark   Adding of new message and header types is ok;
+ *            Adding of new optional header fields in @see MessageHeader type 
+ *            is ok but should be done at same time as dummy template updates;
+ *            Existing message or header types shall not be changed or removed -
+ *            change requests shall be made to http://t-ort.etsi.org
+ */
+
+module LibSip_SIPTypesAndValues language "TTCN-3:2005"//MRO
+{
+	//	SipAts
+	import from LibSip_SDPTypes all;
+	import from LibSip_XMLTypes all;
+
+group Constants 
+{	
+group SimpleConstants
+    {
+      // SIP name protocol plus version
+      const charstring c_sipNameVersion := "SIP/2.0";
+      
+      // SIP name protocol
+      const charstring c_sipName := "SIP";
+      
+      // SIP version
+      const charstring c_sipVersion := "2.0";
+      
+      // SIP scheme
+      const charstring c_sipScheme := "sip";
+      
+	  // TEL scheme
+	  const charstring c_telScheme := "tel";
+      
+      // TAG_ID
+      const charstring c_tagId := "tag";
+      
+      // BRANCH_ID
+      const charstring c_branchId := "branch";
+      
+      // BRANCH_COOKIE
+      const charstring c_branchCookie := "z9hG4bK";
+      
+      // EXPIRES_ID
+      const charstring c_expiresId := "expires";
+      
+      // MADDR_ID
+      const charstring c_maddrId := "maddr";
+      
+      // METHOD_ID
+      const charstring c_methodId := "method";
+      
+      // RECEIVED_ID
+      const charstring c_receivedId := "received";
+      
+      // TTL_ID
+      const charstring c_ttlId := "ttl";
+      
+      // USER_ID
+      const charstring c_userId := "user";
+      
+      // SDP name application
+      const charstring c_sdpAplication := "application/sdp";
+      
+	  // XML name application
+	  const charstring c_xmlAplication := "application/xml";
+      
+	  // MIME name application
+	  const charstring c_mimeMultipart := "multipart/mixed";
+	  
+	  // IMS 3GPP name application
+	  const charstring c_ims3gppAplication := "application/3gpp-ims+xml";
+	  
+	  // IMS 3GPP name CW application
+	  const charstring c_ims3gppCwApplication := "application/vnd.3gpp.cw+xml";
+      
+	  // OCTET-STREAM name application
+	  const charstring c_octetAplication := "application/octet-stream";
+	  
+      // PLAIN-TEXT name application
+	  const charstring c_plainText := "text/plain";
+	  
+	  //text content of 1300 bytes for messages with message body
+	  const charstring c_longMessageContent_1300Bytes :=
+	  "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+	  "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+	  "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+	  "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+	  "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+	  "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+	  "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+	  "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+	  "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+	  "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+	  "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+	  "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"&
+	  "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
+	  
+ 
+      // Default SIP port number : 5060
+      const integer c_defaultSipPort := 5060;
+      
+      // Default SIP protocol : UDP
+      const charstring c_defaultSipProt := "UDP";
+      
+      // Fixed IP multicast address
+      const charstring c_mcastSipIpaddr := "224.0.1.75";
+      
+      // Short delta-second used in expires parameter to acknowledge a registration
+      const charstring c_shortRegistration := "3600";
+
+	  // ([RFC3891]Sec 6.1)
+	  const charstring c_earlyFlag := "early-only";
+
+	  // option tag replaces ([RFC3261])
+	  const charstring c_replaces := "replaces";
+      
+	  // option tag 100rel (reliable provisional response [RFC3262])
+	  const charstring c_tag100rel := "100rel";
+      
+	  // option tag from-change ([RFC4916])
+	  const charstring c_tagFromChange := "from-change";
+      
+	  // option tag precondition (ch.11 [RFC3312])
+	  const charstring c_tagPrecond := "precondition";
+
+	  // due to problem with TAU compiler because hardcoded return statement constant is created
+	  const HostPort c_hostport_dummy := {host:="", portField:=c_defaultSipPort};
+
+	  // CLIP/CLIR information
+	  const PrivacyValue c_privacy_none := "none";		
+	  const PrivacyValue c_privacy_id := "id";
+	  const PrivacyValue c_privacy_header := "header";
+	  const PrivacyValue c_privacy_user := "user";
+	  const PrivacyValue c_privacy_critical := "critical";
+	  
+	  // @ (at) sign
+	  const charstring c_AT := "@";
+	  //MRO
+		const charstring c_SP := oct2char('20'O);
+		const charstring c_SLASH := oct2char('2F'O);
+		const charstring c_LT := oct2char('3C'O);
+		const charstring c_GT := oct2char('3E'O);
+	  
+	  // * (wildchard) sign
+	  const charstring c_WILDCARD := "*";
+	  
+	  const integer c_CRlen := 2; // length of new line (0d0a)
+
+	  const GenericParam c_Integrity_protected_yes := {"Integrity protected","yes"}
+	  const GenericParam c_Integrity_protected_no := {"Integrity protected","no"}
+
+} //end group SimpleConstants
+
+group AuthorizationConstants {
+	
+	const charstring c_ik := "";
+	const charstring c_ck := "";
+	const charstring c_algorithm := "MD5";
+	const charstring c_nonce := ""
+
+} //end group AuthorizationConstants
+
+group HeaderFieldConstants {
+
+	const CallId	c_empty_CallId :=
+	{
+	  fieldName := CALL_ID_E,
+	  callid := ""
+	};
+
+	const ContentType	c_empty_ContentType :=
+	{
+	  fieldName := CONTENT_TYPE_E,
+	  mediaType := ""
+	};
+		  
+	const CSeq	c_empty_cSeq := {
+		fieldName := CSEQ_E, 
+		seqNumber:=0, 
+		method:="" };
+	
+	const From	c_empty_From := { 
+	  fieldName := FROM_E,
+	  addressField := {nameAddr := 
+		{displayName := omit,
+		  addrSpec := {
+			scheme  := c_sipScheme,
+			userInfo := omit ,
+			hostPort := {host:="", portField:=c_defaultSipPort},
+			urlParameters := omit,
+			headers := omit
+		  }
+		}
+	  },
+	  fromParams := omit
+	};
+	
+	const MaxForwards c_maxForwards70 := {fieldName:=MAX_FORWARDS_E, forwards:=70}
+	
+	const SipUrl c_empty_RequestUri :=
+	{
+	  scheme  := c_sipScheme,
+	  userInfo := omit ,
+	  hostPort := {host:="", portField:=c_defaultSipPort},
+	  urlParameters := omit,
+	  headers := omit
+	};
+
+	const SipUrl c_unavailableUri :=
+	{
+			scheme  := c_sipScheme,
+			userInfo := {userOrTelephoneSubscriber:="unavailable", password:=omit},
+			hostPort := {host:="anonymous.invalid", portField:=c_defaultSipPort},
+			urlParameters := omit,
+			headers := omit
+	};
+
+	const To	c_empty_To := 
+	{ // value of To header
+	  fieldName := TO_E,
+	  addressField := 
+	  {
+		nameAddr := 
+		{
+		  displayName := omit,
+		  addrSpec := 
+		  {
+			scheme  := c_sipScheme,
+			userInfo := omit ,
+			hostPort := {host:="", portField:=c_defaultSipPort},
+			urlParameters := omit,
+			headers := omit
+		  }
+		}
+	  },
+	  toParams := omit
+	};
+	
+	const Via c_empty_Via := {
+	  fieldName := VIA_E,
+	  viaBody :={
+		{sentProtocol := {
+			protocolName := c_sipName,
+			protocolVersion := c_sipVersion,
+			transport := c_defaultSipProt
+		  },
+		  sentBy := {host:="", portField:=c_defaultSipPort},
+		  viaParams:= omit
+		}
+	  }};
+		
+
+}
+
+
+group UserProfileConstants
+{
+	  // number of user profile from 1-10 for SIP profile
+	  const integer c_userProfile_SIP1_home := 1;
+	  const integer c_userProfile_SIP2_home := 2;
+
+} //end group UserProfileConstants
+
+group StatusLines
+	{
+		const StatusLine c_statusLine100	:=	{c_sipNameVersion, 100, "Trying"};
+		const StatusLine c_statusLine180	:=	{c_sipNameVersion, 180, "Ringing"};
+		const StatusLine c_statusLine181	:=	{c_sipNameVersion, 181, "Call is Being Forwarded"};
+		const StatusLine c_statusLine182	:=	{c_sipNameVersion, 182, "Queued"};
+		const StatusLine c_statusLine183	:=	{c_sipNameVersion, 183, "Session Progress"};
+
+		const StatusLine c_statusLine200	:=	{c_sipNameVersion, 200, "OK"};
+		const StatusLine c_statusLine202	:=	{c_sipNameVersion, 202, "Accepted"};
+
+		const StatusLine c_statusLine300	:=	{c_sipNameVersion, 300, "Multiple Choices"};
+		const StatusLine c_statusLine301	:=	{c_sipNameVersion, 301, "Moved Permanently"};
+		const StatusLine c_statusLine302	:=	{c_sipNameVersion, 302, "Moved Temporarily"};
+		const StatusLine c_statusLine305	:=	{c_sipNameVersion, 305, "Use Proxy"};
+		const StatusLine c_statusLine380	:=	{c_sipNameVersion, 380, "Alternative Service"};
+
+		const StatusLine c_statusLine400	:=	{c_sipNameVersion, 400, "Bad Request"};
+		const StatusLine c_statusLine401	:=	{c_sipNameVersion, 401, "Unauthorised"};
+		const StatusLine c_statusLine402	:=	{c_sipNameVersion, 402, "Payment Required"};
+		const StatusLine c_statusLine403	:=	{c_sipNameVersion, 403, "Forbidden"};
+		const StatusLine c_statusLine404	:=	{c_sipNameVersion, 404, "Not Found"};
+		const StatusLine c_statusLine405	:=	{c_sipNameVersion, 405, "Method Not Allowed"};
+		const StatusLine c_statusLine406	:=	{c_sipNameVersion, 406, "Not Acceptable"};
+		const StatusLine c_statusLine407	:=	{c_sipNameVersion, 407, "Proxy authentication required"};
+		const StatusLine c_statusLine408	:=	{c_sipNameVersion, 408, "Request Timeout"};
+		const StatusLine c_statusLine410	:=	{c_sipNameVersion, 410, "Gone"};
+		const StatusLine c_statusLine413	:=	{c_sipNameVersion, 413, "Request Entity too long"};
+		const StatusLine c_statusLine414	:=	{c_sipNameVersion, 414, "Request-uri too long"};
+		const StatusLine c_statusLine415	:=	{c_sipNameVersion, 415, "Unsupported Media type"};
+		const StatusLine c_statusLine416	:=	{c_sipNameVersion, 416, "Unsupported URI scheme"};
+		const StatusLine c_statusLine420	:=	{c_sipNameVersion, 420, "Bad Extension"};
+		const StatusLine c_statusLine421	:=	{c_sipNameVersion, 421, "Extension required"};
+		const StatusLine c_statusLine422	:=	{c_sipNameVersion, 422, "Session Interval Too Small"};
+		const StatusLine c_statusLine423	:=	{c_sipNameVersion, 423, "Interval Too Brief"};
+  		const StatusLine c_statusLine433	:=	{c_sipNameVersion, 433, "Anonymity Disallowed"};
+		const StatusLine c_statusLine480	:=	{c_sipNameVersion, 480, "Temporarily Unavailable"};
+		const StatusLine c_statusLine481	:=	{c_sipNameVersion, 481, "Call/Transaction doesnot exist"};
+		const StatusLine c_statusLine482	:=	{c_sipNameVersion, 482, "Loop Detected"};
+		const StatusLine c_statusLine483	:=	{c_sipNameVersion, 483, "Too many hops"};
+		const StatusLine c_statusLine484	:=	{c_sipNameVersion, 484, "Address Incomplete"};
+		const StatusLine c_statusLine485	:=	{c_sipNameVersion, 485, "Ambiguous"};
+		const StatusLine c_statusLine486	:=	{c_sipNameVersion, 486, "Busy Here"};
+		const StatusLine c_statusLine487	:=	{c_sipNameVersion, 487, "Request Terminated"};
+		const StatusLine c_statusLine488	:=	{c_sipNameVersion, 488, "Not acceptable here"};
+		const StatusLine c_statusLine493	:=	{c_sipNameVersion, 493, "Undecipherable"};
+		const StatusLine c_statusLine500	:=	{c_sipNameVersion, 500, "Server Internal error"};
+		const StatusLine c_statusLine501	:=	{c_sipNameVersion, 501, "Not implemented"};
+		const StatusLine c_statusLine502	:=	{c_sipNameVersion, 502, "Bad Gateway"};
+		const StatusLine c_statusLine503	:=	{c_sipNameVersion, 503, "Service Unavailable"};
+		const StatusLine c_statusLine504	:=	{c_sipNameVersion, 504, "Server timeout"};
+		const StatusLine c_statusLine505	:=	{c_sipNameVersion, 505, "Version not supported"};
+		const StatusLine c_statusLine513	:=	{c_sipNameVersion, 513, "Message too long"};
+		const StatusLine c_statusLine580	:=	{c_sipNameVersion, 580, "Precondition failure"};
+		const StatusLine c_statusLine600	:=	{c_sipNameVersion, 600, "Busy Everywhere"};
+		const StatusLine c_statusLine603	:=	{c_sipNameVersion, 603, "Decline"};
+		const StatusLine c_statusLine604	:=	{c_sipNameVersion, 604, "Does not exist anywhere"};
+		const StatusLine c_statusLine606	:=	{c_sipNameVersion, 606, "Not acceptable"};
+		
+} //end StatusLines
+
+group SIPSyncPointNames {
+		const charstring c_Ringing := "Ringing";
+		const charstring c_uPlane := "uPlane";
+		const charstring c_sync1 := "sync1";
+		const charstring c_sync2 := "sync2";
+		const charstring c_sync3 := "sync3";
+ 		const charstring c_uPlaneStop := "uPlaneStop";
+		const charstring c_annoucA := "announcementA";
+		const charstring c_annoucB := "announcementB";
+		const charstring c_annouc := "announcement";
+		const charstring c_voicem := "voiceMessage";
+ }
+
+} //end group Constants
+
+group Types {
+group SubTypes{// Subtypes
+    
+    group TokenTypes // TokensTypes
+    {
+      // [20]
+      type enumerated FieldName
+      {
+        ACCEPT_E,
+        ACCEPT_ENCODING_E,
+        ACCEPT_LANGUAGE_E,
+        ALERT_INFO_E,
+        ALLOW_E,
+        AUTHENTICATION_INFO_E,
+        AUTHORIZATION_E,
+        CALL_ID_E,
+        CALL_INFO_E,
+        CONTACT_E,
+        CONTENT_DISPOSITION_E,
+        CONTENT_ENCODING_E,
+        CONTENT_LANGUAGE_E,
+        CONTENT_LENGTH_E,
+        CONTENT_TYPE_E,
+        CSEQ_E,
+        DATE_E,
+        ERROR_INFO_E,
+        EXPIRES_E,
+        FROM_E,
+        IN_REPLY_TO_E,
+        MAX_FORWARDS_E,
+        MIME_VERSION_E,
+        MIN_EXPIRES_E,
+        ORGANIZATION_E,
+        PRIORITY_E,
+        PROXY_AUTHENTICATE_E,
+        PROXY_AUTHORIZATION_E,
+        PROXY_REQUIRE_E,
+        RECORD_ROUTE_E,
+        REPLY_TO_E,
+        REQUIRE_E,
+        RETRY_AFTER_E,
+        ROUTE_E,
+        SERVER_E,
+        SUBJECT_E,
+        SUPPORTED_E,
+        TIMESTAMP_E,
+        TO_E,
+        UNSUPPORTED_E,
+        USER_AGENT_E,
+        VIA_E,
+        WARNING_E,
+        WWW_AUTHENTICATE_E,
+        
+		// [3262/7.1]
+		RACK_E,
+		RSEQ_E,
+		
+		// [3265/7.2]
+		ALLOW_EVENTS_E,
+		EVENT_E,
+		SUBSCRIPTION_STATE_E,
+		
+		// [3313]
+		P_MEDIA_AUTHORIZATION_E,
+		
+		// [3323]
+		PRIVACY_E,
+		
+		// [3325]
+		P_ASSERTED_ID_E,
+		P_PREFERRED_ID_E, 
+		       
+		// [3326]
+		REASON_E,
+
+		// [3515] - REFER method
+		REFER_TO_E,
+		
+		// [3891] 
+		REPLACES_E,
+
+		// [3892] - REFER method
+		REFERRED_BY_E,
+		
+		// [4244]
+		HISTORY_INFO_E,
+		
+		// [3313]
+		P_MEDIA_AUTH_E,
+		
+		// [3327]
+		PATH_E,	
+		
+		// [3329]
+		SECURITY_CLIENT_E,	
+		SECURITY_SERVER_E,
+		SECURITY_VERIFY_E,  
+		 
+		// [3455]
+		P_ACCESS_NETWORK_INFO_E,
+		P_ASSOCIATED_URI_E,
+		P_CALLED_PARTY_E,
+		P_CHARGING_FUNCTION_ADDRESSES_E,
+		P_CHARGING_VECTOR_E,
+		P_VISITED_NETWORK_E,
+		
+		// [3608]
+		SERVICE_ROUTE_E,
+		
+		// [3841]
+		ACCEPT_CONTACT_E,
+		
+		// [4028]
+		MIN_SE_E,
+		SESSION_EXPIRES_E,
+	
+		P_ASSERTED_SERVICE_E,
+		
+		//[5009]
+		P_EARLY_MEDIA_E,
+		
+		//http://tools.ietf.org/html/draft-johnston-sipping-cc-uui-07
+		//Transporting User to User Call Control Information in SIP for ISDN Interworking
+		USER_TO_USER_E
+		
+      }
+      
+	  // [7.1]
+	  type enumerated Method {
+		  ACK_E,
+		  BYE_E,
+		  CANCEL_E,
+		  INVITE_E,
+		  OPTIONS_E,
+		  REGISTER_E,
+		  PRACK_E, // Note: this element is not defined in [5]
+		  SUBSCRIBE_E, NOTIFY_E, // [3265]
+		  PUBLISH_E, // [3903/12]
+		  REFER_E, // [3515]
+		  UPDATE_E, // [3311]
+		  MESSAGE_E, // [3428]
+		  INFO_E,	// [2976]
+
+		  UNKNOWN_METHOD_E
+		  }
+	        
+      // [20.1, 20.3, 20.4, 20.7, 20.9, 20.10, 20.11, 20.18, 20.20, 20.27, 20.28, 20.30, 20.31,
+      // 20.33, 20.34, 20.39, 20.42, 20.44]
+      type record GenericParam
+      {
+        charstring                 id,
+        charstring                paramValue optional
+      }
+      
+      // [?]
+      type set of GenericParam SemicolonParam_List;
+      
+      // [?]
+      type set of GenericParam AmpersandParam_List;
+      
+      // [?]
+      type set of GenericParam CommaParam_List;
+      
+      // [20.10, 20.20, 20.30, 20.31, 20.34, 20.39, 20.42, 20.43]
+      type record HostPort
+      {
+        charstring             host optional,                // hostname, IPv4 or IPv6
+        integer                portField optional        // represented as an integer
+      }
+      
+      // [20.10, 20.20, 20.30, 20.31, 20.34, 20.39]
+/**
+ * 
+ * @desc identifier for user or telephone subscriber
+ * @member userOrTelephoneSubscriber provides the username or a phone name identifying the subscriber
+ * @member password related password information
+ * 
+ */
+     type record UserInfo
+      {
+        charstring	       userOrTelephoneSubscriber,
+        charstring	       password optional
+      }
+      
+      // [19.1.1 ;used in: 20.10, 20.20, 20.30, 20.31, 20.34, 20.39]
+
+
+/**
+ * 
+ * @desc Uniform Resource Identifier (URI)
+ * @member scheme distinguishes call types, e.g. voice, fax etc. or related address scheme, e.g. tel, sip
+ * @member userInfo Contains user information (also in non-SIP URLs) with optional parameter as passwords
+ * @member hostPort Hostname or IP address information and port identifier of the target
+ * @member urlParameters Contains either SIP or TEL URL parameters, separated by semicolons, e.g. transport=tcp or user=phone
+ * @member headers Additional information added after the parameters, e.g. priority=urgent
+ */
+      type record SipUrl
+      {
+        charstring		scheme,  // e.g "sip" or "tel"
+        UserInfo		userInfo optional,
+        HostPort		hostPort optional,
+        SemicolonParam_List	urlParameters optional,
+        AmpersandParam_List	headers optional
+      }
+      
+      // [20.1, RFC2616 14.1]
+      type record AcceptBody
+      {
+        charstring 		mediaRange,
+        SemicolonParam_List	acceptParam optional
+      }
+      
+      // [20.1, RFC2616 14.1]
+      type set of AcceptBody AcceptBody_List;
+      
+      // [20.4]
+      type record AlertInfoBody
+      {
+        charstring			url,	// any URI
+        SemicolonParam_List	genericParams optional
+      }
+      
+      // [20.4]
+      type set of AlertInfoBody AlertInfoBody_List;
+      
+      // [20.8]
+      type charstring CallidString;    // token ["@" token]
+      
+      // [20.8]
+      type set of CallidString CallidString_List;
+      
+      // [20.9]
+      type record CallInfoBody
+      {
+        charstring	 		url,	// any URI
+        SemicolonParam_List		infoParams optional
+      }
+      
+      // [20.9]
+      type set of CallInfoBody CallInfoBody_List;
+      
+      // [20.27, 20.44, .......10.32, 10.48; RFC2616 14.33, 14.47; RFC2617 1.2]
+      type union Challenge
+      {
+        CommaParam_List digestCln,
+        OtherAuth	otherChallenge
+      }
+      
+      // [20.10, 20.20, 20.30, 20.31, 20.34, 20.39]
+      type record NameAddr
+      {
+        charstring	displayName optional,
+        SipUrl		addrSpec
+      }
+      
+      // [20.10, 20.20, 20.31, 20.39]
+      type union Addr_Union
+      {
+        NameAddr	nameAddr,
+        SipUrl		addrSpecUnion // STS: "Union" added to filed name to avoid dangerous name equivalence with 2nd NameAddr field
+      }
+      
+      // [20.10]
+      type record ContactAddress
+      {
+        Addr_Union 		addressField,
+        SemicolonParam_List	contactParams optional
+      }
+      
+      // [20.10]
+      type set of ContactAddress ContactAddress_List; // 1 or more elements
+      
+      // [20.10]
+      type union ContactBody
+      {
+        charstring		wildcard,
+        ContactAddress_List	contactAddresses
+      }
+      
+      // [20.2, 20.12; RFC2616 14.3, 14.11]
+      type charstring ContentCoding;
+      
+      // [20.2, 20.12; RFC2616 14.3, 14.11]
+      type set of ContentCoding ContentCoding_List;
+      
+      // [20.7, 20.28; RFC2616 14.35 RFC2617 1.2]
+      type union Credentials
+      {
+        CommaParam_List	digestResponse,
+        OtherAuth  	    otherResponse
+      }
+      
+      // allow multiple Authorization headers due to RFC3261 ch. 20.7 and 20.28
+	  type record of Credentials CredentialsList;
+      
+      // [20.19, 20.23, 20.33]
+      type charstring	DeltaSec;	// an external operation can handle this field
+      
+      // [20.18]
+      type record ErrorInfoBody
+      {
+        charstring			uri,		// any URI
+        SemicolonParam_List		genericParams optional
+      }
+      
+      // [20.18]
+      type set of ErrorInfoBody ErrorInfoBody_List;
+      
+      // [20.3 RFC2616 14.4]
+      type record LanguageBody
+      {
+        charstring 		languageRange,
+        SemicolonParam_List	acceptParam optional
+      }
+      
+      // [20.3 RFC2616 14.4]
+      type set of LanguageBody LanguageBody_List;
+      
+      // [20.13; RFC2616 14.12]
+      type charstring LanguageTag;
+      
+      // [20.13; RFC2616 14.12]
+      type set of LanguageTag LanguageTag_List;
+      
+      // [20.5]
+      type set of charstring Method_List;
+      
+      
+      // [20.29, 20.32, 20.37, 20.40]
+      type charstring OptionTag;
+      
+      // [20.29, 20.32, 20.37, 20.40]
+      type set of OptionTag OptionTag_List;
+      
+      
+      // [20.7, 20.27, 20.28, 20.44  ; RFC2616 14.33, 14.47; RFC2617 1.2]
+      type record OtherAuth
+      {
+        charstring		authScheme,
+        CommaParam_List	authParams
+      }
+      
+      type record Payload
+      {
+        integer		payloadlength,
+        charstring 		payloadvalue
+      }
+      
+      // [20.30,20.34]
+      type record RouteBody
+      {
+        NameAddr			nameAddr,
+        SemicolonParam_List	rrParam optional
+      }
+      
+      // [20.30,20.34]
+      type record of RouteBody RouteBody_List;
+      
+      // [20.42]
+      type record SentProtocol
+      {
+        charstring		protocolName,
+        charstring		protocolVersion,
+        charstring		transport
+      }
+      
+      // [20.35, 20.41; RFC2616 14.43]
+      type charstring ServerVal;
+      
+      // [20.35, 20.41; RFC2616 14.43]
+      type set of ServerVal ServerVal_List;
+      
+      // [20.38]
+      type record TimeValue
+      {
+        integer			majorDigit,		// represented as an integer
+        integer			minorDigit optional	// represented as an integer
+      }
+      
+      // [20.42]
+      type record ViaBody
+      {
+        SentProtocol	sentProtocol,
+        HostPort		sentBy,
+        SemicolonParam_List	viaParams optional
+      }
+      
+      // [20.42]
+      type record of ViaBody ViaBody_List;
+      
+      // [20.43]
+      type union WarnAgent
+      {
+        HostPort		hostPort,
+        charstring		pseudonym
+      }
+      
+      // [20.43]
+      type record WarningValue
+      {
+        integer		warnCode,	// represented as an integer
+        WarnAgent		warnAgent,
+        charstring		WarnText
+      }
+      
+      // [20.43]
+      type set of WarningValue WarningValue_List;
+
+	  type Addr_Union PAssertedIDValue;
+      
+	  type record of PAssertedIDValue PAssertedIDValue_List;
+
+	  type charstring PAssertedServiceValue;
+
+	  type Addr_Union PPreferredIDValue;
+      
+	  type record of PPreferredIDValue PPreferredIDValue_List;
+
+	  type charstring PrivacyValue;
+      
+	  type record of PrivacyValue PrivacyValue_List;
+
+      
+    } // end group TokensType
+    
+    
+    group HeaderFieldTypes  // Header Fields
+    {
+	group CommonHeaderFieldTypes
+    {
+      // [20.1, RFC2616 14.1]
+      type record Accept
+      {
+        FieldName		fieldName (ACCEPT_E),
+        AcceptBody_List	        acceptArgs optional
+      }
+      
+      // [20.2, RFC2616 14.3]
+      type record AcceptEncoding
+      {
+        FieldName		fieldName (ACCEPT_ENCODING_E),
+        ContentCoding_List	contentCoding optional
+      }
+      
+      // [20.3, RFC2616 14.4]
+      type record AcceptLanguage
+      {
+        FieldName		fieldName (ACCEPT_LANGUAGE_E),
+        LanguageBody_List	languageBody optional
+      }
+      
+      // [20.4]
+      type record AlertInfo
+      {
+        FieldName		fieldName (ALERT_INFO_E),
+        AlertInfoBody_List	alertInfoBody optional
+      }
+      
+      // [20.5]
+      type record Allow
+      {
+        FieldName		fieldName (ALLOW_E),
+        Method_List		methods optional
+      }
+      
+      // [20.6]
+      type record AuthenticationInfo
+      {
+        FieldName		fieldName (AUTHENTICATION_INFO_E),
+        CommaParam_List	ainfo
+      }
+      
+      // [20.7 RFC2617 3.2.2]
+      type record Authorization
+      {
+        FieldName		fieldName (AUTHORIZATION_E),
+		CredentialsList	body // changed from Credentials to allow multiple Authorization headers
+      }
+      
+      // [20.8]
+      type record CallId
+      {
+        FieldName		fieldName (CALL_ID_E),
+        CallidString       	callid
+      }
+      
+      // [20.9]
+      type record CallInfo
+      {
+        FieldName		fieldName (CALL_INFO_E),
+        CallInfoBody_List	callInfoBody optional
+      }
+      
+      // [20.10]
+      type record Contact
+      {
+        FieldName		fieldName (CONTACT_E),
+        ContactBody		contactBody
+      }
+      
+      // [20.11]
+      type record ContentDisposition
+      {
+        FieldName		fieldName (CONTENT_DISPOSITION_E),
+        charstring		dispositionType,
+        SemicolonParam_List	dispositionParams optional
+      }
+      
+      // [20.12 RFC2616 14.11]
+      type record ContentEncoding
+      {
+        FieldName		fieldName (CONTENT_ENCODING_E),
+        ContentCoding_List	contentCoding
+      }
+      
+      // [20.13 RFC2616 14.12]
+      type record ContentLanguage
+      {
+        FieldName		fieldName (CONTENT_LANGUAGE_E),
+        LanguageTag_List	languageTag
+      }
+      
+      // [20.14]
+      type record ContentLength
+      {
+        FieldName		fieldName (CONTENT_LENGTH_E),
+        integer		len	// this field is represented as an integer
+      }
+      
+      // [20.15]
+      type record ContentType
+      {
+        FieldName		fieldName (CONTENT_TYPE_E),
+        charstring		mediaType
+      }
+      
+      // [20.16]
+      type record CSeq
+      {
+        FieldName		fieldName (CSEQ_E),
+        integer		seqNumber,	// this field is represented as an integer
+        charstring   	method
+      }
+      
+      // [20.17]
+      type record Date
+      {
+        FieldName		fieldName (DATE_E),
+        charstring		sipDate
+      }
+      
+      // [20.18]
+      type record ErrorInfo
+      {
+        FieldName		fieldName (ERROR_INFO_E),
+        ErrorInfoBody_List	errorInfo optional
+      }
+      
+      // [20.19]
+      type record Expires
+      {
+        FieldName		fieldName (EXPIRES_E),
+        DeltaSec		deltaSec
+      }
+      
+      // [20.20]
+      type record From
+      {
+        FieldName		fieldName (FROM_E),
+        Addr_Union    	addressField,
+        SemicolonParam_List	fromParams optional
+      }
+      
+      // [20.21]
+      type record InReplyTo
+      {
+        FieldName		fieldName (IN_REPLY_TO_E),
+        CallidString_List	callids
+      }
+      
+      // [20.22]
+      type record MaxForwards
+      {
+        FieldName		fieldName (MAX_FORWARDS_E),
+        integer		forwards	// this field is represented as an integer
+      }
+      
+      // [20.23]
+      type record MinExpires
+      {
+        FieldName		fieldName (MIN_EXPIRES_E),
+        DeltaSec		deltaSec
+      }
+      
+      // [20.24 RFC2616 19.4.1]
+      type record MimeVersion
+      {
+        FieldName		fieldName (MIME_VERSION_E),
+        integer		majorNumber,	// this field is represented as an integer
+        integer		minorNumber	// this field is represented as an integer
+      }
+      
+      // [20.25]
+      type record Organization
+      {
+        FieldName		fieldName (ORGANIZATION_E),
+        charstring		organization
+      }
+      
+      // [20.26]
+      type record Priority
+      {
+        FieldName		fieldName (PRIORITY_E),
+        charstring		priorityValue
+      }
+      
+      // [20.27 RFC2616 14.33 RFC2617 1.2]
+      type record ProxyAuthenticate
+      {
+        FieldName		fieldName (PROXY_AUTHENTICATE_E),
+        Challenge		challenge
+      }
+      
+      // [20.28 RFC2616 14.35 RFC2617 1.2]
+      type record ProxyAuthorization
+      {
+        FieldName		fieldName (PROXY_AUTHORIZATION_E),
+        CredentialsList		credentials // changed from Credentials to allow multiple Authorization headers
+      }
+      
+      // [20.29]
+      type record ProxyRequire
+      {
+        FieldName		fieldName (PROXY_REQUIRE_E),
+        OptionTag_List	optionsTags
+      }
+      
+      // [20.30]
+      type record RecordRoute
+      {
+        FieldName		fieldName (RECORD_ROUTE_E),
+        RouteBody_List	routeBody
+      }
+      
+      // [20.31]
+      type record ReplyTo
+      {
+        FieldName		fieldName (REPLY_TO_E),
+        Addr_Union    	addressField,
+        SemicolonParam_List	replyToParams optional
+      }
+      
+      // [20.32]
+      type record Require
+      {
+        FieldName		fieldName (REQUIRE_E),
+        OptionTag_List	optionsTags
+      }
+      
+      // [20.33]
+      type record RetryAfter
+      {
+        FieldName		fieldName (RETRY_AFTER_E),
+        DeltaSec    	deltaSec,
+        charstring		comment optional,
+        SemicolonParam_List	retryParams optional
+      }
+      
+      // [20.34]
+      type record Route
+      {
+        FieldName		fieldName (ROUTE_E),
+        RouteBody_List	routeBody
+      }
+      
+      // [20.35 RFC2616 14.38]
+      type record Server
+      {
+        FieldName		fieldName (SERVER_E),
+        ServerVal_List	serverBody
+      }
+      
+      // [20.36]
+      type record Subject
+      {
+        FieldName		fieldName (SUBJECT_E),
+        charstring		summary
+      }
+      
+      // [20.37]
+      type record Supported
+      {
+        FieldName		fieldName (SUPPORTED_E),
+        OptionTag_List	optionsTags optional
+      }
+      
+      // [20.38]
+      type record Timestamp
+      {
+        FieldName		fieldName (TIMESTAMP_E),
+        TimeValue		timeValue optional,
+        TimeValue		delay optional
+      }
+      
+      // [20.39]
+      type record To
+      {
+        FieldName		fieldName (TO_E),
+        Addr_Union      	addressField,
+        SemicolonParam_List	toParams optional
+      }
+      
+      // [20.40]
+      type record Unsupported
+      {
+        FieldName		fieldName (UNSUPPORTED_E),
+        OptionTag_List		optionsTags
+      }
+      
+      // Undefined header field
+      type record UndefinedHeader
+      {
+        charstring		headerName,
+        charstring		headerValue
+      }
+      
+      type set of UndefinedHeader UndefinedHeader_List;
+      
+      // [20.41 RFC2616 14.43]
+      type record UserAgent
+      {
+        FieldName		fieldName (USER_AGENT_E),
+        ServerVal_List 	userAgentBody
+      }
+      
+      // [20.42]
+      type record Via
+      {
+        FieldName		fieldName (VIA_E),
+        ViaBody_List		viaBody
+      }
+      
+      // [20.43]
+      type record Warning
+      {
+        FieldName		fieldName (WARNING_E),
+        WarningValue_List	warningValue
+      }
+      
+      // [20.44 RFC2616 14.47 RFC2617 1.2]
+      type record WwwAuthenticate
+      {
+        FieldName		fieldName (WWW_AUTHENTICATE_E),
+        Challenge		challenge
+      }
+      }//end group CommonHeaderFieldTypes
+	  group RFC3262HeaderFieldTypes
+	  {
+	  // [3262/7.1]
+	  type record RSeq {
+		  FieldName fieldName(RSEQ_E),
+		  integer responseNum
+	  }
+
+	  // [3262/7.2]
+	  type record RAck {
+		  FieldName fieldName(RACK_E),
+		  integer responseNum,
+		  integer seqNumber,
+		  charstring method
+	  }
+	  }//end group RFC3262HeaderFieldTypes
+
+	  group RFC3265HeaderFieldTypes
+	  {
+	  // [3265/7.2]
+	  type record AllowEvents {
+		  FieldName fieldName(ALLOW_EVENTS_E),
+		  EventType_List eventTypes
+	  }
+	  
+	  type set of EventType EventType_List;
+	  type charstring EventType;
+	  
+	  // [3265/7.2]
+	  type record Event {
+		  FieldName fieldName(EVENT_E),
+		  EventType eventType,
+		  SemicolonParam_List eventParams optional
+	  }
+	  
+	  // [3265/7.2]
+	  type record SubscriptionState {
+		  FieldName fieldName(SUBSCRIPTION_STATE_E),
+		  SubState subState,
+		  SemicolonParam_List substateParams optional
+	  }
+	  
+	  type charstring SubState;
+	  }//end group RFC3265HeaderFieldTypes	
+
+	  group RFC3313HeaderFieldTypes
+	  {
+	  // [3313/5]
+	  type record PMediaAuthorization {
+		  FieldName fieldName(P_MEDIA_AUTHORIZATION_E),
+		  PMediaAuthorization_List pMediaAuthorizations
+	  }
+			
+	  type charstring PMediaAuthValue; //HEXDIG "0"-"9", "A"-"F"
+	  
+	  type record of PMediaAuthValue PMediaAuthorization_List;
+	  
+	  }//end group RFC3265HeaderFieldTypes
+
+	  group RFC3323HeaderFieldTypes
+	  {
+	  // [3323]
+	  type record Privacy {
+		  FieldName fieldName(PRIVACY_E),
+		  PrivacyValue_List privValueList
+	  }   
+	  }//end group RFC3323HeaderFieldTypes     
+
+	  group RFC3325HeaderFieldTypes
+	  {
+	  // [3325]
+	  type record PAssertedID {
+		  FieldName fieldName(P_ASSERTED_ID_E),
+		  PAssertedIDValue_List pAssertedIDValueList
+	  }
+
+	  // [3325]
+	  type record PPreferredID {
+		  FieldName fieldName(P_PREFERRED_ID_E),
+		  PPreferredIDValue_List pPreferredIDValueList
+	  }
+      }//end group RFC3325HeaderFieldTypes
+	  
+	  group RFC3326HeaderFieldTypes
+	  {
+	  //[3326]
+	  type record of ReasonValue ReasonValues;
+	  
+	  type record ReasonValue {
+	  charstring token,
+	  SemicolonParam_List reasonParams optional
+  	  } 	  
+	  
+	  type record Reason {
+	  FieldName fieldName(REASON_E),
+	  ReasonValues reasonValues
+	  }
+	  }//end group RFC3326HeaderFieldTypes
+	  
+	  group RFC3327HeaderFieldTypes
+	  {	  
+	  // [3327]
+	  type record Path {
+		  FieldName fieldName(PATH_E),
+		  PathValues pathValues
+	  }
+	  
+	  type record of PathValue PathValues;
+
+	  type record PathValue {
+		  NameAddr nameAddr,
+		  SemicolonParam_List rrParam optional
+	  }
+	  }//end group RFC3515HeaderFieldTypes
+	  
+	  group RFC3329HeaderFieldTypes
+	  {			
+	  // [RFC3329/2.2]
+	  type record SecurityMechanism {
+		charstring mechName,
+		SemicolonParam_List mechParams optional
+	  }
+
+	  type set of SecurityMechanism SecurityMechanism_List;
+			
+	  type record SecurityClient {
+		FieldName fieldName(SECURITY_CLIENT_E),
+		SecurityMechanism_List securityMech
+	  }
+
+	  type record SecurityServer {
+		FieldName fieldName(SECURITY_SERVER_E),
+		SecurityMechanism_List securityMech
+	  }
+
+	  type record SecurityVerify {
+		FieldName fieldName(SECURITY_VERIFY_E),
+		SecurityMechanism_List securityMech
+	  }
+	  }//end group RFC3329HeaderFieldTypes
+	  
+	  group RFC3455HeaderFieldTypes
+	  {	  
+	  type record of NameAddrParam NameAddrParam_List;
+
+	  type record NameAddrParam {
+		  NameAddr nameAddr,
+		  SemicolonParam_List genericParams optional
+	  }
+	  //[3455/5.1]
+	  type record PAssociatedURI {
+		FieldName fieldName(P_ASSOCIATED_URI_E),
+		NameAddrParam_List nameAddrList
+	  }	  
+	  //[3455/5.2]
+	  type record PCalledPartyID {
+		  FieldName fieldName(P_CALLED_PARTY_E),
+		  NameAddrParam nameAddParams
+	  }
+
+	  type record of VnetworkSpec VnetworkSpec_List;
+
+	  type record VnetworkSpec {
+		charstring vNetworkSpecToken,
+		SemicolonParam_List genericParams optional
+	  }
+	  
+	  //[3455/5.3]
+	  type record PVisitedNetworkID {
+		FieldName fieldName(P_VISITED_NETWORK_E),
+		VnetworkSpec_List vNetWorkSpec
+	  }
+	  
+	  //[3455/5.4]
+	  type record PAccessNetworkInfo {
+		FieldName fieldName(P_ACCESS_NETWORK_INFO_E),
+		charstring accessType,
+		SemicolonParam_List genericParams optional
+	  }
+	  
+	  //[3455/5.5]			
+	  type record PChargingFunctionAddresses {
+		FieldName fieldName(P_CHARGING_FUNCTION_ADDRESSES_E),
+		SemicolonParam_List chargeAddrParams optional
+	  }
+				
+	  //[3455/5.6] 
+	  type record PChargingVector {
+		FieldName fieldName(P_CHARGING_VECTOR_E),
+		SemicolonParam_List chargeParams optional
+	  }
+	  }//end group RFC33455HeaderFieldTypes
+	  
+	  group RFC3515HeaderFieldTypes
+	  {
+	  // [3515]
+	  type record ReferTo {
+		  FieldName fieldName(REFER_TO_E),
+		  NameAddr nameAddr,
+		  SemicolonParam_List referToParams optional
+	  }
+	  }//end group RFC3515HeaderFieldTypes
+
+	  group RFC3608HeaderFieldTypes
+	  {
+	  // [3608]
+	  type record ServiceRoute {
+		FieldName fieldName(SERVICE_ROUTE_E),
+		RouteBody_List	routeBody
+	  }
+	  }//end group RFC33608HeaderFieldTypes
+	  
+
+	  group RFC3841HeaderFieldTypes
+	  {
+	  // [3841]
+	  type record AcceptContact {
+		  FieldName fieldName(ACCEPT_CONTACT_E),
+		  AcRcValue_List acValues
+	  }
+
+	  type set of AcRcValue AcRcValue_List;
+
+	  type record AcRcValue {
+		  charstring wildcard(c_WILDCARD),
+		  SemicolonParam_List acRcParams optional
+	  }	  	  
+	  }// end group RFC3841HeaderFieldTypes
+
+	  group RFC3891HeaderFieldTypes
+	  {
+	  // [3891]
+      type record Replaces
+      {
+        FieldName			fieldName (REPLACES_E),
+		SemicolonParam_List replacesParams
+      }
+      }// end group RFC3891HeaderFieldTypes
+      
+	  group RFC3892HeaderFieldTypes
+	  {
+	  // [3892]
+	  type record ReferredBy {
+		  FieldName fieldName(REFERRED_BY_E),
+		  NameAddr nameAddr,
+		  SemicolonParam_List referredbyIdParams optional
+	  }
+	  }//end group RFC3892HeaderFieldTypes
+
+	  group RFC4028HeaderFieldTypes
+	  {
+	  // [4028]				
+	  type record MinSE {
+		FieldName fieldName(MIN_SE_E),
+		DeltaSec deltaSec,
+		SemicolonParam_List minSeParam optional
+	  }
+	  // [4028]
+	  type record SessionExpires {
+		FieldName fieldName(SESSION_EXPIRES_E),
+		DeltaSec deltaSec,
+		SemicolonParam_List seParam optional
+	  }
+	  }//end group RFC4028HeaderFieldTypes
+	  
+	  group RFC4244HeaderFieldTypes
+	  {
+	  // [4244]
+	  type record HistoryInfo {
+		  FieldName fieldName(HISTORY_INFO_E),
+		  HistoryInfo_List historyInfoList
+	  }
+
+	  type record of HistoryInfoEntry HistoryInfo_List;
+
+	  type record of integer IntegerList;
+
+	  type record HistoryInfoEntry {
+		  NameAddr nameAddr,
+		  IntegerList hiIndex optional,
+		  SemicolonParam_List hiExtention optional
+	  }
+	  }//end group RFC4244HeaderFieldTypes
+	  
+	  group RFC5009PEarlyMediaHeader
+	  {
+	  // [5009]
+	  type record PEarlyMedia {
+		  FieldName fieldName(P_EARLY_MEDIA_E),
+		  EM_List em_param
+	  }
+	  type record of charstring EM_List; 
+	  }//end group RFC5009PEarlyMediaHeader
+
+      //http://tools.ietf.org/html/draft-johnston-sipping-cc-uui-07, expires 16.Aug.2009
+      //Transporting User to User Call Control Information in SIP for ISDN Interworking
+      //type definition of SIP header mechanism 
+      group UserToUser_PreliminaryRFCDraft
+      {
+      	type record UserToUser{
+			FieldName fieldName (USER_TO_USER_E),
+			charstring  uuiData length(256), /*length limitation due to ISDN, max of allowed 128 hex digits are represented by 256 characters*/
+			GenericParam uuiParam
+      	}
+
+      }//end group UserToUser_PreliminaryRFCDraft
+
+	  type record PAssertedService {
+		  FieldName fieldName(P_ASSERTED_SERVICE_E),
+		  PAssertedServiceValue pAssertedServiceValue
+	  }
+
+    } // end group HeaderFieldTypes
+    
+    group MessageHeaderTypes
+    {
+      
+      // Message-Header for all SIP requests and responses [20]
+      type set MessageHeader
+      {
+        Accept				accept optional,
+		AcceptContact		acceptContact optional,
+        AcceptEncoding		acceptEncoding optional,
+        AcceptLanguage		acceptLanguage optional,
+        AlertInfo			alertInfo optional,
+        Allow				allow optional,
+		AllowEvents 		allowEvents optional, // 3265/7.2
+        AuthenticationInfo	authenticationInfo optional, // only in responses
+        Authorization		authorization optional, // only in requests
+        CallId				callId optional, // optional only in Invalid test cases mandatory otherwise
+        CallInfo			callInfo optional,
+        Contact				contact optional, // optional in response and all requests except INVITE where mandatory
+        ContentDisposition	contentDisposition optional,
+        ContentEncoding		contentEncoding optional,
+        ContentLanguage		contentLanguage optional,
+        ContentLength		contentLength optional, // optional in responses and all requests except ACK where mandatory
+        ContentType			contentType optional,
+        CSeq				cSeq optional, // optional only in Invalid test cases mandatory otherwise
+        Date				date optional,
+        ErrorInfo 			errorInfo optional, // only in responses
+		Event 				event optional, // 3265/7.2
+        Expires 			expires optional,
+        From				fromField,
+		HistoryInfo 		historyInfo optional, // 4244
+        InReplyTo 			inReplyTo optional, // only in requests
+        MaxForwards			maxForwards optional, // mandatory in requests not required in responses!
+        MimeVersion			mimeVersion optional,
+        MinExpires			minExpires optional, // only in responses
+		MinSE 				minSE optional, // 4028
+        Organization		organization optional,
+		PAccessNetworkInfo 	pAccessNetworkInfo optional, // 3455
+		PAssertedID 		pAssertedID optional, // 3325
+		PAssertedService	pAssertedService optional,
+		PAssociatedURI		pAssociatedURI optional, // 3455
+		Path 				path optional, // 3327
+		PCalledPartyID 		pCalledPartyID optional, // 3455
+		PChargingFunctionAddresses pChargingFunctionAddresses optional, // 3455
+		PChargingVector 	pChargingVector optional, // 3455
+		PEarlyMedia			pEarlyMedia	optional, // 5009
+		PMediaAuthorization pMediaAuthorization optional, // 3313
+		PPreferredID 		pPreferredID optional, // 3325
+        Priority 			priority optional,  // only in requests
+		Privacy 			privacy optional, // 3323
+        ProxyAuthenticate	proxyAuthenticate optional, // only in responses
+        ProxyAuthorization	proxyAuthorization optional, // only in requests
+        ProxyRequire		proxyRequire optional, // only in requests
+		PVisitedNetworkID 	pVisitedNetworkID optional, // 3455
+		RAck 				rAck optional, // 3262/7.1
+		RSeq 				rSeq optional, // 3262/7.1
+		Reason 				reason optional, // 3326
+        RecordRoute			recordRoute optional,
+		ReferredBy 			referredBy optional, // 3892 - REFER method	
+		ReferTo 			referTo optional, // 3515 - REFER method
+		Replaces			replaces optional, // 3891
+        ReplyTo				replyTo optional, // optional in responses and INVITE requests
+        Require 			require optional,
+        RetryAfter			retryAfter optional, // only in responses
+        Route 				route optional, // only in requests
+		SecurityClient 		securityClient optional, // 3329
+		SecurityServer 		securityServer optional, // 3329
+		SecurityVerify 		securityVerify optional, // 3329
+        Server				server optional, // only in responses
+		ServiceRoute 		serviceRoute optional, // 3608
+		SessionExpires 		sessionExpires optional, // 4028
+        Subject				subject optional, // only in requests
+		SubscriptionState 	subscriptionState optional, // 3265/7.2
+        Supported 			supported optional,
+        Timestamp 			timestamp optional,
+        To					toField,
+        Unsupported			unsupported optional, // only in responses
+		UserToUser          userToUser optional,
+        UserAgent 			userAgent optional,
+        Via					via,
+        Warning				warning optional, // only in responses
+        WwwAuthenticate		wwwAuthenticate optional, // only in responses
+        UndefinedHeader_List	undefinedHeader_List optional
+      }
+      
+    } // end group MessageHeaderTypes
+    
+    group StartLineTypes
+    {
+      // Request-Line [7.1]
+      type record RequestLine
+      {
+        Method			method,
+        SipUrl			requestUri,
+        charstring		sipVersion
+      }
+      
+      // Status-Line [7.2]
+      type record StatusLine
+      {
+        charstring		sipVersion,
+        integer			statusCode,
+        charstring		reasonPhrase
+      }
+      
+    } // end group StartLineTypes
+    
+    
+    group otherTypes{
+    
+    type record SipUserProfile
+    {	
+		/** @desc	integer for the userprofile identifier
+		 */		
+		integer		id,
+
+		/** @desc	integer for Port number to exchange SIP messages
+		*/
+		integer     currPort,
+
+		/** @desc	charstring for IP address to exchange SIP messages
+		*/
+		charstring  currIpaddr,		
+		
+		/** @desc	integer for Port number to exchange SIP messages
+		*/
+		integer     contactPort,
+
+		/** @desc	charstring for IP address to exchange SIP messages
+		*/
+		charstring  contactIpaddr,
+
+		/** @desc	charstring for IP address used by the TS to exchange media streams
+		*/
+		charstring  bearerIpaddr,
+
+		/** @desc	charstring for identity of the tester local domain
+		*/
+		charstring  homeDomain,
+
+		/** @desc	charstring for identity of the tester local user
+		*/
+		charstring  publUsername,
+		
+		/** @desc	charstring for RFC 2617 3.2.1 qop options:
+		* Quoted string of one or more tokens indicating the "quality of protection" values supported by the server. The
+		* value "auth" indicates authentication; the value "auth-int" indicates authentication with integrity protection.
+		*/
+		charstring qop,
+
+		/** @desc	charstring for RFC 2617 3.2.2 username for authentication
+		* The name of user in the specified realm
+		*/
+		charstring privUsername,
+
+		/** @desc	charstring for RFC 2617 3.2.2.2 passwd: A known shared secret, the password of user of the specified username
+		*/
+		charstring passwd,
+
+		/** @desc	charstring for registrar domain for authentication and request line
+		*/
+		charstring registrarDomain
+    	
+    }
+    
+    
+    } // end group otherTypes
+    
+  }// end group Subtypes
+  
+
+
+  group MSGtypes{
+    
+    group RequestTypes
+    {
+      // [7.1]
+
+	/**
+	* 
+	* @desc generic type of a SIP request message
+	* @member statusLine contains a method name, a Request-URI, and the protocol version
+	* @member msgHeader include all possible header fields that are allowed to be present according to RFCs and other standards
+	* @member messageBody depends on the request method, includes e.g. SDP message.
+	* @member payload  contains the whole message as it has been received in its text format
+	*/	
+      type record Request
+      {
+        RequestLine		requestLine,
+        MessageHeader 	msgHeader,
+		MessageBody		messageBody optional,
+        Payload			payload	    optional
+      } 
+      
+      // Note: the introduction of the following  specific types is to enable better means for logging
+      //       on the other side the generic type is useful for functions dealing with multiple SIP message types
+      
+	  type record REGISTER_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  type record INVITE_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+	  
+	  type record OPTIONS_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  type record BYE_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  type record CANCEL_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+	  
+	  type record ACK_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  // [3262/7.1]
+	  type record PRACK_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  // [3265/7.1]
+	  type record NOTIFY_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  // [3265/7.1]
+	  type record SUBSCRIBE_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  // [3903/11.1]
+	  type record PUBLISH_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  //	[3311/7]
+	  type record UPDATE_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  //
+	  type record REFER_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  //
+	  type record MESSAGE_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  //
+	  type record INFO_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+	  
+    }  with { encode "SIPCodec" }// end group RequestTypes
+    
+    group ResponseTypes
+    {
+      // [7.2]
+
+	/**
+	* 
+	* @desc generic type of a SIP response message
+	* @member statusLine consists of the protocol version followed by a numeric Status-Code and its associated textual phrase
+	* @member msgHeader include all possible header fields that are allowed to be present according to RFCs and other standards
+	* @member messageBody depends on the response method, includes e.g. SDP message.
+	* @member payload  contains the whole message as it has been received in its text format
+	*/
+      type record Response
+      {
+        StatusLine		statusLine,
+        MessageHeader 	msgHeader,
+		MessageBody		messageBody optional,
+        Payload			payload	    optional
+      } 
+    } with { encode "SIPCodec" }// end group ResponseTypes
+    
+    // This MSG type is defined for sending synctactic variations, ans syntactically
+    // erroneous messages, and receving messages failed parsing.
+    group SyntacticTypes
+    {
+      type charstring Raw;
+    } // end group SyntacticTypes
+    
+	// This type is defined for particular SIP message body types like SDP
+
+	group MessageBodyTypes
+	{
+	  type union MessageBody{
+		SDP_Message sdpMessageBody, 	// if there is only SDP part
+		XmlBody xmlBody,            	// if there is XML message body
+  	XMLMessage xmlMessage,          // if there is XML with header&body
+		MIME_Message mimeMessageBody, 	//if there is SDP and encapsulated ISUP part
+		charstring sipfrag, 			// if content-Type is message/sipfrag (cp. NOTIFY, cp TS124147 A.4.3.1.2)
+		charstring textplain			// if content type is text/plain (for testing long messages)
+	  };
+ 
+	} // end group MessageBodyTypes
+		
+ 	group MIMETypes
+  	{  	
+	  group SubMIMETypes
+	  {
+    	
+		type union MIME_Encapsulated_Parts {
+		  SDP_Message 				sdpMessageBody,
+		  XmlBody 					xmlBody,       	// if there is XML message body
+		  XMLMessage 				xmlMessage		// if there is XML with header&body
+		} 
+		
+		type record MIME_Encapsulated_Part {
+		  charstring 				content_type,
+		  charstring				content_disposition optional,
+		  MIME_Encapsulated_Parts 	mime_encapsulated_part
+		}
+	  }//end group SubMIMETypes
+
+	  group MessageTypes {
+ 
+	    type record MIME_Message {
+		  charstring boundary, // len: 
+		  MimeEncapsulatedList mimeEncapsulatedList
+	    }
+	  
+	    type record of MIME_Encapsulated_Part MimeEncapsulatedList;
+
+	  } // group MessageTypes
+    } // group MIMETypes
+    
+  }// end group MSGTypes
+}// end group Types
+
+} // end module LibSip_TypesAndValues
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_Steps.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_Steps.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_Steps.ttcn	(revision 22)
@@ -0,0 +1,3739 @@
+/*
+ *	@author 	STF 346, STF366, STF368, STF369
+ *  @version    $Id: LibSip_Steps.ttcn 350 2009-05-22 08:18:45Z saiu $
+ *	@desc		This module provides the types used by the test component 
+ *              for SIP-IMS tests.
+ */
+
+module LibSip_Steps language "TTCN-3:2005"//MRO
+{	
+	//LibCommon
+	import from LibCommon_Sync all ;
+	import from LibCommon_VerdictControl all ;
+	//LibSip
+	import from LibSip_SIPTypesAndValues all;
+	import from LibSip_SDPTypes all;
+	import from LibSip_Templates all;
+	import from LibSip_Interface all;
+	import from LibSip_PIXITS all;
+	import from LibSip_XMLTypes all;
+
+group externalfunctions {
+	
+	//Return random charstring
+	external function fx_rndStr() return charstring;
+	// Return the equivalent string in lower case
+	external function fx_putInLowercase(charstring par_string) return charstring;
+	
+	external function fx_getIpAddr(charstring host_name) return charstring;
+
+	// External function to generate a digest response.
+	// References:
+	//   * RFC 2617 HTTP Authentication: Basic and Digest Access
+	//     Authentication, and
+	//   * RFC 1321 The MD5 Message-Digest Algorithm
+	// See RFC 2617, chapter 5 Sample implementation, for example usage, as
+	// the signature of calculateDigestResponse is according to the example
+	// given in the RFC.
+	//
+	external function fx_calculateDigestResponse(
+	  charstring nonce,
+	  charstring cnonce,
+	  charstring user,
+	  charstring realm,
+	  charstring passwd,
+	  charstring alg,
+	  charstring nonceCount,
+	  charstring method,
+	  charstring qop,
+	  charstring URI,
+	  charstring HEntity) return charstring;
+
+}
+
+group ParameterOperations {
+
+	/**
+	 * 
+	 * @desc function to generate a 32 bits random number as a charstring for tag field
+	 * (used as e.g.: tag in from-header field, or branch parameter in via header)
+	 * @return random value with at least 32 bits of randomness
+	 * 
+	 */
+	 function f_getRndTag() return charstring
+	{
+	  var charstring tag_value;
+	  //tag_value is initialized with a random value with at least 32 bits of randomness
+	  // 4294967296 is a 32 bits integer
+	  tag_value := fx_rndStr()&fx_rndStr();
+	  return(tag_value);
+	}
+
+	/**
+	 * 
+	 * @desc  Function to prepare credentials for request that has an empty
+	 * entity body such as a REGISTER message.
+	 * @param p_userprofile to get important parameters
+	 * @return Credentials field
+	 */
+	function f_calculatecCredentials_empty(in SipUserProfile p_userprofile) return Credentials
+	{
+	  var Credentials v_result;
+	      
+	  var charstring v_nonce := "";
+	      
+	  // RFC 2617 3.2.2 username:
+	  // The name of user in the specified realm.
+	  var charstring v_username := p_userprofile.privUsername;
+	      
+	  var charstring v_realm := p_userprofile.registrarDomain;
+	      
+	  var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
+	           
+	  var charstring v_response := "";
+	 
+	  // Construct credentials for an Authorization field of a request.
+	  v_result :=
+	  {
+		digestResponse :=
+		{
+		  { id := "Digest username", paramValue := v_username },
+		  { id := "realm", paramValue := v_realm },
+		  { id := "uri", paramValue := v_uri },
+		  { id := "nonce=""""", paramValue := omit }, // already enclosed to " characters
+		  { id := "response=""""", paramValue := omit } // already enclosed to " characters
+		}
+	  };
+	      
+	  return v_result;
+	}
+
+
+	/**
+	 * 
+	 * @desc  Function to calculate credentials for request that has an empty
+	 * entity body such as a REGISTER message.
+	 * @param p_userprofile to get important parameters
+	 * @param p_method (can be "REGISTER", "INVITE",....)
+	 * @param p_challenge parameter from 4xx response
+	 * @return Credentials field
+	 * @verdict 
+	 */
+	function f_calculatecCredentials(in SipUserProfile p_userprofile, in charstring p_method, 
+		in CommaParam_List p_challenge) return Credentials
+	{
+	  var Credentials v_result;
+      
+	  var charstring v_nonce := "";
+      
+	  // Use a fixed client nonce.
+	  var charstring v_cnonce := "1317265";
+      
+	  // RFC 2617 3.2.2 username:
+	  // The name of user in the specified realm.
+	  var charstring v_username := p_userprofile.privUsername;
+      
+	  var charstring v_realm;
+      
+	  // RFC 2617 3.2.2.2 passwd:
+	  // A known shared secret, the password of user of the specified
+	  // username.
+	  var charstring v_passwd := p_userprofile.passwd;
+      
+	  var charstring v_algorithm;
+      
+	  // Use a fixed nonce count.
+	  const charstring c_nonceCount := "00000002";
+
+	  var charstring v_qop := p_userprofile.qop;
+      
+	  var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
+      
+	  // MD5 hash of empty entity body.
+	  const charstring c_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
+      
+	  var charstring v_response;
+	  var charstring v_opaque;
+      
+      
+	  // extract nonce, realm, algorithm, and opaque from challenge
+      
+	  v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce"); 
+	  v_realm := f_extractParamValueFromChallenge(p_challenge, "realm"); 
+	  v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
+	  v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
+      
+	  // calculate a digest response for the Authorize header
+	  v_response := fx_calculateDigestResponse(
+		v_nonce,
+		v_cnonce,
+		v_username,
+		v_realm,
+		v_passwd,
+		v_algorithm,
+		c_nonceCount,
+		p_method,
+		v_qop,
+		v_uri,
+		c_hEntity);
+      
+	  // Construct credentials for an Authorization field of a request.
+	  v_result :=
+	  {
+		digestResponse :=
+		{
+		  { id := "Digest username", paramValue := v_username },
+		  { id := "realm", paramValue := v_realm },
+		  { id := "nonce", paramValue := v_nonce },
+		  { id := "uri", paramValue := v_uri },
+		  { id := "response", paramValue := v_response },
+		  { id := "algorithm=md5", paramValue := omit }, // algorithm is not enclosed to " characters
+		  { id := "cnonce", paramValue := v_cnonce },
+		  { id := "opaque=""""", paramValue := omit }, // already enclosed to " characters
+		  { id := "qop="&v_qop, paramValue := omit },//qop
+		  { id := "nc="&c_nonceCount, paramValue := omit }//nonceCount
+		}
+	  };
+      
+	  return v_result;
+	}
+
+	/**
+	 * 
+	 * @desc  Function to calculate credentials for request that has an empty
+	 * entity body such as a REGISTER message. NO RESPONSE value to cause an error!
+	 * @param p_userprofile to get important parameters
+	 * @param p_method (can be "REGISTER", "INVITE",....)
+	 * @param p_challenge parameter from 4xx response
+	 * @return Credentials field
+	 * @verdict 
+	 */
+	function f_calculatecCredentials_wo_response(in SipUserProfile p_userprofile, in charstring p_method, 
+		in CommaParam_List p_challenge) return Credentials
+	{
+	  var Credentials v_result;
+      
+	  var charstring v_nonce := "";
+      
+	  // Use a fixed client nonce.
+	  var charstring v_cnonce := "1317265";
+      
+	  // RFC 2617 3.2.2 username:
+	  // The name of user in the specified realm.
+	  var charstring v_username := p_userprofile.privUsername;
+      
+	  var charstring v_realm;
+      
+	  // RFC 2617 3.2.2.2 passwd:
+	  // A known shared secret, the password of user of the specified
+	  // username.
+	  var charstring v_passwd := p_userprofile.passwd;
+      
+	  var charstring v_algorithm;
+      
+	  // Use a fixed nonce count.
+	  const charstring c_nonceCount := "00000002";
+
+	  var charstring v_qop := p_userprofile.qop;
+      
+	  var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
+      
+	  // MD5 hash of empty entity body.
+	  const charstring c_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
+      
+	  var charstring v_response;
+	  var charstring v_opaque;
+      
+      
+	  // extract nonce, realm, algorithm, and opaque from challenge
+      
+	  v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce"); 
+	  v_realm := f_extractParamValueFromChallenge(p_challenge, "realm"); 
+	  v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
+	  v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
+      
+	  // calculate a digest response for the Authorize header
+	  v_response := fx_calculateDigestResponse(
+		v_nonce,
+		v_cnonce,
+		v_username,
+		v_realm,
+		v_passwd,
+		v_algorithm,
+		c_nonceCount,
+		p_method,
+		v_qop,
+		v_uri,
+		c_hEntity);
+      
+	  // Construct credentials for an Authorization field of a request.
+	  v_result :=
+	  {
+		digestResponse :=
+		{
+		  { id := "Digest username", paramValue := v_username },
+		  { id := "realm", paramValue := v_realm },
+		  { id := "nonce", paramValue := v_nonce },
+		  { id := "uri", paramValue := v_uri },
+//		  { id := "response", paramValue := v_response }, // not included to cause an error
+		  { id := "algorithm=md5", paramValue := omit }, // algorithm is not enclosed to " characters
+		  { id := "cnonce", paramValue := v_cnonce },
+		  { id := "opaque=""""", paramValue := omit }, // already enclosed to " characters
+		  { id := "qop="&v_qop, paramValue := omit },//qop
+		  { id := "nc="&c_nonceCount, paramValue := omit }//nonceCount
+		}
+	  };
+      
+	  return v_result;
+	}
+
+	/**
+	 * 
+	 * @desc  Function to calculate credentials for response 401 - WWW-Authorization
+	 * @param p_qop of the peer UE (alternatively )
+	 * @param p_challenge parameter from 1st REGISTER request
+	 * @return Credentials field
+	 * @verdict 
+	 */
+	function f_calculatecChallenge_forWWWAuthorization(in charstring p_qop, in CommaParam_List p_challenge) return Challenge
+	{
+	  var Challenge v_result;
+
+	  var charstring v_realm;
+      
+	  var charstring v_qop := p_qop;
+
+	  v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
+      
+	  // Construct credentials for an Authorization field of a request.
+	  v_result :=
+	  {
+		digestCln :=
+		{
+		  { id := "Digest realm", paramValue := v_realm },
+		  { id := "nonce=", paramValue := c_nonce },
+		  { id := "algorithm=", paramValue := c_algorithm }, // algorithm is not enclosed to " characters
+		  { id := "ck=", paramValue := c_ck },
+		  { id := "ik=", paramValue := c_ik }, // already enclosed to " characters
+		  { id := "qop="&v_qop, paramValue := omit }//qop
+
+		}
+	  };
+      
+	  return v_result;
+	}
+	
+	/**
+	* 
+	* @desc  Function to calculate credentials for request that has an empty
+	* entity body such as a REGISTER message and at the end put different private name
+	* @param p_userprofile to get important parameters
+	* @param p_method (can be "REGISTER", "INVITE",....)
+	* @param p_challenge parameter from 4xx response
+	* @return Credentials field
+	* @verdict 
+	*/
+   function f_calculatecCredentialsAndChangeUserName(in SipUserProfile p_userprofile, in charstring p_method, 
+	   in CommaParam_List p_challenge) return Credentials
+   {
+	 var Credentials v_result;
+      
+	 var charstring v_nonce := "";
+      
+	 // Use a fixed client nonce.
+	 var charstring v_cnonce := "1317265";
+      
+	 // RFC 2617 3.2.2 username:
+	 // The name of user in the specified realm.
+	 var charstring v_username := p_userprofile.privUsername;
+      
+	 var charstring v_realm;
+      
+	 // RFC 2617 3.2.2.2 passwd:
+	 // A known shared secret, the password of user of the specified
+	 // username.
+	 var charstring v_passwd := p_userprofile.passwd;
+      
+	 var charstring v_algorithm;
+      
+	 // Use a fixed nonce count.
+	 const charstring c_nonceCount := "00000002";
+
+	 var charstring v_qop := p_userprofile.qop;
+      
+	 var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
+      
+	 // MD5 hash of empty entity body.
+	 const charstring c_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
+      
+	 var charstring v_response;
+	 var charstring v_opaque;
+      
+      
+	 // extract nonce, realm, algorithm, and opaque from challenge
+      
+	 v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce"); 
+	 v_realm := f_extractParamValueFromChallenge(p_challenge, "realm"); 
+	 v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
+	 v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
+      
+	 // calculate a digest response for the Authorize header
+	 v_response := fx_calculateDigestResponse(
+	   v_nonce,
+	   v_cnonce,
+	   v_username,
+	   v_realm,
+	   v_passwd,
+	   v_algorithm,
+	   c_nonceCount,
+	   p_method,
+	   v_qop,
+	   v_uri,
+	   c_hEntity);
+      
+	 // Construct credentials for an Authorization field of a request.
+	 v_result :=
+	 {
+	   digestResponse :=
+	   {
+		 { id := "Digest username", paramValue := "DifferentToPrivateUser"},
+		 { id := "realm", paramValue := v_realm },
+		 { id := "nonce", paramValue := v_nonce },
+		 { id := "uri", paramValue := v_uri },
+		 { id := "response", paramValue := v_response },
+		 { id := "algorithm=md5", paramValue := omit }, // algorithm is not enclosed to " characters
+		 { id := "cnonce", paramValue := v_cnonce },
+		 { id := "opaque=""""", paramValue := omit }, // already enclosed to " characters
+		 { id := "qop="&v_qop, paramValue := omit },//qop
+		 { id := "nc="&c_nonceCount, paramValue := omit }//nonceCount
+	   }
+	 };
+      
+	 return v_result;
+   }
+	
+
+   /**
+	* 
+	* @desc Function to check if param related to id from CommanParam_List exist
+	* containing challenge.
+	* @param p_challenge parameter from 4xx response
+	* @param p_id name of parameter("nonce", "realm", "ck", "ik"...)
+	* @return  parameter p_id value 
+	*/
+   function f_checkParamValueFromChallengeIfPresent(in CommaParam_List p_challenge, in charstring p_id) return boolean
+   {
+	 var boolean v_result := false;
+	 var integer v_len := sizeof(p_challenge);
+	 var charstring v_id := fx_putInLowercase(p_id);
+      
+	 for (var integer i := 0; i < v_len; i := i + 1)
+	 {
+	   if (fx_putInLowercase(p_challenge[i].id) == v_id)
+	   {
+		 v_result := true;
+	   }
+	 }
+      
+	 return v_result;
+   }	
+    
+    /**
+	* 
+	* @desc Function to check if tag is present in SemicolonParam_List
+	* @param p_param_l SemicolonParam_List
+	* @return  boolean  true if tag is present 
+	*/
+    function f_checkTagPresent(SemicolonParam_List p_param_l) runs on SipComponent return boolean {
+	    var integer v_numberOfParams;
+	    var integer i := 0;
+
+	    v_numberOfParams := sizeof (p_param_l);
+	    while (i < v_numberOfParams) {
+		    if (fx_putInLowercase(p_param_l[i].id) == c_tagId) {
+			    return (true);
+		    }
+		    i := i + 1;
+	    }
+	    return (false);
+    }
+
+	/**
+	 * 
+	 * @desc Function to extract paramValue related to id from CommanParam_List
+	 * containing challenge.
+	 * @param p_challenge parameter from 4xx response
+	 * @param p_id name of parameter("nonce", "realm",...)
+	 * @return  parameter p_id value 
+	 */
+	function f_extractParamValueFromChallenge(in CommaParam_List p_challenge, in charstring p_id) return charstring
+	{
+	  var charstring v_result := "";
+	  var integer v_len := sizeof(p_challenge);
+	  var charstring v_id := fx_putInLowercase(p_id);
+      
+	  for (var integer i := 0; i < v_len; i := i + 1)
+	  {
+		if (fx_putInLowercase(p_challenge[i].id) == v_id)
+		{
+		  v_result := p_challenge[i].paramValue;
+		}
+	  }
+
+	  if (v_result == "")
+	  {
+		if(match(p_id,"algorithm")) 
+		{
+			v_result := "MD5"
+		}
+		else if(match(p_id,"opaque"))
+		{
+			v_result := ""
+		}
+		else
+		{
+		var charstring v_tmpchar := "Cannot acquire value from credentials.";
+		log ("Cannot acquire value from credentials.");
+		setverdict(inconc);
+		stop;
+		}
+	  }
+      
+	  return v_result;
+	}
+	
+}//end group ParameterOperations
+
+group FieldOperations {
+
+	/**
+	 * 
+	 * @desc function adds "Tag"-parameter in "To"-headerfield
+	 * @param p_to To header field that should get a Tag parameter
+	 * 
+	 */
+	function f_addTagInTo(inout To p_to) runs on SipComponent
+	{      
+	  f_addParameterTagIfNotPresent(c_tagId, f_getRndTag(), p_to); 
+	}
+
+	/**
+	 * 
+	 * @desc addition of a single parameter in the via header field
+	 * @param p_parameter_name name of parameter to be added
+	 * @param p_parameter_value value of parameter to be added
+	 * @param p_viaBody the via parameter to be extended
+	 * @verdict 
+	 */
+	function f_addParameterIfNotPresent(
+		in charstring p_parameter_name,
+		in charstring p_parameter_value,
+		inout ViaBody p_viaBody) 
+		
+		{
+		if (ispresent (p_viaBody.viaParams)) {
+			return;
+		}
+		p_viaBody.viaParams := {
+			{
+				p_parameter_name,
+				p_parameter_value
+			}
+		};
+	}    
+    
+	/**
+	 * 
+	 * @desc function to addd a parameter to the "To" header field (if there is not any parameter)
+	 * @param p_parameter_name name of the parameter to be added
+	 * @param p_parameter_value value of the paramter to be added
+	 * @param p_to "To" header field to be extended
+	 * @verdict 
+	 */
+	function f_addParameterTagIfNotPresent(
+		in charstring p_parameter_name,
+		in charstring p_parameter_value,
+		inout To p_to) 
+		
+		{
+		if (ispresent (p_to.toParams)) {
+			return;
+		}
+		p_to.toParams := {
+			{
+				p_parameter_name,
+				p_parameter_value
+			}
+		};
+	}
+
+	/**
+	 * 
+	 * @desc function compares the IP address of two hosts
+	 * @param p_host1 hostname
+	 * @param p_host2 hostname
+	 * @return boolean value that is true if the IP addresses are identical
+	 * @verdict 
+	 */	
+ 	function f_equivalentHostAddr(in charstring p_host1,  in charstring p_host2) return boolean
+	{
+	  //A DNS server may be used
+	  return(fx_getIpAddr(p_host1) == fx_getIpAddr(p_host2));
+	}
+
+
+	/**
+		* 
+		* @desc function checks if Require contains Precondition
+		* @param p_message (request or response) SIP message to be analysed
+		* @return true if p_id parameter exist
+		*/
+	function f_checkRequirePrecondition(in Request p_message)
+	{
+		if (ispresent(p_message.msgHeader.require))
+		{
+			var boolean v_precondition_found:=false;
+			for (var integer v_i:=0; v_i<sizeof(p_message.msgHeader.require.optionsTags); v_i:=v_i+1){			
+				if (match(p_message.msgHeader.require.optionsTags[v_i],c_tagPrecond)) {
+					v_precondition_found:=true;
+				}
+			}
+			if (not(v_precondition_found)){
+				setverdict(fail);
+				log("FAIL: precondition not found in Require options list!");
+			}
+		} 
+		else
+		{
+			setverdict(fail);
+			log("FAIL: Require options is not present!");
+		}
+	}
+
+	/**
+	 * 
+	 * @desc function checks if P-Charging-Vector contains a particular parameter
+	 * @param p_message (request or response) SIP message to be analysed
+	 * @param p_id name of parameter
+	 * @return true if p_id parameter exist
+	 */
+	function f_checkPChargingVectorHeaderParamId(in Request p_message, charstring p_id) return boolean
+	{
+	  var integer v_chargeParamsLen;
+	  
+	  if (ispresent(p_message.msgHeader.pChargingVector)) {		
+		for (var integer i:=0; i<sizeof(p_message.msgHeader.pChargingVector.chargeParams); i:=i+1)
+				{if(p_message.msgHeader.pChargingVector.chargeParams[i].id == p_id)
+					{return (true)}
+				};
+	  }
+	  return (false)
+	}
+
+	/**
+	 * 
+	 * @desc function checks if P-Charging-Vector contains a particular parameter
+	 * @param p_message (request or response) SIP message to be analysed
+	 * @param p_id name of parameter
+	 * @return true if p_id parameter exist
+	 */
+	function f_checkPChargingVectorHeaderParamIdResponse(in Response p_message, charstring p_id) return boolean
+	{
+	  var integer v_chargeParamsLen;
+	  
+	  if (ispresent(p_message.msgHeader.pChargingVector)) {		
+		for (var integer i:=0; i<sizeof(p_message.msgHeader.pChargingVector.chargeParams); i:=i+1)
+				{if(p_message.msgHeader.pChargingVector.chargeParams[i].id == p_id)
+					{return (true)}
+				};
+	  }
+	  return (false)
+	}
+
+	/**
+	 * 
+	 * @desc function returns the Host/Port of a given Contact header field
+	 * @param p_contact contact header field to be analysed
+	 * @return Host/Port record  from the contact header field
+	 */
+	function f_getContactAddr(in ContactAddress p_contact) runs on SipComponent return HostPort
+	  {
+		var HostPort v_locAddr;
+		var SipUrl    v_SipUrl;
+      
+		if (ischosen(p_contact.addressField.nameAddr))
+		{
+		  v_SipUrl := p_contact.addressField.nameAddr.addrSpec;
+		}
+		else
+		{
+		  v_SipUrl := p_contact.addressField.addrSpecUnion;
+		}
+      
+		v_locAddr.host := v_SipUrl.hostPort.host;
+      
+		if (ispresent(v_SipUrl.hostPort.portField))
+		{
+			v_locAddr.portField := v_SipUrl.hostPort.portField;
+		}
+		else
+		{
+			v_locAddr.portField := c_defaultSipPort;
+		}
+      
+		return(v_locAddr);
+	  } // end f_getContactAddr
+
+	/**
+		* 
+		* @desc function checks if History-Info-Header of the p_message contains a particular URI
+		* @param p_message (request or response) SIP message to be analysed
+		* @param p_URI name of parameter
+		* @return true if p_URI parameter exist
+		*/
+	function f_checkHeaderInfoURI(in Response p_message, SipUrl p_URI) return boolean
+	{
+			var integer v_chargeParamsLen;
+	  
+			if (ispresent(p_message.msgHeader.historyInfo)) {		
+		for (var integer i:=0; i<sizeof(p_message.msgHeader.historyInfo.historyInfoList); i:=i+1)
+				{if(p_message.msgHeader.historyInfo.historyInfoList[i].nameAddr.addrSpec == p_URI)
+					{return (true)}
+				};
+			}
+			return (false)
+	}
+	
+	/**
+	* 
+	* @desc function returns the Userinfo from  a given To header field
+	* @param p_to To header field to be analysed
+	* @return Userinfo from the To header field as a charstring
+	*/
+	function f_getUserfromTo(in To p_to) runs on SipComponent return charstring
+	{
+		var SipUrl    v_SipUrl;
+  
+  		if (ischosen(p_to.addressField.nameAddr))
+		{
+			v_SipUrl := p_to.addressField.nameAddr.addrSpec;
+		}
+		else
+		{
+			v_SipUrl := p_to.addressField.addrSpecUnion;
+		}
+  
+		return(v_SipUrl.userInfo.userOrTelephoneSubscriber);
+	} // end f_getUserfromTo
+
+	/**
+	 * 
+	 * @desc function to generate a 32 bits random number as a charstring for tag field
+	 * @param p_cSeq_s CSeq parameter used to modify the tag field value
+	 * @return tag value
+	 */
+	function f_getRndCallId(inout CSeq p_cSeq_s) return charstring
+	{
+	  var charstring v_tag_value;
+	  v_tag_value := fx_rndStr()&fx_rndStr();
+	  //v_tag_value is initialized with a random value with at least 32 bits of randomness
+	  // 4294967296 is a 32 bits integer
+	  //v_tag_value := int2str(float2int(4294967296.0*rnd()) + loc_CSeq_s.seqNumber );
+	  return(v_tag_value);
+	}
+
+	/**
+	 * 
+	 * @desc function give access to the top element of the Path header field.
+	 * @param p_Request SIP message to be analysed
+	 * @return NameAddr (e.g. <sip:p.home.com>) or omit
+	 */
+	function f_getPathHeaderTop(inout Request p_Request) return template NameAddr
+	{
+	  if (ispresent(p_Request.msgHeader.path)) {
+	  	if (sizeof(p_Request.msgHeader.path.pathValues)>0) {
+			return(p_Request.msgHeader.path.pathValues[0].nameAddr)}
+	  	};
+	  return(omit)
+	}
+
+	/**
+	 * 
+	 * @desc function updates first element of a Via headerfield list 
+	 * @param p_viaBody_List address list of a Via header field
+	 * @param p_source_address address to be inserted in the top element
+	 */
+	function f_getViaReplyAddr(inout ViaBody_List p_viaBody_List, inout address4SIP p_source_address)
+	 runs on SipComponent 
+	 {	
+	   var ViaBody  v_viaBody;
+	   var HostPort v_locAddr;
+	   // The address to send message shall be updated after getting information
+	   // in the Via header fied and according to 18.2.2
+	   v_viaBody := p_viaBody_List[0];
+      
+	   // received parameter has to be addded to the via hader field
+	   // Be careful it could be an Host name and not an IP Address
+
+	   if (not f_equivalentHostAddr(valueof (v_viaBody.sentBy.host),
+		   valueof (p_source_address.host))) {
+		   f_addParameterIfNotPresent(
+			   c_receivedId,
+			   valueof (p_source_address.host),
+			   v_viaBody);
+	   }
+	   if (ispresent(v_viaBody.sentBy.portField))
+	   {
+		 p_source_address.portField := valueof(v_viaBody.sentBy.portField);
+	   }
+	   else
+	   {
+		 p_source_address.portField := c_defaultSipPort;
+	   }
+	 }
+ 
+	/**
+	 * 
+	 * @desc functions give access to an element of the Route header field (record).
+	 * @param p_message (request) SIP message to be analysed
+	 * @param p_index index of Route record element to be retrieved
+	 * @return HostPort value of the Route element or omit
+	 */
+	function f_getRouteHeaderElementAddressFromRequest(in Request p_message, in integer p_index) return HostPort
+	{
+	  if (ispresent(p_message.msgHeader.route)) {
+		if (sizeof(p_message.msgHeader.route.routeBody)>p_index) {
+			return(p_message.msgHeader.route.routeBody[p_index].nameAddr.addrSpec.hostPort)}
+		};
+	setverdict(fail);
+	return(c_hostport_dummy)
+	}
+
+	/**
+	 * 
+	 * @desc functions give access to an element of the Record-Route header field (record).
+	 * @param p_message (request) SIP message to be analysed
+	 * @param p_index index of recordRoute record element to be retrieved
+	 * @return HostPort value of the Record-Route element or omit
+	 */
+	function f_getRecordRouteHeaderElementAddressFromRequest(in Request p_message, in integer p_index) return HostPort
+	{
+	  if (ispresent(p_message.msgHeader.recordRoute)) {
+		if (sizeof(p_message.msgHeader.recordRoute.routeBody)>p_index) {
+			return(p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.hostPort)}
+		};
+	setverdict(fail);
+	return(c_hostport_dummy)
+	}
+    
+	/**
+	 * 
+	 * @desc functions give access to an element of the Record-Route header field (record).
+	 * @param p_message (response) SIP message to be analysed
+	 * @param p_index index of recordRoute record element to be retrieved
+	 * @return HostPort value of the Record-Route element or omit
+	 */
+	function f_getRecordRouteHeaderElementAddressFromResponse(in Response p_message, in integer p_index) return HostPort
+	{
+	  if (ispresent(p_message.msgHeader.recordRoute)) {
+		if (sizeof(p_message.msgHeader.recordRoute.routeBody)>p_index) {
+			return(p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.hostPort)}
+		};
+	setverdict(fail);
+	return(c_hostport_dummy)
+	}
+    
+	/**
+	 * 
+	 * @desc functions give access to an element of the Via header field (record).
+	 * @param p_message (request) SIP message to be analysed
+ 	 * @param p_index index of via record element to be retrieved
+ 	 * @return HostPort value of the Via element or omit
+	 */
+	function f_getViaHeaderElementHostPort(in Request p_message, in integer p_index) return HostPort
+	{
+	
+		if (sizeof(p_message.msgHeader.via.viaBody)>p_index) {
+			return(p_message.msgHeader.via.viaBody[p_index].sentBy)}
+	setverdict(fail);
+	return(c_hostport_dummy)
+	}
+	
+	/**
+	 * 
+	 * @desc functions give access to an element of the Via header field (record).
+	 * @param p_message (response) SIP message to be analysed
+	 * @param p_index index of via record element to be retrieved
+	 * @return HostPort value of the Via element or omit
+	 */	function f_getViaHeaderElementHostPortResponse(in Response p_message, in integer p_index) return HostPort
+	{
+	
+		if (sizeof(p_message.msgHeader.via.viaBody)>p_index) {
+			return(p_message.msgHeader.via.viaBody[p_index].sentBy)}
+	setverdict(fail);
+	return(c_hostport_dummy)
+	}	
+	
+	/**
+	 * 
+	 * @desc function checks indicators if topology hiding (TH) has been applied:
+	 *	- second element in via-header record has tokenized-by parameter
+	 * @param p_Request SIP message to be analysed
+	 * @return boolean value (true indicate TH, false otherwise)
+	 */
+	function f_topologyHiding(inout Request p_request) runs on SipComponent return boolean
+	{ 
+	  var GenericParam v_viaParameter := p_request.msgHeader.via.viaBody[1].viaParams[0]; // second element
+	  if (not v_viaParameter.id == "tokenized-by") 
+		 {return(false)};
+	  return(true)
+	}
+
+	/**
+	 * 
+	 * @desc function checks indicators if topology hiding (TH) has been applied:
+	 *	- any element in via-header record has tokenized-by parameter
+	 * @param Response SIP message to be analysed
+	 * @return boolean value (true indicate TH, false otherwise)
+	 */
+	function f_topologyHidingResponse(inout Response p_response) runs on SipComponent return boolean
+	{ 
+	 var GenericParam v_viaParameter;
+	
+	 for (var integer v_i := 0; v_i < sizeof(p_response.msgHeader.via.viaBody); v_i := v_i + 1) {
+		
+	  v_viaParameter := p_response.msgHeader.via.viaBody[v_i].viaParams[0]; // first parameter
+
+	  if (not v_viaParameter.id == "tokenized-by") 
+		 {return(false)}
+	 }
+	 return(true);
+	
+	}
+	
+
+
+group SetHeaders {
+
+
+	/**
+	 * 
+	 * @desc function for setting of component variables related to message header fields 
+	 *		(message type independent: CSeq, contact, via), function uses information from userprofile
+	 *		
+	 * @param p_cSeq_s CSeq parameter
+	 * @param p_method method name for cSeq header field
+	 */	
+ 	function f_setHeadersGeneral(inout CSeq p_cSeq_s, in charstring p_method) runs on SipComponent
+	{
+	  var SemicolonParam_List v_params;
+
+	  p_cSeq_s.fieldName := CSEQ_E;
+	  p_cSeq_s.seqNumber := p_cSeq_s.seqNumber + 1;
+	  p_cSeq_s.method    := p_method ;
+	  vc_cSeq := p_cSeq_s;
+      
+	  vc_contact := valueof(m_Contact(m_SipUrl_contactIpaddr(vc_userprofile)));
+	  vc_branch := c_branchCookie & f_getRndTag();
+	  vc_via:={
+		fieldName := VIA_E,
+		viaBody 	 := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+	  };
+	}// end function f_setHeadersGeneral
+	
+	/**
+	 * 
+	 * @desc setting of general and basic Bye header fields
+	 * 		in additon to the addresses (To, From, ReqUri)
+	 * @param p_cSeq_s
+	 */
+	function f_setHeadersBYE(inout CSeq p_cSeq_s) runs on SipComponent
+	{      
+	  f_setHeadersGeneral(p_cSeq_s, "BYE"); // cseq, contact, branch, via
+
+	  vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+
+	  f_addTagInTo(vc_to);
+
+	  vc_cancel_To := vc_to;
+	  vc_caller_To := vc_to;
+      
+	  vc_caller_From := vc_from;
+            
+	  vc_reqHostPort := vc_requestUri.hostPort;
+      
+	}// end function f_setHeadersBYE
+
+	/**
+	 * 
+	 * @desc function sets header field for the next outgoing REGISTER message
+	 * @param p_cSeq_s CSeq parameter to be applied
+	 */
+ 	function f_setHeaders_REGISTER(inout CSeq p_cSeq_s) runs on SipComponent
+	{
+	  var SemicolonParam_List v_params;
+
+	  f_setHeadersGeneral(p_cSeq_s, "REGISTER"); // cseq, contact, branch, via
+
+	  vc_requestUri:=
+	  {
+		scheme := c_sipScheme,
+		userInfo := omit,
+		hostPort := {host:=vc_userprofile.registrarDomain, portField:=omit},
+		urlParameters := omit,
+		headers := omit
+	  };
+      
+	  vc_reqHostPort := vc_requestUri.hostPort;
+      
+	  vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+	  vc_callIdReg := vc_callId;
+      
+	  vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
+	  v_params := {{id:=c_tagId, paramValue:=f_getRndTag()}}
+	  vc_from := {fieldName := FROM_E,
+		addressField :=vc_to.addressField,
+		fromParams := v_params
+	  };
+	  
+	  if(not vc_firstREGISTER_sent)
+	  {
+	  v_params := {{id:=c_expiresId, paramValue:=c_shortRegistration}};
+	  vc_contact.contactBody.contactAddresses[0].contactParams := v_params;
+	  }
+	  
+	  vc_firstREGISTER_sent := true;//f_setHeaders_Register is called in deREGISTER function
+	  
+	  vc_authorization := 
+	  {
+		fieldName := AUTHORIZATION_E,
+		body := {f_calculatecCredentials_empty(vc_userprofile)}
+	  }
+
+      
+	}// end function setHeaders_REGISTER
+
+	/**
+	 * 
+	 * @desc function sets via, cseq and authorization header for the next outgoing (protected) REGISTER
+	 * @verdict 
+	 */
+ 	function f_setHeaders_2ndREGISTER() runs on SipComponent
+	{
+	  var CommaParam_List v_challenge;
+		
+	  vc_branch := c_branchCookie & f_getRndTag();
+
+	  vc_via_REG :={
+		fieldName := VIA_E,
+		viaBody 	 := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+	  };
+	  
+	  // Extract challenge and calculate credentials for a response.
+	  v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams;
+	            
+	  // Increment CSeq sequence number 
+	  vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
+      
+      // Prepair right answer      
+	  vc_authorization := 
+		   {
+			 fieldName := AUTHORIZATION_E,
+			 body := {f_calculatecCredentials(vc_userprofile, "REGISTER", v_challenge)}
+		   }
+				
+	}// end function f_setHeaders_2ndREGISTER
+
+	/**
+	 * 
+	 * @desc function sets via, cseq and authorization header for the next outgoing (protected) REGISTER
+	 * NO response in Authorization header to cause an error
+	 * @verdict 
+	 */
+	function f_setHeaders_2ndREGISTER_wo_response() runs on SipComponent
+	{
+	  var CommaParam_List v_challenge;
+		
+	  vc_branch := c_branchCookie & f_getRndTag();
+
+	  vc_via_REG :={
+		fieldName := VIA_E,
+		viaBody 	 := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+	  };
+	  
+	  // Extract challenge and calculate credentials for a response.
+	  v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams;
+	            
+	  // Increment CSeq sequence number 
+	  vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
+      
+	  // Prepair right answer      
+	  vc_authorization := 
+		   {
+			 fieldName := AUTHORIZATION_E,
+			 body := {f_calculatecCredentials_wo_response(vc_userprofile, "REGISTER", v_challenge)}
+		   }
+				
+	}// end function f_setHeaders_2ndREGISTER_wo_response
+
+	/**
+	 * 
+	 * @desc function sets via, cseq and authorization header with different private name for the next outgoing (protected) REGISTER
+	 * @verdict 
+	 */
+ 	function f_setHeaders_2ndREGISTER_authorizationWithDifferentUserName() runs on SipComponent
+	{
+	  var CommaParam_List v_challenge;
+		
+	  vc_branch := c_branchCookie & f_getRndTag();
+
+	  vc_via_REG :={
+		fieldName := VIA_E,
+		viaBody 	 := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+	  };
+	  
+	  // Extract challenge and calculate credentials for a response.
+	  v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams;
+	            
+	  // Increment CSeq sequence number 
+	  vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
+      
+      // Prepair right answer      
+	  vc_authorization := 
+		   {
+			 fieldName := AUTHORIZATION_E,
+			 body := {f_calculatecCredentialsAndChangeUserName(vc_userprofile, "REGISTER", v_challenge)}
+		   }
+				
+	}// end function f_setHeaders_2ndREGISTER_authorizationWithDifferentUserName
+
+
+	/**
+	 * 
+	 * @desc function sets header fields for the next outgoing REGISTER (de-registration)
+	 * @param p_cSeq_s cSeq to be used
+	 * @verdict 
+	 */
+ 	function f_setHeaders_deREGISTER(inout CSeq p_cSeq_s) runs on SipComponent
+	{
+	f_setHeaders_REGISTER(p_cSeq_s);
+	vc_contact := 
+		{
+		  fieldName := CONTACT_E,
+		  contactBody := {wildcard := "*" } 
+		};
+	} // end function f_setHeaders_deREGISTER
+
+
+	/**
+	 * 
+	 * @desc setting of general and basic Invite header fields
+	 * 		in additon to the addresses (To, From, ReqUri)
+	 * @param p_cSeq_s
+	 */
+	function f_setHeadersINVITE(inout CSeq p_cSeq_s) runs on SipComponent
+	{      
+	  f_setHeadersGeneral(p_cSeq_s, "INVITE"); // cseq, contact, branch, via
+
+	  vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+
+	  vc_cancel_To := vc_to;
+	  vc_caller_To := vc_to;
+      
+	  vc_caller_From := vc_from;
+            
+	  vc_reqHostPort := vc_requestUri.hostPort;
+      
+	}// end function f_setHeadersINVITE
+
+	/**
+	 * 
+	 * @desc setting of general and basic Message header fields
+	 * 		in additon to the addresses (To, From, ReqUri)
+	 * @param p_cSeq_s
+	 */
+	function f_setHeadersMESSAGE(inout CSeq p_cSeq_s) runs on SipComponent
+	{      
+	  f_setHeadersGeneral(p_cSeq_s, "MESSAGE"); // cseq, contact, branch, via
+
+	  vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+
+	  vc_cancel_To := vc_to;
+	  vc_caller_To := vc_to;
+      
+	  vc_caller_From := vc_from;
+            
+	  vc_reqHostPort := vc_requestUri.hostPort;
+      
+	}// end function f_setHeadersMESSAGE
+
+	/**
+		* 
+		* @desc setting of general and basic Notify header fields
+		* 		in additon to the addresses (To, From, ReqUri)
+		* @param p_cSeq_s
+		*/
+	function f_setHeadersNOTIFY(inout CSeq p_cSeq_s) runs on SipComponent
+	{      
+			f_setHeadersGeneral(p_cSeq_s, "NOTIFY"); // cseq, contact, branch, via
+
+			vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+
+			vc_cancel_To := vc_to;
+			vc_caller_To := vc_to;
+      
+			vc_caller_From := vc_from;
+            
+			vc_reqHostPort := vc_requestUri.hostPort;
+      
+	}// end function f_setHeadersNOTIFY
+
+	/**
+	 * 
+	 * @desc function sets header field for the next outgoing SUBSCRIBE message
+	 * @param p_cSeq_s CSeq parameter to be applied
+	 */
+ 	function f_setHeaders_SUBSCRIBE(inout CSeq p_cSeq_s) runs on SipComponent
+	{
+	  f_setHeadersGeneral(p_cSeq_s, "SUBSCRIBE"); // cseq, contact, branch, via
+  
+  	  vc_requestUri:=valueof(m_SipUrl_currDomain(vc_userprofile))
+      
+	}// end function setHeaders_SUBSCRIBE
+	
+	/**
+		* 
+		* @desc setting of general and basic Subscribe header fields
+		* 		in additon to the addresses (To, From, ReqUri)
+		* @param p_cSeq_s
+		*/
+	function f_setHeadersSUBSCRIBE(inout CSeq p_cSeq_s) runs on SipComponent
+	{      
+			f_setHeadersGeneral(p_cSeq_s, "SUBSCRIBE"); // cseq, contact, branch, via
+
+			vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+
+			vc_cancel_To := vc_to;
+			vc_caller_To := vc_to;
+      
+			vc_caller_From := vc_from;
+            
+			vc_reqHostPort := vc_requestUri.hostPort;
+      
+	}// end function f_setHeadersMESSAGE
+	
+	/**
+	 * 
+	 * @desc setting of general and basic REFER header fields
+	 * 		in additon to the addresses (To, From, ReqUri)
+	 * @param p_cSeq_s
+	 */
+	function f_setHeadersREFER(inout CSeq p_cSeq_s) runs on SipComponent
+	{      
+	  f_setHeadersGeneral(p_cSeq_s, "REFER"); // cseq, contact, branch, via
+
+	  vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+
+	  vc_cancel_To := vc_to;
+	  vc_caller_To := vc_to;
+      
+	  vc_caller_From := vc_from;
+            
+	  vc_reqHostPort := vc_requestUri.hostPort;
+      
+	}// end function f_setHeadersREFER
+
+	/**
+	 * 
+	 * @desc This function reads all necessary headers from the received REGISTER message and generate the tag for the answer
+	 * @param p_Request REGISTER that has been received
+	 */
+	function f_setHeadersOnReceiptOfREGISTER(Request p_Request)
+	runs on SipComponent {
+
+	  f_setHeadersOnReceiptOfRequest(p_Request);
+	
+	  vc_callId := p_Request.msgHeader.callId;
+	  vc_caller_From := vc_from;
+	  f_addTagInTo(vc_to);
+	  vc_caller_To := vc_to;
+	  vc_requestUri := p_Request.requestLine.requestUri;
+      
+	  vc_cancel_To := p_Request.msgHeader.toField;
+      
+	  if (ispresent(p_Request.msgHeader.contact)) {
+		vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+	  	}
+      
+	  // update callee information and pick up tag if the call need to be canceled
+	  vc_callee_To := {fieldName := TO_E,
+		addressField := vc_caller_From.addressField,
+		toParams := vc_caller_From.fromParams};
+      
+	  vc_callee_From := {fieldName := FROM_E,
+		addressField := vc_caller_To.addressField,
+		fromParams := vc_caller_To.toParams};
+      
+	} // end f_setHeadersOnReceiptOfREGISTER
+
+	/**
+	 * 
+	 * @desc This function reads all necessary headers from the received SUBSCRIBE message and generate the tag for the answer
+	 * @param p_Request SUBSCRIBE that has been received
+	 */
+	function f_setHeadersOnReceiptOfSUBSCRIBE(Request p_Request)
+	runs on SipComponent {
+
+	  f_setHeadersOnReceiptOfRequest(p_Request);
+	
+	  vc_callId := p_Request.msgHeader.callId;
+	  vc_caller_From := vc_from;
+	  f_addTagInTo(vc_to);
+	  vc_caller_To := vc_to;
+	  vc_requestUri := p_Request.requestLine.requestUri;
+      
+	  vc_cancel_To := p_Request.msgHeader.toField;
+      
+	  if (ispresent(p_Request.msgHeader.contact)) {
+		vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+		}
+      
+	  // update callee information and pick up tag if the call need to be canceled
+	  vc_callee_To := {fieldName := TO_E,
+		addressField := vc_caller_From.addressField,
+		toParams := vc_caller_From.fromParams};
+      
+	  vc_callee_From := {fieldName := FROM_E,
+		addressField := vc_caller_To.addressField,
+		fromParams := vc_caller_To.toParams};
+      
+	} // end f_setHeadersOnReceiptOfSUBSCRIBE
+   
+	/**
+	 * 
+	 * @desc function reads all necessary headers from 
+	 * the received INVITE message and generate the tag for the answer
+	 * @param p_Request received INVITE message
+	 * @verdict 
+	 */
+	function f_setHeadersOnReceiptOfINVITE(Request p_Request) runs on SipComponent {
+
+	f_setHeadersOnReceiptOfRequest(p_Request);
+
+	vc_callId := p_Request.msgHeader.callId;
+
+	vc_requestUri := p_Request.requestLine.requestUri;
+      
+	vc_cancel_To := p_Request.msgHeader.toField;
+	f_addTagInTo(vc_to);
+	vc_caller_From := vc_from;
+	vc_caller_To := vc_to;
+      
+	if (ispresent(p_Request.msgHeader.contact)) {
+	   	vc_reqHostPort := 
+	  	f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+	 	};
+      
+	 // update callee information and pick up tag if the call need to be canceled
+	vc_callee_To := {fieldName := TO_E,
+	   addressField := vc_caller_From.addressField,
+	   toParams := vc_caller_From.fromParams};
+      
+	vc_callee_From := {fieldName := FROM_E,
+	   addressField := vc_caller_To.addressField,
+	   fromParams := vc_caller_To.toParams};
+        
+	if (ispresent(p_Request.msgHeader.privacy)) {
+		vc_privacy := p_Request.msgHeader.privacy;
+		};
+        
+	if (ispresent(p_Request.messageBody)) { 
+		//cleaning of attributes before assignment
+		if (ispresent(vc_sdp_remote.media_list))
+		{
+				for (var integer i:=0; i<sizeof(vc_sdp_remote.media_list); i:=i+1)
+				{			
+						if (ispresent(vc_sdp_remote.media_list[i].attributes))
+						{
+							for (var integer j:=0; j<sizeof(vc_sdp_remote.media_list[i].attributes); j:=j+1)
+							{		  	
+					vc_sdp_remote.media_list[i].attributes := omit ; 
+							}
+						}
+				};
+		}		
+		
+		// save SDP if present
+		if ( ischosen(p_Request.messageBody.sdpMessageBody)) 
+		{
+			vc_sdp_remote := p_Request.messageBody.sdpMessageBody;		  
+			vc_sdp_remote_is_valid := true;
+   			f_prepare_SDP_answer();			 			
+		};
+		
+		// save XML if present
+		if ( ischosen(p_Request.messageBody.xmlBody))
+		{
+			vc_xml_remote := p_Request.messageBody.xmlBody;		 			
+		}
+
+		if ( ischosen(p_Request.messageBody.mimeMessageBody))
+		{
+			
+			for (var integer j:=0; j<sizeof(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList); j:=j+1){
+				if (match(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type,c_sdpAplication))
+				{
+					vc_sdp_remote := p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.sdpMessageBody;
+					vc_sdp_remote_is_valid := true;
+					f_prepare_SDP_answer();
+				};
+				if (match(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type,c_xmlAplication))
+				{
+					vc_xml_remote := p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.xmlBody;
+				};			
+			}	
+		}	
+	};
+	   
+	if (ispresent(p_Request.msgHeader.supported.optionsTags)) {
+		for (var integer i := sizeof(p_Request.msgHeader.supported.optionsTags); i>0; i:=i-1)
+		   {
+			   if (p_Request.msgHeader.supported.optionsTags[i-1]=="100rel")
+			   { vc_supported_100rel := true };
+			   if (p_Request.msgHeader.supported.optionsTags[i-1]=="precondition")
+			   { vc_supported_precondition := true }
+		   }
+	   	};
+      
+   } // end f_setHeadersOnReceiptOfINVITE
+
+	/**
+	 * 
+	 * @desc function reads header field of a received BYE message 
+	 * @param p_Request received BYE
+	 */
+   function f_setHeadersOnReceiptOfBYE(Request p_BYE_Request)
+   runs on SipComponent
+   {
+   	
+	 f_setHeadersOnReceiptOfRequest(p_BYE_Request);
+	 vc_callId := p_BYE_Request.msgHeader.callId;
+
+   } // end f_setHeadersOnReceiptOfBYE
+
+	/**
+	 * 
+	 * @desc function reads header field from an incoming Request message
+	 * @param p_Request received Request message
+	 */
+	function f_setHeadersOnReceiptOfRequest(Request p_Request) runs on SipComponent {
+     vc_request := p_Request;
+	 vc_cSeq := p_Request.msgHeader.cSeq;
+	 vc_iut_CSeq  := p_Request.msgHeader.cSeq;
+	 vc_from := p_Request.msgHeader.fromField;
+	 vc_to := p_Request.msgHeader.toField;
+	 vc_via := p_Request.msgHeader.via;
+	 // update sent_label according to received via header field
+	 f_getViaReplyAddr(vc_via.viaBody, vc_sent_label);
+	  
+	 // Catch route
+	 vc_boo_recordRoute:=false;
+	  
+	 if (ispresent(p_Request.msgHeader.recordRoute))
+	 {
+	   vc_boo_recordRoute:=true;
+	   vc_recordRoute := p_Request.msgHeader.recordRoute;
+	 }
+   	} // end f_setHeadersOnReceiptOfRequest
+
+	/**
+	 * 
+	 * @desc functions reads header fields from an incoming Response message
+	 * @param p_cSeq
+	 * @param p_response received response message
+	 * @verdict 
+	 */
+    function f_setHeadersOnReceiptOfResponse(inout CSeq p_cSeq, Response p_response) runs on SipComponent
+   {
+	 var integer v_i, v_j, v_nbroute;
+	 var Contact v_contact; //only for local purpose
+	       
+	 vc_response := p_response;
+	 //vc_cSeq := p_cSeq; //must not save global c_seq because it can overwrite temporary cSeq
+	 vc_to :=p_response.msgHeader.toField;
+	 vc_from :=p_response.msgHeader.fromField;
+	 vc_caller_To := vc_to;
+	 vc_caller_From := vc_from;
+      
+	 if (ispresent(p_response.msgHeader.contact))
+	 {
+	   v_contact := p_response.msgHeader.contact;
+	   if (ischosen(v_contact.contactBody.contactAddresses))
+	   {
+		 vc_reqHostPort := f_getContactAddr(v_contact.contactBody.contactAddresses[0]);
+	   }
+	 }
+	 else
+	 {
+	   if (ischosen(vc_to.addressField.nameAddr))
+	   {
+		 vc_reqHostPort := vc_to.addressField.nameAddr.addrSpec.hostPort;
+	   }
+	   else
+	   {
+		 vc_reqHostPort := vc_to.addressField.addrSpecUnion.hostPort;
+	   }
+	 }
+      
+	 vc_callee_To:={fieldName := TO_E,
+	   addressField := vc_caller_From.addressField,
+	   toParams := vc_caller_From.fromParams};
+      
+	 vc_callee_From:= {fieldName := FROM_E,
+	   addressField := vc_caller_To.addressField,
+	   fromParams := vc_caller_To.toParams};
+	 
+	 vc_via:= p_response.msgHeader.via;
+      
+	 // Route Management
+	 if (ispresent(p_response.msgHeader.recordRoute))
+	 {
+	   vc_recordRoute := p_response.msgHeader.recordRoute;
+	   v_nbroute := sizeof(vc_recordRoute.routeBody);
+	   // copy and reverse the order of the routes in route header
+	   for (v_i:=0; v_i<=(v_nbroute - 1); v_i:=v_i+1)
+	   {
+		 v_j:= v_nbroute - 1 - v_i;
+		 vc_route.routeBody[v_j]:=vc_recordRoute.routeBody[v_i];
+	   }
+	   vc_route.fieldName := ROUTE_E;
+	   vc_boo_recordRoute := true;
+	   vc_boo_route := true;
+	 }
+	 else
+	 {
+	   vc_boo_recordRoute := false;
+	   vc_boo_route := false;
+	 };
+
+
+	 // extentions due to new fields in PRACK and UPDATE messages
+	 if (ispresent(p_response.msgHeader.rSeq)) {
+	 	vc_rAck := 
+			 { fieldName := RACK_E, 
+			   responseNum := valueof(p_response.msgHeader.rSeq.responseNum),
+			   seqNumber := valueof(p_response.msgHeader.cSeq.seqNumber),
+			   method := valueof(p_response.msgHeader.cSeq.method)
+			 };
+		 };
+
+	 // extentions due to new HistoryInfo fields 180 or 200OK messages
+	 if (ispresent(p_response.msgHeader.historyInfo)) {
+	 	vc_historyInfoList := valueof(p_response.msgHeader.historyInfo.historyInfoList);
+		vc_history_is_valid := true
+		}
+	   else {vc_history_is_valid := false};
+
+	 //sdpMessageBody answer
+	 if (ispresent(p_response.messageBody)) { 
+		if ( ischosen(p_response.messageBody.sdpMessageBody))
+		{
+			vc_sdp_remote := p_response.messageBody.sdpMessageBody;		  
+			vc_sdp_remote_is_valid := true;
+	 	}
+
+		if ( ischosen(p_response.messageBody.xmlBody))
+		{
+			vc_xml_remote := p_response.messageBody.xmlBody;		 			
+		}
+
+		if ( ischosen(p_response.messageBody.mimeMessageBody))
+		{
+			
+			for (var integer j:=0; j<sizeof(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList); j:=j+1){
+				if (match(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type,c_sdpAplication))
+				{
+					vc_sdp_remote := p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.sdpMessageBody;
+				};
+				if (match(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type,c_xmlAplication))
+				{
+					vc_xml_remote := p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.xmlBody;
+				};			
+			}	
+		}
+	 };
+
+   }// end function f_setHeadersOnReceiptOfResponse
+
+   /**
+	* 
+	* @desc functions reads ServiceRoute header field from an incoming 200 Response message in registration
+	* @param p_cSeq
+	* @param p_response received response message
+	*/
+    function f_getServiceRouteMapIntoRouteInRegistration(inout CSeq p_cSeq, Response p_response) runs on SipComponent
+   {
+	 var integer v_i, v_j, v_nbroute;
+	 var ServiceRoute v_serviceRoute;
+	       
+	 // Route Management
+	 if (ispresent(p_response.msgHeader.serviceRoute))
+	 {
+	   v_serviceRoute := p_response.msgHeader.serviceRoute;
+	   v_nbroute := sizeof(v_serviceRoute.routeBody);
+	   // copy and reverse the order of the routes in route header
+	   for (v_i:=0; v_i<=(v_nbroute - 1); v_i:=v_i+1)
+	   {
+		 v_j:= v_nbroute - 1 - v_i;
+		 vc_route.routeBody[v_j]:=v_serviceRoute.routeBody[v_i];
+	   }
+	   vc_route.fieldName := ROUTE_E;
+	 }
+
+   }// end function f_getServiceRouteMapIntoRouteInRegistration
+
+
+} // end group SetHeaders
+   
+} // end group FieldOperations
+
+group SDPOperations{
+	
+	/** 
+	*  @desc check if message body include SDP attribute (2nd parameter)
+	*        for any media 
+	*		 
+	*/
+	function f_check_attribute(in SDP_Message p_sdp, in template SDP_attribute p_attribute) runs on SipComponent return boolean {
+		
+    	if (ispresent(p_sdp.media_list)) {
+    		for (var integer j:=0; j<sizeof(p_sdp.media_list); j:=j+1){			
+    			if (ispresent(p_sdp.media_list[j].attributes)) {
+    				for (var integer i:=0; i<sizeof(p_sdp.media_list[j].attributes); i:=i+1){			
+    					if (match(p_sdp.media_list[j].attributes[i],p_attribute)) 
+    						{return(true);};
+    					};
+    			}
+    			};
+    	}
+    	if (ispresent(p_sdp.attributes)) {
+    		for (var integer j:=0; j<sizeof(p_sdp.attributes); j:=j+1){			
+    			if (match(p_sdp.attributes[j],p_attribute)) {return(true);};
+    			};
+    	}
+    	
+    	return(false);
+	}		
+	
+	/**
+	 * 
+	 * @desc 	identify an SDP direction attribute (session or first media attribute) in a SDP message and return its answer value
+	 * @param 	p_sdp 		the SDP message that has been received
+	 * @param 	p_attribute incoming SDP attribute that need to be used for the SDP direction (answer)
+	 * @return 	the new attribute (to be send out) derived from the incoming SDP value
+	 * @verdict 
+	 */
+	function f_get_attribute_answer(in SDP_Message p_sdp, in template SDP_attribute p_attribute) runs on SipComponent return SDP_attribute {
+
+		var template SDP_attribute v_attribute := p_attribute;
+		
+		// check if the selected attribute is included in the SDP offer (session attributes)
+		if (ispresent(p_sdp.attributes)) {
+			for (var integer j:=0; j<sizeof(p_sdp.attributes); j:=j+1){			
+				if (match(p_sdp.attributes[j],p_attribute)) {v_attribute := p_sdp.attributes[j];};
+				};
+		}
+
+		// check if the selected attribute is included in the SDP offer (any of the media attributes)
+		if (ispresent(p_sdp.media_list)) {
+			for (var integer j:=0; j<sizeof(p_sdp.media_list); j:=j+1){			
+				if (ispresent(p_sdp.media_list[j].attributes)) {
+					for (var integer i:=0; i<sizeof(p_sdp.media_list[j].attributes); i:=i+1){			
+						if (match(p_sdp.media_list[j].attributes[i],p_attribute)) 
+							{v_attribute := p_sdp.media_list[j].attributes[i];};
+						};
+				}
+				};
+		}
+		select (valueof(v_attribute))
+		{
+			case (mw_attribute_sendonly) {return(valueof(m_attribute_recvonly));}
+			case (mw_attribute_sendrecv) {return(valueof(m_attribute_sendrecv));}//MRO	
+			case (mw_attribute_inactive) {return(valueof(m_attribute_inactive));}//MRO
+			case (mw_attribute_recvonly) {return(valueof(m_attribute_sendonly));}//MRO
+		}
+		return(valueof(m_attribute_sendrecv));//the default return value in case of missing attribute offer  
+	}
+
+	/** 
+	*  @desc check if message body include SDP bandwidth (2nd parameter)
+	*		 either for the session or a media description
+	*/
+	function f_check_bandwidth(in SDP_Message loc_sdp, in template SDP_bandwidth loc_bandw) runs on SipComponent return boolean {
+	
+					if (ispresent(loc_sdp.bandwidth)) {
+						for (var integer j:=0; j<sizeof(loc_sdp.bandwidth); j:=j+1){			
+							if (match(loc_sdp.bandwidth[j],loc_bandw)) {return(true);};
+							};
+					};
+					if (ispresent(loc_sdp.media_list)) {
+						for (var integer j:=0; j<sizeof(loc_sdp.media_list); j:=j+1){
+							if (ispresent(loc_sdp.media_list[j].bandwidth)) {						
+								if (match(loc_sdp.media_list[j].bandwidth,loc_bandw)) {return(true);};
+								};
+							};
+					};
+    	
+		return(false);
+	}
+
+	/** 
+	*  @desc check if message body include SDP media (2nd parameter)
+	*		 
+	*/
+	function f_check_media(in SDP_Message loc_sdp, in template SDP_media_desc loc_media) runs on SipComponent return boolean {
+		
+    	if (ispresent(loc_sdp.media_list)) {
+    		for (var integer j:=0; j<sizeof(loc_sdp.media_list); j:=j+1){			
+    			if (match(loc_sdp.media_list[j].media_field.transport,loc_media.media_field.transport) and
+    				match(loc_sdp.media_list[j].media_field.fmts,loc_media.media_field.fmts)) 
+    				{return(true);};
+    			};
+    	}
+    	return(false);
+	}
+	
+	/**
+	 * @desc
+	 *     check if message body include precondition mechanism (a=des and
+	 *     a=curr) retrun true, else false
+	 * @param loc_sdp SDP message
+	 */
+	function f_check_precondition(in SDP_Message loc_sdp) runs on SipComponent return boolean {
+    	if (f_check_attribute(loc_sdp, mw_attribute_des) or
+    		f_check_attribute(loc_sdp, mw_attribute_curr)) 
+    		{return(true);}
+    		
+    	return(false);
+	}	
+			
+
+	/** 
+	*  @desc check if message body include SDP media direction return true, else false
+	*		 
+	*/
+	function f_check_media_direction(in SDP_Message loc_sdp) runs on SipComponent return boolean {
+		
+    	if (f_check_attribute(loc_sdp, mw_attribute_sendonly) or
+    		f_check_attribute(loc_sdp, mw_attribute_recvonly) or
+    		f_check_attribute(loc_sdp, mw_attribute_sendrecv) or
+    		f_check_attribute(loc_sdp, mw_attribute_inactive)) 
+    		{return(true);}
+    		
+    	return(false);
+	}		
+
+	/** 
+	*  @desc copy media/attribute lines from remote to local SDP variable
+	*		 
+	*/
+	function f_check_SDP(integer loc_sdp, integer loc_codec) runs on SipComponent
+	return boolean
+	{
+		var SDP_media_desc v_media := f_prepare_media(loc_sdp,loc_codec);
+		log("log0"); 
+		if (vc_sdp_remote.media_list[0].media_field.media != v_media.media_field.media)
+			{ log("log1"); return false };
+		if (vc_sdp_remote.media_list[0].media_field.transport != v_media.media_field.transport)
+			{ log("log2"); return false };
+		if (vc_sdp_remote.media_list[0].media_field.fmts != v_media.media_field.fmts)
+			{ log("remote:",vc_sdp_remote.media_list[0].media_field.fmts,"expect:",v_media.media_field.fmts); return false };
+			
+		return true
+	}
+	
+	/**
+	 * @desc replace the first curr media attribute with the given value.
+	 * @param p_sdp SDP message to modify
+	 * @param p_curr new curr attribute
+	 */
+	function f_replace_curr_attribute(inout SDP_Message p_sdp, in SDP_attribute_curr p_curr) {
+		if(ispresent(p_sdp.media_list)) {
+			var integer mn := sizeof(p_sdp.media_list[0].attributes);
+			for(var integer i := 0; i<=mn; i := i+1) {
+				if(ischosen(p_sdp.media_list[0].attributes[i].curr)){
+					p_sdp.media_list[0].attributes[i].curr := p_curr;
+					i:=mn; 
+				}	
+			}
+		}
+	}
+	
+	/**
+	 * @desc append new media attribute to the first media description.
+	 * @param p_sdp SDP message to modify
+	 * @param p_att SDP attribute to appand
+	 */
+	function f_append_media_attribute(inout SDP_Message p_sdp, in SDP_attribute p_att) {
+		if(ispresent(p_sdp.media_list)) {
+			var integer mn := sizeof(p_sdp.media_list[0].attributes);
+			p_sdp.media_list[0].attributes[mn] := p_att;
+		}
+	}
+	
+	
+	/** 
+	*  @desc append new media to the existing media list in SDP
+	*		 
+	*/
+	function f_append_media(inout SDP_Message loc_SDP, in template SDP_media_desc loc_media)
+	{
+		var integer mn := sizeof(loc_SDP.media_list);
+		loc_SDP.media_list[mn] := valueof(loc_media);
+	}
+	
+	/** 
+	*  @desc repare media/attribute lines
+	*		 
+	*/
+	function f_prepare_media(integer loc_sdp, integer loc_codec) runs on SipComponent
+	return SDP_media_desc
+	{
+		var charstring v_codecs[32] := {
+			"PCMU/8000", "GSM/8000", "G723/8000", "DVI4/8000",
+			"DVI4/16000", "LPC/8000", "PCMA/8000", "G722/8000",
+			"L16/44100/2", "L16/44100", "QCELP/8000", "CN/8000",
+			"MPA/90000", "G728/8000", "DVI4/11025", "DVI4/22050",
+			"G729/8000", "G726-40/8000", "G726-32/8000", "G726-24/8000",
+			"G726-16/8000", "G726D/8000", "G726E/8000", "GSM-EFR/8000",
+			"CelB/90000", "JPEG/90000", "Nv/90000", "H261/90000",
+			"MPV/90000", "MP2T/90000", "H263/90000", "H263-1998/90000"
+		}
+		var SDP_media_desc v_media :=
+			{
+				media_field := {
+					media := "audio",
+					ports := { 
+						port_number := 10000, 
+						num_of_ports:=omit },
+					transport := "RTP/AVP",
+					fmts := { "0" }
+				}, //m=audio 8500 RTP/AVP 0
+				information := omit,
+				connections := omit,
+				bandwidth := omit,
+				key := omit,						
+				attributes := omit
+			};
+			
+		if (32<loc_codec or loc_codec<1) {
+			log("Unexpected SDP variant");
+			setverdict(inconc); 
+			return (v_media)}
+
+		if (loc_sdp == 1) {}
+		else if (loc_sdp == 2) {
+			v_media.media_field.fmts := {PX_SIP_SDP_dyn}; //{ "98", "0" };
+			v_media.attributes := {{
+			rtpmap := { attr_value := PX_SIP_SDP_dyn & " " & v_codecs[loc_codec-1] } // PX_SIP_SDP_dyn := 98
+			}}
+		} else if (loc_sdp == 3) {
+			v_media.media_field.fmts := { "8" }
+		} else if (loc_sdp == 4) {
+			v_media.media_field.fmts := { "99", "8" };
+			v_media.attributes := {{
+				rtpmap := { attr_value := "99 " & v_codecs[loc_codec-1] }
+						}}
+		} else if (loc_sdp == 5) {
+			v_media.media_field.media := "image";
+			v_media.media_field.transport := "udptl";
+			v_media.media_field.fmts := { "t38" }
+		} else if (loc_sdp == 6) {
+			v_media.media_field.media := "image";
+			v_media.media_field.transport := "tcptl";
+			v_media.media_field.fmts := { "t38" }
+		} else {
+			log("Unexpected SDP variant"); setverdict(inconc) 
+		};
+			
+		return (v_media);
+	}
+
+	/** 
+	*  @desc repare media/attribute lines
+	*		 
+	*/
+	function f_prepare_SDP(integer loc_sdp, integer loc_codec) runs on SipComponent
+	{
+
+		vc_sdp_local.media_list := {f_prepare_media(loc_sdp,loc_codec)};
+	}
+	
+	/**
+	* 
+	* @desc function that copy media/attribute lines from remote to local SDP variable
+	*/
+	function f_prepare_SDP_answer() runs on SipComponent
+	{
+		var integer mn, cn := 0, i, j, k :=0;
+		var charstring v_PT, v_rtpmap := "";
+		var SDP_attribute_list v_mediaAttributes := {};
+		//increase session version
+		vc_sdp_local.origin.session_version := 	int2str(str2int(vc_sdp_local.origin.session_version)+1);
+		// if more than one codec, select the firs one
+		mn:= sizeof(vc_sdp_local.media_list);
+		for (i :=0;  i < mn; i := i+1)
+		{
+			//for every single media
+			if (ispresent(vc_sdp_local.media_list[i].attributes))
+			{
+				cn := sizeof(vc_sdp_local.media_list[i].attributes);
+			};
+			if (sizeof(vc_sdp_local.media_list[i].media_field.fmts)>1) 
+			{
+				// select the first one
+				v_PT := vc_sdp_local.media_list[i].media_field.fmts[0];
+				vc_sdp_local.media_list[i].media_field.fmts := {v_PT};
+				for (j :=0; j<cn; j:=j+1)
+				{
+					if (ischosen(vc_sdp_local.media_list[i].attributes[j].rtpmap))
+					{
+						if (v_PT == regexp(vc_sdp_local.media_list[i].attributes[j].rtpmap.attr_value,	"[ \t]#(0,)([/d]+)*",	0))
+						{
+							v_rtpmap := vc_sdp_local.media_list[i].attributes[j].
+							rtpmap.attr_value;
+							v_mediaAttributes[k] := {rtpmap := {attr_value := v_rtpmap}};
+							k := k+1;
+						} // else line is not copied
+					}
+
+
+					// simplified handling of status attributes (copy/keep status from peer):
+					// a) copy/keep SDP_attribute_curr (invert tags if applicable)
+					if (ischosen(vc_sdp_local.media_list[i].attributes[j].curr))
+					{
+						// invert local/remote status tags
+						if (vc_sdp_local.media_list[i].attributes[j].curr.statusType == "local")
+							{vc_sdp_local.media_list[i].attributes[j].curr.statusType := "remote"};
+						if (vc_sdp_local.media_list[i].attributes[j].curr.statusType == "remote")
+							{vc_sdp_local.media_list[i].attributes[j].curr.statusType := "local"};
+						// invert send/recv direction tags
+						if (vc_sdp_local.media_list[i].attributes[j].curr.direction == "send")
+							{vc_sdp_local.media_list[i].attributes[j].curr.direction := "recv"};
+						if (vc_sdp_local.media_list[i].attributes[j].curr.direction == "recv")
+							{vc_sdp_local.media_list[i].attributes[j].curr.direction := "send"};
+					}				
+					// b) copy/keep SDP_attribute_des (keep strength, invert tags if applicable)	
+					else if (ischosen(vc_sdp_local.media_list[i].attributes[j].des))
+					{
+						// invert local/remote status tags
+						if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "local")
+							{vc_sdp_local.media_list[i].attributes[j].des.statusType := "remote"};
+						if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "remote")
+							{vc_sdp_local.media_list[i].attributes[j].des.statusType := "local"};
+						// invert send/recv direction tags
+						if (vc_sdp_local.media_list[i].attributes[j].des.direction == "send")
+							{vc_sdp_local.media_list[i].attributes[j].des.direction := "recv"};
+						if (vc_sdp_local.media_list[i].attributes[j].des.direction == "recv")
+							{vc_sdp_local.media_list[i].attributes[j].des.direction := "send"};
+					}				
+					// c) simplification: assume no SDP_attribute_conf	
+					else if (ischosen(vc_sdp_local.media_list[i].attributes[j].conf))
+					{
+						// todo: handle SDP_attribute_conf
+					}					
+						
+					 
+					else 
+					{
+						// simple copy of attribute
+						v_mediaAttributes[k] := vc_sdp_local.media_list[i].attributes[j];
+						k := k+1;
+					}
+				}
+				vc_sdp_local.media_list[i].attributes := v_mediaAttributes;
+			}
+		}
+		// add handling of prenegotiation, change ports if required etc.
+		//if prenegotiation...
+	}
+
+	/** 
+	*  @desc reject SDP offer by setting media ports to 0
+	*		 
+	*/
+	function f_reject_SDP_offer() runs on SipComponent
+	{
+		var integer mn, i;
+		f_copy_SDP(); // TO BE DONE with more details!
+		//increase session version
+		vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version)+1);
+		// if more than one codec, select the firs one
+		mn:= sizeof(vc_sdp_local.media_list);
+		for (i :=0;  i < mn; i := i+1)
+		{
+			vc_sdp_local.media_list[i].media_field.ports := {0, omit};
+			vc_sdp_local.media_list[i].attributes := omit; //{};
+		};
+	}
+
+	/**
+	 * 
+	 * @desc 	copies SDP message elements from remote to local component variable: 
+	 * 				- bandwidth
+	 * 				- session version (will be incremented)
+	 * 				- media list
+	 * 			modify the direction attribute of an SDP media list entry within an SDP message (vc_sdp_local)
+	 * @param 	p_medianum 		list position number of the media (if value 0 identifies first media list element)
+	 * @param 	p_direction		the new direction attribute to be included in the media entry
+	 * @verdict 
+	 */
+	function f_SIP_modMediaDirection(integer p_medianum, template SDP_attribute p_direction) runs on SipComponent
+	{
+		var boolean v_set_direction; // flag indicates if direction attribute has been modified
+		var integer v_mn := 0; 		 // length of media list (number of entries)
+		var integer v_cn := 0; 		 // number of attributes of a media entry
+		var integer i, j, k := 0;
+		var SDP_attribute_list v_mediaAttributes := {}; // collect the media attributes (to be assigned at end of function)
+		
+		f_copy_SDP(); // copy SDP session bandwidth and media list from remote to local component variable
+		
+		// increment session version
+		vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version)+1);
+		
+		// if more than one codec, select the first one
+		v_mn:= sizeof(vc_sdp_local.media_list);
+
+		if (p_medianum == 0) //specific media requested
+    		{
+    			p_medianum := 1; // start checking from first media
+    		};
+		if (p_medianum > 0) //specific media requested
+    		{
+    			if (not(p_medianum > v_mn)) 
+    				{v_mn := p_medianum}
+    		};
+    		
+		// handling of media list elements
+		for (i :=0;  i < v_mn; i := i+1)
+		{
+			v_cn := 0; // initialize the number of attributes of the media list entry
+		
+			if (ispresent(vc_sdp_local.media_list)) //media_list is optional
+			{						
+//				log("vc_sdp_local.media_list[i] ",vc_sdp_local.media_list[i]);
+				if (ispresent(vc_sdp_local.media_list[i].attributes))
+				{
+					v_cn := sizeof(vc_sdp_local.media_list[i].attributes);
+				};
+				
+				v_set_direction := false;
+				
+				//if (sizeof(vc_sdp_local.media_list[i].media_field.fmts)>1) 
+				// select the first one
+				for (j :=0; j<v_cn; j:=j+1)
+				{ 
+					if (ischosen(vc_sdp_local.media_list[i].attributes[j].recvonly)
+							or ischosen(vc_sdp_local.media_list[i].attributes[j].sendonly)
+							or ischosen(vc_sdp_local.media_list[i].attributes[j].inactive)
+							or ischosen(vc_sdp_local.media_list[i].attributes[j].sendrecv))
+						{
+							v_mediaAttributes[k] := valueof(p_direction); 
+							v_set_direction := true;
+						}
+				 		else // non-direction attributes will be copied
+						{
+							v_mediaAttributes[k] := vc_sdp_local.media_list[i].attributes[j];
+							k := k+1;
+						}
+				}
+				
+				if (not v_set_direction) 
+					{ v_mediaAttributes[k] := valueof(p_direction)};
+				vc_sdp_local.media_list[i].attributes := v_mediaAttributes;
+    				
+				// }
+			}
+		}	 
+		// add handling of prenegotiation, change ports if required etc.
+		//if prenegotiation...
+	}
+	
+     /** 
+     *  @desc modify session and media attributes direction
+     *		 
+     */
+     function f_SIP_modSessionDirection(template SDP_attribute p_direction) runs on SipComponent
+     {
+      var boolean v_set_direction;
+      var integer v_mn:= 0, i:=0;
+      var SDP_attribute_list v_mediaAttributes := {};
+      
+	  if (ispresent(vc_sdp_local.attributes))
+		{ v_mn:= sizeof(vc_sdp_local.attributes);			
+       
+          for (i :=0;  i < v_mn; i := i+1)
+          {//for every single attribute (that is not omit)    
+                 if (ischosen(vc_sdp_local.attributes[i].recvonly)
+                   or ischosen(vc_sdp_local.attributes[i].sendonly)
+                   or ischosen(vc_sdp_local.attributes[i].inactive)
+                   or ischosen(vc_sdp_local.attributes[i].sendrecv))
+                 {
+                  v_mediaAttributes[i] := valueof(p_direction); 
+                  v_set_direction := true;
+                 }
+                 else // simple copy of attribute
+                 {v_mediaAttributes[i] := vc_sdp_local.attributes[i]}        				 
+           }
+           if (not v_set_direction) // if not sent before
+               { v_mediaAttributes[v_mn] := valueof(p_direction)};
+           vc_sdp_local.attributes := v_mediaAttributes;       
+		};    
+    }
+ 
+	/** 
+	*  @desc c
+	*		 
+	*/
+
+
+    /*
+     * 
+     * @desc check (from remote) and set (local) the session/media attribute lines on directions
+     * @param p_direction_in incoming SDP attribute that need to be checked
+     * @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
+     * @return 
+     * @verdict 
+     */	
+	function f_SIP_checksetSDPreqDirection(template SDP_attribute p_direction_in, template SDP_attribute p_direction_out) runs on SipComponent
+	{	var template SDP_attribute v_direction_out := p_direction_out;
+		// check incoming SDP attribute
+		if (not (ispresent(vc_request.messageBody) and f_check_attribute(vc_request.messageBody.sdpMessageBody,p_direction_in))) 
+			{setverdict(fail);};
+		if (match(omit,p_direction_out))//not isvalue(v_direction_out))//MRO
+			{v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in);}
+		f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description
+		f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session		
+	}
+
+	/*
+		* 
+		* @desc check (from remote) and set (local)the session/media attribute lines on directions
+		* @param p_direction_in attribute to be check
+		* @param p_direction_out attrubyte to be 
+		* @return 
+		* @verdict 
+		*/	
+    function f_SIP_checkSDPrespDirection(template SDP_attribute p_direction_in) runs on SipComponent
+    {		
+    	// check incoming SDP attribute
+    	if (not (ispresent(vc_response.messageBody) and f_check_attribute(vc_response.messageBody.sdpMessageBody,p_direction_in))) 
+    		{setverdict(fail);};
+    }
+
+	/** 
+	*  @desc check media/attribute lines from remote
+	*		 
+	*/
+	function f_SIP_checkMediaDirection(integer p_medianum, template SDP_attribute p_direction) runs on SipComponent
+	return boolean
+	{
+		var integer v_mn, v_cn := 0, i, j;
+		var boolean v_result := false;
+		//increase session version
+		vc_sdp_remote.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version)+1);
+		// if more than one codec, select the firs one
+		v_mn:= sizeof(vc_sdp_remote.media_list);
+		if (p_medianum == 0) //specific media requested
+		{
+			p_medianum := 1; // start checking from first media
+		};
+		if (p_medianum > 0) //specific media requested
+		{
+			if (p_medianum > v_mn) {return false}
+			else {v_mn := p_medianum}
+		};
+		for (i :=p_medianum-1;  i < v_mn; i := i+1)
+		{
+			//for every single media
+			if (ispresent(vc_sdp_remote.media_list[i].attributes))
+			{
+				v_cn := sizeof(vc_sdp_remote.media_list[i].attributes);
+				log (v_cn);
+			};
+			if (sizeof(vc_sdp_remote.media_list[i].attributes)>0) 
+			{
+				// select the first one
+				log(vc_sdp_remote.media_list[i].attributes);
+				for (j :=0; j<sizeof(vc_sdp_remote.media_list[i].attributes); j:=j+1)
+				{
+					log(vc_sdp_remote.media_list[i].attributes[j]);
+					if (ischosen(vc_sdp_remote.media_list[i].attributes[j].recvonly)
+							or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendonly)
+							or ischosen(vc_sdp_remote.media_list[i].attributes[j].inactive)
+							or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendrecv))
+					{
+						if (match(vc_sdp_remote.media_list[i].attributes[j],p_direction))
+						{ v_result :=  true; }
+						else { return  false; }
+					}
+
+					//v_result :=  true; // TODO This is a shortcut since direction attributes are not decoded
+				}
+			}
+		}
+		return v_result
+	}
+
+	/** 
+	*  @desc copy media/attribute lines from remote to local SDP variable
+	*		 
+	*/
+	function f_copy_SDP() runs on SipComponent
+	{
+		if (ispresent(vc_sdp_remote.bandwidth))
+				{vc_sdp_local.bandwidth := vc_sdp_remote.bandwidth}
+			else {vc_sdp_local.bandwidth := {}};
+			
+		if (ispresent(vc_sdp_remote.media_list))
+		{
+                //			// cleaning of media before assignment	
+                //			if (ispresent(vc_sdp_local.media_list))
+                //			{
+                //				for (var integer i:=0; i<sizeof(vc_sdp_local.media_list); i:=i+1)
+                //				{			
+                //					vc_sdp_local.media_list[i] := omit ; 						  
+                //				}			
+                //			};		
+			vc_sdp_local.media_list := vc_sdp_remote.media_list;
+		}
+	}
+}//end group SDPOperations
+
+group AwaitingMessage {
+
+	/**
+	 * 
+	 * @desc Function waiting for any MSG -request/response 
+	 */
+	function f_awaitingAnyPassOnTimeout() runs on SipComponent
+	{
+	  tc_wait.start(PX_SIP_TWAIT);
+	  alt
+	  {
+		[] SIPP.receive	//TAU error if expect (*)
+		  {
+			tc_wait.stop;
+			vc_boo_response:=true;
+			vc_boo_request:=true;
+			//setverdict(pass)
+		  }
+		[] tc_wait.timeout
+		  {
+			vc_boo_response:=false;
+			vc_boo_request:=false;
+			//setverdict (pass)
+		  }
+	  }
+	} //end f_awaitingResponsePassOnTimeout
+
+	/**
+	 * 
+	 * @desc Function waiting for no MSG -request/response 
+	 */
+	function f_awaitingNonePassOnTimeout() runs on SipComponent
+	{
+	  tc_wait.start(PX_SIP_TWAIT);
+	  alt
+	  {
+		[] SIPP.receive	
+		  {
+			tc_wait.stop;
+			setverdict(fail);
+		  }
+		[] tc_wait.timeout
+		  {
+			setverdict (pass);
+		  }
+	  }
+	} //end f_awaitingResponsePassOnTimeout
+		
+	/**
+	 * 
+	 * @desc function awaits REGISTER
+	 * @param p_register expected REGISTER request
+	 */	
+ 	function f_awaitingREGISTER(in template REGISTER_Request p_register) runs on SipComponent
+	{
+		var Request v_request;
+      
+		tc_resp.start(PX_SIP_TRESP);
+		alt
+		{
+		  [] SIPP.receive(p_register)-> value v_request sender vc_sent_label
+			{
+			  tc_resp.stop;
+			  f_setHeadersOnReceiptOfREGISTER(v_request);
+			}
+		}		
+	}
+	
+	/**
+	 * 
+	 * @desc function awaits SUBSCRIBE
+	 * @param p_register expected SUBSCRIBE request
+	 */	
+	function f_awaitingSUBSCRIBE(in template SUBSCRIBE_Request p_register) runs on SipComponent
+	{
+		var Request	v_request;
+      
+		tc_resp.start(PX_SIP_TRESP);
+		alt
+		{
+		  [] SIPP.receive(p_register)-> value v_request sender vc_sent_label
+			{
+			  tc_resp.stop;
+			  f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
+			}
+		}		
+	}
+	
+	/**
+	 * 
+	 * @desc function awaits REGISTER and sends a 200 OK response
+	 * @param p_reply flag used to avoid the 200OK response sending
+	 */	
+ 	function f_awaitingREGISTER_sendReply(in template REGISTER_Request p_register, in boolean p_reply) runs on SipComponent
+	{
+		var Request	v_request;
+      
+		tc_resp.start(PX_SIP_TRESP);
+		alt
+		{
+		  [] SIPP.receive(p_register)-> value v_request sender vc_sent_label
+			{
+			  tc_resp.stop;
+			  vc_request := v_request;
+			  f_setHeadersOnReceiptOfREGISTER(v_request);
+			  //Answer to the Request
+			  if (p_reply) {f_send200OK();};
+			}
+		}		
+	}
+	
+
+	/**
+	 * 
+	 * @desc Function waiting for a 200 OK response
+	 * @param p_cSeq_s current cSeq expectation
+	 */
+	function f_awaitingOkResponse(inout CSeq p_cSeq_s) runs on SipComponent
+	{ 
+
+  	tc_ack.start(PX_SIP_TACK);
+  	alt
+  	{
+		[] SIPP.receive	(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response
+	  	{
+			tc_ack.stop;
+			f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
+			setverdict(pass)
+		}
+  	}
+	} //end awaitingOkResponse
+
+	/**
+	 * 
+	 * @desc Function waiting for a response
+	 * @param p_Response expected response message
+	 */
+	function f_awaitingResponse(in template Response p_Response) runs on SipComponent
+	{
+	  tc_ack.start(PX_SIP_TACK);
+	  alt
+	  {
+		[] SIPP.receive	(p_Response) -> value vc_response
+		  {
+			tc_ack.stop;
+			f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
+			setverdict(pass)
+		  }
+	  }
+	} //end f_awaitingResponse
+	
+	/**
+		 * 
+		 * @desc Function waiting for a response
+		 * @param p_Response expected response message
+		 */
+		function f_awaitingResponsePassOnTimeout(in template Response p_Response) runs on SipComponent
+		{
+		  tc_ack.start(PX_SIP_TACK);
+		  alt
+		  {
+			[] SIPP.receive	(p_Response) -> value vc_response
+			  {
+				tc_ack.stop;
+				f_setHeadersOnReceiptOfResponse(vc_cSeq, vc_response);
+				vc_boo_response:=true;
+				//setverdict(pass)
+			  }
+			[] tc_ack.timeout
+			  {
+			  	vc_boo_response:=false;
+			  	//setverdict (pass)
+			  }
+		  }
+		} //end f_awaitingResponsePassOnTimeout
+	
+	/** 
+	*  @desc await INFO request
+	*		 reply with 200 OK
+	*/
+	function f_awaitingINFO_sendReply(in template INFO_Request p_MSG) runs on SipComponent
+	{
+		var INFO_Request	v_MSG;
+      
+		tc_resp.start(PX_SIP_TRESP);
+		alt
+		{
+		  [] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+			{
+			  tc_resp.stop;
+			  f_setHeadersOnReceiptOfRequest(v_MSG);
+			  //Answer to the INFO
+			  f_send200OK();
+			}
+		}
+	} // end of f_awaitingINFO_sendReply
+	
+	/**
+	 * 
+	 * @desc function awaiting for an incoming INVITE
+	 * @param p_request expected message
+	 */
+	function f_awaitingINVITE(template INVITE_Request p_request) runs on SipComponent
+	{
+	  var INVITE_Request v_INVITE_Request;
+      
+	  tc_wait.start(PX_SIP_TWAIT);
+	  alt
+	  {
+		[]SIPP.receive	(p_request) -> value v_INVITE_Request sender vc_sent_label
+		  { 
+			tc_wait.stop;
+			vc_ignore_invite := true;
+			vc_first_recv:= true; // communication has started
+			f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
+			SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
+		  }
+	  }
+	} //end f_awaitingINVITE
+
+	/**
+		* 
+		* @desc function awaiting for an incoming INVITE
+		* @param p_request expected message
+		*/
+	function f_awaitingINVITE_No100Response(template INVITE_Request p_request) runs on SipComponent
+	{
+	  var INVITE_Request v_INVITE_Request;
+      
+      tc_wait.start(PX_SIP_TWAIT);
+      alt
+      {
+    	[]SIPP.receive	(p_request) -> value v_INVITE_Request sender vc_sent_label
+    	  { 
+    		tc_wait.stop;
+    		vc_ignore_invite := true;
+    		vc_first_recv:= true; // communication has started
+    		f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
+    	    //SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
+    	  }
+      }
+	} //end f_awaitingInviteRequest
+
+	/**
+	 * 
+	 * @desc function awaiting for an incoming INVITE
+	 * @param p_request expected message
+	 */
+	function f_awaitingINVITE_PassOnTimeout(template INVITE_Request p_request) runs on SipComponent
+	{
+	  var INVITE_Request v_INVITE_Request;
+      
+	  tc_wait.start(PX_SIP_TWAIT);
+	  alt
+	  {
+		[]SIPP.receive	(p_request) -> value v_INVITE_Request sender vc_sent_label
+		  { 
+			tc_wait.stop;
+			vc_ignore_invite := true;
+			vc_first_recv:= true; // communication has started
+			vc_boo_request := true;
+			f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
+			SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
+		  }
+		[]tc_wait.timeout
+		  {
+			vc_boo_request := false;
+		  }
+	  }
+	} //end f_awaitingInviteRequest
+
+	/**
+	 * 
+	 * @desc function awaiting ACK request
+	 */
+	function f_awaitingACK(in template ACK_Request p_ACK) runs on SipComponent
+	{
+	  var Request v_ACK_Request;
+	  tc_ack.start(PX_SIP_TACK);
+      
+	  alt
+	  {
+		[] SIPP.receive(p_ACK) -> value v_ACK_Request
+		  {
+			tc_ack.stop;
+		  }
+		// INVITE may be repeated and shall be ignored
+		[]SIPP.receive(mw_INVITE_Request_Base)
+		  {
+			repeat;
+		  }
+		// Ignore othe message
+		[] SIPP.receive
+		  {
+			repeat;
+		  }
+	  }
+	} //end f_awaitingAckRequest
+
+	/**
+	 * 
+	 * @desc function awaiting BYE and sending 200OK response
+	 * @param p_BYE expected BYE
+	 */
+	function f_awaitingBYE(in template BYE_Request p_BYE) runs on SipComponent
+	{
+	  var BYE_Request v_BYE_Request;
+      
+	  tc_resp.start(PX_SIP_TRESP);
+	  alt
+	  {
+		[]SIPP.receive	(p_BYE) -> value v_BYE_Request sender vc_sent_label
+		  {
+			tc_resp.stop;
+			vc_ignore_bye:= true;
+			f_setHeadersOnReceiptOfBYE(v_BYE_Request);
+			//f_send200OK();
+		  }
+	  }		
+	} // end f_awaitingBYE
+
+	/**
+	 * 
+	 * @desc function awaiting BYE and sending 200OK response
+	 * @param p_BYE expected BYE
+	 */
+	function f_awaitingBYE_sendReply
+	(in template BYE_Request p_BYE) runs on SipComponent
+	{
+	  var BYE_Request v_BYE_Request;
+      
+	  tc_resp.start(PX_SIP_TRESP);
+	  alt
+	  {
+		[]SIPP.receive	(p_BYE) -> value v_BYE_Request sender vc_sent_label
+		  {
+			tc_resp.stop;
+			vc_ignore_bye:= true;
+			f_setHeadersOnReceiptOfBYE(v_BYE_Request);
+			f_send200OK();
+		  }
+	  }		
+	} // end f_awaitingBYE_sendReply
+	
+	/**
+	 * 
+	 * @desc function awaiting BYE and sending 200OK response
+	 * @param p_BYE expected BYE
+	 */
+	function f_awaitingBYE_sendReply_PassOnTimeout(in template BYE_Request p_BYE) runs on SipComponent
+	{
+	  var BYE_Request v_BYE_Request;
+      
+	  tc_resp.start(PX_SIP_TRESP);
+	  alt
+	  {
+		[]SIPP.receive	(p_BYE) -> value v_BYE_Request sender vc_sent_label
+		  {
+			tc_resp.stop;
+			vc_ignore_bye:= true;
+			vc_boo_request := true;
+			f_setHeadersOnReceiptOfBYE(v_BYE_Request);
+			f_send200OK();
+		  }
+		[]tc_resp.timeout
+		  {
+		  	vc_boo_request := false;
+		  }
+		
+	  }		
+	} // end f_awaitingBYE_sendReply_PassOnTimeout
+
+	/**
+	* 
+	* @desc function awaiting CANCEL
+	* @param p_CANCEL expected CANCEL
+	*/
+	function f_awaitingCANCEL(in template CANCEL_Request p_CANCEL) runs on SipComponent
+	{
+		var CANCEL_Request v_MSG;
+     
+		tc_resp.start(PX_SIP_TRESP);
+		alt
+		{
+		[]SIPP.receive	(p_CANCEL) -> value v_MSG sender vc_sent_label
+		  {
+			tc_resp.stop;
+			f_setHeadersOnReceiptOfRequest(v_MSG);
+		  }
+		}		
+	} // end f_awaitingCANCEL
+	/** 
+	*  @desc await MESSAGE request
+	*/
+	function f_awaitingMESSAGE(in template MESSAGE_Request p_MSG) runs on SipComponent
+	{
+		var MESSAGE_Request	v_MSG;
+  
+		tc_resp.start(PX_SIP_TRESP);
+		alt
+		{
+		  [] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+			{
+			  tc_resp.stop;
+			  f_setHeadersOnReceiptOfRequest(v_MSG);
+			  //Answer to the MESSAGE
+			  //f_send200OK();
+			}
+		}
+	} // end of f_awaitingMESSAGE
+	
+	/** 
+	*  @desc await MESSAGE request
+	*		 reply with 200 OK
+	*/
+	function f_awaitingMESSAGE_sendReply() runs on SipComponent
+	{
+		var MESSAGE_Request	v_MSG;
+      
+		tc_resp.start(PX_SIP_TRESP);
+		alt
+		{
+		  [] SIPP.receive(mw_MESSAGE_Request_Base(vc_callId))-> value v_MSG sender vc_sent_label
+			{
+			  tc_resp.stop;
+			  f_setHeadersOnReceiptOfRequest(v_MSG);
+			  //Answer to the MESSAGE
+			  f_send200OK();
+			}
+		}		
+			
+	} // end of f_awaitingMESSAGE_sendReply
+
+	/** 
+	*  @desc await MESSAGE request
+	*/
+	function f_awaitingMESSAGE_sendReply_PassOnTimeout(in template MESSAGE_Request p_MSG) runs on SipComponent
+	{
+		var MESSAGE_Request	v_MSG;
+  
+		tc_resp.start(PX_SIP_TRESP);
+		alt
+		{
+		  [] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+			{
+			  tc_resp.stop;
+			  f_setHeadersOnReceiptOfRequest(v_MSG);
+			  //Answer to the MESSAGE
+			  //f_send200OK();
+			  vc_boo_request := true;
+			  f_send200OK();
+			  //setverdict (pass);
+			}
+		  [] tc_resp.timeout
+		  	{
+			  vc_boo_request := false;
+			  //setverdict (pass);
+		  	}
+		}
+	} // end of f_awaitingMESSAGE_PassOnTimeout
+	
+	/** 
+	*  @desc await NOTIFY request
+	*		 reply with 200 OK
+	*/
+	function f_awaitingNOTIFY_sendReply(in template NOTIFY_Request p_MSG) runs on SipComponent
+	{
+		var NOTIFY_Request	v_MSG;
+      
+		tc_resp.start(PX_SIP_TRESP);
+		alt
+		{
+		  [] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+			{
+			  tc_resp.stop;
+			  f_setHeadersOnReceiptOfRequest(v_MSG);
+			  //Answer to the NOTIFY
+			  f_send200OK();
+			}
+		}
+	} // end of f_awaitingNOTIFY_sendReply	
+
+    /** 
+    *  @desc await PRACK request
+    *		 reply with 200 OK
+    */
+    function f_awaitingPRACK_sendReply(in template PRACK_Request p_MSG) runs on SipComponent
+    {
+    	var PRACK_Request	v_MSG;
+      
+    	tc_resp.start(PX_SIP_TRESP);
+    	alt
+    	{
+    			[] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+    		{
+    				tc_resp.stop;
+    				f_setHeadersOnReceiptOfRequest(v_MSG);
+    				//Answer to the PRACK
+    				f_send200OK();
+    		}
+    	}		
+    		
+    } // end of f_awaitingPRACK_sendReply
+	
+		/** 
+	*  @desc await PUBLISH request
+	*		 reply with 200 OK
+	*/
+	function f_awaitingPUBLISH_sendReply(in template PUBLISH_Request p_MSG) runs on SipComponent
+	{
+		var PUBLISH_Request	v_MSG;
+  
+		tc_resp.start(PX_SIP_TRESP);
+		alt
+		{
+		  [] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+			{
+			  tc_resp.stop;
+			  f_setHeadersOnReceiptOfRequest(v_MSG);
+			  //Answer to the PUBLISH
+			  f_send200OK();
+			}
+		}		
+		
+	} // end of f_awaitingPUBLISH_sendReply
+	
+	/** 
+	*  @desc await UPDATE request
+	*/
+	function f_awaitingUPDATE(in template UPDATE_Request p_MSG) runs on SipComponent
+	{
+		var UPDATE_Request	v_MSG;
+  
+		tc_resp.start(PX_SIP_TRESP);
+		alt
+		{
+				[] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+			{
+					tc_resp.stop;
+					f_setHeadersOnReceiptOfRequest(v_MSG);
+			}
+		}
+	} // end of f_awaitingUPDATE	
+	
+	/** 
+	*  @desc await UPDATE request
+	*		 reply with 200 OK
+	*/
+	function f_awaitingUPDATE_sendReply(in template UPDATE_Request p_MSG) runs on SipComponent
+	{
+		var UPDATE_Request	v_MSG;
+  
+  		tc_resp.start(PX_SIP_TRESP);
+		alt
+		{
+			[] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+				{
+					tc_resp.stop;
+					f_setHeadersOnReceiptOfRequest(v_MSG);
+					//Answer to the UPDATE
+					f_send200OK();
+				}
+		}		
+
+	} // end of f_awaitingUPDATE_sendReply
+	
+		
+	/** 
+	*  @desc await REFER request
+	*/
+	function f_awaitingREFER(in template REFER_Request p_MSG) runs on SipComponent
+	{
+		var REFER_Request v_MSG;
+  
+		tc_resp.start(PX_SIP_TRESP);
+		alt
+		{
+			[] SIPP.receive(p_MSG)-> value v_MSG sender vc_sent_label
+			{
+					tc_resp.stop;
+					f_setHeadersOnReceiptOfRequest(v_MSG);
+			}
+		}
+	} // end of f_awaitingUPDATE
+	
+} // end AwaitingMessage
+
+group SendMessage {
+
+	/**
+ 	* 
+ 	* @desc  send ACK message, update the route and recordRoute header fields depending on boolean flags
+ 	* @param p_request template of the message to be sent
+ 	*/	
+	function f_SendACK(template ACK_Request p_request) runs on SipComponent
+	{
+		p_request.msgHeader.route 		:= f_route(); 		// update the route header field depending on vc_boo_route
+		// n/a p_request.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
+		SIPP.send(p_request) to vc_sent_label;	  
+	}
+	
+	/**
+	* 
+	* @desc  send BYE message, update the route and recordRoute header fields depending on boolean flags
+	* @param p_request template of the message to be sent
+	*/	
+	function f_SendBYE(template BYE_Request p_request) runs on SipComponent
+	{
+		f_setHeadersGeneral(vc_cSeq, "BYE"); // cseq, contact, branch, via
+		p_request.msgHeader.route 		:= f_route(); 		// update the route header field depending on vc_boo_route
+		p_request.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
+		SIPP.send(p_request) to vc_sent_label;	  
+	}
+	
+	/**
+	* 
+	* @desc  send CANCEL message
+	* @param p_request template of the message to be sent
+	*/	
+	function f_SendCANCEL(template CANCEL_Request p_request) runs on SipComponent
+	{
+		f_setHeadersGeneral(vc_cSeq, "CANCEL"); // cseq, contact, branch, via
+		SIPP.send(p_request) to vc_sent_label;	  
+	}
+		
+	/**
+	* 
+	* @desc  send INFO message
+	* @param p_request template of the message to be sent
+	*/	
+	function f_SendINFO(template INFO_Request p_request) runs on SipComponent
+	{
+		f_setHeadersGeneral(vc_cSeq, "INFO"); // cseq, contact, branch, via
+		SIPP.send(p_request) to vc_sent_label;
+	}
+	
+	/**
+	* 
+	* @desc  send INVITE message
+	* @param p_request template of the message to be sent
+	*/	
+	function f_SendINVITE(template INVITE_Request p_request) runs on SipComponent
+	{
+		vc_requestFor407 := valueof(p_request);
+		SIPP.send(p_request) to vc_sent_label;
+		if(PX_SIP_INVITE_AUTHENTICATION_ENABLED) {a_altstep_401or407();};	  
+	}
+
+	/**
+	* 
+	* @desc  send PRACK message
+	* @param p_request template of the message to be sent
+	*/
+	function f_SendPRACK(template PRACK_Request p_request) runs on SipComponent
+	{
+		f_setHeadersGeneral(vc_cSeq, "PRACK"); // cseq, contact, branch, via	
+		vc_rAck := valueof(m_RAck(vc_response.msgHeader.rSeq.responseNum, vc_cSeq.seqNumber, vc_cSeq.method));
+		SIPP.send(p_request) to vc_sent_label;	  
+	}
+
+	/**
+	* 
+	* @desc  send PUBLISH message
+	* @param p_request template of the message to be sent
+	*/
+	function f_SendPUBLISH(template PUBLISH_Request p_request) runs on SipComponent
+	{
+		SIPP.send(p_request) to vc_sent_label;	  
+	}
+	
+	/**
+	* 
+	* @desc  send REGISTER message
+	* @param p_request template of the message to be sent
+	*/
+	function f_SendREGISTER(template REGISTER_Request p_request) runs on SipComponent
+	{
+		SIPP.send(p_request) to vc_sent_label;	  
+	}
+		
+	/**
+	* 
+	* @desc  send SUBSCRIBE message
+	* @param p_request template of the message to be sent
+	*/
+	function f_SendSUBSCRIBE(template SUBSCRIBE_Request p_request) runs on SipComponent
+	{
+		SIPP.send(p_request) to vc_sent_label;	  
+	}
+		
+	/**
+	* 
+	* @desc  send UPDATE message
+	* @param p_request template of the message to be sent
+	*/
+	function f_SendUPDATE(template UPDATE_Request p_request) runs on SipComponent
+	{
+		f_setHeadersGeneral(vc_cSeq, "UPDATE"); // cseq, contact, branch, via	
+		vc_requestFor407 := valueof(p_request);
+		SIPP.send(p_request) to vc_sent_label;	  
+		if(PX_SIP_INVITE_AUTHENTICATION_ENABLED) {a_altstep_401or407();};	  
+	}	
+	
+	/**
+	 * 
+	 * @desc function send MESSAGE message
+	 * @param p_request template of the message to be sent
+	 */
+	function f_SendMESSAGE(template MESSAGE_Request p_request) runs on SipComponent
+	{
+		SIPP.send(p_request) to vc_sent_label;	  
+	}
+	
+	/**
+	 * 
+	 * @desc function send NOTIFY message
+	 * @param p_request template of the notify to be sent
+	 */
+	function f_SendNOTIFY(template NOTIFY_Request p_request) runs on SipComponent
+	{
+		SIPP.send(p_request) to vc_sent_label;	  
+	}
+			
+	/**
+	* 
+	* @desc  send REFER message
+	* @param p_request template of the message to be sent
+	*/	
+	function f_SendREFER(template REFER_Request p_request) runs on SipComponent
+	{
+		SIPP.send(p_request) to vc_sent_label;
+	}
+		
+	/**
+	* 
+	* @desc  send 200 OK
+	*/
+	function f_send200OK() runs on SipComponent
+	{
+		f_sendResponse(m_Response_Base(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via));
+	}
+	
+	/**
+	* 
+	* @desc  send response
+	* @param p_request template of the message to be sent
+	*/
+	function f_sendResponse(template Response p_response) runs on SipComponent
+	{
+		p_response.msgHeader.route 		 := f_route(); 		// update the route header field depending on vc_boo_route
+		p_response.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
+		SIPP.send(p_response) to vc_sent_label;
+	}
+
+} // end SendMessage
+
+group GlobalSteps {
+	/**
+	 * 
+	 * @desc component initialization
+	 * @param p_cSeq_s cSeq value to be assigned to the component variable
+	 */
+	function f_init_component(inout CSeq p_cSeq_s)  runs on SipComponent
+	{
+		//Variables
+		vc_cSeq := p_cSeq_s;
+	
+		//Defaults
+		vc_def_catchSyncStop := activate(a_Sip_catchSyncStop());
+		vc_default := activate (a_clearRegistration());
+	}
+	
+	/**
+	 * 
+	 * @desc component termination
+	 */
+	function f_terminate_component() runs on SipComponent
+	{
+		deactivate;
+		stop;
+	}
+
+	/**
+	 * 
+	 * @desc setting of user parameters with PIXIT values
+	 * @param p_user identifies the selected user configuration and location
+	 */
+	function f_init_userprofile(in integer p_user) runs on SipComponent
+	{
+		vc_userprofile.id := p_user;
+		
+		select(p_user){
+			case (c_userProfile_SIP1_home) { //variant c_userProfile_SIP1_home
+			vc_userprofile.currPort := PX_SIP_TS1_PORT;
+			vc_userprofile.currIpaddr := PX_SIP_TS1_IPADDR;
+			vc_userprofile.contactPort := PX_SIP_TS1_PORT;
+			vc_userprofile.contactIpaddr := PX_SIP_TS1_IPADDR;
+			vc_userprofile.bearerIpaddr := PX_SIP_TS1_BEARER_IPADDR;
+			vc_userprofile.homeDomain := PX_SIP_TS1_LOCAL_DOMAIN;	
+			vc_userprofile.publUsername := PX_SIP_TS1_LOCAL_USER;
+			vc_userprofile.qop := PX_SIP_SUT_UE1_QOP;
+			vc_userprofile.privUsername := PX_SIP_SUT_UE1_USERNAME;	
+			vc_userprofile.passwd := PX_SIP_SUT_UE1_PASSWD;	
+			vc_userprofile.registrarDomain := PX_SIP_SUT_REGISTRAR_DOMAIN;
+			}
+			case (c_userProfile_SIP2_home) { //variant c_userProfile_SIP2_home
+			vc_userprofile.currPort := PX_SIP_TS2_PORT;
+			vc_userprofile.currIpaddr := PX_SIP_TS2_IPADDR;
+			vc_userprofile.contactPort := PX_SIP_TS2_PORT;
+			vc_userprofile.contactIpaddr := PX_SIP_TS2_IPADDR;
+			vc_userprofile.bearerIpaddr := PX_SIP_TS2_BEARER_IPADDR;	
+			vc_userprofile.homeDomain := PX_SIP_TS2_LOCAL_DOMAIN;	
+			vc_userprofile.publUsername := PX_SIP_TS2_LOCAL_USER;
+			vc_userprofile.qop := PX_SIP_SUT_UE2_QOP;
+			vc_userprofile.privUsername := PX_SIP_SUT_UE2_USERNAME;	
+			vc_userprofile.passwd := PX_SIP_SUT_UE2_PASSWD;	
+			vc_userprofile.registrarDomain := PX_SIP_SUT_REGISTRAR_DOMAIN;
+			}
+		
+		}
+	}
+
+	/**
+	 * 
+	 * @desc function waits for particular time that allows the SUT to return to idle state
+	 */	
+ 	function f_awaitSUTidle() runs on SipComponent
+	{
+		vc_ignore4xx := true; // allow 4xx in default
+		tc_noAct.start;
+		alt {
+			[] tc_noAct.timeout{}		
+			}
+	}	
+	
+     /**
+      * 
+      * @desc function waits for particular time before next expected message
+      */	
+      function f_wait(float p_time) runs on SipComponent
+     {
+      tc_noAct.start(p_time);
+      alt {
+       [] tc_noAct.timeout{}		
+       }
+     }	
+ 
+	/**
+	 * 
+	 * @desc function cause termination of a PTC
+	 * @param p_syncPoint dummy parameter (copied from the common lib)
+	 */	
+ 	function f_check2Null(in charstring p_syncPoint) runs on SipComponent 
+	{
+			//!= pass does not work, because in case of "none" execution shall continue
+			if (getverdict == inconc or getverdict == fail){
+				log("**** f_check2Null: Verdict evaluated to fail or inconc. Stopping test execution now ");
+				f_selfOrClientSyncAndVerdict (p_syncPoint, e_error) ;
+			}//end if
+	}
+	
+/*
+ * 
+ * @desc original copied from older LibCommon_VerdictControl
+ */
+	function f_getVerdict()
+	return FncRetCode {
+		var FncRetCode v_ret := e_error;
+		if (getverdict == pass or getverdict == none) {
+			v_ret := e_success;	
+		}
+		return v_ret;
+	}
+	
+}// end group GlobalSteps
+
+group Registration {
+	
+	/**
+	 * 
+	 * @desc  registration and authentication with MD5
+	 * @param p_cSeq_s		cseq parameter 
+	 * @param p_register	register template
+	 * @param p_auth		flag indicating if authentication is needed
+	 */
+	function f_Registration(inout CSeq p_cSeq_s, template REGISTER_Request p_register, in boolean p_auth) runs on SipComponent
+	{
+	  var REGISTER_Request v_request := valueof(p_register);
+	  
+	  if (PX_SIP_REGISTRATION)
+	  {
+		f_setHeaders_REGISTER(p_cSeq_s);
+		f_SendREGISTER(v_request); //LibSip
+		
+		//awaiting of 401 and sending 2nd REGISTER and awaiting 200 OK REGISTER
+		if (p_auth)
+		{
+		  // receiving 401 Unauthorized response.
+		  // and Re-send REGISTER request with Authorization header
+		  tc_ack.start(PX_SIP_TACK);
+		  alt
+		  {
+			[] SIPP.receive	(mw_Response_Base(c_statusLine401, vc_callId, p_cSeq_s)) -> value vc_response
+			  {
+				tc_ack.stop;
+				// set headers via, cseq and authorization
+				f_setHeaders_2ndREGISTER();
+				// Re-send protected REGISTER
+				f_SendREGISTER(v_request);//LibSip
+	            
+	            // awaiting 200 OK REGISTER
+				f_awaitingOkResponse(p_cSeq_s);
+				f_getServiceRouteMapIntoRouteInRegistration(p_cSeq_s, vc_response);
+			  }
+			[] SIPP.receive	(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s))
+			  {
+				tc_ack.stop;
+				log ("Authorization was not requested as expected");
+				setverdict(inconc)
+			  }
+		  }
+		}
+		else
+		{
+		  f_awaitingOkResponse(p_cSeq_s);
+		  f_getServiceRouteMapIntoRouteInRegistration(p_cSeq_s, vc_response);
+		}      
+
+	  };
+	}//end function f_Registration
+
+
+	/**
+	 * 
+	 * @desc remove registration
+	 * @param p_cSeq_s cseq parameter
+	 */	
+	function f_RemoveRegistration(inout CSeq p_cSeq) runs on SipComponent
+	{
+	  var CommaParam_List v_challenge;
+	  var Credentials v_credentials;
+	  var REGISTER_Request v_request := valueof(m_REGISTER_Request_expires(vc_requestUri, vc_callId,
+	  p_cSeq,  vc_from, vc_to, vc_via, vc_contact, vc_authorization, "0"));
+	  
+	  if (PX_SIP_REGISTRATION)
+	  {
+		f_setHeaders_deREGISTER(p_cSeq);
+      
+		f_SendREGISTER(v_request);
+		if (PX_SIP_REGISTER_AUTHENTICATION_ENABLED)
+		{
+			// receiving 401 Unauthorized response.
+			// and Re-send REGISTER request with Authorization header
+			tc_ack.start(PX_SIP_TACK);
+			alt
+			{
+			  [] SIPP.receive	(mw_Response_Base(c_statusLine401, vc_callId, p_cSeq)) -> value vc_response
+				{
+				  tc_ack.stop;
+				  // set headers via, cseq and authorization
+				  f_setHeaders_2ndREGISTER();
+				  // Re-send protected REGISTER
+				  f_SendREGISTER(v_request);//LibSip
+				  
+				  // awaiting 200 OK REGISTER
+				  f_awaitingOkResponse(p_cSeq);
+				  f_getServiceRouteMapIntoRouteInRegistration(p_cSeq, vc_response);
+				}
+			  [] SIPP.receive	(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq))
+				{
+				  tc_ack.stop;
+				  log ("Authorization was not requested as expected");
+				  setverdict(inconc)
+				}
+			}
+		}
+		else
+		{
+		  f_awaitingOkResponse(p_cSeq);
+		}
+	  }
+	} // end f_RemoveRegistration
+
+	/**
+	 * 
+	 * @desc remove registration without authorization
+	 * @param p_cSeq_s cseq parameter
+	 */	
+	function f_RemoveRegistration_wo_authorization(inout CSeq p_cSeq) runs on SipComponent
+	{
+	  var SemicolonParam_List tmp_params;
+	  if (PX_SIP_REGISTRATION)
+	  {
+		f_setHeaders_deREGISTER(p_cSeq);
+      	f_SendREGISTER(m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg, p_cSeq,
+		  vc_from, vc_to, vc_via, vc_contact, vc_authorization, "0" ));
+   	    f_awaitingOkResponse(p_cSeq);		
+	  }
+	} // end f_RemoveRegistration_wo_authorization
+
+}//end group Registration
+
+	group Subscription {
+	
+		/**
+		 * 
+		 * @desc  UE send subscrbe, await on 200 OK, await notify and send 200 OK
+		 * @param p_cSeq_s		cseq parameter 
+		 * @param p_register	subscribe template
+		 */
+		function f_Subscription(inout CSeq p_cSeq_s, template SUBSCRIBE_Request p_subscribe) runs on SipComponent
+		{
+		  f_setHeaders_SUBSCRIBE(p_cSeq_s);
+		  //send SUBSCRIBE
+		  f_SendSUBSCRIBE(p_subscribe);
+		  // awaiting 200 OK SUBSCRIBE
+		  f_awaitingOkResponse(p_cSeq_s);
+		  
+		  //await NOTIFY and send reply 200 OK
+		  f_awaitingNOTIFY_sendReply(mw_NOTIFY_Request_Base(vc_callId));
+	  
+		}//end function f_Subscription
+
+		/**
+		 * 
+		 * @desc  UE send subscrbe, await on 200 OK, await notify and send 200 OK
+		 * @param p_cSeq_s		cseq parameter 
+		 * @param p_register	subscribe template
+		 */
+		function f_SubscriptionWithNotification(inout CSeq p_cSeq_s, template SUBSCRIBE_Request p_subscribe, template NOTIFY_Request p_notify) runs on SipComponent
+		{
+		  f_setHeaders_SUBSCRIBE(p_cSeq_s);
+		  //send SUBSCRIBE
+		  f_SendSUBSCRIBE(p_subscribe);
+		  // awaiting 200 OK SUBSCRIBE
+		  f_awaitingOkResponse(p_cSeq_s);
+		  
+		  //await NOTIFY and send reply 200 OK
+		  f_awaitingNOTIFY_sendReply(p_notify);
+	  
+		}//end function f_Subscription
+
+	}//end group Subscription
+
+group Preambles {
+	
+	/**
+	 * 
+	 * @desc  Set variables and default initialization for user profile
+	 * @param p_userprofile	user profile of call
+	 * @param p_cSeq_s 		cseq parameter
+	 */
+	function f_SIP_preamble_woREG(in integer p_userprofile, inout CSeq p_cSeq_s)  runs on SipComponent
+	{
+		//varables and altsteps
+		f_init_component(p_cSeq_s);
+
+		//Preamble
+		f_init_userprofile(p_userprofile); // assignment of PIXIT values to component variable
+		vc_sdp_local := valueof(m_SDP_bandwidth(valueof(m_media_dynPT(PX_SIP_SDP_dyn, PX_SIP_SDP_encoding)), vc_userprofile));
+	}
+	
+	/**
+	 * 
+	 * @desc  Set variables and default initialization for user profile and handle registration and authentication with MD5 
+	 * @param p_userprofile   	user profile of call
+	 * @param p_cSeq_s		  	cseq parameter
+	 * @param p_register		register template
+	 */
+	function f_SIP_preamble_withREG(in integer p_userprofile, inout CSeq p_cSeq_s, template REGISTER_Request p_register)  runs on SipComponent
+	{
+		//preamble
+		f_SIP_preamble_woREG(p_userprofile, p_cSeq_s);
+		
+		//Registration, Awaiting
+		f_Registration(p_cSeq_s, p_register, PX_SIP_REGISTER_AUTHENTICATION_ENABLED);
+	}	
+	
+}// end group Preambles
+
+group Postambles {
+
+	/**
+	 * 
+	 * @desc function send BYE and awaits reponse
+	 * @param p_CallId parameter for outgoing BYE
+	 * @param p_cSeq parameter for outgoing BYE
+	 * @param p_from parameter for outgoing BYE
+	 * @param p_to parameter for outgoing BYE
+	 * @param p_reqHostPort parameter for outgoing BYE
+	 */
+	function f_terminateCall(SipUrl p_requestUri, CallId p_CallId, inout CSeq p_cSeq, From p_from,
+	  template To p_to) runs on SipComponent
+	{
+	  // Sending of a BYE request to release the call and expect a final response
+	  f_SendBYE(m_BYE_Request_cause(p_requestUri, p_CallId, p_cSeq, p_from, valueof(p_to), vc_via, PX_SIP_BYE_CAUSE));
+      
+	  tc_resp.start(PX_SIP_TRESP);
+	  alt
+	  {
+		[] SIPP.receive	(mw_Response_Base(mw_statusLine1xx, p_CallId, p_cSeq))
+		  {
+			repeat;
+		  }
+		[] SIPP.receive	(mw_Response_Base(mw_statusLineFinal, p_CallId, p_cSeq))
+		  {
+			tc_resp.stop;
+		  }
+		[] tc_resp.timeout
+		  {
+			stop
+		  }
+	  }
+	} // end function f_terminateCall
+
+	function f_cancelCall(template CANCEL_Request p_request)
+	runs on SipComponent
+	{
+	  // This function is called to bring back the IUT in idle condition
+	  // in case of errors or unexpected behaviour.
+      
+	  // Sending of a CANCEL request with the same Cseq
+	  f_SendCANCEL(p_request);
+	  tc_resp.start(PX_SIP_TRESP);
+	  alt
+	  {
+		[] SIPP.receive	(mw_Response_Base(c_statusLine200, vc_callId, vc_cSeq))
+		  {
+			tc_resp.stop;
+		  }
+	  }
+	}
+
+} // end group Postambles
+
+group SipChecks
+{
+
+
+	/* 
+	*  @desc check the presence of conversation at SIP side
+	*		 
+	*/
+	function f_check_Conversation() runs on SipComponent
+	{
+	var boolean v_result;
+	var charstring v_question := "confirm if conversation at SIP port";
+		
+	if (PX_SIP_CheckConversation) {				
+		opPort.call(s_SIP_conversation:{v_question, -})
+		{[] opPort.getreply(s_SIP_conversation:{-, true}) {}
+		 [] opPort.getreply(s_SIP_conversation:{-, false}) 
+			{all timer.stop;
+			 setverdict(fail);
+			 syncPort.send(m_syncClientStop);
+			 stop;}
+		}
+	}
+
+	f_selfOrClientSyncAndVerdict(c_uPlane, f_getVerdict()); // Note: implemented in test bodies
+		
+	return			
+	} // end of f_check_Conversation
+
+	/* 
+	*  @desc check the presence of conversation at SIP side
+	*		 
+	*/
+	function f_check_Ringing() runs on SipComponent
+	{
+	var boolean v_result;
+	var charstring v_question := "confirm if ringing at SIP port";
+		
+	if (PX_SIP_CheckRinging) {				
+		opPort.call(s_SIP_ringing:{v_question, -})
+		{[] opPort.getreply(s_SIP_ringing:{-, true}) {}
+		 [] opPort.getreply(s_SIP_ringing:{-, false}) 
+			{all timer.stop;
+			 setverdict(fail);
+			 syncPort.send(m_syncClientStop);
+			 stop;}
+		}
+	}
+
+	f_selfOrClientSyncAndVerdict(c_Ringing, f_getVerdict());
+	return			
+	} // end of f_check_Ringing
+
+	/* 
+	*  @desc check the announcement at SIP side (UE A)
+	*		 
+	*/
+	function f_check_AnnouncementUE_A() runs on SipComponent
+	{
+	var boolean v_result;
+	var charstring v_question := "confirm if announcement at UE A";
+		
+	if (PX_SIP_CheckConversation) {				
+		opPort.call(s_SIP_announcementA:{v_question, -})
+		{[] opPort.getreply(s_SIP_announcementA:{-, true}) {}
+		 [] opPort.getreply(s_SIP_announcementA:{-, false}) 
+			{all timer.stop;
+			 setverdict(fail);
+			 syncPort.send(m_syncClientStop);
+			 stop;}
+		}
+	}
+
+	f_selfOrClientSyncAndVerdict(c_annoucA, f_getVerdict());
+	return			
+	} // end of f_check_AnnouncementUE_A
+
+	/* 
+	*  @desc check the announcement at SIP side (UE B)
+	*		 
+	*/
+	function f_check_AnnouncementUE_B() runs on SipComponent
+	{
+	var boolean v_result;
+	var charstring v_question := "confirm if announcement at UE B";
+		
+	if (PX_SIP_CheckConversation) {				
+		opPort.call(s_SIP_announcementB:{v_question, -})
+		{[] opPort.getreply(s_SIP_announcementB:{-, true}) {}
+			[] opPort.getreply(s_SIP_announcementB:{-, false}) 
+			{all timer.stop;
+				setverdict(fail);
+				syncPort.send(m_syncClientStop);
+				stop;}
+		}
+	}
+
+	f_selfOrClientSyncAndVerdict(c_annoucB, f_getVerdict());
+	return			
+	} // end of f_check_AnnouncementUE_B
+
+	/* 
+	*  @desc check the announcement at SIP side
+	*		 
+	*/
+	function f_check_Announcement() runs on SipComponent
+	{
+	var boolean v_result;
+	var charstring v_question := "confirm if announcement at SIP side";
+		
+	if (PX_SIP_CheckConversation) {				
+		opPort.call(s_SIP_announcement:{v_question, -})
+		{[] opPort.getreply(s_SIP_announcement:{-, true}) {}
+		 [] opPort.getreply(s_SIP_announcement:{-, false}) 
+			{all timer.stop;
+			 setverdict(fail);
+			 syncPort.send(m_syncClientStop);
+			 stop;}
+		}
+	}
+
+	f_selfOrClientSyncAndVerdict(c_annouc, f_getVerdict());
+	return			
+	} // end of f_check_Announcement
+
+	/* 
+	*  @desc check the Voice message at SIP side
+	*		 
+	*/
+	function f_check_VoiceMessage() runs on SipComponent
+	{
+	var boolean v_result;
+	var charstring v_question := "confirm if voice message at SIP side";
+		
+	if (PX_SIP_CheckConversation) {				
+		opPort.call(s_SIP_voiceMessage:{v_question, -})
+		{[] opPort.getreply(s_SIP_voiceMessage:{-, true}) {}
+		 [] opPort.getreply(s_SIP_voiceMessage:{-, false}) 
+			{all timer.stop;
+			 setverdict(fail);
+			 syncPort.send(m_syncClientStop);
+			 stop;}
+		}
+	}
+
+	f_selfOrClientSyncAndVerdict(c_voicem, f_getVerdict());
+	return			
+	} // end of f_check_Announcement
+	
+	/* 
+	*  @desc check the stop of media stream
+	*		 
+	*/
+	function f_check_MediaStopped() runs on SipComponent
+	{
+	var boolean v_result;
+	var charstring v_question := "confirm if media stream stopped";
+		
+	if (PX_SIP_CheckConversation) {				
+		opPort.call(s_SIP_mediastopped:{v_question, -})
+		{[] opPort.getreply(s_SIP_mediastopped:{-, true}) {}
+		 [] opPort.getreply(s_SIP_mediastopped:{-, false}) 
+			{all timer.stop;
+			 setverdict(fail);
+			 syncPort.send(m_syncClientStop);
+			 stop;}
+		}
+	}
+
+	f_selfOrClientSyncAndVerdict(c_uPlaneStop, f_getVerdict());
+	return			
+	} // end of f_check_MediaStopped
+
+}
+
+group DefaultsTestStep
+{
+    	
+    	
+	/**
+	* @desc	This default handles receiving of the sync server
+	*		STOP message and calls the RT HUT postamble. (copy from common lib)
+	*/	
+	altstep a_Sip_catchSyncStop() runs on SipComponent 
+	{
+		[]	syncPort.receive(m_syncServerStop)
+		{
+			tc_sync.stop ;
+			log("**** a_Sip_catchSyncStop: Test component received STOP signal from MTC - going to IDLE state **** ");
+			//TODO complete postamble
+			f_terminate_component();
+			log("**** a_Sip_catchSyncStop: TEST COMPONENT NOW STOPPING ITSELF! **** ") ;
+			setverdict(inconc);
+			stop ;
+		}
+	}
+	
+
+	/**
+	 * 
+	 * @desc main default altstep to handle unexpected messages and timeout
+	 * @verdict fail for all unexpected branches
+	 */	
+ 	altstep a_clearRegistration() runs on SipComponent
+	{
+		var Response v_response;
+		var Request v_request;
+		  
+		[] any timer.timeout 
+		{
+			setverdict(fail); 
+			all timer.stop; 
+			//TODO check how to solve release of call 
+			//f_SendCANCEL(m_CANCEL_Request(vc_callId, vc_cSeq, vc_from, vc_cancel_To, vc_reqHostPort, vc_via )); // difference between registration state or transaction state
+			f_RemoveRegistration(vc_cSeq); 
+			f_check2Null("");	
+		}
+
+	  	// allow repeated INVITEs
+		[vc_ignore_invite] SIPP.receive(mw_INVITE_Request_Base)
+		{
+		  repeat
+		}
+
+	  	// allow repeated BYEs after ack of the first BYE
+		[vc_ignore_bye] SIPP.receive (mw_BYE_Request_Base(?))
+		{
+		  repeat
+		}
+
+	  	// allow 100 replies
+		[] SIPP.receive(mw_Response_Base(c_statusLine100,vc_callId, vc_cSeq))
+		  {
+			repeat
+		  }
+			  
+		//	ignore 181 if flag is set (following TS 183004 Â§4.5.2.1)		  
+		[vc_ignore181] SIPP.receive(mw_Response_Base(c_statusLine181,vc_callId, vc_cSeq))-> value v_response sender vc_sent_label
+		  { 
+			f_setHeadersOnReceiptOfResponse(v_response.msgHeader.cSeq, v_response); 
+			repeat;
+		  } 
+	  
+		// according to SIP chap.8.1.3.2
+		[] SIPP.receive(mw_Response_Base(c_statusLine183,vc_callId, vc_cSeq))
+		  { 
+			repeat;
+		  } 
+
+	  	// ignore 484 if flag is set
+		[vc_ignore484] SIPP.receive(mw_Response_Base(c_statusLine484,vc_callId, vc_cSeq))
+			{
+			  repeat
+			}
+		
+		[vc_ignore4xx] SIPP.receive(mw_Response_Base(mw_statusLine4xx,vc_callId, ?))-> value v_response sender vc_sent_label
+		  { 
+			f_setHeadersOnReceiptOfResponse(v_response.msgHeader.cSeq, v_response); 
+			f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route));
+			repeat
+		  }			
+		
+		[vc_ignore200OKinv] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, ?))
+		  { 
+			repeat
+		  }
+	
+		[] SIPP.receive(mw_INFO_Request_Base(vc_callId))->value v_request sender vc_sent_label
+		  { 
+			f_setHeadersOnReceiptOfRequest(v_request); 
+			f_send200OK();
+			repeat
+		  }
+		  
+		//awaiting of subscribe on proxy
+		[] SIPP.receive(mw_SUBSCRIBE_Request_Base)->value v_request sender vc_sent_label
+		  { 
+			f_setHeadersOnReceiptOfRequest(v_request); 
+			f_send200OK();
+			f_setHeadersGeneral(vc_cSeq, "NOTIFY"); // cseq, contact, branch, via
+			f_SendNOTIFY(m_NOTIFY_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
+			f_awaitingOkResponse(vc_cSeq);
+			repeat
+		  }
+
+		// unexpected BYE is acknowledged to avoid retransmissions
+		[] SIPP.receive(mw_BYE_Request_Base(?))-> value v_request sender vc_sent_label
+		  {
+			setverdict(fail);
+			f_setHeadersOnReceiptOfRequest(v_request); 
+			f_send200OK();
+			f_RemoveRegistration(vc_cSeq); 
+			f_check2Null("");	
+			}			  
+			  
+		// unexpected CANCEL is acknowledged to avoid retransmissions
+		[] SIPP.receive(mw_CANCEL_Request_Base(?))-> value v_request sender vc_sent_label
+		  {
+			setverdict(fail);
+			f_setHeadersOnReceiptOfRequest(v_request);
+			//Answer to the CANCEL
+			f_send200OK();
+			f_RemoveRegistration(vc_cSeq); 
+			f_check2Null("");	
+			}			  
+	  [] SIPP.receive
+		{
+			setverdict(fail); 
+			all timer.stop; 
+			f_SendCANCEL(m_CANCEL_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_cancel_To, vc_via )); // difference between registration state or transaction state
+			f_RemoveRegistration(vc_cSeq); 
+			f_check2Null("");	
+		}
+	}
+	
+	/**
+	 * 
+	 * @desc altstep handle authentication for INVITE message
+	 */	
+	altstep a_altstep_401or407() runs on SipComponent {
+		[] any port.check (receive) {
+			var CommaParam_List v_challenge;
+			var Credentials v_Credentials;
+			var Response v_Response;
+			var Request v_Request := valueof (vc_requestFor407);
+					
+			tc_ack.start (PX_SIP_TACK);
+			alt {
+				[] SIPP.receive (mw_Response_Base((c_statusLine401,c_statusLine407),
+											  vc_callId,
+											  vc_cSeq)) -> value v_Response {
+					tc_ack.stop;
+					//	get tag from To header if available							
+					vc_to := v_Response.msgHeader.toField;
+					if (vc_cSeq.method == "INVITE"){
+						// send ACK
+	   					f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
+					}							
+					// resent the INVITE message with Proxyauthorization header include
+					// Extract challenge and calculate credentials for a response.
+					if (ischosen (v_Response
+						.msgHeader
+						.proxyAuthenticate
+						.challenge
+						.otherChallenge // instead of digestCln (changed by axr to comply to alcatel)
+						)) {
+						v_challenge :=
+							v_Response
+								.msgHeader
+								.proxyAuthenticate
+								.challenge
+								.otherChallenge.authParams; 
+						v_Credentials :=
+							f_calculatecCredentials(vc_userprofile,
+								vc_requestFor407.msgHeader.cSeq.method,
+								v_challenge);
+					} else {
+						log ("No scheme in Proxy Authenticate header!!");
+						setverdict (inconc);
+						stop;
+					}
+
+					vc_branch := c_branchCookie & f_getRndTag();
+					vc_via := {
+						fieldName := VIA_E,
+						viaBody := {
+							valueof (m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+					};
+
+					v_Request.msgHeader.via := vc_via;
+					// Increment CSeq sequence number of and add the credentials
+					// to the original saved INVITE message.
+					vc_cSeq.method := vc_requestFor407.msgHeader.cSeq.method;
+					vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
+					v_Request.msgHeader.cSeq.seqNumber :=
+						vc_cSeq.seqNumber;
+					v_Request.msgHeader.proxyAuthorization.fieldName :=
+						PROXY_AUTHORIZATION_E;
+					v_Request.msgHeader.proxyAuthorization.credentials :=
+						{v_Credentials};
+							
+					// Re-send the saved INVITE with Authorization header
+					// included.
+					SIPP.send (v_Request) to vc_sent_label;
+				}
+			}
+		}
+	}
+    	
+    	
+} // end of group DefaultsTestStep
+} // end module LibSip_Steps
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_Templates.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_Templates.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_Templates.ttcn	(revision 22)
@@ -0,0 +1,3295 @@
+/*
+ *  @author   STF 346, STF366, STF368, STF369
+ *  @version  $Id: LibSip_Templates.ttcn 380 2009-07-23 14:59:16Z rennoch $
+ *	@desc     This module defines SIP Templates for message, header, and 
+ *            structured types. <br>
+ *            Note that any changes made to the definitions in this module
+ *            may be overwritten by future releases of this library
+ *            End users are encouraged to contact the distributers of this  
+ *            module regarding their modifications or additions
+ *  @remark   Any additions to the templates shall follow the design rules
+ *            and always modify base templates only;
+ *            Existing templates shall not be changed or removed -
+ *            change requests shall be made to http://t-ort.etsi.org
+ */
+
+module LibSip_Templates
+{
+	//LibSip
+	import from LibSip_SIPTypesAndValues all;
+	import from LibSip_SDPTypes all;
+	import from LibSip_Interface all;
+	import from LibSip_PIXITS all;
+	import from LibSip_XMLTypes all;
+	
+	group ModuleParameters {
+	
+	    modulepar boolean MB_LENGTH_FROM_ENCVAL:=true; //* to get length of message body from ecoded value
+	    modulepar boolean USE_FX_FOR_XML_LENGTH:=true; //* To use external functions for calculation of XML message/body length
+	    
+	}//* group ModuleParameters
+	
+	group SubFields
+	{
+
+		template Addr_Union m_AddrUnion_NameAddr(template NameAddr p_nameAddr) :=
+		{
+		  nameAddr := p_nameAddr
+		}
+
+		template Addr_Union m_AddrUnion_DisplayAndSipUrl(template charstring p_displayName, template SipUrl p_addrSpec) :=
+		{
+		  nameAddr := m_CallingAddr(p_displayName, p_addrSpec)
+		}
+		
+		template NameAddr m_CallingAddr(template charstring p_displayName, template SipUrl p_addrSpec) :=
+		{
+		  displayName := p_displayName,
+		  addrSpec := p_addrSpec
+		}		
+
+		template CommaParam_List mw_digestResponse(in GenericParam p_genericParam) :=
+		{
+		  *,p_genericParam,* //* c_Integrity_protected_yes
+		}	
+
+		template SemicolonParam_List m_cpc :=
+		{{"cpc",PX_SIP_ISUP_CPC_VALUE}};
+
+		template SemicolonParam_List m_ReasonParams
+			(template charstring p_cause, template charstring p_text) :=
+		{m_Cause(p_cause),m_Text(p_text)};
+				
+		template ReasonValue m_ReasonValue
+			(template charstring p_cause, template charstring p_text) :=
+		{		  
+			token := "Q.850",
+			reasonParams := m_ReasonParams(p_cause,p_text)
+		};
+
+		template RouteBody mw_routeBody (template SipUrl p_sipurl):=
+		{
+			nameAddr :=
+			{
+				displayName := *,
+				addrSpec := p_sipurl
+			},
+			rrParam := *
+		}
+
+		template SentProtocol m_SentProtocol (charstring p_protocol) :=
+		{protocolName := c_sipName,
+		  protocolVersion:= c_sipVersion,
+		  transport:= p_protocol};
+
+		template SipUrl m_SipUrl_currDomain(in SipUserProfile p_userprofile) :=  	//*  SIP-URL of the test system on SIP side
+		{
+		  scheme := c_sipScheme,  		//*  contains "sip"
+		  userInfo := 			//*  optional
+		  {
+			userOrTelephoneSubscriber := p_userprofile.publUsername,//*  charstring
+			password := omit		//*  optional charstring
+		  },
+		  hostPort :=
+		  {
+			host := p_userprofile.homeDomain,	//*  hostname, IPv4 or IPv6 as a charstring
+			portField := omit	//* p_userprofile.currPort	//* optional integer
+		  },
+		  urlParameters := omit,
+		  headers := omit
+		}
+
+		template SipUrl m_SipUrl_contactIpaddr(in SipUserProfile p_userprofile) :=  	//*  SIP-URL of the test system on SIP side
+		{
+		  scheme := c_sipScheme,  		//*  contains "sip"
+		  userInfo := 			//*  optional
+		  {
+			userOrTelephoneSubscriber := p_userprofile.publUsername,//*  charstring
+			password := omit		//*  optional charstring
+		  },
+		  hostPort :=
+		  {
+			host := p_userprofile.contactIpaddr,	//*  hostname, IPv4 or IPv6 as a charstring
+			portField := p_userprofile.contactPort	//* optional integer
+		  },
+		  urlParameters := omit,
+		  headers := omit
+		}
+
+		template SipUrl m_SipUrl_contactIpaddrAndCpc(in SipUserProfile p_userprofile) :=  	//*  SIP-URL of the test system on SIP side
+		{
+				scheme := c_sipScheme,  		//*  contains "sip"
+				userInfo := 			//*  optional
+				{
+			userOrTelephoneSubscriber := p_userprofile.publUsername & "; cpc=" & PX_SIP_ISUP_CPC_VALUE,//*  charstring
+			password := omit		//*  optional charstring
+				},
+				hostPort :=
+				{
+			host := p_userprofile.contactIpaddr,	//*  hostname, IPv4 or IPv6 as a charstring
+			portField := p_userprofile.contactPort	//* optional integer
+				},
+				urlParameters := omit,
+				headers := omit
+		}
+
+		template SipUrl m_SipUrl_currIpaddr(in SipUserProfile p_userprofile) :=  	//*  SIP-URL of the test system on SIP side
+		{
+		  scheme := c_sipScheme,  		//*  contains "sip"
+		  userInfo := 			//*  optional
+		  {
+			userOrTelephoneSubscriber := p_userprofile.publUsername,//*  charstring
+			password := omit		//*  optional charstring
+		  },
+		  hostPort :=
+		  {
+			host := p_userprofile.currIpaddr,	//*  hostname, IPv4 or IPv6 as a charstring
+			portField := p_userprofile.currPort	//* optional integer
+		  },
+		  urlParameters := omit,
+		  headers := omit
+		} 
+   
+		template SipUrl m_SipUrl_Anonymous :=  	//*  SIP-URL with a calles party number
+		{
+		  scheme := c_sipScheme,  		//*  contains "sip"
+		  userInfo := 			//*  optional
+		  {
+			userOrTelephoneSubscriber := "Anonymous",//*  charstring
+			password := omit		//*  optional charstring
+		  },
+		  hostPort :=
+		  {
+			host := "Anonymous.invalid",	//*  hostname, IPv4 or IPv6 as a charstring
+			portField := omit	//* optional integer
+		  },
+		  urlParameters := omit,
+		  headers := omit
+		};
+		
+		template SipUrl m_TelUrl_publUser(in SipUserProfile p_userprofile) :=  	//*  SIP-URL of the test system on SIP side
+		{
+		  scheme := c_telScheme,  		//*  contains "tel"
+		  userInfo := 			//*  optional
+		  {
+			userOrTelephoneSubscriber := p_userprofile.publUsername,//*  charstring
+			password := omit		//*  optional charstring
+		  },
+		  hostPort :=
+		  {
+			host := omit,	//*  hostname, IPv4 or IPv6 as a charstring
+			portField := omit	//* p_userprofile.currPort	//* optional integer
+		  },
+		  urlParameters := omit,
+		  headers := omit
+		}
+
+	
+		template SipUrl mw_TelSip_unavailableInvalidUri :=
+		{
+				scheme  := (c_telScheme,c_sipScheme),
+				userInfo := {userOrTelephoneSubscriber:="unavailable", password:=omit},
+				hostPort := {host:="anonymous.invalid", portField:=c_defaultSipPort},
+				urlParameters := omit,
+				headers := omit
+		};		
+
+	
+		template SipUrl mw_TelSip_unavailableUri (charstring p_host):=
+		{
+				scheme  := (c_telScheme,c_sipScheme),
+				userInfo := {userOrTelephoneSubscriber:="unavailable", password:=omit},
+				hostPort := {host:=p_host, portField:=c_defaultSipPort},
+				urlParameters := omit,
+				headers := omit
+		};		
+
+		template SipUrl mw_SipUrl_Number(charstring p_number) :=  	//*  SIP-URL with a calling party number
+		{
+		  scheme := c_sipScheme,  		//*  contains "sip"
+		  userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*},
+		  hostPort := ?,
+		  urlParameters := *,
+		  headers := *
+		};
+
+		template SipUrl mw_TelSipUrl_Number(template charstring p_number) :=  	//*  SIP-URL with a calling party number
+		{
+				scheme := (c_telScheme,c_sipScheme), //*  contains "sip" or "tel"
+				userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*}, //*  nat or int format
+				hostPort := ?,
+				urlParameters := *,
+				headers := *
+		};
+		
+		template SipUrl mw_SipUrl_Host(charstring p_host) :=  	//*  SIP-URL with a calling party number
+		{
+				scheme := c_sipScheme,  		//*  contains "sip"
+				userInfo:= {userOrTelephoneSubscriber:=?, password:=*},
+				hostPort := {host:=p_host, portField:=*},
+				urlParameters := *,
+				headers := *
+		};
+
+		
+          template SipUrl mw_SipUrl_NumberHost(charstring p_number, charstring p_host) :=  	//*  SIP-URL with a calling party number
+          {
+            scheme := c_sipScheme,  		//*  contains "sip"
+            userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*},
+            hostPort := {host:=p_host, portField:=*},
+            urlParameters := *,
+            headers := *
+          };
+          
+		template SipUrl mw_SipUrl_NumberHostParam(charstring p_number, charstring p_host, template SemicolonParam_List p_urlParameters) :=  	//*  SIP-URL with a calling party number
+		{
+				scheme := c_sipScheme,  		//*  contains "sip"
+				userInfo:= {userOrTelephoneSubscriber:=p_number, password:=*},
+				hostPort := {host:=p_host, portField:=*},
+				urlParameters := p_urlParameters,
+				headers := *
+		};
+		
+		template SipUrl m_SipUrl_NumberHostParam(charstring p_number, charstring p_host, template SemicolonParam_List p_urlParameters) :=  	//*  SIP-URL with a calling party number
+		{
+				scheme := c_sipScheme,  		//*  contains "sip"
+				userInfo:= {userOrTelephoneSubscriber:=p_number, password:=omit},
+				hostPort := {host:=p_host, portField:=c_defaultSipPort},
+				urlParameters := p_urlParameters,
+				headers := omit
+		};
+		
+		template SipUrl mw_SipUrl_Anonymous :=  	//*  SIP-URL with a calles party number
+		{
+		  scheme := c_sipScheme,  		//*  contains "sip"
+		  userInfo := 			//*  optional
+		  {
+			userOrTelephoneSubscriber := "Anonymous",//*  charstring
+			password := omit		//*  optional charstring
+		  },
+		  hostPort :=
+		  {
+			host := "anonymous.invalid",	//*  hostname, IPv4 or IPv6 as a charstring
+			portField := *	//* optional integer
+		  },
+		  urlParameters := *,
+		  headers := *
+		};
+
+		template SipUrl mw_SipUrl_urlParam(template SemicolonParam_List p_urlParameters) :=  	//*  SIP-URL with a calling party number
+		{
+				scheme := c_sipScheme,  		//*  contains "sip"
+				userInfo:= *,
+				hostPort := *,
+				urlParameters := p_urlParameters,
+				headers := *
+		};
+		
+		template ContactAddress mw_ContactAddress :=
+		{
+		  addressField  := ?,
+		  contactParams := *
+		};
+
+		template HostPort mw_hostPort(template charstring p_host, template integer p_portField) :=
+		{
+		  host  := p_host,
+		  portField := p_portField
+		};
+		
+		template StatusLine mw_statusLine1xx   := {sipVersion := c_sipNameVersion, statusCode := (100..199), reasonPhrase := ?};
+		template StatusLine mw_statusLine4xx   := {sipVersion := c_sipNameVersion, statusCode := (400..499), reasonPhrase := ?};
+		template StatusLine mw_statusLineFinal := {sipVersion := c_sipNameVersion, statusCode := (200..699), reasonPhrase := ?};
+
+		template NameAddr mw_NameAddr_DispName_User_Host(template charstring p_dn, template charstring p_user, template charstring p_host) := 
+		{
+			displayName := p_dn,
+			addrSpec :=
+			{
+				scheme := c_sipScheme,  //*  contains "sip"
+				userInfo := {userOrTelephoneSubscriber :=p_user,	password := *},
+				hostPort :=
+				{
+					host := p_host,		//*  hostname, IPv4 or IPv6 as a charstring
+					portField := *	//* optional integer
+				},
+			urlParameters := {m_UserPhone},
+			headers := *
+			}
+		}
+		
+		template Addr_Union mw_AddrUnion_Nameaddr(template charstring p_dn, template charstring p_user, template charstring p_host):=
+		{
+			nameAddr:=mw_NameAddr_DispName_User_Host(p_dn,p_user,p_host)
+		}
+		
+		template SipUrl mw_SipUrl_User_Host(template charstring p_user, template charstring p_host) :=
+		{
+			scheme := c_sipScheme,  //*  contains "sip"
+			userInfo := {userOrTelephoneSubscriber :=p_user,	password := *},
+			hostPort :=
+			{
+				host := p_host,		//*  hostname, IPv4 or IPv6 as a charstring
+				portField := *	//* optional integer
+			},
+			urlParameters := {m_UserPhone},
+			headers := *
+		}
+		template Addr_Union mw_AddrUnion_SipUrl(template charstring p_user, template charstring p_host):=
+		{
+			addrSpecUnion:=mw_SipUrl_User_Host(p_user,p_host)
+		}
+		
+
+	} //* end group Subfields
+
+
+
+
+
+	group HeaderFieldTemplates {
+		template Allow m_Allow (template Method_List p_methods) := {
+			fieldName := ALLOW_E,
+			methods := p_methods
+		}
+		
+		template Allow mw_Allow (charstring p_method) := {
+			fieldName := ALLOW_E,
+			methods := superset(p_method)
+		}
+
+		template GenericParam m_Cause (template charstring p_cause):=
+			{id:="cause", paramValue:=p_cause}
+
+		template Authorization m_Authorization (template Credentials p_Credentials):=
+		{
+		  fieldName := AUTHORIZATION_E,
+		  body := {p_Credentials}
+		}
+		
+		template Authorization m_Authorization_digest (template CommaParam_List p_CommaParam_List):=
+		{
+		  fieldName := AUTHORIZATION_E,
+		  body := {{digestResponse := p_CommaParam_List}}
+		}
+
+		template Authorization m_add_Authorization_digest (in Authorization p_auth, template CommaParam_List p_CommaParam_List):=
+		{
+		  fieldName := AUTHORIZATION_E,
+		  body := {{digestResponse := f_merge_CommaParam_List(p_auth.body[0].digestResponse,valueof(p_CommaParam_List))}}
+		}
+
+		template Authorization m_Authorization_other :=
+		{
+		  fieldName := AUTHORIZATION_E,
+		  body := {{otherResponse := ?}}
+		}
+
+		template Contact m_Contact(template SipUrl p_sipUrl) :=
+		{
+		  fieldName := CONTACT_E,
+		  contactBody :=
+		  {
+			contactAddresses :=
+			{
+			  {
+				addressField := { addrSpecUnion := p_sipUrl},
+				contactParams := omit
+			  }
+			}
+		  } //* end contactBody
+		}//* end m_Contact
+
+		template Contact m_Contact_profile(in SipUserProfile p_userprofile) :=
+		{
+		  fieldName := CONTACT_E,
+		  contactBody :=
+		  {
+			contactAddresses :=
+			{
+			  {
+				addressField := { addrSpecUnion := m_SipUrl_contactIpaddr(p_userprofile)},
+				contactParams := omit
+			  }
+			}
+		  } //* end contactBody
+		}//* end m_Contact
+
+
+		template Contact m_Contact_profile_expires(in SipUserProfile p_userprofile, in charstring p_expires) :=
+		{
+		  fieldName := CONTACT_E,
+		  contactBody :=
+		  {
+			contactAddresses :=
+			{
+			  {
+				addressField := { addrSpecUnion := m_SipUrl_contactIpaddr(p_userprofile)},
+				contactParams := {{"expires",p_expires}}
+			  }
+			}
+		  } //* end contactBody
+		}//* end m_Contact
+		
+		template From m_From(template NameAddr p_nameAddr, charstring p_tag_str) :=
+		{
+		  fieldName := FROM_E,
+		  addressField :=
+		  {nameAddr := p_nameAddr},//* end addressField
+		  fromParams := {{id := c_tagId, paramValue := p_tag_str}}
+		};
+		
+		template From m_From_Anonymous(charstring p_tag_str) :=
+		{
+				fieldName := FROM_E,
+				addressField :=
+				{nameAddr := {
+						displayName := "Anonymous",	 	 	//*  optional charstring
+						addrSpec := m_SipUrl_Anonymous		//*  SipUrl
+				}},//* end addressField
+				fromParams := {{id := c_tagId, paramValue := p_tag_str}}
+		};
+		
+		template From m_From_SipUrl(template SipUrl p_sipUrl) :=
+		{
+				fieldName := FROM_E,
+				addressField :=
+				{nameAddr := {
+						displayName := omit, 	 			//*  optional charstring
+						addrSpec := p_sipUrl		//*  SipUrl
+				}},//* end addressField
+				fromParams := omit
+		};
+		
+		template Event m_Event_refer := 
+		{
+			fieldName := EVENT_E,
+			eventType := "refer",
+			eventParams := omit
+		};
+
+		template Event m_Event_conference := 
+		{
+			fieldName := EVENT_E,
+			eventType := "conference",
+			eventParams := omit
+		};
+
+		template Event m_Event_presence := 
+		{
+			fieldName := EVENT_E,
+			eventType := "presence",
+			eventParams := omit
+		};
+
+		template Event m_Event_reg := 
+		{
+			fieldName := EVENT_E,
+			eventType := "reg",
+			eventParams := omit
+		};
+
+		template Expires m_Expires_600000 := 
+		{
+			fieldName := EXPIRES_E,
+			deltaSec := "600000"
+		};
+
+		template Expires m_Expires (charstring p_deltaSec):= 
+		{
+			fieldName := EXPIRES_E,
+			deltaSec := p_deltaSec
+		};
+
+
+		template PAssertedID m_PAssertedID(template Addr_Union p_pAssertedIDValue) := 
+		{
+			fieldName := P_ASSERTED_ID_E,
+			pAssertedIDValueList := {p_pAssertedIDValue}
+		};
+
+		template HistoryInfo mw_HistoryInfo(template HistoryInfo_List p_HistoryInfo_List) := 
+		{
+			fieldName := HISTORY_INFO_E,
+			historyInfoList := p_HistoryInfo_List
+		};
+
+		template HistoryInfoEntry mw_HistoryInfoEntry(template SipUrl p_Url, template IntegerList p_index, template SemicolonParam_List p_paramlist) :=
+		{
+			nameAddr := {displayName:=*, addrSpec:= p_Url},
+			hiIndex := p_index,
+			hiExtention := p_paramlist
+		}
+		
+      	template HistoryInfo m_HistoryInfo(template HistoryInfo_List p_HistoryInfo_List) := 
+      	{
+       		fieldName := HISTORY_INFO_E,
+       		historyInfoList := p_HistoryInfo_List
+      	};
+    
+     	template HistoryInfoEntry m_HistoryInfoEntry(template SipUrl p_Url, template IntegerList p_index, template SemicolonParam_List p_paramlist) :=
+      	{
+       		nameAddr := {displayName:=omit, addrSpec:= p_Url},
+       		hiIndex := p_index,
+      		hiExtention := p_paramlist
+      	}
+  
+		template PAssertedID m_PAssertedID_2x(template Addr_Union p_pAssertedIDValue1, template Addr_Union p_pAssertedIDValue2) := 
+		{
+			fieldName := P_ASSERTED_ID_E,
+			pAssertedIDValueList := {p_pAssertedIDValue1, p_pAssertedIDValue2}
+		};
+	
+		template PAssertedID mw_PAssertedID(template PAssertedIDValue p_pAssertedIDValue) := 
+		{
+			fieldName := P_ASSERTED_ID_E,
+			pAssertedIDValueList := {p_pAssertedIDValue}
+		};
+
+		template PAssertedIDValue mw_PAssertedIDValue(template SipUrl p_SipUrl) := 
+		{
+			addrSpecUnion := p_SipUrl
+		};
+		
+		template PPreferredID m_PPreferredID(template Addr_Union p_pPreferredIDValue) := 
+		{
+			fieldName := P_PREFERRED_ID_E,
+			pPreferredIDValueList := {p_pPreferredIDValue}
+		};
+
+		template Privacy m_Privacy(PrivacyValue p_privacy) := 
+		{
+			fieldName := PRIVACY_E,
+			privValueList := {p_privacy}
+		};
+				
+		template RAck m_RAck(integer p_responseNum, integer p_seqNumber, charstring p_method) :=
+		{
+		  	fieldName := RACK_E,
+		  	responseNum := p_responseNum,
+		  	seqNumber := p_seqNumber,
+		  	method  := p_method
+	  	};
+
+		template Reason m_Reason(integer p_cause) :=
+		{		  
+			fieldName := REASON_E,
+			reasonValues := {m_ReasonValue(int2str(p_cause),"dummy")}
+		};
+
+		template Reason m_Reason21 :=
+		{		  
+			fieldName := REASON_E,
+			reasonValues := {m_ReasonValue(int2str(21),"call reject")}
+		};
+
+		template RecordRoute m_recordRoute_currIpAddr (in SipUserProfile p_userprofile):=
+		{   
+			fieldName := RECORD_ROUTE_E,
+			routeBody := {{nameAddr := {displayName := omit, 
+									   addrSpec := 	{scheme := c_sipScheme,  			//*  contains "sip"
+													userInfo := omit,
+													hostPort := {host:=p_userprofile.currIpaddr, portField:= p_userprofile.currPort},
+													urlParameters := omit,
+													headers := omit}
+									   },
+						  rrParam := omit}
+		}};
+	
+		template ReferredBy m_ReferredBy_SipUrl(template SipUrl p_sipUrl) := 
+		{
+			fieldName := REFERRED_BY_E,
+			nameAddr :={displayName := omit, addrSpec:=p_sipUrl},
+			referredbyIdParams := omit
+		}
+
+		template ReferTo m_ReferTo_SipUrl(template SipUrl p_sipUrl, charstring p_method) := 
+		{
+			fieldName := REFER_TO_E,
+			nameAddr :={displayName := omit, addrSpec:=p_sipUrl},
+			referToParams := {{id:="method",paramValue :=p_method}}
+		}
+
+		template Replaces m_Replaces(
+			charstring p_callId, 
+			charstring p_toTag,
+			charstring p_fromTag
+		) := {
+			fieldName := REPLACES_E,
+			replacesParams := {
+				{id := p_callId, paramValue := omit},
+				{id := "to-tag", paramValue := p_toTag},
+				{id := "from-tag", paramValue := p_fromTag}
+			}
+		}
+
+		template Require m_Require_replaces :=
+		{		  
+			fieldName := REQUIRE_E,
+			optionsTags := {c_replaces}
+		};
+		
+		template Require m_Require_100rel :=
+		{		  
+			fieldName := REQUIRE_E,
+			optionsTags := {c_tag100rel}
+		};
+		
+		template Require m_Require_prec :=
+		{		  
+			fieldName := REQUIRE_E,
+			optionsTags := {c_tagPrecond}
+		};
+		
+        template Supported m_Supported_fromChange :=
+        {
+       		fieldName:=SUPPORTED_E, 
+       		optionsTags:={c_tagFromChange}
+      	}
+		
+		template Supported m_Supported_prec :=
+		{
+			fieldName:=SUPPORTED_E, 
+			optionsTags:={c_tagPrecond}
+		}
+		
+		template Supported m_Supported_100rel :=
+		{
+			fieldName:=SUPPORTED_E, 
+			optionsTags:={c_tag100rel}
+		}
+		
+		template Supported m_Supported_100rel_prec :=
+		{
+			fieldName:=SUPPORTED_E, 
+			optionsTags:={c_tag100rel, c_tagPrecond}
+		}
+
+		template GenericParam m_Text (template charstring p_text):=
+			{id:="text", paramValue:=p_text}
+		
+		template GenericParam m_UserPhone :=
+		{
+			id := "user",
+			paramValue := "phone"
+		}
+  		
+  		template GenericParam m_UserToUserEncodingHex :=
+        {
+          id := "encoding",
+     	  paramValue := "hex"
+        }
+        
+        template UserToUser m_UserToUserData(template charstring p_U2UData):=
+        {
+          fieldName := USER_TO_USER_E,
+          uuiData := p_U2UData,
+          uuiParam := m_UserToUserEncodingHex
+        }
+        
+		template To m_To(template SipUrl p_sipUrl) :=
+		{
+		  fieldName := TO_E,
+		  addressField :=
+		  {nameAddr := {
+			  displayName := "ETSI Tester", //*  optional charstring
+			  addrSpec :=	p_sipUrl		//*  SipUrl
+			}},//* end addressField
+		  toParams := omit
+		};
+
+		template To m_To_SipUrl(SipUrl p_sipUrl) :=
+		{
+		  fieldName := TO_E,
+		  addressField :=
+		  {nameAddr := {
+			  displayName := omit, 	 			//*  optional charstring
+			  addrSpec := p_sipUrl		//*  SipUrl
+			}},//* end addressField
+		  toParams := omit
+		};
+
+		template To mw_To_NameAddr_SipUrl(template charstring p_dn, template charstring p_user, template charstring p_host) :=
+		{
+			fieldName := TO_E,
+			addressField := (mw_AddrUnion_Nameaddr(p_dn,p_user,p_host),mw_AddrUnion_SipUrl(p_user,p_host)),
+			toParams := *
+		}
+
+		template From mw_From(template SipUrl p_sipUrl) := {
+		  fieldName := FROM_E,
+		  addressField := { addrSpecUnion := p_sipUrl},
+		  fromParams:= *
+		}
+
+		template From mw_From_NameAddr_SipUrl(template charstring p_dn, template charstring p_user, template charstring p_host) :=
+		{
+			fieldName := FROM_E,
+			addressField := (mw_AddrUnion_Nameaddr(p_dn,p_user,p_host),mw_AddrUnion_SipUrl(p_user,p_host)),
+			fromParams := *
+		}
+		template ViaBody m_ViaBody_currIpaddr(charstring branch_val,in SipUserProfile p_userprofile) :=
+		{
+		  sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT),
+		  sentBy:={host:=p_userprofile.currIpaddr, portField:= p_userprofile.currPort},
+		  viaParams:={{id :=c_branchId,paramValue :=branch_val}}
+		}
+		
+		template ViaBody mw_ViaBody_interface(template HostPort p_hostport) :=
+		{
+		  sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT),
+		  sentBy:={host:=p_hostport.host, portField:= p_hostport.portField},
+		  viaParams:=*
+		}
+
+		template Via mw_Via(template ViaBody p_viabody) :=
+		{
+		  fieldName := VIA_E,
+		  viaBody:= ? //*  superset(p_viabody)
+		}
+		
+		template CallId mw_CallId_any :=
+		{
+		  fieldName := CALL_ID_E,
+		  callid := ?
+		}
+
+		template Privacy mw_Privacy_id := 
+		{
+			fieldName := PRIVACY_E,
+			privValueList := {*,"id",*}
+		};
+		
+
+		template Privacy mw_Privacy_user := 
+		{
+			fieldName := PRIVACY_E,
+			privValueList := {*,"user",*}
+		};
+		
+		template Reason mw_Reason(integer p_cause) :=
+		{		  
+			fieldName := REASON_E,
+			reasonValues := {m_ReasonValue(int2str(p_cause),?)}
+		};
+		
+		template Require mw_Require_not_100rel :=
+		{		  
+			fieldName := REQUIRE_E,
+			optionsTags := superset(complement(c_tag100rel))
+		};
+		
+		template Require mw_require_100rel :=
+    	{
+    		fieldName := REQUIRE_E,
+    		optionsTags := superset(c_tag100rel)
+    	};
+
+		template RecordRoute mw_recordroute (template RouteBody p_routeBody):=
+		{   
+			fieldName := RECORD_ROUTE_E,
+			routeBody := ? //*  superset(p_routeBody)
+		};
+		
+		template Route mw_route (template RouteBody_List p_routeBody):=
+		{   
+			fieldName := ROUTE_E,
+			routeBody := p_routeBody
+		};
+		
+		template Supported mw_Supported_100rel_prec :=
+		{
+			fieldName:=SUPPORTED_E, 
+			optionsTags:= superset(c_tag100rel, c_tagPrecond)
+		}
+		
+		template Supported mw_Supported_100rel :=
+		{
+			fieldName:=SUPPORTED_E, 
+			optionsTags:= superset(c_tag100rel)
+		}
+
+		template Supported mw_Supported_fromChange :=
+		{
+			fieldName:=SUPPORTED_E, 
+			optionsTags:= superset(c_tagFromChange)
+		}
+        
+		template UserToUser mw_UserToUserData(template charstring p_U2UData):=
+		{
+			fieldName := USER_TO_USER_E,
+			uuiData := p_U2UData,
+			uuiParam := ?
+		}
+				
+		template Contact mw_Contact_conference :=
+		{
+		  fieldName := CONTACT_E,
+		  contactBody :=
+		  {
+			contactAddresses :=
+			{
+			  {
+				addressField := ?,//MRO
+				contactParams := {{"isfocus",*}}
+			  }
+			}
+		  } 
+		}
+		
+		template AlertInfo m_AlertInfo(charstring p_urn) := {
+			fieldName := ALERT_INFO_E,
+			alertInfoBody := {{p_urn, omit}}
+		}
+		
+		template AlertInfo mw_AlertInfo(template charstring p_urn) := {
+			fieldName := ALERT_INFO_E,
+			alertInfoBody := superset({p_urn, omit})
+		}
+	} //*  end of group HeaderFieldTemplates
+
+
+group MessageTemplates {
+group dummy_templates {
+  group dummy_parameter_send {
+
+	template RequestLine m_requestLine_dummy(Method p_method) := 
+	{
+		method := p_method,
+		requestUri := c_empty_RequestUri,
+		sipVersion := c_sipNameVersion
+	}
+
+	template MessageHeader m_msgHeader_dummy := 
+	{
+		accept := omit,
+		acceptContact := omit,
+		acceptEncoding := omit,
+		acceptLanguage := omit,
+		alertInfo := omit,
+		allow := omit,
+		allowEvents := omit, //*  RFC3265
+		authenticationInfo := omit,
+		authorization := omit,
+		callId := c_empty_CallId,
+		callInfo := omit,
+		contact := omit,
+		contentDisposition := omit,
+		contentEncoding := omit,
+		contentLanguage := omit,
+		contentLength := {fieldName := CONTENT_LENGTH_E, len:=  0},
+		contentType := omit, //* if message body present m, else not present
+		cSeq := c_empty_cSeq,
+		date := omit,
+		errorInfo := omit,
+		event := omit, //*  RFC3265
+		expires := omit,
+		fromField := c_empty_From,
+		historyInfo := omit, //*  RFC4244
+		inReplyTo := omit,
+		maxForwards := c_maxForwards70,
+		mimeVersion := omit,
+		minExpires := omit,
+		minSE := omit, //*  RFC4028
+		organization := omit,
+		pAccessNetworkInfo := omit, //*  RFC3455
+		pAssertedID := omit,
+		pAssertedService := omit,
+		pAssociatedURI := omit,
+		path := omit, //*  RFC3327
+		pCalledPartyID := omit, //*  RFC3455
+		pChargingFunctionAddresses := omit, //*  RFC3455
+		pChargingVector := omit, //*  RFC3455
+		pEarlyMedia := omit, //*  RFC5009
+		pMediaAuthorization := omit, //*  RFC3313
+		pPreferredID := omit,
+		priority := omit,
+		privacy := omit,
+		proxyAuthenticate := omit,
+		proxyAuthorization := omit,
+		proxyRequire := omit,
+		pVisitedNetworkID := omit, //*  RFC3455
+		rAck := omit,
+		rSeq := omit,
+		reason := omit,
+		recordRoute := omit,
+		referredBy := omit, //*  RFC3892 - REFER method
+		referTo := omit, //*  RFC3515 - REFER method
+		replaces := omit, //* RFC3891
+		replyTo := omit,
+		require := omit,
+		retryAfter := omit,
+		route := omit,
+		securityClient := omit, //*  RFC3329
+		securityServer := omit, //*  RFC3329
+		securityVerify := omit, //*  RFC3329
+		server := omit,
+		serviceRoute := omit, //*  RFC3608
+		sessionExpires := omit, //*  RFC4028
+		subject := omit,
+		subscriptionState := omit, //*  RFC3265
+		supported := omit,
+		timestamp := omit,
+		toField := c_empty_To,
+		unsupported := omit,
+		userToUser := omit,
+		userAgent := omit,
+		via := c_empty_Via,
+		warning := omit,
+		wwwAuthenticate := omit,
+		undefinedHeader_List := omit
+	}
+  } //*  group dummy_parameter_send
+  
+  group dummy_parameter_receive {
+
+	template RequestLine mw_requestLine_dummy(Method p_method) := 
+	{
+		method := p_method,
+		requestUri := ?,
+		sipVersion := c_sipNameVersion
+	}
+
+	template MessageHeader mw_msgHeader_dummy := 
+	{
+		accept := *,
+		acceptContact := *,
+		acceptEncoding := *,
+		acceptLanguage := *,
+		alertInfo := *,
+		allow := *,
+		allowEvents := *, //*  RFC3265
+		authenticationInfo := *,
+		authorization := *,
+		callId := ?,
+		callInfo := *,
+		contact := *,
+		contentDisposition := *,
+		contentEncoding := *,
+		contentLanguage := *,
+		contentLength := ?,
+		contentType := *,
+		cSeq := ?,
+		date := *,
+		errorInfo := *,
+		event := *, //*  RFC3265
+		expires := *,
+		fromField := ?,
+		historyInfo := *, //*  RFC4244
+		inReplyTo := *,
+		maxForwards := ?,
+		mimeVersion := *,
+		minExpires := *,
+		minSE := *, //*  RFC4028
+		organization := *,
+		pAccessNetworkInfo := *, //*  RFC3455
+		pAssertedID := *,
+		pAssertedService := *,
+		pAssociatedURI := *,
+		path := *, //*  RFC3327
+		pCalledPartyID := *, //*  RFC3455
+		pChargingFunctionAddresses := *, //*  RFC3455
+		pChargingVector := *, //*  RFC3455
+		pEarlyMedia := *, //*  RFC5009
+		pMediaAuthorization := *, //*  RFC3313
+		pPreferredID := *,
+		priority := *,
+		privacy := *,
+		proxyAuthenticate := *,
+		proxyAuthorization := *,
+		proxyRequire := *,
+		pVisitedNetworkID := *, //*  RFC3455
+		rAck := *,
+		rSeq := *,
+		reason := *,
+		recordRoute := *,
+		referredBy := *, //*  RFC3892 - REFER method
+		referTo := *, //*  RFC3515 - REFER method
+		replaces := *, //* RFC 3891
+		replyTo := *,
+		require := *,
+		retryAfter := *,
+		route := *,
+		securityClient := *, //*  RFC3329
+		securityServer := *, //*  RFC3329
+		securityVerify := *, //*  RFC3329
+		server := *,
+		serviceRoute := *, //*  RFC3608
+		sessionExpires := *, //*  RFC4028
+		subject := *,
+		subscriptionState := *, //*  RFC3265
+		supported := *,
+		timestamp := *,
+		toField := ?,
+		unsupported := *,
+		userToUser := *,
+		userAgent := *,
+		via := ?,
+		warning := *,
+		wwwAuthenticate := *,
+		undefinedHeader_List := *
+	}
+  }//* end group dummy_parameter_receive
+  
+  group dummy_request_templates_send {
+
+	template ACK_Request m_ACK_Dummy :=
+	{
+		requestLine	:= m_requestLine_dummy(ACK_E),
+		msgHeader := m_msgHeader_dummy,
+		messageBody := omit,
+		payload := omit
+	}
+
+	template BYE_Request m_BYE_Dummy :=
+	{
+		requestLine	:= m_requestLine_dummy(BYE_E),
+		msgHeader := m_msgHeader_dummy,
+		messageBody := omit,
+		payload := omit
+	}
+
+	template CANCEL_Request m_CANCEL_Dummy :=
+	{
+		requestLine	:= m_requestLine_dummy(CANCEL_E),
+		msgHeader := m_msgHeader_dummy,
+		messageBody := omit,
+		payload := omit
+	}
+
+	template INFO_Request m_INFO_Dummy :=
+	{
+		requestLine	:= m_requestLine_dummy(INFO_E),
+		msgHeader := m_msgHeader_dummy,
+		messageBody := omit,
+		payload := omit
+	}
+
+	template INVITE_Request m_INVITE_Dummy :=
+	{
+		requestLine	:= m_requestLine_dummy(INVITE_E),
+		msgHeader := m_msgHeader_dummy,
+		messageBody := omit,
+		payload := omit
+	}
+
+	template MESSAGE_Request m_MESSAGE_Dummy :=
+	{
+		requestLine	:= m_requestLine_dummy(MESSAGE_E),
+		msgHeader := m_msgHeader_dummy,
+		messageBody := omit,
+		payload := omit
+	}
+
+	template NOTIFY_Request m_NOTIFY_Dummy :=
+	{
+		requestLine	:= m_requestLine_dummy(NOTIFY_E),
+		msgHeader := m_msgHeader_dummy,
+		messageBody := omit,
+		payload := omit
+	}
+
+	template PRACK_Request m_PRACK_Dummy :=
+	{
+		requestLine	:= m_requestLine_dummy(PRACK_E),
+		msgHeader := m_msgHeader_dummy,
+		messageBody := omit,
+		payload := omit
+	}
+
+	template PUBLISH_Request m_PUBLISH_Dummy :=
+	{
+		requestLine	:= m_requestLine_dummy(PUBLISH_E),
+		msgHeader := m_msgHeader_dummy,
+		messageBody := omit,
+		payload := omit
+	}
+
+	template REGISTER_Request m_REGISTER_Dummy :=
+	{
+		requestLine	:= m_requestLine_dummy(REGISTER_E),
+		msgHeader := m_msgHeader_dummy,
+		messageBody := omit,
+		payload := omit
+	}
+
+	template REFER_Request m_REFER_Dummy :=
+	{
+		requestLine	:= m_requestLine_dummy(REFER_E),
+		msgHeader := m_msgHeader_dummy,
+		messageBody := omit,
+		payload := omit
+	}
+
+	template SUBSCRIBE_Request m_SUBSCRIBE_Dummy :=
+	{
+		requestLine	:= m_requestLine_dummy(SUBSCRIBE_E),
+		msgHeader := m_msgHeader_dummy,
+		messageBody := omit,
+		payload := omit
+	}
+
+	template UPDATE_Request m_UPDATE_Dummy :=
+	{
+		requestLine	:= m_requestLine_dummy(UPDATE_E),
+		msgHeader := m_msgHeader_dummy,
+		messageBody := omit,
+		payload := omit
+	}
+  }//* end group dummy_request_templates_send
+  group dummy_request_templates_receive{
+
+	template ACK_Request mw_ACK_Dummy :=
+	{
+		requestLine	:= mw_requestLine_dummy(ACK_E),
+		msgHeader := mw_msgHeader_dummy,
+		messageBody := *,
+		payload := *
+	}
+
+	template BYE_Request mw_BYE_Dummy :=
+	{
+		requestLine	:= mw_requestLine_dummy(BYE_E),
+		msgHeader := mw_msgHeader_dummy,
+		messageBody := *,
+		payload := *
+	}
+
+	template CANCEL_Request mw_CANCEL_Dummy :=
+	{
+		requestLine	:= mw_requestLine_dummy(CANCEL_E),
+		msgHeader := mw_msgHeader_dummy,
+		messageBody := *,
+		payload := *
+	}
+
+	template INFO_Request mw_INFO_Dummy :=
+	{
+		requestLine	:= mw_requestLine_dummy(INFO_E),
+		msgHeader := mw_msgHeader_dummy,
+		messageBody := *,
+		payload := *
+	}
+
+	template INVITE_Request mw_INVITE_Dummy :=
+	{
+		requestLine	:= mw_requestLine_dummy(INVITE_E),
+		msgHeader := mw_msgHeader_dummy,
+		messageBody := *,
+		payload := *
+	}
+
+	template MESSAGE_Request mw_MESSAGE_Dummy :=
+	{
+		requestLine	:= mw_requestLine_dummy(MESSAGE_E),
+		msgHeader := mw_msgHeader_dummy,
+		messageBody := *,
+		payload := *
+	}
+
+	template NOTIFY_Request mw_NOTIFY_Dummy :=
+	{
+		requestLine	:= mw_requestLine_dummy(NOTIFY_E),
+		msgHeader := mw_msgHeader_dummy,
+		messageBody := *,
+		payload := *
+	}
+
+	template PRACK_Request mw_PRACK_Dummy :=
+	{
+		requestLine	:= mw_requestLine_dummy(PRACK_E),
+		msgHeader := mw_msgHeader_dummy,
+		messageBody := *,
+		payload := *
+	}
+
+	template PUBLISH_Request mw_PUBLISH_Dummy :=
+	{
+		requestLine	:= mw_requestLine_dummy(PUBLISH_E),
+		msgHeader := mw_msgHeader_dummy,
+		messageBody := *,
+		payload := *
+	}
+
+	template REFER_Request mw_REFER_Dummy :=
+	{
+		requestLine	:= mw_requestLine_dummy(REFER_E),
+		msgHeader := mw_msgHeader_dummy,
+		messageBody := *,
+		payload := *
+	}
+
+	template REGISTER_Request mw_REGISTER_Dummy :=
+	{
+		requestLine	:= mw_requestLine_dummy(REGISTER_E),
+		msgHeader := mw_msgHeader_dummy,
+		messageBody := *,
+		payload := *
+	}
+
+	template SUBSCRIBE_Request mw_SUBSCRIBE_Dummy :=
+	{
+		requestLine	:= mw_requestLine_dummy(SUBSCRIBE_E),
+		msgHeader := mw_msgHeader_dummy,
+		messageBody := *,
+		payload := *
+	}
+
+	template UPDATE_Request mw_UPDATE_Dummy :=
+	{
+		requestLine	:= mw_requestLine_dummy(UPDATE_E),
+		msgHeader := mw_msgHeader_dummy,
+		messageBody := *,
+		payload := *
+	}
+  }//* end group dummy_request_templates_receive
+  
+  group dummy_response_templates_send{
+  	
+	template Response m_Response_Dummy :=
+	{
+		statusLine	:= c_statusLine100,
+		msgHeader := m_msgHeader_dummy,
+		messageBody := omit,
+		payload := omit
+	}
+  } //*  group dummy_response_templates_send
+  
+  group dummy_response_templates_receive{
+	template Response mw_Response_Dummy :=
+	{
+		statusLine	:= ?,
+		msgHeader := mw_msgHeader_dummy,
+		messageBody := *,
+		payload := *
+	}
+  } //*  group dummy_response_templates_receive
+}
+
+group base_templates{
+	
+	group request_send {
+		
+		
+		template ACK_Request m_ACK_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
+			From p_from, To p_to, Via p_via) modifies m_ACK_Dummy :=
+		{
+			requestLine	:=
+			{
+				requestUri := p_requestUri
+			},
+			msgHeader :=
+			{
+				callId := p_callId,
+				cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "ACK"},
+				fromField := p_from,
+				toField := p_to,
+				via := p_via
+			}
+		}
+		
+		template BYE_Request m_BYE_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to, 
+			Via p_via) modifies m_BYE_Dummy :=
+		{	
+			requestLine	:=
+			{
+				requestUri := 
+				{
+					hostPort:= p_requestUri.hostPort
+				}
+			},
+			msgHeader :=
+			{
+				callId := p_callId,
+				cSeq := p_cSeq,
+				fromField := p_from,
+				toField := p_to,
+				via := p_via
+			}
+		}
+		
+		template CANCEL_Request m_CANCEL_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to, 
+			Via p_via) modifies m_CANCEL_Dummy :=
+		{
+			requestLine	:=
+			{
+				requestUri :=
+					{
+						hostPort:= p_requestUri.hostPort
+					}
+			},
+			msgHeader :=
+			{
+				callId := p_callId,
+				cSeq := p_cSeq,
+				fromField := p_from,
+				toField := p_to,
+				via := p_via
+			}
+		}
+		
+		template INFO_Request m_INFO_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to, 
+			Via p_via) modifies m_INFO_Dummy :=
+		{	
+			requestLine	:=
+			{
+				requestUri := 
+				{
+					hostPort:= p_requestUri.hostPort
+				}
+			},
+			msgHeader :=
+			{
+				callId := p_callId,
+				cSeq := p_cSeq,
+				fromField := p_from,
+				toField := p_to,
+				via := p_via
+			}
+		}
+		
+		template INVITE_Request m_INVITE_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
+			 From p_from, To p_to, Via p_via, Contact p_contact) modifies m_INVITE_Dummy :=
+		{
+			requestLine	:=
+		  	{
+				requestUri := p_requestUri
+		  	},
+		  	msgHeader :=
+		  	{
+		  		callId := p_callId,
+				contact := p_contact,
+				cSeq := p_cSeq,
+				fromField := p_from,
+				toField := p_to,
+				via := p_via
+			}
+		}
+
+		template MESSAGE_Request m_MESSAGE_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to, Via p_via) modifies m_MESSAGE_Dummy :=
+		{
+			requestLine	:=
+			{
+				requestUri := p_requestUri
+			},
+			msgHeader :=
+			{
+				callId := p_callId,
+				cSeq := p_cSeq,
+				fromField := p_from,
+				toField := p_to,
+				via := p_via
+			}
+		}
+
+		template NOTIFY_Request m_NOTIFY_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
+		  From p_from, To p_to, Via p_via) modifies m_NOTIFY_Dummy :=
+		{
+			requestLine	:=
+			{
+				requestUri :=
+				{
+					hostPort:= p_requestUri.hostPort
+				}
+			},
+			msgHeader :=
+			{
+				callId := p_callId,
+				//* contentLength	:= {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
+				//* contentType := {fieldName := CONTENT_TYPE_E, mediaType :=  c_sdpAplication},
+				cSeq :=  {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "NOTIFY"},
+				fromField := p_from,
+				toField := p_to,
+				via := p_via
+			}//* ,
+			//* messageBody := p_mb
+		}
+		
+		template PRACK_Request m_PRACK_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
+		  From p_from, To p_to, Via p_via, RAck p_RAck) 
+		  modifies m_PRACK_Dummy :=
+		{
+			requestLine	:=
+			{
+				requestUri :=
+				{
+					hostPort:= p_requestUri.hostPort
+				}
+			},
+			msgHeader :=
+			{
+				callId := p_callId,
+				cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "PRACK"},
+				fromField := p_from,
+				rAck := p_RAck,
+				toField := p_to,
+				via := p_via
+			},
+			messageBody := omit
+		}
+		
+		//* in reality PUBLISH request contain xml in content
+		template PUBLISH_Request m_PUBLISH_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
+		  From p_from, To p_to, Via p_via, template Event p_event, template RAck p_RAck, template MessageBody p_mb) 
+		  modifies m_PUBLISH_Dummy :=
+		{
+			requestLine	:=
+			{
+				requestUri :=
+				{
+					hostPort:= p_requestUri.hostPort
+				}
+			},
+			msgHeader :=
+			{
+				callId := p_callId,
+				contentLength	:= {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
+				contentType := {fieldName := CONTENT_TYPE_E, mediaType :=  c_sdpAplication},
+				cSeq := {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "PUBLISH"},
+				event := p_event, 
+				fromField := p_from,
+				toField := p_to,
+				via := p_via
+			},
+			messageBody := p_mb
+		}
+
+		template REFER_Request m_REFER_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, Contact p_contact,
+			From p_from, template To p_to, Via p_via, template ReferTo p_referTo, template ReferredBy p_referredBy)
+			modifies m_REFER_Dummy :=
+		{
+			requestLine	:=
+			{
+				requestUri := p_requestUri
+		  	},
+		  	msgHeader :=
+	  		{
+				callId		:= p_callId,
+				contact := p_contact,
+				cSeq		:= {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "REFER"},
+				fromField	:= p_from,
+				referTo := p_referTo,
+				referredBy := p_referredBy,
+				toField		:= p_to,
+				via		:= p_via
+	  		}
+		}
+		
+		template REFER_Request m_REFER_Request_replaces (
+			SipUrl p_requestUri, 
+			CallId p_callId, 
+			CSeq p_cSeq, 
+			Contact p_contact,
+			From p_from, 
+			template To p_to, 
+			Via p_via, 
+			template ReferTo p_referTo, 
+			template ReferredBy p_referredBy,
+			template Replaces p_replaces,
+			template Require p_require
+		) modifies m_REFER_Request_Base := {
+			msgHeader :=
+			{
+				replaces := p_replaces,
+				require := p_require
+			}
+		}
+		
+		template REGISTER_Request m_REGISTER_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
+			From p_from, To p_to, Via p_via, Contact p_contact, template Authorization p_authorization) modifies m_REGISTER_Dummy :=
+		{
+			requestLine	:=
+			{
+				requestUri := p_requestUri
+			},
+			msgHeader :=
+			{
+				authorization := p_authorization,
+				callId := p_callId,
+				contact	:= p_contact,
+				cSeq		:= p_cSeq,
+				fromField	:= p_from,
+				toField		:= p_to,
+				via		:= p_via
+
+			}
+		}
+
+		template SUBSCRIBE_Request m_SUBSCRIBE_Request_Base (SipUrl p_requestUri, CallId p_callId, 
+			CSeq p_cSeq, From p_from, To p_to, Via p_via)  modifies m_SUBSCRIBE_Dummy :=
+		{
+			requestLine	:=
+			{
+				requestUri :=
+				{
+					hostPort:= p_requestUri.hostPort
+				}
+			},
+			msgHeader :=
+			{
+				callId		:= p_callId,
+				cSeq		:= {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "SUBSCRIBE"},
+				fromField	:= p_from,
+				toField		:= p_to,
+				via		:= p_via
+			}
+		}
+
+		template UPDATE_Request m_UPDATE_Request_Base (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
+		  From p_from, To p_to, Via p_via, Contact p_contact, template MessageBody p_mb) modifies m_UPDATE_Dummy :=
+		{
+			requestLine	:=
+			{
+				requestUri :=
+				{
+					hostPort:= p_requestUri.hostPort
+				}
+			},
+			msgHeader :=
+			{
+				callId		:= p_callId,
+				contact		:= p_contact,
+				contentLength	:= {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
+				contentType := {fieldName := CONTENT_TYPE_E, mediaType :=  c_sdpAplication},
+				cSeq		:= {fieldName:=CSEQ_E, seqNumber:= p_cSeq.seqNumber, method:= "UPDATE"},
+				fromField	:= p_from,
+				toField		:= p_to,
+				via		:= p_via
+			 },
+			messageBody := p_mb
+		}
+		  
+	} //*  end of group message_send
+
+	group request_receive {
+		
+		template ACK_Request mw_ACK_Request_Base (template CallId p_callId) modifies mw_ACK_Dummy :=
+		{
+			msgHeader :=
+			{
+				callId		:= p_callId
+			}
+		}
+		
+		template BYE_Request mw_BYE_Request_Base(template CallId p_callId) modifies mw_BYE_Dummy :=
+		  {
+			msgHeader :=
+			{
+				callId := p_callId
+			}
+		}
+		
+		template CANCEL_Request mw_CANCEL_Request_Base (template CallId p_callId) modifies mw_CANCEL_Dummy :=
+		{
+			msgHeader :=
+			{
+				callId := p_callId
+			}
+		}
+  
+		template INFO_Request mw_INFO_Request_Base(template CallId p_callId) modifies mw_INFO_Dummy :=
+		{
+			msgHeader :=
+			{
+				callId := p_callId
+			}
+		}
+
+		template INVITE_Request mw_INVITE_Request_Base modifies mw_INVITE_Dummy :=
+		{
+			requestLine	:=
+			{
+				method := INVITE_E
+			}
+		}
+
+		template MESSAGE_Request mw_MESSAGE_Request_Base(template CallId p_callId) modifies mw_MESSAGE_Dummy :=
+		{
+			msgHeader :=
+			{
+				callId := p_callId,
+				contact := omit
+			}
+		}
+
+		template NOTIFY_Request mw_NOTIFY_Request_Base (template CallId p_callId) modifies mw_NOTIFY_Dummy :=
+		{
+			msgHeader :=
+			{
+				callId := p_callId
+			}
+		}
+		
+		template PRACK_Request mw_PRACK_Request_Base(template CallId p_callId) modifies mw_PRACK_Dummy :=
+		{
+			msgHeader :=
+			{
+				callId := p_callId
+			}
+		}
+		
+		template PUBLISH_Request mw_PUBLISH_Request_Base(template CallId p_callId) modifies mw_PUBLISH_Dummy :=
+		{
+			msgHeader :=
+			{
+				callId := p_callId
+			}
+		}
+
+		template REFER_Request mw_REFER_Request_Base (CallId p_callId) modifies mw_REFER_Dummy :=
+		{
+			msgHeader :=
+			{
+				callId := p_callId
+			}
+		}
+		
+		template REFER_Request
+		mw_REFER_Request(CallId p_callId, SipUrl p_requestUri,
+						 SipUrl p_referredBy)
+		modifies mw_REFER_Request_Base := {
+			requestLine := {requestUri := p_requestUri},
+			msgHeader := {
+				callId := p_callId,
+				referredBy := {
+					fieldName := REFERRED_BY_E,
+					nameAddr := {displayName := *, addrSpec := p_referredBy},
+					referredbyIdParams := *
+				}
+			}
+		}
+	
+		template INVITE_Request mw_INVITE_Request(template Require p_require,
+						 SipUrl p_referredBy) modifies mw_INVITE_Request_Base := {
+			msgHeader := {
+				require := p_require,
+				referredBy := {
+					fieldName := REFERRED_BY_E,
+					nameAddr := {displayName := *, addrSpec := p_referredBy},
+					referredbyIdParams := *
+				}
+			}
+		}
+		
+		template REGISTER_Request mw_REGISTER_Request_Base modifies mw_REGISTER_Dummy :=
+		{
+			requestLine	:=
+			{
+				method := REGISTER_E
+			}
+		}
+
+		template SUBSCRIBE_Request mw_SUBSCRIBE_Request_Base modifies mw_SUBSCRIBE_Dummy :=
+		{
+			requestLine	:=
+			{
+				method := SUBSCRIBE_E
+			}
+		}
+
+		template UPDATE_Request mw_UPDATE_Request_Base(template CallId p_callId) modifies mw_UPDATE_Dummy :=
+		{
+			msgHeader :=
+			{
+				callId := p_callId
+			}
+		}
+
+	} //*  end group request_receive
+	
+	group response_send {
+
+		template Response m_Response_Base (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
+		  From p_from, To p_to, Via p_via) modifies m_Response_Dummy:=
+		{
+			statusLine := p_statusLine,
+			msgHeader :=
+			{
+				callId		:= p_callId,
+				cSeq		:= p_cSeq,
+				fromField	:= p_from,
+				maxForwards := omit,
+				toField		:= p_to,
+				via		:= p_via
+			},
+			messageBody := omit,
+			payload			:= omit
+		}
+
+	
+
+	} //*  end group response_send
+
+	group response_receive {
+
+		template Response mw_Response_Base (template StatusLine p_statusLine, template CallId p_callId,
+			template CSeq p_cSeq) modifies mw_Response_Dummy:=
+		{
+			statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
+			msgHeader :=
+			{
+			  callId		:= p_callId,
+			  contentLength	:= *,
+			  cSeq		:= p_cSeq,
+			  fromField	:= ?,
+			  maxForwards := *,
+			  toField		:= ?,
+			  via		:= ?
+		  }
+		}
+	} //*  end group message_receive
+
+} //*  end group full_templates
+
+group modified_templates {
+	
+group request_send {
+	
+	template ACK_Request m_ACK_Request_route (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
+	From p_from, To p_to, Via p_via, Route p_route)
+	  modifies m_ACK_Request_Base
+	  :=
+	  {
+		msgHeader :=
+		{
+		  route		:= p_route
+		}
+	  }
+
+	template ACK_Request m_ACK_Request_sdp (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq,
+	From p_from, To p_to, Via p_via,template MessageBody p_mb )
+	  modifies m_ACK_Request_Base
+	  :=
+	  {
+		msgHeader :=
+		{
+			contentLength	:= {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
+			contentType := {fieldName := CONTENT_TYPE_E, mediaType :=  c_sdpAplication}
+		},
+		messageBody := p_mb
+	  }
+	  
+	template BYE_Request m_BYE_Request_cause
+	  (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to, Via p_via, integer p_cause)
+	  modifies m_BYE_Request_Base
+	  :=
+	  {
+		msgHeader :=
+		{
+			  reason := m_Reason(p_cause) //*  PIXIT value
+		}
+	  }
+	
+	template INVITE_Request m_INVITE_Request_sdp
+	(SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to,
+	  Via p_via, Contact p_contact, template MessageBody p_mb)
+	modifies m_INVITE_Request_Base
+	:=
+	{
+	  msgHeader :=
+	  {
+		contentLength	:= {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
+		contentType := {fieldName := CONTENT_TYPE_E, mediaType :=  c_sdpAplication}
+	  },
+	  messageBody := p_mb
+	}
+	
+	template INVITE_Request m_INVITE_Request_ResourceList
+	(SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, From p_from, To p_to,
+	  Via p_via, Contact p_contact, template MessageBody p_mb)
+	modifies m_INVITE_Request_Base
+	:=
+	{
+	  msgHeader :=
+	  {
+		contentLength	:= {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
+		contentType := {fieldName := CONTENT_TYPE_E, mediaType :=  "application/resource-lists+xml"},
+		contentDisposition := {
+			fieldName := CONTENT_DISPOSITION_E,
+			dispositionType := "recipient-list",
+			dispositionParams := omit
+		},
+		require := {
+			fieldName := REQUIRE_E,
+			optionsTags := {"recipient-list-invite"}
+		}
+	  },
+	  messageBody := p_mb
+	}	
+
+	template REGISTER_Request m_REGISTER_Request_expires
+	  (SipUrl p_requestUri, CallId p_callId, CSeq p_cSeq, 
+	  From p_from, To p_to, Via p_via, Contact p_contact,
+	  template Authorization p_authorization, charstring p_expires)
+	  modifies  m_REGISTER_Request_Base
+	  :=
+	  {
+		msgHeader :=
+		{
+			authorization := p_authorization,
+		    expires := {
+			fieldName := EXPIRES_E,
+			deltaSec  := p_expires }
+		}
+	  }
+	  
+	  template NOTIFY_Request m_NOTIFY_Request_sipfrag (
+	  	SipUrl p_requestUri, 
+	  	CallId p_callId, 
+	  	CSeq p_cSeq,
+		From p_from, 
+		To p_to, 
+		Via p_via, 
+		charstring p_state, 
+		charstring p_sipfrag
+	) modifies m_NOTIFY_Request_Base := {
+			requestLine	:=
+			{
+				method := NOTIFY_E,
+				requestUri :=
+				{
+					hostPort:= p_requestUri.hostPort
+				}
+			},
+			msgHeader :=
+			{
+				contentLength	:= {fieldName := CONTENT_LENGTH_E, len:= lengthof(p_sipfrag)},
+				contentType := {fieldName := CONTENT_TYPE_E, mediaType :=  "message/sipfrag"},
+				subscriptionState := {
+					fieldName := SUBSCRIPTION_STATE_E,
+    				subState := p_state,
+    				substateParams := omit	
+				},
+				event := m_Event_refer
+			},
+			messageBody := {
+				sipfrag := 	p_sipfrag
+			}
+		}
+
+} //*  end group request_send	
+
+
+group request_receive {
+		
+	template BYE_Request mw_BYE_Request_Reason(template CallId p_callId, integer p_cause) modifies mw_BYE_Request_Base :=
+	{
+		msgHeader :=
+		{
+			reason := mw_Reason(p_cause)
+		}
+	}
+
+	template BYE_Request mw_BYE_Request_UserToUser(template CallId p_callId) modifies mw_BYE_Request_Base :=
+	{
+		msgHeader :=
+		{
+			userToUser := ?
+		}
+	}
+
+
+	template INVITE_Request mw_INVITE_Request_RequestURI (template SipUrl p_sipUrl) modifies mw_INVITE_Dummy :=
+	{
+		requestLine	:=
+		{
+			requestUri := p_sipUrl,
+			sipVersion := c_sipNameVersion
+		}
+	}
+
+    template INFO_Request mw_INFO_Request_MB (template CallId p_callId, template MessageBody p_mb) modifies mw_INFO_Request_Base :=
+    {
+     messageBody := p_mb
+    }
+
+	template INVITE_Request mw_INVITE_Request_expires modifies  mw_INVITE_Request_Base
+	  :=
+	  {
+		msgHeader := {expires := ?}
+	  }
+	  
+	template INVITE_Request mw_INVITE_Request_callid(CallId p_callid) modifies  mw_INVITE_Request_Base
+	  :=
+	  {
+		msgHeader := {callId := p_callid}
+	  }
+	
+	template INVITE_Request mw_INVITE_Request_MB (template CallId p_callId, template MessageBody p_mb) modifies mw_INVITE_Request_Base :=
+	{
+		msgHeader := {callId := p_callId},
+		messageBody := p_mb
+	}
+
+	template INVITE_Request mw_INVITE_Request_noPaccessNetworkInfo	(template CallId p_callId)
+		modifies mw_INVITE_Request_Base
+		:=
+		{
+		  msgHeader := {  pAccessNetworkInfo := omit}
+		}
+	template INVITE_Request mw_INVITE_Request_PaccessNetworkInfo	(template CallId p_callId)
+		modifies mw_INVITE_Request_Base
+		:=
+		{
+		  msgHeader := {  pAccessNetworkInfo := ?}
+		}
+
+	template REGISTER_Request mw_REGISTER_Request_ISC (template  PAccessNetworkInfo p_access , template  PVisitedNetworkID p_visited )modifies mw_REGISTER_Request_Base :=
+	{
+	  msgHeader := {  
+		  pAccessNetworkInfo := p_access,
+		  pVisitedNetworkID  := p_visited
+		  }
+
+	}
+		
+	template UPDATE_Request mw_UPDATE_Request_SDP(template CallId p_callId, template MessageBody p_mb) modifies mw_UPDATE_Dummy :=
+	{
+		messageBody := p_mb
+	}
+	
+    template NOTIFY_Request mw_NOTIFY_Request_MB (template CallId p_callId, template MessageBody p_mb) modifies mw_NOTIFY_Request_Base :=
+    {
+		messageBody := p_mb
+    }
+
+} //*  end group request_receive	
+
+group response_send {
+	
+	template Response m_Response_AlertInfo (
+		StatusLine p_statusLine, 
+		CallId p_callId, 
+		CSeq p_cSeq,
+	  	From p_from, 
+	  	To p_to,
+	  	Via p_via, 
+	  	AlertInfo p_alertInfo
+	) modifies m_Response_Base:= {
+		msgHeader := {
+			alertInfo := p_alertInfo
+		}
+	}
+
+	template Response m_Response_ext (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
+	  From p_from, To p_to, Via p_via, template Route p_route, template RecordRoute p_recordroute) modifies m_Response_Base:=
+	{
+		msgHeader :={
+			route 		:= p_route, //f_route(),
+			recordRoute := p_recordroute //f_recordroute()
+			}
+	}
+			
+	template Response m_Response_mbody (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
+	  From p_from, To p_to, Via p_via,  template Route p_route, template RecordRoute p_recordroute, MessageBody p_mb) modifies m_Response_ext:=
+	{
+		msgHeader :=
+			 {
+			   contentLength	:= {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
+			   contentType := {fieldName := CONTENT_TYPE_E, mediaType :=  c_sdpAplication}
+			 },
+	  	messageBody := p_mb
+	}
+			
+	template Response m_Response_PAsserted_Privacy (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
+			From p_from, To p_to, Via p_via,  template Route p_route, template RecordRoute p_recordroute, template PAssertedID p_pAssertedID, template Privacy p_privacy) modifies m_Response_ext:=
+	{
+		msgHeader :=
+				{
+						pAssertedID := p_pAssertedID,
+						privacy := p_privacy
+				}
+	}
+	
+	template Response mw_Response_PAsserted_Privacy_Supported (template StatusLine p_statusLine, template CallId p_callId,
+		template CSeq p_cSeq, template PAssertedID p_pAssertedID, template Privacy p_privacy, template Supported p_supported) modifies mw_Response_Base:=
+	{
+		statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
+		msgHeader :=
+		{
+			pAssertedID := p_pAssertedID,
+			privacy := p_privacy,
+			supported := p_supported
+		}
+	}
+			
+	template Response m_Response_PAsserted_Privacy_mbody (StatusLine p_statusLine, CallId p_callId, CSeq p_cSeq,
+			From p_from, To p_to, Via p_via,  template Route p_route, template RecordRoute p_recordroute, template PAssertedID p_pAssertedID, template Privacy p_privacy, MessageBody p_mb) modifies m_Response_ext:=
+	{
+		msgHeader :=
+				{
+						contentLength	:= {fieldName := CONTENT_LENGTH_E, len:= f_MessageBodyLength(valueof(p_mb))},
+						contentType := {fieldName := CONTENT_TYPE_E, mediaType :=  c_sdpAplication},
+						pAssertedID := p_pAssertedID,
+						privacy := p_privacy
+				},
+				messageBody := p_mb
+	}
+
+} //*  end group response_send	
+
+
+group response_receive {
+
+	template Response mw_Response_Expires (template StatusLine p_statusLine, template CallId p_callId,
+		template CSeq p_cSeq, template DeltaSec p_deltaSec) modifies mw_Response_Base:=
+	{
+		statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
+		msgHeader :=
+		{
+			expires := {fieldName := EXPIRES_E, deltaSec := p_deltaSec}
+	  }
+	}
+
+	template Response mw_Response_PAsserted_Privacy (template StatusLine p_statusLine, template CallId p_callId,
+		template CSeq p_cSeq, template PAssertedID p_pAssertedID, template Privacy p_privacy) modifies mw_Response_Base:=
+	{
+		statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
+		msgHeader :=
+		{
+			pAssertedID := p_pAssertedID,
+			privacy := p_privacy
+		}
+	}
+
+	template Response mw_Response_Reason (template StatusLine p_statusLine, template CallId p_callId,
+		template CSeq p_cSeq, integer p_cause) modifies mw_Response_Base:=
+	{
+		statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
+		msgHeader :=
+		{
+			reason := mw_Reason(p_cause)
+			}
+	}
+
+	template Response mw_Response_RecordRoute (template StatusLine p_statusLine, template CallId p_callId,
+		template CSeq p_cSeq, template RecordRoute p_recordRoute) modifies mw_Response_Base:=
+	{
+		statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
+		msgHeader :=
+		{
+			recordRoute := p_recordRoute
+	  }
+	}
+
+	template Response mw_Response_Via (template StatusLine p_statusLine, template CallId p_callId,
+		template CSeq p_cSeq, template Via p_via) modifies mw_Response_Base:=
+	{
+		statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
+		msgHeader :=
+		{
+			via := p_via
+	  }
+	}
+	
+	template Response mw_Response_Contact (template StatusLine p_statusLine, template CallId p_callId,
+		template CSeq p_cSeq, template Contact p_contact) modifies mw_Response_Base:=
+	{
+		statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
+		msgHeader :=
+		{
+			contact := p_contact
+	  }
+	}
+	
+	template Response mw_Response_AlertInfo (
+		template StatusLine p_statusLine, 
+		template CallId p_callId,
+		template CSeq p_cSeq, 
+		template AlertInfo p_alertInfo
+	) modifies mw_Response_Base:= {
+		statusLine := {
+			sipVersion := c_sipNameVersion, 
+			statusCode := p_statusLine.statusCode, 
+			reasonPhrase := ?
+		},
+		msgHeader :=
+		{
+			alertInfo := p_alertInfo
+	  }
+	}
+	
+	template Response mw_Response_HistoryInfo (template StatusLine p_statusLine, template CallId p_callId,
+			template CSeq p_cSeq, template HistoryInfo p_historyInfo) modifies mw_Response_Base:=
+		{
+			statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
+			msgHeader :=
+			{
+				historyInfo:=p_historyInfo
+				}
+		}
+	
+	template Response mw_Response_messageBody (
+		template StatusLine p_statusLine, 
+		template CallId p_callId,
+		template CSeq p_cSeq, 
+		template Require p_require,
+		template MessageBody p_mb
+	) modifies mw_Response_Base:= {
+		statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
+		msgHeader :=
+		{
+			require := p_require
+	    },
+	    messageBody := p_mb
+	}
+	
+	template Response mw_Response_Require (template StatusLine p_statusLine, template CallId p_callId,
+		template CSeq p_cSeq, template Require p_require) modifies mw_Response_Base:=
+	{
+		statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
+		msgHeader :=
+		{
+			require := p_require
+	  }
+	}
+	
+	template Response mw_Response_Require_ifpresent (template StatusLine p_statusLine, template CallId p_callId,
+	template CSeq p_cSeq, template Require p_require) modifies mw_Response_Base:=
+	{
+		statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
+		msgHeader :=
+		{
+			require := p_require ifpresent
+	  }
+	}
+	
+     template Response mw_Response_Supported (template StatusLine p_statusLine, template CallId p_callId,
+      template CSeq p_cSeq, template Supported p_supported) modifies mw_Response_Base:=
+     {
+      statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
+      msgHeader :=
+      {
+       supported := p_supported
+       }
+     }
+     
+     template Response mw_Response_UserToUser (template StatusLine p_statusLine, template CallId p_callId,
+      template CSeq p_cSeq) modifies mw_Response_Base:=
+     {
+     statusLine := {sipVersion := c_sipNameVersion, statusCode := p_statusLine.statusCode, reasonPhrase := ?},
+     msgHeader :=
+     {
+     	userToUser := ?
+       }
+     }
+} //*  end group response_receive	
+
+	
+} //*  end group modified_templates	
+
+} //*  end group MessageTemplates
+
+group SDP_Templates {
+	
+	group SDP_Messages {
+
+	group base_templates {
+    	
+    	template SDP_Message m_SDP(SDP_media_desc p_media, in SipUserProfile p_userprofile) := {
+    		protocol_version := 0, //*  v=0
+    		origin := {
+    			user_name := "voicesession",
+    			session_id := "30000",
+    			session_version := "0",
+    			net_type := c_in,
+    			addr_type := c_ip4,
+    			addr := p_userprofile.contactIpaddr },
+    		//*  o=voicesession 12345 12345 IN IP4 172.27.1.219
+    		session_name := "Voice Session", //*  s=Voice Session
+    		information := omit,
+    		uri := omit,
+    		emails := omit,
+    		phone_numbers := omit,
+    		connection := {
+    			net_type := c_in,
+    			addr_type := c_ip4,
+    			conn_addr := { addr:= p_userprofile.bearerIpaddr, ttl:=omit, num_of_addr:=omit }
+    		}, //* c=IN IP4 172.27.1.219
+    		bandwidth := omit,
+    		times := { { time_field := { "0", "0" }, time_repeat:=omit
+    			}
+    		}, //*  t=0 0
+    		timezone_adjustments := omit,
+    		key := omit,
+    		attributes := omit,
+    		media_list := {p_media}
+    	};
+    	
+    	template SDP_Message m_SDP_mediaList(SDP_media_desc_list p_media_list, in SipUserProfile p_userprofile)
+    	:= {
+			protocol_version := 0, //*  v=0
+			origin := {
+				user_name := "voicesession",
+				session_id := "30000",
+				session_version := "0",
+				net_type := c_in,
+				addr_type := c_ip4,
+				addr := p_userprofile.contactIpaddr },
+			//*  o=voicesession 12345 12345 IN IP4 172.27.1.219
+			session_name := "Voice Session", //*  s=Voice Session
+			information := omit,
+			uri := omit,
+			emails := omit,
+			phone_numbers := omit,
+			connection := {
+				net_type := c_in,
+				addr_type := c_ip4,
+				conn_addr := { addr:= p_userprofile.bearerIpaddr, ttl:=omit, num_of_addr:=omit }
+			}, //* c=IN IP4 172.27.1.219
+			bandwidth := omit,
+			times := { { time_field := { "0", "0" }, time_repeat:=omit
+				}
+			}, //*  t=0 0
+			timezone_adjustments := omit,
+			key := omit,
+			attributes := omit,
+			media_list := p_media_list
+		};
+
+		template SDP_Message m_SDP_media_attr_preconditions(SDP_media_desc p_media, in SipUserProfile p_userprofile, SDP_attribute_list p_attribute_list)
+		modifies m_SDP
+		:= {
+			media_list := {
+				{
+					media_field := {
+						media := c_audio,
+						ports := { port_number := 8500, num_of_ports:=omit },
+						transport := c_rtpAvp,
+						fmts := { "0" }
+					}, //* m=audio 8500 RTP/AVP 0				
+					information := omit,
+					connections := omit,
+					bandwidth := omit,
+					key := omit,						
+					attributes := p_attribute_list
+				}}
+			}
+	
+    		template SDP_Message m_SDP_attribute(SDP_media_desc p_media, in SipUserProfile p_userprofile, SDP_attribute loc_attribute) 
+    		modifies m_SDP
+    		:= {
+    			attributes := {loc_attribute}
+    		};
+
+			template SDP_Message mw_SDP := {
+				protocol_version := 0, //*  v=0
+				origin := ?,
+				session_name := ?, 
+				information := omit,
+				uri := omit,
+				emails := omit,
+				phone_numbers := omit,
+				connection := ?,
+				bandwidth := omit,
+				times := { { time_field := { "0", "0" }, time_repeat:=omit
+					}
+				}, //*  t=0 0
+				timezone_adjustments := omit,
+				key := omit,
+				attributes := omit,
+				media_list := ?
+			};
+		
+		
+	}//* end group base_templates
+
+	group modified_templates{
+    	template SDP_Message m_SDP_bandwidth(SDP_media_desc p_media, in SipUserProfile p_userprofile) 
+    	modifies m_SDP
+    	:= {
+    		bandwidth := {{PX_SIP_SDP_b_modifier, PX_SIP_SDP_b_bandwidth}}
+    	};
+    
+    	template SDP_Message m_SDP_unacceptable(SDP_media_desc p_media, in SipUserProfile p_userprofile) 
+    	modifies m_SDP
+    	:= {
+    		protocol_version := 1, //*  v=1 unacceptable version of SDP
+    		bandwidth := {{PX_SIP_SDP_b_modifier, PX_SIP_SDP_b_bandwidth}}
+    	};
+    	
+    	template SDP_Message m_SDP_encrypted(SDP_media_desc p_media, in SipUserProfile p_userprofile) 
+    		modifies m_SDP
+    		:= {
+    			protocol_version := 1, //*  v=1 unacceptable version of SDP
+    			bandwidth := {{PX_SIP_SDP_b_modifier, PX_SIP_SDP_b_bandwidth}}
+    		};
+    }//* end group modified_templates
+			
+	} //*  end group	SDP_Messages	
+		
+	group SDP_Fields {
+
+		template SDP_media_desc m_media(template SDP_media_field p_mf) := {
+				media_field := p_mf, 
+				information := omit,
+				connections := omit,
+				bandwidth := omit,
+				key := omit,						
+				attributes := omit
+		};
+		
+		template SDP_media_desc m_mediaFieldBandwdthAttributes(template SDP_media_field p_mf, template SDP_bandwidth p_bw, template SDP_attribute_list p_attributes) := {
+				media_field := p_mf, 
+				information := omit,
+				connections := omit,
+				bandwidth := p_bw,
+				key := omit,						
+				attributes := p_attributes
+		};
+		
+		template SDP_media_desc m_media_dynPT(charstring p_PT, charstring p_encod) := {
+				media_field := {
+					media := c_audio,//* "audio",
+					ports := { port_number := 8500, num_of_ports:=omit },
+					transport := c_rtpAvp,//* "RTP/AVP",
+					fmts := { p_PT }
+				}, //* m=audio 8500 RTP/AVP 8
+				information := omit,
+				connections := omit,
+				bandwidth := omit,
+				key := omit,						
+				attributes := { { rtpmap := { attr_value := p_PT & " " & p_encod }
+								}
+							  } //* a=rtpmap:8 PCMA/8000
+		};
+	
+		template SDP_media_desc m_media_unsupported := {
+				media_field := {
+					media := "video",
+					ports := { port_number := 11500, num_of_ports:=omit },
+					transport := "RTP/AVP",
+					fmts := { "99" }
+				}, //* m=audio 8500 RTP/AVP 0
+				information := omit,
+				connections := omit,
+				bandwidth := omit,
+				key := omit,						
+				attributes := { { 
+					rtpmap := { attr_value := "99 X-Experimental/180000"}
+				}}
+		};
+
+		template SDP_bandwidth m_bandwidth(template charstring loc_m, template integer loc_b) := {
+			modifier:=loc_m, 
+			bandwidth:=loc_b
+		};
+
+		template SDP_bandwidth m_bandwidth_as_64:= 
+		{
+					modifier:="AS", 
+					bandwidth:=64
+		}
+		
+		template SDP_bandwidth mw_bandwidth_rs:= 
+		{
+					modifier:="RS", 
+					bandwidth:=?
+		}
+		
+		template SDP_bandwidth mw_bandwidth_rr:= 
+		{
+					modifier:="RR", 
+					bandwidth:=?
+		}
+
+		template SDP_media_field m_media_field(charstring p_media, integer p_portNum, charstring p_transport, charstring p_fmts) :=
+		{
+			media := p_media,
+			ports := { port_number := p_portNum, num_of_ports:=omit },
+			transport := p_transport,
+			fmts := { p_fmts }
+		}		
+
+        template SDP_media_field mw_media_PCMU :=
+        {
+			media := c_audio,
+			ports := { port_number := ?, num_of_ports:=* },
+			transport := c_rtpAvp,
+			fmts := { "0" }
+        }
+
+		template SDP_media_field mw_media_PCMA :=
+		{
+			media := c_audio,
+			ports := { port_number := 8500, num_of_ports:=omit },
+			transport := c_rtpAvp,
+			fmts := { "8" }
+		}
+		
+		template SDP_media_field mw_media_PCMA_U_DPT :=
+		{
+			media := c_audio,
+			ports := { port_number := ?, num_of_ports:=* },
+			transport := c_rtpAvp,
+			fmts := { * }
+		}
+		
+		template SDP_media_field mw_media_T38 :=
+		{
+			media := c_image,
+			ports := { port_number := ?, num_of_ports:=* },
+			transport := pattern "*ptl", //* udptl,tcptl
+			fmts := { "t38" }
+		}
+
+		template SDP_media_field mw_media_G722 :=
+		{
+			media := c_audio,
+			ports := { port_number := ?, num_of_ports:=* },
+			transport := "RTP/AVP",
+			fmts := { "9" }
+		}
+
+		template SDP_media_field mw_media_AMR_DPT :=
+		{
+			media := c_audio,
+			ports := { port_number := ?, num_of_ports:=* },
+			transport := c_rtpAvp,
+			fmts := { * }
+		}
+		
+
+		template SDP_attribute m_attribute_sendonly	 := {sendonly:={}};
+		template SDP_attribute mw_attribute_sendonly	 := {sendonly:={}};//MRO
+		template SDP_attribute m_attribute_recvonly	 := {recvonly:={}};
+		template SDP_attribute mw_attribute_recvonly	 := {recvonly:={}};//MRO
+		template SDP_attribute m_attribute_sendrecv	 := {sendrecv:={}};
+		template SDP_attribute mw_attribute_sendrecv	 := {sendrecv:={}};//MRO
+		template SDP_attribute m_attribute_inactive	 := {inactive:={}};
+		template SDP_attribute mw_attribute_inactive	 := {inactive:={}};//MRO
+		template SDP_attribute mw_attribute_sendonly_inactive := (mw_attribute_sendonly,mw_attribute_inactive);
+		template SDP_attribute mw_attribute_sendrecv_recvonly_omit := (mw_attribute_sendrecv,mw_attribute_recvonly,omit);
+		template SDP_attribute m_attribute_AMR_DPT	 := { rtpmap := { attr_value := /*pattern "**/PX_SIP_SDP_dyn & " AMR" }};
+		template SDP_attribute m_attribute_CLEARMODE_DPT	 := {rtpmap := { attr_value := /*pattern "**/PX_SIP_SDP_dyn & " CLEARMODE/8000" }};
+		template SDP_attribute m_attribute_G722	 := { rtpmap := { attr_value := "9 G722/8000" }};
+		template SDP_attribute m_attribute_PCMU	 := { rtpmap := { attr_value := "0 PCMU/8000" }};
+		template SDP_attribute m_attribute_PCMU_DPT	 := { rtpmap := { attr_value := /*pattern "**/PX_SIP_SDP_dyn & " PCMU/8000" }};
+		template SDP_attribute m_attribute_PCMA	 := { rtpmap := { attr_value := "8 PCMA/8000" }};
+		template SDP_attribute m_attribute_PCMA_DPT	 := { rtpmap := { attr_value := /*pattern "**/PX_SIP_SDP_dyn & " PCMA/8000" }};
+		template SDP_attribute m_attribute_T38	 := { unknown := { name:=?, attr_value := pattern "*t38*" }};
+		
+		template SDP_attribute m_attribute_curr (charstring p_preconditionType, charstring p_statusType, charstring p_direction):= 
+		{
+			curr:={preconditionType := p_preconditionType, 
+			statusType := p_statusType, 
+			direction := p_direction}
+		};
+		
+		template SDP_attribute mw_attribute_curr := 
+		{
+			curr := ?
+		};
+		
+		template SDP_attribute m_attribute_des (charstring p_preconditionType, charstring p_strength, charstring p_statusType, charstring p_direction):= 
+		{
+			des:={preconditionType := p_preconditionType, 
+			strength := p_strength,
+			statusType := p_statusType, 
+			direction := p_direction}
+		};
+		
+		template SDP_attribute mw_attribute_des := 
+		{
+			des := ?
+		};
+		
+		template SDP_attribute m_attribute_conf (charstring p_preconditionType, charstring p_statusType, charstring p_direction):= 
+		{
+			conf:={preconditionType := p_preconditionType, 
+			statusType := p_statusType, 
+			direction := p_direction}
+		};		
+	} //*  end group SDP_Fields	
+
+} //*  end group SDP_Templates
+
+group MessageBodies {
+	
+	template MessageBody m_MBody_SDP(template SDP_Message p_SDP):=
+	{
+		sdpMessageBody := p_SDP
+	};
+	
+	template MessageBody m_MBody_XML(template XmlBody p_xmlBody):=
+	{
+		xmlBody := p_xmlBody
+	};
+	
+	template MessageBody m_MBody_longPlainText:=
+	{
+		textplain :=  c_longMessageContent_1300Bytes
+	};
+
+	template MessageBody m_mBody_plainText(charstring p_plaitext):=
+	{
+		textplain :=  p_plaitext
+	};
+	
+	template MessageBody m_MBody_sipfrag(charstring p_sipfrag) := {
+		sipfrag := p_sipfrag	
+	} 
+	
+	template MessageBody m_MBody_MIMESdpXml(template SDP_Message p_sdp, template XmlBody p_xmlBody):=
+	{
+		mimeMessageBody := {boundary:="PX_SIP_MIME_Boundary", 
+			mimeEncapsulatedList:= {
+			{content_type:="PX_SIP_SDP_ContentType", 
+				content_disposition:=omit,
+				mime_encapsulated_part:={sdpMessageBody := p_sdp}},
+			{content_type:="PX_SIP_ISUP_ContentType", 
+				content_disposition:=omit,
+				mime_encapsulated_part:={xmlBody := p_xmlBody}}
+			}
+		}
+	}
+	
+	template MessageBody mw_MBody_SDP(template SDP_Message p_SDP):=
+	{
+		sdpMessageBody := p_SDP
+	};
+	
+	template MessageBody mw_MBody_XML(template XmlBody p_xmlBody):=
+	{
+		xmlBody := p_xmlBody
+	};
+	
+	template MessageBody mw_MBody_MIMESdpXml(template SDP_Message p_sdp, template XmlBody p_xmlBody):=
+	{
+		mimeMessageBody := {boundary:=?, 
+			mimeEncapsulatedList:= {
+			{content_type:=?, 
+				content_disposition:=*,
+				mime_encapsulated_part:={sdpMessageBody := p_sdp}},
+			{content_type:=?, 
+				content_disposition:=*,
+				mime_encapsulated_part:={xmlBody := p_xmlBody}}
+			}
+		}
+	}
+	
+	template MessageBody mw_MBody_MIME_Ims3gpp(
+		template charstring p_disposition, 
+		template Ims_3gpp p_ims3gpp
+	):= {
+		mimeMessageBody := {boundary:=?, 
+			mimeEncapsulatedList:= {
+    			*,
+    			{	
+    				content_type:= c_ims3gppAplication, 
+    				content_disposition:= p_disposition,
+    				mime_encapsulated_part :={
+    					xmlBody := {
+    						ims3gpp := 	p_ims3gpp
+    					}
+    				}
+    			},
+    			*
+			}
+		}
+	}
+	
+	template MessageBody mw_MBody_MIME_Ims3gppCW(
+		template charstring p_disposition, 
+		template Ims_3gpp p_ims3gpp
+	):= {
+		mimeMessageBody := {boundary:=?, 
+			mimeEncapsulatedList:= {
+							*,
+							{	
+								content_type:= c_ims3gppCwApplication, 
+								content_disposition:= p_disposition,
+								mime_encapsulated_part :={
+									xmlBody := {
+										ims3gpp := 	p_ims3gpp
+									}
+								}
+							},
+							*
+			}
+		}
+	}	
+	
+}
+/*
+ * 
+ * @desc group TemplatePreparationFunctions contain functions which are used for templates
+ */
+group TemplatePreparationFunctions {
+
+  group MessageBody_Calculation{
+  	
+	/**
+	* 
+	* @desc Calculation of Message Body length
+	* @param p_mb_par contain message body part
+	* @return message body length
+	*/
+	function f_MessageBodyLength(MessageBody p_mb_par) return integer {
+
+		var integer v_result:=0;
+		if (MB_LENGTH_FROM_ENCVAL){ //by default it is set to true 
+			
+            v_result:= lengthof(encvalue(p_mb_par))/8; // length in bypes, let get length of encoded value
+		}
+		else{ 
+        
+            //  assume SDP_Message ONLY in the message body
+    		if (ischosen(p_mb_par.sdpMessageBody))
+    		{ 
+    			v_result := f_SDPlength(p_mb_par.sdpMessageBody);
+    		};
+    
+    	    //  assume XML_Body ONLY in the message body
+    		if (ischosen(p_mb_par.xmlBody))
+    		{ 
+    			v_result := f_XMLBody_Length(p_mb_par.xmlBody, USE_FX_FOR_XML_LENGTH );
+    		};
+    		
+            //assume XML_Message ONLY in the message body
+            if (ischosen(p_mb_par.xmlMessage))
+            { 
+            	v_result := f_XMLlength(p_mb_par.xmlMessage, USE_FX_FOR_XML_LENGTH );
+            };
+    
+    		//  assume MIME_Message in the message body
+    		if (ischosen(p_mb_par.mimeMessageBody))
+    		{ 
+    			v_result := f_MIMElength(p_mb_par.mimeMessageBody);
+    		};
+    		
+            //assume sipfrag in the message body
+            if (ischosen(p_mb_par.sipfrag))
+            { 
+            	v_result := f_TextPlainLength(p_mb_par); //same function due to same type with textplain
+            };
+            
+            //assume textplain in the message body
+            if (ischosen(p_mb_par.textplain))
+            { 
+            	v_result := f_TextPlainLength(p_mb_par);
+            };
+		}
+
+	  return v_result
+	}
+  	
+  	
+  group SDP_Len_calculation {	
+	/**
+	 * 
+	 * @desc Calculation of SDP length
+	 * @param p_mb contain sdp message
+	 * @return sdp_lenght
+	 */
+	function f_SDPlength(SDP_Message p_mb) return integer
+	{
+	  var integer v_result:=2; //*  due to empty line beginning of message body
+	  var charstring v_auxstring;
+	  	
+	  v_result := 2+c_CRlen + lengthof(int2str(p_mb.protocol_version)); //*  "v="
+	  v_result := v_result + 2+c_CRlen + lengthof(p_mb.origin.user_name & " " & 
+								  p_mb.origin.session_id & " " & 
+								  p_mb.origin.session_version & " " & 
+								  p_mb.origin.net_type & " " & 
+								  p_mb.origin.addr_type & " " & 
+								  p_mb.origin.addr           
+								  ); //*  "o="
+	  v_result := v_result + 2+c_CRlen + lengthof(p_mb.session_name); //*  "s="
+	  if (ispresent(p_mb.information)) 
+		{v_auxstring:=p_mb.information; v_result := v_result + 2+c_CRlen + lengthof(v_auxstring);}; //*  "i= "
+	  if (ispresent(p_mb.uri)) 
+		{v_auxstring:=p_mb.uri; v_result := v_result + 2+c_CRlen + lengthof(v_auxstring);}; //*  "u="
+			
+	  if (ispresent(p_mb.emails)) {
+		for (var integer i:=0; i<sizeof(p_mb.emails); i:=i+1)
+		{v_result := v_result + 2+c_CRlen + lengthof(p_mb.emails[i].addr_or_phone); //*  "e="
+		if (ispresent(p_mb.emails[i].disp_name)) 
+		  {v_auxstring:=p_mb.emails[i].disp_name; v_result := v_result + 1 + lengthof(v_auxstring);};
+		};
+	  };
+			
+	  if (ispresent(p_mb.phone_numbers)) {
+		for (var integer i:=0; i<sizeof(p_mb.phone_numbers); i:=i+1)
+		  {v_result := v_result + 2+c_CRlen + lengthof(p_mb.phone_numbers[i].addr_or_phone); //*  "p= "
+		  if (ispresent(p_mb.phone_numbers[i].disp_name)) 
+			{v_auxstring:=p_mb.phone_numbers[i].disp_name; v_result := v_result + 1 + lengthof(v_auxstring);};
+		};
+	  }; 
+		    
+	  if (ispresent(p_mb.connection)) 
+	  {
+		var integer v_len_con0 := f_SDPlength_connection(p_mb.connection);
+		v_result := v_result + v_len_con0;
+	  }; //*  "c="
+			
+	  if (ispresent(p_mb.bandwidth))   
+	  { 
+		for (var integer i:=0; i<sizeof(p_mb.bandwidth); i:=i+1) { //*  "b= "
+		  v_result := v_result + 2+c_CRlen + lengthof(p_mb.bandwidth[i].modifier & " ") + 
+		  lengthof(int2str(p_mb.bandwidth[i].bandwidth));
+		}						
+	  };
+	
+	  for (var integer i:=0; i<sizeof(p_mb.times); i:=i+1) {
+		v_result := v_result + 2+c_CRlen + lengthof(p_mb.times[i].time_field.start_time & " "
+					 & p_mb.times[i].time_field.stop_time);//*  "t="
+									  
+		if (ispresent(p_mb.times[i].time_repeat))
+		{
+		  for (var integer j:=0; j<sizeof(p_mb.times[i].time_repeat); j:=j+1)
+		  {					
+			v_result := v_result + 2+c_CRlen + lengthof(int2str(p_mb.times[i].time_repeat[j].repeat_interval.time)); //*  "r="
+			if (ispresent(p_mb.times[i].time_repeat[j].repeat_interval.unit)) 
+			{
+			  v_auxstring:=p_mb.times[i].time_repeat[j].repeat_interval.unit; 
+			  v_result := v_result + 1 + lengthof(v_auxstring);
+			};					
+					
+			v_result := v_result + 1 + lengthof(int2str(p_mb.times[i].time_repeat[j].active.time));
+			if (ispresent(p_mb.times[i].time_repeat[j].active.unit)) 
+			{
+			  v_auxstring:=p_mb.times[i].time_repeat[j].active.unit; 
+			  v_result := v_result + 1 + lengthof(v_auxstring);
+			};
+										
+			for (var integer k:=0; k<sizeof(p_mb.times[i].time_repeat[j].offsets); k:=k+1)
+			{
+			  v_result := v_result + 1 + lengthof(int2str(p_mb.times[i].time_repeat[j].offsets[k].time));
+			  if (ispresent(p_mb.times[i].time_repeat[j].offsets[k].unit)) 
+			  {
+				v_auxstring:=p_mb.times[i].time_repeat[j].offsets[k].unit; 
+				v_result := v_result + 1 + lengthof(v_auxstring);
+			  };
+			}		
+		  }
+		};
+	  };
+
+	  if (ispresent(p_mb.timezone_adjustments)) 
+		{log("timezone adjustments have not been considered in SDP length calculation yet");
+	  }; //*  "z="
+				
+	  if (ispresent(p_mb.key)) {
+		v_result := v_result + 2+c_CRlen + lengthof(p_mb.key.method); //*  "k= "
+		if (ispresent(p_mb.key.key)) 
+		   {v_auxstring:=p_mb.key.key; v_result := v_result + 1 + lengthof(v_auxstring);};
+	  }; 
+	  if (ispresent(p_mb.attributes)) {
+		for (var integer i:=0; i<sizeof(p_mb.attributes); i:=i+1){ //*  "a= "
+			var integer v_len_con1 := f_SDPlength_attribute(p_mb.attributes[i]);
+			v_result := v_result + v_len_con1;
+		};
+	  }; //*  "a="
+
+	  if (ispresent(p_mb.media_list)) 
+	  {  
+        for (var integer i:=0; i<sizeof(p_mb.media_list); i:=i+1){ //*  "m= "
+	  	
+		  //*  for each media_field
+		  //* log("p_mb.media_list[i] ",p_mb.media_list[i]);
+		  v_result := v_result + 2+c_CRlen + lengthof(p_mb.media_list[i].media_field.media)
+							 + 1 + lengthof(int2str(p_mb.media_list[i].media_field.ports.port_number));
+
+
+		  if (ispresent(p_mb.media_list[i].media_field.ports.num_of_ports)) 
+			{v_result := v_result + 1 + lengthof(int2str(p_mb.media_list[i].media_field.ports.num_of_ports));};
+		  v_result := v_result + 1 + lengthof(p_mb.media_list[i].media_field.transport);
+		  for (var integer j:=0; j<sizeof(p_mb.media_list[i].media_field.fmts); j:=j+1){	
+			v_result := v_result + 1 + lengthof(valueof(p_mb.media_list[i].media_field.fmts[j]));
+		  }
+						
+		  if (ispresent(p_mb.media_list[i].information)) {
+			v_auxstring:=p_mb.media_list[i].information;
+			v_result := v_result + 2+c_CRlen + lengthof(v_auxstring);  //*  "i= "
+		  };
+		  if (ispresent(p_mb.media_list[i].connections)) {
+			for (var integer j:=0; j<sizeof(p_mb.media_list[i].media_field.fmts); j:=j+1){	
+			  var integer v_len_con2 :=  f_SDPlength_connection(p_mb.media_list[i].connections[j]);
+			  v_result := v_result + v_len_con2;
+		    }; //*  end for
+		  };
+		  if (ispresent(p_mb.media_list[i].bandwidth)) {  //*  "b= "
+		  	v_result := v_result + 2+c_CRlen + lengthof(p_mb.media_list[i].bandwidth.modifier)
+						+ 1 + lengthof(int2str(p_mb.media_list[i].bandwidth.bandwidth));
+		  };
+		  if (ispresent(p_mb.media_list[i].key)) {   //*  "k= "
+			v_result := v_result + 1 + lengthof(p_mb.media_list[i].key.method);
+			if (ispresent(p_mb.media_list[i].key.key)) {
+			  v_auxstring := p_mb.media_list[i].key.key;
+			  v_result := v_result + 1 + lengthof(v_auxstring);
+			};				
+		  };
+		  if (ispresent(p_mb.media_list[i].attributes)) {
+			for (var integer j:=0; j<sizeof(p_mb.media_list[i].attributes); j:=j+1){ //*  "a= "
+			  var integer v_len_attr := f_SDPlength_attribute(p_mb.media_list[i].attributes[j]);
+			  v_result := v_result + v_len_attr;
+			} //*  end for j
+		  };		
+		}; //*  end for i	  	
+	  }; //*  end if media_list
+
+	  return v_result;
+	};//* end function f_SDPlength
+
+	function f_SDPlength_connection(SDP_connection p_element) return integer //*  "c="
+	{
+	  var integer v_result:=0;
+	  var charstring v_auxstring;
+	  v_result := v_result + 2+c_CRlen + lengthof(p_element.net_type & " " & 
+	  p_element.addr_type & " " & 
+	  p_element.conn_addr.addr);
+	   if (ispresent(p_element.conn_addr.ttl)) 
+		  {v_result := v_result + 1 + lengthof(int2str(p_element.conn_addr.ttl));}; 
+	   if (ispresent(p_element.conn_addr.num_of_addr)) 
+		  {v_result := v_result + 1 + lengthof(int2str(p_element.conn_addr.num_of_addr));};
+	   return v_result
+	} //*  f_SDPlength_connection
+
+	function f_SDPlength_attribute(SDP_attribute p_element) return integer //*  "a="
+	{
+	  var integer v_result:=0;
+	  var charstring v_auxstring;
+	  if (ischosen(p_element.cat)) {v_result := v_result + 2+c_CRlen + lengthof("cat:" & p_element.cat.attr_value)};
+	  if (ischosen(p_element.keywds)) {v_result := v_result + 2+c_CRlen + lengthof("keywds:" & p_element.keywds.attr_value)};
+	  if (ischosen(p_element.tool)) {v_result := v_result + 2+c_CRlen + lengthof("tool:" & p_element.tool.attr_value)};
+	  if (ischosen(p_element.ptime)) {v_result := v_result + 2+c_CRlen + lengthof("ptime:" & p_element.ptime.attr_value)};
+	  if (ischosen(p_element.recvonly)) {v_result := v_result + 2+c_CRlen + lengthof("recvonly")};
+	  if (ischosen(p_element.sendrecv)) {v_result := v_result + 2+c_CRlen + lengthof("sendrecv")};
+	  if (ischosen(p_element.sendonly)) {v_result := v_result + 2+c_CRlen + lengthof("sendonly")};
+	  if (ischosen(p_element.inactive)) {v_result := v_result + 2+c_CRlen + lengthof("inactive")};
+	  if (ischosen(p_element.orient)) {v_result := v_result + 2+c_CRlen + lengthof("orient:" & p_element.orient.attr_value)};
+	  if (ischosen(p_element.sdp_type)) {v_result := v_result + 2+c_CRlen + lengthof("type:" & p_element.sdp_type.attr_value)};
+	  if (ischosen(p_element.charset)) {v_result := v_result + 2+c_CRlen + lengthof("charset" & p_element.charset.attr_value)};
+	  if (ischosen(p_element.sdplang)) {v_result := v_result + 2+c_CRlen + lengthof("sdplang:" & p_element.sdplang.attr_value)};
+	  if (ischosen(p_element.lang)) {v_result := v_result + 2+c_CRlen + lengthof("lang:" & p_element.lang.attr_value)};
+	  if (ischosen(p_element.framerate)) {v_result := v_result + 2+c_CRlen + lengthof("framerate:" & p_element.framerate.attr_value)};
+	  if (ischosen(p_element.quality)) {v_result := v_result + 2+c_CRlen + lengthof("quality:" & p_element.quality.attr_value)};
+	  if (ischosen(p_element.fmtp)) {v_result := v_result + 2+c_CRlen + lengthof("fmtp:" & p_element.fmtp.attr_value)};
+	  if (ischosen(p_element.curr)) {v_result := v_result + 2+c_CRlen + lengthof("curr:" & p_element.curr.preconditionType & " " 
+										& p_element.curr.statusType & " " & p_element.curr.direction)};
+	  if (ischosen(p_element.des)) {v_result := v_result + 2+c_CRlen + lengthof("des:" & p_element.des.preconditionType & " " 
+										& p_element.des.strength & " " & p_element.des.statusType & " " & p_element.des.direction)};
+	  if (ischosen(p_element.conf)) {v_result := v_result + 2+c_CRlen + lengthof("conf:" & p_element.conf.preconditionType & " " 
+										& p_element.des.statusType & " " & p_element.des.direction)};
+	  if (ischosen(p_element.rtpmap)) {v_result := v_result + 2+c_CRlen + lengthof("rtpmap:" & p_element.rtpmap.attr_value)};
+	  if (ischosen(p_element.rtcp)) {v_result := v_result + 2+c_CRlen + lengthof("rtcp:" & p_element.rtcp.attr_value)};
+	  if (ischosen(p_element.unknown)) 
+	  {v_result := v_result + 2+c_CRlen + lengthof(p_element.unknown.name);
+		if (ispresent(p_element.unknown.attr_value))		   		
+		  {var charstring aux := p_element.unknown.attr_value;
+			v_result := v_result + lengthof(":" & p_element.unknown.attr_value);
+		};
+	  };
+	  //*  log("axr: length attribute=", v_result);
+	  return v_result
+	} //*  f_SDPlength_attribute
+		
+  } //*  group SDPlen_calculation	
+
+  group XML_Len_calculation{
+		
+		/**
+		* @desc Declaration of external functions to calculate length of message bodies
+		* switching of internal or external functions are made by boolean module parameter/PIXIT
+		* USE_FX_FOR_XML_LENGTH declared at top of this module
+		*/
+		external function fx_calculateXMLMessageLen(XMLMessage p_mb) return integer;
+		external function fx_calculateXMLBodyLen(XmlBody p_mb) return integer;
+		
+		/**
+		* 
+		* @desc Calculation of XML length
+		* @param p_mb contain XML message
+		* @return xml_length
+		*/
+		function f_XMLlength(XMLMessage p_mb, boolean p_ext_func) return integer
+		{
+			var integer v_result:=0;
+			
+			if ( p_ext_func){
+				v_result := fx_calculateXMLMessageLen(p_mb);
+			}else{
+				if (ispresent(p_mb.header)){
+					v_result := f_XMLHeader_Length(p_mb.header);
+				}
+				
+				//false given, because decision of external function usage is done in first if statement
+				v_result := v_result + f_XMLBody_Length(p_mb.body, false); 
+			}
+			return v_result
+		} //* f_XMLlength
+		
+		/**
+		* 
+		* @desc Calculation of XML header length
+		* @param p_mh contain XML header 
+		* @return xml_header_length
+		*/
+		function f_XMLHeader_Length(XmlHeader p_mh) return integer
+		{
+			var integer v_result:=0;
+			
+			//*<?xml version="1.0" encoding="UTF-8"?>\n len=39*/
+			//* 2 3          1   1          1     1 2 1*/
+			
+			v_result:=2+3+lengthof(" version=")+1+lengthof(p_mh.version)+1;  //<?xml version="1.0"
+			
+			if (ispresent(p_mh.encoding)){
+				
+				v_result:=v_result+lengthof(" encoding=")+1+lengthof(p_mh.encoding)+1;  // encoding="UTF-8"
+			}
+			
+			if (ispresent(p_mh.anyAttributes)){
+				for (var integer i:=0; i<sizeof(p_mh.anyAttributes); i:=i+1){
+					v_result := v_result + 1 + lengthof(p_mh.anyAttributes[i].name)+ 2 + lengthof(p_mh.anyAttributes[i].val) + 1;
+					//vresult + " "(1)+ length(name) + "=\""(2) + length(val) + "\""(1)
+				}
+			}
+			
+			v_result:=v_result+2+1; //?>\n
+			
+			return v_result
+		} //* f_XMLHeaderLength
+		
+		/**
+		* 
+		* @desc Calculation of XML body length
+		* @param p_mb contain XML body
+		* @return xml_length
+		*/
+		function f_XMLBody_Length(XmlBody p_mb, boolean p_ext_func) return integer
+		{
+			var integer v_result:=0;
+			
+			if ( p_ext_func){
+				v_result := fx_calculateXMLBodyLen(p_mb);
+			}else{
+				//  assume ConferenceInfo ONLY in the XML message body
+				if (ischosen(p_mb.conferenceInfo))
+				{ 
+					v_result := f_XMLBody_ConferenceInfo_Length(p_mb.conferenceInfo);
+				};
+				
+				//  assume CUG ONLY in the XML message body
+				if (ischosen(p_mb.cug))
+				{ 
+					v_result := f_XMLBody_Cug_Length(p_mb.cug);
+				};
+				
+				//  assume MCID ONLY in the XML message body
+				if (ischosen(p_mb.mcid))
+				{ 
+					v_result := f_XMLBody_Mcid_Length(p_mb.mcid);
+				};
+				
+				//  assume PSTNTransit ONLY in the XML message body
+				if (ischosen(p_mb.pstnTransit))
+				{ 
+					v_result := f_XMLBody_PSTNTransit_Length(p_mb.pstnTransit);
+				};
+				
+				//  assume Simservs ONLY in the XML message body
+				if (ischosen(p_mb.simservs))
+				{ 
+					v_result := f_XMLBody_Simservs_Length(p_mb.simservs);
+				};
+				
+				//  assume CDIV ONLY in the XML message body
+				if (ischosen(p_mb.cdivn))
+				{ 
+					v_result := f_XMLBody_CDIV_Length(p_mb.cdivn);
+				};
+				
+				//  assume ICB ONLY in the XML message body
+				if (ischosen(p_mb.icb))
+				{ 
+					v_result := f_XMLBody_ICB_Length(p_mb.icb);
+				};
+				
+				//  assume OCB ONLY in the XML message body
+				if (ischosen(p_mb.ocb))
+				{ 
+					v_result := f_XMLBody_OCB_Length(p_mb.ocb);
+				};
+				
+				//  assume ResourceLists ONLY in the XML message body
+				if (ischosen(p_mb.resourceLists))
+				{ 
+					v_result := f_XMLBody_ResourceList_Length(p_mb.resourceLists);
+				};
+				
+				//  assume Ims3GPP ONLY in the XML message body
+				if (ischosen(p_mb.ims3gpp))
+				{ 
+					v_result := f_XMLBody_Ims3GPP_Length(p_mb.ims3gpp);
+				};
+				
+				/** Add aditional checks regarding to new variants,
+				 *  also implement appropriate function for calculation
+				 */
+			}
+			return v_result
+		} //* f_XMLBodyLength
+		
+		group XMLBodies_calculation{
+		
+			/**
+			* 
+			* @desc Calculation of XML ConferenceInfo element length
+			* @param p_mb contain XML ConfInfo body
+			* @return xml_length
+			*/
+			function f_XMLBody_ConferenceInfo_Length(Conference_info p_mb) return integer
+			{
+				var integer v_result:=0;
+				//TODO: write function body
+				return v_result
+			} //* f_XMLBody_ConferenceInfo_Length
+			
+			/**
+			* 
+			* @desc Calculation of XML CUG element length
+			* @param p_mb contain XML CUG body
+			* @return xml_length
+			*/
+			function f_XMLBody_Cug_Length(Cug p_mb) return integer
+			{
+				var integer v_result:=0;
+				//TODO: write function body
+				return v_result
+			} //* f_XMLBody_Cug_Length
+			
+			/**
+			* 
+			* @desc Calculation of XML MCID element length
+			* @param p_mb contain XML MCID body
+			* @return xml_length
+			*/
+			function f_XMLBody_Mcid_Length(Mcid p_mb) return integer
+			{
+				var integer v_result:=0;
+				
+				if (ischosen(p_mb.choice.request)){
+				
+				}
+				
+				if (ischosen(p_mb.choice.response)){
+				
+				}
+				
+				return v_result
+			} //* f_XMLBody_Mcid_Length
+			
+			/**
+			* 
+			* @desc Calculation of XML PSTNTransit element length
+			* @param p_mb contain XML PSTNTransit body
+			* @return xml_length
+			*/
+			function f_XMLBody_PSTNTransit_Length(PSTN_transit p_mb) return integer
+			{
+				var integer v_result:=0;
+				//TODO: write function body
+				return v_result
+			} //* f_XMLBody_PSTNTransit_Length
+			
+			/** @desc Calculation of XML Simservs element length
+			* @param p_mb contain XML Simservs body
+			* @return xml_length
+			*/
+			function f_XMLBody_Simservs_Length(Simservs p_mb) return integer
+			{
+				var integer v_result:=0;
+				//TODO: write function body
+				return v_result
+			} //* f_XMLBody_Simservs_Length	
+			
+			/** @desc Calculation of XML CDIV element length
+			* @param p_mb contain XML CDIV body
+			* @return xml_length
+			*/
+			function f_XMLBody_CDIV_Length(Comm_div_info p_mb) return integer
+			{
+				var integer v_result:=0;
+				//TODO: write function body
+				return v_result
+			} //* f_XMLBody_CDIV_Length		
+			
+			/** @desc Calculation of XML ICB length
+			* @param p_mb contain XML ICB body
+			* @return xml_length
+			*/
+			function f_XMLBody_ICB_Length(Incoming_communication_barring p_mb) return integer
+			{
+				var integer v_result:=0;
+				//TODO: write function body
+				return v_result
+			} //* f_XMLBody_ICB_Length
+			
+			/** @desc Calculation of XML OCB length
+			* @param p_mb contain XML OCB body
+			* @return xml_length
+			*/
+			function f_XMLBody_OCB_Length(Outgoing_communication_barring p_mb) return integer
+			{
+				var integer v_result:=0;
+				//TODO: write function body
+				return v_result
+			} //* f_XMLBody_OCB_Length
+			
+			/** @desc Calculation of XML ResourceList length
+			* @param p_mb contain XML ResourceList body
+			* @return xml_length
+			*/
+			function f_XMLBody_ResourceList_Length(Resource_lists p_mb) return integer
+			{
+				var integer v_result:=0;
+				//TODO: write function body
+				return v_result
+			} //* f_XMLBody_ResourceList_Length
+			
+			/** @desc Calculation of XML Ims3GPP length
+			* @param p_mb contain XML Ims3GPP body
+			* @return xml_length
+			*/
+			function f_XMLBody_Ims3GPP_Length(Ims_3gpp p_mb) return integer
+			{
+				var integer v_result:=0;
+				//TODO: write function body
+				return v_result
+			} //* f_XMLBody_Ims3GPP_Length
+			
+		} //* XMLBodies_calculation
+  	
+  }//* group XMLlen_calculation
+
+  group MIME_Len_calculation{
+		/**
+		* 
+		* @desc Calculation of MIME length
+		* @param p_mb contain MIME message
+		* @return xml_length
+		*/
+		function f_MIMElength(MIME_Message p_mb) return integer
+		{
+			var integer v_result:=2; //0d0a
+			
+			v_result := v_result + lengthof(p_mb.boundary) + 2/*0d0a*/;
+			
+			for (var integer i:=0; i<sizeof(p_mb.mimeEncapsulatedList); i:=i+1){
+				
+				v_result := v_result + lengthof("Content-Type: ")+ lengthof(p_mb.mimeEncapsulatedList[i].content_type) + 2/*0d0a*/ ;
+				
+				if (ispresent(p_mb.mimeEncapsulatedList[i].content_disposition)){
+					v_result := v_result + lengthof("Content-Disposition: ")+ lengthof(p_mb.mimeEncapsulatedList[i].content_disposition) + 2/*0d0a*/ ;
+				}
+				
+				//v_result := v_result +2/*0d0a*/; ??? to check
+				
+				//		assume SDP_Message ONLY in the message body
+        		if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.sdpMessageBody))
+        		{ 
+        			v_result := v_result + f_SDPlength(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.sdpMessageBody);
+        		};
+				
+				//  assume XML_Body ONLY in the message body
+            	if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlBody))
+            	{ 
+            		v_result := v_result + f_XMLBody_Length(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlBody, USE_FX_FOR_XML_LENGTH );
+            	};
+		
+				//assume XML_Message ONLY in the message body
+				if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlMessage))
+				{ 
+					v_result := v_result + f_XMLlength(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlMessage, USE_FX_FOR_XML_LENGTH );
+				};
+                
+                //v_result := v_result +2/*0d0a*/; ??? to check
+			}
+			
+			//v_result := v_result +2/*0d0a*/; ??? to check
+			
+			return v_result
+		} //* f_MIMElength
+  	
+  }//* group MIMElen_calculation
+  
+  group TextPlain_Len_calculation{
+		/**
+		* 
+		* @desc Calculation of messagebody-textplain type length
+		* @param p_mb contain textplain message
+		* @return lenght
+		*/
+		function f_TextPlainLength(MessageBody p_mb) return integer
+		{
+			var integer v_result:=2; //0d0a
+
+			v_result:=v_result+lengthof(p_mb.textplain);
+			
+			return v_result;
+		}//* end function f_TextPlainLength
+		
+  }//*end group TextPlainLen_calculation
+
+  }//*group MessageBody_Calculation
+
+
+  group GiveHeaders {
+	/**
+	 * 
+	 * @desc Return component variable of recordRoute header if vc_boo_recordRoute is true
+	 * @return component variable of recordRoute header
+	 */
+
+	function f_recordroute() runs on SipComponent return template RecordRoute
+	{
+	  if (vc_boo_recordRoute)
+		  {return vc_recordRoute}
+	  else {return(omit)}
+	}
+	
+	/**
+	 * 
+	 * @desc Return component variable of Route header if vc_boo_route is true
+	 * @return component variable of recordRoute header
+	 */	
+	function f_route() runs on SipComponent return template RecordRoute
+	{
+	  if (vc_boo_route)
+		  {return vc_route} //*  TODO: Route header need to be in reverse order than RecordRoute, question of return value - RecordRoute 
+	  else {return(omit)}
+	}
+		
+  } //*  end group GiveHeaders
+  
+group others {  
+
+/*
+ * 
+ * @desc function combines two comma parameter lists
+ * @param p_list1 first list
+ * @param p_list2 second list
+ * @return comma parameter list that contains parameters from both input lists
+ * @verdict 
+ */
+
+  function f_merge_CommaParam_List(CommaParam_List p_list1, CommaParam_List p_list2) return template CommaParam_List
+  {	var CommaParam_List p_result;
+  	var integer limit1 := sizeof(p_list1);
+  	for (var integer i:=0; i<limit1; i:=i+1) {
+  		p_result[i] := p_list1[i]
+  	};
+	for (var integer i:=limit1; i<limit1+sizeof(p_list2); i:=i+1) {
+		p_result[i] := p_list2[i]
+	};
+	return p_result
+  }
+  
+} //*  end group others
+
+} //* group TemplatePreparationFunctions
+	
+
+} //*  end module LibSip_Templates
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_XMLTypes.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_XMLTypes.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LibSip_XMLTypes.ttcn	(revision 22)
@@ -0,0 +1,967 @@
+/*
+ *	@author 	STF 346, STF366, STF368, STF369
+ *  @version    $Id: LibSip_XMLTypes.ttcn 369 2009-06-08 08:05:27Z juvancic $
+ *	@desc		This module provides the XML type system for SIP tests.
+ *				The types have been generated automatically, followed by manual modifications:
+ *				- bitType substituted by OneBitType
+ *				- twobitType substituted by TwoBitType
+ *				- addition of pattern for: OneBitType, TwoBitType, ThreeBitType, FourBitType, FourBitType, SixBitType
+ *				- application of enumerated for: State_type, Endpoint_status_type, Joining_type, Disconnection_type, Media_status_type, 
+ *					Originating_identity_presentation_restriction, Terminating_identity_presentation_restriction
+ *				- addition of length value: NetworkIdentityType, SixteenbitType
+ *				- addition of value restriction: CugIndexType
+ *				- substitution of "content" by "choice": Call_type, Mcid
+ *				- additional type renaming (upper first letter): AbsService, Anonymous, Busy, 
+ *					Communication_diverted, Conference_description_type, Conference_info,
+ *					Conference_media_type, Conference_medium_type, Conference_state_type,
+ *					Conference_type, Cug, CugRequestType, Empty_element_type, Endpoint_type,
+ *					Execution_type, Host_type, Keywords_type, Media, Media_type, No_answer,
+ *					Not_reachable, Not_registered, Originating_identity_presentation, Presence_status,
+ *					Presence_status_activity_type, RequestType, ResponseType, Roaming,
+ *					Rule_deactivated, Sidebars_by_val_type, Simservs, SimservType,
+ *					Terminating_identity_presentation, Uri_type, Uris_type, User_roles_type,
+ *   				User_languages_type, User_type, Users_type
+ *   
+ *   			- XSDAUX.anyAttributes anyAttributes in records changed to optional
+ *   
+ *   			new group CDIV added by STF369
+ *   			new group ACR_CD added by STF38
+ */
+
+module LibSip_XMLTypes language "TTCN-3:2005"//MRO
+{
+
+import from XSDAUX all;
+
+group XmlTypes {
+ 
+    type record XMLMessage{
+        XmlHeader header optional,
+        XmlBody body
+    }
+    	
+    type record XmlHeader{
+     XSDAUX.string version,
+     XSDAUX.string encoding optional,
+     XSDAUX.anyAttributes anyAttributes optional		
+    }
+	
+	type union XmlBody{
+		Conference_info conferenceInfo,		// if there is XML Conference_info
+		Cug cug,							// if there is XML Cug
+		Mcid mcid,							// if there is XML Mcid
+		PSTN_transit pstnTransit,			// if there is XML PSTN data
+		Simservs simservs,					// if there is XML simservs (Oip/r Tip/r ...) 
+		Comm_div_info cdivn,				// if there is XML CDIVN document
+		Incoming_communication_barring icb, // if there is XML ICB document
+		Outgoing_communication_barring	ocb,	// if there is XML OCB document
+		Resource_lists resourceLists,		// if there is XML Resource List data
+		Ims_3gpp ims3gpp					// if ther is XML IM CN subsystem document
+	};
+
+}
+
+group GeneralTypes {
+	type Empty_element_type Not_registered;
+
+	type record SimservType {
+		XSDAUX.booleanXSD active optional, XSDAUX.anyAttributes anyAttributes optional
+	}
+
+	type Empty_element_type Not_reachable;
+
+	type Empty_element_type Busy;
+
+	type SimservType AbsService;
+
+	type Empty_element_type Communication_diverted;
+
+	type Presence_status_activity_type Presence_status;
+
+	type record Simservs {
+		XSDAUX.anyAttributes anyAttributes optional,
+		AbsService absService optional,
+		record{
+			record of anytype any_1 optional
+		} extensions optional
+	}
+
+	type Empty_element_type Anonymous;
+
+	type Empty_element_type Rule_deactivated;
+
+	type Empty_element_type No_answer;
+
+	type record Empty_element_type {
+	}
+
+	type Empty_element_type Roaming;
+
+	type Media_type Media;
+
+	type XSDAUX.string Presence_status_activity_type;
+} /* end group GeneralTypes */
+
+group PSTNTypes {
+  type record PSTN_transit {
+    record length (1 .. 2) of BearerCapabilityType BearerInfomationElement,
+    record length (0 .. 2) of HighLayerCompatibilityType HighLayerCompatibility optional,
+    LowLayerCompatibilityType LowLayerCompatibility optional,
+    record of ProgressIndicatorType ProgressIndicator optional,
+    record of DisplayType Display optional
+  }
+  
+  group BearerCapabilityTypes{
+
+	type record BearerCapabilityType {
+    	BCOctet3Type BCoctet3,
+    	BCOctet4Type BCoctet4,
+    	BCOctet4_1Type BCoctet4_1 optional,
+    	BCOctet5Type BCoctet5 optional,
+    	BCOctet5aType BCoctet5a optional,
+    	BCOctet5bV110Type BCoctet5bV110 optional,
+    	BCOctet5bV120Type BCoctet5bV120 optional,
+    	BCOctet5cType BCoctet5c optional,
+    	BCOctet5dType BCoctet5d optional,
+    	BCOctet6Type BCoctet6 optional,
+    	BCOctet7Type BCoctet7 optional,
+    	BCOctet7aType BCoctet7a optional,
+    	BCOctet7bType BCoctet7b optional
+	}
+
+	type record BCOctet3Type {
+		TwoBitType CodingStandard,
+		FiveBitType InformationTransferCapability
+	}
+
+	type record BCOctet4Type {
+		TwoBitType TransferMode,
+		FiveBitType InformationTransferRate
+	}
+
+	type record BCOctet4_1Type {
+		SevenBitType RateMultiplier
+	}
+
+	type record BCOctet5Type {
+		TwoBitType Layer1Identification,
+		FiveBitType UserInfoLayer1Protocol
+	}
+
+	type record BCOctet5aType {
+		OneBitType SynchronousAsynchronous,
+		OneBitType Negotiation,
+		FiveBitType UserRate
+	}
+
+	type record BCOctet5bV110Type {
+		TwoBitType IntermediateRate,
+		OneBitType NIConTX,
+		OneBitType NIConRX,
+		OneBitType FlowControlOnTX,
+		OneBitType FlowControlOnRX
+	}
+
+	type record BCOctet5bV120Type {
+		OneBitType RateAdaptionHeader,
+		OneBitType MultipleFrameEstablishmentSupport,
+		OneBitType ModeOfOperation,
+		OneBitType LogicalLinkIdentifier,
+		OneBitType Assignor,
+		OneBitType InbandOutbandNegotiation
+	}
+
+	type record BCOctet5cType {
+		TwoBitType NumberOfStopBits,
+		TwoBitType NumberOfDataBits,
+		ThreeBitType Parity
+	}
+
+	type record BCOctet5dType {
+		OneBitType DuplexMode,
+		SixBitType ModemType
+	}
+
+	type record BCOctet6Type {
+		TwoBitType Layer2Identification,
+		FiveBitType UserInfoLayer2Protocol
+	}
+
+	type record BCOctet7Type {
+		TwoBitType Layer3Identification,
+		FiveBitType UserInfoLayer3Protocol
+	}
+
+	type record BCOctet7aType {
+		FourBitType AdditionalLayer3Info
+	}
+
+	type record BCOctet7bType {
+		FourBitType AdditionalLayer3Info
+	}
+  
+  } //end group BearerCapabilityTypes
+  
+  group HighLayerCompatibilityTypes{ 
+
+	type record HighLayerCompatibilityType {
+		HLOctet3Type HLOctet3,
+		HLOctet4Type HLOctet4,
+		HLOctet4aMaintenanceType HLOctet4aMaintenance optional,
+		HLOctet4aAudioType HLOctet4Audio optional
+	}
+
+	type record HLOctet3Type {
+		TwoBitType CodingStandard,
+		ThreeBitType Interpretation,
+		TwoBitType PresentationMethod
+	}
+
+	type record HLOctet4Type {
+		SevenBitType HighLayerCharacteristics
+	}
+
+	type record HLOctet4aMaintenanceType {
+		SevenBitType HighLayerCharacteristics
+	}
+
+	type record HLOctet4aAudioType {
+		SevenBitType VideoTelephonyCharacteristics
+	}
+  
+  } //end group HighLayerCompatibilityTypes
+  
+  group LowLayerCompatibilityTypes{
+
+	type record LowLayerCompatibilityType {
+		LLOctet3Type LLOctet3,
+		LLOctet3aType LLOctet3a optional,
+		LLOctet4Type LLOctet4,
+		LLOctet4_1Type LLOctet4_1 optional,
+		LLOctet5Type LLOctet5 optional,
+		LLOctet5aType LLOctet5a optional,
+		LLOctet5bV110Type LLOctet5bV110 optional,
+		LLOctet5bV120Type LLOctet5bV120 optional,
+		LLOctet5cType LLOctet5c optional,
+		LLOctet5dType LLOctet5d optional,
+		LLOctet6Type LLOctet6 optional,
+		LLOctet6aHDLCType LLOctet6aHDLC optional,
+		LLOctet6aUserSpecificType LLOctet6aUserSpecific optional,
+		LLOctet6bType LLOctet6b optional,
+		LLOctet7Type LLOctet7 optional, //corrected due to ISUP TTCN3 solution
+		LLOctet7aUserSpecificType LLOctet7aUserSpecific optional,
+		LLOctet7aX25Type LLOctet7aX25 optional,
+		LLOctet7bX25Type LLOctet7bX25 optional,
+		LLOctet7cType LLOctet7c optional,
+		LLOctet7aTR9577Type LLOctet7aTR9577 optional,
+		LLOctet7bTR9577Type LLOctet7bTR9577 optional
+	} 
+
+	type record LLOctet3Type {
+		TwoBitType CodingStandard,
+		FiveBitType InformationTransferCapability
+	}
+
+	type record LLOctet3aType {
+		OneBitType NegotiationIndicator
+	} 
+
+	type record LLOctet4Type {
+		TwoBitType TransferMode,
+		FiveBitType InformationTransferRate
+	}
+
+	type record LLOctet4_1Type {
+		SevenBitType RateMultiplier
+	}
+
+	type record LLOctet5Type {
+		TwoBitType Layer1Identification,
+		FiveBitType UserInfoLayer1Protocol
+	}
+
+	type record LLOctet5aType {
+		OneBitType SynchronousAsynchronous,
+		OneBitType Negotiation,
+		FiveBitType UserRate
+	}
+
+	type record LLOctet5bV110Type {
+		TwoBitType IntermediateRate,
+		OneBitType NIConTX,
+		OneBitType NIConRX,
+		OneBitType FlowControlOnTX,
+		OneBitType FlowControlOnRX
+	}
+
+	type record LLOctet5bV120Type {
+		OneBitType RateAdaptionHeader,
+		OneBitType MultipleFrameEstablishmentSupport,
+		OneBitType ModeOfOperation,
+		OneBitType LogicalLinkIdentifier,
+		OneBitType Assignor,
+		OneBitType InbandOutbandNegotiation
+	}
+
+	type record LLOctet5cType {
+		TwoBitType NumberOfStopBits,
+		TwoBitType NumberOfDataBits,
+		ThreeBitType Parity
+	}
+
+	type record LLOctet5dType {
+		OneBitType DuplexMode,
+		SixBitType ModemType
+	}
+
+	type record LLOctet6Type {
+		TwoBitType Layer2Identification,
+		FiveBitType UserInfoLayer2Protocol
+	}
+
+	type record LLOctet6aHDLCType {
+		TwoBitType Mode
+	}
+
+	type record LLOctet6aUserSpecificType {
+		SevenBitType UserSpecificLayer2Information
+	}
+
+	type record LLOctet6bType {
+		SevenBitType WindowSize
+	}
+
+	type record LLOctet7Type {
+		TwoBitType Layer3Identification,
+		FiveBitType UserInfoLayer3Protocol
+	}
+
+	type record LLOctet7aTR9577Type {
+		FourBitType AdditionalLayer3Info
+	}
+
+	type record LLOctet7aUserSpecificType {
+		SevenBitType OptionalLayer3Information
+	}
+
+	type record LLOctet7aX25Type {
+		TwoBitType Mode
+	}
+
+	type record LLOctet7bTR9577Type {
+		FourBitType AdditionalLayer3Info
+	}
+
+	type record LLOctet7bX25Type {
+		FourBitType DefaultPacketSize
+	}
+
+	type record LLOctet7cType {
+		SevenBitType PacketWindowSize
+	}
+  
+  } //end group LowLayerCompatibilityTypes
+  
+  group ProgressIndicatorTypes{
+
+	type record ProgressIndicatorType {
+		ProgressOctet3Type ProgressOctet3,
+		ProgressOctet4Type ProgressOctet4
+	} 
+
+	type record ProgressOctet3Type {
+			TwoBitType CodingStandard,
+			FourBitType Location
+	}
+
+	type record ProgressOctet4Type {
+			SevenBitType ProgressDescription
+	}
+  
+  } //end group ProgressIndicatorTypes
+  
+  group DisplayTypes{
+
+	type record DisplayType {
+		DispOctet3Type DispOctet3
+	}
+
+	type record DispOctet3Type {
+		SevenBitType DisplayInformation
+	}
+	
+  } //end group DisplayTypes
+
+  group BitTypes{
+  	
+	type XSDAUX.string OneBitType (pattern "(0|1)"); 
+
+	type XSDAUX.string TwoBitType (pattern "(0|1)(0|1)"); 
+
+	type XSDAUX.string ThreeBitType (pattern "(0|1)(0|1)(0|1)");
+
+	type XSDAUX.string FourBitType (pattern "(0|1)(0|1)(0|1)(0|1)"); 
+
+	type XSDAUX.string FiveBitType (pattern "(0|1)(0|1)(0|1)(0|1)(0|1)");
+
+	type XSDAUX.string SixBitType (pattern "(0|1)(0|1)(0|1)(0|1)(0|1)(0|1)");
+  
+	type XSDAUX.string SevenBitType (pattern "(0|1)(0|1)(0|1)(0|1)(0|1)(0|1)(0|1)");
+  } //end group BitTypes
+}
+with {
+  encode "PSTN";
+}/* end group PSTNTypes */
+
+group CONFTypes {
+
+  type Conference_type Conference_info; 
+
+  type record Conference_type {
+	XSDAUX.anyURI entity,
+	State_type state optional,
+	XSDAUX.unsignedInt version optional,
+	XSDAUX.anyAttributes anyAttributes optional,
+	Conference_description_type conference_description optional,
+	Host_type host_info optional,
+	Conference_state_type conference_state optional,
+	Users_type users optional,
+	Uris_type sidebars_by_ref optional,
+	Sidebars_by_val_type sidebars_by_val optional,
+	record of anytype any_1 optional
+  }
+	
+  type record Media_type {
+    XSDAUX.string id,
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.string display_text optional,
+    XSDAUX.string type_ optional,
+    XSDAUX.string label_ optional,
+    XSDAUX.string src_id optional,
+    Media_status_type status optional,
+    record of anytype any_1 optional
+  }
+
+  type record Endpoint_type {
+    XSDAUX.string entity optional,
+    State_type state optional,
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.string display_text optional,
+    Execution_type referred optional,
+    Endpoint_status_type status optional,
+    Joining_type joining_method optional,
+    Execution_type joining_info optional,
+    Disconnection_type disconnection_method optional,
+    Execution_type disconnection_info optional,
+    record of Media_type media optional,
+    Call_type call_info optional,
+    record of anytype any_1 optional
+  }
+
+  type record Uri_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.anyURI uri,
+    XSDAUX.string display_text optional,
+    XSDAUX.string purpose optional,
+    Execution_type modified optional,
+    record of anytype any_1 optional
+  }
+
+  type record of XSDAUX.string Keywords_type; 
+
+  type record Conference_state_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.unsignedInt user_count optional,
+    XSDAUX.booleanXSD active optional,
+    XSDAUX.booleanXSD locked optional,
+    record of anytype any_1 optional
+  }
+
+  type record Execution_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.dateTime when optional,
+    XSDAUX.string reason optional,
+    XSDAUX.anyURI by optional
+  }
+
+  type record Host_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.string display_text optional,
+    XSDAUX.anyURI web_page optional,
+    Uris_type uris optional,
+    record of anytype any_1 optional
+  }
+
+  type record Sip_dialog_id_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.string display_text optional,
+    XSDAUX.string call_id,
+    XSDAUX.string from_tag,
+    XSDAUX.string to_tag,
+    record of anytype any_1 optional
+  }
+
+  type record Conference_description_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.string display_text optional,
+    XSDAUX.string subject optional,
+    XSDAUX.string free_text optional,
+    Keywords_type keywords optional,
+    Uris_type conf_uris optional,
+    Uris_type service_uris optional,
+    XSDAUX.unsignedInt maximum_user_count optional,
+    Conference_media_type available_media optional,
+    record of anytype any_1 optional
+  }
+
+  type record of XSDAUX.languageXSD User_languages_type; 
+
+  type record User_roles_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    record length (1 .. infinity) of XSDAUX.string entry
+  }
+
+//  type XSDAUX.string joining_type;
+  type enumerated Joining_type {dialed_in, dialed_out, focus_owner};
+
+//  type XSDAUX.string disconnection_type; 
+  type enumerated Disconnection_type {departed, booted, failed, busy};
+
+  type record Sidebars_by_val_type {
+    State_type state optional,
+    XSDAUX.anyAttributes anyAttributes optional,
+    record of Conference_type entry optional
+  }
+
+  type record User_type {
+    XSDAUX.anyURI entity optional,
+    State_type state optional,
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.string display_text optional,
+    Uris_type associated_aors optional,
+    User_roles_type roles optional,
+    User_languages_type languages optional,
+    XSDAUX.anyURI cascaded_focus optional,
+    record of Endpoint_type endpoint optional,
+    record of anytype any_1 optional
+  }
+
+//  type XSDAUX.string media_status_type; 
+  type enumerated Media_status_type {recvonly, sendonly, sendrecv, inactive};
+
+//  type XSDAUX.string endpoint_status_type; 
+  type enumerated Endpoint_status_type 
+  	{pending, dialing_out, dialing_in, alerting, on_hold,connected,
+  		muted_via_focus, disconnecting, disconnected};
+
+  type record Conference_medium_type {
+    XSDAUX.string label_,
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.string display_text optional,
+    XSDAUX.string type_,
+    Media_status_type status optional,
+    record of anytype any_1 optional
+  }
+
+  type record Users_type {
+    State_type state optional,
+    XSDAUX.anyAttributes anyAttributes optional,
+    record of User_type user optional,
+    record of anytype any_1 optional
+  }
+
+  type record Uris_type {
+    State_type state optional,
+    XSDAUX.anyAttributes anyAttributes optional,
+    record length (1 .. infinity) of Uri_type entry
+  }
+
+  type record Call_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    union {
+      Sip_dialog_id_type sip,
+      record length (0 .. 1) of record of anytype any_1
+    } choice
+  }
+
+//  type XSDAUX.string state_type; 
+  type enumerated State_type {full, partial, deleted};
+
+  type record Conference_media_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    record length (1 .. infinity) of Conference_medium_type entry
+  }
+}
+with {
+  encode "CONF";
+} /* end group CONFTypes */ 
+ 
+group CUGTypes{
+	type XSDAUX.integerXSD CugIndexType (0 .. 32767);
+
+	type record CugRequestType {
+		XSDAUX.booleanXSD outgoingAccessRequest optional, //optional [Ref: ETSI TS 124 454 V8.0.0 Table 4.5.2.4.1:]
+		CugIndexType cugIndex optional //optional [Ref: ETSI TS 124 454 V8.0.0 Table 4.5.2.4.1:]
+	}
+
+	type XSDAUX.hexBinary SixteenbitType length(2);
+
+	type record Cug {
+		CugRequestType cugCallOperation optional,
+		NetworkIdentityType networkIndicator optional,
+		SixteenbitType cugInterlockBinaryCode optional,
+		TwoBitType cugCommunicationIndicator optional
+	}
+
+//	type XSDAUX.string twobitType;
+
+	type XSDAUX.hexBinary NetworkIdentityType length(1);
+}
+with {
+  encode "CUG";
+} /* end group CUGTypes */
+
+group MCIDTypes{
+//  type XSDAUX.string bitType; 
+
+  type record ResponseType {
+    OneBitType McidResponseIndicator,
+	OneBitType HoldingProvidedIndicator
+  }
+
+  type record RequestType {
+	OneBitType McidRequestIndicator,
+	OneBitType HoldingIndicator
+  }
+
+  type record Mcid {
+    union {
+      RequestType request,
+      ResponseType response
+    } choice
+  }
+}
+with {
+  encode "MCID";
+} /* end group MCIDTypes */
+
+group OIP_R_Types{
+	type record Originating_identity_presentation_restriction {
+		XSDAUX.booleanXSD active optional,
+		XSDAUX.anyAttributes anyAttributes optional,
+		enumerated {presentation_restricted, presentation_not_restricted} default_behaviour optional
+	}
+
+	type SimservType Originating_identity_presentation;
+} /* end group OIP_R_Types */
+
+group TIP_R_Types{
+	type SimservType Terminating_identity_presentation;
+
+	type record Terminating_identity_presentation_restriction {
+		XSDAUX.booleanXSD active optional,
+		XSDAUX.anyAttributes anyAttributes optional,
+		enumerated {presentation_restricted, presentation_not_restricted} default_behaviour optional
+	}
+} /* end group TIP_R_Types */
+
+group CDIV{
+
+/*
+	*	@desc		This module provides the XML type system for communication diversion. (ETSI TS 124504, V8.4.0)
+	*				The types have been generated automatically, followed by manual modifications (STF369):
+	*				- application of enumerated for: Diversion_reason_info_type
+	*				- addition of value restriction: Comm_div_ntfy_trigger_criteria_type
+	*				- additional type renaming (upper first letter): all types in group			
+	*/
+
+  type record Comm_div_ntfy_trigger_criteria_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    Time_range_selection_criteria_type notification_time_selection_criteria optional,
+    Presence_status_selection_criteria_type presence_status_selection_criteria optional,
+    XSDAUX.integerXSD notification_buffer_interval (-infinity .. 86400) optional,
+    record of anytype any_1 optional
+  }
+
+  type record Comm_div_info_type {
+    XSDAUX.anyURI entity,
+    Comm_div_subs_info_type comm_div_subs_info optional,
+    Comm_div_ntfy_info_type comm_div_ntfy_info optional,
+    record of anytype any_1 optional
+  }
+
+  type record Comm_div_selection_criteria_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    User_selection_criteria_type originating_user_selection_criteria optional,
+    XSDAUX.anyURI diverting_user_selection_criteria optional,
+    XSDAUX.anyURI diverted_to_user_selection_criteria optional,
+    Time_range_selection_criteria_type diversion_time_selection_criteria optional,
+    Diversion_reason_selection_criteria_type diversion_reason_selection_criteria optional,
+    record of anytype any_1 optional
+  }
+
+  type record User_selection_criteria_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    record of User_info_type user_info optional
+  }
+
+  type record Comm_div_info_selection_criteria_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.booleanXSD disable_originating_user_info optional,
+    XSDAUX.booleanXSD disable_diverting_user_info optional,
+    XSDAUX.booleanXSD disable_diverted_to_user_info optional,
+    XSDAUX.booleanXSD disable_diversion_time_info optional,
+    XSDAUX.booleanXSD disable_diversion_reason_info optional,
+    XSDAUX.booleanXSD disable_diversion_rule_info optional,
+    record of anytype any_1 optional
+  }
+
+  type record Time_range_selection_criteria_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    record of Time_range_type time_range optional
+  }
+
+  type record Comm_div_subs_info_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    Comm_div_selection_criteria_type comm_div_selection_criteria optional,
+    Comm_div_ntfy_trigger_criteria_type comm_div_ntfy_trigger_criteria optional,
+    Comm_div_info_selection_criteria_type comm_div_info_selection_criteria optional,
+    record of anytype any_1 optional
+  }
+
+  type Comm_div_info_type Comm_div_info; 
+
+  type record of Diversion_reason_info_type Diversion_reason_info_types; 
+
+  type record Time_range_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.dateTime start_time,
+    XSDAUX.dateTime end_time
+  }
+
+  type record Diversion_reason_selection_criteria_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    Diversion_reason_info_types diversion_reason_info
+  }
+
+  type record User_info_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.string user_name optional,
+    XSDAUX.anyURI user_URI
+  }
+
+  type record Diversion_rule_info_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.string diversion_rule
+  }
+
+  type record Presence_status_info_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    XSDAUX.string presence_status
+  }
+
+  type enumerated Diversion_reason_info_type {int404(404),int486(486),int408(408),int302(302),int487(487),int480(480),int503(503)}; 
+
+  type record Comm_div_ntfy_info_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    User_info_type originating_user_info optional,
+    XSDAUX.anyURI diverting_user_info optional,
+    XSDAUX.anyURI diverted_to_user_info optional,
+    XSDAUX.dateTime diversion_time_info optional,
+    Diversion_reason_info_type diversion_reason_info optional,
+    Diversion_rule_info_type diversion_rule_info optional,
+    record of anytype any_1 optional
+  }
+
+  type record Presence_status_selection_criteria_type {
+    XSDAUX.anyAttributes anyAttributes optional,
+    record of Presence_status_info_type presence_status_info optional
+  }
+
+} /* end group CDIV */
+
+group ACR_CB{
+	
+	group mainACR_CB{
+		type record Outgoing_communication_barring {
+			Ruleset ruleset_ocb optional
+		}
+
+		type allow_action_type Allow_cb; 
+
+		type XSDAUX.booleanXSD allow_action_type; 
+
+		type record Incoming_communication_barring {
+			Ruleset ruleset_icb optional
+		}
+	}
+	
+	group importedXML_ietf{
+		type record RuleType {
+			XSDAUX.ID id,
+			ConditionsType conditions optional,
+			Allow_cb actions optional,
+			ExtensibleType transformations optional
+    	}
+    
+    	type record SphereType {
+			XSDAUX.string value_
+    	}
+    
+    	type record IdentityType {
+			record length (1 .. infinity) of union {
+				OneType one,
+				ManyType many
+			} choice
+    	}
+    
+    	type record Ruleset {
+			record of RuleType rule optional
+    	}
+    
+    	type record ValidityType {
+			record of record {
+				XSDAUX.dateTime from_,
+				XSDAUX.dateTime until
+			} choice
+    	}
+    
+    	type record ManyType {
+    		XSDAUX.string domain optional,
+    		record of union {
+				ExceptType except_,
+				record length (0 .. 1) of anytype any_1
+    		} choice
+    	}
+    
+    	type record OneType {
+			XSDAUX.string id,
+			XSDAUX.string scheme optional,
+			anytype any_1 optional
+    	}
+    
+    	type record ExtensibleType {
+			record of anytype any_1 optional
+    	}
+    
+    	type record ConditionsType {
+			record length (1 .. infinity) of union {
+				record length (0 .. 1) of IdentityType identity,
+				record length (0 .. 1) of SphereType sphere,
+				record length (0 .. 1) of ValidityType validity,
+				record length (0 .. 1) of record of anytype any_1
+			} choice
+    	}
+    
+    	type record ExceptType {
+			XSDAUX.string domain optional,
+			XSDAUX.string id optional,
+			XSDAUX.string scheme optional
+    	}
+	}
+	
+	group importedXML_oma{
+		type EmptyType other_identity; 
+
+		type record External_list {
+			record of AnchorType entry optional
+		}
+
+		type record EmptyType {
+		}
+
+		type EmptyType anonymous_request; 
+
+		type record AnchorType {
+			XSDAUX.anyURI anc optional,
+			XSDAUX.anyAttributes anyAttributes optional
+		}
+	}
+}// end group ACR/CB
+
+	// RFC 4826
+	group ResourceListTypes {
+      type record ExternalType {
+        XSDAUX.anyURI anchor optional,
+        XSDAUX.anyAttributes anyAttributes optional,
+        Display_nameType display_name optional,
+        record of anytype any_1 optional
+      }
+    
+      type record Entry_refType {
+        XSDAUX.anyURI ref,
+        XSDAUX.anyAttributes anyAttributes optional,
+        Display_nameType display_name optional,
+        record of anytype any_1 optional
+      }
+    
+      type record EntryType {
+        XSDAUX.anyURI uri,
+        XSDAUX.anyAttributes anyAttributes optional,
+        Display_nameType display_name optional,
+        record of anytype any_1 optional
+      }
+    
+      type record ListType {
+        XSDAUX.string name optional,
+        XSDAUX.anyAttributes anyAttributes optional,
+        Display_nameType display_name optional,
+        record of record {
+         	ListType list optional,
+          	ExternalType external_ optional,
+          	EntryType entry optional,
+          	Entry_refType entry_Ref optional
+        } seq_1 optional,
+        record of anytype any_1 optional
+      }
+    
+      type record Display_nameType {
+        XSDAUX.languageXSD lang optional,
+        XSDAUX.string content
+      }
+    
+      type record Resource_lists {
+        record of ListType list
+      }
+	} // end group RFC 4826
+	
+	// XSD
+	group IM_CN_subsystem {
+	  type record TIMS3GPP {
+        XSDAUX.decimal version,
+        XSDAUX.anyAttributes anyAttributes optional,
+        union {
+          TAlternativeService alternative_service,
+          XSDAUX.string service_info
+        } choice_1,
+        record of anytype any_1 optional
+      }
+    
+      type record TAction {
+        XSDAUX.anyAttributes anyAttributes optional,
+        record {
+        } emergency_registration optional,
+        record {
+        } call_waiting_indication optional,
+        record of anytype any_1 optional
+      }
+    
+      type TIMS3GPP Ims_3gpp; 
+    
+      type record TAlternativeService {
+        XSDAUX.anyAttributes anyAttributes optional,
+        TType type_,
+        XSDAUX.string reason,
+        TAction action_ optional,
+        record of anytype any_1 optional
+      }
+    
+      type record TType {
+        XSDAUX.anyAttributes anyAttributes optional,
+        record {
+        } emergency optional,
+        record of anytype any_1 optional
+      }	
+	}
+
+} /* end module LibSip_XMLTypes */
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/EchoPort.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/EchoPort.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/EchoPort.cpp	(revision 22)
@@ -0,0 +1,25 @@
+#include "EchoPort.h"
+using namespace t3devlib;
+
+EchoPort::EchoPort (PortId& id) :
+	Port (id)
+{ 
+}
+
+EchoPort::~EchoPort() 
+{
+}
+
+bool EchoPort::Map (const PortId& connected_port_id) 
+{ 
+  return true; 
+} 
+ 
+bool EchoPort::Unmap (const PortId& connected_port_id) 
+{ 
+  return true; 
+}
+
+bool EchoPort::Send (const ComponentId& from,const Bitstring& msg) {
+  return EnqueueMsg (from, msg); 
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/EchoPort.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/EchoPort.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/EchoPort.h	(revision 22)
@@ -0,0 +1,21 @@
+#ifndef EchoPort_h
+#define EchoPort_h
+
+#include <t3devlib/t3devlib.h>
+
+	
+class EchoPort : public t3devlib::Port
+{
+public:
+	EchoPort (t3devlib::PortId& id);
+	~EchoPort();
+		
+protected:
+	bool Map (const t3devlib::PortId& port_id);
+	bool Unmap (const t3devlib::PortId& port_id);
+	bool Send (const t3devlib::ComponentId& from, const t3devlib::Bitstring& msg);
+		
+};
+
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/Makefile
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/Makefile	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/Makefile	(revision 22)
@@ -0,0 +1,28 @@
+
+#T3DK_TTCN_SOURCES	= ../../ttcn/LibSip_SIPTypesAndValues.ttcn ../../ttcn/LibSip_SDPTypes.ttcn
+T3DK_TTCN_SOURCES	= $(wildcard ../*.ttcn)  $(wildcard *.ttcn)
+
+T3DK_ROOT_MODULE	= SipCodecTest_LoopbackTestControl
+
+T3DK_C_SOURCES		= 
+
+T3DK_CXX_SOURCES	= ../../c++/sip_codets.cpp ../../c++/sdp_codets.cpp $(wildcard *.cpp)
+
+T3DK_CDGEN_HEADER	= ../../c++/codec.h
+
+T3DK_CODETS		= ../../c++/sip_codets.cpp ../../c++/sdp_codets.cpp
+
+T3DK_LIBS		= -lboost_regex$(if $(shell uname -o | grep Cygwin),-gcc-mt,)
+
+CPPFLAGS		= -I. -I../../c++
+
+CC			= gcc
+
+CXX			= g++
+
+CFLAGS			= -ggdb 
+
+CXXFLAGS		= -ggdb
+
+include $(shell t3devkit-config --mk)
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/SipCodecTestGenerator.pl
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/SipCodecTestGenerator.pl	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/SipCodecTestGenerator.pl	(revision 22)
@@ -0,0 +1,882 @@
+#!/usr/bin/perl -w
+
+# TODO:
+#      Add comments
+#      File input/output 
+#      Improve parser so that it can accept any valid input, not only sanitized input
+
+# Usage:
+# cat compiledTypes.txt | SipCodecTestGenerator.pl
+
+use strict "vars";
+use Class::Struct;
+
+#--------------------------------------------------------------------------
+my $testcaseTemplate = "\ttestcase %s() runs on SipSimu {\n\n"
+    . "\t\t// Variables\n"
+    . "\t\ttimer t_ac := 3.0;\n\n"
+    . "\t\t// Test Body\n"
+    . "\t\tsipPort.send(%s);\n"
+    . "\t\tt_ac.start;\n"
+    . "\t\talt {\n"
+    . "\t\t\t[] sipPort.receive(%s) {\n"
+    . "\t\t\t\tsetverdict(pass);\n"
+    . "\t\t\t}\n"
+    . "\t\t\t[] t_ac.timeout {\n"
+    . "\t\t\t\tsetverdict(fail);\n"
+    . "\t\t\t}\n"
+    . "\t\t}\n"
+    . "\t}\n\n";
+
+my $templateModule = "SipCodecTest_LoopbackTemplates";
+my $testcaseModule = "SipCodecTest_LoopbackTestcases";
+my $controlModule = "SipCodecTest_LoopbackTestControl";
+my $systemModule = "TestSystem";
+my @typeModules = ("LibSip_SIPTypesAndValues", "LibSip_SDPTypes", "LibSip_XMLTypes");
+my $debug;# = 1;
+
+#--------------------------------------------------------------------------
+
+my %types;
+my @messages;
+my %defaultValues;
+my %templates;
+
+
+struct(Field, {type => '$', name => '$', optional => '$', constraints => '@'});
+struct(Type, {baseType => '$', type => '$', field => '@'});
+struct(Template, {text => '$', ref => '$', before => '$', after => '$'});
+
+#--------------------------------------------------------------------------
+
+sub initializeDefaultValues() {
+    %defaultValues = (
+		      'charstring'          		=> ['"a"', '"abcde"', '"abcdefghij"'],
+		      'integer'             		=> [1, 2, 3],
+		      'boolean'             		=> ["true", "false"],
+		      
+		      'Request payload'						=> ["omit"],
+		      'REGISTER_Request payload'	=> ["omit"],
+        	'INVITE_Request payload'		=> ["omit"],
+        	'OPTIONS_Request payload'		=> ["omit"],
+        	'BYE_Request payload'				=> ["omit"],
+        	'CANCEL_Request payload'		=> ["omit"],
+        	'ACK_Request payload'				=> ["omit"],
+        	'PRACK_Request payload'			=> ["omit"],
+        	'NOTIFY_Request payload'		=> ["omit"],
+        	'SUBSCRIBE_Request payload'	=> ["omit"],
+        	'PUBLISH_Request payload'		=> ["omit"],
+        	'UPDATE_Request payload'		=> ["omit"],
+        	'REFER_Request payload'			=> ["omit"],
+        	'MESSAGE_Request payload'		=> ["omit"],
+        	'INFO_Request payload'			=> ["omit"],
+        	'Response payload'					=> ["omit"], 
+		      
+		      'SipUrl scheme'       		=> ['"sip"'],
+		      'StatusLine sipVersion'		=> ['"SIP/2.0"'],	
+		      'RequestLine sipVersion'	=> ['"SIP/2.0"'],
+		      'ContactBody wildcard'		=> ['"*"'],
+		      'ContentType mediaType'		=> ['"application/sdp"'],
+		      'DeltaSec'								=> ['"1"', '"123456"', '"123456789"'],
+		      'PMediaAuthValue'					=> ['"DEAD"', '"BABE"', '"DEAF"', '"1EE7"'],	
+		      
+		      'SDP_Message protocol_version' 	=> [0],
+		      'SDP_Message uri' 							=> ['"test_uri@etsi.org"'],
+		      'SDP_contact addr_or_phone'			=> ['"test_email@etsi.org"', '"+33 4 - 9294 4200"'],
+		      'SDP_contact disp_name'					=> ['"John Smith"', '"Jane Doe"'],
+		      'SDP_typed_time unit'						=> ['"d"', '"h"', '"m"', '"s"'],
+		      'SDP_time_field start_time'			=> ['"1243951581"'],
+		      'SDP_time_field stop_time'			=> ['"1243951781"'],
+		      'SDP_timezone adjustment_time'	=> ['"42"', '"1241781"'],
+		      'SDP_Origin session_id'					=> ['"1"', '"2"', '"3"'],	
+		      'SDP_Origin session_version'		=> ['"1"', '"2"', '"3"'],
+		      'SDP_connection net_type'				=> ['"IN"'],
+		      'SDP_connection addr_type'			=> ['"IP4"'],
+		      'SDP_conn_addr addr'						=> ['"224.0.0.1"'],
+		      'SDP_key method'								=> ['"prompt"', '"clear"', '"base64"', '"uri"'],
+		      'SDP_attribute_curr statusType'	=> ['"e2e"', '"local"', '"remote"'],
+		      'SDP_attribute_des statusType'	=> ['"e2e"', '"local"', '"remote"'],
+		      'SDP_attribute_conf statusType'	=> ['"e2e"', '"local"', '"remote"'],
+      		'SDP_attribute_curr direction'	=> ['"none"', '"send"', '"recv"', '"sendrecv"'],
+      		'SDP_attribute_des direction'		=> ['"none"', '"send"', '"recv"', '"sendrecv"'],
+      		'SDP_attribute_conf direction'	=> ['"none"', '"send"', '"recv"', '"sendrecv"'],
+					'SDP_attribute_des strength' 		=> ['"mandatory"', '"optional"', '"none"', '"failure"', '"unknown"'].
+		      
+		      'UndefinedHeader headerName'		=> ['"az"', '"abcde"', '"abcdefghij"']
+		      );
+}
+
+
+sub processTypeFile($) {
+    my $typeFiles_ref = shift;
+    my @typeFiles;
+    my $file;
+    my $line;
+    my $BaseType;
+    my $Type;
+    
+    @typeFiles = @$typeFiles_ref;  
+    
+    foreach $file (@typeFiles) {
+	open(FILE, $file) or die "Unable to open file $file";
+	while(defined($line=<FILE>)) {
+	    if( # set of
+		$line=~ m/^\s*type\s+set of\s+(\S+)\s+(\S+)\s*[\{|;]\s*$/
+		or $line=~ m/^\s*type\s+set of\s+(\S+)\s+(\S+)\s*$/ ){
+		my @field;
+		
+		$BaseType = $1;
+		$Type = $2;
+		push (@field, new Field(type => $BaseType, optional => 1));
+		$types{$Type} = new Type(baseType => "set of", type => $Type, field => \@field);
+	    }
+	    elsif( # record of
+		   $line=~ m/^\s*type\s+record of\s+(\S+)\s+(\S+)\s*[\{|;]\s*$/ 
+		   or $line=~ m/^\s*type\s+record of\s+(\S+)\s+(\S+)\s*$/ ){
+		my @field;
+		
+		$BaseType = $1;
+		$Type = $2;
+		push (@field, new Field(type => $BaseType, optional => 1));
+		$types{$Type} = new Type(baseType => "record of", type => $Type, field => \@field);    
+	    }
+	    elsif( # port
+		   $line=~ m/^\s*type\s+port\s+(\S+)\s+message\s*[\{|;]\s*$/ 
+		   or $line=~ m/^\s*type\s+port\s+(\S+)\s+message\s*$/ ) {
+		my $loop=1;
+		while($loop==1 and defined($line=<FILE>)) {
+		    if($line=~ m/^\s*(in|out|inout)\s*$/) {
+			# do nothing
+		    }
+		    elsif($line=~ m/^\s*(\S*)\s*,\s*$/) {  
+			push(@messages, $1);    
+		    }
+		    elsif($line=~ m/^\s*(\S*)\s*$/) {  
+			push(@messages, $1);    
+			$loop=0;
+		    }
+		    else {
+			die("MISMATCH in port: $line");
+		    }
+		}
+	    }
+	    
+	    elsif( # standard type
+		   $line=~ m/^\s*type\s+(\S+)\s+(\S+)\s*[\{|;]\s*$/
+		   or $line=~ m/^\s*type\s+(\S+)\s+(\S+)\s*$/ ){    
+		$BaseType = $1;
+		$Type = $2;
+		if($BaseType eq "record" or $BaseType eq "set" or $BaseType eq "union") {
+		    my @field;
+		    my $loop=1;
+		    
+		    while($loop==1 and defined($line=<FILE>)) {       
+			my $optional;
+			
+			if($line=~ m/^\s*\{\s*$/) { 
+			    # do nothing
+			}
+			elsif($line=~ m/^\s*\}\s*$/) { 
+			    $loop=0;
+			}
+			elsif( # non-final field
+			       $line=~ m/^\s*(\S*)\s+(\w*)\s*(\(.*\))?\s*(\s+optional)?\s*,\s*$/) { 
+			    my @constraint;
+			    if(defined $3) { 
+				my $constraints = $3;
+				@constraint = split(/,/, substr($constraints, 1, length($constraints) - 2));
+			    }
+			    if(defined $4) {
+				$optional = 1;
+			    }
+			    else {
+				$optional = 0;
+			    }
+			    push (@field, new Field(type => $1, name => $2, optional => $optional, constraints => \@constraint));
+			}
+			elsif( # final field
+			       $line=~ m/^\s*(\S*)\s+(\w*)\s*(\(.*\))?\s*(\s+optional)?\s*$/) {  
+			    my @constraint;
+			    if(defined $3) {
+				my $constraints = $3;
+				@constraint = split(/,/, substr($constraints, 1, length($constraints) - 2));
+			    }
+			    if(defined $4) {
+				$optional = 1;
+			    }
+			    else {
+				$optional = 0;
+			    }
+			    push (@field, new Field(type => $1, name => $2, optional => $optional, constraints => \@constraint));
+			    $loop=0;
+			}
+			else {
+			    die("MISMATCH in record $Type: $line");
+			}
+		    }
+		    $types{$Type} = new Type(baseType => $BaseType, type => $Type, field => \@field);
+		}
+		elsif($BaseType eq "charstring") {
+		    $types{$Type} = new Type(baseType => $BaseType, type => $Type);
+		}
+		elsif($BaseType eq "integer") {
+		    $types{$Type} = new Type(baseType => $BaseType, type => $Type);
+		}
+		elsif($BaseType eq "enumerated") {
+		    my @field;
+		    my $loop = 1;
+		    
+		    while($loop==1 and defined($line=<FILE>)) {                
+			if($line=~ m/^\s*\{\s*$/) { 
+			    # do nothing
+			}
+			elsif($line=~ m/^\s*\}\s*$/) { 
+			    $loop=0;
+			}
+			elsif($line=~ m/^\s*(\S*)\s*,\s*$/) { 
+			    push (@field, $1);
+			}
+			elsif($line=~ m/^\s*(\S*)\s*$/) {  
+			    push (@field, $1);
+			    $loop=0;
+			}
+			else {
+			    die("MISMATCH in record $Type: $line");
+			}
+		    }
+		    $types{$Type} = new Type(baseType => $BaseType, type => $Type, field => \@field);
+		}
+		elsif($BaseType eq "boolean") {
+		    $types{$Type} = new Type(baseType => $BaseType, type => $Type);
+		}
+		else {
+		    $types{$Type} = new Type(baseType => $BaseType, type => $Type);
+		}
+	    }    
+	}
+	close FILE;
+    }
+}
+
+sub createTemplatesFromRecord($) {
+    my $type = shift;
+    
+    print "createTemplatesFromRecord\n" if defined $debug;
+    
+    bless($type, 'Type');
+    helper_createTemplatesFromRecord($type, "all");
+    helper_createTemplatesFromRecord($type, "none");
+    helper_createTemplatesFromRecord($type, "random");
+}
+
+
+sub helper_createTemplatesFromRecord($ $) {
+    my $type = shift;
+    my $optionalStrategy = shift;
+    my $baseTemplateIndex;
+    my @fields_;
+    my $field;
+    my $fieldIndex;
+
+    print "helper_createTemplatesFromRecord\n" if defined $debug;
+    
+    bless($type, 'Type');
+    
+    if(defined $templates{$type->type}) {
+	$baseTemplateIndex = scalar @{$templates{$type->type}};
+    }
+    else {
+	$baseTemplateIndex = 0;
+    }
+    ${$templates{$type->type}}[$baseTemplateIndex] = new Template(text => "{\n");
+    
+    @fields_ = @{$type->field};
+    for($fieldIndex=0; $fieldIndex < scalar @fields_;) { # incremented while inserting comma !
+	my $fieldType;
+	my $fieldTypeName;
+	my $comma;
+
+	$field = $fields_[$fieldIndex];
+	$comma = (++$fieldIndex == scalar @fields_) ? "" : ",";
+	
+	bless($field, 'Field');
+	$fieldTypeName = $field->type;
+	
+	if(
+	   ($optionalStrategy eq "all")
+	   or (($optionalStrategy eq "none" or $optionalStrategy eq "random") and $field->optional == 0)
+	   or ($optionalStrategy eq "random" and $field->optional == 1 and round(rand()) == 1)) {
+
+	    if((scalar @{$field->constraints} > 0)
+	       or $fieldTypeName eq "charstring" 
+	       or $fieldTypeName eq "integer" 
+	       or $fieldTypeName eq "boolean") {
+		# Terminal field
+		# Derive all possible values
+		
+		my $vals_ref;
+		my @vals = [];
+		my $i;
+		my $before;
+		my $after;
+		
+		if(scalar @{$field->constraints} > 0) {
+		    $vals_ref = $field->constraints;
+		}
+		else {
+		    $vals_ref = $defaultValues{$type->type . ' ' . $field->name};
+		    $vals_ref = $defaultValues{$fieldTypeName} unless defined $vals_ref;
+		    die("Undefined default values for $fieldTypeName") unless defined $vals_ref;
+		}
+		@vals = @$vals_ref;
+		
+		$before = length ${$templates{$type->type}}[$baseTemplateIndex]->text;
+		
+		${$templates{$type->type}}[$baseTemplateIndex]->text(${$templates{$type->type}}[$baseTemplateIndex]->text 
+								     . "\t" . $field->name . ' := ' . $vals[0] . "$comma \n");
+
+		$after = length ${$templates{$type->type}}[$baseTemplateIndex]->text;
+		
+		## Derive all values
+		for($i=1; $i < scalar @vals; $i++) {        
+		    push(@{$templates{$type->type}}, new Template(  text => "\t" . $field->name . ' := ' . $vals[$i] . "$comma \n",
+								    ref => $baseTemplateIndex,
+								    before => $before,
+								    after => $after));
+		}      
+	    }
+	    else { 
+		# Templatable field      
+		
+		my $vals_ref;
+
+		$fieldType = $types{$fieldTypeName};
+		die("Undefined type $fieldTypeName") unless defined($fieldType);
+		
+		$vals_ref = $defaultValues{$type->type . ' ' . $field->name};
+		$vals_ref = $defaultValues{$fieldTypeName} unless defined $vals_ref;
+		if(defined $vals_ref) {
+
+		    my @vals = [];
+		    my $i;
+		    my $before;
+		    my $after;
+		    
+		    @vals = @$vals_ref;
+		    
+		    # override with default values
+		    $before = length ${$templates{$type->type}}[$baseTemplateIndex]->text;
+		    
+		    ${$templates{$type->type}}[$baseTemplateIndex]->text(${$templates{$type->type}}[$baseTemplateIndex]->text 
+									 . "\t" . $field->name . ' := ' . $vals[0] . "$comma \n");
+		    
+		    $after = length ${$templates{$type->type}}[$baseTemplateIndex]->text;
+		    
+		    ## Derive all values
+		    for($i=1; $i < scalar @vals; $i++) {        
+			push(@{$templates{$type->type}}, new Template(  text => "\t" . $field->name . ' := ' . $vals[$i] . "$comma \n",
+									ref => $baseTemplateIndex,
+									before => $before,
+									after => $after));
+		    } 
+		}
+		else {
+		    if(defined $templates{$fieldTypeName}) {
+			# Sub-template has already been defined and derived.
+			# Use template 0.        
+			${$templates{$type->type}}[$baseTemplateIndex]->text(${$templates{$type->type}}[$baseTemplateIndex]->text 
+									     . "\t" . $field->name . ' := m_' . lcfirst($fieldTypeName) . "_0$comma \n"); 
+		    }
+		    else {    
+			# Sub-template not yet defined. 
+			# Use all template versions.
+			my $before;
+			my $after;
+			my $i;
+			
+			createTemplatesFromType($fieldType);
+			die "Undefined templates for $fieldTypeName" unless defined $templates{$fieldTypeName};
+			
+			$before = length ${$templates{$type->type}}[$baseTemplateIndex]->text;
+		    
+			${$templates{$type->type}}[$baseTemplateIndex]->text(${$templates{$type->type}}[$baseTemplateIndex]->text 
+									     . "\t" . $field->name . ' := m_' . lcfirst($fieldTypeName) . "_0$comma \n");  
+		    
+			$after = length ${$templates{$type->type}}[$baseTemplateIndex]->text;
+			
+			# Derive all template versions          
+			for($i=1; $i < scalar @{$templates{$fieldTypeName}}; $i++) {
+			    push(@{$templates{$type->type}}, new Template(  text => "\t" . $field->name . ' := m_' . lcfirst($fieldTypeName) . "_" . $i . "$comma \n",
+									    ref => $baseTemplateIndex,
+									    before => $before,
+									    after => $after));  
+			}    
+		    }
+		}      
+	    }
+	}
+	else {
+	    ${$templates{$type->type}}[$baseTemplateIndex]->text(${$templates{$type->type}}[$baseTemplateIndex]->text 
+								 . "\t" . $field->name . " := omit$comma \n");  
+	}
+    }   
+    
+    ${$templates{$type->type}}[$baseTemplateIndex]->text(${$templates{$type->type}}[$baseTemplateIndex]->text . "};\n");
+}
+
+sub createTemplatesFromSet($) {
+    my $type = shift;
+    
+    createTemplatesFromRecord($type);
+}
+
+sub createTemplatesFromRecordOf($) {
+    my $type = shift;
+    my $i;
+    my @fields_;
+    my $field;
+    my $fieldTypeName;
+    my $comma;
+
+    print "createTemplatesFromRecordOf\n" if defined $debug;
+    
+    bless($type, 'Type');
+
+    ${$templates{$type->type}}[0] = new Template(text => "{\n");
+
+    @fields_ = @{$type->field};
+    $field = $fields_[0];
+    bless($field, 'Field');
+    $fieldTypeName = $field->type;
+
+    if(defined $templates{$fieldTypeName}) {
+	${$templates{$type->type}}[0]->text(${$templates{$type->type}}[0]->text 
+					    . "\t" . 'm_' . lcfirst($fieldTypeName) . "_0\n");  
+	
+    }
+    else {
+	if($fieldTypeName eq "charstring" 
+	   or $fieldTypeName eq "integer" 
+	   or $fieldTypeName eq "boolean") {
+	    # Terminal field
+	    # Derive all possible values
+	    
+	    my $vals_ref;
+	    my @vals = [];
+	    my $i;
+
+	    $vals_ref = $defaultValues{$type->type . ' ' . $fieldTypeName};
+	    $vals_ref = $defaultValues{$fieldTypeName} unless defined $vals_ref;
+	    die("Undefined default values for $fieldTypeName") unless defined $vals_ref;
+
+	    @vals = @$vals_ref;
+	    
+	    ## Derive all values
+	    for($i=0; $i < scalar @vals; $i++) {        
+		$comma = ($i+1 == scalar @vals) ? "" : ",";
+		${$templates{$type->type}}[0]->text(${$templates{$type->type}}[0]->text 
+						    . "\t" . $vals[$i] . "$comma \n");
+	    }      
+	}
+	else {
+	    # Templatable field      
+
+	    createTemplatesFromType($types{$fieldTypeName});
+	    die "Undefined templates for $fieldTypeName" unless defined $templates{$fieldTypeName};
+	    
+	    # Derive all template versions          
+	    for($i=0; $i < scalar @{$templates{$fieldTypeName}}; $i++) {
+		$comma = ($i+1 == scalar @{$templates{$fieldTypeName}}) ? "" : ",";
+		${$templates{$type->type}}[0]->text(${$templates{$type->type}}[0]->text 
+						    . "\t" . 'm_' . lcfirst($fieldTypeName) . "_" . $i . "$comma \n");  
+	    }
+	}
+    }
+    
+    ${$templates{$type->type}}[0]->text(${$templates{$type->type}}[0]->text . "};\n");
+}  
+
+sub createTemplatesFromSetOf($) {
+    my $type = shift;
+    my $i;
+    my @fields_;
+    my $field;
+    my $fieldTypeName;
+    my $comma;
+    
+    print "createTemplatesFromSetOf\n" if defined $debug;
+    
+    bless($type, 'Type');
+
+    ${$templates{$type->type}}[0] = new Template(text => "{\n");
+
+    @fields_ = @{$type->field};
+    $field = $fields_[0];
+    bless($field, 'Field');
+    $fieldTypeName = $field->type;
+
+    if(defined $templates{$fieldTypeName}) {
+	${$templates{$type->type}}[0]->text(${$templates{$type->type}}[0]->text 
+					    . "\t" . 'm_' . lcfirst($fieldTypeName) . "_0\n");  
+	
+    }
+    else {
+	if($fieldTypeName eq "charstring" 
+	   or $fieldTypeName eq "integer" 
+	   or $fieldTypeName eq "boolean") {
+	    # Terminal field
+	    # Derive all possible values
+	    
+	    my $vals_ref;
+	    my @vals = [];
+	    my $i;
+	    
+	    $vals_ref = $defaultValues{$type->type . ' ' . $fieldTypeName};
+	    $vals_ref = $defaultValues{$fieldTypeName} unless defined $vals_ref;
+	    die("Undefined default values for $fieldTypeName") unless defined $vals_ref;
+
+	    @vals = @$vals_ref;
+	    
+	    ## Derive all values
+	    for($i=0; $i < scalar @vals; $i++) {        
+		$comma = ($i+1 == scalar @vals) ? "" : ",";
+		${$templates{$type->type}}[0]->text(${$templates{$type->type}}[0]->text 
+						    . "\t" . $vals[$i] . "$comma \n");
+	    }      
+	}
+	else {
+	    # Templatable field      
+
+	    createTemplatesFromType($types{$fieldTypeName});
+	    die "Undefined templates for $fieldTypeName" unless defined $templates{$fieldTypeName};
+	    
+	    # Derive all template versions          
+	    for($i=0; $i < scalar @{$templates{$fieldTypeName}}; $i++) {
+		$comma = ($i+1 == scalar @{$templates{$fieldTypeName}}) ? "" : ",";
+		${$templates{$type->type}}[0]->text(${$templates{$type->type}}[0]->text 
+						    . "\t" . 'm_' . lcfirst($fieldTypeName) . "_" . $i . "$comma \n");  
+	    }
+	}
+    }
+    
+    ${$templates{$type->type}}[0]->text(${$templates{$type->type}}[0]->text . "};\n");
+}   
+
+sub createTemplatesFromUnion($) {
+    my $type = shift;
+    my @fields_;
+    my $field;
+
+    print "createTemplatesFromUnion\n" if defined $debug;
+    
+    bless($type, 'Type');
+
+    @fields_ = @{$type->field};
+    foreach $field (@fields_) {
+	my $fieldType;
+	my $fieldTypeName;
+	
+	bless($field, 'Field');
+	$fieldTypeName = $field->type;
+	
+	if((scalar @{$field->constraints} > 0)
+	   or $fieldTypeName eq "charstring" 
+	   or $fieldTypeName eq "integer" 
+	   or $fieldTypeName eq "boolean") {
+	    # Terminal field
+	    # Derive all possible values
+	    
+	    my $vals_ref;
+	    my @vals = [];
+	    my $i;
+
+	    if(scalar @{$field->constraints} > 0) {
+		$vals_ref = $field->constraints;
+	    }
+	    else {
+		$vals_ref = $defaultValues{$type->type . ' ' . $field->name};
+		$vals_ref = $defaultValues{$fieldTypeName} unless defined $vals_ref;
+		die("Undefined default values for $fieldTypeName") unless defined $vals_ref;
+	    }
+	    @vals = @$vals_ref;
+	    
+	    ## Derive all values
+	    for($i=0; $i < scalar @vals; $i++) {        
+		push(@{$templates{$type->type}}, new Template(  text => "{\n\t" . $field->name . ' := ' . $vals[$i] . "\n}\n"));
+	    }      
+	}
+	else { 
+	    # Templatable field      
+	    
+	    $fieldType = $types{$fieldTypeName};
+	    die("Undefined type $fieldTypeName") unless defined($fieldType);
+	    
+	    if(defined $templates{$fieldTypeName}) {
+		# Sub-template has already been defined and derived.
+		# Use template 0.        
+		push(@{$templates{$type->type}}, new Template(  text => "{\n\t" . $field->name . ' := m_' . lcfirst($fieldTypeName) . "_0\n}\n")); 
+	    }
+	    else {    
+		# Sub-template not yet defined. 
+		# Use all template versions.
+		my $i;
+		
+		createTemplatesFromType($fieldType);
+		die "Undefined templates for $fieldTypeName" unless defined $templates{$fieldTypeName};
+		
+		# Derive all template versions          
+		for($i=0; $i < scalar @{$templates{$fieldTypeName}}; $i++) {
+		    push(@{$templates{$type->type}}, new Template(  text => "{\n\t" . $field->name . ' := m_' . lcfirst($fieldTypeName) . "_" . $i . "\n}\n")); 
+		}    
+	    }      
+	}
+    }   
+} 
+
+sub createTemplatesFromEnum($) {
+    my $type = shift;
+    my $vals_ref;
+    my @vals = [];
+    my $i;    
+    
+    print "createTemplatesFromEnum\n" if defined $debug;
+    
+    bless($type, 'Type');
+
+    $vals_ref = $type->field;
+    $vals_ref = $defaultValues{$type->type} unless defined $vals_ref;
+    die("Undefined default values for " . $type->type) unless defined $vals_ref;
+
+    @vals = @$vals_ref;
+    
+    ## Derive all values
+    for($i=0; $i < scalar @vals; $i++) {        
+	push(@{$templates{$type->type}}, new Template(  text => $vals[$i] . ";\n"));
+    }      
+} 
+
+sub createTemplatesFromAlias($) {
+    my $type = shift;
+    my $baseTypeName;
+    my $baseType;
+    
+    print "createTemplatesFromAlias\n" if defined $debug;
+    
+    bless($type, 'Type');
+
+    $baseTypeName = $type->baseType;
+    
+    if($baseTypeName eq "charstring" 
+       or $baseTypeName eq "integer" 
+       or $baseTypeName eq "boolean") {
+	# Terminal field
+	# Derive all possible values
+	
+	my $vals_ref;
+	my @vals = [];
+	my $i;
+
+	$vals_ref = $defaultValues{$type->type};
+	$vals_ref = $defaultValues{$baseTypeName} unless defined $vals_ref;
+	die("Undefined default values for $baseTypeName") unless defined $vals_ref;
+	@vals = @$vals_ref;
+	
+	push(@{$templates{$type->type}}, new Template( text => $vals[0] . ";\n"));
+	
+	## Derive all values
+	for($i=1; $i < scalar @vals; $i++) {        
+	    push(@{$templates{$type->type}}, new Template(  text => $vals[$i] . ";\n"));
+	} 
+    }     
+    else {  
+	$baseType = $types{$baseTypeName};    
+	die("Undefined type $baseTypeName") unless defined($baseType);
+	
+	if(defined $templates{$baseTypeName}) {
+	    # Sub-template has already been defined and derived.
+	    # Use template 0.        
+	    push(@{$templates{$type->type}}, new Template( text => 'm_' . lcfirst($baseTypeName) . "_0;\n")); 
+	}
+	else {    
+	    # Sub-template not yet defined. 
+	    # Use all template versions.
+	    my $i;
+	    
+	    createTemplatesFromType($baseType);
+	    die "Undefined templates for $baseTypeName" unless defined $templates{$baseTypeName};
+	    
+	    push(@{$templates{$type->type}}, new Template( text => 'm_' . lcfirst($baseTypeName) . "_0;\n")); 
+	    
+	    # Derive all template versions          
+	    for($i=1; $i < scalar @{$templates{$baseTypeName}}; $i++) {
+		push(@{$templates{$type->type}}, new Template(  text => 'm_' . lcfirst($baseTypeName) . "_" .$i . ";\n"));  
+	    }  
+	}  
+    }      
+} 
+
+sub createTemplatesFromType($) {
+    my $type = shift;
+    
+    print "createTemplatesFromType\n" if defined $debug;
+    
+    bless($type, 'Type');
+    
+    if($type->baseType eq "record") {
+	createTemplatesFromRecord($type);
+    }
+    elsif($type->baseType eq "set") {
+	createTemplatesFromSet($type);
+    }
+    elsif($type->baseType eq "record of") {
+	createTemplatesFromRecordOf($type);
+    }
+    elsif($type->baseType eq "set of") {
+	createTemplatesFromSetOf($type);
+    }
+    elsif($type->baseType eq "union") {
+	createTemplatesFromUnion($type);
+    } 
+    elsif($type->baseType eq "enumerated") {
+	createTemplatesFromEnum($type);
+    } 
+    else {
+	#Alias
+	createTemplatesFromAlias($type);
+    }
+}
+
+sub createTemplates() {
+    my $message;
+    
+    print "createTemplates\n" if defined $debug;
+    
+    foreach $message (@messages) {
+	my $type;
+	
+	$type = $types{$message};
+	die("Undefined message $message") unless defined($type);
+	
+	createTemplatesFromType($type);
+    }
+}
+
+sub printTemplates($ $) {
+    my $module = shift;
+    my $imported = shift;
+    my @imports;
+    my $key;
+    my $i;
+    
+    @imports = @$imported;
+
+    open(FILE, ">" . $module . ".ttcn") or die "Unable to open file ${module}.ttcn";
+    print FILE "module $module {\n\n";
+    foreach $imported (@imports) {
+	print FILE "\timport from $imported all;\n";
+    }
+    print FILE "\n";
+    foreach $key (keys %templates) {
+	my @templates_array = @{$templates{$key}};
+	
+	for($i=0; $i < scalar @templates_array; $i++) {
+	    my $parentRef;
+
+	    $parentRef = $templates_array[$i]->ref;
+	    $parentRef = 0 unless defined $parentRef;
+	    print FILE "template $key m_" . lcfirst(${key}) . "_$i := ";
+	    print FILE substr($templates_array[$parentRef]->text, 0, $templates_array[$i]->before) if defined $templates_array[$i]->before;
+	    print FILE $templates_array[$i]->text;
+	    print FILE substr($templates_array[$parentRef]->text, $templates_array[$i]->after) if defined $templates_array[$i]->after;
+	    print FILE "\n";
+	}
+    }
+    print FILE "} // end module\n";
+    close FILE;
+}
+
+sub printTestcases($ $) {
+    my $module = shift;
+    my $imported = shift;
+    my @imports;
+    my $message;
+    my $i;
+    
+    @imports = @$imported;
+
+    open(FILE, ">" . $module . ".ttcn") or die "Unable to open file ${module}.ttcn";
+    print FILE "module $module {\n\n";
+    foreach $imported (@imports) {
+	print FILE "import from $imported all;\n";
+    }
+    print FILE "\n";
+    foreach $message (@messages) {
+	my @templates_array = @{$templates{$message}};
+	
+	for($i=0; $i < scalar @templates_array; $i++) {
+	    my $testcaseName = "TC_LOOPBACK_" . uc($message) . "_" . $i;
+	    my $templateName = "m_" . lcfirst($message) . "_" . $i;
+
+	    printf FILE $testcaseTemplate, $testcaseName, $templateName, $templateName;
+	}
+    }
+    print FILE "} // end module\n";
+    close FILE;
+}
+
+sub printControl($ $) {
+    my $module = shift;
+    my $imported = shift;
+    my @imports;
+    my $message;
+    my $i;
+    
+    @imports = @$imported;
+
+    open(FILE, ">" . $module . ".ttcn") or die "Unable to open file ${module}.ttcn";
+    print FILE "module $module {\n\n";
+    foreach $imported (@imports) {
+	print FILE "import from $imported all;\n";
+    }
+    print FILE "\n";
+    print FILE "control {\n";
+    foreach $message (@messages) {
+	my @templates_array = @{$templates{$message}};
+	
+	for($i=0; $i < scalar @templates_array; $i++) {
+	    my $testcaseName = "TC_LOOPBACK_" . uc($message) . "_" . $i;
+
+	    print FILE "\texecute(${testcaseName}());\n";
+	}
+    }
+    print FILE "}\n";
+    print FILE "} // end module\n";
+    close FILE;
+}
+
+sub round($) {
+    my $number = shift;
+    return int($number + .5 * ($number <=> 0));
+}
+
+# MAIN
+my @imports;
+
+initializeDefaultValues(); 
+
+@imports = ("compiledTypes.txt");
+processTypeFile(\@imports); #TODO ideally would be: \@typeModules
+
+# Create templates !
+createTemplates();
+
+# save template file
+printTemplates($templateModule, \@typeModules);
+
+# save testcase file
+@imports = ($systemModule, $templateModule);
+printTestcases($testcaseModule, \@imports);
+
+# save control file
+@imports = ($testcaseModule);
+printControl($controlModule, \@imports);
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/compiledTypes.txt
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/compiledTypes.txt	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/compiledTypes.txt	(revision 22)
@@ -0,0 +1,1323 @@
+      type enumerated FieldName
+      {
+        ACCEPT_E,
+        ACCEPT_ENCODING_E,
+        ACCEPT_LANGUAGE_E,
+        ALERT_INFO_E,
+        ALLOW_E,
+        AUTHENTICATION_INFO_E,
+        AUTHORIZATION_E,
+        CALL_ID_E,
+        CALL_INFO_E,
+        CONTACT_E,
+        CONTENT_DISPOSITION_E,
+        CONTENT_ENCODING_E,
+        CONTENT_LANGUAGE_E,
+        CONTENT_LENGTH_E,
+        CONTENT_TYPE_E,
+        CSEQ_E,
+        DATE_E,
+        ERROR_INFO_E,
+        EXPIRES_E,
+        FROM_E,
+        IN_REPLY_TO_E,
+        MAX_FORWARDS_E,
+        MIME_VERSION_E,
+        MIN_EXPIRES_E,
+        ORGANIZATION_E,
+        PRIORITY_E,
+        PROXY_AUTHENTICATE_E,
+        PROXY_AUTHORIZATION_E,
+        PROXY_REQUIRE_E,
+        RECORD_ROUTE_E,
+        REPLY_TO_E,
+        REQUIRE_E,
+        RETRY_AFTER_E,
+        ROUTE_E,
+        SERVER_E,
+        SUBJECT_E,
+        SUPPORTED_E,
+        TIMESTAMP_E,
+        TO_E,
+        UNSUPPORTED_E,
+        USER_AGENT_E,
+        VIA_E,
+        WARNING_E,
+        WWW_AUTHENTICATE_E,
+		RACK_E,
+		RSEQ_E,
+		ALLOW_EVENTS_E,
+		EVENT_E,
+		SUBSCRIPTION_STATE_E,
+		P_MEDIA_AUTHORIZATION_E,
+		PRIVACY_E,
+		P_ASSERTED_ID_E,
+		P_PREFERRED_ID_E, 
+		REASON_E,
+		REFER_TO_E,
+		REFERRED_BY_E,
+		HISTORY_INFO_E,
+		P_MEDIA_AUTH_E,
+		PATH_E,	
+		SECURITY_CLIENT_E,	
+		SECURITY_SERVER_E,
+		SECURITY_VERIFY_E,  
+		P_ACCESS_NETWORK_INFO_E,
+		P_ASSOCIATED_URI_E,
+		P_CALLED_PARTY_E,
+		P_CHARGING_FUNCTION_ADDRESSES_E,
+		P_CHARGING_VECTOR_E,
+		P_VISITED_NETWORK_E,
+		SERVICE_ROUTE_E,
+		ACCEPT_CONTACT_E,
+		MIN_SE_E,
+		SESSION_EXPIRES_E,
+		P_ASSERTED_SERVICE_E,
+		P_EARLY_MEDIA_E
+      }
+
+	  type enumerated Method {
+		  ACK_E,
+		  BYE_E,
+		  CANCEL_E,
+		  INVITE_E,
+		  OPTIONS_E,
+		  REGISTER_E,
+		  PRACK_E, 
+		  SUBSCRIBE_E, 
+		  NOTIFY_E, 
+		  PUBLISH_E, 
+		  REFER_E, 
+		  UPDATE_E,
+		  MESSAGE_E,
+		  INFO_E
+		  }
+	        
+      type record GenericParam
+      {
+        charstring                 id,
+        charstring                paramValue optional
+      }
+      
+      type set of GenericParam SemicolonParam_List;
+      
+      type set of GenericParam AmpersandParam_List;
+      
+      type set of GenericParam CommaParam_List;
+      
+      type record HostPort
+      {
+        charstring             host optional,    
+        integer                portField optional
+      }
+      
+      type record UserInfo
+      {
+        charstring	       userOrTelephoneSubscriber,
+        charstring	       password optional
+      }
+      
+      type record SipUrl
+      {
+        charstring		scheme,
+        UserInfo		userInfo optional,
+        HostPort		hostPort optional,
+        SemicolonParam_List	urlParameters optional,
+        AmpersandParam_List	headers optional
+      }
+      
+      type record AcceptBody
+      {
+        charstring 		mediaRange,
+        SemicolonParam_List	acceptParam optional
+      }
+      
+      type set of AcceptBody AcceptBody_List;
+      
+      type record AlertInfoBody
+      {
+        charstring			url,
+        SemicolonParam_List	genericParams optional
+      }
+      
+      type set of AlertInfoBody AlertInfoBody_List;
+      
+      type charstring CallidString; 
+      
+      type set of CallidString CallidString_List;
+      
+      type record CallInfoBody
+      {
+        charstring	 		url,
+        SemicolonParam_List		infoParams optional
+      }
+      
+      type set of CallInfoBody CallInfoBody_List;
+      
+      type union Challenge
+      {
+        CommaParam_List digestCln,
+        OtherAuth	otherChallenge
+      }
+      
+      type record NameAddr
+      {
+        charstring	displayName optional,
+        SipUrl		addrSpec
+      }
+      
+      type union Addr_Union
+      {
+        NameAddr	nameAddr,
+        SipUrl		addrSpecUnion
+      }
+      
+      type record ContactAddress
+      {
+        Addr_Union 		addressField,
+        SemicolonParam_List	contactParams optional
+      }
+      
+      type set of ContactAddress ContactAddress_List; 
+      
+      type union ContactBody
+      {
+        charstring		wildcard,
+        ContactAddress_List	contactAddresses
+      }
+      
+      type charstring ContentCoding;
+      
+      type set of ContentCoding ContentCoding_List;
+      
+      type union Credentials
+      {
+        CommaParam_List	digestResponse,
+        OtherAuth  	    otherResponse
+      }
+      
+      type charstring	DeltaSec;	      
+
+      type record ErrorInfoBody
+      {
+        charstring			uri,		
+        SemicolonParam_List		genericParams optional
+      }
+      
+      type set of ErrorInfoBody ErrorInfoBody_List;
+      
+       type record LanguageBody
+      {
+        charstring 		languageRange,
+        SemicolonParam_List	acceptParam optional
+      }
+      
+      type set of LanguageBody LanguageBody_List;
+      
+       type charstring LanguageTag;
+      
+      type set of LanguageTag LanguageTag_List;
+      
+       type set of charstring Method_List;
+      
+      type charstring OptionTag;
+      
+      type set of OptionTag OptionTag_List;
+      
+      
+      type record OtherAuth
+      {
+        charstring		authScheme,
+        CommaParam_List	authParams
+      }
+      
+      type record Payload
+      {
+        integer		payloadlength,
+        charstring 		payloadvalue
+      }
+      
+      type record RouteBody
+      {
+        NameAddr			nameAddr,
+        SemicolonParam_List	rrParam optional
+      }
+      
+      type record of RouteBody RouteBody_List;
+      
+      type record SentProtocol
+      {
+        charstring		protocolName,
+        charstring		protocolVersion,
+        charstring		transport
+      }
+      
+      type charstring ServerVal;
+      
+      type set of ServerVal ServerVal_List;
+      
+      type record TimeValue
+      {
+        integer			majorDigit,		
+        integer			minorDigit optional	
+      }
+      
+      type record ViaBody
+      {
+        SentProtocol	sentProtocol,
+        HostPort		sentBy,
+        SemicolonParam_List	viaParams optional
+      }
+      
+      type record of ViaBody ViaBody_List;
+      
+      type union WarnAgent
+      {
+        HostPort		hostPort,
+        charstring		pseudonym
+      }
+      
+      type record WarningValue
+      {
+        integer		warnCode,	
+        WarnAgent		warnAgent,
+        charstring		WarnText
+      }
+      
+      type set of WarningValue WarningValue_List;
+
+	  type Addr_Union PAssertedIDValue;
+      
+	  type record of PAssertedIDValue PAssertedIDValue_List;
+
+	  type charstring PAssertedServiceValue;
+
+	  type Addr_Union PPreferredIDValue;
+      
+	  type record of PPreferredIDValue PPreferredIDValue_List;
+
+	  type charstring PrivacyValue;
+      
+	  type record of PrivacyValue PrivacyValue_List;
+
+      type record Accept
+      {
+        FieldName		fieldName (ACCEPT_E),
+        AcceptBody_List	        acceptArgs optional
+      }
+
+      type record AcceptEncoding
+      {
+        FieldName		fieldName (ACCEPT_ENCODING_E),
+        ContentCoding_List	contentCoding optional
+      }
+
+      type record AcceptLanguage
+      {
+        FieldName		fieldName (ACCEPT_LANGUAGE_E),
+        LanguageBody_List	languageBody optional
+      }
+
+      type record AlertInfo
+      {
+        FieldName		fieldName (ALERT_INFO_E),
+        AlertInfoBody_List	alertInfoBody optional
+      }
+      
+      type record Allow
+      {
+        FieldName		fieldName (ALLOW_E),
+        Method_List		methods optional
+      }
+      
+      type record AuthenticationInfo
+      {
+        FieldName		fieldName (AUTHENTICATION_INFO_E),
+        CommaParam_List	ainfo
+      }
+      
+      type record Authorization
+      {
+        FieldName		fieldName (AUTHORIZATION_E),
+        Credentials		body
+      }
+      
+      type record CallId
+      {
+        FieldName		fieldName (CALL_ID_E),
+        CallidString       	callid
+      }
+      
+      type record CallInfo
+      {
+        FieldName		fieldName (CALL_INFO_E),
+        CallInfoBody_List	callInfoBody optional
+      }
+      
+      type record Contact
+      {
+        FieldName		fieldName (CONTACT_E),
+        ContactBody		contactBody
+      }
+      
+      type record ContentDisposition
+      {
+        FieldName		fieldName (CONTENT_DISPOSITION_E),
+        charstring		dispositionType,
+        SemicolonParam_List	dispositionParams optional
+      }
+      
+      type record ContentEncoding
+      {
+        FieldName		fieldName (CONTENT_ENCODING_E),
+        ContentCoding_List	contentCoding
+      }
+      
+      type record ContentLanguage
+      {
+        FieldName		fieldName (CONTENT_LANGUAGE_E),
+        LanguageTag_List	languageTag
+      }
+      
+      type record ContentLength
+      {
+        FieldName		fieldName (CONTENT_LENGTH_E),
+        integer		len	
+      }
+      
+      type record ContentType
+      {
+        FieldName		fieldName (CONTENT_TYPE_E),
+        charstring		mediaType
+      }
+      
+      type record CSeq
+      {
+        FieldName		fieldName (CSEQ_E),
+        integer		seqNumber,	
+        charstring   	method
+      }
+      
+      type record Date
+      {
+        FieldName		fieldName (DATE_E),
+        charstring		sipDate
+      }
+      
+      type record ErrorInfo
+      {
+        FieldName		fieldName (ERROR_INFO_E),
+        ErrorInfoBody_List	errorInfo optional
+      }
+      
+      type record Expires
+      {
+        FieldName		fieldName (EXPIRES_E),
+        DeltaSec		deltaSec
+      }
+      
+      type record From
+      {
+        FieldName		fieldName (FROM_E),
+        Addr_Union    	addressField,
+        SemicolonParam_List	fromParams optional
+      }
+      
+      type record InReplyTo
+      {
+        FieldName		fieldName (IN_REPLY_TO_E),
+        CallidString_List	callids
+      }
+      
+      type record MaxForwards
+      {
+        FieldName		fieldName (MAX_FORWARDS_E),
+        integer		forwards	
+      }
+      
+      type record MinExpires
+      {
+        FieldName		fieldName (MIN_EXPIRES_E),
+        DeltaSec		deltaSec
+      }
+      
+      type record MimeVersion
+      {
+        FieldName		fieldName (MIME_VERSION_E),
+        integer		majorNumber,	
+        integer		minorNumber	
+      }
+      
+      type record Organization
+      {
+        FieldName		fieldName (ORGANIZATION_E),
+        charstring		organization
+      }
+      
+      type record Priority
+      {
+        FieldName		fieldName (PRIORITY_E),
+        charstring		priorityValue
+      }
+      
+      type record ProxyAuthenticate
+      {
+        FieldName		fieldName (PROXY_AUTHENTICATE_E),
+        Challenge		challenge
+      }
+      
+      type record ProxyAuthorization
+      {
+        FieldName		fieldName (PROXY_AUTHORIZATION_E),
+        Credentials		credentials
+      }
+      
+      type record ProxyRequire
+      {
+        FieldName		fieldName (PROXY_REQUIRE_E),
+        OptionTag_List	optionsTags
+      }
+      
+      type record RecordRoute
+      {
+        FieldName		fieldName (RECORD_ROUTE_E),
+        RouteBody_List	routeBody
+      }
+      
+      type record ReplyTo
+      {
+        FieldName		fieldName (REPLY_TO_E),
+        Addr_Union    	addressField,
+        SemicolonParam_List	replyToParams optional
+      }
+      
+      type record Require
+      {
+        FieldName		fieldName (REQUIRE_E),
+        OptionTag_List	optionsTags
+      }
+      
+      type record RetryAfter
+      {
+        FieldName		fieldName (RETRY_AFTER_E),
+        DeltaSec    	deltaSec,
+        charstring		comment optional,
+        SemicolonParam_List	retryParams optional
+      }
+      
+      type record Route
+      {
+        FieldName		fieldName (ROUTE_E),
+        RouteBody_List	routeBody
+      }
+      
+      type record Server
+      {
+        FieldName		fieldName (SERVER_E),
+        ServerVal_List	serverBody
+      }
+      
+      type record Subject
+      {
+        FieldName		fieldName (SUBJECT_E),
+        charstring		summary
+      }
+      
+      type record Supported
+      {
+        FieldName		fieldName (SUPPORTED_E),
+        OptionTag_List	optionsTags optional
+      }
+      
+      type record Timestamp
+      {
+        FieldName		fieldName (TIMESTAMP_E),
+        TimeValue		timeValue optional,
+        TimeValue		delay optional
+      }
+      
+      type record To
+      {
+        FieldName		fieldName (TO_E),
+        Addr_Union      	addressField,
+        SemicolonParam_List	toParams optional
+      }
+      
+      type record Unsupported
+      {
+        FieldName		fieldName (UNSUPPORTED_E),
+        OptionTag_List		optionsTags
+      }
+      
+      type record UndefinedHeader
+      {
+        charstring		headerName,
+        charstring		headerValue
+      }
+      
+      type set of UndefinedHeader UndefinedHeader_List;
+      
+      type record UserAgent
+      {
+        FieldName		fieldName (USER_AGENT_E),
+        ServerVal_List 	userAgentBody
+      }
+      
+      type record Via
+      {
+        FieldName		fieldName (VIA_E),
+        ViaBody_List		viaBody
+      }
+      
+      type record Warning
+      {
+        FieldName		fieldName (WARNING_E),
+        WarningValue_List	warningValue
+      }
+      
+      type record WwwAuthenticate
+      {
+        FieldName		fieldName (WWW_AUTHENTICATE_E),
+        Challenge		challenge
+      }
+
+	  type record RSeq {
+		  FieldName fieldName(RSEQ_E),
+		  integer responseNum
+	  }
+
+	  type record RAck {
+		  FieldName fieldName(RACK_E),
+		  integer responseNum,
+		  integer seqNumber,
+		  charstring method
+	  }
+
+	  type record AllowEvents {
+		  FieldName fieldName(ALLOW_EVENTS_E),
+		  EventType_List eventTypes
+	  }
+	  
+	  type set of EventType EventType_List;
+	  type charstring EventType;
+	  
+	  type record Event {
+		  FieldName fieldName(EVENT_E),
+		  EventType eventType,
+		  SemicolonParam_List eventParams optional
+	  }
+	  
+	  type record SubscriptionState {
+		  FieldName fieldName(SUBSCRIPTION_STATE_E),
+		  SubState subState,
+		  SemicolonParam_List substateParams optional
+	  }
+	  
+	  type charstring SubState;
+	  
+	  type record PMediaAuthorization {
+		  FieldName fieldName(P_MEDIA_AUTHORIZATION_E),
+		  PMediaAuthorization_List pMediaAuthorizations
+	  }
+			
+	  type charstring PMediaAuthValue; 
+	  
+	  type record of PMediaAuthValue PMediaAuthorization_List;
+	  
+
+	  type record Privacy {
+		  FieldName fieldName(PRIVACY_E),
+		  PrivacyValue_List privValueList
+	  }   
+
+	  type record PAssertedID {
+		  FieldName fieldName(P_ASSERTED_ID_E),
+		  PAssertedIDValue_List pAssertedIDValueList
+	  }
+
+	  type record PPreferredID {
+		  FieldName fieldName(P_PREFERRED_ID_E),
+		  PPreferredIDValue_List pPreferredIDValueList
+	  }
+
+	  type record of ReasonValue ReasonValues;
+	  
+	  type record ReasonValue {
+	  charstring token,
+	  SemicolonParam_List reasonParams optional
+  	  } 	  
+	  
+	  type record Reason {
+	  FieldName fieldName(REASON_E),
+	  ReasonValues reasonValues
+	  }
+
+	  type record Path {
+		  FieldName fieldName(PATH_E),
+		  PathValues pathValues
+	  }
+	  
+	  type record of PathValue PathValues;
+
+	  type record PathValue {
+		  NameAddr nameAddr,
+		  SemicolonParam_List rrParam optional
+	  }
+
+	  type record SecurityMechanism {
+		charstring mechName,
+		SemicolonParam_List mechParams optional
+	  }
+
+	  type set of SecurityMechanism SecurityMechanism_List;
+			
+	  type record SecurityClient {
+		FieldName fieldName(SECURITY_CLIENT_E),
+		SecurityMechanism_List securityMech
+	  }
+
+	  type record SecurityServer {
+		FieldName fieldName(SECURITY_SERVER_E),
+		SecurityMechanism_List securityMech
+	  }
+
+	  type record SecurityVerify {
+		FieldName fieldName(SECURITY_VERIFY_E),
+		SecurityMechanism_List securityMech
+	  }
+ 
+	  type record of NameAddrParam NameAddrParam_List;
+
+	  type record NameAddrParam {
+		  NameAddr nameAddr,
+		  SemicolonParam_List genericParams optional
+	  }
+
+	  type record PAssociatedURI {
+		FieldName fieldName(P_ASSOCIATED_URI_E),
+		NameAddrParam_List nameAddrList
+	  }	  
+
+	  type record PCalledPartyID {
+		  FieldName fieldName(P_CALLED_PARTY_E),
+		  NameAddrParam nameAddParams
+	  }
+
+	  type record of VnetworkSpec VnetworkSpec_List;
+
+	  type record VnetworkSpec {
+		charstring vNetworkSpecToken,
+		SemicolonParam_List genericParams optional
+	  }
+
+	  type record PVisitedNetworkID {
+		FieldName fieldName(P_VISITED_NETWORK_E),
+		VnetworkSpec_List vNetWorkSpec
+	  }
+
+	  type record PAccessNetworkInfo {
+		FieldName fieldName(P_ACCESS_NETWORK_INFO_E),
+		charstring accessType,
+		SemicolonParam_List genericParams optional
+	  }
+		
+	  type record PChargingFunctionAddresses {
+		FieldName fieldName(P_CHARGING_FUNCTION_ADDRESSES_E),
+		SemicolonParam_List chargeAddrParams optional
+	  }
+				
+	  type record PChargingVector {
+		FieldName fieldName(P_CHARGING_VECTOR_E),
+		SemicolonParam_List chargeParams optional
+	  }
+
+	  type record ReferTo {
+		  FieldName fieldName(REFER_TO_E),
+		  NameAddr nameAddr,
+		  SemicolonParam_List referToParams optional
+	  }
+
+	  type record ServiceRoute {
+		FieldName fieldName(SERVICE_ROUTE_E),
+		RouteBody_List	routeBody
+	  }
+
+	  type record AcceptContact {
+		  FieldName fieldName(ACCEPT_CONTACT_E),
+		  AcRcValue_List acValues
+	  }
+
+	  type set of AcRcValue AcRcValue_List;
+
+	  type record AcRcValue {
+		  charstring wildcard("*"),
+		  SemicolonParam_List acRcParams optional
+	  }	  	  
+
+	  type record ReferredBy {
+		  FieldName fieldName(REFERRED_BY_E),
+		  NameAddr nameAddr,
+		  SemicolonParam_List referredbyIdParams optional
+	  }
+			
+	  type record MinSE {
+		FieldName fieldName(MIN_SE_E),
+		DeltaSec deltaSec,
+		SemicolonParam_List minSeParam optional
+	  }
+
+	  type record SessionExpires {
+		FieldName fieldName(SESSION_EXPIRES_E),
+		DeltaSec deltaSec,
+		SemicolonParam_List seParam optional
+	  }
+
+	  type record HistoryInfo {
+		  FieldName fieldName(HISTORY_INFO_E),
+		  HistoryInfo_List historyInfoList
+	  }
+
+	  type record of HistoryInfoEntry HistoryInfo_List;
+
+	  type record of integer IntegerList;
+
+	  type record HistoryInfoEntry {
+		  NameAddr nameAddr,
+		  IntegerList hiIndex optional,
+		  SemicolonParam_List hiExtention optional
+	  }
+
+	  type record of charstring CharstringList;
+
+	  type record PEarlyMedia {
+		  FieldName fieldName(P_EARLY_MEDIA_E),
+		  CharstringList em_param
+	  }
+
+	  type record PAssertedService {
+		  FieldName fieldName(P_ASSERTED_SERVICE_E),
+		  PAssertedServiceValue pAssertedServiceValue
+	  }
+
+
+     type set MessageHeader
+      {
+        Accept				accept optional,
+		AcceptContact		acceptContact optional,
+        AcceptEncoding		acceptEncoding optional,
+        AcceptLanguage		acceptLanguage optional,
+        AlertInfo			alertInfo optional,
+        Allow				allow optional,
+		AllowEvents 		allowEvents optional,
+        AuthenticationInfo	authenticationInfo optional, 
+        Authorization		authorization optional, 
+        CallId				callId optional, 
+        CallInfo			callInfo optional,
+        Contact				contact optional, 
+        ContentDisposition	contentDisposition optional,
+        ContentEncoding		contentEncoding optional,
+        ContentLanguage		contentLanguage optional,
+        ContentLength		contentLength optional, 
+        ContentType			contentType optional,
+        CSeq				cSeq optional, 
+        Date				date optional,
+        ErrorInfo 			errorInfo optional, 
+		Event 				event optional, 
+        Expires 			expires optional,
+        From				fromField,
+		HistoryInfo 		historyInfo optional, 
+        InReplyTo 			inReplyTo optional, 
+        MaxForwards			maxForwards optional, 
+        MimeVersion			mimeVersion optional,
+        MinExpires			minExpires optional, 
+		MinSE 				minSE optional, 
+        Organization		organization optional,
+		PAccessNetworkInfo 	pAccessNetworkInfo optional,
+		PAssertedID 		pAssertedID optional, 
+		PAssertedService	pAssertedService optional,
+		PAssociatedURI		pAssociatedURI optional, 
+		Path 				path optional, 
+		PCalledPartyID 		pCalledPartyID optional, 
+		PChargingFunctionAddresses pChargingFunctionAddresses optional, 
+		PChargingVector 	pChargingVector optional, 
+		PEarlyMedia			pEarlyMedia	optional, 
+		PMediaAuthorization pMediaAuthorization optional, 
+		PPreferredID 		pPreferredID optional, 
+        Priority 			priority optional,  
+		Privacy 			privacy optional, 
+        ProxyAuthenticate	proxyAuthenticate optional, 
+        ProxyAuthorization	proxyAuthorization optional, 
+        ProxyRequire		proxyRequire optional, 
+		PVisitedNetworkID 	pVisitedNetworkID optional, 
+		RAck 				rAck optional, 
+		RSeq 				rSeq optional, 
+		Reason 				reason optional, 
+        RecordRoute			recordRoute optional,
+		ReferredBy 			referredBy optional, 	
+		ReferTo 			referTo optional, 
+        ReplyTo				replyTo optional, 
+        Require 			require optional,
+        RetryAfter			retryAfter optional, 
+        Route 				route optional, 
+		SecurityClient 		securityClient optional, 
+		SecurityServer 		securityServer optional, 
+		SecurityVerify 		securityVerify optional, 
+        Server				server optional, 
+		ServiceRoute 		serviceRoute optional, 
+		SessionExpires 		sessionExpires optional,
+        Subject				subject optional, 
+		SubscriptionState 	subscriptionState optional, 
+        Supported 			supported optional,
+        Timestamp 			timestamp optional,
+        To					toField,
+        Unsupported			unsupported optional, 
+        UserAgent 			userAgent optional,
+        Via					via,
+        Warning				warning optional, 
+        WwwAuthenticate		wwwAuthenticate optional, 
+        UndefinedHeader_List	undefinedHeader_List optional
+      }
+      
+ 
+      type record RequestLine
+      {
+        Method			method,
+        SipUrl			requestUri,
+        charstring		sipVersion
+      }
+      
+       type record StatusLine
+      {
+        charstring		sipVersion,
+        integer			statusCode,
+        charstring		reasonPhrase
+      }
+      
+
+    type record SipUserProfile
+    {	
+		integer		id,
+		integer     currPort,
+		charstring  currIpaddr,		
+		integer     contactPort,
+		charstring  contactIpaddr,
+		charstring  bearerIpaddr,
+		charstring  homeDomain,
+		charstring  publUsername,
+		charstring qop,
+		charstring privUsername,
+		charstring passwd,
+		charstring registrarDomain
+     }
+    
+ 
+      type record Request
+      {
+        RequestLine		requestLine,
+        MessageHeader 	msgHeader,
+		MessageBody		messageBody optional,
+        Payload			payload	    optional
+      } 
+      
+	  type record REGISTER_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  type record INVITE_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+	  
+	  type record OPTIONS_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  type record BYE_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  type record CANCEL_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+	  
+	  type record ACK_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  type record PRACK_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  type record NOTIFY_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  type record SUBSCRIBE_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  type record PUBLISH_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  type record UPDATE_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  type record REFER_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  type record MESSAGE_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+
+	  type record INFO_Request {
+		RequestLine 	requestLine,
+		MessageHeader 	msgHeader,
+		MessageBody 	messageBody optional,
+		Payload 		payload optional
+	  }
+	  
+  
+      type record Response
+      {
+        StatusLine		statusLine,
+        MessageHeader 	msgHeader,
+		MessageBody		messageBody optional,
+        Payload			payload	    optional
+      } 
+      type charstring Raw;
+
+
+	  type union MessageBody{
+		SDP_Message sdpMessageBody,
+		XmlBody xmlBody,            
+		MIME_Message mimeMessageBody,
+		charstring sipfrag, 		
+		charstring textplain		
+	  }
+
+    	
+		type union MIME_Encapsulated_Parts {
+		  SDP_Message 				sdpMessageBody,
+		  XmlBody 					xmlBody       
+		} 
+		
+		type record MIME_Encapsulated_Part {
+		  charstring 				content_type,
+		  charstring				content_disposition optional,
+		  MIME_Encapsulated_Parts 	mime_encapsulated_part
+		}
+
+	    type record MIME_Message {
+		  charstring boundary, 
+		  MimeEncapsulatedList mimeEncapsulatedList
+	    }
+	  
+	    type record of MIME_Encapsulated_Part MimeEncapsulatedList;
+
+            type record SDP_attribute_cat {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_keywds {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_tool {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_ptime {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_recvonly {
+            }
+
+            type record SDP_attribute_sendrecv {
+            }
+
+            type record SDP_attribute_sendonly {
+            }
+
+			type record SDP_attribute_inactive {
+			}
+
+            type record SDP_attribute_orient {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_type {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_charset {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_sdplang {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_lang {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_framerate {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_quality {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_fmtp {
+                charstring attr_value
+            }
+
+			type record SDP_attribute_curr {
+				charstring preconditionType,
+				charstring statusType,
+				charstring direction
+			}
+
+			type record SDP_attribute_des {
+				charstring preconditionType,
+				charstring strength,
+				charstring statusType,
+				charstring direction
+			}
+
+			type record SDP_attribute_conf {
+				charstring preconditionType,
+				charstring statusType,
+				charstring direction
+			}
+
+            type record SDP_attribute_rtpmap {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_rtcp {
+                charstring attr_value
+            }
+
+            type record SDP_attribute_unknown {
+                charstring name,
+                charstring attr_value optional
+            }
+
+
+            type union SDP_attribute {
+                SDP_attribute_cat             cat,
+                SDP_attribute_keywds          keywds,
+                SDP_attribute_tool            tool,
+                SDP_attribute_ptime           ptime,
+                SDP_attribute_recvonly        recvonly,
+                SDP_attribute_sendrecv        sendrecv,
+                SDP_attribute_sendonly        sendonly,
+				        SDP_attribute_inactive		    inactive,
+                SDP_attribute_orient          orient,
+                SDP_attribute_type            sdp_type,
+                SDP_attribute_charset         charset,
+                SDP_attribute_sdplang         sdplang,
+                SDP_attribute_lang            lang,
+                SDP_attribute_framerate       framerate,
+                SDP_attribute_quality         quality,
+                SDP_attribute_fmtp            fmtp,
+                SDP_attribute_curr            curr,
+                SDP_attribute_des             des,
+                SDP_attribute_conf            conf,
+                SDP_attribute_rtpmap          rtpmap,
+                SDP_attribute_rtcp            rtcp,
+                SDP_attribute_unknown unknown
+            }
+ 
+      type set of SDP_attribute SDP_attribute_list;
+
+      type record SDP_bandwidth {
+        charstring          modifier,
+        integer             bandwidth
+      }
+
+	  type set of SDP_bandwidth SDP_bandwidth_list;
+
+      type record SDP_connection {
+        charstring          net_type,
+        charstring          addr_type,
+		SDP_conn_addr		conn_addr
+      }
+
+      type record SDP_conn_addr {
+	  	charstring addr,
+		integer ttl optional,
+		integer num_of_addr optional
+	  }
+
+      type set of SDP_connection SDP_connection_list;
+
+      type record SDP_contact {
+        charstring          addr_or_phone,
+        charstring          disp_name optional
+      }
+
+      type SDP_contact SDP_contact_tel;
+
+      type SDP_contact SDP_contact_email;
+
+      type set of SDP_contact_email SDP_email_list;
+
+      type record of charstring SDP_fmt_list ;
+
+      type record SDP_key {
+        charstring          method,
+        charstring          key optional
+      }
+
+      type record SDP_media_desc {
+        SDP_media_field     media_field,
+        charstring          information optional,
+        SDP_connection_list connections optional,
+        SDP_bandwidth       bandwidth optional,
+        SDP_key             key optional,
+        SDP_attribute_list  attributes optional
+      }
+
+      type set of SDP_media_desc SDP_media_desc_list;
+
+      type record SDP_media_port {
+        integer             port_number,
+        integer             num_of_ports optional
+      }
+
+      type record SDP_media_field {
+        charstring          media,
+        SDP_media_port      ports,
+        charstring          transport,
+        SDP_fmt_list        fmts
+      }
+
+      type record SDP_time{
+        SDP_time_field      time_field,
+        SDP_repeat_list     time_repeat optional
+      }
+
+      type record SDP_time_field{
+        charstring   start_time, 
+        charstring   stop_time 
+      }
+
+      type record SDP_repeat{
+        SDP_typed_time      repeat_interval,
+        SDP_typed_time      active,
+        SDP_typed_time_list offsets
+      }
+
+      type set of SDP_repeat SDP_repeat_list;
+
+      type record SDP_typed_time{
+        integer        time,
+        charstring     unit optional
+      }
+
+      type set of SDP_typed_time SDP_typed_time_list;
+
+      type set of SDP_time SDP_time_list;
+
+      type record SDP_timezone{
+        charstring          adjustment_time,
+        SDP_typed_time      offset
+      }
+
+      type set of SDP_timezone SDP_timezone_list;
+
+      type record SDP_Origin{
+        charstring          user_name,
+        charstring          session_id,
+        charstring          session_version, 
+        charstring          net_type,
+        charstring          addr_type,
+        charstring          addr
+      }
+
+      type set of SDP_contact_tel SDP_phone_list;
+
+      type record SDP_Message{
+        integer             protocol_version,
+        SDP_Origin          origin,
+        charstring          session_name,
+        charstring          information optional,
+        charstring          uri optional,
+        SDP_email_list      emails optional,
+        SDP_phone_list      phone_numbers optional,
+        SDP_connection      connection optional,
+		SDP_bandwidth_list  bandwidth optional,
+        SDP_time_list       times,
+        SDP_timezone_list   timezone_adjustments optional,
+                SDP_key             key optional,
+SDP_attribute_list  attributes optional,
+        SDP_media_desc_list media_list optional
+      }
+
+type charstring XmlBody;
+
+    type port SipPort message {
+      inout 
+        Request,
+        REGISTER_Request,
+        INVITE_Request,
+        OPTIONS_Request,
+        BYE_Request,
+        CANCEL_Request,
+        ACK_Request,
+        PRACK_Request,
+        NOTIFY_Request,
+        SUBSCRIBE_Request,
+        PUBLISH_Request,
+        UPDATE_Request,
+        REFER_Request,
+        MESSAGE_Request,
+        INFO_Request,
+        Response      
+    };  
+    
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/init.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/init.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/LoopbackTests/init.cpp	(revision 22)
@@ -0,0 +1,66 @@
+/****************************************************************************/
+/* $Id$             */
+/*                                                                          */
+/*   (c) 2009  Universite de Rennes 1                                       */
+/*                                                                          */
+/* Contributors:                                                            */
+/*  - Anthony BAIRE                                                         */
+/*                                                                          */
+/* Contact address: <t3devkit@irisa.fr>                                     */
+/*                                                                          */
+/*                                                                          */
+/* This file is part of application examples provided along with T3DevKit,  */
+/* a free toolkit for building TTCN-3 tests.                                */
+/*                                                                          */
+/* This software is governed by the CeCILL-B license under French law and   */
+/* abiding by the rules of distribution of free software.  You can  use,    */
+/* modify and/or redistribute the software under the terms of the CeCILL-B  */
+/* license as circulated by CEA, CNRS and INRIA at the following URL        */
+/* "http://www.cecill.info".                                                */
+/*                                                                          */
+/* As a counterpart to the access to the source code and  rights to copy,   */
+/* modify and redistribute granted by the license, users are provided only  */
+/* with a limited warranty  and the software's author,  the holder of the   */
+/* economic rights,  and the successive licensors  have only  limited       */
+/* liability.                                                               */
+/*                                                                          */
+/* In this respect, the user's attention is drawn to the risks associated   */
+/* with loading,  using,  modifying and/or developing or reproducing the    */
+/* software by the user in light of its specific status of free software,   */
+/* that may mean  that it is complicated to manipulate,  and  that  also    */
+/* therefore means  that it is reserved for developers  and  experienced    */
+/* professionals having in-depth computer knowledge. Users are therefore    */
+/* encouraged to load and test the software's suitability as regards their  */
+/* requirements in conditions enabling the security of their systems and/or */ 
+/* data to be ensured and,  more generally, to use and operate it in the    */
+/* same conditions as regards security.                                     */
+/*                                                                          */
+/* The fact that you are presently reading this means that you have had     */
+/* knowledge of the CeCILL-B license and that you accept its terms.         */
+/****************************************************************************/
+#include <t3devlib/t3devlib.h>
+#include "EchoPort.h"
+
+namespace t3devlib {
+	
+	void PAInit()
+	{
+	}
+
+	void SAInit()
+	{
+		Port::RegisterType ("TestSystem", "SipPort", &createPort<EchoPort>);
+	}
+
+	void CDInit()
+	{
+	}
+
+	void PAReset()
+	{
+	}
+
+	void SAReset()
+	{
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/Sanity_Templates.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/Sanity_Templates.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/Sanity_Templates.ttcn	(revision 22)
@@ -0,0 +1,275 @@
+module Sanity_Templates {
+  
+  	import from LibSip_SIPTypesAndValues all;
+  
+  	group userInfoTemplates {
+  		
+  		template UserInfo m_userInfo(charstring p_userOrTelephoneSuscriber, template charstring p_password) := {
+			userOrTelephoneSubscriber	:= p_userOrTelephoneSuscriber,
+			password 					:= p_password	
+  		}
+  	} // end group userInfoTemplates
+  
+  	group hostPortTemplates {
+  		
+  		template HostPort m_hostPort(charstring p_host, template integer p_port) := {
+			host 		:= p_host,
+			portField	:= p_port
+  		}
+  	} // end group hostPortTemplates
+  
+	group sipUri {
+		
+		template SipUrl	m_receiverSipUri(template SemicolonParam_List p_urlPareters) := {
+			scheme 			:= c_sipScheme & ":", 
+			userInfo 		:= m_userInfo("receiver", omit),
+			hostPort 		:= m_hostPort("etsi.org", omit),
+			urlParameters 	:= p_urlPareters,
+			headers 		:= omit
+		}
+		
+		template SipUrl	m_senderSipUri(template SemicolonParam_List p_urlPareters) := {
+			scheme 			:= c_sipScheme & ":", 
+			userInfo 		:= m_userInfo("sender", omit),
+			hostPort 		:= m_hostPort("etsi.org", omit),
+			urlParameters 	:= p_urlPareters,
+			headers 		:= omit
+		}		
+  	} // end group sipUri  
+  
+  	group startLineTemplates {
+  	
+	  	template RequestLine m_requestLine(Method p_method, template SipUrl p_requestUri) := {
+			method 		:= p_method,
+			requestUri 	:= p_requestUri,
+			sipVersion 	:= c_sipNameVersion
+	  	}
+  	
+  	} // end group startLineTemplates
+  
+  	group callIdTemplates {
+  		
+  		template CallId m_callId(charstring p_callId) := {
+			fieldName 	:= CALL_ID_E,
+			callid 		:= p_callId	
+  		}
+  	} // end group callIdTemplates
+  
+  	group cSeqTemplates {
+  		
+		template CSeq m_cSeq(charstring p_method) := {
+			fieldName := CSEQ_E,
+		  	seqNumber := 1,	
+		  	method := p_method
+		}
+	} // end group cSeqTemplates
+
+	group genericParamTemplate {
+		
+		template GenericParam m_tag(charstring p_tagValue) := {
+			id 			:= c_tagId, 
+			paramValue 	:= p_tagValue
+		}
+		
+		template GenericParam m_branch(charstring p_branchValue) := {
+			id 			:= c_branchId, 
+			paramValue 	:= p_branchValue
+		}
+	} // end group genericParamTemplates
+  
+	group fromTemplates {
+		
+		template From m_fromField(template SipUrl p_fromUri) := {
+			fieldName 		:= FROM_E,
+			addressField	:= {addrSpecUnion := p_fromUri},
+			fromParams 		:= omit
+		}
+	} // end group fromTemplates  
+
+	group toTemplates {
+		
+		template To m_toField(template SipUrl p_toUri) := {
+		 	fieldName 		:= TO_E,
+			addressField	:= {addrSpecUnion := p_toUri},
+		  	toParams		:= omit
+		}
+		
+	} // end group toTemplates
+
+	group contactBodyTemplates {
+		template ContactBody m_contactBody(template SipUrl p_contactUri) := {
+			contactAddresses := {
+				{
+					addressField := { addrSpecUnion := p_contactUri},
+					contactParams := omit
+				}
+			}
+		}
+
+	} // end group contactBodyTemplates
+
+
+	group contactTemplates {
+		
+		template Contact m_contact(template SipUrl p_contactUri) := {
+			fieldName 		:= CONTACT_E,
+			contactBody		:= m_contactBody(p_contactUri)
+		}
+		
+	} // end group contactTemplates
+	  	  
+	group viaTemplates {
+		
+		template Via m_via(template ViaBody_List p_viaBodyList) := {
+		  fieldName := VIA_E,
+		  viaBody	:= p_viaBodyList
+		}
+		
+		template ViaBody m_viaBody(template HostPort p_sentBy, template SemicolonParam_List p_viaParams) := {
+			sentProtocol	:= m_sentProtocol,
+			sentBy			:= p_sentBy,
+			viaParams 		:= p_viaParams
+		}
+	} // end group viaTemplates
+	
+	group sentProtocolTemplates {
+		
+		template SentProtocol m_sentProtocol := {
+		  protocolName		:= c_sipName,
+		  protocolVersion	:= c_sipVersion,
+		  transport			:= c_defaultSipProt
+		}
+	} // end group sentProtocolTemplates
+	
+  	group msgHeaderTemplates {
+  	
+  		template MessageHeader m_minimalMsgHeader(
+  			charstring p_callId,
+  			charstring p_method,
+  			template SipUrl p_contactUri,
+			template SipUrl p_fromUri,
+			template SipUrl p_toUri,
+			template ViaBody_List p_viaBodyList
+  		) := {
+			accept := omit,
+			acceptContact  := omit,
+			acceptEncoding  := omit,
+			acceptLanguage  := omit,
+			alertInfo  := omit,
+			allow  := omit,
+			allowEvents  := omit, // 3265/7.2
+			authenticationInfo  := omit, // only in responses
+			authorization  := omit, // only in requests
+			callId 		:= m_callId(p_callId),
+			callInfo  := omit,
+			contact		:= m_contact(p_contactUri),
+			contentDisposition  := omit,
+			contentEncoding  := omit,
+			contentLanguage  := omit,
+			contentLength  := omit, // optional in responses and all requests except ACK where mandatory
+			contentType  := omit,
+			cSeq 		:= m_cSeq(p_method),
+			date  := omit,
+			errorInfo  := omit, // only in responses
+			event  := omit, // 3265/7.2
+			expires  := omit,
+			fromField 	:= m_fromField(p_fromUri), 
+			historyInfo  := omit, // 4244
+			inReplyTo  := omit, // only in requests
+			maxForwards	:= c_maxForwards70,
+			mimeVersion  := omit,
+			minExpires  := omit, // only in responses
+			minSE  := omit, // 4028
+			organization  := omit,
+			pAccessNetworkInfo  := omit, // 3455
+			pAssertedID  := omit, // 3325
+			pAssertedService  := omit,
+			pAssociatedURI  := omit, // 3455
+			path  := omit, // 3327
+			pCalledPartyID  := omit, // 3455
+			pChargingFunctionAddresses  := omit, // 3455
+			pChargingVector  := omit, // 3455
+			pEarlyMedia	 := omit, // 5009
+			pMediaAuthorization  := omit, // 3313
+			pPreferredID  := omit, // 3325
+			priority  := omit,  // only in requests
+			privacy  := omit, // 3323
+			proxyAuthenticate  := omit, // only in responses
+			proxyAuthorization  := omit, // only in requests
+			proxyRequire  := omit, // only in requests
+			pVisitedNetworkID  := omit, // 3455
+			rAck  := omit, // 3262/7.1
+			rSeq  := omit, // 3262/7.1
+			reason  := omit, // 3326
+			recordRoute  := omit,
+			referredBy  := omit, // 3892 - REFER method	
+			referTo  := omit, // 3515 - REFER method
+			replyTo  := omit, // optional in responses and INVITE requests
+			require  := omit,
+			retryAfter  := omit, // only in responses
+			route  := omit, // only in requests
+			securityClient  := omit, // 3329
+			securityServer  := omit, // 3329
+			securityVerify  := omit, // 3329
+			server  := omit, // only in responses
+			serviceRoute  := omit, // 3608
+			sessionExpires := omit, // 4028
+			subject  := omit, // only in requests
+			subscriptionState  := omit, // 3265/7.2
+			supported  := omit,
+			timestamp  := omit,
+			toField	:= m_toField(p_toUri),
+			unsupported  := omit, // only in responses
+			userAgent  := omit,
+			via 		:= m_via(p_viaBodyList), 
+			warning  := omit, // only in responses
+			wwwAuthenticate  := omit, // only in responses
+			undefinedHeader_List  := omit  			
+  			
+  			
+			
+			
+			 
+			
+			
+			 
+			
+  		}
+  	
+  	} // end group msgHeaderTemplates
+  	group requests {
+  	
+	  	template INVITE_Request m_standardInviteRequest := {
+			requestLine := m_requestLine(INVITE_E, m_receiverSipUri(omit)),
+			msgHeader 	:= m_minimalMsgHeader(	"inviteCall", 
+												"INVITE", 
+												m_senderSipUri(omit),
+												m_senderSipUri({m_tag("a-tag")}),
+												m_receiverSipUri(omit),
+												{m_viaBody(	m_hostPort("etsi.org", c_defaultSipPort), 
+															{m_branch(c_brenchCookie)}
+															)}
+												),
+			messageBody := omit,	
+			payload 	:= omit
+	  	}
+	  	
+	  	template REGISTER_Request m_standardRegisterRequest := {
+			requestLine := m_requestLine(REGISTER_E, m_senderSipUri(omit)),
+			msgHeader 	:= m_minimalMsgHeader(	"registerCall", 
+												"REGISTER", 
+												m_senderSipUri(omit),
+												m_senderSipUri({m_tag("a-tag")}),
+												m_senderSipUri(omit),
+												{m_viaBody(	m_hostPort("etsi.org", c_defaultSipPort), 
+															{m_branch(c_brenchCookie)}
+															)}
+												),
+			messageBody := omit,	
+			payload 	:= omit
+	  	}
+	  
+	} // end group requests
+      
+} // end module Sanity_Templates
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/Sanity_Testcases.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/Sanity_Testcases.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/Sanity_Testcases.ttcn	(revision 22)
@@ -0,0 +1,35 @@
+/*
+ *	@author     STF370
+ *  @version    $Id$
+ *	@desc       SIP Sanity Testcases
+ */
+ 
+module Sanity_Testcases {
+  
+  	import from TestSystem all;
+  	import from LibSip_SIPTypesAndValues all;
+  	import from Sanity_Templates all;
+  
+	testcase TC_SANITY_0001() runs on SipSimu system SipSimu {
+    
+		// Preamble
+		connect(self:sipPort, self:sipPort);
+		//map
+		
+		// Test Body
+		sipPort.send(m_standardInviteRequest);
+		sipPort.receive(m_standardInviteRequest);
+		
+	}
+
+	testcase TC_SANITY_0002() runs on SipSimu system SipSimu {
+    
+		// Preamble
+		connect(self:sipPort, self:sipPort);
+		
+		// Test Body
+		sipPort.send(m_standardRegisterRequest);
+		sipPort.receive(m_standardRegisterRequest);
+		
+	}  
+} // end module Sanity_Testcases
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/Simple_Testcases.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/Simple_Testcases.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/Simple_Testcases.ttcn	(revision 22)
@@ -0,0 +1,290 @@
+module Simple_Testcases
+{
+  	import from TestSystem all;
+  	import from LibSip_SIPTypesAndValues all;
+  	import from LibSip_SDPTypes all;
+	import from SipIsup_ISUP_MsgTypes all;
+
+	const charstring c_CRLF := oct2char('0D'O) & oct2char('0A'O);
+
+	template SipUrl m_simpleUrl (charstring user, charstring host, integer p) := {
+		scheme :=	"sip",
+		userInfo := {
+        	       userOrTelephoneSubscriber := user,
+        	       password := omit
+		},
+		hostPort := {
+			host := host,
+			portField := p 
+		},
+		urlParameters := *,
+		headers :=	*
+	}
+
+	// testing SipUrl
+	testcase TC_SIMPLE_0001() runs on SipTest system SipTest {
+
+		// Preamble
+		connect (self:testPort, self:testPort);
+
+		// Test Body
+		testPort.send ("sip:user;par=u%40example.net@host:42");
+	
+		alt {
+			[] testPort.receive (m_simpleUrl ("user;par=u%40example.net", "host", 42)) {
+				setverdict (pass);
+			}
+			[] testPort.receive (SipUrl: ?) {
+				setverdict (fail);
+			}
+		}
+
+	}
+
+	// testing MessageHeader
+	testcase TC_SIMPLE_0002() runs on SipTest system SipTest {
+
+		// Preamble
+		connect (self:testPort, self:testPort);
+
+		// Test Body
+		testPort.send (	"From: Caller <sip:caller@host:42>;tag=123" & c_CRLF &
+				"Via: SIP/2.0/UDP grabu.com, SIP/2.0/UDP etsi.org" & c_CRLF &
+				"Via: SIP/2.0/UDP pouic-pouic.com" & c_CRLF & 
+				"Pouet: blah blah" & c_CRLF &
+				"Via: SIP/2.0/UDP tutu.com" & c_CRLF &
+				"Call-ID: a84b4c76e66710" & c_CRLF &
+				"CSeq: 1 INVITE" & c_CRLF &
+				"Content-Length: 0" & c_CRLF &
+				"Content-Type: text/xml" & c_CRLF &				
+				"To: User <sip:user@host:42>;test=5" & c_CRLF &
+				"Contact: User <sip:user@etsi.org:42;test=5?par1=2&par2=30>, <http://www.etsi.org>, tel:5678" & c_CRLF &
+				"Contact: User3 <sip:user3@etsi.org>" & c_CRLF &
+				"Accept: text/*;abc=5;def , image/*" & c_CRLF &
+				"Accept: audio/*;abc=5;def" & c_CRLF &
+				"Accept-Language: en-us, en-uk, CZ;condition=2;template=abc" & c_CRLF &
+				"Max-Forwards: 5" & c_CRLF &
+				"Accept-Encoding: gzip;def=2  , *" & c_CRLF &
+				"Alert-Info: <sip:etsi.org>, <tel:123456>" & c_CRLF &
+				"Allow:    INVITE, ACK,   BYE , CANCEL" & c_CRLF &
+				"Authentication-Info: qop = auth, cnonce=""abc"",nc=00000021" & c_CRLF &
+				"Authorization: digest username = ""test"", cnonce=""abc"",nc=00000021" & c_CRLF &
+				"Authorization: digest username = ""test2"", cnonce=""bcd"",nc=00000031" & c_CRLF &
+				"Call-Info: <sip:etsi.org>;purpose = info, <tel:123456>" & c_CRLF &
+				"Content-Disposition: session;param1=1; param2=""25&""" & c_CRLF &
+				"Content-Encoding: gzip" & c_CRLF &
+				"Content-Language: fr, en-us, en-uk" & c_CRLF &
+				"Date : Sat, 13 Nov 2010 23:29:00 GMT"  & c_CRLF &
+				"Error-Info: <sip:etsi.org>, <tel:123456>;par1=5" & c_CRLF &
+				"Expires: 45" & c_CRLF &
+				"In-Reply-To:  a84b4c76e66610, a84b4c76e66620, a84b4c76e66630" & c_CRLF &
+				"MIME-Version: 5.25" & c_CRLF &
+				"Min-Expires: 10" & c_CRLF &
+				"Organization: ETSI Einstein Building" & c_CRLF &
+				"Priority: normal" & c_CRLF &
+				"Proxy-Authenticate: digest qop = auth, cnonce=""abc"",nc=00000021" & c_CRLF &
+				"Proxy-Authorization: digest username = ""test"", cnonce=""abc"",nc=00000021" & c_CRLF &
+				"Proxy-Require: abc, data" & c_CRLF &
+				"Record-Route: <sip:etsi.org>, <tel:123456>" & c_CRLF &
+				"Record-Route: <sip:elvior.ee>, <tel:99123456>" & c_CRLF &
+				"Reply-To: User <sip:user@host:42>;test=5" & c_CRLF &
+				"Retry-After: 5 (this is a comment)" & c_CRLF &
+				"Require: good_feedback, warp_speed" & c_CRLF &
+				"Require: something_else" & c_CRLF &
+				"Route: <sip:etsi.org>, <tel:123456>" & c_CRLF &
+				"Server: server1 server2 server4 server8" & c_CRLF &
+				"Subject: some subject" & c_CRLF &
+				"Supported: feature1, feature2, feature3" & c_CRLF &
+				"Timestamp: 55.0" & c_CRLF &
+				"UnSupported: fancy_feature1, fancy_feature2" & c_CRLF &
+				"User-Agent: server3 server5" & c_CRLF &
+				"Warning: 0001 etsi.org:42 ""This is an important warning""" & c_CRLF &
+				"WWW-Authenticate: digest qop = auth, cnonce=""abc"",nc=00000021" & c_CRLF &
+				"Pouet: blah blah again" & c_CRLF &
+				" on multiple lines" & c_CRLF
+				);
+	
+		alt {
+			[] testPort.receive (MessageHeader: ?) {
+				setverdict (inconc);
+			}
+		}
+		
+	}
+	
+	// simplest SDP message
+	// (example taken from RFC 4566)
+	testcase TC_SIMPLE_0003() runs on SipTest system SipTest {
+		// Preamble
+		connect (self:testPort, self:testPort);
+
+		// Test Body
+		testPort.send (
+			"v=0" & c_CRLF &
+			"o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5" & c_CRLF &
+			"s=SDP Seminar" & c_CRLF
+			);
+
+		alt {
+			[] testPort.receive (SDP_Message: ?) {
+				setverdict (inconc);
+			}
+			[] testPort.receive {
+				setverdict (fail);
+			}
+		}
+	}
+	
+	// more complex SDP message
+	testcase TC_SIMPLE_0004() runs on SipTest system SipTest {
+		// Preamble
+		connect (self:testPort, self:testPort);
+
+		// Test Body
+		testPort.send (
+			"v=0" & c_CRLF &
+			"o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5" & c_CRLF &
+			"s=SDP Seminar" & c_CRLF &
+			"i=A Seminar on the session description protocol" & c_CRLF &
+			"u=http://www.example.com/seminars/sdp.pdf" & c_CRLF &
+			"e=j.doe@example.com (Jane Doe)" & c_CRLF &
+			"c=IN IP4 224.2.17.12/127" & c_CRLF &
+			"t=2873397496 2873404696" & c_CRLF &
+			"a=blah:BLAHBLAH" & c_CRLF &
+			"a=truc" & c_CRLF &
+			"a=cat:blah.blah.blah" & c_CRLF &
+			"a=keywds:blah blih bloh" & c_CRLF &
+			"a=tool:some useless tool" & c_CRLF &
+			"a=ptime:3254235" & c_CRLF &
+			"a=maxptime:13254235" & c_CRLF &
+			"a=rtpmap:99 h263-1998/90000" & c_CRLF &
+			"a=recvonly" & c_CRLF &
+			"a=sendrecv" & c_CRLF &
+			"a=sendonly" & c_CRLF &
+			"a=inactive" & c_CRLF &
+			"a=orient:landscape" & c_CRLF &
+			"a=type:meeting" & c_CRLF &
+			"a=charset:ISO-8859-1" & c_CRLF &
+			"a=sdplang:fr" & c_CRLF &
+			"a=lang:en" & c_CRLF &
+			"a=framerate:25.0" & c_CRLF &
+			"a=quality:8" & c_CRLF &
+			"a=fmtp:100 98/98" & c_CRLF &
+			"a=curr:qos local send" & c_CRLF &
+			"a=des:blah failure remote none" & c_CRLF &
+			"a=conf:truc e2e sendrecv" & c_CRLF &
+			"m=blah 49170/234 RTP/AVP/FOO/BAR 0 1 hello world" & c_CRLF &
+			"i=I like to blah blah blah blah" & c_CRLF &
+			"c=IN IP4 192.168.0.42" & c_CRLF &
+			"c=IN IP4 224.2.17.12/127" & c_CRLF &
+			"c=IN IP4 224.2.2.1/3/34" & c_CRLF &
+			"c=IN IP4 foo.bar.com" & c_CRLF &
+			"c=IN IP6 fe80::204:00ff:fe09:3424" & c_CRLF &
+			"c=IN IP6 ff0a::42/456" & c_CRLF &
+			"b=foo:1234" & c_CRLF &
+//			"b=blah:567890" & c_CRLF &	// FIXME: multiple bandwith fields allowed by the BNF but not by the types
+			"k=prompt" & c_CRLF &
+			"a=quality:8" & c_CRLF &
+			"a=fmtp:100 98/98" & c_CRLF &
+			"m=audio 49170 RTP/AVP 0" & c_CRLF &
+			"m=video 51372 RTP/AVP 99" & c_CRLF &
+			"a=rtpmap:99 h263-1998/90000" & c_CRLF 
+			);
+
+		alt {
+			[] testPort.receive (SDP_Message: ?) {
+				setverdict (inconc);
+			}
+			[] testPort.receive {
+				setverdict (fail);
+			}
+		}
+	}
+	
+	// long SDP message
+	testcase TC_SIMPLE_0005() runs on SipTest system SipTest {
+		// Preamble
+		connect (self:testPort, self:testPort);
+
+		// Test Body
+		testPort.send (
+			"v=0" & c_CRLF &
+			"o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5" & c_CRLF &
+			"s=SDP Seminar" & c_CRLF &
+			"i=A Seminar on the session description protocol" & c_CRLF &
+			"u=http://www.example.com/seminars/sdp.pdf" & c_CRLF &
+			"e=j.doe@example.com (Jane Doe)" & c_CRLF &
+			"e=ublah@blah.com (Blah blaH)" & c_CRLF &
+			"e=ublah2@blahblah.com (Blah 2 Blah Blah)" & c_CRLF &
+			"e=reverse order <in.the@other.order.com>" & c_CRLF &
+			"e=without@dispname.com" & c_CRLF &
+			"p=044934-3454" & c_CRLF &
+			"p=+33 2 99 84 71 71 (fax)" & c_CRLF &
+			"p=in reverse order <+33 2 99 84 13 37>" & c_CRLF &
+			"c=IN IP4 224.2.17.12/1/27" & c_CRLF &
+			"b=X-YZ:128" & c_CRLF &
+			"b=blah:42" & c_CRLF &
+			"t=2873397496 2873404696" & c_CRLF &
+			"t=42 1337" & c_CRLF &
+			"r=1 2" & c_CRLF &
+			"r=1 23 456 7890" & c_CRLF &
+			"z=1231241314 234234s 1234234902394 -234245d" & c_CRLF &
+			"k=clear:blah! blah!" & c_CRLF &
+			"a=recvonly" & c_CRLF &
+			"m=audio 49170 RTP/AVP 0" & c_CRLF &
+			"m=video 51372 RTP/AVP 99" & c_CRLF &
+			"a=rtpmap:99 h263-1998/90000" & c_CRLF 
+			);
+
+		alt {
+			[] testPort.receive (SDP_Message: ?) {
+				setverdict (inconc);
+			}
+			[] testPort.receive {
+				setverdict (fail);
+			}
+		}
+	}
+	
+	// SDP message with an IPv6 connection address
+	testcase TC_SIMPLE_0006() runs on SipTest system SipTest {
+		// Preamble
+		connect (self:testPort, self:testPort);
+
+		// Test Body
+		testPort.send (
+			"v=0" & c_CRLF &
+			"o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5" & c_CRLF &
+			"s=SDP Seminar" & c_CRLF &
+			"c=IN IP6 ff08::232:ff:fe00:1337/24" & c_CRLF
+			);
+
+		alt {
+			[] testPort.receive (SDP_Message: ?) {
+				setverdict (inconc);
+			}
+			[] testPort.receive {
+				setverdict (fail);
+			}
+		}
+	}
+	
+	
+	// ISUP Initial Address message
+	testcase TC_SIMPLE_0007() runs on SipTest system SipTest {
+		// Preamble
+		connect (self:testPort, self:testPort);
+
+		// Test Body
+		testPort.send ('010061000A03020B090490006956210037F60A070311843301332500'O);
+
+		alt {
+			[] testPort.receive (ISUP_BICC_MSG: ?) {
+				setverdict (inconc);
+			}
+			[] testPort.receive {
+				setverdict (fail);
+			}
+		}
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/SipIsup_ISUP_MsgTypes.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/SipIsup_ISUP_MsgTypes.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/SipIsup_ISUP_MsgTypes.ttcn	(revision 22)
@@ -0,0 +1,971 @@
+/*
+ *	@author 	STF 366
+ *	@version	$Id$
+ *	@desc		This module provides ISUP/BICC-related Message type declarations.
+*/
+module SipIsup_ISUP_MsgTypes 
+{
+import from LibCommon_BasicTypesAndValues all;
+import from LibCommon_DataStrings all;
+import from LibCommon_TextStrings all;
+import from SipIsup_ISUP_ParamTypes all;
+
+group ISUP_BICC_Messages {
+// Union type for all possible ISUP/BICC messages
+type union ISUP_BICC_MSG
+{
+ ACM_MSG   aCM_MSG,  /* Address complete message (ACM) */
+ ANM_MSG   aNM_MSG,  /* Answer message (ANM) */
+ APM_MSG   aPM_MSG,  /* Application transport message (APM) */
+ BLA_MSG   bLA_MSG,  /* Blocking acknowledgement message (BLA) */
+ BLO_MSG   bLO_MSG,  /* Blocking message (BLO) */
+ CCR_MSG   cCR_MSG,  /* Continuity check request message (CCR) */
+ CFN_MSG   cFN_MSG,  /* Confusion message (CFN) */
+ CGB_MSG   cGB_MSG,  /* Circuit group blocking message (CGB) */
+ CGBA_MSG  cGBA_MSG, /* Circuit group blocking acknowledgement message (CGBA) */
+ CGQ_MSG   cGQ_MSG,  /* Circuit group query message (CGQ) */
+ CGQR_MSG  cGQR_MSG, /* Circuit group query response message (CGQR) */
+ GRS_MSG   gRS_MSG,  /* Circuit group reset message (GRS) */
+ GRA_MSG   gRA_MSG,  /* Circuit group reset acknowledgement message (GRA) */
+ CGU_MSG   cGU_MSG,  /* Circuit group unblocking message (CGU) */
+ CGUA_MSG  cGUA_MSG, /* Circuit group unblocking acknowledgement message (CGUA) */
+ CON_MSG   cON_MSG,  /* Connect message (CON) */
+ CPG_MSG   cPG_MSG,  /* Call progress message (CPG) */
+ COT_MSG   cOT_MSG,  /* Continuity message (COT) */
+ FAA_MSG   fAA_MSG,  /* Facility accepted message (FAA) */
+ FAC_MSG   fAC_MSG,  /* Facility message (FAC) */
+ FRJ_MSG   fRJ_MSG,  /* Facility reject message (FRJ) */
+ FAR_MSG   fAR_MSG,  /* Facility request message (FAR) */
+ FTR_MSG   fTR_MSG,  /* Forward transfer message (FTR) */
+ IAM_MSG   iAM_MSG,  /* Initial address message (IAM) */
+ INF_MSG   iNF_MSG,  /* Information message (INF) */
+ INR_MSG   iNR_MSG,  /* Information request message (INR) */
+ IDR_MSG   iDR_MSG,  /* Identification request message (IDR) */
+ IRS_MSG   iRS_MSG,  /* Identification response message (IRS) */
+ LBA_MSG   lBA_MSG,  /* Loop back acknowledgement message (LBA) */
+ LOP_MSG   lOP_MSG,  /* Loop prevention message (LOP) */
+ NRM_MSG   nRM_MSG,  /* Network resource management message (NRM) */
+ OVL_MSG   oVL_MSG,  /* Overload message (OVL) */
+ PRI_MSG   pRI_MSG,  /* Pre-release information message (PRI) */
+ REL_MSG   rEL_MSG,  /* Release message (REL) */
+ RES_MSG   rES_MSG,  /* Resume message (RES) */
+ RLC_MSG   rLC_MSG,  /* Release complete message (RLC) */
+ RSC_MSG   rSC_MSG,  /* Reset circuit message (RSC) */
+ SAM_MSG   sAM_MSG,  /* Subsequent address message (SAM) */
+ SDN_MSG   sDN_MSG,  /* Subsequent Directory Number message (SDN) */
+ SEG_MSG   sEG_MSG,  /* Segmentation message (SEG) */
+ SUS_MSG   sUS_MSG,  /* Suspend message (SUS) */
+ UBA_MSG   uBA_MSG,  /* Unblocking acknowledgement message (UBA) */
+ UBL_MSG   uBL_MSG,  /* Unblocking message (UBL) */
+ UPA_MSG   uPA_MSG,  /* User Part available message (UPA) */
+ UPT_MSG   uPT_MSG,  /* User Part test message (UPT) */
+ UQC_MSG   uQC_MSG,  /* Unequipped CIC message (UQC) */
+ UUI_MSG   uUI_MSG,  /* User-to-user information message (UUI) */
+ UNKNOWN_MSG uNKNOWN_MSG  /* Message with undefined message type*/
+}
+
+type record ACM_MSG                                /* Address complete message (ACM) */
+{
+ Bit8 msgType ('00000110'B),                       /* Message Type '00000110'B */
+ BCI_PAR_v backwardCallIndicators,                 /* Backward call indicators, F, len=2 */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ ACM_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Address complete message (ACM) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x06)"; }
+
+type set ACM_OPTIONAL_PARAMS  /* SET: optional parameters of Address complete message (ACM) */
+{
+ OBCI_PAR_tlv optionalBackwardCallIndicators optional,   /* Optional backward call indicators, O, len=3 */
+ CRF_PAR_tlv callReference optional,                     /* Call reference, O, len=7 */
+ CAUI_PAR_tlv causeIndicators optional,                  /* Cause indicators, O, len=4-? */
+ UUID_PAR_tlv userToUserIndicators optional,             /* User-to-user indicators, O, len=3 */
+ UUIF_PAR_tlv userToUserInformation optional,            /* User-to-user information, O, len=3-131 */
+ ATP_PAR_tlv accessTransport optional,                   /* Access transport, O, len=3-? */
+ GNI_PAR_tlv genericNotificationIndicator1 optional,     /* Generic notification indicator1, O, len=3 */
+ GNI_PAR_tlv genericNotificationIndicator2 optional,     /* Generic notification indicator2, O, len=3 */
+ TMU_PAR_tlv transmissionMediumUsed optional,            /* Transmission medium used, O, len=3 */
+ ECI_PAR_tlv echoControlInformation optional,            /* Echo control information, O, len=3 */
+ ADI_PAR_tlv accessDeliveryInformation optional,         /* Access delivery information, O, len=3 */
+ RNN_PAR_tlv redirectionNumber optional,                 /* Redirection number, O, len=5-? */
+ PCI_PAR_tlv parameterCompatibilityInformation optional, /* Parameter compatibility information, O, len=4-? */
+ CDI_PAR_tlv callDiversionInformation optional,          /* Call diversion information, O, len=3 */
+ NSF_PAR_tlv networkSpecificFacility optional,           /* Network specific facility, O, len=4-? */
+ ROP_PAR_tlv remoteOperations optional,                  /* Remote operations, O, len=8-? */
+ SAC_PAR_tlv serviceActivation optional,                 /* Service activation, O, len=3-? */
+ RNS_PAR_tlv redirectionNumberRestriction optional,      /* Redirection number restriction, O, len=3 */
+ CTI_PAR_tlv conferenceTreatmentIndicators optional,     /* Conference treatment indicators, O, len=3-? */
+ UAI_PAR_tlv uIDActionIndicators optional,               /* UID action indicators, O, len=3-? */
+ APP_PAR_tlv applicationTransportParameter1 optional,    /* Application transport parameter1, O, len=5-? */
+ APP_PAR_tlv applicationTransportParameter2 optional,    /* Application transport parameter2, O, len=5-? */
+ CCPI_PAR_tlv cCNRPossibleIndicator optional,            /* CCNR possible indicator, O, len=3 */
+ HTRI_PAR_tlv hTRInformation optional,                   /* HTR information, O, len=4-? */
+ PRBI_PAR_tlv pivotRoutingBackwardInformation optional,  /* Pivot routing backward information, O, len=3-? */
+ RST_PAR_tlv redirectStatus optional,                     /* Redirect status, O, len=3 */
+ UNKNOWN_PAR_tlv unknownParameter  optional              /* Unknown parameter */
+}
+
+type record ANM_MSG /* Answer message (ANM) */
+{
+ Bit8 msgType('00001001'B),                        /* Message Type '00001001'B */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ ANM_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Answer message (ANM) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+//with { encode "present=bytes(1,0x09)"; }
+
+type set ANM_OPTIONAL_PARAMS  /* SET: optional parameters of Answer message (ANM) */
+{
+ BCI_PAR_tlv backwardCallIndicators optional,            /* Backward call indicators, O, len=4 */
+ OBCI_PAR_tlv optionalBackwardCallIndicators optional,   /* Optional backward call indicators, O, len=3 */
+ CRF_PAR_tlv callReference optional,                     /* Call reference, O, len=7 */
+ UUID_PAR_tlv userToUserIndicators optional,             /* User-to-user indicators, O, len=3 */
+ UUIF_PAR_tlv userToUserInformation optional,            /* User-to-user information, O, len=3-131 */
+ CPN_PAR_tlv connectedNumber optional,                   /* Connected number, O, len=4-? */
+ ATP_PAR_tlv accessTransport optional,                   /* Access transport, O, len=3-? */
+ ADI_PAR_tlv accessDeliveryInformation optional,         /* Access delivery information, O, len=3 */
+ GNI_PAR_tlv genericNotificationIndicator1 optional,     /* Generic notification indicator1, O, len=3 */
+ GNI_PAR_tlv genericNotificationIndicator2 optional,     /* Generic notification indicator2, O, len=3 */
+ PCI_PAR_tlv parameterCompatibilityInformation optional, /* Parameter compatibility information, O, len=4-? */
+ BGV_PAR_tlv backwardGVNS optional,                      /* Backward GVNS, O, len=3-? */
+ CHI_PAR_tlv callHistoryInformation optional,            /* Call history information, O, len=4 */
+ GNU_PAR_tlv genericNumber1 optional,                    /* Generic number1, O, len=5-? */
+ GNU_PAR_tlv genericNumber2 optional,                    /* Generic number2, O, len=5-? */
+ TMU_PAR_tlv transmissionMediumUsed optional,            /* Transmission medium used, O, len=3 */
+ NSF_PAR_tlv networkSpecificFacility optional,           /* Network specific facility, O, len=4-? */
+ ROP_PAR_tlv remoteOperations optional,                  /* Remote operations, O, len=8-? */
+ RNN_PAR_tlv redirectionNumber optional,                 /* Redirection number, O, len=5-? */
+ SAC_PAR_tlv serviceActivation optional,                 /* Service activation, O, len=3-? */
+ ECI_PAR_tlv echoControlInformation optional,            /* Echo control information, O, len=3 */
+ RNS_PAR_tlv redirectionNumberRestriction optional,      /* Redirection number restriction, O, len=3 */
+ DIF_PAR_tlv displayInformation optional,                /* Display information, O, len=3-? */
+ CTI_PAR_tlv conferenceTreatmentIndicators optional,     /* Conference treatment indicators, O, len=1-? */
+ APP_PAR_tlv applicationTransportParameter1 optional,    /* Application transport parameter1, O, len=5-? */
+ APP_PAR_tlv applicationTransportParameter2 optional,    /* Application transport parameter2, O, len=5-? */
+ PRBI_PAR_tlv pivotRoutingBackwardInformation optional,  /* Pivot routing backward information, O, len=3-? */
+ RST_PAR_tlv redirectStatus optional                     /* Redirect status, O, len=3 */
+}
+
+type record APM_MSG /* Application transport message (APM) */
+{
+ Bit8 msgType('01000001'B),                        /* Message Type '01000001'B */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ APM_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Application transport message (APM) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x41)"; }
+
+type set APM_OPTIONAL_PARAMS  /* SET: optional parameters of Application transport message (APM) */
+{
+ MCI_PAR_tlv messageCompatibilityInformation optional,   /* Message compatibility information, O, len=3-? */
+ PCI_PAR_tlv parameterCompatibilityInformation optional, /* Parameter compatibility information, O, len=4-? */
+ APP_PAR_tlv applicationTransportParameter1 optional,    /* Application transport parameter1, O, len=5-? */
+ APP_PAR_tlv applicationTransportParameter2 optional     /* Application transport parameter2, O, len=5-? */
+}
+
+type record BLA_MSG /* Blocking acknowledgement message (BLA) */
+{
+ Bit8 msgType ('00010101'B) /* Message Type '00010101'B */
+}
+//with { encode "present=bytes(1,0x15)"; }
+
+type record BLO_MSG /* Blocking message (BLO) */
+{
+ Bit8 msgType ('00010011'B) /* Message Type '00010011'B */
+}
+//with { encode "present=bytes(1,0x13)"; }
+
+type record CCR_MSG /* Continuity check request message (CCR) */
+{
+ Bit8 msgType ('00010001'B) /* Message Type '00010001'B */
+}
+//with { encode "present=bytes(1,0x11)"; }
+
+type record CFN_MSG /* Confusion message (CFN) */
+{
+ Bit8 msgType ('00101111'B),  /* Message Type '00101111'B */
+ Bit8 pCAUI,                  /* Pointer to parameter 'Cause indicators'. */
+ Bit8 pOptional,              /* Pointer to optional parameters. */
+ CAUI_PAR_lv causeIndicators, /* Cause indicators, V, len=3-? */
+ EOP endOfOptionalParameters optional /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x2F)"; }
+
+type record CGB_MSG /* Circuit group blocking message (CGB) */
+{
+ Bit8 msgType ('00011000'B),                    /* Message Type '00011000'B */
+ CGSM_PAR_v circuitGroupSupervisionMessageType, /* Circuit group supervision message type, F, len=1 */
+ Bit8 pRAS,                                     /* Pointer to parameter 'Range and status'. */
+ RAS_PAR_lv rangeAndStatus                      /* Range and status, V, len=3-34 */
+}
+with { encode "present=bytes(1,0x18)"; }
+
+type record CGBA_MSG /* Circuit group blocking acknowledgement message (CGBA) */
+{
+ Bit8 msgType ('00011010'B),                    /* Message Type '00011010'B */
+ CGSM_PAR_v circuitGroupSupervisionMessageType, /* Circuit group supervision message type, F, len=1 */
+ Bit8 pRAS,                                     /* Pointer to parameter 'Range and status'. */
+ RAS_PAR_lv rangeAndStatus                      /* Range and status, V, len=3-34 */
+}
+with { encode "present=bytes(1,0x1A)"; }
+
+type record CGQ_MSG /* Circuit group query message (CGQ) */
+{
+ Bit8 msgType ('00101010'B), /* Message Type '00101010'B */
+ Bit8 pRAS,                  /* Pointer to parameter 'Range and status'. */
+ RAS_PAR_lv rangeAndStatus   /* Range and status, V, len=2 */
+}
+with { encode "present=bytes(1,0x2A)"; }
+
+type record CGQR_MSG /* Circuit group query response message (CGQR) */
+{
+ Bit8 msgType ('00101011'B),      /* Message Type '00101011'B */
+ Bit8 pRAS,                       /* Pointer to parameter 'Range and status'. */
+ Bit8 pCSI,                       /* Pointer to parameter 'Circuit state indicator'. */
+ RAS_PAR_lv rangeAndStatus,       /* Range and status, V, len=2 */
+ CSI_PAR_lv circuitStateIndicator /* Circuit state indicator, V, len=2-33 */
+}
+with { encode "present=bytes(1,0x2B)"; }
+
+type record CGU_MSG /* Circuit group unblocking message (CGU) */
+{
+ Bit8 msgType ('00011001'B),                    /* Message Type '00011001'B */
+ CGSM_PAR_v circuitGroupSupervisionMessageType, /* Circuit group supervision message type, F, len=1 */
+ Bit8 pRAS,                                     /* Pointer to parameter 'Range and status'. */
+ RAS_PAR_lv rangeAndStatus                      /* Range and status, V, len=3-34 */
+}
+with { encode "present=bytes(1,0x19)"; }
+
+type record CGUA_MSG /* Circuit group unblocking acknowledgement message (CGUA) */
+{
+ Bit8 msgType ('00011011'B),                    /* Message Type '00011011'B */
+ CGSM_PAR_v circuitGroupSupervisionMessageType, /* Circuit group supervision message type, F, len=1 */
+ Bit8 pRAS,                                     /* Pointer to parameter 'Range and status'. */
+ RAS_PAR_lv rangeAndStatus                      /* Range and status, V, len=3-34 */
+}
+with { encode "present=bytes(1,0x1B)"; }
+
+type record CON_MSG /* Connect message (CON) */
+{
+ Bit8 msgType ('00000111'B),                       /* Message Type '00000111'B */
+ BCI_PAR_v backwardCallIndicators,                 /* Backward call indicators, F, len=2 */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ CON_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Connect message (CON) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x07)"; }
+
+type set CON_OPTIONAL_PARAMS  /* SET: optional parameters of Connect message (CON) */
+{
+ OBCI_PAR_tlv optionalBackwardCallIndicators optional,   /* Optional backward call indicators, O, len=3 */
+ BGV_PAR_tlv backwardGVNS optional,                      /* Backward GVNS, O, len=3-? */
+ CPN_PAR_tlv connectedNumber optional,                   /* Connected number, O, len=4-? */
+ CRF_PAR_tlv callReference optional,                     /* Call reference, O, len=7 */
+ UUID_PAR_tlv userToUserIndicators optional,             /* User-to-user indicators, O, len=3 */
+ UUIF_PAR_tlv userToUserInformation optional,            /* User-to-user information, O, len=3-131 */
+ ATP_PAR_tlv accessTransport optional,                   /* Access transport, O, len=3-? */
+ NSF_PAR_tlv networkSpecificFacility optional,           /* Network specific facility, O, len=4-? */
+ GNI_PAR_tlv genericNotificationIndicator1 optional,     /* Generic notification indicator1, O, len=3 */
+ GNI_PAR_tlv genericNotificationIndicator2 optional,     /* Generic notification indicator2, O, len=3 */
+ ROP_PAR_tlv remoteOperations optional,                  /* Remote operations, O, len=8-? */
+ TMU_PAR_tlv transmissionMediumUsed optional,            /* Transmission medium used, O, len=3 */
+ ECI_PAR_tlv echoControlInformation optional,            /* Echo control information, O, len=3 */
+ ADI_PAR_tlv accessDeliveryInformation optional,         /* Access delivery information, O, len=3 */
+ CHI_PAR_tlv callHistoryInformation optional,            /* Call history information, O, len=4 */
+ PCI_PAR_tlv parameterCompatibilityInformation optional, /* Parameter compatibility information, O, len=4-? */
+ SAC_PAR_tlv serviceActivation optional,                 /* Service activation, O, len=3-? */
+ GNU_PAR_tlv genericNumber1 optional,                    /* Generic number1, O, len=5-? */
+ GNU_PAR_tlv genericNumber2 optional,                    /* Generic number2, O, len=5-? */
+ RNS_PAR_tlv redirectionNumberRestriction optional,      /* Redirection number restriction, O, len=3 */
+ CTI_PAR_tlv conferenceTreatmentIndicators optional,     /* Conference treatment indicators, O, len=3-? */
+ APP_PAR_tlv applicationTransportParameter1 optional,    /* Application transport parameter1, O, len=5-? */
+ APP_PAR_tlv applicationTransportParameter2 optional,    /* Application transport parameter2, O, len=5-? */
+ HTRI_PAR_tlv hTRInformation optional,                   /* HTR information, O, len=4-? */
+ PRBI_PAR_tlv pivotRoutingBackwardInformation optional,  /* Pivot routing backward information, O, len=3-? */
+ RST_PAR_tlv redirectStatus optional                     /* Redirect status, O, len=3 */
+}
+
+type record COT_MSG /* Continuity message (COT) */
+{
+ Bit8 msgType ('00000101'B),    /* Message Type '00000101'B */
+ COI_PAR_v continuityIndicators /* Continuity indicators, F, len=1 */
+}
+with { encode "present=bytes(1,0x05)"; }
+
+type record CPG_MSG /* Call progress message (CPG) */
+{
+ Bit8 msgType ('00101100'B),                       /* Message Type '00101100'B */
+ EIF_PAR_v eventInformation,                       /* Event information, F, len=1 */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ CPG_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Call progress message (CPG) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x2C)"; }
+
+type set CPG_OPTIONAL_PARAMS  /* SET: optional parameters of Call progress message (CPG) */
+{
+ CAUI_PAR_tlv causeIndicators optional,                  /* Cause indicators, O, len=4-? */
+ CRF_PAR_tlv callReference optional,                     /* Call reference, O, len=7 */
+ BCI_PAR_tlv backwardCallIndicators optional,            /* Backward call indicators, O, len=4 */
+ OBCI_PAR_tlv optionalBackwardCallIndicators optional,   /* Optional backward call indicators, O, len=3 */
+ ATP_PAR_tlv accessTransport optional,                   /* Access transport, O, len=3-? */
+ UUID_PAR_tlv userToUserIndicators optional,             /* User-to-user indicators, O, len=3 */
+ RNN_PAR_tlv redirectionNumber optional,                 /* Redirection number, O, len=5-? */
+ UUIF_PAR_tlv userToUserInformation optional,            /* User-to-user information, O, len=3-131 */
+ GNI_PAR_tlv genericNotificationIndicator1 optional,     /* Generic notification indicator1, O, len=3 */
+ GNI_PAR_tlv genericNotificationIndicator2 optional,     /* Generic notification indicator2, O, len=3 */
+ NSF_PAR_tlv networkSpecificFacility optional,           /* Network specific facility, O, len=4-? */
+ ROP_PAR_tlv remoteOperations optional,                  /* Remote operations, O, len=8-? */
+ TMU_PAR_tlv transmissionMediumUsed optional,            /* Transmission medium used, O, len=3 */
+ ADI_PAR_tlv accessDeliveryInformation optional,         /* Access delivery information, O, len=3 */
+ PCI_PAR_tlv parameterCompatibilityInformation optional, /* Parameter compatibility information, O, len=4-? */
+ CDI_PAR_tlv callDiversionInformation optional,          /* Call diversion information, O, len=3 */
+ SAC_PAR_tlv serviceActivation optional,                 /* Service activation, O, len=3-? */
+ RNS_PAR_tlv redirectionNumberRestriction optional,      /* Redirection number restriction, O, len=3 */
+ CTN_PAR_tlv callTransferNumber optional,                /* Call transfer number, O, len=4-? */
+ ECI_PAR_tlv echoControlInformation optional,            /* Echo control information, O, len=3 */
+ CPN_PAR_tlv connectedNumber optional,                   /* Connected number, O, len=4-? */
+ BGV_PAR_tlv backwardGVNS optional,                      /* Backward GVNS, O, len=3-? */
+ GNU_PAR_tlv genericNumber1 optional,                    /* Generic number1, O, len=5-? */
+ GNU_PAR_tlv genericNumber2 optional,                    /* Generic number2, O, len=5-? */
+ CHI_PAR_tlv callHistoryInformation optional,            /* Call history information, O, len=4 */
+ CTI_PAR_tlv conferenceTreatmentIndicators optional,     /* Conference treatment indicators, O, len=3-? */
+ UAI_PAR_tlv uIDActionIndicators optional,               /* UID action indicators, O, len=3-? */
+ APP_PAR_tlv applicationTransportParameter1 optional,    /* Application transport parameter1, O, len=5-? */
+ APP_PAR_tlv applicationTransportParameter2 optional,    /* Application transport parameter2, O, len=5-? */
+ CCPI_PAR_tlv cCNRPossibleIndicator optional,            /* CCNR possible indicator, O, len=3 */
+ PRBI_PAR_tlv pivotRoutingBackwardInformation optional,  /* Pivot routing backward information, O, len=3-? */
+ RST_PAR_tlv redirectStatus optional,                    /* Redirect status, O, len=3 */
+ UNKNOWN_PAR_tlv unknownParameter  optional              /* Unknown parameter */
+}
+
+type record CPG_MSG_unknown_parameter /* Call progress message (CPG) with one unknown optional parameters */
+{
+ Bit8 msgType ('00101100'B),               /* Message Type '00101100'B */
+ EIF_PAR_v eventInformation,               /* Event information, F, len=1 */
+ Bit8 pOptional ('00000001'B),             /* Pointer to optional parameters. */
+ UNKNOWN_PAR_tlv unknownParameter,         /* Unknown parameter */
+ EOP endOfOptionalParameters ('00000000'B) /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x2C)"; }
+
+type record FAA_MSG /* Facility accepted message (FAA) */
+{
+ Bit8 msgType ('00100000'B),                       /* Message Type '00100000'B */
+ FAI_PAR_v facilityIndicator,                      /* Facility indicator, F, len=1 */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ FAA_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Facility accepted message (FAA) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x20)"; }
+
+type set FAA_OPTIONAL_PARAMS  /* SET: optional parameters of Facility accepted message (FAA) */
+{
+ UUID_PAR_tlv userToUserIndicators optional,             /* User-to-user indicators, O, len=3 */
+ CRF_PAR_tlv callReference optional,                     /* Call reference, O, len=7 */
+ CRQ_PAR_tlv connectionRequest optional,                 /* Connection request, O, len=7-9 */
+ PCI_PAR_tlv parameterCompatibilityInformation optional  /* Parameter compatibility information, O, len=4-? */
+}
+
+type record FAC_MSG /* Facility message (FAC) */
+{
+ Bit8 msgType('00110011'B),                        /* Message Type '00110011'B */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ FAC_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Facility message (FAC) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x33)"; }
+
+type set FAC_OPTIONAL_PARAMS  /* SET: optional parameters of Facility message (FAC) */
+{
+ MCI_PAR_tlv messageCompatibilityInformation optional,   /* Message compatibility information, O, len=3-? */
+ PCI_PAR_tlv parameterCompatibilityInformation optional, /* Parameter compatibility information, O, len=4-? */
+ ROP_PAR_tlv remoteOperations optional,                  /* Remote operations, O, len=8-? */
+ SAC_PAR_tlv serviceActivation optional,                 /* Service activation, O, len=3-? */
+ CTN_PAR_tlv callTransferNumber optional,                /* Call transfer number, O, len=4-? */
+ ATP_PAR_tlv accessTransport optional,                   /* Access transport, O, len=3-? */
+ GNI_PAR_tlv genericNotificationIndicator1 optional,     /* Generic notification indicator1, O, len=3 */
+ GNI_PAR_tlv genericNotificationIndicator2 optional,     /* Generic notification indicator2, O, len=3 */
+ RNN_PAR_tlv redirectionNumber optional,                 /* Redirection number, O, len=4-? */
+ PRI_PAR_tlv pivotRoutingIndicators optional,            /* Pivot routing indicators, O, len=3 */
+ PST_PAR_tlv pivotStatus optional,                       /* Pivot status, O, len=3 */
+ PICN_PAR_tlv pivotCounter optional,                     /* Pivot counter, O, len=3 */
+ PRBI_PAR_tlv pivotRoutingBackwardInformation optional,  /* Pivot routing backward information, O, len=3-? */
+ RST_PAR_tlv redirectStatus optional                     /* Redirect status, O, len=3-? */
+}
+
+type record FAR_MSG /* Facility request message (FAR) */
+{
+ Bit8 msgType ('00011111'B),                       /* Message Type '00011111'B */
+ FAI_PAR_v facilityIndicator,                      /* Facility indicator, F, len=1 */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ FAR_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Facility request message (FAR) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x1F)"; }
+
+type set FAR_OPTIONAL_PARAMS  /* SET: optional parameters of Facility request message (FAR) */
+{
+ UUID_PAR_tlv userToUserIndicators optional,             /* User-to-user indicators, O, len=3 */
+ CRF_PAR_tlv callReference optional,                     /* Call reference, O, len=7 */
+ CRQ_PAR_tlv connectionRequest optional,                 /* Connection request, O, len=7-9 */
+ PCI_PAR_tlv parameterCompatibilityInformation optional  /* Parameter compatibility information, O, len=4-? */
+}
+
+type record FRJ_MSG /* Facility reject message (FRJ) */
+{
+ Bit8 msgType('00100001'B),                       /* Message Type '00100001'B */
+ FAI_PAR_v facilityIndicator,                     /* Facility indicator, F, len=1 */
+ Bit8 pCAUI,                                      /* Pointer to parameter 'Cause indicators'. */
+ Bit8 pOptional,                                  /* Pointer to optional parameters. */
+ CAUI_PAR_lv causeIndicators,                     /* Cause indicators, V, len=3-? */
+ FRJ_OPTIONAL_PARAMS optionalParameters optional, /* SET: optional parameters of Facility reject message (FRJ) */
+ EOP endOfOptionalParameters optional             /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x21)"; }
+
+type set FRJ_OPTIONAL_PARAMS  /* SET: optional parameters of Facility reject message (FRJ) */
+{
+ UUID_PAR_tlv userToUserIndicators optional  /* User-to-user indicators, O, len=3 */
+}
+
+type record FTR_MSG /* Forward transfer message (FTR) */
+{
+ Bit8 msgType('00001000'B),                       /* Message Type '00001000'B */
+ Bit8 pOptional,                                  /* Pointer to optional parameters. */
+ FTR_OPTIONAL_PARAMS optionalParameters optional, /* SET: optional parameters of Forward transfer message (FTR) */
+ EOP endOfOptionalParameters optional             /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x08)"; }
+
+type set FTR_OPTIONAL_PARAMS  /* SET: optional parameters of Forward transfer message (FTR) */
+{
+ CRF_PAR_tlv callReference optional  /* Call reference, O, len=7 */
+}
+
+type record GRA_MSG /* Circuit group reset acknowledgement message (GRA) */
+{
+ Bit8 msgType ('00101001'B), /* Message Type '00101001'B */
+ Bit8 pRAS,                  /* Pointer to parameter 'Range and status'. */
+ RAS_PAR_lv rangeAndStatus   /* Range and status, V, len=3-34 */
+}
+with { encode "present=bytes(1,0x29)"; }
+
+type record GRS_MSG /* Circuit group reset message (GRS) */
+{
+ Bit8 msgType ('00010111'B), /* Message Type '00010111'B */
+ Bit8 pRAS,                  /* Pointer to parameter 'Range and status'. */
+ RAS_PAR_lv rangeAndStatus   /* Range and status, V, len=2 */
+}
+with { encode "present=bytes(1,0x17)"; }
+
+type record IAM_MSG /* Initial address message (IAM) */
+{
+ Bit8 msgType ('00000001'B),                       /* Message Type '00000001'B */
+ NCI_PAR_v natureOfConnectionIndicators,           /* Nature of connection indicators, F, len=1 */
+ FCI_PAR_v forwardCallIndicators,                  /* Forward call indicators, F, len=2 */
+ CGC_PAR_v callingPartysCategory,                  /* Calling party's category, F, len=1 */
+ TMR_PAR_v transmissionMediumRequirement,          /* Transmission medium requirement, F, len=1 */
+ Bit8 pCDN,                                        /* Pointer to parameter 'Called party number'. */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ CDN_PAR_lv calledPartyNumber,                     /* Called party number, V, len=4-? */
+ IAM_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Initial address message (IAM) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x01)"; }
+
+type set IAM_OPTIONAL_PARAMS  /* SET: optional parameters of Initial address message (IAM) */
+{
+ TNS_PAR_tlv transitNetworkSelection optional,              /* Transit network selection, O, len=4-? */
+ CRF_PAR_tlv callReference optional,                        /* Call reference, O, len=7 */
+ CGN_PAR_tlv callingPartyNumber optional,                   /* Calling party number, O, len=4-? */
+ OFCI_PAR_tlv optionalForwardCallIndicators optional,       /* Optional forward call indicators, O, len=3 */
+ RDN_PAR_tlv redirectingNumber optional,                    /* Redirecting number, O, len=4-? */
+ RDI_PAR_tlv redirectionInformation optional,               /* Redirection information, O, len=3-4 */
+ CUGIC_PAR_tlv closedUserGroupInterlockCode optional,       /* Closed user group interlock code, O, len=6 */
+ CRQ_PAR_tlv connectionRequest optional,                    /* Connection request, O, len=7-9 */
+ OCN_PAR_tlv originalCalledNumber optional,                 /* Original called number, O, len=4-? */
+ UUIF_PAR_tlv userToUserInformation optional,               /* User-to-user information, O, len=3-131 */
+ ATP_PAR_tlv accessTransport optional,                      /* Access transport, O, len=3-? */
+ USI_PAR_tlv userServiceInformation optional,               /* User service information, O, len=4-13 */
+ UUID_PAR_tlv userToUserIndicators optional,                /* User-to-user indicators, O, len=3 */
+ GNU_PAR_tlv genericNumber1 optional,                       /* Generic number1, O, len=5-? */
+ GNU_PAR_tlv genericNumber2 optional,                       /* Generic number2, O, len=5-? */
+ PDC_PAR_tlv propagationDelayCounter optional,              /* Propagation delay counter, O, len=4 */
+ USIP_PAR_tlv userServiceInformationPrime optional,         /* User service information prime, O, len=4-13 */
+ NSF_PAR_tlv networkSpecificFacility optional,              /* Network specific facility, O, len=4-? */
+ GDG_PAR_tlv genericDigits1 optional,                       /* Generic digits1, O, len=4-? */
+ GDG_PAR_tlv genericDigits2 optional,                       /* Generic digits2, O, len=4-? */
+ OIPC_PAR_tlv originationISCPointCode optional,             /* Origination ISC point code, O, len=4 */
+ UTSI_PAR_tlv userTeleserviceInformation optional,          /* User teleservice information, O, len=4-5 */
+ ROP_PAR_tlv remoteOperations optional,                     /* Remote operations, O, len=8-? */
+ PCI_PAR_tlv parameterCompatibilityInformation optional,    /* Parameter compatibility information, O, len=4-? */
+ GNI_PAR_tlv genericNotificationIndicator1 optional,        /* Generic notification indicator1, O, len=3 */
+ GNI_PAR_tlv genericNotificationIndicator2 optional,        /* Generic notification indicator2, O, len=3 */
+ SAC_PAR_tlv serviceActivation optional,                    /* Service activation, O, len=3-? */
+ MLPP_PAR_tlv mLPPPrecedence optional,                      /* MLPP precedence, O, len=8 */
+ TMRP_PAR_tlv transmissionMediumRequirementPrime optional,  /* Transmission medium requirement prime, O, len=3 */
+ LON_PAR_tlv locationNumber optional,                       /* Location number, O, len=4-? */
+ FGVNS_PAR_tlv forwardGVNS optional,                        /* Forward GVNS, O, len=5-26 */
+ CCSS_PAR_tlv cCSS optional,                                /* CCSS, O, len=3-? */
+ NMC_PAR_tlv networkManagementControls optional,            /* Network management controls, O, len=3-? */
+ CAM_PAR_tlv circuitAssignmentMap optional,                 /* Circuit assignment map, O, len=6-7 */
+ CRI_PAR_tlv correlationId optional,                        /* Correlation id, O, len=3-? */
+ CDTI_PAR_tlv callDiversionTreatmentIndicators optional,    /* Call diversion treatment indicators, O, len=3-? */
+ CIN_PAR_tlv calledINNumber optional,                       /* Called IN number, O, len=4-? */
+ COTI_PAR_tlv callOfferingTreatmentIndicators optional,     /* Call offering treatment indicators, O, len=3-? */
+ CTI_PAR_tlv conferenceTreatmentIndicators optional,        /* Conference treatment indicators, O, len=3-? */
+ SCFI_PAR_tlv sCFId optional,                               /* SCF id, O, len=3-? */
+ UCI_PAR_tlv uIDCapabilityIndicators optional,              /* UID capability indicators, O, len=3-? */
+ ECI_PAR_tlv echoControlInformation optional,               /* Echo control information, O, len=3 */
+ HPC_PAR_tlv hopCounter optional,                           /* Hop counter, O, len=3 */
+ CCRQ_PAR_tlv collectCallRequest optional,                  /* Collect call request, O, len=3 */
+ APP_PAR_tlv applicationTransportParameter1 optional,       /* Application transport parameter1, O, len=5-? */
+ APP_PAR_tlv applicationTransportParameter2 optional,       /* Application transport parameter2, O, len=5-? */
+ PICP_PAR_tlv pivotCapability optional,                     /* Pivot capability, O, len=3 */
+ CDIN_PAR_tlv calledDirectoryNumber optional,               /* Called directory number, O, len=5-? */
+ OCI_PAR_tlv originalCalledINNumber optional,               /* Original called IN number, O, len=4-? */
+ CGL_PAR_tlv callingGeodeticLocation optional,              /* Calling geodetic location, O, len=3-? */
+ NRN_PAR_tlv networkRoutingNumber optional,                 /* Network routing number, O, len=4-? */
+ QRC_PAR_tlv queryOnReleaseCapability optional,             /* Query on release capability, O, len=3 */
+ PICN_PAR_tlv pivotCounter optional,                        /* Pivot counter, O, len=3 */
+ PRFI_PAR_tlv pivotRoutingForwardInformation optional,      /* Pivot routing forward information, O, len=3-? */
+ RCP_PAR_tlv redirectCapability optional,                   /* Redirect capability, O, len=3 */
+ RCN_PAR_tlv redirectCounter optional,                      /* Redirect counter, O, len=3 */
+ RST_PAR_tlv redirectStatus optional,                       /* Redirect status, O, len=3 */
+ RFI_PAR_tlv redirectForwardInformation optional,           /* Redirect forward information, O, len=3-? */
+ NPFI_PAR_tlv numberPortabilityForwardInformation optional, /* Number portability forward information, O, len=1-? */
+ ARR_PAR_tlv automaticReRouting optional                    /* Automatic re-routing, O, len=4-? */
+}
+
+type record IDR_MSG /* Identification request message (IDR) */
+{
+ Bit8 msgType('00110110'B),                        /* Message Type '00110110'B */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ IDR_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Identification request message (IDR) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x36)"; }
+
+type set IDR_OPTIONAL_PARAMS  /* SET: optional parameters of Identification request message (IDR) */
+{
+ MCRI_PAR_tlv mCIDRequestIndicators optional,            /* MCID request indicators, O, len=3 */
+ MCI_PAR_tlv messageCompatibilityInformation optional,   /* Message compatibility information, O, len=3-? */
+ PCI_PAR_tlv parameterCompatibilityInformation optional  /* Parameter compatibility information, O, len=4-? */
+}
+
+type record INF_MSG /* Information message (INF) */
+{
+ Bit8 msgType ('00000100'B),                       /* Message Type '00000100'B */
+ IID_PAR_v informationIndicators,                  /* Information indicators, F, len=2 */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ INF_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Information message (INF) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x04)"; }
+
+type set INF_OPTIONAL_PARAMS  /* SET: optional parameters of Information message (INF) */
+{
+ CGC_PAR_tlv callingPartysCategory optional,             /* Calling party's category, O, len=3 */
+ CGN_PAR_tlv callingPartyNumber optional,                /* Calling party number, O, len=4-? */
+ CRF_PAR_tlv callReference optional,                     /* Call reference, O, len=7 */
+ CRQ_PAR_tlv connectionRequest optional,                 /* Connection request, O, len=7-9 */
+ PCI_PAR_tlv parameterCompatibilityInformation optional, /* Parameter compatibility information, O, len=4-? */
+ NSF_PAR_tlv networkSpecificFacility optional            /* Network specific facility, O, len=4-? */
+}
+
+type record INR_MSG /* Information request message (INR) */
+{
+ Bit8 msgType ('00000011'B),                       /* Message Type '00000011'B */
+ IRI_PAR_v informationRequestIndicators,           /* Information request indicators, F, len=2 */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ INR_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Information request message (INR) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x03)"; }
+
+type set INR_OPTIONAL_PARAMS  /* SET: optional parameters of Information request message (INR) */
+{
+ CRF_PAR_tlv callReference optional,                     /* Call reference, O, len=7 */
+ NSF_PAR_tlv networkSpecificFacility optional,           /* Network specific facility, O, len=4-? */
+ PCI_PAR_tlv parameterCompatibilityInformation optional  /* Parameter compatibility information, O, len=4-? */
+}
+
+type record IRS_MSG /* Identification response message (IRS) */
+{
+ Bit8 msgType('00110111'B),                        /* Message Type '00110111'B */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ IRS_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Identification response message (IRS) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x37)"; }
+
+type set IRS_OPTIONAL_PARAMS  /* SET: optional parameters of Identification response message (IRS) */
+{
+ MCRS_PAR_tlv mCIDResponseIndicators optional,           /* MCID response indicators, O, len=3 */
+ MCI_PAR_tlv messageCompatibilityInformation optional,   /* Message compatibility information, O, len=3-? */
+ PCI_PAR_tlv parameterCompatibilityInformation optional, /* Parameter compatibility information, O, len=4-? */
+ CGN_PAR_tlv callingPartyNumber optional,                /* Calling party number, O, len=4-? */
+ ATP_PAR_tlv accessTransport optional,                   /* Access transport, O, len=3-? */
+ GNU_PAR_tlv genericNumber1 optional,                    /* Generic number1, O, len=5-? */
+ GNU_PAR_tlv genericNumber2 optional                     /* Generic number2, O, len=5-? */
+}
+
+type record LBA_MSG /* Loop back acknowledgement message (LBA) */
+{
+ Bit8 msgType ('00100100'B) /* Message Type '00100100'B */
+}
+//with { encode "present=bytes(1,0x24)"; }
+
+type record LOP_MSG /* Loop prevention message (LOP) */
+{
+ Bit8 msgType('01000000'B),                        /* Message Type '01000000'B */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ LOP_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Loop prevention message (LOP) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x40)"; }
+
+type set LOP_OPTIONAL_PARAMS  /* SET: optional parameters of Loop prevention message (LOP) */
+{
+ MCI_PAR_tlv messageCompatibilityInformation optional,   /* Message compatibility information, O, len=3-? */
+ PCI_PAR_tlv parameterCompatibilityInformation optional, /* Parameter compatibility information, O, len=4-? */
+ CTR_PAR_tlv callTransferReference optional,             /* Call transfer reference, O, len=3 */
+ LPPI_PAR_tlv loopPreventionIndicators optional          /* Loop prevention indicators, O, len=3 */
+}
+
+type record NRM_MSG /* Network resource management message (NRM) */
+{
+ Bit8 msgType('00110010'B),                        /* Message Type '00110010'B */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ NRM_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Network resource management message (NRM) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x32)"; }
+
+type set NRM_OPTIONAL_PARAMS  /* SET: optional parameters of Network resource management message (NRM) */
+{
+ MCI_PAR_tlv messageCompatibilityInformation optional,   /* Message compatibility information, O, len=3-? */
+ PCI_PAR_tlv parameterCompatibilityInformation optional, /* Parameter compatibility information, O, len=4-? */
+ ECI_PAR_tlv echoControlInformation optional             /* Echo control information, O, len=3 */
+}
+
+type record OVL_MSG /* Overload message (OVL) */
+{
+ Bit8 msgType ('00110000'B) /* Message Type '00110000'B */
+}
+//with { encode "present=bytes(1,0x30)"; }
+
+type record PRI_MSG /* Pre-release information message (PRI) */
+{
+ Bit8 msgType('01000010'B),                        /* Message Type '01000010'B */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ PRI_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Pre-release information message (PRI) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x42)"; }
+
+type set PRI_OPTIONAL_PARAMS  /* SET: optional parameters of Pre-release information message (PRI) */
+{
+ MCI_PAR_tlv messageCompatibilityInformation optional,   /* Message compatibility information, O, len=3-? */
+ PCI_PAR_tlv parameterCompatibilityInformation optional, /* Parameter compatibility information, O, len=4-? */
+ OFCI_PAR_tlv optionalForwardCallIndicators optional,    /* Optional forward call indicators, O, len=3 */
+ OBCI_PAR_tlv optionalBackwardCallIndicators optional,   /* Optional backward call indicators, O, len=3 */
+ APP_PAR_tlv applicationTransportParameter1 optional,    /* Application transport parameter1, O, len=5-? */
+ APP_PAR_tlv applicationTransportParameter2 optional     /* Application transport parameter2, O, len=5-? */
+}
+
+type record REL_MSG /* Release message (REL) */
+{
+ Bit8 msgType ('00001100'B),                       /* Message Type '00001100'B */
+ Bit8 pCAUI,                                       /* Pointer to parameter 'Cause indicators'. */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ CAUI_PAR_lv causeIndicators,                      /* Cause indicators, V, len=3-? */
+ REL_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Release message (REL) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x0C)"; }
+
+type set REL_OPTIONAL_PARAMS  /* SET: optional parameters of Release message (REL) */
+{
+ RDI_PAR_tlv redirectionInformation optional,            /* Redirection information, O, len=3-4 */
+ RNN_PAR_tlv redirectionNumber optional,                 /* Redirection number, O, len=5-? */
+ ATP_PAR_tlv accessTransport optional,                   /* Access transport, O, len=3-? */
+ SPC_PAR_tlv signallingPointCode optional,               /* Signalling point code, O, len=4 */
+ UUIF_PAR_tlv userToUserInformation optional,            /* User-to-user information, O, len=3-131 */
+ ACL_PAR_tlv automaticCongestionLevel optional,          /* Automatic congestion level, O, len=3 */
+ NSF_PAR_tlv networkSpecificFacility optional,           /* Network specific facility, O, len=4-? */
+ ADI_PAR_tlv accessDeliveryInformation optional,         /* Access delivery information, O, len=3 */
+ PCI_PAR_tlv parameterCompatibilityInformation optional, /* Parameter compatibility information, O, len=4-? */
+ UUID_PAR_tlv userToUserIndicators optional,             /* User-to-user indicators, O, len=3 */
+ DIF_PAR_tlv displayInformation optional,                /* Display information, O, len=3-? */
+ ROP_PAR_tlv remoteOperations optional,                  /* Remote operations, O, len=8-? */
+ HTRI_PAR_tlv hTRInformation optional,                   /* HTR information, O, len=4-? */
+ RCN_PAR_tlv redirectCounter optional,                   /* Redirect counter, O, len=3 */
+ RBI_PAR_tlv redirectBackwardInformation optional        /* Redirect backward information, O, len=3-? */
+}
+
+type record RES_MSG /* Resume message (RES) */
+{
+ Bit8 msgType ('00001110'B),                      /* Message Type '00001110'B */
+ SRI_PAR_v suspendResumeIndicators,               /* Suspend Resume indicators, F, len=1 */
+ Bit8 pOptional,                                  /* Pointer to optional parameters. */
+ RES_OPTIONAL_PARAMS optionalParameters optional, /* SET: optional parameters of Resume message (RES) */
+ EOP endOfOptionalParameters optional             /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x0E)"; }
+
+type set RES_OPTIONAL_PARAMS  /* SET: optional parameters of Resume message (RES) */
+{
+ CRF_PAR_tlv callReference optional  /* Call reference, O, len=7 */
+}
+
+type record RLC_MSG /* Release complete message (RLC) */
+{
+ Bit8 msgType('00010000'B),                       /* Message Type '00010000'B */
+ Bit8 pOptional,                                  /* Pointer to optional parameters. */
+ RLC_OPTIONAL_PARAMS optionalParameters optional, /* SET: optional parameters of Release complete message (RLC) */
+ EOP endOfOptionalParameters optional             /* End of optional parameters, O, len=1 */
+}
+//with { encode "present=bytes(1,0x010)"; }
+
+type set RLC_OPTIONAL_PARAMS  /* SET: optional parameters of Release complete message (RLC) */
+{
+ CAUI_PAR_tlv causeIndicators optional /* Cause indicators, O, len=5-6 */
+}
+
+type record RSC_MSG /* Reset circuit message (RSC) */
+{
+ Bit8 msgType ('00010010'B) /* Message Type '00010010'B */
+}
+//with { encode "present=bytes(1,0x12)"; }
+
+type record SAM_MSG /* Subsequent address message (SAM) */
+{
+ Bit8 msgType ('00000010'B),          /* Message Type '00000010'B */
+ Bit8 pSNN,                           /* Pointer to parameter 'Subsequent number'. */
+ Bit8 pOptional,                      /* Pointer to optional parameters. */
+ SNN_PAR_lv subsequentNumber,         /* Subsequent number, V, len=3-? */
+ EOP endOfOptionalParameters optional /* End of optional parameters, O, len=1 */
+}with { encode "present=bytes(1,0x02)"; }
+
+type record SDN_MSG /* Subsequent Directory Number message (SDN) */
+{
+ Bit8 msgType('01000011'B),                        /* Message Type '01000011'B */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ SDN_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Subsequent Directory Number message (SDN) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x43)"; }
+
+
+type set SDN_OPTIONAL_PARAMS  /* SET: optional parameters of Subsequent Directory Number message (SDN) */
+{
+ SNN_PAR_tlv subsequentNumber optional,                /* Subsequent number, O, len=4-? */
+ MCI_PAR_tlv messageCompatibilityInformation optional  /* Message compatibility information, O, len=4-? */
+}
+
+type record SEG_MSG /* Segmentation message (SEG) */
+{
+ Bit8 msgType('00111000'B),                        /* Message Type '00111000'B */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ SEG_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of Segmentation message (SEG) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x38)"; }
+
+type set SEG_OPTIONAL_PARAMS  /* SET: optional parameters of Segmentation message (SEG) */
+{
+ ATP_PAR_tlv accessTransport optional,                 /* Access transport, O, len=3-? */
+ UUIF_PAR_tlv userToUserInformation optional,          /* User-to-user information, O, len=3-131 */
+ MCI_PAR_tlv messageCompatibilityInformation optional, /* Message compatibility information, O, len=3-? */
+ GDG_PAR_tlv genericDigits1 optional,                  /* Generic digits1, O, len=4-? */
+ GDG_PAR_tlv genericDigits2 optional,                  /* Generic digits2, O, len=4-? */
+ GNI_PAR_tlv genericNotificationIndicator1 optional,   /* Generic notification indicator1, O, len=3 */
+ GNI_PAR_tlv genericNotificationIndicator2 optional,   /* Generic notification indicator2, O, len=3 */
+ GNU_PAR_tlv genericNumber1 optional,                  /* Generic number1, O, len=5-? */
+ GNU_PAR_tlv genericNumber2 optional                   /* Generic number2, O, len=5-? */
+}
+
+type record SUS_MSG /* Suspend message (SUS) */
+{
+ Bit8 msgType ('00001101'B),                      /* Message Type '00001101'B */
+ SRI_PAR_v suspendResumeIndicators,               /* Suspend Resume indicators, F, len=1 */
+ Bit8 pOptional,                                  /* Pointer to optional parameters. */
+ SUS_OPTIONAL_PARAMS optionalParameters optional, /* SET: optional parameters of Suspend message (SUS) */
+ EOP endOfOptionalParameters optional             /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x0D)"; }
+
+type set SUS_OPTIONAL_PARAMS  /* SET: optional parameters of Suspend message (SUS) */
+{
+ CRF_PAR_tlv callReference optional  /* Call reference, O, len=7 */
+}
+
+type record UBA_MSG /* Unblocking acknowledgement message (UBA) */
+{
+ Bit8 msgType ('00010110'B) /* Message Type '00010110'B */
+}
+//with { encode "present=bytes(1,0x16)"; }
+
+type record UBL_MSG /* Unblocking message (UBL) */
+{
+ Bit8 msgType ('00010100'B) /* Message Type '00010100'B */
+}
+//with { encode "present=bytes(1,0x14)"; }
+
+type record UPA_MSG /* User Part available message (UPA) */
+{
+ Bit8 msgType('00110101'B),                        /* Message Type '00110101'B */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ UPA_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of User Part available message (UPA) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x35)"; }
+
+type set UPA_OPTIONAL_PARAMS  /* SET: optional parameters of User Part available message (UPA) */
+{
+ PCI_PAR_tlv parameterCompatibilityInformation optional  /* Parameter compatibility information, O, len=4-? */
+}
+
+type record UPT_MSG /* User Part test message (UPT) */
+{
+ Bit8 msgType('00110100'B),                        /* Message Type '00110100'B */
+ Bit8 pOptional,                                   /* Pointer to optional parameters. */
+ UPT_OPTIONAL_PARAMS optionalParameters optional,  /* SET: optional parameters of User Part test message (UPT) */
+ EOP endOfOptionalParameters optional              /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x34)"; }
+
+type set UPT_OPTIONAL_PARAMS  /* SET: optional parameters of User Part test message (UPT) */
+{
+ PCI_PAR_tlv parameterCompatibilityInformation optional  /* Parameter compatibility information, O, len=4-? */
+}
+
+type record UQC_MSG /* Unequipped CIC message (UQC) */
+{
+ Bit8 msgType ('00101110'B) /* Message Type '00101110'B */
+}
+//with { encode "present=bytes(1,0x2E)"; }
+
+type record UUI_MSG /* User-to-user information message (UUI) */
+{
+ Bit8 msgType ('00101101'B),                      /* Message Type '00101101'B */
+ Bit8 pUUIF,                                      /* Pointer to parameter 'User-to-user information'. */
+ Bit8 pOptional,                                  /* Pointer to optional parameters. */
+ UUIF_PAR_lv userToUserInformation,               /* User-to-user information, V, len=2-130 */
+ UUI_OPTIONAL_PARAMS optionalParameters optional, /* SET: optional parameters of User-to-user information message (UUI) */
+ EOP endOfOptionalParameters optional             /* End of optional parameters, O, len=1 */
+}
+with { encode "present=bytes(1,0x2D)"; }
+
+type set UUI_OPTIONAL_PARAMS  /* SET: optional parameters of User-to-user information message (UUI) */
+{
+ ATP_PAR_tlv accessTransport optional /* Access transport, O, len=3-? */
+}
+
+type record UNKNOWN_MSG /* Message with unknown message type */
+{
+ Bit8 msgType,                                /* Unknown Message Type, e.g. '01001010'B */
+ Bit8 pOptional,                              /* Pointer to optional parameters. */
+ MCI_PAR_tlv messageCompatibilityInformation, /* Message compatibility information, O, len=4-? */
+ EOP endOfOptionalParameters                  /* End of optional parameters, O, len=1 */
+}
+} /* end group ISUP_BICC_Messages */
+
+group ISUP_BICC_ASPs {
+type record ISUP_BICC_MSG_req /* ASP used to send an ISUP/BICC message */
+{
+ ServiceIndicatorOctet     serviceIndicatorOctet optional,  /* contents only evaluated if ISUP selected */
+ RoutingLabel              routingLabel optional,           /* contents only evaluated if ISUP selected */
+ CircuitIdentityCode       circuitIdentityCode optional,    /* contents only evaluated if ISUP selected */
+ CallInstanceCode          callInstanceCode optional,       /* contents only evaluated if BICC selected */
+ ISUP_BICC_MSG             iSUP_BICC_MSG optional           /* common part of ISUP/BICC message */
+} with { encode "ISUPCodec" }
+
+/* Additional comments:
+The SA takes from the ASP, depending on the value of module parameter 'PX_ISUP_Isup', either the 
+ordered combination of 'serviceIndicatorOctet', 'routingLabel' and 'circuitIdentityCode' (ISUP), 
+or 'callInstanceCode' (BICC'), puts it in front of encoded parameter 'iSUP_BICC_MSG', and sends the 
+so constructed message at the ISUP or BICC interface respectively.*/
+
+
+type record ISUP_BICC_MSG_ind /* ASP used to receive an ISUP/BICC message */
+{
+	ServiceIndicatorOctet     serviceIndicatorOctet optional,  /* contents only evaluated if ISUP selected */
+	RoutingLabel              routingLabel optional,           /* contents only evaluated if ISUP selected */
+	CircuitIdentityCode       circuitIdentityCode optional,    /* contents only evaluated if ISUP selected */
+	CallInstanceCode          callInstanceCode optional,       /* contents only evaluated if BICC selected */
+	ISUP_BICC_MSG             iSUP_BICC_MSG optional           /* common part of ISUP/BICC message */
+} with { encode "ISUPCodec" }
+/* Additional comments:
+The SA takes from the received message, depending on the value of module parameter 'PX_ISUP_Isup', 
+either the ordered combination of 'serviceIndicatorOctet', 'routingLabel' and 
+'circuitIdentityCode' (ISUP), or 'callInstanceCode' (BICC'), and puts it into the associated ASP 
+parameters. The complementary ASP parameters 'callInstanceCode' (ISUP) and combination of 
+'serviceIndicatorOctet', 'routingLabel' and 'circuitIdentityCode' (BICC) are filled by the SA with '0' bits 
+according to the lengths of their types.
+The TE does not evaluate the contents of the complementary parameters (but needs the coorect lengths 
+to identify the start of 'iSUP_BICC_MSG'.
+The received message (body) is put by the SA into parameter 'iSUP_BICC_MSG' and is matched in the ATS with an according receive template.*/
+} /* end group ISUP_BICC_ASPs */
+
+group BICC_ASPs {
+type record InitializeIsupBicc_req /* ASP used to Initialize the ISUP/BICC part of the test system. */
+{
+ Bit14            ts_pointCode optional,         /* Signalling point code of the TS (ISUP). */
+ Bit14            sut_pointCode optional,        /* Signalling point code of the SUT (ISUP). */
+ octetstring      ts_address_isup_bicc optional, /* Address (e.g. IP) of the TS (ISUP/BICC side). The use of this address is to enable the TS to communicate with the SUT at the ISUP/BICC side to establish and maintain the lower layer connections. */
+ octetstring      sut_address_isup_bicc optional /* Address (e.g. IP) of the SUT (ISUP/BICC side). The use of this address is to enable the TS to communicate with the SUT at the ISUP/BICC side to establish and maintain the lower layer connections. */
+}
+/* Additional comments:
+This ASP is used at the beginning of each test case to initiate the necessary initialization of the 
+ISUP/BICC part of the test system, particularly the interfaces to the SUT.
+If module parameter 'PX_ISUP_Isup' indicates 'false', the values of parameters 'ts_pointCode' and 'sut_pointCode' shall
+be ignored by the SA.
+If module parameter 'PX_ISUP_Isup' indicates 'true', the values of parameters 'ts_address_isup_bicc' and
+'sut_address_isup_bicc' may be ignored, if they are not necessary.
+Among the initializing actions there shall be:
+a)	Verification that the ISUP/BICC link is operable between SUT and TS.
+b)	Verification that the TS is ready to send and receive SIP messages.
+Note:	It is a matter of TS implementation whether the TS, upon this request, sets up and initializes lower layer connections, if these are not setup.
+Other initialization actions may be TS-specific. */
+
+type record InitializeIsupBicc_cnf /* Answer whether all necessary TS initializations have been successfully performed. The result can be positive or negative. The result will be positive only if the TS is able to send and recieve messages at the SIP- and the ISUP/BICC-interface of the SUT. */
+{
+ boolean result /* Indicating success or non-success of the whole initialization. */
+}
+
+type record BearerSetup_req /* For BICC: request TS to setup the bearer connection between TS and SUT. */
+{
+ CallInstanceCode cic /* Call Instance Code identifying the bearer connection. */
+}
+
+type record BearerSetup_acc /* For BICC: answer to BearerSetup_req. The answer can be positive (bearer connection setup successful) or negative (bearer connection setup failed). */
+{
+ CallInstanceCode cic, /* Call Instance Code identifying the bearer connection. */
+ boolean result        /* The answer is positive when the bearer connection setup was successful and negative when the bearer connection setup failed. */
+}
+
+type record BearerRelease_req /* For BICC: request to release the established bearer connection. */
+{
+ CallInstanceCode cic /* Call Instance Code identifying the bearer connection. */
+}
+
+type record BearerRelease_cnf /* For BICC: confirmation that the requested bearer is released. */
+{
+  CallInstanceCode cic, /* Call Instance Code identifying the bearer connection. */
+  boolean result        /* Indication of whether the bearer is successfully released. */
+}
+
+type record BearerSetup_ind /* Indication of that the bearer has been setup. */
+{
+ CallInstanceCode cic /* Call Instance Code identifying the bearer connection. */
+}
+
+type record BearerRelease_ind /* Indication of whether the bearer is successfully released. */
+{
+ CallInstanceCode cic /* Call Instance Code identifying the bearer connection. */
+}
+} /* end group BICC_ASPs */
+} /*  end module SipIsup_ISUP_MsgTypes */
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/SipIsup_ISUP_ParamTypes.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/SipIsup_ISUP_ParamTypes.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/SipIsup_ISUP_ParamTypes.ttcn	(revision 22)
@@ -0,0 +1,1777 @@
+/*
+ *	@author 	STF 366
+ *	@version	$Id$
+ *	@desc		This module provides ISUP/BICC-parameter type declarations.
+*/
+module SipIsup_ISUP_ParamTypes{
+
+import from LibCommon_BasicTypesAndValues all;
+import from LibCommon_DataStrings all;
+import from LibCommon_TextStrings all;
+
+group VariableLengthOctetstrings {
+type octetstring Oct1to2 length(1..2) with {encode "1 to 2 bytes"};
+type octetstring Oct0to4 length(0..4) with {encode "0 to 4 bytes"};
+type octetstring Oct0to8 length(0..8) with {encode "0 to 8 bytes"};
+type octetstring Oct0to9 length(0..9) with {encode "0 to 9 bytes"};
+} /* end group VariableLengthOctetstrings */
+
+group MessageHeader {
+type octetstring CallInstanceCode length(4);
+
+type record CircuitIdentityCode 
+{
+ Bit12 cicv, /* cic code value */
+ Bit4 spare  /* Spare field */
+}
+
+type record RoutingLabel  
+{
+ Bit14 dpc, /* destination point code */
+ Bit14 opc, /* origination point code */
+ Bit4 sls   /* Signalling link selection */
+}
+
+type record ServiceIndicatorOctet
+{
+ Bit4 userPartIdentification, /* User part identification, '5'H for ISUP */
+ Bit2 spare,                  /* Spare */
+ Bit2 networkIndicator        /* Network indicator */
+}
+} /* end group MessageHeader */
+
+group Parameter {
+type record ACL_PAR_tlv /* Automatic congestion level parameter (ACL); Optional(O) format. */
+{
+ Bit8 paramType ('00100111'B), /* Parameter Type '00100111'B */
+ Bit8 paramLen ('00000001'B),   /* Parameter Length field */
+ Bit8 automaticCongestionLevel /* Automatic congestion level */
+}
+with { encode "present=bytes(1,0x27)" }
+
+type record ADI_PAR_tlv /* Access delivery information parameter (ADI); Optional(O) format. */
+{
+ Bit8 paramType ('00101110'B), /* Parameter Type '00101110'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit1 accessDeliveryIndicator, /* bit A: Access delivery indicator */
+ Bit7 spare                    /* bits H-B: spare */
+}
+with { encode "present=bytes(1,0x2E)"; }
+
+group APP {
+type record APP_PAR_tlv /* Application transport parameter parameter (APP); Optional(O) format. */
+{
+ Bit8 paramType ('01111000'B),          /* Parameter Type '01111000'B */
+ Bit8 paramLen,                         /* Parameter Length field */
+ Bit7 applicationContextIdentifier_lsb, /* Application context identifier, least significant bits */
+ Bit1 ext1,                             /* Extension */
+ Bit7 applicationContextIdentifier_msb, /* Application context identifier, most significant bits; optional */
+ Bit1 ext1a,                            /* Extension */
+ Bit1 releaseCallIndicator,             /* bit 1: Release call indicator (RCI) */
+ Bit1 sendNotificationIndicator,        /* bit 2: Send notification indicator (SNI) */
+ Bit5 spare,                            /* spare */
+ Bit1 ext2,                             /* Extension */
+ Bit6 aPMSegmentationIndicator,         /* d: APM segmentation indicator */
+ Bit1 sequenceIndicator,                /* E: Sequence indicator (SI) */
+ Bit1 ext3,                             /* Extension */
+ Bit7 segmentationLocalReference,       /* f: Segmentation local reference (SLR) */
+ Bit1 ext3a,                            /* Extension */
+ APMUserInformation aPMUserInformation  /* APM User Information */
+}
+with { encode "present=bytes(1,0x78)";
+       encode (paramLen) "tag=""APP_paramLen"";";
+       encode (aPMUserInformation) "length=valueOf(getTag(""APP_paramLen"")).toInt()-5;"; }
+
+ /* Start auxiliary types for application transport parameter parameter (APP) */
+type record Address
+{
+ Bit8 addressLen,               /* Address Length field */
+ Bit7 natureOfAddressIndicator, /* Nature of address indicator */
+ Bit1 oddEven,                  /* O/E */
+ Bit4 spare,                    /* spare */
+ Bit3 numberingPlanIndicator,   /* Numbering plan indicator */
+ Bit1 iNN,                      /* Internal Network Number indicator */
+ octetstring addressSignals     /* address signals */
+}
+with { encode (addressLen) "tag=""AdrLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""AdrLen"")).toInt()-2;"; }
+
+type octetstring APMUserInformation_g1; /* used APM'98'-user application */ 
+
+type record APMUserInformation_g2 /* used APM'2000'-user application */
+{
+ Address originatingAddress,
+ Address destinationAddress,
+ octetstring encapsulatedApplicationInformation
+}
+
+type union APMUserInformation
+{
+ APMUserInformation_g1 aPMUserInformation_g1,
+ APMUserInformation_g2 aPMUserInformation_g2
+}
+/* End auxiliary types for application transport parameter parameter (APP) */
+} /* end group APP */
+
+group ARR {
+type record ARR_PAR_tlv /* Automatic re-routing parameter (ARR); Optional(O) format. */
+{
+ Bit8 paramType ('10010110'B),    /* Parameter Type '10010110'B */
+ Bit8 paramLen ('00000010'B),     /* Parameter Length field */
+ Bit6 reRoutingCounter,           /* Re-routing counter */
+ Bit1 reRoutingInhibitIndicator,  /* Re-routing inhibit indicator */
+ Bit1 ext1,                       /* Extension */
+ ARR_Octet1a aRR_Octet1a optional /* Octet 1a */
+}
+with { encode "present=bytes(1,0x96)"; }
+
+/* Start auxiliary types for automatic re-routing parameter (ARR) */
+type record ARR_Octet1a
+{
+ Bit7 reRoutingReason, /* Re-routing reason */
+ Bit1 ext1a            /* Extension */
+}
+/* End auxiliary types for automatic re-routing parameter (ARR) */
+} /* group ARR */
+
+group ATP {
+type record ATP_PAR_tlv /* Access transport parameter (ATP); Optional(O) format. */
+{
+ Bit8 paramType ('00000011'B),           /* Parameter Type '00000011'B */
+ Bit8 paramLen,                          /* Parameter Length field */
+ InformationElements informationElements /* Q.931 information elements */
+}
+with { encode "present=bytes(1,0x03)"; 
+	   encode (paramLen) "tag=""ATP_paramLen"";";
+       encode (informationElements) "length=valueOf(getTag(""ATP_paramLen"")).toInt();"; }
+
+/* start auxiliary types for access transport parameter (ATP) */
+type set of BearerCapability BearerCapabilities;
+
+type record BearerCapability /* Q.931 Bearer Capability information element */
+{
+ Bit8 iEType ('00000100'B),         /* Information Element Type '00000100'B */
+ Bit8 iELen,                        /* Information Element Length field */
+ BCAP_octet3 bCAP_octet3,
+ BCAP_octet4 bCAP_octet4,
+ BCAP_octet5 bCAP_octet5 optional,
+ BCAP_octet6 bCAP_octet6 optional,
+ BCAP_octet7 bCAP_octet7 optional
+}
+
+type record BCAP_octet3
+{
+ Bit5 informationTransferCapability, /* Information transfer capability */
+ Bit2 codingStandard,                /* Coding standard */
+ Bit1 ext                            /* Extension */
+}
+
+type record BCAP_octet4
+{
+ Bit5 informationTransferRate, /* Information transfer rate */
+ Bit2 transferMode,            /* Transfer mode */
+ Bit1 ext,                     /* Extension */
+ Bit8 rateMultiplier optional  /* Rate multiplier */
+}
+
+type record BCAP_octet5
+{
+ Bit5 userInformationLayer1Protocol, /* User information Layer 1 protocol */
+ Bit2 layerIdentification ('01'B),   /* Layer identification */
+ Bit1 ext,                           /* Extension */
+ BCAP_octet5a bCAP_octet5a optional,
+ BCAP_octet5b1 bCAP_octet5b1 optional,
+ BCAP_octet5b2 bCAP_octet5b2 optional,
+ BCAP_octet5c bCAP_octet5c optional,
+ BCAP_octet5d bCAP_octet5d optional
+}
+
+type record BCAP_octet5a
+{
+ Bit5 userRate,     /* User rate */
+ Bit1 negot,        /* Negotiation */
+ Bit1 synch_asynch, /* Synchronous/asynchronous */
+ Bit1 ext           /* Extension */
+}
+
+type record BCAP_octet5b1
+{
+ Bit1 spare,     /* Spare */
+ Bit1 flowControlOnRx,  /* Flow control on reception (Rx) */
+ Bit1 flowControlOnTx,  /* Flow control on transmission (Tx) */
+ Bit1 nICOnRx,          /* Network independent Clock (NIC) on reception (Rx) */
+ Bit1 nICOnTx,          /* Network independent Clock (NIC) on transmission (Tx) */
+ Bit2 intermediateRate, /* Intermediate rate */ 
+ Bit1 ext               /* Extension */
+}
+
+type record BCAP_octet5b2
+{
+ Bit1 spare,                    /* Spare */
+ Bit1 inbandOutbandNegotiation, /* In-band/out-band negotiation */
+ Bit1 assignorAssignee,         /* Assignor/assignee */
+ Bit1 lLINegotiation,           /* Logical link identifier negotiation */
+ Bit1 mode,                     /* Mode of operation */
+ Bit1 multiFrameSupport,        /* Multiple frame establishment support in data link */ 
+ Bit1 hdrNoHdr,                 /* rate addaption header/no header */
+ Bit1 ext                       /* Extension */
+}
+
+type record BCAP_octet5c
+{
+ Bit3 parity,           /* Parity information */
+ Bit2 numberOfDataBits, /* Number of data bits excluding parity bit if present*/
+ Bit2 numberOfStopBits, /* Number of stop bits */
+ Bit1 ext               /* Extension */
+}
+
+type record BCAP_octet5d
+{
+ Bit6 modemType,  /* Modem type */
+ Bit1 duplexMode, /* Duplex mode*/
+ Bit1 ext         /* Extension */
+}
+
+type record BCAP_octet6
+{
+ Bit5 userInformationLayer2Protocol, /* User information Layer 2 protocol */
+ Bit2 layerIdentification ('10'B),   /* Layer identification */
+ Bit1 ext ('1'B)                     /* Extension */
+}
+
+type record BCAP_octet7
+{
+ Bit5 userInformationLayer3Protocol, /* User information Layer 3 protocol */
+ Bit2 layerIdentification ('11'B),   /* Layer identification */
+ Bit1 ext ('1'B)                     /* Extension */
+}
+
+type set of HighLayerCompatibility HighLayerCompatibilities;
+
+type record HighLayerCompatibility /* Q.931 High Layer Compatibility information element */
+{
+ Bit8 iEType ('01111101'B),                                         /* Information Element Type '01111101'B */
+ Bit8 iELen,                                                        /* Information Element Length field */
+ Bit2 presentation,                                                 /* Presentation */
+ Bit3 interpretation,                                               /* Interpretation */
+ Bit2 codingStandard,                                               /* Coding standard */
+ Bit1 ext1,                                                         /* Extension */
+ Bit7 highLayerCharacteristicsIdentification,                       /* High layer characteristics identification */
+ Bit1 ext2,                                                         /* Extension */
+ Bit7 extendedHighLayerCharacteristicsIdentification optional,      /* Extended high layer characteristics identification */
+ Bit1 ext3 optional,                                                /* Extension */
+ Bit7 extendedVideotelephonyCharacteristicsIdentification optional, /* Extended videotelephony characteristics identification */
+ Bit1 ext4 optional                                                 /* Extension */
+ }
+with { encode "present=bytes(1,0x7D)" }
+
+type record LowLayerCompatibility {
+ Bit8 iEType ('01111100'B), /* Information Element Type '01111100'B */
+ Bit8 iELen,                /* Information Element Length field */
+ LLC_octet3  lLC_octet3, 
+ BCAP_octet4  lLC_octet4, 
+ BCAP_octet5  lLC_octet5 optional, 
+ LLC_octet6  lLC_octet6 optional, 
+ LLC_octet7  lLC_octet7 optional 
+}
+with { encode "present=bytes(1,0x7C)" }
+
+type record LLC_octet3 {
+ Bit5  informationTransferCapability,
+ Bit2  codingStandard,
+ Bit1  extension_3, 
+ Bit6  spare6      ('000000'B)      optional,
+ Bit1  negotiationIndicator         optional,
+ Bit1  extension_3a                 optional
+};
+
+type record LLC_octet6a_user {
+ Bit7  userSpecifiedLayer2information,
+ Bit1  extension6a
+};
+
+type record LLC_octet6a_other {
+ Bit2  q933Use,   
+ Bit3  spare6a        ('000'B),
+ Bit2  modeOfOperation,   
+ Bit1  extension6a,
+ Bit7  windowSize       optional,
+ Bit1  extension6b      optional
+};
+
+type union LLC_octet6a {
+ LLC_octet6a_user    octet6a_user,
+ LLC_octet6a_other   octet6a_other
+};
+
+type record LLC_octet6 {
+ Bit5  userInformationLayer2Protocol,
+ Bit2  layerId,
+ Bit1  extension6,
+ // OctET 6a-b:
+ LLC_octet6a  octet6a   optional
+};
+
+type record LLC_octet7a_user {
+  Bit7  userSpecifiedLayer3information,
+  Bit1  extension7a
+};
+
+type record LLC_octet7a_other {
+ Bit5  spare7a   ('00000'B),
+ Bit2  modeOfOperation,   
+ Bit1  extension7a,
+ Bit4  defaultPacketSize optional,
+ Bit3  spare7b ('000'B)  optional,
+ Bit1  extension7b       optional,
+ // OctET 7c:
+ Bit7  packetWindowSize  optional,
+ Bit1  extension7c       optional
+};
+
+type union LLC_octet7a {
+ LLC_octet7a_user    octet7a_user,
+ LLC_octet7a_other   octet7a_other
+};
+
+type record LLC_octet7 {
+ Bit5  userInformationLayer3Protocol,
+ Bit2  layerId   ('11'B),
+ Bit1  extension7,
+ // OctET 7a:
+ LLC_octet7a  octet7a    optional
+};
+
+ type record ProgressIndicator /* Q.931 Progress indicator information element */
+{
+ Bit8 iEType ('00011110'B), /* Information Element Type '00011110'B */
+ Bit8 iELen,                /* Information Element Length field */
+ Bit4 location,			    /* Location */
+ Bit1 spare,                /* Spare */
+ Bit2 codingStandard,       /* Coding Standard */
+ Bit1 ext1,                 /* Extension */
+ Bit7 progressDescription,  /* Progress Description */
+ Bit1 ext2                  /* Extension */
+}
+with { encode "present=bytes(1,0x1E)"; 
+       encode (iELen) "tag=""PI_iELen"";";}
+
+ type record CalledPartySubaddress /* Q.931 Called party subaddress information element */
+{
+ Bit8 iEType ('01110001'B),        /* Information Element Type '01110001'B */
+ Bit8 iELen,                       /* Information Element Length field */
+ Bit3 spare,                       /* Spare */
+ Bit1 oddEven,                     /* OE */
+ Bit3 typeOfSubaddress,            /* Type of Subaddress */
+ Bit1 ext,                         /* Extension */
+ octetstring subaddressInformation /* Subaddress Information */
+}
+with { encode "present=bytes(1,0x71)"; 
+       encode (iELen) "tag=""CDPS_iELen"";";
+       encode (subaddressInformation) "length=valueOf(getTag(""CDPS_iELen"")).toInt()-1;"; }
+
+ type record CallingPartySubaddress /* Q.931 Calling party subaddress information element */
+{
+ Bit8 iEType ('01101101'B),        /* Information Element Type '01101101'B */
+ Bit8 iELen,                       /* Information Element Length field */
+ Bit3 spare,                       /* Spare */
+ Bit1 oddEven,                     /* OE */
+ Bit3 typeOfSubaddress,            /* Type of Subaddress */
+ Bit1 ext,                         /* Extension */
+ octetstring subaddressInformation /* Subaddress Information */
+}
+with { encode "present=bytes(1,0x6D)"; 
+       encode (iELen) "tag=""CGPS_iELen"";";
+       encode (subaddressInformation) "length=valueOf(getTag(""CGPS_iELen"")).toInt()-1;"; }
+
+type record ConnectedSubaddress /* Q.931 Connected subaddress information element */
+{
+ Bit8 iEType ('01001101'B),        /* Information Element Type '01001101'B */
+ Bit8 iELen,                       /* Information Element Length field */
+ Bit3 spare,                       /* Spare */
+ Bit1 oddEven,                     /* OE */
+ Bit3 typeOfSubaddress,            /* Type of Subaddress */
+ Bit1 ext,                         /* Extension */
+ octetstring subaddressInformation /* Subaddress Information */
+}
+with { encode "present=bytes(1,0x4D)"; 
+       encode (iELen) "tag=""CODS_iELen"";";
+       encode (subaddressInformation) "length=valueOf(getTag(""CODS_iELen"")).toInt()-1;"; }
+
+type union InformationElements
+{
+ ISDN_IEs specificInformationElements, /* Used for BCAP, HLC, LLC, PI, CDPS, CGPS and CODS */
+ octetstring anyInformationElements    /* Used for receive templates */
+}
+
+type set ISDN_IEs
+{
+ BearerCapabilities bearerCapability optional,              /* Q.931 Bearer Capability maybe repeated */
+ HighLayerCompatibilities highLayerCompatibility optional,  /* Q.931 High Layer Compatibility maybe repeated */
+ LowLayerCompatibility lowLayerCompatibility optional,      /* Q.931 Low Layer Compatibility */
+ ProgressIndicator progressIndicator optional,              /* Q.931 Progress Indicator */
+ CalledPartySubaddress calledPartySubaddress optional,      /* Q.931 Called Party Subaddress */
+ CallingPartySubaddress callingPartySubaddress optional,    /* Q.931 Calling Party Subaddress */
+ ConnectedSubaddress connectedSubaddress optional           /* Q.931 Connected Subaddress */
+}
+/* end auxiliary types for access transport parameter (ATP) */
+} /* end group ATP */
+
+type record BCI_PAR_v /* Backward call indicators parameter (BCI); Fixed(F) format. */
+{
+ Bit2 chargeIndicator,                /* bits BA : Charge indicator (Note 1) */
+ Bit2 calledPartysStatusIndicator,    /* bits DC : Called party's status indicator */
+ Bit2 calledPartysCategoryIndicator,  /* bits FE : Called party's category indicator */
+ Bit2 end_to_endMethodIndicator,      /* bits HG : End-to-end method indicator (Note 2) */
+ Bit1 interworkingIndicator,          /* bit I: Interworking indicator (Note 2) */
+ Bit1 end_to_endInformationIndicator, /* bit J: End-to-end information indicator (national use) (Note 2) */
+ Bit1 iSDNUserPartIndicator,          /* bit K: ISDN user part indicator (Note 2) */
+ Bit1 holdingIndicator,               /* bit L: Holding indicator (national use) */
+ Bit1 iSDNAccessIndicator,            /* bit M: ISDN access indicator */
+ Bit1 echoControlDeviceIndicator,     /* bit N: Echo control device indicator */
+ Bit2 sCCPMethodIndicator             /* bits PO: SCCP method indicator (Note 2) */
+}
+
+type record BCI_PAR_tlv /* Backward call indicators parameter (BCI); Optional(O) format. */
+{
+ Bit8 paramType ('00010001'B),        /* Parameter Type '00010001'B */
+ Bit8 paramLen ('00000010'B),         /* Parameter Length field */
+ Bit2 chargeIndicator,                /* bits BA : Charge indicator (Note 1) */
+ Bit2 calledPartysStatusIndicator,    /* bits DC : Called party's status indicator */
+ Bit2 calledPartysCategoryIndicator,  /* bits FE : Called party's category indicator */
+ Bit2 end_to_endMethodIndicator,      /* bits HG : End-to-end method indicator (Note 2) */
+ Bit1 interworkingIndicator,          /* bit I: Interworking indicator (Note 2) */
+ Bit1 end_to_endInformationIndicator, /* bit J: End-to-end information indicator (national use) (Note 2) */
+ Bit1 iSDNUserPartIndicator,          /* bit K: ISDN user part indicator (Note 2) */
+ Bit1 holdingIndicator,               /* bit L: Holding indicator (national use) */
+ Bit1 iSDNAccessIndicator,            /* bit M: ISDN access indicator */
+ Bit1 echoControlDeviceIndicator,     /* bit N: Echo control device indicator */
+ Bit2 sCCPMethodIndicator             /* bits PO: SCCP method indicator (Note 2) */
+}
+with { encode "present=bytes(1,0x11)"; }
+
+type record BGV_PAR_tlv /* Backward GVNS parameter (BGV); Optional(O) format. */
+{
+ Bit8 paramType ('01001101'B),    /* Parameter Type '01001101'B */
+ Bit8 paramLen ('00000001'B),     /* Parameter Length field */
+ Bit2 terminatingAccessIndicator, /* bits B A: Terminating access indicator */
+ Bit5 spare,                      /* bits G-C: spare */
+ Bit1 ext                         /* bit H: Extension indicator: as for 3.25 a). */
+}
+with { encode "present=bytes(1,0x4D)"; }
+
+type record CAM_PAR_tlv /* Circuit assignment map parameter (CAM); Optional(O) format. */
+{
+ Bit8 paramType ('00100101'B), /* Parameter Type '00100101'B */
+ Bit8 paramLen ('00000101'B),  /* Parameter Length field */
+ Bit6 mapType,                 /* Map type */
+ Bit2 spare,                   /* spare */
+ Bit32 mappingBits             /* mapping bits */
+}
+with { encode "present=bytes(1,0x25)"; }
+
+type record CAUI_PAR_lv /* Cause indicators parameter (CAUI); Variable(V) format. */
+{
+ Bit8 paramLen,                   /* Parameter Length field */
+ Bit4 location,                   /* location */
+ Bit1 spare,                      /* spare */
+ Bit2 codingStandard,             /* codingStandard */
+ Bit1 ext1,                       /* Extension */
+ Bit7 causeValue,                 /* Cause value */
+ Bit1 ext2,                       /* Extension */
+ octetstring diagnostics optional /* Diagnostic(s) (if any) */
+}
+with { encode (paramLen) "tag=""CAUI_paramLen"";";
+       encode (diagnostics) "length=valueOf(getTag(""CAUI_paramLen"")).toInt()-2;"; }
+
+type record CAUI_PAR_tlv /* Cause indicators parameter (CAUI); Optional(O) format. */
+{
+ Bit8 paramType ('00010010'B),    /* Parameter Type '00010010'B */
+ Bit8 paramLen,                   /* Parameter Length field */
+ Bit4 location,                   /* location */
+ Bit1 spare,                      /* spare */
+ Bit2 codingStandard,             /* codingStandard */
+ Bit1 ext1,                       /* Extension */
+ Bit7 causeValue,                 /* Cause value */
+ Bit1 ext2,                       /* Extension */
+ octetstring diagnostics optional /* Diagnostic(s) (if any) */
+}
+with { encode "present=bytes(1,0x12)"; 
+       encode (paramLen) "tag=""CAUI_paramLen"";";
+       encode (diagnostics) "length=valueOf(getTag(""CAUI_paramLen"")).toInt()-2;"; }
+
+type record CCPI_PAR_tlv /* CCNR possible indicator parameter (CCPI); Optional(O) format. */
+{
+ Bit8 paramType ('01111010'B), /* Parameter Type '01111010'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit1 cCNRPossibleIndicator,   /* bit A: CCNR possible indicator */
+ Bit7 spare                    /* bits H-B: spare */
+}
+with { encode "present=bytes(1,0x7A)"; }
+
+type record CCRQ_PAR_tlv /* Collect call request parameter (CCRQ); Optional(O) format. */
+{
+ Bit8 paramType ('01111001'B),     /* Parameter Type '01111001'B */
+ Bit8 paramLen ('00000001'B),      /* Parameter Length field */
+ Bit1 collectCallRequestIndicator, /* bit A: Collect call request indicator */
+ Bit7 spare                        /* bits H-B: spare */
+}
+with { encode "present=bytes(1,0x79)"; }
+
+type record CCSS_PAR_tlv /* CCSS parameter (CCSS); Optional(O) format. */
+{
+ Bit8 paramType ('01001011'B), /* Parameter Type '01001011'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit1 cCSSCallIndicator,       /* bit A: CCSS call indicator */
+ Bit7 spare                    /* bits H-B: spare */
+}
+with { encode "present=bytes(1,0x4B)"; }
+
+type record CDI_PAR_tlv /* Call diversion information parameter (CDI); Optional(O) format. */
+{
+ Bit8 paramType ('00110110'B),         /* Parameter Type '00110110'B */
+ Bit8 paramLen ('00000001'B),          /* Parameter Length field */
+ Bit3 notificationSubscriptionOptions, /* bits CBA: Notification subscription options */
+ Bit4 redirectingReason,               /* bits GFED: Redirecting reason */
+ Bit1 spare                            /* bit H: spare */
+}
+with { encode "present=bytes(1,0x36)"; }
+	   
+type record CDIN_PAR_tlv /* Called directory number parameter (CDIN); Optional(O) format. */
+{
+ Bit8 paramType ('01111101'B),  /* Parameter Type '01111101'B */
+ Bit8 paramLen,                 /* Parameter Length field */
+ Bit7 natureOfAddressIndicator, /* Nature of address indicator */
+ Bit1 oddEven,                  /* O/E */
+ Bit4 spare,                    /* spare */
+ Bit3 numberingPlanIndicator,   /* Numbering plan indicator */
+ Bit1 iNN,                      /* Internal Network Number indicator */
+ octetstring addressSignals     /* address signals */
+}
+with { encode "present=bytes(1,0x7D)"; 
+       encode (paramLen) "tag=""CDIN_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""CDIN_paramLen"")).toInt()-2;"; }
+
+type record CDN_PAR_lv /* Called party number parameter (CDN); Variable(V) format. */
+{
+ Bit8 paramLen,                 /* Parameter Length field */
+ Bit7 natureOfAddressIndicator, /* Nature of address indicator */
+ Bit1 oddEven,                  /* OE */
+ Bit4 spare,                    /* spare */
+ Bit3 numberingPlanIndicator,   /* Numbering plan indicator */
+ Bit1 iNN,                      /* Internal Network Number indicator */
+ octetstring addressSignals     /* address signals */
+}
+with { encode (paramLen) "tag=""CDN_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""CDN_paramLen"")).toInt()-2;"; }
+
+type record CDTI_PAR_tlv /* Call diversion treatment indicators parameter (CDTI); Optional(O) format. */
+{
+ Bit8 paramType ('01101110'B),   /* Parameter Type '01101110'B */
+ Bit8 paramLen ('00000001'B),    /* Parameter Length field */
+ Bit2 callToBeDivertedIndicator, /* bits BA: Call to be diverted indicator */
+ Bit5 spare,                     /* bits G-C: spare */
+ Bit1 ext                        /* bit H: Extension indicator */
+}
+with { encode "present=bytes(1,0x6E)"; }
+
+type Bit8 CGC_PAR_v; /* Calling party's category parameter (CGC); Fixed(F) format. */
+
+type record CGC_PAR_tlv /* Calling party's category parameter (CGC); Optional(O) format. */
+{
+ Bit8 paramType ('00001001'B), /* Parameter Type '00110101'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit8 callingPartysCategory    /* Calling party's category */
+}
+with { encode "present=bytes(1,0x09)"; }
+
+group CGL {
+type record CGL_PAR_tlv /* Calling geodetic location parameter (CGL); Optional(O) format. */
+{
+ Bit8 paramType ('10000001'B),     /* Parameter Type '10000001'B */
+ Bit8 paramLen,                    /* Parameter Length field */
+ Bit2 screeningIndicator,          /* b) Screening indicator */
+ Bit2 locationPresRestrIndicator,  /* a) Location presentation restricted indicator */
+ Bit4 spare,                       /* spare */
+ Bit7 typeOfShape,                 /* Type of shape */
+ Bit1 ext,                         /* Extension */
+ ShapeDescription shapeDescription /* Shape description */
+}
+with { encode "present=bytes(1,0x81)";
+       encode (paramLen) "tag=""CGL_paramLen"";";
+       encode (shapeDescription) "length=valueOf(getTag(""CGL_paramLen"")).toInt()-2;"; }
+
+/* Start auxiliary types for calling geodetic location parameter (CGL) */
+type record EllipsoidPointShapeDescription 
+{
+	Oct3 degreesOfLatitude, /* Degrees of latitude */
+	Oct3 degreesOfLongitude /* Degrees of longitude */
+}
+
+type record EllipsoidPointWithUncertaintyShapeDescription 
+{
+ Oct3 degreesOfLatitude,  /* Degrees of latitude */
+ Oct3 degreesOfLongitude, /* Degrees of longitude */
+ Bit7 uncertaintyCode,    /* Uncertainty code */
+ Bit1 spare1,             /* spare */
+ Bit7 confidence,         /* Confidence */
+ Bit1 spare2              /* spare */
+}
+
+type record PointWithAltitudeAndUncertaintyShapeDescription 
+{
+ Oct3 degreesOfLatitude,  /* Degrees of latitude */
+ Oct3 degreesOfLongitude, /* Degrees of longitude */
+ Bit7 uncertaintyCode1,   /* Uncertainty code */
+ Bit1 spare1,             /* spare */
+ Oct2 altitude,           /* Altitude */
+ Bit7 uncertaintyCode2,   /* uncertainty code */
+ Bit1 spare,              /* spare */
+ Bit7 confidence,         /* Confidence */
+ Bit1 spare2              /* spare */
+}
+
+type record EllipseOnTheEllipsoidShapeDescription 
+{
+ Oct3 degreesOfLatitude,  /* Degrees of latitude */
+ Oct3 degreesOfLongitude, /* Degrees of longitude */
+ Bit7 majorRadius,        /* Major radius */
+ Bit1 spare1,             /* spare */
+ Bit7 minorRadius,        /* Minor radius */
+ Bit1 spare2,             /* spare */
+ Bit8 orientation,        /* Orientation */
+ Bit7 confidence,         /* Confidence */
+ Bit1 spare3              /* spare */
+}
+
+type record EllipsoidCircleSectorShapeDescription 
+{
+ Oct3 degreesOfLatitude,  /* Degrees of latitude */
+ Oct3 degreesOfLongitude, /* Degrees of longitude */
+ Bit7 radius,             /* Radius */
+ Bit1 spare1,             /* spare */
+ Bit8 offset,             /* Offset */
+ Bit8 includedAngle,      /* Included angle */
+ Bit7 confidence,         /* Confidence */
+ Bit1 spare2              /* spare */
+}
+
+type record PolygonShapeDescription 
+{
+ Bit4 numberOfPoints, /* Number of points */
+ Bit4 spare,          /* spare */
+ octetstring contents /* contents */
+}
+with { encode (numberOfPoints) "tag=""numOfPoints"";";
+       encode (contents) "length=valueOf(getTag(""numOfPoints"")).toInt()*6;"; }
+
+type union ShapeDescription
+{
+ EllipsoidPointShapeDescription ellipsoidPointShapeDescription,
+ EllipsoidPointWithUncertaintyShapeDescription ellipsoidPointWithUncertaintyShapeDescription,
+ PointWithAltitudeAndUncertaintyShapeDescription pointWithAltitudeAndUncertaintyShapeDescription,
+ EllipseOnTheEllipsoidShapeDescription ellipseOnTheEllipsoidShapeDescription,
+ EllipsoidCircleSectorShapeDescription ellipsoidCircleSectorShapeDescription,
+ PolygonShapeDescription polygonShapeDescription
+}
+/* End auxiliary types for calling geodetic location parameter (CGL) */
+} /* end group CGL */
+
+type record CGN_PAR_tlv /* Calling party number parameter (CGN); Optional(O) format. */
+{
+ Bit8 paramType ('00001010'B),       /* Parameter Type '00001010'B */
+ Bit8 paramLen,                      /* Parameter Length field */
+ Bit7 natureOfAddressIndicator,      /* Nature of address indicator */
+ Bit1 oddEven,                       /* OE */
+ Bit2 screeningIndicator,            /* Screening indicator */
+ Bit2 addrPresRestrInd,              /* Address presentation restricted indicator (NOTE) */
+ Bit3 numberingPlanIndicator,        /* Numbering plan indicator */
+ Bit1 nII,                           /* NumberIncompleteIndicator */
+ octetstring addressSignals optional /* address signals */
+}
+with { encode "present=bytes(1,0x0A)"; 
+       encode (paramLen) "tag=""CGN_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""CGN_paramLen"")).toInt()-2;"; }
+
+type record CGSM_PAR_v /* Circuit group supervision message type parameter (CGSM); Fixed(F) format. */
+{
+ Bit2 cgSupervMTypeIndicator,  /* bits BA: Circuit group supervision message type indicator */
+ Bit6 spare                    /* bits H-C: spare */
+}
+with { encode "present=bytes(1,0x15)"; }
+
+type record CHI_PAR_tlv /* Call history parameter (CHI); Optional(O) format. */
+{
+ Bit8 paramType ('00101101'B), /* Parameter Type '00101101'B */
+ Bit8 paramLen ('00000010'B),  /* Parameter Length field */
+ Bit16 propagationDelayValue   /* Propagation delay value */
+}
+with { encode "present=bytes(1,0x2D)"; }
+
+type record CIN_PAR_tlv /* Called IN number parameter (CIN); Optional(O) format. */
+{
+ Bit8 paramType ('01101111'B),  /* Parameter Type '01101111'B */
+ Bit8 paramLen,                 /* Parameter Length field */
+ Bit7 natureOfAddressIndicator, /* Nature of address indicator */
+ Bit1 oddEven,                  /* O/E */
+ Bit2 spare1,                   /* spare */
+ Bit2 addrPresRestrInd,         /* Address presentation restricted indicator */
+ Bit3 numberingPlanIndicator,   /* Numbering plan indicator */
+ Bit1 spare2,                   /* spare */
+ octetstring addressSignals     /* address signals */
+}
+with { encode "present=bytes(1,0x6F)";
+       encode (paramLen) "tag=""CIN_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""CIN_paramLen"")).toInt()-2;"; }
+
+type record COI_PAR_v /* Continuity indicators parameter (COI); Fixed(F) format. */
+{
+ Bit1 continuityIndicator, /* bit A: Continuity indicator */
+ Bit7 spare                /* bits H-B: spare */
+}
+
+type record COTI_PAR_tlv /* Call offering treatment indicators parameter (COTI); Optional(O) format. */
+{
+ Bit8 paramType ('01110000'B),   /* Parameter Type '01110000'B */
+ Bit8 paramLen ('00000001'B),    /* Parameter Length field */
+ Bit2 callToBeOfferedIndicator,  /* bits BA: Call to be offered indicator */
+ Bit6 spare,                     /* bits G-C: spare */
+ Bit1 ext                        /* bit H: Extension indicator */
+}
+with { encode "present=bytes(1,0x70)"; }
+
+type record CPN_PAR_tlv /* Connected number parameter (CPN); Optional(O) format. */
+{
+ Bit8 paramType ('00100001'B),       /* Parameter Type '00100001'B */
+ Bit8 paramLen,                      /* Parameter Length field */
+ Bit7 natureOfaddressindicator,      /* Nature of address indicator */
+ Bit1 oddEven,                       /* O/E */
+ Bit2 screeningIndicator,            /* Screening indicator */
+ Bit2 addrPresRestrInd,              /* Address presentation restricted indicator (NOTE) */
+ Bit3 numberingplanIndicator,        /* Numberingplan indicator */
+ Bit1 spare,                         /* spare */
+ octetstring addressSignals optional /* address signals */
+}
+with { encode "present=bytes(1,0x21)"; 
+       encode (paramLen) "tag=""CPN_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""CPN_paramLen"")).toInt()-2;"; }
+
+type record CRI_PAR_tlv /* Correlation id parameter (CRI); Optional(O) format. */
+{
+ Bit8 paramType ('01100101'B), /* Parameter Type '01100101'B */
+ Bit8 paramLen,                /* Parameter Length field */
+ octetstring correlationId     /* Correlation id */
+}
+with { encode "present=bytes(1,0x65)"; 
+	   encode (paramLen) "tag=""CRI_paramLen"";";
+       encode (correlationId) "length=valueOf(getTag(""CRI_paramLen"")).toInt();"; }
+
+type record CRQ_PAR_tlv /* Connection request parameter (CRQ); Optional(O) format. */
+{
+ Bit8 paramType ('00001101'B), /* Parameter Type '00001101'B */
+ Bit8 paramLen,                /* Parameter Length field */
+ Oct3 localReference,          /* Local reference */
+ Bit14 signallingPointCode,    /* Signalling point code */
+ Bit2 spare,                   /* spare */
+ Bit8 protocolClass optional,  /* Protocol class */
+ Bit8 credit optional          /* Credit */
+}
+with { encode "present=bytes(1,0x0D)"; }
+
+type record CRF_PAR_tlv /* Call reference parameter (CRF); Optional(O) format. */
+{
+ Bit8 paramType ('00000001'B), /* Parameter Type '00000001'B */
+ Bit8 paramLen ('00000101'B),  /* Parameter Length field */
+ Bit24 callIdentity,           /* Call identity */
+ Bit14 signallingPointCode,    /* Signalling point code */
+ Bit2 spare                    /* spare */
+}
+with { encode "present=bytes(1,0x01)"; }
+
+group CSI {
+type record CSI_PAR_lv /* Circuit state indicator parameter (CSI); Variable(V) format. */
+{
+   Bit8 paramLen,   /* Parameter Length field */
+   CircuitIndicators circuitIndicators
+}
+with { encode (paramLen) "tag=""CSI_paramLen"";";
+       encode (circuitIndicators) "length=valueOf(getTag(""CSI_paramLen"")).toInt();"; }
+
+/* start auxiliary types for circuit state indicator parameter (CSI) */
+type record CircuitIndicator
+{
+ Bit2 maintenanceBlockingState, /* bits BA: Maintenance blocking state */
+ Bit2 callProcessingState,      /* bits DC: Call processing state */
+ Bit2 hardwareBlockingState,    /* bits F E: Hardware blocking state (Note) */
+ Bit2 spare                     /* bits H-G: spare */
+} 
+
+type set of CircuitIndicator CircuitIndicators;
+/* end auxiliary types for circuit state indicator parameter (CSI) */
+} /* end group CSI */
+
+type record CTI_PAR_tlv /* Conference treatment indicators parameter (CTI); Optional(O) format. */
+{
+ Bit8 paramType ('01110010'B),       /* Parameter Type '01110010'B */
+ Bit8 paramLen ('00000001'B),        /* Parameter Length field */
+ Bit2 conferenceAcceptanceIndicator, /* bits BA: Conference acceptance indicator (Note) */
+ Bit5 spare,                         /* bits G-C: spare */
+ Bit1 ext                            /* bit H: Extension indicator */
+}
+with { encode "present=bytes(1,0x72)"; }
+
+type record CTN_PAR_tlv /* Call transfer number parameter (CTN); Optional(O) format. */
+{
+ Bit8 paramType ('01000101'B),  /* Parameter Type '01000101'B */
+ Bit8 paramLen,                 /* Parameter Length field */
+ Bit7 natureOfAddressIndicator, /* Nature of address indicator */
+ Bit1 oddEven,                  /* O/E */
+ Bit2 screeningIndicator,       /* Screening indicator */
+ Bit2 addrPresRestrInd,         /* Address presentation restricted indicator */
+ Bit3 numberingPlanIndicator,   /* Numbering plan indicator */
+ Bit1 spare,                    /* spare */
+ octetstring addressSignals     /* address signals */
+}
+with { encode "present=bytes(1,0x45)";
+       encode (paramLen) "tag=""CTN_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""CTN_paramLen"")).toInt()-2;"; }
+
+type record CTR_PAR_tlv /* Call transfer reference parameter (CTR); Optional(O) format. */
+{
+ Bit8 paramType ('01000011'B), /* Parameter Type '01000011'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit8 callTransferIdentity     /* Call transfer identity */
+}
+with { encode "present=bytes(1,0x43)"; }
+
+type record CUGIC_PAR_tlv /* Closed user group interlock code parameter (CUGIC); Optional(O) format. */
+{
+ Bit8 paramType ('00011010'B), /* Parameter Type '00011010'B */
+ Bit8 paramLen ('00000100'B),  /* Parameter Length field */
+ Oct1 networkIdentity1,        /* a) Network Identity (NI) (octet 1) */
+ Oct1 networkIdentity2,        /* a) Network Identity (NI) (octet 2) */
+ Bit16 binaryCode              /* Binary code */
+}
+with { encode "present=bytes(1,0x1A)"; }
+
+type record DIF_PAR_tlv /* Display information parameter (DIF); Optional(O) format. */
+{
+ Bit8 paramType ('01110011'B),  /* Parameter Type '01110011'B */
+ Bit8 paramLen,                 /* Parameter Length field */
+ octetstring displayInformation /* Display information */
+}
+with { encode "present=bytes(1,0x73)"; 
+	   encode (paramLen) "tag=""DIF_paramLen"";";
+       encode (displayInformation) "length=valueOf(getTag(""DIF_paramLen"")).toInt();"; }
+
+type record ECI_PAR_tlv /* Echo control information parameter (ECI); Optional(O) format. */
+{
+ Bit8 paramType ('00110111'B), /* Parameter Type '00110111'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit2 outgECDeviceInfoInd,     /* bits BA: Outgoing echo control device information indicator */
+ Bit2 incECDeviceInfoInd,      /* bits DC: Incoming echo control device information indicator */
+ Bit2 outgECDeviceReqInd,      /* bits FE : Outgoing echo control device request indicator */
+ Bit2 IncECDeviceReqInd        /* bits HG: Incoming echo control device request indicator */
+}
+with { encode "present=bytes(1,0x37)"; }
+
+type record EIF_PAR_v /* Event information parameter (EIF); Fixed(F) format. */
+{
+ Bit7 eventIndicator,   /* bits G F E D C B A: Event indicator */
+ Bit1 eventPresRestrInd /* bit H: Event presentation restricted indicator (national use) */
+}
+
+type Bit8 EOP ('00000000'B) with { encode "present=bytes(1,0x00)"; };
+
+type Bit8 FAI_PAR_v; /* Facility indicator parameter (FAI); Fixed(F) format. */
+
+type record FAI_PAR_tlv /* Facility indicator parameter (FAI); Optional(O) format. */
+{
+ Bit8 paramType ('00011000'B), /* Parameter Type '00011000'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit8 facilityIndicators       /* Facility indicators */
+}
+with { encode "present=bytes(1,0x18)"; }
+
+type record FCI_PAR_v /* Forward call indicators parameter (FCI); Fixed(F) format. */
+{
+ Bit1 natInternatCallIndicator,  /* bit A: National/international call indicator (Note 1) */
+ Bit2 endToEndMethodIndicator,   /* bits CB: End-to-end method indicator (Note 2) */
+ Bit1 interworkingIndicator,     /* bit D: Interworking indicator (Note 2) */
+ Bit1 endToEndInfoIndicator,     /* bit E: End-to-end information indicator (national use) (Note 2) */
+ Bit1 iSDNUserPartIndicator,     /* bit F: ISDN user part indicator (Note 2) */
+ Bit2 iSDNUserPartPrefIndicator, /* bits HG: ISDN user part preference indicator */
+ Bit1 iSDNAccessIndicator,       /* bit I: ISDN access indicator */
+ Bit2 sCCPMethodIndicator,       /* bits KJ: SCCP method indicator (Note 2) */
+ Bit1 spare,                     /* bit L: spare */
+ Bit4 reserved                   /* bits P-M: reserved for national use */
+}
+
+group FGVNS {
+type record FGVNS_PAR_tlv /* Forward GVNS parameter (FGVNS); Optional(O) format. */
+{
+ Bit8 paramType ('01001100'B), /* Parameter Type '01001100'B */
+ Bit8 paramLen,                /* Parameter Length field */
+ FGVNSContents fGVNSContents
+}
+with { encode "present=bytes(1,0x4C)";
+       encode (paramLen) "tag=""FGVNS_paramLen"";";
+       encode (fGVNSContents) "length=valueOf(getTag(""FGVNS_paramLen"")).toInt();"; }
+
+/* Start auxiliary types for forward GVNS parameter (FGVNS) */
+type record FGVNSContents
+{
+ OriginatingParticipatingServiceProvider originatingParticipatingServiceProvider, /* Originating participating service provider (OPSP) (Structured Type) */
+ GVNSUserGroup gVNSUserGroup,                                                     /* GVNS user group (GUG) (Structured Type) */
+ TerminatingNetworkRoutingNumber terminatingNetworkRoutingNumber                  /* Terminating network routing number (TNRN) (Structured Type) */
+}
+
+type record OriginatingParticipatingServiceProvider
+{
+ Bit4 oPSPLengthIndicator, /* OPSP length indicator */
+ Bit3 spare,               /* spare */
+ Bit1 oddEven,             /* O/E */
+ Oct0to4 digits            /* digits */
+}
+with { encode (oPSPLengthIndicator) "tag=""OPSP_paramLen"";";
+       encode (digits) "length=valueOf(getTag(""OPSP_paramLen"")).toInt();"; }
+
+type record GVNSUserGroup
+{
+ Bit4 gUGLengthIndicator, /* GUG length indicator */
+ Bit3 spare,              /* spare */
+ Bit1 oddEven,            /* O/E */
+ Oct0to8 digits           /* digits */
+}
+with { encode (gUGLengthIndicator) "tag=""GUG_paramLen"";";
+       encode (digits) "length=valueOf(getTag(""GUG_paramLen"")).toInt();"; }
+
+type record TerminatingNetworkRoutingNumber
+{
+ Bit4 tNRNLengthIndicator,      /* TNRN length indicator */
+ Bit3 numberingPlanIndicator,   /* Numbering plan indicator */
+ Bit1 oddEven,                  /* O/E */
+ Bit7 natureOfAddressIndicator, /* Nature of address indicator */
+ Bit1 spare,                    /* spare */
+ Oct0to9 digits                 /* digits */
+}
+with { encode (tNRNLengthIndicator) "tag=""TNRN_paramLen"";";
+       encode (digits) "length=valueOf(getTag(""TNRN_paramLen"")).toInt();"; }
+/* End auxiliary types for forward GVNS parameter (FGVNS) */
+} /* end group FGVNS */
+
+type record GDG_PAR_tlv /* Generic digits parameter (GDG); Optional(O) format. */
+{
+ Bit8 paramType ('11000001'B), /* Parameter Type '11000001'B */
+ Bit8 paramLen,                /* Parameter Length field */
+ Bit5 typeOfDigits,            /* Encoding scheme Type of digits */
+ Bit3 encodingScheme,          /* Encoding scheme Type of digits */
+ Oct1to15 digits               /* Digits */
+}
+with { encode "present=bytes(1,0xC1)"; 
+       encode (paramLen) "tag=""CDG_paramLen"";";
+       encode (digits) "length=valueOf(getTag(""CDG_paramLen"")).toInt()-1;"; }
+
+type record GNI_PAR_tlv /* Generic notification indicator parameter (GNI); Optional(O) format. */
+{
+ Bit8 paramType ('00101100'B), /* Parameter Type '00101100'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit7 notificationIndicator,   /* Notification indicator */
+ Bit1 ext                      /* Extension */
+}
+with { encode "present=bytes(1,0x2C)"; }
+
+type record GNU_PAR_tlv /* Generic number parameter (GNU); Optional(O) format. */
+{
+ Bit8 paramType ('11000000'B),       /* Parameter Type '11000000'B */
+ Bit8 paramLen,                      /* Parameter Length field */
+ Bit8 numberQualifierIndicator,      /* Number qualifier indicator */
+ Bit7 natureOfAddressIndicator,      /* Nature of address indicator (NOTE�1/21) */
+ Bit1 oddEven,                       /* O/E */
+ Bit2 screeningIndicator,            /* Screening indicator (NOTE�1/24) */
+ Bit2 addrPresRestrInd,              /* Address presentation restricted indicator (NOTE�1/23) */
+ Bit3 numberingPlanIndicator,        /* Numbering plan indicator (NOTE�1/22) */
+ Bit1 nI,                            /* Number incomplete indicator */
+ octetstring addressSignals optional /* address signals */
+}
+with { encode "present=bytes(1,0xC0)"; 
+       encode (paramLen) "tag=""GNU_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""GNU_paramLen"")).toInt()-3;"; }
+
+
+type record HPC_PAR_tlv /* Hop counter parameter (HPC); Optional(O) format. */
+{
+ Bit8 paramType ('00111101'B), /* Parameter Type '00111101'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit5 hopCounter,              /* bits EDCBA: Hop counter */
+ Bit3 spare                    /* bits HGF: spare */
+}
+with { encode "present=bytes(1,0x7D)"; }
+
+type record HTRI_PAR_tlv /* HTR information parameter (HTRI); Optional(O) format. */
+{
+ Bit8 paramType ('10000010'B),  /* Parameter Type '10000010'B */
+ Bit8 paramLen,                 /* Parameter Length field */
+ Bit7 natureOfAddressIndicator, /* Nature of address indicator */
+ Bit1 oddEven,                  /* O/E */
+ Bit4 spare1,                   /* spare */
+ Bit3 numberingPlanIndicator,   /* Numbering plan indicator */
+ Bit1 spare2,                   /* spare */
+ octetstring addressSignals     /* address signals */
+}
+with { encode "present=bytes(1,0x82)"; 
+       encode (paramLen) "tag=""HTRI_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""HTRI_paramLen"")).toInt()-2;"; }
+
+type record IID_PAR_v /* Information indicators parameter (IID); Fixed(F) format. */
+{
+ Bit2 cliAddrResponseIndicator, /* bits BA: Calling party address response indicator */
+ Bit1 holdProvidedIndicator,    /* bit C: Hold provided indicator */
+ Bit2 spare1,                   /* bits ED: spare */
+ Bit1 cliCatRespIndicator,      /* bit F: Calling party's category response indicator */
+ Bit1 chargeInfoRespIndicator,  /* bit G: Charge information response indicator */
+ Bit1 solicitedInfoIndicator,   /* bit H: Solicited information indicator */
+ Bit4 spare2,                   /* bits L-I: spare */
+ Bit4 reserved                  /* bits P-M: reserved */
+}
+
+type record IPRRB_IT /* Invoking pivot/redirect reason backward information type  */
+{
+ Bit8 informationTypeTag ('00000011'B),    /* information type tag '00000011'B */
+ Bit8 informationTypeLength ('00000001'B), /* information type length */
+ Bit7 invokingReason,                      /* Invoking pivot/redirect reason */
+ Bit1 ext                                  /* Extension indicator */
+}
+with { encode "present=bytes(1,0x03)"; }
+
+type record IPRRF_IT /* Invoking pivot/redirect reason forward information type  */
+{
+ Bit8 informationTypeTag ('00000100'B),    /* information type tag '00000100'B */
+ Bit8 informationTypeLength ('00000001'B), /* information type length */
+ Bit7 invokingReason,                      /* Invoking pivot/redirect reason */
+ Bit1 ext                                  /* Extension indicator */
+}
+with { encode "present=bytes(1,0x04)"; }
+
+type record IRI_PAR_v /* Information request indicators parameter (IRI); Fixed(F) format. */
+{
+ Bit1 cliAddrRequestIndicator,    /* bit A: Calling party address request indicator */
+ Bit1 holdingIndicator,           /* bit B: Holding indicator */
+ Bit1 spare1,                     /* bit C: spare */
+ Bit1 cliCatRequestIndicator,     /* bit D: Calling party's category request indicator */
+ Bit1 chargeInfoRequestIndicator, /* bit E: Charge information request indicator */
+ Bit2 spare2,                     /* bits GF: spare */
+ Bit1 maliciousCidReqIndicator,   /* bit H: Malicious call identification request indicator (reserved, used in ISUP'88 Blue Book) */
+ Bit4 spare3,                     /* bits L-I: spare */
+ Bit4 reserved                    /* bits P-M: reserved */
+}
+
+type record LON_PAR_tlv /* Location number parameter (LON); Optional(O) format. */
+{
+ Bit8 paramType ('00111111'B),       /* Parameter Type '00111111'B */
+ Bit8 paramLen,                      /* Parameter Length field */
+ Bit7 natureOfAddressIndicator,      /* Nature of address indicator */
+ Bit1 oddEven,                       /* O/E */
+ Bit2 screeningIndicator,            /* Screening indicator */
+ Bit2 addrPresRestrInd,              /* Address presentation restricted indicator (NOTE ) */
+ Bit3 numberingPlanIndicator,        /* Numbering plan indicator */
+ Bit1 iNN,                           /* Internal Network Number indicator */
+ octetstring addressSignals optional /* address signals */
+}
+with { encode "present=bytes(1,0x3F)"; 
+       encode (paramLen) "tag=""LON_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""LON_paramLen"")).toInt()-2;"; }
+
+type record LPPI_PAR_tlv /* Loop prevention indicators parameter (LPPI); Optional(O) format. */
+{
+ Bit8 paramType ('01000100'B), /* Parameter Type '01000100'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit1 request_response,        /* bit A: Type */
+ Bit2 responseIndicator,       /* bits C B: Response indicator (only if bit A equals to 1 (response), otherwise: spare) */
+ Bit5 spare                    /* bits H-D: spare */
+}
+with { encode "present=bytes(1,0x44)"; }
+
+group MCI {
+type record MCI_PAR_tlv /* Message compatibility information parameter (MCI); Optional(O) format. */
+{
+ Bit8 paramType ('00111000'B), /* Parameter Type '00111000'B */
+ Bit8 paramLen,                /* Parameter Length field */
+ InstructionIndicators instructionIndicators
+}
+with { encode "present=bytes(1,0x38)"; 
+       encode (paramLen) "tag=""MCI_paramLen"";";
+       encode (instructionIndicators) "length=valueOf(getTag(""MCI_paramLen"")).toInt();"; }
+
+/* Start auxiliary types for message compatibility information parameter (MCI) */
+type record InstructionIndicator
+{
+ Bit1 transitAtIntermExchIndicator,   /* bit A: Transit at intermediate exchange indicator */
+ Bit1 releaseCallIndicator,           /* bit B: Release call indicator */
+ Bit1 sendNotificationIndicator,      /* bit C: Send notification indicator */
+ Bit1 discardMessageIndicator,        /* bit D: Discard message indicator */
+ Bit1 passOnNotPossibleIndicator,     /* bit E: Pass on not possible indicator */
+ Bit2 broadNarrowBandInterwIndicator, /* bits G F: Broadband/narrowband interworking indicator */
+ Bit1 ext                             /* extension bit */
+}
+
+type set of InstructionIndicator InstructionIndicators;
+/* End auxiliary types for message compatibility information parameter (MCI) */
+} /* end group MCI */
+
+type record MCRI_PAR_tlv /* MCID request indicators parameter (MCRI); Optional(O) format. */
+{
+ Bit8 paramType ('00111011'B), /* Parameter Type '00111011'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit1 mCIDRequestIndicator,    /* bit A: MCID request indicator */
+ Bit1 holdingIndicator,        /* bit B: Holding indicator (national use) */
+ Bit6 spare                    /* bits H-C: spare */
+}
+with { encode "present=bytes(1,0x3B)"; }
+
+type record MCRS_PAR_tlv /* MCID response indicators parameter (MCRS); Optional(O) format. */
+{
+ Bit8 paramType ('00111100'B), /* Parameter Type '00111100'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit1 mCIDResponseIndicator,   /* bit A: MCID response indicator */
+ Bit1 holdProvidedIndicator,   /* bit B: Hold provided indicator (national use) */
+ Bit6 spare                    /* bits H-C: spare */
+}
+with { encode "present=bytes(1,0x3C)"; }
+
+type record MLPP_PAR_tlv /* MLPP precedence parameter (MLPP); Optional(O) format. */
+{
+ Bit8 paramType ('00111010'B), /* Parameter Type '00111010'B */
+ Bit8 paramLen ('00000110'B),  /* Parameter Length field */
+ Bit4 precedenceLevel,         /* Precedence level */
+ Bit1 spare1,                  /* spare */
+ Bit2 lFB,                     /* LFB (look ahead for busy) */      
+ Bit1 spare2,                  /* spare */
+ Oct2 networkIdentity,         /* Network Identity (NI) octet 2 and 3 */
+ Oct3 mLppServiceDomain        /* MLPP service domain */
+}
+with { encode "present=bytes(1,0x3A)"; }
+
+type record NCI_PAR_v /* Nature of connection indicators parameter (NCI); Fixed(F) format. */
+{
+ Bit2 satelliteIndicator,         /* bits BA: Satellite indicator */
+ Bit2 continuityCheckIndicator,   /* bits DC: Continuity check indicator */
+ Bit1 echoControlDeviceIndicator, /* bit E: Echo control device indicator */
+ Bit3 spare                       /* bits H-F: spare */
+}
+
+type record NMC_PAR_tlv /* Network management controls parameter (NMC); Optional(O) format. */
+{
+ Bit8 paramType ('01011011'B),     /* Parameter Type '01011011'B */
+ Bit8 paramLen ('00000001'B),      /* Parameter Length field */
+ Bit1 temporaryAlternativeRouting, /* bit A: Temporary Alternative Routing (TAR) indicator */
+ Bit6 spare,                       /* bits G-B: spare */
+ Bit1 ext                          /* bit H: Extension indicator */
+}
+with { encode "present=bytes(1,0x5B)"; }
+
+type record NPFI_PAR_tlv /* Number portability forward information parameter (NPFI); Optional(O) format. */
+{
+ Bit8 paramType ('10001101'B),          /* Parameter Type '10001101'B */
+ Bit8 paramLen ('00000001'B),           /* Parameter Length field */
+ Bit4 numberPortabilityStatusIndicator, /* a) bits DCBA: Number portability status indicator */
+ Bit3 spare,                            /* b) bits GFE: spare */
+ Bit1 ext                               /* c) bit H: Extension indicator */
+}
+with { encode "present=bytes(1,0x8D)"; }
+
+type record NRN_PAR_tlv /* Network routing number parameter (NRN); Optional(O) format. */
+{
+ Bit8 paramType ('10000100'B),  /* Parameter Type '10000100'B */
+ Bit8 paramLen,                 /* Parameter Length field */
+ Bit4 natureOfAddressIndicator, /* Nature of address indicator */
+ Bit3 numberingPlanIdentifier,  /* Numbering Plan Identifier */
+ Bit1 oddEven,                  /* O/E */
+ octetstring addressSignals     /* address signals */
+}
+with { encode "present=bytes(1,0x84)"; 
+       encode (paramLen) "tag=""NRN_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""NRN_paramLen"")).toInt()-1;"; }
+
+type record NSF_PAR_tlv /* Network specific facility parameter (NSF); Optional(O) format. */
+{
+ Bit8 paramType ('00101111'B), /* Parameter Type '00101111'B */
+ Bit8 paramLen,                /* Parameter Length field */
+ octetstring networkSpecific   /* Network identification */
+}
+with { encode "present=bytes(1,0x2F)"; 
+       encode (paramLen) "tag=""NSF_paramLen"";";
+       encode (networkSpecific) "length=valueOf(getTag(""NSF_paramLen"")).toInt();"; }
+
+type record OBCI_PAR_tlv /* Optional backward call indicators parameter (OBCI); Optional(O) format. */
+{
+ Bit8 paramType ('00101001'B),     /* Parameter Type '00101001'B */
+ Bit8 paramLen ('00000001'B),      /* Parameter Length field */
+ Bit1 inBandInformationIndicator,  /* bit A: In-band information indicator */
+ Bit1 callDivMayOccurIndicator,    /* bit B: Call diversion may occur indicator */
+ Bit1 simpleSegmentationIndicator, /* bit C: Simple segmentation indicator */
+ Bit1 mLPPUserIndicator,           /* bit D: MLPP user indicator */
+ Bit4 reserved                     /* bits H-E: reserved for national use */
+}
+with { encode "present=bytes(1,0x29)"; }
+
+type record OCI_PAR_tlv /* Original called IN number parameter (OCI); Optional(O) format. */
+{
+ Bit8 paramType ('01111111'B),  /* Parameter Type '01111111'B */
+ Bit8 paramLen,                 /* Parameter Length field */
+ Bit7 natureOfAddressIndicator, /* Nature of address indicator */
+ Bit1 oddEven,                  /* O/E */
+ Bit2 spare1,                   /* spare */
+ Bit2 addrPresRestrInd,         /* Address presentation restricted indicator */
+ Bit3 numberingPlanIndicator,   /* Numbering plan indicator */
+ Bit1 spare2,                   /* spare */
+ octetstring addressSignals     /* address signals */
+}
+with { encode "present=bytes(1,0x7F)"; 
+       encode (paramLen) "tag=""OCI_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""OCI_paramLen"")).toInt()-2;"; }
+
+type record OCN_PAR_tlv /* Original called number parameter (OCN); Optional(O) format. */
+{
+ Bit8 paramType ('00101000'B),       /* Parameter Type '00101000'B */
+ Bit8 paramLen,                      /* Parameter Length field */
+ Bit7 natureOfAddressIndicator,      /* Nature of address indicator */
+ Bit1 oddEven,                       /* O/E */
+ Bit2 spare1,                        /* spare */
+ Bit2 addrPresRestrInd,              /* Address presentation restricted indicator */
+ Bit3 numberingPlanIndicator,        /* Numbering plan indicator */
+ Bit1 spare2,                        /* spare */
+ octetstring addressSignals optional /* address signals */
+}
+with { encode "present=bytes(1,0x28)"; 
+       encode (paramLen) "tag=""OCN_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""OCN_paramLen"")).toInt()-2;"; }
+
+type record OFCI_PAR_tlv /* Optional forward call indicators parameter (OFCI); Optional(O) format. */
+{
+ Bit8 paramType ('00001000'B), /* Parameter Type '00001000'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit2 cUGCallIndicator,        /* bits BA: Closed user group call indicator */
+ Bit1 simpleSegIndicator,      /* bit C: Simple segmentation indicator */
+ Bit4 spare,                   /* bits G-D: spare */
+ Bit1 cLIRequestIndicator      /* bit H: Connected line identity request indicator */
+}
+with { encode "present=bytes(1,0x08)"; }
+
+type record OIPC_PAR_tlv /* Origination ISC point code parameter (OIPC); Optional(O) format. */
+{
+ Bit8 paramType ('00101011'B), /* Parameter Type '00101011'B */
+ Bit8 paramLen ('00000010'B),   /* Parameter Length field */
+ Bit14 signallingPointCode,    /* Signalling point code */
+ Bit2 spare                    /* spare */
+}
+with { encode "present=bytes(1,0x2B)"; }
+
+group PCI {
+type record PCI_PAR_tlv /* Parameter compatibility information parameter (PCI); Optional(O) format. */
+{
+ Bit8 paramType ('00111001'B),        /* Parameter Type '00111001'B */
+ Bit8 paramLen,                       /* Parameter Length field */
+ ParameterInstructionIndicators parameterInstructionIndicators
+}
+with { encode "present=bytes(1,0x39)";
+       encode (paramLen) "tag=""PCI_paramLen"";";
+       encode (parameterInstructionIndicators) "length=valueOf(getTag(""PCI_paramLen"")).toInt();"; }
+
+/* Start auxiliary types for parameter compatibility information parameter (PCI) */
+type record ParameterInstructionIndicator
+{
+ Bit8 upgradedParameter,                        /* upgraded parameter name */
+ Bit1 transitAtIntermExchIndicator,             /* bit A: Transit at intermediate exchange indicator */
+ Bit1 releaseCallIndicator,                     /* bit B: Release call indicator */
+ Bit1 sendNotificationIndicator,                /* bit C: Send notification indicator */
+ Bit1 discardMessageIndicator,                  /* bit D: Discard message indicator */
+ Bit1 discardParameterIndicator,                /* bit E: Discard parameter indicator */
+ Bit2 passOnNotPossibleIndicator,               /* bits G F: Pass on not possible indicator */
+ Bit1 ext1,                                     /* bit H: Extension indicator (ext.) */
+ Bit2 broadNarrowBandInterwIndicator optional,  /* bits J I: Broadband/narrowband interworking indicator */
+ Bit5 spare optional,                           /* bits O-K: spare */
+ Bit1 ext2 optional,                            /* bit P: Extension indicator (ext.) */
+ octetstring moreInstructionIndicators optional /* to be defined when required */
+}
+type set of ParameterInstructionIndicator ParameterInstructionIndicators;
+/* End auxiliary types for parameter compatibility information parameter (PCI) */
+} /* end group PCI */
+
+type record PDC_PAR_tlv /* Propagation delay counter parameter (PDC); Optional(O) format. */
+{
+ Bit8 paramType ('00110001'B), /* Parameter Type '00110001'B */
+ Bit8 paramLen ('00000010'B),  /* Parameter Length field */
+ Bit16 propagationDelayValue   /* Propagation delay value */
+}
+with { encode "present=bytes(1,0x31)"; }
+
+type record PICN_PAR_tlv /* Pivot counter parameter (PICN); Optional(O) format. */
+{
+ Bit8 paramType ('10000111'B), /* Parameter Type '10000111'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit5 pivotCounter,            /* bits EDCBA: Pivot counter */
+ Bit3 spare                    /* bits HGF: spare */
+}
+with { encode "present=bytes(1,0x87)"; }
+
+type record PICP_PAR_tlv /* Pivot capability parameter (PICP); Optional(O) format. */
+{
+ Bit8 paramType ('01111011'B),      /* Parameter Type '01111011'B */
+ Bit8 paramLen ('00000001'B),       /* Parameter Length field */
+ Bit3 pivotPossibleIndicator,       /* bits CBA: Pivot possible indicator */
+ Bit3 spare,                        /* bits FED: spare */
+ Bit1 interwToRedirectionIndicator, /* bit G: Interworking to redirection indicator (national use) */
+ Bit1 ext                           /* bit H: Extension indicator */
+}
+with { encode "present=bytes(1,0x7B)"; }
+
+group Auxiliary_PRFI_PRBI_RFI_RBI {
+/* Start auxiliary types for 
+	- pivot routing forward information parameter (PRFI)
+	- pivot routing backward information parameter (PRBI)
+	- redirect forward information parameter (RFI)
+	- redirect backward information parameter (RBI) */
+type record RIEP_IT /* Return to invoking exchange possible information type  */
+{
+ Bit8 informationTypeTag ('00000001'B),   /* information type tag '00000001'B */
+ Bit8 informationTypeLength ('00000000'B) /* information type length */
+}
+with { encode "present=bytes(1,0x01)"; }
+
+type record RIECI_IT /* Return to invoking exchange call identifier information type  */
+{
+ Bit8 informationTypeTag ('00000010'B),   /* information type tag '00000010'B */
+ Bit8 informationTypeLength('00000101'B), /* information type length */
+ Bit24 callIdentity,                      /* Call identity */
+ Bit14 signallingPointCode,               /* Signalling point code */
+ Bit2 spare                               /* spare */
+}
+with { encode "present=bytes(1,0x02)"; }
+
+type record PerformingReason
+{
+ Bit7 performingReason,  /* Performing Pivot/Redirect Reason */
+ Bit1 ext,               /* Extension indicator */
+ Bit4 possibleIndicator, /* Pivot/Redirect possible indicator at performing exchange */
+ Bit4 spare              /* spare */
+}
+
+type set of PerformingReason PerformingReasons;
+
+type record PPRI_IT /* Performing pivot/redirect indicator information type  */
+{
+ Bit8 informationTypeTag ('00000011'B), /* information type tag '00000011'B */
+ Bit8 informationTypeLength,            /* information type length */
+ PerformingReasons performingReasons    /* Performing Pivot/Redirect Reasons */
+}
+with { encode "present=bytes(1,0x03)"; 
+       encode (informationTypeLength) "tag=""PPRI_informationTypeLength"";";
+       encode (performingReasons) "length=valueOf(getTag(""PPRI_informationTypeLength"")).toInt();"; }
+
+type record RIED_IT /* Return to invoking exchange duration */
+{
+ Bit8 informationTypeTag ('00000001'B),   /* information type tag '00000001'B */
+ Bit8 informationTypeLength,              /* information type length */
+ Oct1to2 returnToInvokingExchangeDuration /* Return to invoking exchange duration in seconds */
+}
+with { encode "present=bytes(1,0x01)";
+       encode (informationTypeLength) "tag=""RIED_informationTypeLength"";";
+       encode (returnToInvokingExchangeDuration) "length=valueOf(getTag(""RIED_informationTypeLength"")).toInt();"; }
+
+type union InformationType_Forward /* Information type for Pivot/Redirect routing forward information parameters */
+{
+ RIEP_IT rIEP_IT,
+ RIECI_IT rIECI_IT,
+ PPRI_IT pPRI_IT,
+ IPRRF_IT iPRRF_IT
+}
+
+type union InformationType_Backward /* Information type for Pivot/Redirect routing backward information parameters */
+{
+ RIED_IT rIED_IT,
+ RIECI_IT rIECI_IT,
+ IPRRB_IT iPRRB_IT
+}
+
+type set of InformationType_Forward InformationTypes_Forward;
+
+type set of InformationType_Backward InformationTypes_Backward;
+/* End auxiliary types for 
+	- pivot routing forward information parameter (PRFI)
+	- pivot routing backward information parameter (PRBI)
+	- redirect forward information parameter (RFI)
+	- redirect backward information parameter (RBI) */
+
+} /* end group Auxiliary_PRFI_PRBI_RFI_RBI */
+
+type record PRBI_PAR_tlv /* Pivot routing backward information parameter (PRBI); Optional(O) format. */
+{
+ Bit8 paramType ('10001001'B),                       /* Parameter Type '10001001'B */
+ Bit8 paramLen,                                      /* Parameter Length field */
+ InformationTypes_Backward informationTypes_Backward /* information types */
+}
+with { encode "present=bytes(1,0x89)"; 
+       encode (paramLen) "tag=""PRBI_paramLen"";";
+       encode (informationTypes_Backward) "length=valueOf(getTag(""PRBI_paramLen"")).toInt();"; }
+
+type record PRFI_PAR_tlv /* Pivot routing forward information parameter (PRFI); Optional(O) format. */
+{
+ Bit8 paramType ('10001000'B),                     /* Parameter Type '10001000'B */
+ Bit8 paramLen,                                    /* Parameter Length field */
+ InformationTypes_Forward informationTypes_Forward /* information types */
+}
+with { encode "present=bytes(1,0x88)"; 
+       encode (paramLen) "tag=""PRFI_paramLen"";";
+       encode (informationTypes_Forward) "length=valueOf(getTag(""PRFI_paramLen"")).toInt();"; }
+
+type record PRI_PAR_tlv /* Pivot routing indicators parameter (PRI); Optional(O) format. */
+{
+ Bit8 paramType ('01111100'B), /* Parameter Type '01111100'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit7 pivotRoutingIndicators,  /* bits G F E D C B A: Pivot routing indicators */
+ Bit1 ext                      /* bit H: Extension indicator */
+}
+with { encode "present=bytes(1,0x7C)"; }
+
+type record PST_PAR_tlv /* Pivot status parameter (PST); Optional(O) format. */
+{
+ Bit8 paramType ('10000110'B), /* Parameter Type '10000110'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit2 pivotStatusIndicator,    /* bits BA: Pivot status indicator */
+ Bit5 spare,                   /* bits GFEDC: spare */
+ Bit1 ext                      /* bit H: Extension indicator */
+}
+with { encode "present=bytes(1,0x86)"; }
+
+type record QRC_PAR_tlv /* Query on release capability parameter (QRC); Optional(O) format. */
+{
+ Bit8 paramType ('10000101'B), /* Parameter Type '10000101'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit1 qoRCapabilityIndicator,  /* bit A: QoR capability indicator */
+ Bit6 spare,                   /* bits G-B: spare */
+ Bit1 ext                      /* bit H: Extension indicator */
+}
+with { encode "present=bytes(1,0x85)"; }
+
+type record RAS_PAR_lv /* Range and status parameter (RAS); Variable(V) format. */
+{
+ Bit8 paramLen ,    /* Parameter Length field */
+ Bit8 range,        /* Range */
+ octetstring status /* Status */
+}
+with { encode (paramLen) "tag=""RAS_paramLen"";";
+       encode (status) "length=valueOf(getTag(""RAS_paramLen"")).toInt()-1;"; }
+
+type record RBI_PAR_tlv /* Redirect backward information parameter (RBI); Optional(O) format. */
+{
+ Bit8 paramType ('10001100'B),                       /* Parameter Type '10001100'B */
+ Bit8 paramLen,                                      /* Parameter Length field */
+ InformationTypes_Backward informationTypes_Backward /* information types */
+}
+with { encode "present=bytes(1,0x8C)"; 
+       encode (paramLen) "tag=""RBI_paramLen"";";
+       encode (informationTypes_Backward) "length=valueOf(getTag(""RBI_paramLen"")).toInt();"; }
+
+type record RCN_PAR_tlv /* Redirect counter parameter (RCN); Optional(O) format. */
+{
+ Bit8 paramType ('01110111'B), /* Parameter Type '01110111'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit5 redirectCounter,         /* bits EDCBA: Redirect counter */
+ Bit3 spare                    /* bits HGF: spare */
+}
+with { encode "present=bytes(1,0x77)"; } 
+
+type record RCP_PAR_tlv /* Redirect capability parameter (RCP); Optional(O) format. */
+{
+ Bit8 paramType ('01001110'B),   /* Parameter Type '01001110'B */
+ Bit8 paramLen ('00000001'B),    /* Parameter Length field */
+ Bit3 redirectPossibleIndicator, /* bits CBA: Redirect possible indicator */
+ Bit4 spare,                     /* bits GFED: spare */
+ Bit1 ext                        /* bit H: Extension indicator */
+}
+with { encode "present=bytes(1,0x4E)"; } 
+
+type record RDN_PAR_tlv /* Redirecting number parameter (RDN); Optional(O) format. */
+{
+ Bit8 paramType ('00001011'B),       /* Parameter Type '00001011'B */
+ Bit8 paramLen,                      /* Parameter Length field */
+ Bit7 natureOfAddressIndicator,      /* Nature of address indicator */
+ Bit1 oddEven,                       /* O/E */
+ Bit2 spare1,                        /* spare */
+ Bit2 addrPresRestrInd,              /* Address presentation restricted indicator */
+ Bit3 numberingPlanIndicator,        /* Numbering plan indicator */
+ Bit1 spare2,                        /* spare */
+ octetstring addressSignals optional /* address signals */
+}
+with { encode "present=bytes(1,0x0B)"; 
+       encode (paramLen) "tag=""RDN_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""RDN_paramLen"")).toInt()-2;"; }
+
+type record RDI_PAR_tlv /* Redirection information parameter (RDI); Optional(O) format. */
+{
+ Bit8 paramType ('00010011'B),   /* Parameter Type '00010011'B */
+ Bit8 paramLen ('00000010'B),    /* Parameter Length field */
+ Bit3 redirectingIndicator,      /* bits CBA: Redirecting indicator */
+ Bit1 spare,                     /* Bit D: spare */
+ Bit4 originalRedirectionReason, /* bits H G F E: Original redirection reason */
+ Bit3 redirectionCounter,        /* bits K J I: Redirection counter */
+ Bit1 reserved,                  /* bit L: reserved for national use */
+ Bit4 redirectingReason          /* bits PONM: Redirecting reason */
+}
+with { encode "present=bytes(1,0x13)"; }
+
+type record RFI_PAR_tlv /* Redirect forward information parameter (RFI); Optional(O) format. */
+{
+ Bit8 paramType ('10001011'B),                     /* Parameter Type '10001011'B */
+ Bit8 paramLen,                                    /* Parameter Length field */
+ InformationTypes_Forward informationTypes_Forward /* information types */
+}
+with { encode "present=bytes(1,0x8B)"; 
+       encode (paramLen) "tag=""RFI_paramLen"";";
+       encode (informationTypes_Forward) "length=valueOf(getTag(""RFI_paramLen"")).toInt();"; }
+
+type record RNN_PAR_tlv /* Redirection number parameter (RNN); Optional(O) format. */
+{
+ Bit8 paramType ('00001100'B),       /* Parameter Type '00001100'B */
+ Bit8 paramLen,                      /* Parameter Length field */
+ Bit7 natureOfAddressIndicator,      /* Nature of address indicator */
+ Bit1 oddEven,                       /* O/E */
+ Bit4 spare,                         /* spare */
+ Bit3 numberingPlanIndicator,        /* Numbering plan indicator */
+ Bit1 iNN,                           /* Internal Network Number indicator */
+ octetstring addressSignals optional /* address signals */
+}
+with { encode "present=bytes(1,0x0C)"; 
+       encode (paramLen) "tag=""RNN_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""RNN_paramLen"")).toInt()-2;"; }
+
+type record RNS_PAR_tlv /* Redirection number restriction parameter (RNS); Optional(O) format. */
+{
+ Bit8 paramType ('01000000'B), /* Parameter Type '01000000'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit2 presRestrIndicator,      /* bits BA: Presentation restricted indicator */
+ Bit6 spare                    /* bits H-C: spare */
+}
+with { encode "present=bytes(1,0x40)"; }
+
+type record ROP_PAR_tlv /* Remote operations parameter (ROP); Optional(O) format. */
+{
+ Bit8 paramType ('00110010'B), /* Parameter Type '00110010'B */
+ Bit8 paramLen,                /* Parameter Length field */
+ Bit5 protocolProfile,         /* Protocol profile */
+ Bit2 spare,                   /* spare */
+ Bit1 ext,                     /* Extension */
+ octetstring components        /* ASN.1 components */
+}
+with { encode "present=bytes(1,0x32)"; 
+       encode (paramLen) "tag=""ROP_paramLen"";";
+       encode (components) "length=valueOf(getTag(""ROP_paramLen"")).toInt()-1;"; }
+
+type record RST_PAR_tlv /* Redirect status parameter (RST); Optional(O) format. */
+{
+ Bit8 paramType ('10001010'B), /* Parameter Type '10001010'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit2 redirectStatusIndicator, /* bits BA: Redirect status indicator */
+ Bit5 spare,                   /* bits GFEDC: spare */
+ Bit1 ext                      /* bit H: Extension indicator */
+}
+with { encode "present=bytes(1,0x8A)"; } 
+
+type record SAC_PAR_tlv /* Service activation parameter (SAC); Optional(O) format. */
+{
+ Bit8 paramType ('00110011'B), /* Parameter Type '00110011'B */
+ Bit8 paramLen,                /* Parameter Length field */
+ octetstring featureCodes      /* Feature codes */
+}
+with { encode "present=bytes(1,0x33)"; 
+	   encode (paramLen) "tag=""SAC_paramLen"";";
+       encode (featureCodes) "length=valueOf(getTag(""SAC_paramLen"")).toInt();"; }
+
+type record SCFI_PAR_tlv /* SCF id parameter (SCFI); Optional(O) format. */
+{
+ Bit8 paramType ('01100110'B), /* Parameter Type '01100110'B */
+ Bit8 paramLen,                /* Parameter Length field */
+ octetstring sCFId             /* SCF id */
+}
+with { encode "present=bytes(1,0x66)"; 
+	   encode (paramLen) "tag=""SCFI_paramLen"";";
+       encode (sCFId) "length=valueOf(getTag(""SCFI_paramLen"")).toInt();"; }
+
+type record SPC_PAR_tlv /* Signalling point code parameter (SPC); Optional(O) format. */
+{
+ Bit8 paramType ('00011110'B), /* Parameter Type '00011110'B */
+ Bit8 paramLen ('00000010'B),  /* Parameter Length field */
+ Bit14 signallingPointCode,    /* Signalling point code */
+ Bit2 spare                    /* spare */
+}
+with { encode "present=bytes(1,0x1E)"; }
+
+type record SNN_PAR_lv /* Subsequent number parameter (SNN); Variable(V) format. */
+{
+ Bit8 paramLen,             /* Parameter Length field */
+ Bit7 spare,                /* spare */
+ Bit1 oddEven,              /* O/E */
+ octetstring addressSignals /* address signals */
+}
+with { encode (paramLen) "tag=""SNN_lv_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""SNN_lv_paramLen"")).toInt()-1;"; }
+
+type record SNN_PAR_tlv /* Subsequent number parameter (SNN); Optional(O) format. */
+{
+ Bit8 paramType ('00000101'B), /* Parameter Type '00000101'B */
+ Bit8 paramLen,                /* Parameter Length field */
+ Bit7 spare,                   /* spare */
+ Bit1 oddEven,                 /* O/E */
+ octetstring addressSignals    /* address signals */
+}
+with { encode "present=bytes(1,0x05)"; 
+       encode (paramLen) "tag=""SNN_paramLen"";";
+       encode (addressSignals) "length=valueOf(getTag(""SNN_paramLen"")).toInt()-1;"; }
+
+type record SRI_PAR_v /* Suspend Resume indicators parameter (SRI); Fixed(F) format. */
+{
+ Bit1 suspendResumeIndicator, /* bit A: Suspend/resume indicator */
+ Bit7 spare                   /* bits H-B: spare */
+}
+
+type record TNS_PAR_tlv /* Transit network selection parameter (TNS); Optional(O) format. */
+{
+ Bit8 paramType ('00100011'B),     /* Parameter Type '00100011'B */
+ Bit8 paramLen,                    /* Parameter Length field */
+ Bit4 networkIdentificationPlan,   /* Network identification plan */
+ Bit3 typeOfNetworkIdentification, /* Type of network identification */
+ Bit1 oddEven,                     /* O/E */
+ octetstring networkIdentification /* Network identification */
+}
+with { encode "present=bytes(1,0x23)"; 
+       encode (paramLen) "tag=""TNS_paramLen"";";
+       encode (networkIdentification) "length=valueOf(getTag(""TNS_paramLen"")).toInt()-1;"; }
+
+type Bit8 TMR_PAR_v; /* ransmission medium requirement parameter (TMR); Fixed(F) format. */
+
+type record TMRP_PAR_tlv /* Transmission medium requirement prime parameter (TMRP); Optional(O) format. */
+{
+ Bit8 paramType ('00111110'B),      /* Parameter Type '00111110'B */
+ Bit8 paramLen ('00000001'B),       /* Parameter Length field */
+ Bit8 transmissionMediumRequirement /* Transmission medium requirement */
+}
+with { encode "present=bytes(1,0x3E)"; }
+
+type record TMU_PAR_tlv /* Transmission medium used parameter (TMU); Optional(O) format. */
+{
+ Bit8 paramType ('00110101'B), /* Parameter Type '00110101'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit8 transmissionMediumUsed   /* Transmission medium used */
+}
+with { encode "present=bytes(1,0x35)"; }
+
+type record UAI_PAR_tlv /* UID action indicators parameter (UAI); Optional(O) format. */
+{
+ Bit8 paramType ('01110100'B),         /* Parameter Type '01110100'B */
+ Bit8 paramLen ('00000001'B),          /* Parameter Length field */
+ Bit1 throughConnInstructionIndicator, /* bit A: Through-connection instruction indicator */
+ Bit1 t9TimerInstructionIndicator,     /* bit B: T9 timer instruction indicator */
+ Bit5 spare,                           /* bits G-C: spare */
+ Bit1 ext                              /* bit H: Extension indicator */
+}
+with { encode "present=bytes(1,0x74)"; }
+
+type record UCI_PAR_tlv /* UID capability indicators parameter (UCI); Optional(O) format. */
+{
+ Bit8 paramType ('01110101'B),    /* Parameter Type '01110101'B */
+ Bit8 paramLen ('00000001'B),    /* Parameter Length field */
+ Bit1 througConnectionIndicator, /* bit A: Through-connection indicator */
+ Bit1 t9TimerIndicator,          /* bit B: T9 timer indicator */
+ Bit5 spare,                     /* bits G-C: spare */
+ Bit1 ext                        /* bit H: Extension indicator */
+}
+with { encode "present=bytes(1,0x75)"; }
+
+group USI {
+type record USI_PAR_tlv /* User service information parameter (USI); Optional(O) format. */
+{
+ Bit8 paramType ('00011101'B),  /* Parameter Type '00011101'B */
+ Bit8 paramLen,  /* Parameter Length field */
+ USIContents uSIContents
+}
+with { encode "present=bytes(1,0x1D)"; 
+       encode (paramLen) "tag=""USI_paramLen"";";
+       encode (uSIContents) "length=valueOf(getTag(""USI_paramLen"")).toInt();"; }
+
+/* Start auxiliary types for user service information parameter (USI) */
+type record USIContents
+{
+ BCAP_octet3 bCAP_octet3,
+ BCAP_octet4 bCAP_octet4,
+ BCAP_octet5 bCAP_octet5 optional,
+ BCAP_octet6 bCAP_octet6 optional,
+ BCAP_octet7 bCAP_octet7 optional
+}
+/* End auxiliary types for user service information parameter (USI) */
+} /* end group USI */
+
+type record USIP_PAR_tlv /* User service information prime parameter (USIP); Optional(O) format. */
+{
+ Bit8 paramType ('00110000'B), /* Parameter Type '00110000'B */
+ Bit8 paramLen,                /* Parameter Length field */
+ USIContents uSIContents
+}
+with { encode "present=bytes(1,0x30)"; 
+       encode (paramLen) "tag=""USIP_paramLen"";";
+       encode (uSIContents) "length=valueOf(getTag(""USIP_paramLen"")).toInt();"; }
+
+
+type record UTSI_PAR_tlv /* User teleservice information parameter (UTSI); Optional(O) format. */
+{
+ Bit8 paramType ('00110100'B),                             /* Parameter Type '00110100'B */
+ Bit8 paramLen,                                            /* Parameter Length field */
+ Bit2 presentation,                                        /* Presentation */
+ Bit3 interpretation,                                      /* Interpretation */
+ Bit2 codingStandard,                                      /* Coding standard */
+ Bit1 ext1,                                                /* Extension */
+ Bit7 highLayerCharacteristicsIdentification,              /* High layer characteristics identification */
+ Bit1 ext2,                                                /* Extension */
+ Bit7 extendedLayerCharacteristicsIdentification optional, /* Extended layer characteristics identification */
+ Bit1 ext3 optional                                        /* Extension */
+}
+with { encode "present=bytes(1,0x34)"; }
+
+type record UUID_PAR_tlv /* User-to-user indicators parameter (UUID); Optional(O) format. */
+{
+ Bit8 paramType ('00101010'B), /* Parameter Type '00101010'B */
+ Bit8 paramLen ('00000001'B),  /* Parameter Length field */
+ Bit1 request_response,        /* bit A: Type */
+ Bit2 service1,                /* bits C B: Service 1 */
+ Bit2 service2,                /* bits E D: Service 2 */
+ Bit2 service3,                /* bits G F: Service 3 */
+ Bit1 networkDiscardIndicator  /* bit H: Network discard indicator (only applicable if bit A equals 1 (response), otherwise: spare) */
+}
+with { encode "present=bytes(1,0x2A)"; }
+
+type record UUIF_PAR_lv /* User-to-user information parameter (UUIF); Variable(V) format. */
+{
+ Bit8 paramLen,                    /* Parameter Length field */
+ octetstring userToUserInformation /* User-to-user information */
+}
+with { encode (paramLen) "tag=""UUIF_lv_paramLen"";";
+       encode (userToUserInformation) "length=valueOf(getTag(""UUIF_lv_paramLen"")).toInt();"; }
+
+type record UUIF_PAR_tlv /* User-to-user information parameter (UUIF); Optional(O) format. */
+{
+ Bit8 paramType ('00100000'B),     /* Parameter Type '00100000'B */
+ Bit8 paramLen,                    /* Parameter Length field */
+ octetstring userToUserInformation /* User-to-user information */
+}
+with { encode "present=bytes(1,0x20)"; 
+	   encode (paramLen) "tag=""UUIF_paramLen"";";
+       encode (userToUserInformation) "length=valueOf(getTag(""UUIF_paramLen"")).toInt();"; }
+
+type record UNKNOWN_PAR_tlv /* Parameter with unknown type. */
+{
+ Bit8 paramType,      /* Unknown Parameter Type e.g. '10001111'B */
+ Bit8 paramLen,       /* Parameter Length field */
+ octetstring contents /* Parameter Contents */
+}
+} /* end group Parameter */
+} /* end module SipIsup_ISUP_ParamTypes */
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TestExecution.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TestExecution.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TestExecution.ttcn	(revision 22)
@@ -0,0 +1,28 @@
+/*
+ *	@author     STF370
+ *  @version    $Id$
+ *	@desc       Testcase execution is defined here.
+ *
+ */
+module TestExecution { 
+	
+	import from Simple_Testcases { testcase all } ;
+	import from Sanity_Testcases { testcase all } ;
+	import from LibSip_SIPTypesAndValues all;
+
+  control {
+
+  	execute(TC_SIMPLE_0001());
+  	execute(TC_SIMPLE_0002());
+  	execute(TC_SIMPLE_0003());
+  	execute(TC_SIMPLE_0004());
+  	execute(TC_SIMPLE_0005());
+  	execute(TC_SIMPLE_0006());
+  	execute(TC_SIMPLE_0007());
+
+	execute(TC_SANITY_0001());
+	execute(TC_SANITY_0002());
+
+  } // end control
+
+} // end module TestExecution
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TestSystem.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TestSystem.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TestSystem.ttcn	(revision 22)
@@ -0,0 +1,63 @@
+/*
+ *	@author     STF370
+ *  @version    $Id$
+ *	@desc       Ports, timers, primitives, test components, component variables
+ *	            are defined here.
+ */
+ 
+module TestSystem {
+
+  import from LibSip_SIPTypesAndValues all;
+  import from LibSip_SDPTypes all;
+  //import from SipIsup_ISUP_MsgTypes all;
+
+	type component SipSimu {
+		
+		// Ports
+		port SipPort sipPort;
+
+		// Component variables
+
+		// Timers
+
+	} // end of type component Simu
+
+	type component SipTest {
+		
+		// Ports
+		port SipTestPort testPort;
+
+		// Component variables
+
+		// Timers
+
+	} // end of type component Test
+
+  group portDefs {
+
+    type port SipPort message {
+      inout 
+        Request,
+        REGISTER_Request,
+        INVITE_Request,
+        OPTIONS_Request,
+        BYE_Request,
+        CANCEL_Request,
+        ACK_Request,
+        PRACK_Request,
+        NOTIFY_Request,
+        SUBSCRIBE_Request,
+        PUBLISH_Request,
+        UPDATE_Request,
+        REFER_Request,
+        MESSAGE_Request,
+        INFO_Request,
+        Response,
+        Raw        
+    };
+
+    type port SipTestPort message {
+    	inout all
+    };
+  }	// end group portDefs
+} // end module TestSystem
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/Makefile
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/Makefile	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/Makefile	(revision 22)
@@ -0,0 +1,28 @@
+
+#T3DK_TTCN_SOURCES	= ../../ttcn/LibSip_SIPTypesAndValues.ttcn ../../ttcn/LibSip_SDPTypes.ttcn
+T3DK_TTCN_SOURCES	= $(wildcard ../*.ttcn)  $(wildcard *.ttcn)
+
+T3DK_ROOT_MODULE	= SipTorture_TestCases
+
+T3DK_C_SOURCES		= 
+
+T3DK_CXX_SOURCES	= ../../c++/sip_codets.cpp ../../c++/sdp_codets.cpp $(wildcard *.cpp)
+
+T3DK_CDGEN_HEADER	= ../../c++/codec.h
+
+T3DK_CODETS		= $(wildcard ../../c++/*_codets.cpp ../../c++/*_codets.h)
+
+T3DK_LIBS		= -lboost_regex$(if $(shell uname -o | grep Cygwin),-gcc-mt,-mt)
+
+CPPFLAGS		= -I. -I../../c++
+
+CC			= gcc
+
+CXX			= g++
+
+CFLAGS			= -g 
+
+CXXFLAGS		= -g
+
+include $(shell t3devkit-config --mk)
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/SipTorturePort.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/SipTorturePort.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/SipTorturePort.cpp	(revision 22)
@@ -0,0 +1,92 @@
+/****************************************************************************/
+/* $Id$             */
+/*                                                                          */
+/*   (c) 2009  Universite de Rennes 1                                       */
+/*                                                                          */
+/* Contributors:                                                            */
+/*  - Anthony BAIRE                                                         */
+/*                                                                          */
+/* Contact address: <t3devkit@irisa.fr>                                     */
+/*                                                                          */
+/*                                                                          */
+/* This file is part of application examples provided along with T3DevKit,  */
+/* a free toolkit for building TTCN-3 tests.                                */
+/*                                                                          */
+/* This software is governed by the CeCILL-B license under French law and   */
+/* abiding by the rules of distribution of free software.  You can  use,    */
+/* modify and/or redistribute the software under the terms of the CeCILL-B  */
+/* license as circulated by CEA, CNRS and INRIA at the following URL        */
+/* "http://www.cecill.info".                                                */
+/*                                                                          */
+/* As a counterpart to the access to the source code and  rights to copy,   */
+/* modify and redistribute granted by the license, users are provided only  */
+/* with a limited warranty  and the software's author,  the holder of the   */
+/* economic rights,  and the successive licensors  have only  limited       */
+/* liability.                                                               */
+/*                                                                          */
+/* In this respect, the user's attention is drawn to the risks associated   */
+/* with loading,  using,  modifying and/or developing or reproducing the    */
+/* software by the user in light of its specific status of free software,   */
+/* that may mean  that it is complicated to manipulate,  and  that  also    */
+/* therefore means  that it is reserved for developers  and  experienced    */
+/* professionals having in-depth computer knowledge. Users are therefore    */
+/* encouraged to load and test the software's suitability as regards their  */
+/* requirements in conditions enabling the security of their systems and/or */ 
+/* data to be ensured and,  more generally, to use and operate it in the    */
+/* same conditions as regards security.                                     */
+/*                                                                          */
+/* The fact that you are presently reading this means that you have had     */
+/* knowledge of the CeCILL-B license and that you accept its terms.         */
+/****************************************************************************/
+#include <fstream>
+#include "SipTorturePort.h"
+using namespace t3devlib;
+using namespace std;
+
+SipTorturePort::SipTorturePort (PortId& id) :
+	Port (id)
+{ 
+}
+
+SipTorturePort::~SipTorturePort() 
+{
+}
+
+bool SipTorturePort::Map (const PortId& connected_port_id) 
+{
+	string filename ("data/");
+	filename += GetTestcaseId().GetObjectName();
+	filename += ".dat";
+
+	cout << "Reading testcase data from " << filename << endl;
+
+	ifstream in (filename.c_str(), ios_base::in | ios_base::binary);
+
+	if (!in) {
+		cerr << "Cannot open " << filename << endl;
+		return false;
+	}
+
+	in.seekg (0, ios_base::end);
+	streampos size = in.tellg();
+	in.seekg (0, ios_base::beg);
+
+	char* buff = new char[size];
+	in.read (buff, size);
+
+	EnqueueMsg (connected_port_id, MappedBitstring (buff, size*8));
+
+	delete buff;
+
+	return in.good(); 
+} 
+ 
+bool SipTorturePort::Unmap (const PortId& connected_port_id) 
+{ 
+  return true; 
+}
+
+bool SipTorturePort::Send (const ComponentId& from,const Bitstring& msg) {
+  cerr << "cannot send data to the Sip 'Torture' Port" << endl;
+  return false;
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/SipTorturePort.h
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/SipTorturePort.h	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/SipTorturePort.h	(revision 22)
@@ -0,0 +1,61 @@
+/****************************************************************************/
+/* $Id$             */
+/*                                                                          */
+/*   (c) 2009  Universite de Rennes 1                                       */
+/*                                                                          */
+/* Contributors:                                                            */
+/*  - Anthony BAIRE                                                         */
+/*                                                                          */
+/* Contact address: <t3devkit@irisa.fr>                                     */
+/*                                                                          */
+/*                                                                          */
+/* This file is part of application examples provided along with T3DevKit,  */
+/* a free toolkit for building TTCN-3 tests.                                */
+/*                                                                          */
+/* This software is governed by the CeCILL-B license under French law and   */
+/* abiding by the rules of distribution of free software.  You can  use,    */
+/* modify and/or redistribute the software under the terms of the CeCILL-B  */
+/* license as circulated by CEA, CNRS and INRIA at the following URL        */
+/* "http://www.cecill.info".                                                */
+/*                                                                          */
+/* As a counterpart to the access to the source code and  rights to copy,   */
+/* modify and redistribute granted by the license, users are provided only  */
+/* with a limited warranty  and the software's author,  the holder of the   */
+/* economic rights,  and the successive licensors  have only  limited       */
+/* liability.                                                               */
+/*                                                                          */
+/* In this respect, the user's attention is drawn to the risks associated   */
+/* with loading,  using,  modifying and/or developing or reproducing the    */
+/* software by the user in light of its specific status of free software,   */
+/* that may mean  that it is complicated to manipulate,  and  that  also    */
+/* therefore means  that it is reserved for developers  and  experienced    */
+/* professionals having in-depth computer knowledge. Users are therefore    */
+/* encouraged to load and test the software's suitability as regards their  */
+/* requirements in conditions enabling the security of their systems and/or */ 
+/* data to be ensured and,  more generally, to use and operate it in the    */
+/* same conditions as regards security.                                     */
+/*                                                                          */
+/* The fact that you are presently reading this means that you have had     */
+/* knowledge of the CeCILL-B license and that you accept its terms.         */
+/****************************************************************************/
+#ifndef SipTorturePort_h
+#define SipTorturePort_h
+
+#include <t3devlib/t3devlib.h>
+
+	
+class SipTorturePort : public t3devlib::Port
+{
+public:
+	SipTorturePort (t3devlib::PortId& id);
+	~SipTorturePort();
+		
+protected:
+	bool Map (const t3devlib::PortId& port_id);
+	bool Unmap (const t3devlib::PortId& port_id);
+	bool Send (const t3devlib::ComponentId& from, const t3devlib::Bitstring& msg);
+		
+};
+
+
+#endif
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/SipTorture_TestCases.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/SipTorture_TestCases.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/SipTorture_TestCases.ttcn	(revision 22)
@@ -0,0 +1,1211 @@
+// urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "2234923"}}
+// urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "2234923"}}
+
+module SipTorture_TestCases
+{
+	import from LibSip_SIPTypesAndValues all;
+	import from TestSystem all;
+	
+	type component SipSimuEx extends SipSimu
+	{
+		timer tc_defaultTimeout := 3.0;
+	}
+	
+	testcase TC_BADASPEC_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(OPTIONS_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_BADBRANCH_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(OPTIONS_Request: {requestLine := {method := OPTIONS_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := {fieldName := ACCEPT_E, acceptArgs := {{mediaRange := "application/sdp", acceptParam := omit}}}, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "badbranch.sadonfo23i420jv0as0derf3j3n"}, callInfo := omit, contact := omit, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 8, method := "OPTIONS"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "example.org", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "33242"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 3}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "192.0.2.1", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bK"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(OPTIONS_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_BADDATE_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:{requestLine := {method := INVITE_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "baddate.239423mnsadf3j23lj42--sedfnm234"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "host5.example.net", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 150}, contentType := {fieldName := CONTENT_TYPE_E, mediaType := "application/sdp"}, cSeq := {fieldName := CSEQ_E, seqNumber := 1392934, method := "INVITE"}, date := {fieldName := DATE_E, sipDate := "Fri, 01 Jan 2010 16:00:00 EST"}, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "2234923"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 70}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "host.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := ?, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_BADDN_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(OPTIONS_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_BADINV01_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_BADVERS_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(OPTIONS_Request:{requestLine := {method := OPTIONS_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "t.watson", password := omit}, hostPort := {host := "example.org", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/7.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "badvers.31417@c.example.com"}, callInfo := omit, contact := omit, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 1, method := "OPTIONS"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {nameAddr := {displayName := "A. Bell", addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "a.g.bell", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}}, fromParams := {{id := "tag", paramValue := "qweoiqpe"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 70}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {nameAddr := {displayName := "T. Watson", addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "t.watson", password := omit}, hostPort := {host := "example.org", portField := omit}, urlParameters := omit, headers := omit}}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "7.0", transport := "UDP"}, sentBy := {host := "c.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(OPTIONS_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_BCAST_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(Response: {statusLine := {sipVersion := "SIP/2.0", statusCode := 200, reasonPhrase := "OK"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "bcast.0384840201234ksdfak3j2erwedfsASdf"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "host28.example.com", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 154}, contentType := {fieldName := CONTENT_TYPE_E, mediaType := "application/sdp"}, cSeq := {fieldName := CSEQ_E, seqNumber := 35, method := "INVITE"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "11141343"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := omit, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.edu", portField := omit}, urlParameters := omit, headers := omit}}, toParams := {{id := "tag", paramValue := "2229"}}}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "192.0.2.198", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bK1324923"}}}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "255.255.255.255", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bK1saber23"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := ?, payload := ?})			
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(Response:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_BEXT01_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(OPTIONS_Request:{requestLine := {method := OPTIONS_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "bext01.0ha0isndaksdj"}, callInfo := omit, contact := omit, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 8, method := "OPTIONS"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "242etr"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 6}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := {fieldName := PROXY_REQUIRE_E, optionsTags := {"noProxiesSupportThis", "norDoAnyProxiesSupportThis"}}, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := {fieldName := REQUIRE_E, optionsTags := {"nothingSupportsThis", "nothingSupportsThisEither"}}, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "j_user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TLS"}, sentBy := {host := "fold-and-staple.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(OPTIONS_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_BIGCODE_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(Response:{statusLine := {sipVersion := "SIP/2.0", statusCode := 4294967301, reasonPhrase := "better not break the receiver"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "bigcode.asdof3uj203asdnf3429uasdhfas3ehjasdfas9i"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "host105.example.com", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 353494, method := "INVITE"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}}, fromParams := {{id := "tag", paramValue := "39ansfi3"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := omit, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.edu", portField := omit}, urlParameters := omit, headers := omit}}}, toParams := {{id := "tag", paramValue := "902jndnke3"}}}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "192.0.2.105", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bK2398ndaoe"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(Response:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_CLERR_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_CPARAM01_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(REGISTER_Request:{requestLine := {method := REGISTER_E, requestUri := {scheme := "sip", userInfo := omit, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "cparam01.70710@saturn.example.com"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "+19725552222", password := omit}, hostPort := {host := "gw1.example.net", portField := omit}, urlParameters := omit, headers := omit}}, contactParams := {{id := "unknownparam", paramValue := omit}}}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 2, method := "REGISTER"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "watson", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "DkfVgjkrtMwaerKKpe"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 70}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "watson", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "saturn.example.com", portField := 5060}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(REGISTER_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_CPARAM02_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(REGISTER_Request:{requestLine := {method := REGISTER_E, requestUri := {scheme := "sip", userInfo := omit, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "cparam02.70710@saturn.example.com"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "+19725552222", password := omit}, hostPort := {host := "gw1.example.net", portField := omit}, urlParameters := {{id := "unknownparam", paramValue := omit}}, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 3, method := "REGISTER"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "watson", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "838293"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 70}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "watson", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "saturn.example.com", portField := 5060}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(REGISTER_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_DBLREQ() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(REGISTER_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_ESC01_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:{requestLine := {method := INVITE_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "sips:user@example.com", password := omit}, hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "esc01.239409asdfakjkn23onasd0-3234"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "host5.example.net", portField := omit}, urlParameters := {{id := "lr", paramValue := omit}, {id := "name", paramValue := "value%41"}}, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 150}, contentType := {fieldName := CONTENT_TYPE_E, mediaType := "application/sdp"}, cSeq := {fieldName := CSEQ_E, seqNumber := 234234, method := "INVITE"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "I have spaces", password := omit}, hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}}}, fromParams := {{id := "tag", paramValue := "938"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 87}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "host5.example.net", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := ?, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_ESC02_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(REGISTER_Request:{requestLine := {method := UNKNOWN_METHOD_E, requestUri := {scheme := "sip", userInfo := omit, hostPort := {host := "registrar.example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "esc02.asdfnqwo34rq23i34jrjasdcnl23nrlknsdf"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "alias1", password := omit}, hostPort := {host := "host1.example.com", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}, {addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "alias3", password := omit}, hostPort := {host := "host3.example.com", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 29344, method := "RE%47IST%45R"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {nameAddr := {displayName := "%Z%45", addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "resource", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}}, fromParams := {{id := "tag", paramValue := "f232jadfj23"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 70}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {nameAddr := {displayName := "%Z%45", addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "resource", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "host.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bK209%fzsnel234"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := {{headerName := "C%6Fntact", headerValue := "<sip:alias2@host2.example.com>"}}}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(REGISTER_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_ESCNULL_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(REGISTER_Request:{requestLine := {method := REGISTER_E, requestUri := {scheme := "sip", userInfo := omit, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "escnull.39203ndfvkjdasfkq3w4otrq0adsfdfnavd"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "%00", password := omit}, hostPort := {host := "host5.example.com", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}, {addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "%00%00", password := omit}, hostPort := {host := "host5.example.com", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 14398234, method := "REGISTER"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "null-%00-null", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "839923423"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 70}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "null-%00-null", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "host5.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(REGISTER_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	// NOTE: TC_ESCRURI_V is defined as a negative test
+	// because "This INVITE is malformed, as the SIP Request-URI
+	//          contains escaped headers."
+	//
+	// However we could not find this restriction if RFC3261.
+	// RFC3261 states:
+	//     The Request-URI MUST NOT contain unescaped spaces or control
+	//     characters and MUST NOT be enclosed in "<>".
+
+	testcase TC_ESCRURI_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:{requestLine := {method := INVITE_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := {{id := "Route", paramValue := "<sip:example.com>"}}}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "escruri.23940-asdfhj-aje3br-234q098w-fawerh2q-h4n5"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "host39923.example.net", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 150}, contentType := {fieldName := CONTENT_TYPE_E, mediaType := "application/sdp"}, cSeq := {fieldName := CSEQ_E, seqNumber := 149209342, method := "INVITE"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "341518"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 7}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "host-of-the-hour.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := ?, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_INSUF_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_INTMETH() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_INV2543_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_INVUT_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:{requestLine := {method := INVITE_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "invut.0ha0isndaksdjadsfij34n23d"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "host5.example.net", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 40}, contentType := {fieldName := CONTENT_TYPE_E, mediaType := "application/unknownformat"}, cSeq := {fieldName := CSEQ_E, seqNumber := 235448, method := "INVITE"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "8392034"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 70}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "j.user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "somehost.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := ?, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_LONGREQ_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:{requestLine := {method := INVITE_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "longreq.onereallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongcallid"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "amazinglylongcallernameamazinglylongcallernameamazinglylongcallernameamazinglylongcallernameamazinglylongcallername", password := omit}, hostPort := {host := "host5.example.net", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 150}, contentType := {fieldName := CONTENT_TYPE_E, mediaType := "application/sdp"}, cSeq := {fieldName := CSEQ_E, seqNumber := 3882340, method := "INVITE"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "amazinglylongcallernameamazinglylongcallernameamazinglylongcallernameamazinglylongcallernameamazinglylongcallername", password := omit}, hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "12982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982424"}, {id := "unknownheaderparamnamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamename", paramValue := "unknowheaderparamvaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevalue"}, {id := "unknownValuelessparamnameparamnameparamnameparamnameparamnameparamnameparamnameparamnameparamnameparamname", paramValue := omit}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 70}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {nameAddr := {displayName := "I have a user name of extremeextremeextremeextremeextremeextremeextremeextremeextremeextreme proportion", addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := 6000}, urlParameters := {{id := "unknownparam1", paramValue := "verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglongvalue"}, {id := "longparamnamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamename", paramValue := "shortvalue"}, {id := "verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglongParameterNameWithNoValue", paramValue := omit}}, headers := omit}}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip33.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip32.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip31.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip30.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip29.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip28.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip27.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip26.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip25.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip24.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip23.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip22.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip21.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip20.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip19.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip18.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip17.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip16.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip15.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip14.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip13.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip12.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip11.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip10.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip9.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip8.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip7.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip6.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip5.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip4.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip3.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip2.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "sip1.example.com", portField := omit}, viaParams := omit}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "host.example.com", portField := omit}, viaParams := {{id := "received", paramValue := "192.0.2.5"}, {id := "branch", paramValue := "verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglongbranchvalue"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := {{headerName := "Unknown-LongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLong-Name", headerValue := "unknown-longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong-value; unknown-longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong-parameter-name = unknown-longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong-parameter-value"}}}, messageBody := ?, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_LTGTRURI_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_LWSDISP_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{			[]sipPort.receive(OPTIONS_Request:{requestLine := {method := OPTIONS_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "lwsdisp.1234abcd@funky.example.com"}, callInfo := omit, contact := omit, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 60, method := "OPTIONS"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {nameAddr := {displayName := "caller", addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}}, fromParams := {{id := "tag", paramValue := "323"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 70}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "funky.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(OPTIONS_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_LWSRURI_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_LWSSTART_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:{requestLine := {method := INVITE_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "lwsstart.dfknq234oi243099adsdfnawe3@example.com"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "host1.example.net", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 150}, contentType := {fieldName := CONTENT_TYPE_E, mediaType := "application/sdp"}, cSeq := {fieldName := CSEQ_E, seqNumber := 1893884, method := "INVITE"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "8814"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 8}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "host1.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw3923"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := ?, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_MCL01_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(OPTIONS_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_MISMATCH01_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(OPTIONS_Request:{requestLine := {method := OPTIONS_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "mismatch01.dj0234sxdfl3"}, callInfo := omit, contact := omit, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 8, method := "INVITE"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "34525"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 6}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "j.user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "host.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(OPTIONS_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_MISMATCH02_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(Request:{requestLine := {method := UNKNOWN_METHOD_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "mismatch02.dj0234sxdfl3"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "host.example.net", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 138}, contentType := {fieldName := CONTENT_TYPE_E, mediaType := "application/sdp"}, cSeq := {fieldName := CSEQ_E, seqNumber := 8, method := "INVITE"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag",paramValue := "34525"}}}, historyInfo :=omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 6}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter:= omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit,toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "j.user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "host.example.net", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := ?, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_MPART01() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(MESSAGE_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_MULTI01_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_NCL_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_NOREASON_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(Response:{statusLine := {sipVersion := "SIP/2.0", statusCode := 100, reasonPhrase := ""}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "noreason.asndj203insdf99223ndf"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "host105.example.com", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 35, method := "INVITE"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}}, fromParams := {{id := "tag", paramValue := "39ansfi3"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := omit, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.edu", portField := omit}, urlParameters := omit, headers := omit}}}, toParams := {{id := "tag", paramValue := "902jndnke3"}}}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "192.0.2.105", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bK2398ndaoe"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(Response:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_NOVELSC_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(OPTIONS_Request:{requestLine := {method := OPTIONS_E, requestUri := {scheme := "soap.beep", userInfo := {userOrTelephoneSubscriber := "//192.0.2.103:3002", password := omit}, hostPort := omit, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit,authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "novelsc.asdfasser0q239nwsdfasdkl34"}, callInfo := omit, contact := omit, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType:= omit, cSeq := {fieldName := CSEQ_E, seqNumber := 3923423, method := "OPTIONS"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "384"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 3}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses:= omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField:= {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "host9.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw39234"}}}}},warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(OPTIONS_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_QUOTBAL_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_REGAUT01_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(REGISTER_Request:{requestLine := {method := REGISTER_E, requestUri := {scheme := "sip", userInfo := omit, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := {fieldName := AUTHORIZATION_E, body := {otherResponse := {authScheme := "NoOneKnowsThisScheme", authParams := {{id := "opaque-data", paramValue := "here"}}}}}, callId := {fieldName := CALL_ID_E, callid := "regaut01.0ha0isndaksdj"}, callInfo := omit, contact := omit, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 9338, method := "REGISTER"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "j.user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "87321hj23128"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 8}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "j.user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "192.0.2.253", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(REGISTER_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_REGBADCT_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(REGISTER_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_REGESCRT_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(REGISTER_Request:{requestLine := {method := REGISTER_E, requestUri := {scheme := "sip", userInfo := omit, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "regescrt.k345asrl3fdbv@192.0.2.1"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := {{id := "Route", paramValue := "<sip:sip.example.com>"}}}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 14398234, method := "REGISTER"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "8"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 70}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "host5.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(REGISTER_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_SCALAR02_V() runs on SipSimuEx
+	{
+		log ("This testcase may produce an error verdict if the CoDec or the TTCN-3 compiler do not support big integers (>64 bits), such a verdict can be safely ingored since this is a robustness test");
+	
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(REGISTER_Request:{requestLine := {method := REGISTER_E, requestUri := {scheme := "sip", userInfo:= omit, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "scalar02.23o0pd9vanlq3wnrlnewofjas9ui32"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber:= "user", password := omit}, hostPort := {host := "host129.example.com", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := {{id := "expires", paramValue := "280297596632815"}}}}}}, contentDisposition := omit,contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 36893488147419103232, method := "REGISTER"}, date := omit, errorInfo := omit, event := omit, expires := {fieldName := EXPIRES_E, deltaSec := "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, fromField := {fieldName := FROM_E, addressField := {nameAddr := {displayName := omit, addrSpec :={scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password :=omit}, hostPort := {host := "example.com", portField := omit}, urlParameters :=omit, headers := omit}}}, fromParams := {{id := "tag", paramValue := "239232jh3"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 300}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody :={{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "host129.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bK342sdfoi3"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(REGISTER_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				// It is acceptable to return a pass since it is not a strong requirement
+				// to handle big integers in the codec. The main requirement is that the 
+				// CoDec must not crash
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_SCALARLG_V() runs on SipSimuEx
+	{
+		log ("This testcase may produce an error verdict if the CoDec or the TTCN-3 compiler do not support big integers (>64 bits), such a verdict can be safely ingored since this is a robustness test");
+
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(Response:{statusLine := {sipVersion := "SIP/2.0", statusCode := 503, reasonPhrase := "Service Unavailable"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "scalarlg.noase0of0234hn2qofoaf0232aewf2394r"},callInfo := omit, contact := omit, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 9292394834772304023312,method := "OPTIONS"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "other", password := omit}, hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}}}, fromParams := {{id := "tag", paramValue := "2easdjfejw"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := omit, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService :=omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := {fieldName := RETRY_AFTER_E, deltaSec := "949302838503028349304023988", comment := omit, retryParams := omit}, route := omit, securityClient := omit,securityServer := omit, securityVerify := omit, server := omit, serviceRoute :=omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "host129.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKzzxdiwo34sw"}, {id := "received", paramValue := "192.0.2.129"}}}}}, warning := {fieldName := WARNING_E, warningValue := {{warnCode := 1812, warnAgent := {hostPort := {host := "overture", portField := omit}}, WarnText := "In Progress"}}}, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(Response:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				// It is acceptable to return a pass since it is not a strong requirement
+				// to handle big integers in the codec. The main requirement is that the 
+				// CoDec must not crash
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_SDP01_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:{requestLine := {method := INVITE_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := {fieldName := ACCEPT_E, acceptArgs := {{mediaRange := "text/nobodyKnowsThis", acceptParam := omit}}}, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "sdp01.ndaksdj9342dasdd"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "host15.example.net", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 150}, contentType := {fieldName := CONTENT_TYPE_E, mediaType := "application/sdp"}, cSeq := {fieldName := CSEQ_E, seqNumber := 8, method := "INVITE"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "234"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 5}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "j_user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "192.0.2.15", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := ?, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_SEMIURI_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(OPTIONS_Request:{requestLine := {method := OPTIONS_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user;par=u@example.net", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := {fieldName := ACCEPT_E, acceptArgs := {{mediaRange := "application/sdp", acceptParam := omit}, {mediaRange := "application/pkcs7-mime", acceptParam := omit}, {mediaRange := "multipart/mixed", acceptParam := omit}, {mediaRange := "multipart/signed", acceptParam := omit}, {mediaRange := "message/sip", acceptParam := omit}, {mediaRange := "message/sipfrag", acceptParam := omit}}}, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "semiuri.0ha0isndaksdj"}, callInfo := omit, contact := omit, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 8, method := "OPTIONS"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "example.org", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "33242"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 3}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "j_user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "192.0.2.1", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(OPTIONS_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_TEST_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_TRANSPORTS_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(OPTIONS_Request:{requestLine := {method := OPTIONS_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := {fieldName := ACCEPT_E, acceptArgs := {{mediaRange := "application/sdp", acceptParam := omit}}}, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "transports.kijh4akdnaqjkwendsasfdj"}, callInfo := omit, contact := omit, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 60, method := "OPTIONS"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}}, fromParams := {{id := "tag", paramValue := "323"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 70}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "t1.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "SCTP"}, sentBy := {host := "t2.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKklasjdhf"}}}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TLS"}, sentBy := {host := "t3.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bK2980unddj"}}}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UNKNOWN"}, sentBy := {host := "t4.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKasd0f3en"}}}, {sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "t5.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bK0a9idfnee"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(OPTIONS_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_TRWS_I() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(OPTIONS_Request:?)
+			{
+				setverdict(fail);
+			}
+			[]sipPort.receive
+			{
+				setverdict(pass);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_UNKSCM_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(OPTIONS_Request:{requestLine := {method := OPTIONS_E, requestUri := {scheme := "nobodyKnowsThisScheme", userInfo := {userOrTelephoneSubscriber := "totallyopaquecontent", password := omit}, hostPort := omit, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "unkscm.nasdfasser0q239nwsdfasdkl34"}, callInfo := omit, contact := omit, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 3923423, method := "OPTIONS"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit},hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "384"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 3}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp :=omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "TCP"}, sentBy := {host := "host9.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw39234"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List :=omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(OPTIONS_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_UNKSM2_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(REGISTER_Request:{requestLine := {method := REGISTER_E, requestUri := {scheme := "sip", userInfo:= omit, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "unksm2.daksdj@hyphenated-host.example.com"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "name", userInfo := {userOrTelephoneSubscriber := "John_Smith", password := omit}, hostPort := omit, urlParameters := omit,headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 234902, method := "REGISTER"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "http", userInfo := {userOrTelephoneSubscriber := "//www.example.com", password := omit}, hostPort := omit, urlParameters := omit, headers := omit}}}, fromParams := {{id := "tag", paramValue := "3234233"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 70}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit,pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient :=omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit,supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "isbn", userInfo := {userOrTelephoneSubscriber := "2983792873", password := omit}, hostPort := omit, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via:= {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "192.0.2.21", portField := 5060}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(REGISTER_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_UNREASON_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(Response:{statusLine := {sipVersion := "SIP/2.0", statusCode := 200, reasonPhrase := "= 2**3 * 5**2 %d0%bd%d0%be %d1%81%d1%82%d0%be %d0%b4%d0%b5%d0%b2%d1%8f%d0%bd%d0%be%d1%81%d1%82%d0%be %d0%b4%d0%b5%d0%b2%d1%8f%d1%82%d1%8c - %d0%bf%d1%80%d0%be%d1%81%d1%82%d0%be%d0%b5"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "unreason.1234ksdfak3j2erwedfsASdf"}, callInfo := omit, contact := {fieldName := CONTACT_E, contactBody := {contactAddresses := {{addressField := {nameAddr := {displayName := omit, addrSpec := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "host198.example.com", portField := omit}, urlParameters := omit, headers := omit}}}, contactParams := omit}}}}, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len := 154}, contentType := {fieldName := CONTENT_TYPE_E, mediaType := "application/sdp"}, cSeq := {fieldName := CSEQ_E, seqNumber := 35, method := "INVITE"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "11141343"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := omit, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.edu", portField := omit}, urlParameters := omit, headers := omit}}, toParams := {{id := "tag", paramValue := "2229"}}}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "192.0.2.198", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bK1324923"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := ?, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(Response:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_WSINV() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(INVITE_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	testcase TC_ZEROMF_V() runs on SipSimuEx
+	{
+		tc_defaultTimeout.start;
+		alt
+		{
+			[]sipPort.receive(OPTIONS_Request:{requestLine := {method := OPTIONS_E, requestUri := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host :="example.com", portField := omit}, urlParameters := omit, headers := omit}, sipVersion := "SIP/2.0"}, msgHeader := {accept := omit, acceptContact := omit, acceptEncoding := omit, acceptLanguage := omit, alertInfo := omit, allow := omit, allowEvents := omit, authenticationInfo := omit, authorization := omit, callId := {fieldName := CALL_ID_E, callid := "zeromf.jfasdlfnm2o2l43r5u0asdfas"}, callInfo:= omit, contact := omit, contentDisposition := omit, contentEncoding := omit, contentLanguage := omit, contentLength := {fieldName := CONTENT_LENGTH_E, len :=0}, contentType := omit, cSeq := {fieldName := CSEQ_E, seqNumber := 39234321, method := "OPTIONS"}, date := omit, errorInfo := omit, event := omit, expires := omit, fromField := {fieldName := FROM_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "caller", password := omit}, hostPort := {host := "example.net", portField := omit}, urlParameters := omit, headers := omit}}, fromParams := {{id := "tag", paramValue := "3ghsd41"}}}, historyInfo := omit, inReplyTo := omit, maxForwards := {fieldName := MAX_FORWARDS_E, forwards := 0}, mimeVersion := omit, minExpires := omit, minSE := omit, organization := omit, pAccessNetworkInfo := omit, pAssertedID := omit, pAssertedService := omit, pAssociatedURI := omit, path := omit, pCalledPartyID := omit, pChargingFunctionAddresses := omit, pChargingVector := omit, pEarlyMedia := omit, pMediaAuthorization := omit, pPreferredID := omit, priority := omit, privacy := omit, proxyAuthenticate := omit, proxyAuthorization := omit, proxyRequire := omit, pVisitedNetworkID := omit, rAck := omit, rSeq := omit, reason := omit, recordRoute := omit, referredBy := omit, referTo := omit, replyTo := omit, require := omit, retryAfter := omit, route := omit, securityClient := omit, securityServer := omit, securityVerify := omit, server := omit, serviceRoute := omit, sessionExpires := omit, subject := omit, subscriptionState := omit, supported := omit, timestamp := omit, toField := {fieldName := TO_E, addressField := {addrSpecUnion := {scheme := "sip", userInfo := {userOrTelephoneSubscriber := "user", password := omit}, hostPort := {host := "example.com", portField := omit}, urlParameters := omit, headers := omit}}, toParams := omit}, unsupported := omit, userAgent := omit, via := {fieldName := VIA_E, viaBody := {{sentProtocol := {protocolName := "SIP", protocolVersion := "2.0", transport := "UDP"}, sentBy := {host := "host1.example.com", portField := omit}, viaParams := {{id := "branch", paramValue := "z9hG4bKkdjuw2349i"}}}}}, warning := omit, wwwAuthenticate := omit, undefinedHeader_List := omit}, messageBody := omit, payload := ?})
+			{
+				setverdict(pass);
+			}
+			[]sipPort.receive(OPTIONS_Request:?)
+			{
+				setverdict(inconc);
+			}
+			[]sipPort.receive
+			{
+				setverdict(fail);
+			}
+			[]tc_defaultTimeout.timeout
+			{
+				setverdict(fail);
+			}
+		}
+	}
+
+	control {
+		execute (TC_BADASPEC_I());
+		execute (TC_BADBRANCH_V());
+		execute (TC_BADDATE_V());
+		execute (TC_BADDN_I());
+		execute (TC_BADINV01_I());
+		execute (TC_BADVERS_V());
+		execute (TC_BCAST_V());
+		execute (TC_BEXT01_V());
+		execute (TC_BIGCODE_V());
+		execute (TC_CLERR_I());
+		execute (TC_CPARAM01_V());
+		execute (TC_CPARAM02_V());
+
+		// TC_DBLREQ is disabled because splitting a message into multiple requests is not 
+		// a codec issue but a system adapter issue
+		// execute (TC_DBLREQ());
+		execute (TC_ESC01_V());
+		execute (TC_ESC02_V());
+		execute (TC_ESCNULL_V());
+		execute (TC_ESCRURI_V());
+		execute (TC_INSUF_I());
+		execute (TC_INTMETH());
+		execute (TC_INV2543_I());
+		execute (TC_INVUT_V());
+		execute (TC_LONGREQ_V());
+		execute (TC_LTGTRURI_I());
+		execute (TC_LWSDISP_V());
+		execute (TC_LWSRURI_I());
+		execute (TC_LWSSTART_V());
+		execute (TC_MCL01_I());
+		execute (TC_MISMATCH01_V());
+		execute (TC_MISMATCH02_V());
+		execute (TC_MPART01());
+		execute (TC_MULTI01_I());
+		execute (TC_NCL_I());
+		execute (TC_NOREASON_V());
+		execute (TC_NOVELSC_V());
+		execute (TC_QUOTBAL_I());
+		execute (TC_REGAUT01_V());
+		execute (TC_REGBADCT_I());
+		execute (TC_REGESCRT_V());
+		execute (TC_SCALAR02_V());
+		execute (TC_SCALARLG_V());
+		execute (TC_SDP01_V());
+		execute (TC_SEMIURI_V());
+		execute (TC_TEST_I());
+		execute (TC_TRANSPORTS_V());
+		execute (TC_TRWS_I());
+		execute (TC_UNKSCM_V());
+		execute (TC_UNKSM2_V());
+		execute (TC_UNREASON_V());
+		execute (TC_WSINV());
+		execute (TC_ZEROMF_V());
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADASPEC_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADASPEC_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADASPEC_I.dat	(revision 22)
@@ -0,0 +1,10 @@
+OPTIONS sip:user@example.org SIP/2.0
+Via: SIP/2.0/UDP host4.example.com:5060;branch=z9hG4bKkdju43234
+Max-Forwards: 70
+From: "Bell, Alexander" <sip:a.g.bell@example.com>;tag=433423
+To: "Watson, Thomas" < sip:t.watson@example.org >
+Call-ID: badaspec.sdf0234n2nds0a099u23h3hnnw009cdkne3
+Accept: application/sdp
+CSeq: 3923239 OPTIONS
+l: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADBRANCH_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADBRANCH_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADBRANCH_V.dat	(revision 22)
@@ -0,0 +1,10 @@
+OPTIONS sip:user@example.com SIP/2.0
+To: sip:user@example.com
+From: sip:caller@example.org;tag=33242
+Max-Forwards: 3
+Via: SIP/2.0/UDP 192.0.2.1;branch=z9hG4bK
+Accept: application/sdp
+Call-ID: badbranch.sadonfo23i420jv0as0derf3j3n
+CSeq: 8 OPTIONS
+l: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADDATE_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADDATE_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADDATE_V.dat	(revision 22)
@@ -0,0 +1,20 @@
+INVITE sip:user@example.com SIP/2.0
+To: sip:user@example.com
+From: sip:caller@example.net;tag=2234923
+Max-Forwards: 70
+Call-ID: baddate.239423mnsadf3j23lj42--sedfnm234
+CSeq: 1392934 INVITE
+Via: SIP/2.0/UDP host.example.com;branch=z9hG4bKkdjuw
+Date: Fri, 01 Jan 2010 16:00:00 EST
+Contact: <sip:caller@host5.example.net>
+Content-Type: application/sdp
+Content-Length: 150
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.5
+s=-
+c=IN IP4 192.0.2.5
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADDN_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADDN_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADDN_I.dat	(revision 22)
@@ -0,0 +1,9 @@
+OPTIONS sip:t.watson@example.org SIP/2.0
+Via:     SIP/2.0/UDP c.example.com:5060;branch=z9hG4bKkdjuw
+Max-Forwards:      70
+From:    Bell, Alexander <sip:a.g.bell@example.com>;tag=43
+To:      Watson, Thomas <sip:t.watson@example.org>
+Call-ID: baddn.31415@c.example.com
+Accept: application/sdp
+CSeq:    3923239 OPTIONS
+l: 0
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADINV01_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADINV01_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADINV01_I.dat	(revision 22)
@@ -0,0 +1,19 @@
+INVITE sip:user@example.com SIP/2.0
+To: sip:j.user@example.com
+From: sip:caller@example.net;tag=134161461246
+Max-Forwards: 7
+Call-ID: badinv01.0ha0isndaksdjasdf3234nas
+CSeq: 8 INVITE
+Via: SIP/2.0/UDP 192.0.2.15;;,;,,
+Contact: "Joe" <sip:joe@example.org>;;;;
+Content-Length: 152
+Content-Type: application/sdp
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.15
+s=-
+c=IN IP4 192.0.2.15
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADVERS_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADVERS_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BADVERS_V.dat	(revision 22)
@@ -0,0 +1,9 @@
+OPTIONS sip:t.watson@example.org SIP/7.0
+Via:     SIP/7.0/UDP c.example.com;branch=z9hG4bKkdjuw
+Max-Forwards:     70
+From:    A. Bell <sip:a.g.bell@example.com>;tag=qweoiqpe
+To:      T. Watson <sip:t.watson@example.org>
+Call-ID: badvers.31417@c.example.com
+CSeq:    1 OPTIONS
+l: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BCAST_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BCAST_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BCAST_V.dat	(revision 22)
@@ -0,0 +1,19 @@
+SIP/2.0 200 OK
+Via: SIP/2.0/UDP 192.0.2.198;branch=z9hG4bK1324923
+Via: SIP/2.0/UDP 255.255.255.255;branch=z9hG4bK1saber23
+Call-ID: bcast.0384840201234ksdfak3j2erwedfsASdf
+CSeq: 35 INVITE
+From: sip:user@example.com;tag=11141343
+To: sip:user@example.edu;tag=2229
+Content-Length: 154
+Content-Type: application/sdp
+Contact: <sip:user@host28.example.com>
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.198
+s=-
+c=IN IP4 192.0.2.198
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BEXT01_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BEXT01_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BEXT01_V.dat	(revision 22)
@@ -0,0 +1,11 @@
+OPTIONS sip:user@example.com SIP/2.0
+To: sip:j_user@example.com
+From: sip:caller@example.net;tag=242etr
+Max-Forwards: 6
+Call-ID: bext01.0ha0isndaksdj
+Require: nothingSupportsThis, nothingSupportsThisEither
+Proxy-Require: noProxiesSupportThis, norDoAnyProxiesSupportThis
+CSeq: 8 OPTIONS
+Via: SIP/2.0/TLS fold-and-staple.example.com;branch=z9hG4bKkdjuw
+Content-Length: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BIGCODE_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BIGCODE_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_BIGCODE_V.dat	(revision 22)
@@ -0,0 +1,9 @@
+SIP/2.0 4294967301 better not break the receiver
+Via: SIP/2.0/UDP 192.0.2.105;branch=z9hG4bK2398ndaoe
+Call-ID: bigcode.asdof3uj203asdnf3429uasdhfas3ehjasdfas9i
+CSeq: 353494 INVITE
+From: <sip:user@example.com>;tag=39ansfi3
+To: <sip:user@example.edu>;tag=902jndnke3
+Content-Length: 0
+Contact: <sip:user@host105.example.com>
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_CLERR_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_CLERR_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_CLERR_I.dat	(revision 22)
@@ -0,0 +1,19 @@
+INVITE sip:user@example.com SIP/2.0
+Max-Forwards: 80
+To: sip:j.user@example.com
+From: sip:caller@example.net;tag=93942939o2
+Contact: <sip:caller@hungry.example.net>
+Call-ID: clerr.0ha0isndaksdjweiafasdk3
+CSeq: 8 INVITE
+Via: SIP/2.0/UDP host5.example.com;branch=z9hG4bK-39234-23523
+Content-Type: application/sdp
+Content-Length: 9999
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.155
+s=-
+c=IN IP4 192.0.2.155
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_CPARAM01_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_CPARAM01_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_CPARAM01_V.dat	(revision 22)
@@ -0,0 +1,10 @@
+REGISTER sip:example.com SIP/2.0
+Via: SIP/2.0/UDP saturn.example.com:5060;branch=z9hG4bKkdjuw
+Max-Forwards: 70
+From: sip:watson@example.com;tag=DkfVgjkrtMwaerKKpe
+To: sip:watson@example.com
+Call-ID: cparam01.70710@saturn.example.com
+CSeq: 2 REGISTER
+Contact: sip:+19725552222@gw1.example.net;unknownparam
+l: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_CPARAM02_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_CPARAM02_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_CPARAM02_V.dat	(revision 22)
@@ -0,0 +1,10 @@
+REGISTER sip:example.com SIP/2.0
+Via: SIP/2.0/UDP saturn.example.com:5060;branch=z9hG4bKkdjuw
+Max-Forwards: 70
+From: sip:watson@example.com;tag=838293
+To: sip:watson@example.com
+Call-ID: cparam02.70710@saturn.example.com
+CSeq: 3 REGISTER
+Contact: <sip:+19725552222@gw1.example.net;unknownparam>
+l: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_DBLREQ.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_DBLREQ.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_DBLREQ.dat	(revision 22)
@@ -0,0 +1,30 @@
+REGISTER sip:example.com SIP/2.0
+To: sip:j.user@example.com
+From: sip:j.user@example.com;tag=43251j3j324
+Max-Forwards: 8
+I: dblreq.0ha0isndaksdj99sdfafnl3lk233412
+Contact: sip:j.user@host.example.com
+CSeq: 8 REGISTER
+Via: SIP/2.0/UDP 192.0.2.125;branch=z9hG4bKkdjuw23492
+Content-Length: 0
+
+
+INVITE sip:joe@example.com SIP/2.0
+t: sip:joe@example.com
+From: sip:caller@example.net;tag=141334
+Max-Forwards: 8
+Call-ID: dblreq.0ha0isnda977644900765@192.0.2.15
+CSeq: 8 INVITE
+Via: SIP/2.0/UDP 192.0.2.15;branch=z9hG4bKkdjuw380234
+Content-Type: application/sdp
+Content-Length: 150
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.15
+s=-
+c=IN IP4 192.0.2.15
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m =video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ESC01_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ESC01_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ESC01_V.dat	(revision 22)
@@ -0,0 +1,20 @@
+INVITE sip:sips%3Auser%40example.com@example.net SIP/2.0
+To: sip:%75se%72@example.com
+From: <sip:I%20have%20spaces@example.net>;tag=938
+Max-Forwards: 87
+i: esc01.239409asdfakjkn23onasd0-3234
+CSeq: 234234 INVITE
+Via: SIP/2.0/UDP host5.example.net;branch=z9hG4bKkdjuw
+C: application/sdp
+Contact:
+  <sip:cal%6Cer@host5.example.net;%6C%72;n%61me=v%61lue%25%34%31>
+Content-Length: 150
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.1
+s=-
+c=IN IP4 192.0.2.1
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ESC02_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ESC02_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ESC02_V.dat	(revision 22)
@@ -0,0 +1,12 @@
+RE%47IST%45R sip:registrar.example.com SIP/2.0
+To: "%Z%45" <sip:resource@example.com>
+From: "%Z%45" <sip:resource@example.com>;tag=f232jadfj23
+Call-ID: esc02.asdfnqwo34rq23i34jrjasdcnl23nrlknsdf
+Via: SIP/2.0/TCP host.example.com;branch=z9hG4bK209%fzsnel234
+CSeq: 29344 RE%47IST%45R
+Max-Forwards: 70
+Contact: <sip:alias1@host1.example.com>
+C%6Fntact: <sip:alias2@host2.example.com>
+Contact: <sip:alias3@host3.example.com>
+l: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ESCNULL_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ESCNULL_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ESCNULL_V.dat	(revision 22)
@@ -0,0 +1,11 @@
+REGISTER sip:example.com SIP/2.0
+To: sip:null-%00-null@example.com
+From: sip:null-%00-null@example.com;tag=839923423
+Max-Forwards: 70
+Call-ID: escnull.39203ndfvkjdasfkq3w4otrq0adsfdfnavd
+CSeq: 14398234 REGISTER
+Via: SIP/2.0/UDP host5.example.com;branch=z9hG4bKkdjuw
+Contact: <sip:%00@host5.example.com>
+Contact: <sip:%00%00@host5.example.com>
+L:0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ESCRURI_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ESCRURI_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ESCRURI_V.dat	(revision 22)
@@ -0,0 +1,19 @@
+INVITE sip:user@example.com?Route=%3Csip:example.com%3E SIP/2.0
+To: sip:user@example.com
+From: sip:caller@example.net;tag=341518
+Max-Forwards: 7
+Contact: <sip:caller@host39923.example.net>
+Call-ID: escruri.23940-asdfhj-aje3br-234q098w-fawerh2q-h4n5
+CSeq: 149209342 INVITE
+Via: SIP/2.0/UDP host-of-the-hour.example.com;branch=z9hG4bKkdjuw
+Content-Type: application/sdp
+Content-Length: 150
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.1
+s=-
+c=IN IP4 192.0.2.1
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_INSUF_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_INSUF_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_INSUF_I.dat	(revision 22)
@@ -0,0 +1,14 @@
+INVITE sip:user@example.com SIP/2.0
+CSeq: 193942 INVITE
+Via: SIP/2.0/UDP 192.0.2.95;branch=z9hG4bKkdj.insuf
+Content-Type: application/sdp
+l: 152
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.95
+s=-
+c=IN IP4 192.0.2.95
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_INV2543_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_INV2543_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_INV2543_I.dat	(revision 22)
@@ -0,0 +1,15 @@
+INVITE sip:UserB@example.com SIP/2.0
+Via: SIP/2.0/UDP iftgw.example.com
+From: <sip:+13035551111@ift.client.example.net;user=phone>
+Record-Route: <sip:UserB@example.com;maddr=ss1.example.com>
+To: sip:+16505552222@ss1.example.net;user=phone
+Call-ID: inv2543.1717@ift.client.example.com
+CSeq: 56 INVITE
+Content-Type: application/sdp
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.5
+s=-
+c=IN IP4 192.0.2.5
+t=0 0
+m=audio 49217 RTP/AVP 0
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_INVUT_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_INVUT_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_INVUT_V.dat	(revision 22)
@@ -0,0 +1,14 @@
+INVITE sip:user@example.com SIP/2.0
+Contact: <sip:caller@host5.example.net>
+To: sip:j.user@example.com
+From: sip:caller@example.net;tag=8392034
+Max-Forwards: 70
+Call-ID: invut.0ha0isndaksdjadsfij34n23d
+CSeq: 235448 INVITE
+Via: SIP/2.0/UDP somehost.example.com;branch=z9hG4bKkdjuw
+Content-Type: application/unknownformat
+Content-Length: 40
+
+<audio>
+ <pcmu port="443"/>
+</audio>
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LONGREQ_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LONGREQ_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LONGREQ_V.dat	(revision 22)
@@ -0,0 +1,53 @@
+INVITE sip:user@example.com SIP/2.0
+To: "I have a user name of extremeextremeextremeextremeextremeextremeextremeextremeextremeextreme proportion"<sip:user@example.com:6000;unknownparam1=verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglongvalue;longparamnamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamename=shortvalue;verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglongParameterNameWithNoValue>
+F: sip:amazinglylongcallernameamazinglylongcallernameamazinglylongcallernameamazinglylongcallernameamazinglylongcallername@example.net;tag=12982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982982424;unknownheaderparamnamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamename=unknowheaderparamvaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevaluevalue;unknownValuelessparamnameparamnameparamnameparamnameparamnameparamnameparamnameparamnameparamnameparamname
+Call-ID: longreq.onereallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongcallid
+CSeq: 3882340 INVITE
+Unknown-LongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLong-Name: unknown-longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong-value; unknown-longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong-parameter-name = unknown-longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong-parameter-value
+Via: SIP/2.0/TCP sip33.example.com
+v: SIP/2.0/TCP sip32.example.com
+V: SIP/2.0/TCP sip31.example.com
+Via: SIP/2.0/TCP sip30.example.com
+ViA: SIP/2.0/TCP sip29.example.com
+VIa: SIP/2.0/TCP sip28.example.com
+VIA: SIP/2.0/TCP sip27.example.com
+via: SIP/2.0/TCP sip26.example.com
+viA: SIP/2.0/TCP sip25.example.com
+vIa: SIP/2.0/TCP sip24.example.com
+vIA: SIP/2.0/TCP sip23.example.com
+V :  SIP/2.0/TCP sip22.example.com
+v :  SIP/2.0/TCP sip21.example.com
+V  : SIP/2.0/TCP sip20.example.com
+v  : SIP/2.0/TCP sip19.example.com
+Via : SIP/2.0/TCP sip18.example.com
+Via  : SIP/2.0/TCP sip17.example.com
+Via: SIP/2.0/TCP sip16.example.com
+Via: SIP/2.0/TCP sip15.example.com
+Via: SIP/2.0/TCP sip14.example.com
+Via: SIP/2.0/TCP sip13.example.com
+Via: SIP/2.0/TCP sip12.example.com
+Via: SIP/2.0/TCP sip11.example.com
+Via: SIP/2.0/TCP sip10.example.com
+Via: SIP/2.0/TCP sip9.example.com
+Via: SIP/2.0/TCP sip8.example.com
+Via: SIP/2.0/TCP sip7.example.com
+Via: SIP/2.0/TCP sip6.example.com
+Via: SIP/2.0/TCP sip5.example.com
+Via: SIP/2.0/TCP sip4.example.com
+Via: SIP/2.0/TCP sip3.example.com
+Via: SIP/2.0/TCP sip2.example.com
+Via: SIP/2.0/TCP sip1.example.com
+Via: SIP/2.0/TCP host.example.com;received=192.0.2.5;branch=verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglongbranchvalue
+Max-Forwards: 70
+Contact: <sip:amazinglylongcallernameamazinglylongcallernameamazinglylongcallernameamazinglylongcallernameamazinglylongcallername@host5.example.net>
+Content-Type: application/sdp
+l: 150
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.1
+s=-
+c=IN IP4 192.0.2.1
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LTGTRURI_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LTGTRURI_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LTGTRURI_I.dat	(revision 22)
@@ -0,0 +1,19 @@
+INVITE <sip:user@example.com> SIP/2.0
+To: sip:user@example.com
+From: sip:caller@example.net;tag=39291
+Max-Forwards: 23
+Call-ID: ltgtruri.1@192.0.2.5
+CSeq: 1 INVITE
+Via: SIP/2.0/UDP 192.0.2.5
+Contact: <sip:caller@host5.example.net>
+Content-Type: application/sdp
+Content-Length: 159
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.5
+s=-
+c=IN IP4 192.0.2.5
+t=3149328700 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LWSDISP_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LWSDISP_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LWSDISP_V.dat	(revision 22)
@@ -0,0 +1,9 @@
+OPTIONS sip:user@example.com SIP/2.0
+To: sip:user@example.com
+From: caller<sip:caller@example.com>;tag=323
+Max-Forwards: 70
+Call-ID: lwsdisp.1234abcd@funky.example.com
+CSeq: 60 OPTIONS
+Via: SIP/2.0/UDP funky.example.com;branch=z9hG4bKkdjuw
+l: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LWSRURI_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LWSRURI_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LWSRURI_I.dat	(revision 22)
@@ -0,0 +1,19 @@
+INVITE sip:user@example.com; lr SIP/2.0
+To: sip:user@example.com;tag=3xfe-9921883-z9f
+From: sip:caller@example.net;tag=231413434
+Max-Forwards: 5
+Call-ID: lwsruri.asdfasdoeoi2323-asdfwrn23-asd834rk423
+CSeq: 2130706432 INVITE
+Via: SIP/2.0/UDP 192.0.2.1:5060;branch=z9hG4bKkdjuw2395
+Contact: <sip:caller@host1.example.net>
+Content-Type: application/sdp
+Content-Length: 159
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.1
+s=-
+c=IN IP4 192.0.2.1
+t=3149328700 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LWSSTART_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LWSSTART_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_LWSSTART_V.dat	(revision 22)
@@ -0,0 +1,19 @@
+INVITE  sip:user@example.com  SIP/2.0
+Max-Forwards: 8
+To: sip:user@example.com
+From: sip:caller@example.net;tag=8814
+Call-ID: lwsstart.dfknq234oi243099adsdfnawe3@example.com
+CSeq: 1893884 INVITE
+Via: SIP/2.0/UDP host1.example.com;branch=z9hG4bKkdjuw3923
+Contact: <sip:caller@host1.example.net>
+Content-Type: application/sdp
+Content-Length: 150
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.1
+s=-
+c=IN IP4 192.0.2.1
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MCL01_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MCL01_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MCL01_I.dat	(revision 22)
@@ -0,0 +1,13 @@
+OPTIONS sip:user@example.com SIP/2.0
+Via: SIP/2.0/UDP host5.example.net;branch=z9hG4bK293423
+To: sip:user@example.com
+From: sip:other@example.net;tag=3923942
+Call-ID: mcl01.fhn2323orihawfdoa3o4r52o3irsdf
+CSeq: 15932 OPTIONS
+Content-Length: 13
+Max-Forwards: 60
+Content-Length: 5
+Content-Type: text/plain
+
+There's no way to know how many octets are supposed to be here.
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MISMATCH01_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MISMATCH01_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MISMATCH01_V.dat	(revision 22)
@@ -0,0 +1,9 @@
+OPTIONS sip:user@example.com SIP/2.0
+To: sip:j.user@example.com
+From: sip:caller@example.net;tag=34525
+Max-Forwards: 6
+Call-ID: mismatch01.dj0234sxdfl3
+CSeq: 8 INVITE
+Via: SIP/2.0/UDP host.example.com;branch=z9hG4bKkdjuw
+l: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MISMATCH02_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MISMATCH02_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MISMATCH02_V.dat	(revision 22)
@@ -0,0 +1,17 @@
+NEWMETHOD sip:user@example.com SIP/2.0
+To: sip:j.user@example.com
+From: sip:caller@example.net;tag=34525
+Max-Forwards: 6
+Call-ID: mismatch02.dj0234sxdfl3
+CSeq: 8 INVITE
+Contact: <sip:caller@host.example.net>
+Via: SIP/2.0/UDP host.example.net;branch=z9hG4bKkdjuw
+Content-Type: application/sdp
+l: 138
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.1
+c=IN IP4 192.0.2.1
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MPART01.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MPART01.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MPART01.dat	(revision 22)
@@ -0,0 +1,41 @@
+MESSAGE sip:kumiko@example.org SIP/2.0
+Via: SIP/2.0/UDP 127.0.0.1:5070;branch=z9hG4bK-d87543-4dade06d0bdb11ee-1--d87543-;rport
+Max-Forwards: 70
+Route: <sip:127.0.0.1:5080>
+Identity: r5mwreLuyDRYBi/0TiPwEsY3rEVsk/G2WxhgTV1PF7hHuLIK0YWVKZhKv9Mj8UeXqkMVbnVq37CD+813gvYjcBUaZngQmXc9WNZSDNGCzA+fWl9MEUHWIZo1CeJebdY/XlgKeTa0Olvq0rt70Q5jiSfbqMJmQFteeivUhkMWYUA=
+Contact: <sip:fluffy@127.0.0.1:5070>
+To: <sip:kumiko@example.org>
+From: <sip:fluffy@example.com>;tag=2fb0dcc9
+Call-ID: 3d9485ad0c49859b@Zmx1ZmZ5LW1hYy0xNi5sb2NhbA..
+CSeq: 1 MESSAGE
+Content-Transfer-Encoding: binary
+Content-Type: multipart/mixed;boundary=7a9cbec02ceef655
+Date: Sat, 15 Oct 2005 04:44:56 GMT
+User-Agent: SIPimp.org/0.2.5 (curses)
+Content-Length: 553
+
+--7a9cbec02ceef655
+Content-Type: text/plain
+Content-Transfer-Encoding: binary
+
+Hello
+--7a9cbec02ceef655
+Content-Type: application/octet-stream
+Content-Transfer-Encoding: binary
+
+0R	*H÷
+ C0?1	0+0
+	*H÷
+1 0
+0|0p1
+0	UUS10U
+California10USan Jose10
+U
+sipit1)0'U
+ Sipit Test Certificate Authority q30+0
+	*H÷
+ ôfùHðR-Òåªéòþ fYqbèÚ*¨Ø5
+hÎÿ®<½+ÿuÝÕdY=ÖG(òb ÷éAt3
+í«ÛÑ
+B.{rÒÀÉ®.ûÇÀÏù/;~OÀ'áTmä¶ª:»>fÌË]ÖÆK¸æÿ-Oå{e¼Ð
+--7a9cbec02ceef655--
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MULTI01_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MULTI01_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_MULTI01_I.dat	(revision 22)
@@ -0,0 +1,26 @@
+INVITE sip:user@company.com SIP/2.0
+Contact: <sip:caller@host25.example.net>
+Via: SIP/2.0/UDP 192.0.2.25;branch=z9hG4bKkdjuw
+Max-Forwards: 70
+CSeq: 5 INVITE
+Call-ID: multi01.98asdh@192.0.2.1
+CSeq: 59 INVITE
+Call-ID: multi01.98asdh@192.0.2.2
+From: sip:caller@example.com;tag=3413415
+To: sip:user@example.com
+To: sip:other@example.net
+From: sip:caller@example.net;tag=2923420123
+Content-Type: application/sdp
+l: 154
+Contact: <sip:caller@host36.example.net>
+Max-Forwards: 5
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.25
+s=-
+c=IN IP4 192.0.2.25
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_NCL_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_NCL_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_NCL_I.dat	(revision 22)
@@ -0,0 +1,19 @@
+INVITE sip:user@example.com SIP/2.0
+Max-Forwards: 254
+To: sip:j.user@example.com
+From: sip:caller@example.net;tag=32394234
+Call-ID: ncl.0ha0isndaksdj2193423r542w35
+CSeq: 0 INVITE
+Via: SIP/2.0/UDP 192.0.2.53;branch=z9hG4bKkdjuw
+Contact: <sip:caller@example53.example.net>
+Content-Type: application/sdp
+Content-Length: -999
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.53
+s=-
+c=IN IP4 192.0.2.53
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_NOREASON_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_NOREASON_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_NOREASON_V.dat	(revision 22)
@@ -0,0 +1,9 @@
+SIP/2.0 100 
+Via: SIP/2.0/UDP 192.0.2.105;branch=z9hG4bK2398ndaoe
+Call-ID: noreason.asndj203insdf99223ndf
+CSeq: 35 INVITE
+From: <sip:user@example.com>;tag=39ansfi3
+To: <sip:user@example.edu>;tag=902jndnke3
+Content-Length: 0
+Contact: <sip:user@host105.example.com>
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_NOVELSC_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_NOVELSC_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_NOVELSC_V.dat	(revision 22)
@@ -0,0 +1,9 @@
+OPTIONS soap.beep://192.0.2.103:3002 SIP/2.0
+To: sip:user@example.com
+From: sip:caller@example.net;tag=384
+Max-Forwards: 3
+Call-ID: novelsc.asdfasser0q239nwsdfasdkl34
+CSeq: 3923423 OPTIONS
+Via: SIP/2.0/TCP host9.example.com;branch=z9hG4bKkdjuw39234
+Content-Length: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_QUOTBAL_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_QUOTBAL_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_QUOTBAL_I.dat	(revision 22)
@@ -0,0 +1,19 @@
+INVITE sip:user@example.com SIP/2.0
+To: "Mr. J. User <sip:j.user@example.com>
+From: sip:caller@example.net;tag=93334
+Max-Forwards: 10
+Call-ID: quotbal.aksdj
+Contact: <sip:caller@host59.example.net>
+CSeq: 8 INVITE
+Via: SIP/2.0/UDP 192.0.2.59:5050;branch=z9hG4bKkdjuw39234
+Content-Type: application/sdp
+Content-Length: 152
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.15
+s=-
+c=IN IP4 192.0.2.15
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_REGAUT01_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_REGAUT01_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_REGAUT01_V.dat	(revision 22)
@@ -0,0 +1,10 @@
+REGISTER sip:example.com SIP/2.0
+To: sip:j.user@example.com
+From: sip:j.user@example.com;tag=87321hj23128
+Max-Forwards: 8
+Call-ID: regaut01.0ha0isndaksdj
+CSeq: 9338 REGISTER
+Via: SIP/2.0/TCP 192.0.2.253;branch=z9hG4bKkdjuw
+Authorization: NoOneKnowsThisScheme opaque-data=here
+Content-Length:0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_REGBADCT_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_REGBADCT_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_REGBADCT_I.dat	(revision 22)
@@ -0,0 +1,10 @@
+REGISTER sip:example.com SIP/2.0
+To: sip:user@example.com
+From: sip:user@example.com;tag=998332
+Max-Forwards: 70
+Call-ID: regbadct.k345asrl3fdbv@10.0.0.1
+CSeq: 1 REGISTER
+Via: SIP/2.0/UDP 135.180.130.133:5060;branch=z9hG4bKkdjuw
+Contact: sip:user@example.com?Route=%3Csip:sip.example.com%3E
+l: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_REGESCRT_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_REGESCRT_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_REGESCRT_V.dat	(revision 22)
@@ -0,0 +1,10 @@
+REGISTER sip:example.com SIP/2.0
+To: sip:user@example.com
+From: sip:user@example.com;tag=8
+Max-Forwards: 70
+Call-ID: regescrt.k345asrl3fdbv@192.0.2.1
+CSeq: 14398234 REGISTER
+Via: SIP/2.0/UDP host5.example.com;branch=z9hG4bKkdjuw
+M: <sip:user@example.com?Route=%3Csip:sip.example.com%3E>
+L:0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_SCALAR02_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_SCALAR02_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_SCALAR02_V.dat	(revision 22)
@@ -0,0 +1,12 @@
+REGISTER sip:example.com SIP/2.0
+Via: SIP/2.0/TCP host129.example.com;branch=z9hG4bK342sdfoi3
+To: <sip:user@example.com>
+From: <sip:user@example.com>;tag=239232jh3
+CSeq: 36893488147419103232 REGISTER
+Call-ID: scalar02.23o0pd9vanlq3wnrlnewofjas9ui32
+Max-Forwards: 300
+Expires: 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+Contact: <sip:user@host129.example.com>
+  ;expires=280297596632815
+Content-Length: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_SCALARLG_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_SCALARLG_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_SCALARLG_V.dat	(revision 22)
@@ -0,0 +1,10 @@
+SIP/2.0 503 Service Unavailable
+Via: SIP/2.0/TCP host129.example.com;branch=z9hG4bKzzxdiwo34sw;received=192.0.2.129
+To: <sip:user@example.com>
+From: <sip:other@example.net>;tag=2easdjfejw
+CSeq: 9292394834772304023312 OPTIONS
+Call-ID: scalarlg.noase0of0234hn2qofoaf0232aewf2394r
+Retry-After: 949302838503028349304023988
+Warning: 1812 overture "In Progress"
+Content-Length: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_SDP01_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_SDP01_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_SDP01_V.dat	(revision 22)
@@ -0,0 +1,20 @@
+INVITE sip:user@example.com SIP/2.0
+To: sip:j_user@example.com
+Contact: <sip:caller@host15.example.net>
+From: sip:caller@example.net;tag=234
+Max-Forwards: 5
+Call-ID: sdp01.ndaksdj9342dasdd
+Accept: text/nobodyKnowsThis
+CSeq: 8 INVITE
+Via: SIP/2.0/UDP 192.0.2.15;branch=z9hG4bKkdjuw
+Content-Length: 150
+Content-Type: application/sdp
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.5
+s=-
+c=IN IP4 192.0.2.5
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_SEMIURI_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_SEMIURI_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_SEMIURI_V.dat	(revision 22)
@@ -0,0 +1,12 @@
+OPTIONS sip:user;par=u%40example.net@example.com SIP/2.0
+To: sip:j_user@example.com
+From: sip:caller@example.org;tag=33242
+Max-Forwards: 3
+Call-ID: semiuri.0ha0isndaksdj
+CSeq: 8 OPTIONS
+Accept: application/sdp, application/pkcs7-mime,
+        multipart/mixed, multipart/signed,
+        message/sip, message/sipfrag
+Via: SIP/2.0/UDP 192.0.2.1;branch=z9hG4bKkdjuw
+l: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_TEST_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_TEST_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_TEST_I.dat	(revision 22)
@@ -0,0 +1,15 @@
+INVITE sip:alan@jasomi.com
+TO : alan@jasomi.com
+From: ralph@example.com
+MaX-fOrWaRdS: 0068
+Call-ID: test.0ha0isndaksdj@192.0.2.1
+Xyzzy-2: this is the number ten : 10
+Xyzzy-3: INVITE
+Xyzzy: 10000000000
+Meaning: foo bar spam
+Foobar roobar
+Content-Length: 18
+Content-Type: application/sdp
+
+v=0
+testing=123
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_TRANSPORTS_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_TRANSPORTS_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_TRANSPORTS_V.dat	(revision 22)
@@ -0,0 +1,14 @@
+OPTIONS sip:user@example.com SIP/2.0
+To: sip:user@example.com
+From: <sip:caller@example.com>;tag=323
+Max-Forwards: 70
+Call-ID:  transports.kijh4akdnaqjkwendsasfdj
+Accept: application/sdp
+CSeq: 60 OPTIONS
+Via: SIP/2.0/UDP t1.example.com;branch=z9hG4bKkdjuw
+Via: SIP/2.0/SCTP t2.example.com;branch=z9hG4bKklasjdhf
+Via: SIP/2.0/TLS t3.example.com;branch=z9hG4bK2980unddj
+Via: SIP/2.0/UNKNOWN t4.example.com;branch=z9hG4bKasd0f3en
+Via: SIP/2.0/TCP t5.example.com;branch=z9hG4bK0a9idfnee
+l: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_TRWS_I.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_TRWS_I.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_TRWS_I.dat	(revision 22)
@@ -0,0 +1,10 @@
+OPTIONS sip:remote-target@example.com SIP/2.0  
+Via: SIP/2.0/TCP host1.examle.com;branch=z9hG4bK299342093
+To: <sip:remote-target@example.com>
+From: <sip:local-resource@example.com>;tag=329429089
+Call-ID: trws.oicu34958239neffasdhr2345r
+Accept: application/sdp
+CSeq: 238923 OPTIONS
+Max-Forwards: 70
+Content-Length: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_UNKSCM_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_UNKSCM_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_UNKSCM_V.dat	(revision 22)
@@ -0,0 +1,9 @@
+OPTIONS nobodyKnowsThisScheme:totallyopaquecontent SIP/2.0
+To: sip:user@example.com
+From: sip:caller@example.net;tag=384
+Max-Forwards: 3
+Call-ID: unkscm.nasdfasser0q239nwsdfasdkl34
+CSeq: 3923423 OPTIONS
+Via: SIP/2.0/TCP host9.example.com;branch=z9hG4bKkdjuw39234
+Content-Length: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_UNKSM2_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_UNKSM2_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_UNKSM2_V.dat	(revision 22)
@@ -0,0 +1,10 @@
+REGISTER sip:example.com SIP/2.0
+To: isbn:2983792873
+From: <http://www.example.com>;tag=3234233
+Call-ID: unksm2.daksdj@hyphenated-host.example.com
+CSeq: 234902 REGISTER
+Max-Forwards: 70
+Via: SIP/2.0/UDP 192.0.2.21:5060;branch=z9hG4bKkdjuw
+Contact: <name:John_Smith>
+l: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_UNREASON_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_UNREASON_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_UNREASON_V.dat	(revision 22)
@@ -0,0 +1,18 @@
+SIP/2.0 200 = 2**3 * 5**2 но сто девяносто девять - простое
+Via: SIP/2.0/UDP 192.0.2.198;branch=z9hG4bK1324923
+Call-ID: unreason.1234ksdfak3j2erwedfsASdf
+CSeq: 35 INVITE
+From: sip:user@example.com;tag=11141343
+To: sip:user@example.edu;tag=2229
+Content-Length: 154
+Content-Type: application/sdp
+Contact: <sip:user@host198.example.com>
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.198
+s=-
+c=IN IP4 192.0.2.198
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_WSINV.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_WSINV.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_WSINV.dat	(revision 22)
@@ -0,0 +1,37 @@
+INVITE sip:vivekg@chair-dnrc.example.com;unknownparam SIP/2.0
+TO :
+ sip:vivekg@chair-dnrc.example.com ;   tag    = 1918181833n
+from   : "J Rosenberg \\\""       <sip:jdrosen@example.com>
+  ;
+  tag = 98asjd8
+MaX-fOrWaRdS: 0068
+Call-ID: wsinv.ndaksdj@192.0.2.1
+Content-Length   : 150
+cseq: 0009
+  INVITE
+Via  : SIP  /   2.0
+ /UDP
+    192.0.2.2;branch=390skdjuw
+s :
+NewFangledHeader:   newfangled value
+ continued newfangled value
+UnknownHeaderWithUnusualValue: ;;,,;;,;
+Content-Type: application/sdp
+Route:
+ <sip:services.example.com;lr;unknownwith=value;unknown-no-value>
+v:  SIP  / 2.0  / TCP     spindle.example.com   ;
+  branch  =   z9hG4bK9ikj8  ,
+ SIP  /    2.0   / UDP  192.168.255.111   ; branch=
+ z9hG4bK30239
+m:"Quoted string \"\"" <sip:jdrosen@example.com> ; newparam =
+      newvalue ;
+  secondparam ; q = 0.33
+
+v=0
+o=mhandley 29739 7272939 IN IP4 192.0.2.3
+s=-
+c=IN IP4 192.0.2.4
+t=0 0
+m=audio 49217 RTP/AVP 0 12
+m=video 3227 RTP/AVP 31
+a=rtpmap:31 LPC
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ZEROMF_V.dat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ZEROMF_V.dat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/data/TC_ZEROMF_V.dat	(revision 22)
@@ -0,0 +1,9 @@
+OPTIONS sip:user@example.com SIP/2.0
+To: sip:user@example.com
+From: sip:caller@example.net;tag=3ghsd41
+Call-ID: zeromf.jfasdlfnm2o2l43r5u0asdfas
+CSeq: 39234321 OPTIONS
+Via: SIP/2.0/UDP host1.example.com;branch=z9hG4bKkdjuw2349i
+Max-Forwards: 0
+Content-Length: 0
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/init.cpp
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/init.cpp	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/TortureTests/init.cpp	(revision 22)
@@ -0,0 +1,66 @@
+/****************************************************************************/
+/* $Id$             */
+/*                                                                          */
+/*   (c) 2009  Universite de Rennes 1                                       */
+/*                                                                          */
+/* Contributors:                                                            */
+/*  - Anthony BAIRE                                                         */
+/*                                                                          */
+/* Contact address: <t3devkit@irisa.fr>                                     */
+/*                                                                          */
+/*                                                                          */
+/* This file is part of application examples provided along with T3DevKit,  */
+/* a free toolkit for building TTCN-3 tests.                                */
+/*                                                                          */
+/* This software is governed by the CeCILL-B license under French law and   */
+/* abiding by the rules of distribution of free software.  You can  use,    */
+/* modify and/or redistribute the software under the terms of the CeCILL-B  */
+/* license as circulated by CEA, CNRS and INRIA at the following URL        */
+/* "http://www.cecill.info".                                                */
+/*                                                                          */
+/* As a counterpart to the access to the source code and  rights to copy,   */
+/* modify and redistribute granted by the license, users are provided only  */
+/* with a limited warranty  and the software's author,  the holder of the   */
+/* economic rights,  and the successive licensors  have only  limited       */
+/* liability.                                                               */
+/*                                                                          */
+/* In this respect, the user's attention is drawn to the risks associated   */
+/* with loading,  using,  modifying and/or developing or reproducing the    */
+/* software by the user in light of its specific status of free software,   */
+/* that may mean  that it is complicated to manipulate,  and  that  also    */
+/* therefore means  that it is reserved for developers  and  experienced    */
+/* professionals having in-depth computer knowledge. Users are therefore    */
+/* encouraged to load and test the software's suitability as regards their  */
+/* requirements in conditions enabling the security of their systems and/or */ 
+/* data to be ensured and,  more generally, to use and operate it in the    */
+/* same conditions as regards security.                                     */
+/*                                                                          */
+/* The fact that you are presently reading this means that you have had     */
+/* knowledge of the CeCILL-B license and that you accept its terms.         */
+/****************************************************************************/
+#include <t3devlib/t3devlib.h>
+#include "SipTorturePort.h"
+
+namespace t3devlib {
+	
+	void PAInit()
+	{
+	}
+
+	void SAInit()
+	{
+		Port::RegisterType ("TestSystem", "SipPort", &createPort<SipTorturePort>);
+	}
+
+	void CDInit()
+	{
+	}
+
+	void PAReset()
+	{
+	}
+
+	void SAReset()
+	{
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/XSDAUX.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/XSDAUX.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/codec/validation/XSDAUX.ttcn	(revision 22)
@@ -0,0 +1,150 @@
+module XSDAUX language "TTCN-3:2005"{//MRO
+	/* 0.anySimpleType */
+	type anytype anySimpleType;
+
+	/* 1.string */
+	type charstring string;
+
+	/* 2.boolean */
+	type integer bitXSD (1, 0) ;
+	
+	type union booleanXSD {
+		bitXSD bit, boolean bool
+	}
+
+	/* 3.decimal */
+	type float decimal;
+
+	/* 4.float */
+	type float floatXSD;
+
+	/* 5.double */
+	type float double;
+
+	/* 6.duration */
+	type charstring duration;
+
+	/* 7.dateTime */
+	type charstring dateTime;
+
+	/* 8.time */
+	type charstring time;
+
+	/* 9.date */
+	type charstring date;
+
+	/* 10.gYearMonth */
+	type charstring gYearMonth;
+
+	/* 11.gYear */
+	type charstring gYear;
+
+	/* 12.gMonthDay */
+	type charstring gMonthDay;
+
+	/* 13.gDay */
+	type charstring gDay;
+
+	/* 14.gMonth */
+	type charstring gMonth;
+
+	/* 15.hexBinary */
+	type hexstring hexBinary;
+
+	/* 16.base64Binary */
+	type charstring base64Binary;
+
+	/* 17.anyURI */
+	type charstring anyURI;
+
+	/* 18.QName */
+	type charstring QName;
+
+	/* 19.NOTATION */
+	type charstring NOTATION;
+
+	/* 20.normalizedString */
+	type charstring normalizedString;
+
+	/* 21.token */
+	type charstring token;
+
+	/* 22.language */
+	type charstring languageXSD;
+
+	/* 23.NMTOKEN */
+	type charstring NMTOKEN;
+
+	/* 24.NMTOKENS */
+	type set of charstring NMTOKENS;
+
+	/* 25.Name */
+	type charstring Name;
+
+	/* 27.NCName */
+	type charstring NCName;
+
+	/* 28.ID */
+	type charstring ID;
+
+	/* 29.IDREFS */
+	type set of charstring IDREFS;
+
+	/* 30.ENTITY */
+	type charstring ENTITY;
+
+	/* 31.ENTITIES */
+	type set of charstring ENTITIES;
+
+	/* 32.nonPositiveInteger */
+	type integer nonPositiveInteger (- infinity .. 0) ;
+
+	/* 33.negativeInteger */
+	type integer negativeInteger (- infinity .. - 1) ;
+
+	/* 34.long */
+//	type integer long (- 9223372036854775808 .. 9223372036854775807) ;//MRO
+
+	/* 35.int */
+	type integer int (- 2147483648 .. 2147483647) ;
+
+	/* 36.short */
+	type integer short (- 32768 .. 32767) ;
+
+	/* 37.byte */
+	type integer byte (- 128 .. 127) ;
+
+	/* 38.nonNegativeInteger */
+	type integer nonNegativeInteger (0 .. infinity) ;
+
+	/* 39.unsignedLong */
+//	type integer unsignedLong (0 .. 18446744073709551615) ;//MRO
+
+	/* 40.unsignedInt */
+	type integer unsignedInt (0 .. 4294967295) ;
+
+	/* 41.unsignedShort */
+	type integer unsignedShort (0 .. 65535) ;
+
+	/* 42.unsignedByte */
+	type integer unsignedByte (0 .. 255) ;
+
+	/* 43.positiveInteger */
+	type integer positiveInteger (1 .. infinity) ;
+
+	/* 44.integer */
+	type integer integerXSD;
+
+	/* 45.anyAttributes */
+	type record of record {
+		charstring name, 
+		charstring val
+	} anyAttributes;
+
+	/* 46. anyType */
+	/**
+	 * This is to represent elements without a given type
+	 */
+	type record anyType {
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_Behavior.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_Behavior.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_Behavior.ttcn	(revision 22)
@@ -0,0 +1,4199 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides common functions which describes behavior for each TP reference.
+ */
+module AtsImsIot_Behavior {
+	
+	import from AtsImsIot_TestSystem {
+		type ImsInterfaceMonitor, ImsTestCoordinator;
+	}
+
+	import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT;}
+
+	import from AtsImsIot_Templates {template all;}
+
+	import from AtsImsIot_TypesAndValues {
+		type SipMessage, SipMessageList, SkipType;
+	}
+		
+	
+	import from LibIms_UpperTester {type ImsUserInfo;}
+
+	import from LibIot_TypesAndValues {type SetFilterReq, SetFilterRsp;}
+	import from LibIot_Functions {
+		function f_setConformanceVerdict, f_setIotVerdictFAIL;
+	}
+
+	import from LibSip_SIPTypesAndValues all;
+	
+	import from LibSip_Templates all;
+	
+	import from AtsImsIot_Functions all;
+	import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;}
+		
+group checks {
+
+group checksTC_IMS_MESS_0001{
+		
+		 /**
+          * @desc
+          *     TP_IMS_4002_01 in CFW step 3 (MESSAGE)<br> ensure that {<br>
+          *     when { UE_A sends a MESSAGE to UE_B containing a Message_Body
+          *     greater than 1300 bytes }<br> then { IMS_B receives the MESSAGE
+          *     containing the Message_Body greater than 1300 bytes }<br> }
+          */
+	    function f_mtc_check_TP_IMS_4002_01_gm(ImsInterfaceMonitor p_monitorCompRef) 
+		runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_4002_01(?))},//? CallId can be checked
+                {mw_SipRequest(mw_MESSAGE_Request_Base(?))},
+                {0,omit},
+                "TP_IMS_4002_01_gm",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+
+	    function f_mtc_check_TP_IMS_4002_01_ic(ImsInterfaceMonitor p_monitorCompRef) 
+		runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_4002_01(?))},//? CallId can be checked
+                {mw_SipRequest(mw_MESSAGE_Request_Base(?))},
+                {0, omit},
+                "TP_IMS_4002_01_ic",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+} // group
+
+    group checksTC_IMS_REG_0001 {	    
+        /**
+    	 * @desc Starts monitor component behavior for TP_IMS_5011_01 
+    	 * 		 the on Gm-interface
+    	 * @param p_monitorCompRef Reference to monitor component
+    	 */
+        function f_mtc_check_TP_IMS_5011_01_gm(
+        	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+        ) runs on ImsTestCoordinator {
+    	   
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5011_01_gm)},
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {0, omit},
+                "TP_IMS_5011_01",
+                false,
+    			p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+        }
+        
+        /**
+    	 * @desc Starts monitor component behavior for TP_IMS_5011_01
+    	 * 		 on the Mw-interface
+    	 * @param p_monitorCompRef Reference to monitor component
+    	 */
+    	 
+    	function f_mtc_check_TP_IMS_5011_01_ic(
+    		ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+    		var charstring v_EUT_A_Addr := f_GetEUTPcscfAddress(PX_EUT_A);
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5011_01p_ic(v_EUT_A_Addr))},
+    				{
+						mw_SipRequest(mdw_TP_IMS_5011_01f_ic),
+    					mw_SipRequest(mw_REGISTER_Request_Base)
+    				},
+    				{0, omit},
+    				"TP_IMS_5011_01",
+    				false,
+    				p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+    	}
+
+    	/**
+        * @desc Starts monitor component behavior for TP_IMS_5089_01 (gm)
+        * @param p_monitorCompRef Reference to monitor component
+        */		
+    	function f_mtc_check_TP_IMS_5089_01_gm_when (
+        	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+        ) runs on ImsTestCoordinator {
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mw_REGISTER_Request_Base)},
+    				{},
+    				{0, omit},
+    				"TP_IMS_5089_01_gm_when",
+    				false,
+    				p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+        }
+
+
+	/**
+        * @desc Starts monitor component behavior for TP_IMS_5011_02 (gm) 
+        * 		 the on Gm-interface
+        * @param p_monitorCompRef Reference to monitor component
+        */
+    	function f_mtc_check_TP_IMS_5011_02_gm(
+    		ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+    	   
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5011_02_gm)},
+    				{mw_SipRequest(mw_REGISTER_Request_Base)},
+    				{0, omit},
+    				"TP_IMS_5011_02_gm",
+    				false,
+    				p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+    	}
+
+        /**
+        * @desc Starts monitor component behavior for TP_IMS_5011_02 (mw)
+        * @param p_monitorCompRef Reference to monitor component
+        */
+        function f_mtc_check_TP_IMS_5011_02_ic(
+			ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+			var charstring v_EUT_A_Addr := f_GetEUTPcscfAddress(PX_EUT_A);    		
+
+			p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5011_02p_ic(v_EUT_A_Addr))},
+    				{mw_SipRequest(mdw_TP_IMS_5011_02f_ic),
+    				mw_SipRequest(mw_REGISTER_Request_Base)},
+    				{0, omit},
+    				"TP_IMS_5011_02",
+    				false,
+    				p_checkMessage
+    			)
+			);
+			p_monitorCompRef.done;
+		}
+
+
+    	/**
+        * @desc Starts monitor component behavior for TP_IMS_5089_01 (when)
+        * @param p_monitorCompRef Reference to monitor component
+        */
+    	function f_mtc_check_TP_IMS_5089_01_ic_when(
+    		ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipRequest(mdw_TP_IMS_5089_01_ic_when)},
+					{mw_SipRequest(mw_REGISTER_Request_Base)},
+					{0, omit},
+					"TP_IMS_5089_01 (when)",
+					false,
+					p_checkMessage
+				)
+			);
+    		p_monitorCompRef.done;
+    	}
+
+	    /**
+		 * @desc Starts monitor component behavior for TP_IMS_5089_01 (then)
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5089_01_ic_then(
+	    	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+          p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mdw_TP_IMS_5089_01_ic)},
+                {mw_SipResponse (mw_401Unauthorized_Base)},
+                {0, omit},
+                "TP_IMS_5089_01",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+
+
+		/**
+    	* @desc Starts monitor component behavior for TP_IMS_5092_01 (gm) 
+    	* 		 the on Gm-interface
+    	* @param p_monitorCompRef Reference to monitor component
+    	*/
+    	function f_mtc_check_TP_IMS_5092_01_gm(
+    		ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+    		p_monitorCompRef.start(
+			f_imsIot_receive(
+        		{mw_SipRequest(mdw_TP_IMS_5011_02_gm)},
+        		{mw_SipRequest(mw_REGISTER_Request_Base)},
+        		{0, omit},
+        		"TP_IMS_5092_01_gm",
+        		false,
+				p_checkMessage
+    			)
+    		);
+   			p_monitorCompRef.done;
+    	}
+
+		/**
+		* @desc Starts monitor component behavior for TP_IMS_5092_01 (when)
+		* @param p_monitorCompRef Reference to monitor component
+		*/
+        function f_mtc_check_TP_IMS_5092_01_ic_when(
+        	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+        ) runs on ImsTestCoordinator {
+        	p_monitorCompRef.start(
+        	f_imsIot_receive(
+        		{mw_SipRequest(mdw_TP_IMS_5092_01_ic_when)},
+        		{mw_SipRequest(mw_REGISTER_Request_Base)},
+        		{0, omit},
+        		"TP_IMS_5092_01 (when)",
+        		false,
+				p_checkMessage
+        		)
+        	);
+			p_monitorCompRef.done;
+		}
+
+		/**
+        * @desc Starts monitor component behavior for TP_IMS_5092_01
+        * @param p_monitorCompRef Reference to monitor component
+        */
+		function f_mtc_check_TP_IMS_5092_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+			var charstring v_EUT_A_Addr := f_GetEUTPcscfAddress(PX_EUT_A);
+			var template SipUrl v_eutBUri := mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_B));
+			
+    		p_monitorCompRef.start(
+				f_imsIot_receive(
+        			{mw_SipResponse(mdw_TP_IMS_5092_01_ic(v_EUT_A_Addr, v_eutBUri))},
+        			{mw_SipResponse (mw_200OK_Base)},
+        			{0, omit},
+        			"TP_IMS_5092_01",
+        			false,
+					p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+		}
+
+
+		/**
+		* @desc Starts monitor component behavior for TP_IMS_5044_01 (when)
+		* @param p_monitorCompRef Reference to monitor component
+		*/
+    	function f_mtc_check_TP_IMS_5044_01_ic_when(
+    		ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+    	) runs on ImsTestCoordinator return Response {
+    		var template SipUrl v_eutBUri := mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_B)); 
+			var SipMessage v_sip := {response := valueof(m_Response_Dummy)};
+			p_monitorCompRef.start(
+					f_imsIot_receive(
+					{mw_SipResponse(mw_200OK_Base)},
+					{},
+					{0, omit},
+					"TP_IMS_5044_01 (when)",
+					true,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+
+			f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+			return v_sip.response;
+    	}
+
+    /**
+         * @desc Starts monitor component behavior for TP_IMS_5044_01
+         * @param p_monitorCompRef Reference to monitor component
+         */
+    	function f_mtc_check_TP_IMS_5044_01_ic(
+    		ImsInterfaceMonitor p_monitorCompRef, Response p_200OK, boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+    		var charstring v_UEB_PublicId := f_GetUEPublicId(PX_EUT_B);
+    		var template SipUrl v_eutAUri := mw_SipUrl_Host(f_GetEUTPcscfAddress(PX_EUT_A));  		
+    		var SipMessage v_sip := {request := valueof(m_INVITE_Dummy)};
+    		var charstring v_Epires200OK;
+    		var charstring v_EpiresSubscribe;
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5044_01_ic(?, v_eutAUri, v_UEB_PublicId))},
+    				{mw_SipRequest(mw_SUBSCRIBE_Request_Base)},
+    				{0, omit},
+     				"TP_IMS_5044_01",
+    				true,
+            		p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+    
+    		f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+    		// Check that the expires header is set to "a value greater than the one 
+    		// in the Expires_header of the 200_response"
+    		
+    		if(ispresent(p_200OK.msgHeader.expires)) {
+        		v_Epires200OK := p_200OK.msgHeader.expires.deltaSec;
+        		v_EpiresSubscribe  := v_sip.request.msgHeader.expires.deltaSec;
+        		if (str2int(v_EpiresSubscribe) > str2int(v_Epires200OK)) {
+        			f_setIotVerdictFAIL("TP_IMS_5044_01 - Expires_header of subscribe is NOT greater than the Expires_header of 200_response.");
+        		}
+    		} 	
+    	}
+
+		/**
+        * @desc Starts monitor component behavior for TP_IMS_5096_01
+        * @param p_monitorCompRef Reference to monitor component
+        */
+		function f_mtc_check_TP_IMS_5096_01_ic_when(
+			ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+		) runs on ImsTestCoordinator  return Request {
+			var SipMessage v_sip := {request := valueof(m_INVITE_Dummy)};
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5096_01_ic_when)},
+    				{mw_SipRequest(mw_SUBSCRIBE_Request_Base)},
+    				{0, omit},
+    				"TP_IMS_5096_01 (when)",
+    				true,
+					p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+       		f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+       		return v_sip.request;
+		}
+
+
+	    /**
+		 * @desc Starts monitor component behavior for TP_IMS_5096_01
+		 */
+	    function f_mtc_check_TP_IMS_5096_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef, Request p_Subscribe, boolean p_checkMessage
+	    ) runs on ImsTestCoordinator
+	    {
+		   var SipMessage v_sip := {request := valueof(m_INVITE_Dummy)};
+           var charstring v_Epires200OK;
+           var charstring v_EpiresSubscribe;
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mw_200OK_Base), mw_SipResponse(mw_202Accepted_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5096_01",
+                true,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+		   
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+           if(ispresent(v_sip.response.msgHeader.expires)) {
+               // Check that the message contains "Expires_header indicating the same or 
+               // lower expiry time than specified in the initial SUBSCRIBE"
+    		   v_Epires200OK := v_sip.response.msgHeader.expires.deltaSec;
+    		   v_EpiresSubscribe  := p_Subscribe.msgHeader.expires.deltaSec;          
+               if (str2int(v_Epires200OK) <= str2int(v_EpiresSubscribe)) {
+    			 f_setIotVerdictFAIL("TP_IMS_5096_01 - - Expires_header Expires_header of 200_response is NOT the same or lower than the Expires_header of subscribe.");
+               }
+           }
+	    }
+
+    } // group
+
+group checksTC_IMS_REG_0002{	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5203_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+		   // Check that the UE sends any register	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5203_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5203_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator return Request {
+		   var SipMessage v_sip := {request := valueof(m_INVITE_Dummy)};
+		   
+		   //Get first Register
+		   //var charstring v_EUT_A_Addr := f_GetEUTAddress(PX_EUT_A);
+		   var Request v_RegisterStep4, v_RegisterStep2;    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5203_01 first register",
+                true,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+           v_RegisterStep2 := v_sip.request;
+
+		   //Get second Register
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5203_01 second register",
+                true,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+           
+           // TODO: Currently we don't check anything, just that IMS-A sent 2 consecutive Registers  
+           v_RegisterStep4 := v_sip.request;                      
+           return v_RegisterStep4;
+	    }
+  
+} // group
+
+group checksTC_IMS_REG_0002H{	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5402_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+		   // Check that the UE sends any register	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5203_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5402_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator return Request {
+		   var SipMessage v_sip := {request := valueof(m_INVITE_Dummy)};
+		   
+		   //Get first Register
+		   //var charstring v_EUT_A_Addr := f_GetEUTAddress(PX_EUT_A);
+		   var Request v_RegisterStep4, v_RegisterStep2;    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5203_01 first register",
+                true,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+           v_RegisterStep2 := v_sip.request;
+
+		   //Get second Register
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5203_01 second register",
+                true,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+           v_RegisterStep4 := v_sip.request;                      
+           
+           // Check that IMS_A sends the original Register to
+           // another entrypoint of IMS-B
+           if (not (match (v_RegisterStep4.msgHeader, v_RegisterStep2.msgHeader))){
+             // Headers differ
+            f_setIotVerdictFAIL("TP_IMS_5203_01"); 
+           }
+           if (match (v_RegisterStep4.requestLine, v_RegisterStep4.requestLine)){
+             // IMS-A used same entrypoint
+			f_setIotVerdictFAIL("TP_IMS_5203_01"); 
+           }  
+           return v_RegisterStep4;
+	    }
+  
+  
+} // group
+	group checksTC_IMS_REG_0003{	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5129_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+		   // Check that the UE sends any register	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_REGISTER_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5129_01 (gm)",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+
+		/**
+        * @desc Starts monitor component behavior 
+        * @param p_monitorCompRef Reference to monitor component
+        */
+		function f_mtc_check_TP_IMS_5129_01_ic_when(
+			ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+			// Check that the IMS_A forwards register from UE_B	    		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipRequest(mw_REGISTER_Request_Base)},
+					{},
+					{0, omit},
+					"TP_IMS_5129_01 (mw-when)",
+					false,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+		function f_mtc_check_TP_IMS_5129_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+			var SipMessage v_sip := {request := valueof(m_INVITE_Dummy)};
+          	p_monitorCompRef.start(
+            // Check that IMS_B responds with 403 forbidden
+            	f_imsIot_receive(
+                    {mw_SipResponse(mw_403Forbidden_Base)},
+                    {},
+    				{0, omit},
+                    "TP_IMS_5129_01 (mw)",
+                    true,
+    				p_checkMessage
+               )
+           );
+           p_monitorCompRef.done;
+		}
+	} // group
+	
+	group checksTC_IMS_REG_0003H{	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+		function f_mtc_check_TP_IMS_5411_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+			// Check that the UE sends any register	    		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipRequest(mw_REGISTER_Request_Base)},
+					{},
+                    {0, omit},
+                    "TP_IMS_5411_01 (gm)",
+                    false,
+    				p_checkMessage
+            	)
+           	);
+        	p_monitorCompRef.done;
+		}
+	    
+		/**
+		* @desc Starts monitor component behavior 
+		* @param p_monitorCompRef Reference to monitor component
+		*/
+		function f_mtc_check_TP_IMS_5411_01_ic_when(
+			ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+			// Check that the IMS_A forwards register from UE_B	    		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipRequest(mw_REGISTER_Request_Base)},
+					{},
+					{0, omit},
+					"TP_IMS_5411_01 (mw-when)",
+					false,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}	    
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+		function f_mtc_check_TP_IMS_5411_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+                    {mw_SipResponse(mw_403Forbidden_Base)},
+                    {},
+    				{0, omit},
+                    "TP_IMS_5411_01 (mw)",
+                    true,
+    				p_checkMessage
+            	)
+			);
+			p_monitorCompRef.done;
+		}
+	} // group
+
+group checksTC_IMS_REG_0004 {
+
+	/**
+    	* @desc Starts monitor component behavior for TP_IMS_5088_01 (gm)
+    	* @param p_monitorCompRef Reference to monitor component
+    	*/
+    	function f_mtc_check_TP_IMS_5088_01_gm(
+    		ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+       	    		
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5088_01_gm)},
+        			{mw_SipRequest(mw_REGISTER_Request_Base)},
+        			{0, omit},
+        			"TP_IMS_5088_01 (gm)",
+        			false,
+					p_checkMessage
+        		)
+        	);
+        	p_monitorCompRef.done;
+    	}
+
+    	/**
+    	* @desc Starts monitor component behavior for TP_IMS_5088_01 (mw)
+    	* @param p_monitorCompRef Reference to monitor component
+    	*/
+    	function f_mtc_check_TP_IMS_5088_01_ic(
+    		ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+    		
+			var template SipUrl v_eutAUri := mw_SipUrl_Host(f_GetEUTPcscfAddress(PX_EUT_A));
+			     		
+        	p_monitorCompRef.start(
+    			f_imsIot_receive(
+					{mw_SipRequest(mdw_TP_IMS_5088_01_ic(?, v_eutAUri))}, 
+					{mw_SipRequest(mw_NOTIFY_Request_Base(*))},
+					{0, omit},
+					"TP_IMS_5088_01_ic",
+					false,
+					p_checkMessage
+    			)
+        	);
+    	}
+	} // group
+
+	group checksTC_IMS_REG_0005{
+    	/**
+    	* @desc Starts monitor component behavior for TP_IMS_5093_01 (mw)
+    	* @param p_monitorCompRef Reference to monitor component
+    	*/
+    	function f_mtc_check_TP_IMS_5093_01_UE_ic(
+    		ImsInterfaceMonitor p_monitorCompRef, ImsUserInfo v_anyValidUser, boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+    		
+			var template SipUrl v_request_uri := mw_SipUrl_Number(v_anyValidUser.publicId);
+    		
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5093_01_UE_ic(?, v_request_uri))},
+    				{mw_SipRequest(mw_NOTIFY_Request_Base(?))},
+    				{0, omit},
+    				"TP_IMS_5093_01_ic",
+    				false,
+					p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+    	}		
+	
+		/**
+    	* @desc Starts monitor component behavior for TP_IMS_5093_01 (mw)
+    	* @param p_monitorCompRef Reference to monitor component
+    	*/
+    	function f_mtc_check_TP_IMS_5093_01_IMS_ic(
+    		ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+    		
+			var template SipUrl v_request_uri := mw_SipUrl_Host(f_GetEUTPcscfAddress(PX_EUT_A));
+    		
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    				{mw_SipRequest(mdw_TP_IMS_5093_01_IMS_ic(?, v_request_uri))}, 
+    				{mw_SipRequest(mw_NOTIFY_Request_Base(?))},
+    				{0, omit},
+    				"TP_IMS_5093_01_ic",
+    				false,
+					p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+    	}
+	} // end group
+	
+	group checksTC_IMS_REG_0006{
+	
+		/**
+		* @desc Starts monitor component behavior for TP_IMS_5094_01 (mw)
+		* @param p_monitorCompRef Reference to monitor component
+		*/
+		function f_mtc_check_TP_IMS_5094_01_UE(
+			ImsInterfaceMonitor p_monitorCompRef, ImsUserInfo v_anyValidUser, boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+    		
+			var template SipUrl v_request_uri := mw_SipUrl_Number(v_anyValidUser.publicId);
+    
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipRequest(mdw_TP_IMS_5094_01_UE(?, v_request_uri))}, 
+					{mw_SipRequest(mw_NOTIFY_Request_Base(?))},
+					{0, omit},
+					"TP_IMS_5094_01_ic",
+					false,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}		
+	
+		/**
+		* @desc Starts monitor component behavior for TP_IMS_5094_01 (mw)
+		* @param p_monitorCompRef Reference to monitor component
+		*/
+		function f_mtc_check_TP_IMS_5094_01_IMS(
+			ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+
+			var template SipUrl v_request_uri := mw_SipUrl_Host(f_GetEUTPcscfAddress(PX_EUT_A));
+
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipRequest(mdw_TP_IMS_5094_01_IMS_ic(?, v_request_uri))},
+					{mw_SipRequest(mw_NOTIFY_Request_Base(?))},
+					{0, omit},
+					"TP_IMS_5094_01_ic",
+					false,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+    		
+	} // end group
+
+group checksTC_IMS_REG_0007 {	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5134_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipRequest(mw_REGISTER_Request_Base)},
+                    {},
+                    {0, omit},
+                    "TP_IMS_5134_01 (gm)",
+                    false,
+					p_checkMessage
+             	)
+           	);
+			p_monitorCompRef.done;
+		}
+	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5134_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+			var charstring v_IBPC := f_GetEUTIbcfAddress(PX_EUT_A); 		
+   			p_monitorCompRef.start(
+    			f_imsIot_receive(
+                    {mw_SipRequest(mdw_TP_IMS_5134_01_ic(v_IBPC))},
+                    {mw_SipRequest(mw_REGISTER_Request_Base)},
+                    {0, omit},
+                    "TP_IMS_5134_01",
+                    false,
+					p_checkMessage
+    			)
+   			);
+   			p_monitorCompRef.done;
+           	// fetch second register 
+           	p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipRequest(mdw_TP_IMS_5134_01_ic(v_IBPC))},
+            		{mw_SipRequest(mw_REGISTER_Request_Base)},
+					{0, omit},
+            		"TP_IMS_5134_01",
+            		true,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+
+		/**
+    	* @desc Starts monitor component behavior 
+    	* @param p_monitorCompRef Reference to monitor component
+    	*/
+		function f_mtc_check_TP_IMS_5405_01_gm(
+			ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipRequest(mw_SUBSCRIBE_Request_Base)},
+					{},
+					{0, omit},
+					"TP_IMS_5405_01 (gm)",
+					false,
+					p_checkMessage
+				)
+			);	
+			p_monitorCompRef.done;
+		}
+
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5405_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef, boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+			// check 1st SUBSCRIBE (step 10)
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+                    {mw_SipRequest(mdw_TP_IMS_5405_01_ic)},
+                    {mw_SipRequest(mw_SUBSCRIBE_Request_Base)},
+					{0, omit},
+                    "TP_IMS_5405_01",
+                    false,
+    				p_checkMessage
+            	)
+           	);
+           	p_monitorCompRef.done;
+		   	
+		   	// check 2nd SUBSCRIBE (step 15)
+		   	p_monitorCompRef.start(
+				f_imsIot_receive(
+                    {mw_SipRequest(mdw_TP_IMS_5405_01_ic)},
+                    {mw_SipRequest(mw_SUBSCRIBE_Request_Base)},
+					{0, omit},
+                    "TP_IMS_5405_01",
+                    false,
+                    p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	} // group
+
+
+group checksTC_IMS_CALL_0001 {	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5097_01",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator  {
+		   var charstring v_EUT_A_Addr := f_GetEUTScscfAddress(PX_EUT_A);
+	       p_monitorCompRef.start(
+        	f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5097_01_ic((mw_SipUrl_Host(v_EUT_A_Addr),
+															 		mw_SipUrl_Host(f_GetEUTScscfIpAddress(PX_EUT_A))) ))},
+                {},
+                {0, omit},
+                "TP_IMS_5097_01",
+                true,
+				p_checkMessage
+            )
+       	   );
+       	   p_monitorCompRef.done;
+		} //function
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5097_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_02_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5097_02",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior for TP_IMS_5097_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_02_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5097_02_ic(mw_SIP_URI_Base, mw_TEL_URI_Base))},
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {0, omit},
+                "TP_IMS_5097_02",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+    	/**
+		  * @desc Starts monitor component behavior for TP_IMS_5097_04
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+    	function f_mtc_check_TP_IMS_5097_04_gm(
+    		ImsInterfaceMonitor p_monitorCompRef,
+    		boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+    		p_monitorCompRef.start(
+    		f_imsIot_receive(
+    			{mw_SipRequest(mdw_TP_IMS_5097_04_gm(mw_TEL_URI_Base))},//TODO check TEL_URI of UE_B
+    			{mw_SipRequest(mw_INVITE_Request_Base)},
+    			{0, omit},
+    			"TP_IMS_5097_04",
+    			false,
+    			p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+    	}
+	    
+		/**
+          * @desc Starts monitor component behavior for TP_IMS_5097_04
+          * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5097_04_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+		   p_monitorCompRef.start(
+			f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5097_04_ic(mw_SIP_URI_Base))},//TODO check SIP_URI of UE_B
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{0, omit},
+				"TP_IMS_5097_04",
+				false,
+				p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5107_02_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_ACK_Request_Base(?))},
+                {},
+                {0, omit},
+                "TP_IMS_5107_02",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5107_02_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator  {
+	    var charstring v_EUT_A_Addr := f_GetEUTScscfAddress(PX_EUT_A);
+	    	    
+        p_monitorCompRef.start(
+         f_imsIot_receive(
+            {mw_SipRequest(mdw_TP_IMS_5107_02_ic(?, mw_SipUrl_Host(v_EUT_A_Addr)))},
+            {},
+            {0, omit},
+            "TP_IMS_5107_02",
+            false,
+			p_checkMessage
+         )
+        );
+       p_monitorCompRef.done;
+	   } //function
+
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5107_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_BYE_Request_Base(?))},
+                {},
+                {0, omit},
+                "TP_IMS_5107_01",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+
+
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5107_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator  {	
+		var charstring v_EUT_A_Addr := f_GetEUTScscfAddress(PX_EUT_A);
+	    
+        p_monitorCompRef.start(
+         f_imsIot_receive(
+            {mw_SipRequest(mdw_TP_IMS_5107_01_ic(?, mw_SipUrl_Host(v_EUT_A_Addr)))},
+            {},
+            {0, omit},
+            "TP_IMS_5107_01",
+            false,
+			p_checkMessage
+         )
+        );
+        p_monitorCompRef.done;
+	   } //function
+		
+    	/**
+    	  * @desc Starts monitor component behavior
+    	  * @param p_monitorCompRef Reference to monitor component
+    	  */
+	    function f_mtc_check_TP_IMS_5115_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mw_180Ringing_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5115_01",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+	    function f_mtc_check_TP_IMS_5115_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mdw_TP_IMS_5115_01_ic)},
+                {mw_SipResponse(mw_180Ringing_Base)},
+                {0, omit},
+                "TP_IMS_5115_01",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+		
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5115_02_gm(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+    
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+					{mw_SipResponse(mw_200OK_Base)},
+					{},
+					{0, omit},
+					"TP_IMS_5115_02",
+					false,
+					p_checkMessage
+    			)
+    		);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5115_02_ic(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage 
+        ) runs on ImsTestCoordinator {
+
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+					{mw_SipResponse(mdw_TP_IMS_5115_02_ic)},
+					{mw_SipResponse(mw_200OK_Base)},
+					{0, omit},
+					"TP_IMS_5115_02",
+					false,
+					p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+		}
+		
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		*/
+		function f_mtc_check_TP_IMS_5115_03_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+		   	    		
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+					{mw_SipResponse(mw_180Ringing_Base)},
+					{},
+					{0, omit},
+					"TP_IMS_5115_03",
+					false,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5115_03_ic(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipResponse(mdw_TP_IMS_5115_03_ic(mw_SIP_URI_Base, mw_TEL_URI_Base))},
+					{mw_SipResponse(mw_180Ringing_Base)},
+					{0, omit},
+					"TP_IMS_5115_03",
+					false,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+		
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5115_04_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+    
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+            		{mw_SipResponse(mw_200OK_Base)},
+            		{},
+            		{0, omit},
+            		"TP_IMS_5115_04",
+            		false,
+            		p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5115_04_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+        			{mw_SipResponse(mdw_TP_IMS_5115_04_ic(mw_SIP_URI_Base, mw_TEL_URI_Base))},
+        			{mw_SipResponse(mw_200OK_Base)},
+        			{0, omit},
+        			"TP_IMS_5115_04",
+        			false,
+        			p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+		
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5131_01_gm(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage 
+        ) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipResponse(mw_180Ringing_Base)},
+					{},
+					{0, omit},
+					"TP_IMS_5131_01",
+					false,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5131_01_ic(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage 
+        ) runs on ImsTestCoordinator {	
+		   	    		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+					{mw_SipResponse(mdw_TP_IMS_5131_01_ic)},
+					{mw_SipResponse(mw_180Ringing_Base)},
+					{0, omit},
+					"TP_IMS_5131_01",
+					false,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+		
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+        function f_mtc_check_TP_IMS_5131_02_gm(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage 
+        ) runs on ImsTestCoordinator {
+    
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+            		{mw_SipResponse(mw_200OK_Base)},
+            		{},
+            		{0, omit},
+            		"TP_IMS_5131_02",
+            		false,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+        function f_mtc_check_TP_IMS_5131_02_ic(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage 
+        ) runs on ImsTestCoordinator {
+
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+        			{mw_SipResponse(mdw_TP_IMS_5131_02_ic)},
+        			{mw_SipResponse(mw_200OK_Base)},
+        			{0, omit},
+        			"TP_IMS_5131_02",
+        			false,
+					p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+} // group
+
+group checksTC_IMS_CALL_0001F {
+
+/*functions already used in test TC_IMS_CALL_0001
+ * f_mtc_check_TP_IMS_5097_01_gm 
+ * f_mtc_check_TP_IMS_5097_01_ic
+ * f_mtc_check_TP_IMS_5107_01_gm 
+ * f_mtc_check_TP_IMS_5107_01_ic
+ * f_mtc_check_TP_IMS_5107_02_gm 
+ * f_mtc_check_TP_IMS_5107_02_ic
+ * f_mtc_check_TP_IMS_5115_01_gm 
+ * f_mtc_check_TP_IMS_5115_01_ic
+ * f_mtc_check_TP_IMS_5115_02_gm 
+ * f_mtc_check_TP_IMS_5115_02_ic
+ * f_mtc_check_TP_IMS_5131_01_gm 
+ * f_mtc_check_TP_IMS_5131_01_ic
+ * f_mtc_check_TP_IMS_5131_02_gm 
+ * f_mtc_check_TP_IMS_5131_02_ic
+ * 
+*/
+} // group
+
+group checksTC_IMS_CALL_0002 {
+
+/*functions already used in test TC_IMS_CALL_0001
+ * f_mtc_check_TP_IMS_5097_01_gm 
+ * f_mtc_check_TP_IMS_5097_01_ic
+ * f_mtc_check_TP_IMS_5097_02_gm 
+ * f_mtc_check_TP_IMS_5097_02_ic
+ * f_mtc_check_TP_IMS_5107_01_gm 
+ * f_mtc_check_TP_IMS_5107_01_ic
+ * f_mtc_check_TP_IMS_5107_02_gm 
+ * f_mtc_check_TP_IMS_5107_02_ic
+ * f_mtc_check_TP_IMS_5115_01_gm 
+ * f_mtc_check_TP_IMS_5115_01_ic
+ * f_mtc_check_TP_IMS_5115_02_gm 
+ * f_mtc_check_TP_IMS_5115_02_ic
+ * f_mtc_check_TP_IMS_5115_03_gm 
+ * f_mtc_check_TP_IMS_5115_03_ic
+ * f_mtc_check_TP_IMS_5115_04_gm 
+ * f_mtc_check_TP_IMS_5115_04_ic
+ * f_mtc_check_TP_IMS_5131_01_gm 
+ * f_mtc_check_TP_IMS_5131_01_ic
+ * f_mtc_check_TP_IMS_5131_02_gm 
+ * f_mtc_check_TP_IMS_5131_02_ic
+ * 
+*/
+} // group
+
+group checksTC_IMS_CALL_0003 {	    
+    	
+    	/**
+    	  * @desc Starts monitor component behavior 
+    	  * @param p_monitorCompRef Reference to monitor component
+    	  */
+		function f_mtc_check_TP_IMS_5108_05_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5108_05",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5108_05_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5108_05",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+			
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipResponse(mw_404NotFound_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5108_05",
+				false,
+				false
+			 )
+			);
+			p_monitorCompRef.done;
+			
+		} //function
+
+} // group
+
+group checksTC_IMS_CALL_0004 {	    
+    	
+    	/**
+    	  * @desc Starts monitor component behavior 
+    	  * @param p_monitorCompRef Reference to monitor component
+    	  */
+		function f_mtc_check_TP_IMS_5132_01_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5132_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5132_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5132_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+			
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipResponse(mdw_404Or604NotFound_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5132_01",
+				false,
+				false
+			 )
+			);
+			p_monitorCompRef.done;
+			
+		} //function
+
+} // group
+
+group checksTC_IMS_CALL_0005 {	    
+    	
+    	/**
+    	  * @desc Starts monitor component behavior 
+    	  * @param p_monitorCompRef Reference to monitor component
+    	  */
+		function f_mtc_check_TP_IMS_5133_01_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5133_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5133_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5133_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+			
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipResponse(mdw_4XX_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5133_01",
+				false,
+				false
+			 )
+			);
+			p_monitorCompRef.done;
+			
+		} //function
+
+} // group
+
+group checksTC_IMS_CALL_0006 {	    
+    	
+    	/**
+    	  * @desc Starts monitor component behavior 
+    	  * @param p_monitorCompRef Reference to monitor component
+    	  */
+		function f_mtc_check_TP_IMS_5109_01_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5109_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5109_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5109_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+			
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipResponse(mdw_408Or5XX_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5109_01",
+				false,
+				false
+			 )
+			);
+			p_monitorCompRef.done;
+			
+		} //function
+
+} // group
+
+group checksTC_IMS_CALL_0007 {
+
+		
+		/**
+    	  * @desc Starts monitor component behavior
+    	  * @param p_monitorCompRef Reference to monitor component
+		  */
+    	function f_mtc_check_TP_IMS_5055_01_gm(
+    		ImsInterfaceMonitor p_monitorCompRef,
+    		boolean p_checkMessage 
+    	) runs on ImsTestCoordinator {
+		   	    		
+    		p_monitorCompRef.start(
+    		 f_imsIot_receive(
+    			{mw_SipResponse(mw_180Ringing_Base)},
+    			{},
+    			{0, omit},
+    			"TP_IMS_5055_01",
+    			false,
+    			p_checkMessage
+    		 )
+    		);
+    		p_monitorCompRef.done;
+		}
+	    
+	    /**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+    	function f_mtc_check_TP_IMS_5055_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+    	) runs on ImsTestCoordinator {
+    		var template SipUrl v_pcscfEutAUrl := mw_SipUrl_Host(f_GetEUTPcscfAddress(PX_EUT_A));
+			var ImsUserInfo v_user := f_getAnyValidUser(PX_EUT_A);
+			var template SipUrl v_UserEutAUrl := mw_SipUrl_Host(v_user.domain);
+    		   	    		
+    		p_monitorCompRef.start(
+    		 f_imsIot_receive(
+    			{mw_SipResponse(mdw_TP_IMS_5055_01_ic(v_pcscfEutAUrl, v_UserEutAUrl))},
+    			{mw_SipResponse(mw_180Ringing_Base)},
+    			{0, omit},
+    			"TP_IMS_5055_01",
+    			false,
+    			p_checkMessage
+    			)
+    		 );
+    		p_monitorCompRef.done;
+    	}
+		
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */		
+		function f_mtc_check_TP_IMS_5055_02_gm(
+    		ImsInterfaceMonitor p_monitorCompRef,
+    		boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+            
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipResponse(mw_200OK_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5055_02",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+        	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5055_02_ic(
+    		ImsInterfaceMonitor p_monitorCompRef,
+    		boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+    		var template SipUrl v_pcscfEutAUrl := mw_SipUrl_Host(f_GetEUTPcscfAddress(PX_EUT_A));
+			var ImsUserInfo v_user := f_getAnyValidUser(PX_EUT_A);
+			var template SipUrl v_UserEutAUrl := mw_SipUrl_Host(v_user.domain);
+
+    		p_monitorCompRef.start(
+    		 f_imsIot_receive(
+    			{mw_SipResponse(mdw_TP_IMS_5055_02_ic(v_pcscfEutAUrl, v_UserEutAUrl))},
+    			{mw_SipResponse(mw_200OK_Base)},
+    			{0, omit},
+    			"TP_IMS_5055_02",
+    			false,
+    			p_checkMessage
+    		 )
+    		);
+    		p_monitorCompRef.done;
+		}
+								    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5067_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5067_01",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5067_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator  {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5067_01_ic)},
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {0, omit},
+                "TP_IMS_5067_01",
+                true,	//NOTE: later check in 5108_01 of same icid value
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+    	/**
+		  * @desc Starts monitor component behavior for TP_IMS_5070_01
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+    	function f_mtc_check_TP_IMS_5070_01_ic(
+    		ImsInterfaceMonitor p_monitorCompRef,
+    		boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+       
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    			{mw_SipRequest(mw_INVITE_Request_Base)},
+    			{},
+    			{0, omit},
+    			"TP_IMS_5070_01",
+    			false,
+    			p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+    		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+				{mw_SipResponse(mw_100Trying_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5070_01",
+				false,
+				false
+				)
+			);
+			p_monitorCompRef.done;
+       
+    	}
+	    
+		/**
+          * @desc Starts monitor component behavior for TP_IMS_5108_01
+          * @param p_monitorCompRef Reference to monitor component
+          */
+		function f_mtc_check_TP_IMS_5108_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+			var template SipUrl v_SCSCF_IMS_B := mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_B)); 
+			var SemicolonParam_List p_paramList;
+			var GenericParam p_param;
+			var SipMessage v_sip := {request := valueof(m_INVITE_Dummy)};
+   
+						
+   
+			f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); //NOTE: icid value from 5067_01
+log("### f_mtc_check_TP_IMS_5108_01_ic: v_sip=", v_sip.request.msgHeader.pChargingVector);
+			if(ispresent(v_sip.request.msgHeader.pChargingVector)) {
+				 if(ispresent(v_sip.request.msgHeader.pChargingVector.chargeParams))  {
+log("### f_mtc_check_TP_IMS_5108_01_ic: then");
+    			p_paramList := v_sip.request.msgHeader.pChargingVector.chargeParams;
+log("### f_mtc_check_TP_IMS_5108_01_ic: p_paramList=", p_paramList);
+    			for(var integer i := 0; i < lengthof(p_paramList); i:= i+1) {
+    					if(p_paramList[i].id == "icid-value") {
+log("### f_mtc_check_TP_IMS_5108_01_ic: find param=", p_paramList[i]);
+    						p_param := p_paramList[i];
+    						break;
+    					}
+    				}
+    			}
+			}
+log("### f_mtc_check_TP_IMS_5108_01_ic: start");
+
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5108_01_ic(v_SCSCF_IMS_B, p_param))},//pass criteria
+				{
+				mw_SipRequest(mdw_TP_IMS_5108_01_f_ic), //fail criteria
+				mw_SipRequest(mw_INVITE_Request_Base)	//fail criteria
+				},
+				{0, omit},
+				"TP_IMS_5108_01",
+				false,
+				p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+   
+		}
+								    
+		/**
+          * @desc Starts monitor component behavior 
+          * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5301_01_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_BYE_Request_Base(*))},
+				{},
+				{0, omit},
+				"TP_IMS_5301_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+          * @desc Starts monitor component behavior
+          * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5301_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			var template SipUrl v_SCSCF_IMS_A := mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_A));
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5301_01_ic(?, v_SCSCF_IMS_A))},
+				{mw_SipRequest(mw_BYE_Request_Base(?))},
+				{0, omit},
+				"TP_IMS_5301_01",
+				false,	
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+} // group
+
+group checksTC_IMS_CALL_0008 {
+	    
+		/**
+	* @desc Starts monitor component behavior
+	* @param p_monitorCompRef Reference to monitor component
+	*/
+		function f_mtc_check_TP_IMS_5081_01_ic(
+            ImsInterfaceMonitor p_monitorCompRef,
+            boolean p_checkMessage 
+        ) runs on ImsTestCoordinator {
+           	    		
+        p_monitorCompRef.start(
+         f_imsIot_receive(
+        	{mw_SipRequest(mw_INVITE_Request_Base)},
+        	{},
+        	{0, omit},
+        	"TP_IMS_5081_01",
+        	false,
+			p_checkMessage
+        	)
+         );
+        p_monitorCompRef.done;
+        			
+        p_monitorCompRef.start(
+		 f_imsIot_receive(
+			{mw_SipResponse(mw_100Trying_Base)},
+			{},
+			{0, omit},
+			"TP_IMS_5081_01",
+			false,
+			false
+			)
+		 );
+        p_monitorCompRef.done;
+		}
+		
+		/**
+		* @desc Starts monitor component behavior
+		* @param p_monitorCompRef Reference to monitor component
+		*/		
+		function f_mtc_check_TP_IMS_5082_01_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage,
+			integer p_skipCount
+		) runs on ImsTestCoordinator {
+			var template SkipType v_skip := {0, omit};
+	    	
+			if(p_skipCount > 0) {
+				v_skip := {1, mw_SipResponse(mw_200OK_Base)};
+			}
+			
+    		p_monitorCompRef.start(
+    		 f_imsIot_receive(
+    			{mw_SipResponse(mw_200OK_Base)},
+    			{},
+				v_skip,
+    			"TP_IMS_5082_01",
+    			false,
+    			p_checkMessage
+    		 )
+    		);
+    		p_monitorCompRef.done;
+    		}
+        	    
+		/**
+		* @desc Starts monitor component behavior
+		* @param p_monitorCompRef Reference to monitor component
+		*/
+		function f_mtc_check_TP_IMS_5082_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage,
+			integer p_skipCount
+		) runs on ImsTestCoordinator {
+			var template SkipType v_skip := {0, omit};
+	    	
+			if(p_skipCount > 0) {
+				v_skip := {p_skipCount, mw_SipResponse(mw_200OK_Base)};
+			}	
+			
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipResponse(mdw_TP_IMS_5082_01_ic)},//TODO check updated access-network-charging-info
+				{mw_SipResponse(mw_200OK_Base)},
+				v_skip,
+				"TP_IMS_5082_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+
+		
+		/**
+    	  * @desc Starts monitor component behavior
+    	  * @param p_monitorCompRef Reference to monitor component
+		  */
+    	function f_mtc_check_TP_IMS_5120_01_gm(
+    		ImsInterfaceMonitor p_monitorCompRef,
+    		boolean p_checkMessage,
+			integer p_skipCount
+    	) runs on ImsTestCoordinator {
+    		var template SkipType v_skip := {0, omit};
+	    	
+			if(p_skipCount > 0) {
+				v_skip := {1, mw_SipRequest(mw_INVITE_Request_Base)};
+			}
+		   	    		
+    		p_monitorCompRef.start(
+    		 f_imsIot_receive(
+    			{mw_SipRequest(mw_INVITE_Request_Base)},
+    			{},
+				v_skip,
+    			"TP_IMS_5120_01",
+    			false,
+    			p_checkMessage
+    		 )
+    		);
+    		p_monitorCompRef.done;
+		}
+	    
+	    /**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+    	function f_mtc_check_TP_IMS_5120_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage,
+			integer p_skipCount
+    	) runs on ImsTestCoordinator {
+    		var template SipUrl v_scscfEutBUrl := mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_B));
+			var template SkipType v_skip := {0, omit};
+	    	
+			if(p_skipCount > 0) {
+				v_skip := {p_skipCount, mw_SipRequest(mw_INVITE_Request_Base)};
+			}
+									
+    		//INVITE from IMS_A to IMS_B   	    		
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{},
+				v_skip,
+				"TP_IMS_5120_01",
+				false,
+				false
+				)
+			 );
+			p_monitorCompRef.done;
+			
+			// 100 Trying from IMS_B to IMS_A
+			p_monitorCompRef.start(
+    		 f_imsIot_receive(
+    			{mw_SipResponse(mw_100Trying_Base)},
+    			{},
+    			{0, omit},
+    			"TP_IMS_5120_01",
+    			false,
+    			false
+    			)
+    		 );
+			p_monitorCompRef.done;
+    		
+			// INVITE from IMS_B to IMS_A 
+    		p_monitorCompRef.start(
+    		 f_imsIot_receive(
+    			{mw_SipRequest(mdw_TP_IMS_5120_01_ic(v_scscfEutBUrl))},
+    			{},
+    			{0, omit},
+    			"TP_IMS_5120_01",
+    			false,
+    			p_checkMessage
+    			)
+    		 );
+    		p_monitorCompRef.done;
+    	}
+	    
+} // group
+
+group checksTC_IMS_CALL_0009 {
+
+								    
+		/**
+          * @desc Starts monitor component behavior 
+          * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5052_01_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_BYE_Request_Base(*))},
+				{},
+				{0, omit},
+				"TP_IMS_5052_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+          * @desc Starts monitor component behavior
+          * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5052_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			var template SipUrl v_PCSCF_IMS_A := mw_SipUrl_Host(f_GetEUTPcscfAddress(PX_EUT_A));
+			var template RecordRoute p_recordRoute := omit;
+			var SipMessage v_sip := {request := valueof(m_ACK_Dummy)};
+			
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+				{mw_SipRequest(mw_ACK_Request_Base(?))},
+				{},
+				{1, mw_SipRequest(mw_ACK_Request_Base(?))},
+				"TP_IMS_5052_01",
+				true,	
+				false
+				)
+			);
+			p_monitorCompRef.done;
+			
+			// get Record-route header from prev ACK
+			f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); 
+			if(ispresent(v_sip.request.msgHeader.recordRoute)){
+				p_recordRoute := v_sip.request.msgHeader.recordRoute;
+			}
+			
+			
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5052_01_p_ic(?,p_recordRoute))},
+				{
+					mw_SipRequest(mdw_TP_IMS_5052_01_f_ic(?, v_PCSCF_IMS_A)),
+					mw_SipRequest(mw_BYE_Request_Base(?))
+				},
+				{0, omit},
+				"TP_IMS_5052_01",
+				false,	
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+} // group
+
+group checksTC_IMS_CALL_0010 {
+	    	
+		/**
+    	  * @desc Starts monitor component behavior
+    	  * @param p_monitorCompRef Reference to monitor component
+		  */
+    	function f_mtc_check_TP_IMS_5048_01_gm(
+    		ImsInterfaceMonitor p_monitorCompRef,
+    		boolean p_checkMessage,
+			integer p_skipCount
+    	) runs on ImsTestCoordinator {
+    		var template SkipType v_skip := {0, omit};
+	    	
+			if(p_skipCount > 0) {
+				v_skip := {1, mw_SipRequest(mw_INVITE_Request_Base)};
+			}
+		   	    		
+    		p_monitorCompRef.start(
+    		 f_imsIot_receive(
+    			{mw_SipRequest(mw_INVITE_Request_Base)},
+    			{},
+				v_skip,
+    			"TP_IMS_5048_01",
+    			false,
+    			p_checkMessage
+    		 )
+    		);
+    		p_monitorCompRef.done;
+		}
+	    
+	    /**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+    	function f_mtc_check_TP_IMS_5048_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage,
+			integer p_skipCount
+    	) runs on ImsTestCoordinator {
+    		var template SipUrl v_pcscfEutAUrl := (mw_SipUrl_Host(f_GetEUTPcscfAddress(PX_EUT_A)),
+    														mw_SipUrl_Host(f_GetEUTPcscfIpAddress(PX_EUT_A)));
+			var template SkipType v_skip := {0, omit};
+	    	
+			if(p_skipCount > 0) {
+				v_skip := {p_skipCount, mw_SipRequest(mw_INVITE_Request_Base)};
+			}
+    		
+			// INVITE from IMS_A to IMS_B 
+    		p_monitorCompRef.start(
+    		 f_imsIot_receive(
+    			{mw_SipRequest(mdw_TP_IMS_5048_01_ic(v_pcscfEutAUrl))},
+    			{},
+				v_skip,
+    			"TP_IMS_5048_01",
+    			false,
+    			p_checkMessage
+    			)
+    		 );
+    		p_monitorCompRef.done;
+    	}
+	    
+	    /**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+    	function f_mtc_check_TP_IMS_5080_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+    	) runs on ImsTestCoordinator {
+    		
+			// INVITE from IMS_A to IMS_B 
+    		p_monitorCompRef.start(
+    		 f_imsIot_receive(
+    			{mw_SipRequest(mdw_TP_IMS_5080_01_ic)},
+    			{},
+    			{0, omit},
+    			"TP_IMS_5080_01",
+    			false,
+    			p_checkMessage
+    			)
+    		 );
+    		p_monitorCompRef.done;
+    	}
+	    
+} // group
+
+group checksTC_IMS_CALL_0013 {	    
+    	
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5072_02_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5072_02_gm(?))},
+				{},
+				{0, omit},
+				"TP_IMS_5072_02",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+			
+		} //function
+
+} // group
+
+group checksTC_IMS_CALL_0014 {	    
+    	
+    
+    	/**
+    	  * @desc Starts monitor component behavior
+    	  * @param p_monitorCompRef Reference to monitor component
+    	  */
+    	function f_mtc_check_TP_IMS_5107_03_gm(
+    		ImsInterfaceMonitor p_monitorCompRef,
+    		boolean p_checkMessage
+    	) runs on ImsTestCoordinator  {
+    		
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    			{mw_SipRequest(mw_CANCEL_Request_Base(?))},
+    			{},
+    			{0, omit},
+    			"TP_IMS_5107_03",
+    			false,
+    			p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+    			
+    	} //function
+
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5107_03_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			var template SipUrl v_scscfImsAUrl := mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_A));
+			
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5107_03_ic(?, v_scscfImsAUrl))},
+				{},
+				{0, omit},
+				"TP_IMS_5107_03",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+			
+		} //function
+
+} // group
+
+group checksTC_IMS_CALL_0016 {	
+		/**
+		* @desc Starts monitor component behavior
+		* @param p_monitorCompRef Reference to monitor component
+		*/
+		function f_mtc_check_TP_IMS_5139_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			var template SipUrl v_scscfImsAUrl := mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_A));
+			var SipMessage v_sip := {request := valueof(m_INVITE_Dummy)};
+						var SipUrl v_UE_URI;
+			var To  v_to; 
+			var From v_from;
+			var CallId v_callId;
+			var CSeq v_cSeq;
+			var Route v_route;
+			
+			
+			p_monitorCompRef.start(
+    			f_imsIot_receive(
+    			{mw_SipRequest(mw_INVITE_Request_Base)},
+    			{},
+    			{0, omit},
+    			"TP_IMS_5139_01",
+    			true,
+    			p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+    		
+			f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+			// Get Contact Header from INVITE
+
+			if(ischosen(v_sip.request)) {
+				v_from := valueof(v_sip.request.msgHeader.fromField);		
+				v_callId := valueof(v_sip.request.msgHeader.callId);
+			}
+    
+    		p_monitorCompRef.start(
+    			f_imsIot_receive(
+    			{mw_SipResponse(mw_200OK_Base)},
+    			{},
+    			{0, omit},
+    			"TP_IMS_5139_01",
+    			true,
+    			p_checkMessage
+    			)
+    		);
+    		p_monitorCompRef.done;
+			
+			f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+			// Get Contact Header from 200-OK response
+  			
+    		if(ischosen(v_sip.response)) {
+    			if(ispresent(v_sip.response.msgHeader.contact)) {
+    				v_UE_URI := f_getContactAddr(v_sip.response.msgHeader.contact);
+    			}
+    			v_to := valueof(v_sip.response.msgHeader.toField);		
+			}
+		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5139_01_ic(v_callId, v_UE_URI, v_to, v_from, ?, ?))},
+				{},
+				{0, omit},
+				"TP_IMS_5139_01",
+				false,
+				p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+			
+		} //function
+} // group
+
+group checksTC_IMS_CALL_0024 {
+								    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5135_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5135_01",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5135_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator  {
+		   var template SipUrl v_ibcfEutAUrl := mw_SipUrl_Host(f_GetEUTIbcfAddress(PX_EUT_A));
+	    	
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5135_01_ic(v_ibcfEutAUrl))},
+                {},
+                {0, omit},
+                "TP_IMS_5135_01",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+		/**
+          * @desc Starts monitor component behavior
+          * @param p_monitorCompRef Reference to monitor component
+          */
+		function f_mtc_check_TP_IMS_5137_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			var template SipUrl v_ibcfEutAUrl := mw_SipUrl_Host(f_GetEUTIbcfAddress(PX_EUT_A));
+	    	
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5137_01_ic(v_ibcfEutAUrl))},
+				{},
+				{0, omit},
+				"TP_IMS_5137_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+								    
+		/**
+          * @desc Starts monitor component behavior 
+          * @param p_monitorCompRef Reference to monitor component
+          */
+		function f_mtc_check_TP_IMS_5404_01_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5404_01_gm)},
+				{},
+				{0, omit},
+				"TP_IMS_5404_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+          * @desc Starts monitor component behavior
+          * @param p_monitorCompRef Reference to monitor component
+          */
+		function f_mtc_check_TP_IMS_5404_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			    	
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5404_01_ic)},
+				{},
+				{0, omit},
+				"TP_IMS_5404_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+    	  * @desc Starts monitor component behavior for TP_IMS_5414_01
+    	  * @param p_monitorCompRef Reference to monitor component
+    	  */
+		function f_mtc_check_TP_IMS_5414_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+       
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5414_01",
+				false,
+				p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+    		
+            p_monitorCompRef.start(
+            	f_imsIot_receive(
+            	{mw_SipResponse(mw_100Trying_Base)},
+            	{},
+            	{0, omit},
+            	"TP_IMS_5414_01",
+            	false,
+            	false
+            	)
+            );
+            p_monitorCompRef.done;
+       
+		}
+		
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5137_02_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipResponse(mw_180Ringing_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5137_02",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+    	  * @desc Starts monitor component behavior
+    	  * @param p_monitorCompRef Reference to monitor component
+    	  */
+		function f_mtc_check_TP_IMS_5137_02_ic(
+    		ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+    		   	    		
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipResponse(mdw_TP_IMS_5137_02_ic)},
+				{},
+				{0, omit},
+				"TP_IMS_5137_02",
+				false,
+				p_checkMessage
+				)
+			 );
+			p_monitorCompRef.done;
+		}
+
+        		
+        /**
+    	  * @desc Starts monitor component behavior
+    	  * @param p_monitorCompRef Reference to monitor component
+    	  */		
+        function f_mtc_check_TP_IMS_5137_03_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+        ) runs on ImsTestCoordinator {
+                    
+        p_monitorCompRef.start(
+        	f_imsIot_receive(
+        	{mw_SipResponse(mw_200OK_Base)},
+        	{},
+        	{0, omit},
+        	"TP_IMS_5137_03",
+        	false,
+        	p_checkMessage
+        	)
+        );
+        p_monitorCompRef.done;
+        }
+                	    
+        /**
+        	* @desc Starts monitor component behavior
+        	* @param p_monitorCompRef Reference to monitor component
+        	*/
+        function f_mtc_check_TP_IMS_5137_03_ic(
+        			ImsInterfaceMonitor p_monitorCompRef,
+        			boolean p_checkMessage 
+        ) runs on ImsTestCoordinator {
+            			
+        			p_monitorCompRef.start(
+        				f_imsIot_receive(
+        				{mw_SipResponse(mdw_TP_IMS_5137_03_ic)},
+        				{},
+        				{0, omit},
+        				"TP_IMS_5137_03",
+        				false,
+        				p_checkMessage
+        				)
+        			);
+        			p_monitorCompRef.done;
+        }
+
+		/**
+        * @desc Starts monitor component behavior 
+        * @param p_monitorCompRef Reference to monitor component
+		*/
+		function f_mtc_check_TP_IMS_5408_01_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_ACK_Request_Base(?))},
+				{},
+				{0, omit},
+				"TP_IMS_5408_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+
+		/**
+          * @desc Starts monitor component behavior
+          * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5408_01_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+		
+			var template SipUrl v_ibcfEutAUrl := mw_SipUrl_Host(f_GetEUTIbcfAddress(PX_EUT_A));    
+	    	    
+    		p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5408_01_ic(?, v_ibcfEutAUrl))},
+				{},
+				{0, omit},
+				"TP_IMS_5408_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+								    
+		/**
+          * @desc Starts monitor component behavior 
+          * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5408_03_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_BYE_Request_Base(*))},
+				{},
+				{0, omit},
+				"TP_IMS_5408_03",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+          * @desc Starts monitor component behavior
+          * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5408_03_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			var template SipUrl v_ibcfEutAUrl := mw_SipUrl_Host(f_GetEUTIbcfAddress(PX_EUT_A));
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5408_03_ic(?, v_ibcfEutAUrl))},
+				{},
+				{0, omit},
+				"TP_IMS_5408_03",
+				false,	
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+} // group
+
+group checksTC_IMS_CALL_0025 {
+								    
+		/**
+		  * @desc Starts monitor component behavior 
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5408_02_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator {
+		   	    		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+				{mw_SipRequest(mw_CANCEL_Request_Base(*))},
+				{},
+				{0, omit},
+				"TP_IMS_5408_02",
+				false,
+				p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5408_02_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			var template SipUrl v_ibcfEutAUrl := mw_SipUrl_Host(f_GetEUTIbcfAddress(PX_EUT_A));
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5408_02_ic(?, v_ibcfEutAUrl))},
+				{},
+				{0, omit},
+				"TP_IMS_5408_02",
+				false,	
+				p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+} // group
+
+group checksTC_IMS_CALL_0026 {
+								    
+		/**
+		  * @desc Starts monitor component behavior 
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5408_04_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage,
+			integer p_skipCount
+		) runs on ImsTestCoordinator {
+		   	    	
+			var template SkipType v_skip := {0, omit};
+	    	
+			if(p_skipCount > 0) {
+				v_skip := {p_skipCount, mw_SipRequest(mw_INVITE_Request_Base)};
+			}
+		   	    		
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{},
+				v_skip,
+				"TP_IMS_5408_04",
+				false,
+				p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5408_04_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage,
+			integer p_skipCount
+		) runs on ImsTestCoordinator  {
+			var template SipUrl v_ibcfEutAUrl := mw_SipUrl_Host(f_GetEUTIbcfAddress(PX_EUT_A));
+			var template SkipType v_skip := {0, omit};
+	    	
+			if(p_skipCount > 0) {
+				v_skip := {p_skipCount, mw_SipRequest(mw_INVITE_Request_Base)};
+			}
+			
+			p_monitorCompRef.start(
+				f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5408_04_ic(v_ibcfEutAUrl))},
+				{},
+				v_skip,
+				"TP_IMS_5408_04",
+				false,	
+				p_checkMessage
+				)
+			);
+			p_monitorCompRef.done;
+		}
+	    
+} // group
+	
+	
+group checksTC_IMS_SS_0001 {
+
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5310_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			integer p_skipCount
+	    ) runs on ImsTestCoordinator  {
+	       
+			var template SkipType v_skip := {0, omit};
+	    	
+			if(p_skipCount > 0) {
+				v_skip := {p_skipCount, mw_SipRequest(mw_INVITE_Request_Base)};
+			}
+												
+            p_monitorCompRef.start(
+             f_imsIot_receive(
+                 {mw_SipRequest(mdw_TP_IMS_5310_01_gm)},
+                 {},
+                 v_skip,
+                 "TP_IMS_5310_01",
+                 false,
+                 false
+             )
+   			);
+   			p_monitorCompRef.done;
+	    }
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5310_01_isc(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator  {
+			
+            p_monitorCompRef.start(
+             f_imsIot_receive(
+            	{mw_SipRequest(mdw_TP_IMS_5310_01_isc)},
+            	{},
+				{0, omit},
+            	"TP_IMS_5310_01",
+            	false,
+            	false
+             )
+            );
+            p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5312_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	integer p_skipCount
+	    ) runs on ImsTestCoordinator  {
+	    	
+	    	var template SkipType v_skip := {0, omit};
+
+			if(p_skipCount > 0) {
+				v_skip := {p_skipCount, mw_SipResponse(mw_Response_Base(c_statusLine200, ?, ?))};
+			}
+			
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mdw_TP_IMS_5312_01_ic)},
+                {},
+				v_skip,
+                "mdw_TP_IMS_5312_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5312_01_isc(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator  {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mdw_TP_IMS_5312_01_isc)},
+                {},
+                {0, omit},
+                "TP_IMS_5312_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+} // group
+
+
+group checksTC_IMS_SS_0002 {
+	
+	// f_mtc_check_TP_IMS_5310_01_gm already used in test TC_IMS_SS_0001	    
+	// f_mtc_check_TP_IMS_5310_01_isc already used in test TC_IMS_SS_0001	
+	// f_mtc_check_TP_IMS_5312_01_ic already used in test TC_IMS_SS_0001	    
+	// f_mtc_check_TP_IMS_5312_01_isc already used in test TC_IMS_SS_0001	    
+}
+
+
+group checksTC_IMS_SS_0003 {
+	
+	// f_mtc_check_TP_IMS_5097_02_gm already used in test TC_IMS_CALL_0001
+	// f_mtc_check_TP_IMS_5097_02_ic already used in test TC_IMS_CALL_0001
+
+		/**
+          * @desc Starts monitor component behavior
+          * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5108_03_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5108_03",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+
+    	/**
+    	* @desc Starts monitor component behavior
+    	* @param p_monitorCompRef Reference to monitor component
+    	*/
+    	function f_mtc_check_TP_IMS_5108_03_isc(
+    		ImsInterfaceMonitor p_monitorCompRef,
+    		boolean p_checkMessage
+    	) runs on ImsTestCoordinator  {
+			
+			var template SipUrl v_AS_IMS_B := (mw_SipUrl_Host(f_GetEUTASServerAddress(PX_EUT_B)), 
+														mw_SipUrl_Host(f_GetEUTASServerIpAddress(PX_EUT_B)));
+			var template SipUrl v_SCSCF_IMS_B := (mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_B)), 
+															mw_SipUrl_Host(f_GetEUTScscfIpAddress(PX_EUT_B)));
+    			
+    		p_monitorCompRef.start(
+    		 f_imsIot_receive(
+    			{mw_SipRequest(mdw_TP_IMS_5108_03_isc(v_AS_IMS_B, v_SCSCF_IMS_B))},
+    			{mw_SipRequest(mdw_TP_IMS_5108_03_f_isc)},
+    			{0, omit},
+    			"TP_IMS_5108_03",
+    			false,
+    			p_checkMessage
+    		 )
+    		);
+    		p_monitorCompRef.done;
+    	}
+		
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5115_08_isc(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+    
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipResponse(mw_200OK_Base)},//check 200OK from ASB->IMSB
+				{},
+				{1, mw_SipResponse(mw_200OK_Base)},//skip 200OK from IMSB->ASB
+				"TP_IMS_5115_08",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5115_08_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage,
+			integer p_skipCount
+		) runs on ImsTestCoordinator {
+			
+			var template SkipType v_skip := {0, omit};
+
+    		if(p_skipCount > 0) {
+    			v_skip := {p_skipCount, mw_SipResponse(mw_Response_Base(c_statusLine200, ?, ?))};
+    		}
+
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipResponse(mdw_TP_IMS_5115_08_ic)},
+				{},
+				v_skip,
+				"TP_IMS_5115_08",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+	}
+}
+
+group checksTC_IMS_SS_0004 {
+	
+	// f_mtc_check_TP_IMS_5108_03_ic already used in test TC_IMS_SS_0003	    
+	// f_mtc_check_TP_IMS_5108_03_isc already used in test TC_IMS_SS_0003	
+	// f_mtc_check_TP_IMS_5115_08_ic already used in test TC_IMS_SS_0003	    
+	// f_mtc_check_TP_IMS_5115_08_isc already used in test TC_IMS_SS_0003	    
+}
+group checksTC_IMS_SS_0005 {
+	
+// f_mtc_check_TP_IMS_5108_03_ic already used in test TC_IMS_SS_0003
+// f_mtc_check_TP_IMS_5108_03_isc already used in test TC_IMS_SS_0003
+
+    	/**
+    	  * @desc Starts monitor component behavior
+    	  * @param p_monitorCompRef Reference to monitor component
+    	  */
+    	function f_mtc_check_TP_IMS_5313_01_ic(
+        	ImsInterfaceMonitor p_monitorCompRef,
+        	boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+    			{mw_SipResponse(mdw_TP_IMS_5313_01_ic)},
+    			{},
+    			{0, omit},
+    			"TP_IMS_5313_01",
+    			false,
+    			p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5313_01_isc(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+			
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipResponse(mdw_TP_IMS_5313_01_isc)},
+				{},
+				{0, omit},
+				"TP_IMS_5313_01",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+}//end group checksTC_IMS_SS_0005
+
+group checksTC_IMS_SS_0006 {
+	    
+		/**
+    	  * @desc Starts monitor component behavior
+    	  * @param p_monitorCompRef Reference to monitor component
+    	  */
+		function f_mtc_check_TP_IMS_5097_09_ic(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+		
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mw_INVITE_Request_Base)},
+				{},
+				{0, omit},
+				"TP_IMS_5097_09",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		} //function
+	    
+		/**
+    	  * @desc Starts monitor component behavior
+    	  * @param p_monitorCompRef Reference to monitor component
+    	  */
+		function f_mtc_check_TP_IMS_5097_09_isc(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+		) runs on ImsTestCoordinator  {
+		
+			var template SipUrl v_AS_IMS_B := mw_SipUrl_Host(f_GetEUTASServerAddress(PX_EUT_B));
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipRequest(mdw_TP_IMS_5097_09_isc(v_AS_IMS_B))},
+				{mw_SipRequest(mdw_TP_IMS_5097_09_f_isc)},
+				{0, omit},
+				"TP_IMS_5097_09",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		} //function
+
+}//end group checksTC_IMS_SS_0006
+
+group checksTC_IMS_SS_0007 {
+	
+	// f_mtc_check_TP_IMS_5097_01_gm already used in test TC_IMS_CALL_0001	    
+	// f_mtc_check_TP_IMS_5097_01_ic already used in test TC_IMS_CALL_0001	
+	// f_mtc_check_TP_IMS_5108_03_ic already used in test TC_IMS_SS_0003	    
+	// f_mtc_check_TP_IMS_5108_03_isc already used in test TC_IMS_SS_0003	
+	// f_mtc_check_TP_IMS_5115_08_ic already used in test TC_IMS_SS_0003	    
+	// f_mtc_check_TP_IMS_5115_08_isc already used in test TC_IMS_SS_0003
+	
+}//end group checksTC_IMS_SS_0007
+
+group checksTC_IMS_SS_0008 {	    
+	    /**
+		 * @desc Starts monitor component behavior 
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5046_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+		   	    		
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5046_01",
+                false,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5046_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage
+	    ) runs on ImsTestCoordinator  {
+		   var template SipUrl v_pcscfEutAUrl := mw_SipUrl_Host(f_GetEUTPcscfAddress(PX_EUT_A));
+		   var template SipUrl v_pcscfEutAIpUrl := mw_SipUrl_Host(f_GetEUTPcscfIpAddress(PX_EUT_A));
+			var ImsUserInfo v_user := f_getAnyValidUser(PX_EUT_B);
+			var template SipUrl v_UserEutBUrl := mw_SipUrl_Host(v_user.domain);
+		   var SipMessage v_sip := {request := valueof(m_INVITE_Dummy)};
+		   var Route v_Route;
+		   var template Route vt_pcscfRoute := {
+					fieldName := ROUTE_E,
+					routeBody := ({mw_routeBody(v_pcscfEutAUrl), *}, 
+										{mw_routeBody(v_pcscfEutAIpUrl), *} )
+									};
+	       var Via v_Via;
+	       var template Via vt_pcscfVia := {
+	       			fieldName := VIA_E,
+					viaBody := ({mw_ViaBody_interface(v_pcscfEutAUrl.hostPort), *},
+									{mw_ViaBody_interface(v_pcscfEutAIpUrl.hostPort), *} )
+								};
+								
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest((mdw_TP_IMS_5046_01_ic(v_pcscfEutAUrl, v_UserEutBUrl), 
+                					mdw_TP_IMS_5046_01_ic(v_pcscfEutAIpUrl, v_UserEutBUrl)))},
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {0, omit},
+                "TP_IMS_5046_01",
+                true,
+				p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+		   f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+		   if(ispresent(v_sip.request.msgHeader.route)) {
+		   	v_Route := v_sip.request.msgHeader.route;
+		   }
+		   //if(ispresent(v_sip.request.msgHeader.via)) {
+		   	v_Via := v_sip.request.msgHeader.via;
+		   //}
+			
+    		// Check Route header
+    	  if (match(v_Route, vt_pcscfRoute)) {
+			f_setIotVerdictFAIL("TP_IMS_5046_01");
+    		} 
+		   // Check Via header
+		   if (match(v_Via, vt_pcscfVia)) {
+	       } else {
+			f_setIotVerdictFAIL("TP_IMS_5046_01");
+		   }
+	    }
+
+	    /**
+		 * @desc Starts monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5110_01_isc(
+	    	ImsInterfaceMonitor p_monitorCompRef)
+	    runs on ImsTestCoordinator 
+	    {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mw_200OK_Base)},
+                {},
+                {1, mw_SipResponse(mw_200OK_Base)}, 
+                "TP_IMS_5110_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;		   
+	    }
+	    /**
+		 * @desc Starts monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5110_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef)
+	    runs on ImsTestCoordinator 
+	    {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mw_200OK_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5110_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;		   
+	    }
+
+
+} // group
+
+group checksTC_IMS_SS_0009 {
+}//end group checksTC_IMS_SS_0009
+
+group checksTC_IMS_SS_0010 {
+	
+    	/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+    	function f_mtc_check_TP_IMS_5308_01_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+    		   	    		
+    		p_monitorCompRef.start(
+    		 f_imsIot_receive(
+    			{mw_SipResponse(mdw_TP_IMS_5308_01_gm)},
+    			{},
+    			{0, omit},
+    			"TP_IMS_5308_01",
+    			false,
+    			p_checkMessage
+    		 )
+    		);
+    		p_monitorCompRef.done;
+    	}
+    	    
+    	/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+    	function f_mtc_check_TP_IMS_5308_01_isc(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {	
+    		   	    		
+    		p_monitorCompRef.start(
+    		 f_imsIot_receive(
+				{mw_SipResponse(mdw_TP_IMS_5308_01_isc)},
+				{mw_SipResponse(mw_180Ringing_Base)},
+				{0, omit},
+				"TP_IMS_5308_01",
+				false,
+				p_checkMessage
+    		 )
+    		);
+    		p_monitorCompRef.done;
+    	}
+		
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5308_02_gm(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+    
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipResponse(mdw_TP_IMS_5308_02_gm)},
+				{},
+				{0, omit},
+				"TP_IMS_5308_02",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}
+	    
+		/**
+		  * @desc Starts monitor component behavior
+		  * @param p_monitorCompRef Reference to monitor component
+		  */
+		function f_mtc_check_TP_IMS_5308_02_isc(
+			ImsInterfaceMonitor p_monitorCompRef,
+			boolean p_checkMessage 
+		) runs on ImsTestCoordinator {
+
+			p_monitorCompRef.start(
+			 f_imsIot_receive(
+				{mw_SipResponse(mdw_TP_IMS_5308_02_isc)},
+				{mw_SipResponse(mw_200OK_Base)},
+				{0, omit},
+				"TP_IMS_5308_02",
+				false,
+				p_checkMessage
+			 )
+			);
+			p_monitorCompRef.done;
+		}	
+	
+}//end group checksTC_IMS_SS_0010
+
+	group messagingChecks {
+		/**
+		 * @desc Starts monitor component behavior for TP_IMS_5097_05
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_05_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5097_05",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior for TP_IMS_5097_05
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_05_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+		   var charstring v_EUT_A_Addr := f_GetEUTScscfAddress(PX_EUT_A);
+           
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                { mw_SipRequest(mdw_TP_IMS_5097_05_p_ic(*)) },
+                {
+                	mw_SipRequest(mdw_TP_IMS_5097_05_f_ic(*)),
+					mw_SipRequest(mdw_TP_IMS_5097_05_f2_ic(*,mw_SipUrl_Host(v_EUT_A_Addr))), 
+                	mw_SipRequest(mw_MESSAGE_Request_Base(*))
+                },
+                {0, omit},
+                "TP_IMS_5097_05",
+                false,
+                true
+            )
+           );
+           p_monitorCompRef.done;
+           
+           
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5097_05_p_ic(*))},
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {0, omit},
+                "TP_IMS_5097_05",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5097_05
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_07_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5097_07",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+		 * @desc Starts monitor component behavior for TP_IMS_5097_07
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_07_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5097_07_ic(*,mw_SIP_URI_Base, mw_TEL_URI_Base))},
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {0, omit},
+                "TP_IMS_5097_07",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	      
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5097_08
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_08_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5097_08_gm(*))},
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {0, omit},
+                "TP_IMS_5097_08",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+		 * @desc Starts monitor component behavior for TP_IMS_5097_08
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5097_08_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5097_08_ic(*))},
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {0, omit},
+                "TP_IMS_5097_08",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5117_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5117_02_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mdw_2XX_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5117_02",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5117_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5117_02_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+           		{mw_SipResponse(mw_TP_IMS_5117_02_ic)},
+                {mw_SipResponse(mdw_2XX_Base)},
+                {0, omit},
+                "TP_IMS_5117_02",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5117_06
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5117_06_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mdw_2XX_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5117_06",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5117_06
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5117_06_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+           		{mw_SipResponse(mw_TP_IMS_5117_06_ic)},
+                {mw_SipResponse(mdw_2XX_Base)},
+                {0, omit},
+                "TP_IMS_5117_06",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5118_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5118_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mw_200OK_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5118_01",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5118_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5118_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+           		{mw_SipResponse(mw_TP_IMS_5118_01_ic)},
+                {mw_SipResponse(mw_200OK_Base)},
+                {0, omit},
+                "TP_IMS_5118_01",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }	
+		
+		 
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5108_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5108_02_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5108_02",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+		 * @desc Starts monitor component behavior for TP_IMS_5108_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5108_02_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+	       var template SipUrl v_SCSCF_IMS_B := mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_B)); 
+           var SemicolonParam_List p_paramList;
+           var GenericParam p_param;
+           var SipMessage v_sip := {request := valueof(m_INVITE_Dummy)};
+           
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5108_02a_ic(*))},
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {0, omit},
+                "TP_IMS_5108_02",
+                true,
+                true
+            )
+           );
+           p_monitorCompRef.done;
+           
+           f_getSipMsgFromMonitor(p_monitorCompRef, v_sip);
+           p_paramList := v_sip.request.msgHeader.pChargingVector.chargeParams;
+           for(var integer i := 0; i < lengthof(p_paramList); i:= i+1) {
+           		if(p_paramList[i].id == "icid-value") {
+           			p_param := p_paramList[i];
+           		}
+           }
+           
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {},
+                {
+                	mw_SipRequest(mdw_TP_IMS_5108_02b_f_ic(*)),
+                	mw_SipRequest(mw_MESSAGE_Request_Base(*))
+                },
+                {0, omit},
+                "TP_IMS_5108_02",
+                false,
+                true
+            )
+           );
+           p_monitorCompRef.done;
+           
+           
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {},
+                {
+                	mw_SipRequest(mdw_TP_IMS_5108_02b_p_ic(*, v_SCSCF_IMS_B, p_param)),
+                	mw_SipRequest(mw_MESSAGE_Request_Base(*))
+                },
+                {0, omit},
+                "TP_IMS_5108_02",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	 
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5050_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5050_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5050_01",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	
+	  
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5050_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5050_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	boolean p_checkMessage
+	    ) runs on ImsTestCoordinator {
+	    	var template SipUrl v_PCSCF_IMS_B := mw_SipUrl_Host(f_GetEUTPcscfAddress(PX_EUT_B)); 
+	    	var template SipUrl v_UE_A := mw_SipUrl_Host(f_GetEUTPublicId(PX_EUT_A)); 
+	    	
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+           		{mw_SipRequest(mdw_TP_IMS_5050_01_ic(*, v_PCSCF_IMS_B, v_UE_A))},
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {0, omit},
+                "TP_IMS_5050_01",
+                false,
+                p_checkMessage
+            )
+           );
+           p_monitorCompRef.done;
+	    }	
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5050_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5114_02_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+	    	
+	      p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5114_02",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;	
+	    }
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5050_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5114_02_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+	    	
+	      p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5114_02",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;	
+	    
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+           		{mw_SipResponse(mdw_4XX_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5114_02",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5108_06
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5108_06_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+	       p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5108_06",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5108_06
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5108_06_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+	    	
+	      p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_MESSAGE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5108_06",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;	
+	    
+           p_monitorCompRef.start(
+            f_imsIot_receive(
+           		{mw_SipResponse(mw_404NotFound_Base)},
+                {},
+                {0, omit},
+                "TP_IMS_5108_06",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	}
+	
+	group callChecks {
+		
+		
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5106_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5106_01_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	integer p_skipCount
+	    ) runs on ImsTestCoordinator {
+	    	var template SkipType v_skip := {0, omit};
+	    	
+	    	if(p_skipCount > 0) {
+	    		v_skip := {1, mw_SipRequest(mw_INVITE_Request_Base)};
+	    	}
+	       p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                {},
+                v_skip,
+                "TP_IMS_5106_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	   
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5106_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5106_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	integer p_skipCount
+	    ) runs on ImsTestCoordinator {
+	        var template SipUrl v_SCSCF_A_Uri := (mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_A)),
+	        												mw_SipUrl_Host(f_GetEUTScscfIpAddress(PX_EUT_A)));
+	    	var template SkipType v_skip := {0, omit};
+	    	
+	    	if(p_skipCount > 0) {
+	    		v_skip := {1, mw_SipRequest(mw_INVITE_Request_Base)};
+	    	}
+	    	
+	    		
+	       p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5106_01_ic(v_SCSCF_A_Uri))},
+                {mw_SipRequest(mw_INVITE_Request_Base)},
+                v_skip,
+                "TP_IMS_5106_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5106_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5106_02_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+	       p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mw_UPDATE_Request_Base(*))},
+                {},
+                {0, omit},
+                "TP_IMS_5106_02",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	   
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5106_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5106_02_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+	        var template SipUrl v_SCSCF_A_Uri := mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_A));
+	    		
+	       p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5106_02_p_ic(*,v_SCSCF_A_Uri))},
+                {
+					mw_SipRequest(mdw_TP_IMS_5106_02_f_ic(*,v_SCSCF_A_Uri)),
+                	mw_SipRequest(mw_UPDATE_Request_Base(*))},
+                {0, omit},
+                "TP_IMS_5106_02",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5121_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5121_02_gm(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	integer p_skipCount
+	    ) runs on ImsTestCoordinator {
+	    	// TODO TP must be checked, currently only 2XX is checked
+	    	
+	    	var template SkipType v_skip := {0, omit};
+	    	
+	    	if(p_skipCount > 0) {
+	    		v_skip := {1, mw_SipResponse(mdw_2XX_Base)};
+	    	}
+	       p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mdw_2XX_Base)},
+                {},
+                v_skip,
+                "TP_IMS_5121_02",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	   
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5121_02
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5121_02_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef,
+	    	integer p_skipCount
+	    ) runs on ImsTestCoordinator {
+	        var template SipUrl v_SCSCF_A_Uri := mw_SipUrl_Host(f_GetEUTScscfAddress(PX_EUT_A));
+	    	var template SkipType v_skip := {0, omit};
+	    	
+	    	if(p_skipCount > 0) {
+	    		v_skip := {1, mw_SipResponse(mdw_2XX_Base)};
+	    	}
+	    	
+	    		
+	       p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipResponse(mw_TP_IMS_5121_02_ic)},
+                {mw_SipResponse(mdw_2XX_Base)},
+                v_skip,
+                "TP_IMS_5121_02",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	    
+	    
+	    /**
+	     * @desc Starts monitor component behavior for TP_IMS_5074_01
+		 * @param p_monitorCompRef Reference to monitor component
+		 */
+	    function f_mtc_check_TP_IMS_5074_01_ic(
+	    	ImsInterfaceMonitor p_monitorCompRef
+	    ) runs on ImsTestCoordinator {
+	        var template SipUrl v_UE_A_Uri := f_getUeIpAddress(PX_EUT_A);
+	    		
+	       p_monitorCompRef.start(
+            f_imsIot_receive(
+                {mw_SipRequest(mdw_TP_IMS_5074_01_ic(*,v_UE_A_Uri))},
+                {mw_SipRequest(mw_BYE_Request_Base(*))},
+                {0, omit},
+                "TP_IMS_5074_01",
+                false,
+                false
+            )
+           );
+           p_monitorCompRef.done;
+	    }
+	}
+	
+} // end group
+}// end module
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_Functions.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_Functions.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_Functions.ttcn	(revision 22)
@@ -0,0 +1,1556 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides common function for TestCoordinator component.
+ */
+module AtsImsIot_Functions {
+ 
+ 	import from AtsImsIot_Templates {template mw_SIP_URI_Base;}
+
+ 	import from LibSip_SIPTypesAndValues all;
+
+ 	import from AtsImsIot_TestSystem {
+ 		type ImsTestCoordinator, ImsInterfaceMonitor;
+ 	}
+
+ 	import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT, PX_PRODUCTS, PX_AVAILABLE_INTERFACES;}
+	import from LibIot_Functions {
+		function f_setConformanceVerdict;
+	}
+	
+ 	import from AtsImsIot_TypesAndValues {
+ 		type SipMessage, SipMessageList, SkipType;
+ 	}
+
+ 	import from LibIms_UpperTester all;
+
+	import from LibIot_TestInterface {
+        type InterfaceMonitor, TestCoordinator, EquipmentUser;
+    }
+ 	
+ 	import from LibIot_Functions {function f_getE2EVerdict;}
+
+	import from LibIot_TypesAndValues {type DefaultList;}
+ 	
+ 	group ue {
+ 		
+ 		/**
+		  * @desc
+		  *     Starts user component behavior for triggering the registration
+		  *     procedures at the UE from test coordinator.
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userRegistration(EquipmentUser p_userCompRef, ImsUserInfo p_userInfo) 
+ 		runs on TestCoordinator 
+ 		return boolean {
+      		var boolean v_status := true; 
+     		// TODO Investigate if f_PR_user_home_registration is to be removed
+     		// Reason: Thre is no difference when triggering UE to register in home or visiting NW
+     		if( p_userInfo.publicId  == "dummy" ) { return false; } 
+     		
+     		v_status := f_mtc_userRegister(p_userCompRef, p_userInfo.publicId, p_userInfo.privateId, p_userInfo.password); 		
+ 			return v_status;
+ 		}
+ 		
+ 		/**
+		  * @desc
+		  *     Starts user component behavior for checking the successful
+		  *     registration.
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userCheckRegistration(EquipmentUser p_userCompRef, ImsUserInfo p_userInfo) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+			if( p_userInfo.publicId  == "dummy" ) { return false; }       		
+     		v_status := f_mtc_userCheckRegistrationSuccessful(p_userCompRef); 		
+ 			return v_status;
+     	}
+     		
+        /**
+         * @desc
+         * Starts user component behavior for checking that UE
+         * is not registerd.
+         * @param p_userCompRef Reference to IMS UE user component
+         * @return
+         * true in case of successfull execution of the trigger command
+         * otherwise false
+         **/
+		function f_mtc_userCheckNoRegistration(EquipmentUser p_userCompRef, ImsUserInfo p_userInfo) 
+			runs on TestCoordinator return boolean {
+			var boolean v_status := true; 
+			if( p_userInfo.publicId  == "dummy" ) { return true; }       		
+			v_status := f_mtc_userCheckRegistrationUnsuccessful(p_userCompRef); 		
+			return v_status;
+		}
+
+ 		/**
+		  * @desc Trigger UE given by p_ueRef to initiate an MO call 
+		  * @param p_ueRef Reference to IMS UE user component
+		  * @param p_calledParty ImsUserInfo of called party
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userInitiateCall(EquipmentUser p_ueRef, ImsUserInfo p_calledParty) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+			if( p_calledParty.publicId  == "dummy" ) { return true; }       		
+			v_status := f_mtc_userInitiateCallSuccessful(p_ueRef); 
+   			return v_status;
+     		}
+
+		/**
+		* 
+		* @desc Starts user component behaviour for checking that the User 
+		* 		Call has been initiated
+		* @param p_userCompRef Reference to IMS UE user component
+		* @return 
+		* 		true in case of successfull execution of the trigger command
+		*		otherwise false
+		*/
+		function f_mtc_userInitiateCallSuccessful(EquipmentUser p_userCompRef) 
+			runs on TestCoordinator return boolean {
+			var boolean v_success := false;
+	
+			p_userCompRef.start(f_checkUserCallIsInitiated());
+	
+			p_userCompRef.done;
+	
+			if(f_getE2EVerdict() == pass) {
+				v_success := true;	
+			}
+				return v_success;
+		}
+     	
+ 		/**
+		  * @desc Answer call 
+		  * @param p_ueRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userAnswerCall(EquipmentUser p_ueRef) 
+			runs on TestCoordinator return boolean {
+			var boolean v_status := true;        		
+			v_status := f_mtc_userAnswerCallSuccessful(p_ueRef); 
+			return v_status;
+ 		}
+ 		
+		/**
+		* 
+		* @desc Starts user component behaviour for checking that the User 
+		* 		Call has been answered
+		* @param p_userCompRef Reference to IMS UE user component
+		* @return 
+		* 		true in case of successfull execution of the trigger command
+		*		otherwise false
+		*/
+		function f_mtc_userAnswerCallSuccessful(EquipmentUser p_userCompRef) 
+			runs on TestCoordinator return boolean {
+			var boolean v_success := false;
+
+			p_userCompRef.start(f_checkUserCallIsAnswered());
+
+			p_userCompRef.done;
+
+			if(f_getE2EVerdict() == pass) {
+				v_success := true;	
+			}
+				return v_success;
+		}		
+ 		
+ 		/**
+		  * @desc End the call 
+		  * @param p_ueRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_EndCall(EquipmentUser p_ueRef) 
+			runs on TestCoordinator return boolean {
+			var boolean v_status := true;        		
+			v_status := f_mtc_userEndCallSuccessful(p_ueRef); 
+			return v_status;
+     		}
+     		
+		/**
+		* 
+		* @desc Starts user component behaviour for checking that the User 
+		* 		Call has been ended
+		* @param p_userCompRef Reference to IMS UE user component
+		* @return 
+		* 		true in case of successfull execution of the trigger command
+		*		otherwise false
+		*/
+		function f_mtc_userEndCallSuccessful(EquipmentUser p_userCompRef) 
+			runs on TestCoordinator return boolean {
+			var boolean v_success := false;
+
+			p_userCompRef.start(f_checkUserCallIsEnded());
+
+			p_userCompRef.done;
+
+			if(f_getE2EVerdict() == pass) {
+				v_success := true;	
+			}
+				return v_success;
+		}	
+		
+		 /**
+		  * @desc Trigger UE given by p_ueRef to add a new media stream 
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userAddNewMediaStream(EquipmentUser p_ueRef) 
+			runs on TestCoordinator return boolean {
+			var boolean v_status := true;        		
+			v_status := f_mtc_userAddNewMediaStreamSuccessful(p_ueRef); 
+			return v_status;
+ 		}
+ 		
+		/**
+		* 
+		* @desc Starts user component behaviour for checking that  
+		* 		a new media stream has been added
+		* @param p_userCompRef Reference to IMS UE user component
+		* @return 
+		* 		true in case of successfull execution of the trigger command
+		*		otherwise false
+		*/
+		function f_mtc_userAddNewMediaStreamSuccessful(EquipmentUser p_userCompRef) 
+			runs on TestCoordinator return boolean {
+			var boolean v_success := false;
+
+			p_userCompRef.start(f_checkUserAddNewMediaStream());
+
+			p_userCompRef.done;
+
+			if(f_getE2EVerdict() == pass) {
+				v_success := true;	
+			}
+				return v_success;
+		}
+ 		
+ 		/**
+		  * @desc Trigger UE given by p_ueRef to remove a media stream 
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userRemoveMediaStream(EquipmentUser p_ueRef) 
+		runs on TestCoordinator return boolean {
+    		var boolean v_status := true;        		
+    		v_status := f_mtc_userRemoveNewMediaStreamSuccessful(p_ueRef); 
+    		return v_status;
+		}		
+ 		
+    	/**
+    	* 
+    	* @desc Starts user component behaviour for checking that  
+    	* 		a new media stream has been added
+    	* @param p_userCompRef Reference to IMS UE user component
+    	* @return 
+    	* 		true in case of successfull execution of the trigger command
+    	*		otherwise false
+    	*/
+    	function f_mtc_userRemoveNewMediaStreamSuccessful(EquipmentUser p_userCompRef) 
+    		runs on TestCoordinator return boolean {
+    		var boolean v_success := false;
+    
+    		p_userCompRef.start(f_checkUserRemoveNewMediaStream());
+    
+    		p_userCompRef.done;
+    
+    		if(f_getE2EVerdict() == pass) {
+    			v_success := true;	
+    		}
+    			return v_success;
+    	}
+ 		
+ 		
+ 		/**
+		  * @desc Trigger UE given by p_ueRef to check the remove of a media stream 
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userCheckRemoveMediaStream(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+ 		}
+ 		
+ 		/**
+		  * @desc Trigger UE given by p_ueRef to add a new media stream 
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userModifiyMediaStream(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+ 		}
+ 		
+ 		/**
+		  * @desc Trigger UE given by p_ueRef to add a new media stream 
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userCheckNewMediaStream(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+ 		}
+ 		
+ 		
+ 		/**
+		  * @desc Trigger UE given by p_ueRef to loose conectifity 
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userLooseConnection(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+ 		}
+
+		/**
+			* @desc Trigger UE given by p_ueRef to enter CANCEL current call 
+			* @param p_userCompRef Reference to IMS UE user component
+			* @return
+			*     true in case of successfull execution of the trigger command
+			*     otherwise false
+			*/
+		function f_mtc_userTriggerCancelCall(EquipmentUser p_ueRef) 
+			runs on TestCoordinator return boolean {
+			var boolean v_status := true; 
+			// TODO
+			return v_status;
+		}
+
+ 		/**
+		  * @desc Trigger UE given by p_ueRef to enter HOLD state 
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userTriggerHold(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+ 		/**
+		  * @desc Trigger UE given by p_ueRef to leave HOLD state and resume pending call  
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userTriggerResume(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+			
+ 		/**
+		  * @desc Check that UE given by p_ueRef is ringing
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return true or false
+		  */
+ 		function f_mtc_userCheckRinging(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+
+ 		/**
+		  * @desc Check that UE given by p_ueRef reports a successfull call establishment
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return true or false
+		  */
+ 		function f_mtc_userCheckCallEstablished(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+
+       	/**
+          * @desc Check that UE given by p_ueRef reports a not successfull call establishment
+          * @param p_userCompRef Reference to IMS UE user component
+          * @return true or false
+          */
+       	function f_mtc_userCheckCallCannotBeEstablished(EquipmentUser p_ueRef) 
+       		runs on TestCoordinator return boolean {
+           	var boolean v_status := true; 
+           	// TODO
+        	return v_status;
+           	}
+
+
+ 		/**
+		  * @desc Check that UE by p_ueRef given reports that its peer is ringing
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return true or false
+		  */
+ 		function f_mtc_userCheckPeerIsRinging(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+ 		/**
+		  * @desc Check that UE by p_ueRef given reports HOLD state
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return true or false
+		  */
+ 		function f_mtc_userCheckUserOnHold(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+ 		/**
+		  * @desc Check that UE by p_ueRef given reports that call has been resumed
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return true or false
+		  */
+ 		function f_mtc_userCheckCallResumed(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+ 		/**
+		  * @desc Check that UE by p_ueRef given reports that call has ended
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @return true or false
+		  */
+ 		function f_mtc_userCheckCallEnded(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+        /**
+          * @desc Check that UE by p_ueRef given reports that call is terminated
+          * @param p_userCompRef Reference to IMS UE user component
+          * @return true or false
+          */
+        function f_mtc_userCheckCallTerminated(EquipmentUser p_ueRef) 
+            runs on TestCoordinator return boolean {
+            var boolean v_status := true; 
+            // TODO
+        	return v_status;
+            }
+		/**
+			* @desc Check that UE by p_ueRef given reports that call is no longer offered
+			* @param p_userCompRef Reference to IMS UE user component
+			* @return true or false
+			*/
+		function f_mtc_userCheckCallNoLongerOffered(EquipmentUser p_ueRef) 
+			runs on TestCoordinator return boolean {
+			var boolean v_status := true; 
+			// TODO
+			return v_status;
+			}
+
+		/**
+			* @desc Check that UE by p_ueRef given reports that call has been cancelled
+			* @param p_userCompRef Reference to IMS UE user component
+			* @return true or false
+			*/
+		function f_mtc_userCheckCallCancelled(EquipmentUser p_ueRef) 
+			runs on TestCoordinator return boolean {
+			var boolean v_status := true; 
+			// TODO
+			return v_status;
+		}
+
+		/**
+			* @desc Check that UE by p_ueRef given reports that call has been rejected due to ACR
+			* @param p_userCompRef Reference to IMS UE user component
+			* @return true or false
+			*/
+		function f_mtc_userCheckCallRejectedACR(EquipmentUser p_ueRef) 
+			runs on TestCoordinator return boolean {
+			var boolean v_status := true; 
+			// TODO
+			return v_status;
+		}
+		
+ 		/**
+		  * @desc Start capturing and monitoring traffic on all configured interfaces
+		  * @return true or false
+		  */
+ 		function f_mtc_StartAllTrafficCapture() 
+            runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		// TODO
+ 			return v_status;
+     		}
+
+
+ 		
+ 		/**
+		  * @desc Starts user component behaviour for registration from test coordinator
+		  * @param p_userCompRef Reference to IMS UE user component
+		  * @param p_publicId public user identity
+		  * @param p_privateId private user identity
+		  * @param p_pw user password
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userRegister(EquipmentUser p_userCompRef, charstring p_publicId, charstring p_privateId, charstring p_pw) runs on TestCoordinator return boolean {
+ 			// TODO server address parameter may needed
+ 			var boolean v_success := false;
+ 			
+ 			p_userCompRef.start(f_userRegistration(p_publicId, p_privateId, p_pw));
+ 			
+ 			p_userCompRef.done;
+ 			
+ 			if(f_getE2EVerdict() == pass) {
+ 				v_success := true;	
+ 			}
+     		
+     		return v_success;
+ 		}
+
+ 		function f_mtc_userCheckRegistrationSuccessful(EquipmentUser p_userCompRef) runs on TestCoordinator return boolean {
+ 			var boolean v_success := false;
+ 			
+ 			p_userCompRef.start(f_checkUserIsRegistered());
+ 			
+ 			p_userCompRef.done;
+ 			
+ 			if(f_getE2EVerdict() == pass) {
+ 				v_success := true;	
+ 			}
+     		
+     		return v_success;
+ 		}
+		/**
+		 * 
+		 * @desc Starts user component behaviour for checking that the UE 
+		 * 		 is not registered
+		 * @param p_userCompRef Reference to IMS UE user component
+		 * @return 
+		 * 		true in case of successfull execution of the trigger command
+		 *		otherwise false
+		 */
+		function f_mtc_userCheckRegistrationUnsuccessful(EquipmentUser p_userCompRef) 
+			runs on TestCoordinator return boolean {
+			var boolean v_success := false;
+		
+			p_userCompRef.start(f_checkUserIsNotRegistered());
+		
+			p_userCompRef.done;
+		
+			if(f_getE2EVerdict() == pass) {
+				v_success := true;	
+			}
+ 			return v_success;
+		}
+		
+ 		/**
+		  * @desc Starts user component behaviour for registration from test coordinator
+		  * @param p_userCompRef Reference ot IMS UE user component
+		  * @param publicId public user identity
+		  * @return
+		  *     true in case of successfull execution of the trigger command
+		  *     otherwise false
+		  */
+ 		function f_mtc_userDeregister(EquipmentUser p_userCompRef, charstring p_publicId) runs on TestCoordinator return boolean {
+ 			var boolean v_success := false;
+ 			
+ 			p_userCompRef.start(f_userDeregistration(p_publicId));
+ 			
+ 			p_userCompRef.done;
+     		
+     		if( f_getE2EVerdict() == pass) {
+ 				v_success := true;	
+ 			}
+     		
+     		return v_success;
+ 		}
+ 		
+ 		/**
+ 		 * 
+ 		 * @desc Starts user component behaviour for sending a message from test coordinator
+ 		 * @param p_userCompRef Reference ot IMS UE user component
+ 		 * @param p_content Content of meessage to be sent
+ 		 */
+ 		function f_mtc_userSendMessage(EquipmentUser p_userCompRef, charstring p_content) runs on TestCoordinator return boolean {
+ 			var boolean v_success := false;
+ 			
+ 			p_userCompRef.start(f_userSendMessage(p_content));
+ 			
+ 			p_userCompRef.done;
+     		
+      		if(f_getE2EVerdict() == pass) {
+      			v_success := true;
+      		}
+     		
+     		return v_success;
+ 		}
+ 		
+ 		/**
+ 		 * 
+ 		 * @desc Starts user component behaviour for checking message receipt from test coordinator 
+ 		 * @param p_userCompRef Reference ot IMS UE user component
+ 		 * @param p_content Content of meessage to be received
+ 		 */
+ 		function f_mtc_userCheckMessageReceipt(EquipmentUser p_userCompRef) runs on TestCoordinator return boolean {
+ 			var boolean v_success := false;
+ 			
+ 			p_userCompRef.start(f_userCheckMessageReceipt());
+ 			
+ 			p_userCompRef.done;
+     		
+            if(f_getE2EVerdict() == pass) {
+      			v_success := true;
+  			}
+     		
+     		return v_success;
+ 		}
+ 		
+ 		/**
+ 		 * 
+ 		 * @desc Starts user component behaviour for checking message receipt from test coordinator 
+ 		 * @param p_userCompRef Reference ot IMS UE user component
+ 		 * @param p_content Content of meessage to be received
+ 		 */
+ 		function f_mtc_userCheckMessageNotDelivered(EquipmentUser p_userCompRef) runs on TestCoordinator return boolean {
+ 			var boolean v_success := false;
+ 			
+ 			p_userCompRef.start(f_userCheckMessageNotDelivered());
+ 			
+ 			p_userCompRef.done;
+     		
+            if(f_getE2EVerdict() == pass) {
+      			v_success := true;
+  			}
+     		
+     		return v_success;
+ 		}
+
+
+		/**
+			* @desc Trigger IMS Network to deregister UE given by p_ueRef
+			* @param p_imsRef Reference to IMS network component 
+			* @param p_ueRef Reference to IMS UE user component
+			* @return true or false
+			*/
+		function f_mtc_imsTriggerUeDeregistration(EquipmentUser p_imsRef, EquipmentUser p_ueRef) 
+			runs on TestCoordinator return boolean {
+			var boolean v_status := true; 
+			// TODO
+			return v_status;
+		}
+ 		
+	
+	
+	
+ 		
+          /*
+          * 
+          * @desc Looks for genUser (any) of a specific product
+          * @param p_productIdx Index of the product 
+          * @return genUser
+          */ 
+		function f_getAnyValidUser(integer p_productIdx) return ImsUserInfo {
+			var integer v_size := sizeof(PX_IMS_USER_DATA);
+			const ImsUserInfo c_dummyInfo := { "dummy", "dummy", "dummy", "dummy", "dummy" };
+            var ImsUserIdentity v_userid;
+         		  
+            	for(var integer i := 0; i < v_size; i := i+1) {
+                	if(PX_IMS_USER_DATA[i].productIndex == p_productIdx) {
+            			var integer v_size_j := sizeof(PX_IMS_USER_DATA[i].userIds);
+            			for(var integer j := 0; j < v_size_j; j := j+1) {
+                    		if ( ischosen(PX_IMS_USER_DATA[i].userIds[j].genUserId )) {
+                      			return PX_IMS_USER_DATA[i].userIds[j].genUserId;
+                    		}  // end if
+            			} // end for j
+            			log("f_getAnyValidUser: Did not find specified user id in specified product in PX_IMS_USER_DATA");
+            			return c_dummyInfo;
+               		} // end if
+             	} // end for i
+            	log("f_getAnyValidUser: Did not find specified product in PX_IMS_USER_DATA");
+             	return c_dummyInfo;
+           	}
+         		
+          /*
+          * 
+          * @desc Looks for TelUser of a specific product
+          * @param p_productIdx Index of the product 
+          * @return TelUser
+          */ 		
+			function f_getTelUserId(integer p_productIdx) return ImsUserInfo {
+            	var integer v_size := sizeof(PX_IMS_USER_DATA);
+             	const ImsUserInfo c_dummyInfo := { "dummy", "dummy", "dummy", "dummy", "dummy" };
+            	var ImsUserIdentity v_userid;
+         		  
+             	for(var integer i := 0; i < v_size; i := i+1) {
+                	if(PX_IMS_USER_DATA[i].productIndex == p_productIdx) {
+            			var integer v_size_j := sizeof(PX_IMS_USER_DATA[i].userIds);
+            			for(var integer j := 0; j < v_size_j; j := j+1) {
+                    		if ( ischosen(PX_IMS_USER_DATA[i].userIds[j].telUserId )) {
+                      			return PX_IMS_USER_DATA[i].userIds[j].telUserId;
+                    		}  // end if
+            			} // end for j
+            			log("f_getTelUserId: Did not find specified user id in specified product in PX_IMS_USER_DATA");
+            			return c_dummyInfo;
+               		} // end if
+             	} // end for i
+            	log("f_getTelUserId: Did not find specified product in PX_IMS_USER_DATA");
+             	return c_dummyInfo;
+           	}
+         		
+          /*
+          * 
+          * @desc Looks for SipUser of a specific product
+          * @param p_productIdx Index of the product 
+          * @return SipUser
+          */ 		
+			function f_getSipUserId(integer p_productIdx) return ImsUserInfo {
+            	var integer v_size := sizeof(PX_IMS_USER_DATA);
+             	const ImsUserInfo c_dummyInfo := { "dummy", "dummy", "dummy", "dummy", "dummy" };
+            	var ImsUserIdentity v_userid;
+         		  
+             	for(var integer i := 0; i < v_size; i := i+1) {
+                	if(PX_IMS_USER_DATA[i].productIndex == p_productIdx) {
+            			var integer v_size_j := sizeof(PX_IMS_USER_DATA[i].userIds);
+            			for(var integer j := 0; j < v_size_j; j := j+1) {
+                    		if ( ischosen(PX_IMS_USER_DATA[i].userIds[j].sipUserId )) {
+                      			return PX_IMS_USER_DATA[i].userIds[j].sipUserId;
+                    		}  // end if
+            			} // end for j
+            			log("f_getSipUserId: Did not find specified user id in specified product in PX_IMS_USER_DATA");
+            			return c_dummyInfo;
+               		} // end if
+             	} // end for i
+            	log("f_getSipUserId: Did not find specified product in PX_IMS_USER_DATA");
+             	return c_dummyInfo;
+           	}
+         		
+           /*
+            * 
+            * @desc Looks for ARCUser for a specific product
+           * @param p_productIdx Index of the product 
+           * @return ARCUser
+            */
+			function f_getACRUser(integer p_productIdx) return ImsUserInfo {
+				var integer v_size := sizeof(PX_IMS_USER_DATA);
+             	const ImsUserInfo c_dummyInfo := { "dummy", "dummy", "dummy", "dummy", "dummy" };
+             	var ImsUserIdentity v_userid;
+          
+           		for(var integer i := 0; i < v_size; i := i+1) {
+              		if(PX_IMS_USER_DATA[i].productIndex == p_productIdx) {
+             			var integer v_size_j := sizeof(PX_IMS_USER_DATA[i].userIds);
+                		for(var integer j := 0; j < v_size_j; j := j+1) {
+                   			if ( ischosen(PX_IMS_USER_DATA[i].userIds[j].acrUserId )) {
+                  				return PX_IMS_USER_DATA[i].userIds[j].acrUserId;
+                   			}  // end if
+                		} // end for j
+             			log("f_getACRUser: Did not find specified user id in specified product in PX_IMS_USER_DATA");
+             			return c_dummyInfo;
+            		} // end if
+           		} // end for i
+              	log("f_getACRUser: Did not find specified product in PX_IMS_USER_DATA");
+              	return c_dummyInfo;
+          	}
+         	
+          /*
+          * 
+          * @desc Looks for OIPUser for a specific product
+          * @param p_productIdx Index of the product 
+          * @return OIPUser
+          */
+			function f_getOIPUser(integer p_productIdx) return ImsUserInfo {
+           		var integer v_size := sizeof(PX_IMS_USER_DATA);
+           		const ImsUserInfo c_dummyInfo := { "dummy", "dummy", "dummy", "dummy", "dummy" };
+           		var ImsUserIdentity v_userid;
+          
+           		for(var integer i := 0; i < v_size; i := i+1) {
+            		if(PX_IMS_USER_DATA[i].productIndex == p_productIdx) {
+             			var integer v_size_j := sizeof(PX_IMS_USER_DATA[i].userIds);
+             			for(var integer j := 0; j < v_size_j; j := j+1) {
+              				if ( ischosen(PX_IMS_USER_DATA[i].userIds[j].oipUserId )) {
+               					return PX_IMS_USER_DATA[i].userIds[j].oipUserId;
+              				}  // end if
+             			} // end for j
+             			log("f_getOIPUser: Did not find specified user id in specified product in PX_IMS_USER_DATA");
+             			return c_dummyInfo;
+            		} // end if
+           		} // end for i
+           		log("f_getOIPUser: Did not find specified product in PX_IMS_USER_DATA");
+           		return c_dummyInfo;
+           	}
+         		
+          /*
+          * 
+          * @desc Looks for OIRUser for a specific product
+          * @param p_productIdx Index of the product 
+          * @return OIRUser
+          */
+			function f_getOIRUser(integer p_productIdx) return ImsUserInfo {
+            	var integer v_size := sizeof(PX_IMS_USER_DATA);
+              	const ImsUserInfo c_dummyInfo := { "dummy", "dummy", "dummy", "dummy", "dummy" };
+              	var ImsUserIdentity v_userid;
+          
+           		for(var integer i := 0; i < v_size; i := i+1) {
+            		if(PX_IMS_USER_DATA[i].productIndex == p_productIdx) {
+             			var integer v_size_j := sizeof(PX_IMS_USER_DATA[i].userIds);
+             			for(var integer j := 0; j < v_size_j; j := j+1) {
+              				if ( ischosen(PX_IMS_USER_DATA[i].userIds[j].oirUserId )) {
+               					return PX_IMS_USER_DATA[i].userIds[j].oirUserId;
+              				}  // end if
+             			} // end for j
+             			log("f_getOIRUser: Did not find specified user id in specified product in PX_IMS_USER_DATA");
+             			return c_dummyInfo;
+            		} // end if
+           		} // end for i
+           		log("f_getOIRUser: Did not find specified product in PX_IMS_USER_DATA");
+           		return c_dummyInfo; 	
+          	}	
+
+    		/*
+    		* 
+    		* @desc Looks for HoldUser for a specific product
+    		* @param p_productIdx Index of the product 
+    		* @return HoldUser
+    		*/
+			function f_getHoldUser(integer p_productIdx) return ImsUserInfo {
+				var integer v_size := sizeof(PX_IMS_USER_DATA);
+				const ImsUserInfo c_dummyInfo := { "dummy", "dummy", "dummy", "dummy", "dummy" };
+				var ImsUserIdentity v_userid;
+  
+				for(var integer i := 0; i < v_size; i := i+1) {
+					if(PX_IMS_USER_DATA[i].productIndex == p_productIdx) {
+						var integer v_size_j := sizeof(PX_IMS_USER_DATA[i].userIds);
+						for(var integer j := 0; j < v_size_j; j := j+1) {
+							if ( ischosen(PX_IMS_USER_DATA[i].userIds[j].holdUserId )) {
+								return PX_IMS_USER_DATA[i].userIds[j].holdUserId;
+							}  // end if
+						} // end for j
+						log("f_getHoldUser: Did not find specified user id in specified product in PX_IMS_USER_DATA");
+						return c_dummyInfo;
+					} // end if
+				} // end for i
+				log("f_getHoldUser: Did not find specified product in PX_IMS_USER_DATA");
+				return c_dummyInfo; 	
+			}	
+ 		
+		// TODO 
+		function f_getUEHostname(integer p_ID, out charstring p_hostname) 
+				return boolean {
+	  	
+			// TODO
+				
+			return true;		
+		} 
+ 		
+    	/**
+    	 * @desc
+    	 *     Preamble to handle user registration in home network from test coordinator
+    	 * @param p_userCompRef Reference ot IMS UE user component
+    	 * @return true in case of successfull execution otherwise false
+    	 */
+     	function f_PR_user_home_registration(EquipmentUser p_userCompRef, ImsUserInfo p_userInfo) 
+     	runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+			if( p_userInfo.publicId  == "" ) { return false; } 
+     		
+     		v_status := f_mtc_userRegister(p_userCompRef, p_userInfo.publicId, p_userInfo.privateId, p_userInfo.password); 
+     		
+     		return v_status;
+     	}
+     	
+    	/**
+    	 * @desc
+    	 *     Postamble to handle user deregistration in home network from test coordinator
+    	 * @param p_userCompRef Reference ot IMS UE user component
+    	 * @return true in case of successfull execution otherwise false
+    	 */
+     	function f_PO_user_home_deregistration(EquipmentUser p_userCompRef) runs on ImsTestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		
+     		v_status := f_mtc_userDeregister(p_userCompRef, "*"); // deregister all previous users
+     		
+     		return v_status;
+     	}
+     	
+    	/**
+    	 * @desc
+    	 *     Preamble to handle user registration in roaming network from test coordinator
+    	 * @param p_userCompRef Reference ot IMS UE user component
+    	 * @return true in case of successfull execution otherwise false
+    	 */
+     	function f_PR_user_roaming_registration(EquipmentUser p_userCompRef, ImsUserInfo p_userInfo) 
+     	runs on TestCoordinator return boolean {
+     		var boolean v_status := true; 
+			if( p_userInfo.publicId  == "" ) { return false; } 
+     		
+     		// TODO check roaming registration
+     		v_status := f_mtc_userRegister(p_userCompRef, p_userInfo.publicId, p_userInfo.privateId, p_userInfo.password); 
+     		
+     		return v_status;
+     	}
+     	
+    	/**
+    	 * @desc
+    	 *     Postamble to handle user deregistration in roaming network from test coordinator
+    	 * @param p_userCompRef Reference ot IMS UE user component
+    	 * @return true in case of successfull execution otherwise false
+    	 */
+     	function f_PO_user_roaming_deregistration(EquipmentUser p_userCompRef) runs on ImsTestCoordinator return boolean {
+     		var boolean v_status := true; 
+     		
+     		// TODO check roaming de-registration
+     		v_status := f_mtc_userDeregister(p_userCompRef, "*"); // deregister all previous users
+     		
+     		return v_status;
+     	}
+
+    	/**
+    	 * @desc Get the S-CSCF FQDN address of referenced EUT 
+    	 * @return if a S-CSCF is avaiable, the domainname of the S-CSCF, 
+    	 *         otherwise error_string
+    	 */
+       function f_GetEUTScscfAddress(integer p_ProductIdx) return charstring {
+			var integer v_size_interfaces := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces);
+			var integer v_size_ipinterfaceinfo;
+			var integer v_interface := -1;
+			var integer v_ipinterfaceinfo := -1;
+			var charstring v_domainname;
+  
+			for(var integer i := 0; i < v_size_interfaces; i := i+1) {
+				if (match(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[i].interfaceName, pattern "[Mm][Ww]")){
+					v_interface := i;
+					break;
+				}
+			}
+			if (v_interface > -1) {
+				v_size_ipinterfaceinfo := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo);
+    			for(var integer i := 0; i < v_size_ipinterfaceinfo; i := i+1) {
+					if(ispresent(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[i].domainName)) {
+	    				v_domainname := PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[i].domainName;
+   		 				if (match(substr(v_domainname, 0, 5), pattern "[Ss][Cc][Ss][Cc][Ff]") 
+   		 				or match(substr(v_domainname, 0, 5), pattern "[Ss][Tt][Ee][Cc][Hh]")) {
+    						v_ipinterfaceinfo := i;
+    						break;
+    					}
+					}
+    			}
+			} else {
+				log ("S-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.");
+				return "S-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+			}
+			if (v_ipinterfaceinfo > -1) {
+				return PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[v_ipinterfaceinfo].domainName;
+			} else {
+				log ("S-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.");
+				return "S-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+			}
+        }
+
+    	/**
+    	 * @desc Get the S-CSCF FQDN address of referenced EUT 
+    	 * @return if a S-CSCF is avaiable, the IP Address of the S-CSCF, 
+    	 *         otherwise error_string
+    	 */
+       function f_GetEUTScscfIpAddress(integer p_ProductIdx) return charstring {
+			var integer v_size_interfaces := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces);
+			var integer v_size_ipinterfaceinfo;
+			var integer v_interface := -1;
+			var integer v_ipinterfaceinfo := -1;
+			var charstring v_domainname;
+  
+			for(var integer i := 0; i < v_size_interfaces; i := i+1) {
+				if (match(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[i].interfaceName, pattern "[Mm][Ww]")){
+					v_interface := i;
+				}
+			}
+			if (v_interface > -1) {
+				v_size_ipinterfaceinfo := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo);
+    			for(var integer i := 0; i < v_size_ipinterfaceinfo; i := i+1) {
+					if(ispresent(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[i].domainName)) {
+    				v_domainname := PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[i].domainName;
+    				if (match(substr(v_domainname, 0, 5), pattern "[Ss][Cc][Ss][Cc][Ff]")
+    				or match(substr(v_domainname, 0, 5), pattern "[Ss][Tt][Ee][Cc][Hh]")) {
+    					v_ipinterfaceinfo := i;
+    				}
+				}
+    			}
+			} else {
+				log ("S-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.");
+				return "S-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+			}
+			if (v_ipinterfaceinfo > -1) {
+				return PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[v_ipinterfaceinfo].IpAddress;
+			} else {
+				log ("S-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.");
+				return "S-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+			}
+        }
+        
+    	/**
+    	 * @desc Get the P-CSCF FQDN address of referenced EUT 
+    	 * @return if a PCSCF is avaiable, the domainname of the PCSCF, 
+    	 *         otherwise error_string
+    	 */
+     	function f_GetEUTPcscfAddress(integer p_ProductIdx) return charstring {
+		  var integer v_size_interfaces := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces);
+		  var integer v_size_ipinterfaceinfo;
+		  var integer v_interface := -1;
+		  var integer v_ipinterfaceinfo := -1;
+		  var charstring v_domainname;
+		  
+		  for(var integer i := 0; i < v_size_interfaces; i := i+1) {
+			if (match(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[i].interfaceName, pattern "[Gg][Mm]")){
+			  v_interface := i;
+			  break;
+		  	}
+		  }
+		  if (v_interface > -1) {
+    		  v_size_ipinterfaceinfo := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo);
+    		  for(var integer i := 0; i < v_size_ipinterfaceinfo; i := i+1) {
+    		   if(ispresent(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[i].domainName)) {
+    			v_domainname := PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[i].domainName;
+    		  	if (match(substr(v_domainname, 0, 5), pattern "[Pp][Cc][Ss][Cc][Ff]")
+    		  	or match(substr(v_domainname, 0, 5), pattern "[Pp][Tt][Ee][Cc][Hh]")) {
+    			  v_ipinterfaceinfo := i;
+     	        }
+    		   }
+    		  }
+		  } else {
+			log ("P-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.");
+			return "P-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+		  }
+		  if (v_ipinterfaceinfo > -1) {
+     	  	return PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[v_ipinterfaceinfo].domainName;
+		  } else {
+			log ("P-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.");
+			return "P-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+		  }
+     	}
+
+    	/**
+    	 * @desc Get the P-CSCF IP address of referenced EUT 
+    	 * @return if a PCSCF is avaiable, the IP address of the PCSCF, 
+    	 *         otherwise error_string
+    	 */
+     	function f_GetEUTPcscfIpAddress(integer p_ProductIdx) return charstring {
+		  var integer v_size_interfaces := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces);
+		  var integer v_size_ipinterfaceinfo;
+		  var integer v_interface := -1;
+		  var integer v_ipinterfaceinfo := -1;
+		  var charstring v_domainname;
+		  
+		  for(var integer i := 0; i < v_size_interfaces; i := i+1) {
+			if (match(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[i].interfaceName, pattern "[Gg][Mm]")){
+			  v_interface := i;
+			  break;
+		  	}
+		  }
+		  if (v_interface > -1) {
+    		  v_size_ipinterfaceinfo := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo);
+    		  for(var integer i := 0; i < v_size_ipinterfaceinfo; i := i+1) {
+    		   if(ispresent(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[i].domainName)) {
+    			v_domainname := PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[i].domainName;
+    		  	if (match(substr(v_domainname, 0, 5), pattern "[Pp][Cc][Ss][Cc][Ff]")
+    		  	or match(substr(v_domainname, 0, 5), pattern "[Pp][Tt][Ee][Cc][Hh]")) {
+    			  v_ipinterfaceinfo := i;
+     	        }
+    		   }
+    		  }
+		  } else {
+			log ("P-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.");
+			return "P-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+		  }
+		  if (v_ipinterfaceinfo > -1) {
+     	  	return PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[v_ipinterfaceinfo].IpAddress;
+		  } else {
+			log ("P-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.");
+			return "P-CSCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+		  }
+     	}
+        
+    	/**
+    	 * @desc Get the IBCF FQDN address of referenced EUT 
+    	 * @return if a IBCF is avaiable, the domainname of the IBCF, 
+    	 *         otherwise error_string
+    	 */
+     	function f_GetEUTIbcfAddress(integer p_ProductIdx) return charstring {
+		  var integer v_size_interfaces := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces);
+		  var integer v_size_ipinterfaceinfo;
+		  var integer v_interface := -1;
+		  var integer v_ipinterfaceinfo := -1;
+		  var charstring v_domainname;
+		  
+		  for(var integer i := 0; i < v_size_interfaces; i := i+1) {
+		  	if (match(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[i].interfaceName, pattern "[Mm][Ww]")){
+			  v_interface := i;
+		  	}
+		  }
+		  if (v_interface > -1) {
+    		  v_size_ipinterfaceinfo := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo);
+    		  for(var integer i := 0; i < v_size_ipinterfaceinfo; i := i+1) {
+				if(ispresent(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[i].domainName)) {
+    			v_domainname := PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[i].domainName;
+    		  	if (match(substr(v_domainname, 0, 5), pattern "[Ii][Bb][Cc][Ff]")) {
+    			  v_ipinterfaceinfo := i;
+     	        }
+				}
+    		  }
+		  } else {
+			log ("IBCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.");
+			return "IBCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+		  }
+		  if (v_ipinterfaceinfo > -1) {
+     	  	return PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[v_ipinterfaceinfo].domainName;
+		  } else {
+			log ("IBCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.");
+			return "IBCF of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+		  }
+     	}
+
+		/**
+		* @desc Get the Public Id of referenced UE
+		* @param p_ProductIdx index of the product the UE belongs to 
+		* @return PublicID of the UE of the productIdx
+		*/
+		function f_GetUEPublicId(integer p_ProductIdx) return charstring {
+			
+			var ImsUserInfo v_uePublicId := f_getSipUserId(p_ProductIdx);
+			
+			return v_uePublicId.publicId;
+		}
+		
+		
+    	/**
+    	 * @desc Get the UE URI containing the IP address of referenced EUT
+    	 */
+     	function f_getUeIpAddress(integer p_ProductIdx) return template SipUrl {
+     	  // TODO
+     	  return mw_SIP_URI_Base;
+     	}
+
+    	/**
+    	 * @desc Get the Public Id of referenced EUT 
+    	 */
+     	function f_GetEUTPublicId(integer p_ProductIdx) return charstring {
+     	  // TODO
+     	  return "TODO";
+     	}
+     	
+   		/**
+    	 * @desc Get the AS server FQDN  of referenced EUT 
+    	 */
+     	function f_GetEUTASServerAddress(integer p_ProductIdx) return charstring {
+           var integer v_size_interfaces := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces);
+           var integer v_size_ipinterfaceinfo;
+           var integer v_interface := -1;
+           var integer v_ipinterfaceinfo := -1;
+           var charstring v_domainname;
+      
+           for(var integer i := 0; i < v_size_interfaces; i := i+1) {
+            if (match(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[i].interfaceName, pattern "[Ii][Ss][Cc]")){
+             v_interface := i;
+            }
+           }
+           if (v_interface > -1) {
+            v_size_ipinterfaceinfo := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo);
+               for(var integer i := 0; i < v_size_ipinterfaceinfo; i := i+1) {
+                v_domainname := PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[i].domainName;
+                if (match(substr(v_domainname, 0, 2), pattern "[Aa][Ss]") 
+                or match(substr(v_domainname, 2, 2), pattern "[Aa][Ss]")
+                or match(substr(v_domainname, 9, 2), pattern "[Aa][Ss]")) {
+                 v_ipinterfaceinfo := i;
+                }
+               }
+           } else {
+            log ("AS of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.");
+            return "AS of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+           }
+           if (v_ipinterfaceinfo > -1) {
+            return PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[v_ipinterfaceinfo].domainName;
+           } else {
+            log ("AS of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.");
+            return "AS of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+           }
+     	}
+
+ 	}
+ 
+   		/**
+    	 * @desc Get the AS server IP Address  of referenced EUT 
+    	 */
+     	function f_GetEUTASServerIpAddress(integer p_ProductIdx) return charstring {
+           var integer v_size_interfaces := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces);
+           var integer v_size_ipinterfaceinfo;
+           var integer v_interface := -1;
+           var integer v_ipinterfaceinfo := -1;
+           var charstring v_domainname;
+      
+           for(var integer i := 0; i < v_size_interfaces; i := i+1) {
+            if (match(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[i].interfaceName, pattern "[Ii][Ss][Cc]")){
+             v_interface := i;
+            }
+           }
+           if (v_interface > -1) {
+            v_size_ipinterfaceinfo := sizeof(PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo);
+               for(var integer i := 0; i < v_size_ipinterfaceinfo; i := i+1) {
+                v_domainname := PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[i].domainName;
+                if (match(substr(v_domainname, 0, 2), pattern "[Aa][Ss]") 
+                or match(substr(v_domainname, 2, 2), pattern "[Aa][Ss]")
+                or (lengthof(v_domainname) >= 11 and match(substr(v_domainname, 9, 2), pattern "[Aa][Ss]"))) {
+                 v_ipinterfaceinfo := i;
+                }
+               }
+           } else {
+            log ("AS of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.");
+            return "AS of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+           }
+           if (v_ipinterfaceinfo > -1) {
+            return PX_PRODUCTS[p_ProductIdx].monitorInterfaces[v_interface].interfaceInfo.IpInterfaceInfo[v_ipinterfaceinfo].IpAddress;
+           } else {
+            log ("AS of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.");
+            return "AS of " & PX_PRODUCTS[p_ProductIdx].productName & " not found.";
+           }
+     	}
+
+ 
+ 	group interComponent {
+ 		/**
+		  * @desc
+		  *     This function waits for a sip message send from a given monitor
+		  *     component to mtc.
+		  * @param p_monitor Reference of Interface Monitor component
+		  * @param p_msg The Sip message
+		  */
+	 	function f_getSipMsgFromMonitor(InterfaceMonitor p_monitor, out SipMessage p_msg) runs on ImsTestCoordinator {
+            timer t_local := PX_MAX_MSG_WAIT;
+            t_local.start;            
+            alt {
+            	[]icpPort.receive (SipMessage:?) /*from p_monitor*/ -> value p_msg {
+            	   t_local.stop;
+            	   setverdict(pass, self, "***f_getMsgFromMonitor: SIP message received***");	
+            	}
+            	[]t_local.timeout {
+            	   	setverdict(fail, self, "***f_getMsgFromMonitor: SIP message not received***");    
+            	}
+            }
+        }	
+ 	}
+ 	
+	group altsteps {
+		
+		altstep a_default(in charstring p_TP) runs on ImsInterfaceMonitor {
+			[] dPort.receive(Request:?) {
+				log(self, "### a_default: Request default for " & p_TP );
+				repeat; 
+			}
+			[] dPort.receive(Response:?) {
+				log(self, "### a_default: Response default for " & p_TP );
+				repeat; 
+			}
+			[] dPort.receive {
+				log(self, "*** a_default: Received/ignored unexpected message when waiting for message complying to " & p_TP );
+            	//setverdict(fail, self, "### YANN: If execution is here, this means that the message was not properly decoded due to sip/sdp-codets exception, check MMagic logs");    
+				//stop; // YANN: If execution is here, this means that the message was not properly decoded 
+				repeat; 
+			}
+		}
+        
+		/**
+		* @desc This altstep add one alternative checking for a very specifc SIP request.
+										If it matches then the conformance verdict is set to requested verdict
+		* @param p_message The expected SIP request
+		* @param p_verdict Verdict to be used in case of match
+		* @param p_tpId The test purpose identifier
+		* * @param p_forwardMtc indicates if the received request should be forwarded to mtc
+		*/
+		altstep a_receive_sipRequest(
+			in template Request p_message,
+			in verdicttype p_verdict,
+			in charstring p_tpId,
+			in boolean p_forwardMtc,
+			in boolean p_checkMessage
+		) runs on ImsInterfaceMonitor {
+			var Request v_message;
+			[not p_checkMessage] dPort.receive(p_message) -> value v_message {
+				f_setConformanceVerdict(p_verdict, "***a_receive_sipRequest: Received expected SIP request complying to " & p_tpId & " on interface " & vc_interfaceName & " ***");
+				if(p_forwardMtc) {
+					var SipMessage v_msg;
+					v_msg.request := v_message;
+					log("### Forwarding message to MTC");	
+					icpPort.send(v_msg);
+				}
+			}
+			[p_checkMessage] dPort.check(receive(p_message) -> value v_message) {
+				f_setConformanceVerdict(p_verdict, "***a_receive_sipRequest: Checked expected SIP request complying to " & p_tpId & " on interface " & vc_interfaceName & " ***");
+				if(p_forwardMtc) {
+					var SipMessage v_msg;
+					v_msg.request := v_message;
+					log("### Forwarding message to MTC");
+					icpPort.send(v_msg);
+				}
+			}
+		}
+        
+		/**
+		* @desc This altstep add one alternative checking for a very specifc SIP response.
+										If it matches then the conformance verdict is set to requested verdict
+		* @param p_message The expected SIP response
+		* @param p_verdict Verdict to be used in case of match
+		* @param p_tpId The test purpose identifier
+		* @param p_forwardMtc indicates if the received reponse should be forwarded to mtc
+		*/
+		altstep a_receive_sipResponse(
+						in template Response p_message,
+						in verdicttype p_verdict,
+						in charstring p_tpId,
+						in boolean p_forwardMtc,
+						in boolean p_checkMessage
+		) runs on ImsInterfaceMonitor {
+			var Response v_message;
+			[not p_checkMessage] dPort.receive(p_message) -> value v_message {
+				f_setConformanceVerdict(p_verdict, "***a_receive_sipResponse: Received expected SIP request complying to " & p_tpId & " on interface " & vc_interfaceName & " ***");
+				if(p_forwardMtc) {
+					var SipMessage v_msg;
+					v_msg.response := v_message;
+					icpPort.send(v_msg);
+				}
+			}
+			[p_checkMessage] dPort.check(receive(p_message) -> value v_message) {
+				f_setConformanceVerdict(p_verdict, "***a_receive_sipResponse: Checked expected SIP request complying to " & p_tpId & " on interface " & vc_interfaceName & " ***");
+				if(p_forwardMtc) {
+					var SipMessage v_msg;
+					v_msg.response := v_message;
+					icpPort.send(v_msg);
+				}
+			}
+		}
+        
+	}// end group
+ 	
+ 	function f_setInterfaceNameOnComponent(charstring p_name) runs on ImsInterfaceMonitor{
+ 		vc_interfaceName := p_name;
+ 	}
+ 	
+	group general_td_functions {
+
+		/**
+         * @desc
+         *     Generic function for reading and verifying messages on the
+         *     interface associated to the ImsInterfaceMonitor instance. This
+         *     functions works as follows: First, messages are skipped according
+         *     to the p_skip template. The p_skip template contains a message
+         *     template and a counter indicating the number of received messages
+         *     matching the message template to be skipped. If not enough
+         *     messages matching the message template arrive at the interface,
+         *     the function fails after timout. Next, messages are consumed from
+         *     the interface and matched against the p_passCriteria template
+         *     list and the p_failCriteria template list. The function
+         *     terminates with pass if a message is received matching a
+         *     pass-template and terminates with fail if a fail-template
+         *     matches. Matching against pass-templates occurs bevor matching
+         *     agains fail-templates. If neither pass-templates nor
+         *     fail-templates match, then the functions continues reading from
+         *     the interface until a match arises, or timeout. The timeout value
+         *     is given by PX_MAX_MSG_WAIT [5.0 seconds, FFS]. Finally, if
+         *     p_forwardMtc is set to true, the last received message is stored
+         *     to be fetched and used later by the main test component. Some
+         *     special use cases: - Set p_skip.skipCounter to 0 to avoid
+         *     skipping, i.e. no skippin - Set p_skip.skipCounter to 0 and
+         *     p_skip.skipMessage to ? to skip exactly one message of any type
+         *     will be skipped. - If the list of fail-templates is empty, then
+         *     the function will wait for the first message maching a
+         *     pass-message, or fail after timeout.
+         * @param p_passCriteria list of message templates which lead to pass
+         * @param p_failCriteria list of message templates which lead to fail
+         * @param p_skip
+         *     Indicate how many messages from a specific sip template should be
+         *     skipped prior to checking
+         * @param p_tpId The Test Purpose identifier
+         * @param p_forwardMtc
+         *     indicate if the received Sip message should be forwarded to the
+         *     mtc
+         * @param p_checkMessage
+         *     indicate if the incomming message should only be checked
+         *     (port.check) or consumed (port.receive). The check operation
+         *     allows read access to the top element of incoming port queues
+         *     without removing the top element from the queue.
+         */     
+        function f_imsIot_receive( 
+          in template SipMessageList p_passCriteria,
+          in template SipMessageList p_failCriteria,
+          in template SkipType p_skip,
+          in charstring p_tpId,
+          in boolean p_forwardMtc,
+          in boolean p_checkMessage
+        ) runs on ImsInterfaceMonitor { 
+            var integer v_size := sizeof(p_failCriteria); 
+            var DefaultList v_defaultArray;
+			var integer i := 0;
+			var integer v_size_ai := sizeof(PX_AVAILABLE_INTERFACES);
+
+log ("### f_imsIot_receive: passCriteria=", p_passCriteria);
+log ("### f_imsIot_receive: failCriteria=", p_failCriteria);
+			
+			// check if interface is available
+			for(i := 0; i < v_size_ai; i := i+1) {
+				if (PX_AVAILABLE_INTERFACES[i].interfaceName == vc_interfaceName) {
+					if (PX_AVAILABLE_INTERFACES[i].available == false) {
+						setverdict(inconc, self, "******f_imsIot_receive: Interface " & PX_AVAILABLE_INTERFACES[i].interfaceName & " not available and is not evaluated******" );
+					} else { // Interface is available
+						v_defaultArray[0] := activate(a_default(p_tpId));
+						f_activateImsSipDefaults(v_defaultArray, 1, p_failCriteria, fail, p_tpId, p_forwardMtc, p_checkMessage);
+						f_activateImsSipDefaults(v_defaultArray, v_size + 1, p_passCriteria, pass, p_tpId, p_forwardMtc, p_checkMessage);
+						f_gen_receive(p_tpId, p_skip);
+	
+						for (i := 0; i < sizeof(v_defaultArray); i := i + 1) {
+							deactivate(v_defaultArray[i]);
+						}
+					}
+					break; // Exit loop
+				}	
+			} // 'for' loop           
+		}
+		
+		/**
+         * @desc This function implements skipping of messages as well as timeout handling.
+		 *       Prior to calling this function the message to be cheked for should be added
+		 *       as defaults.
+		 *       This function is independent of a specific interface component.
+         * @param p_tpId The Test Purpose identifier
+         * @param p_skipCount Indicate how many messages should be skipped prior to checking
+         */     
+        function f_gen_receive( 
+          in charstring p_tpId,
+          in template SkipType p_skip
+        ) runs on ImsInterfaceMonitor {
+            	var integer skipCount := valueof(p_skip.skipCount);
+				tc_wait.start;
+
+            	alt {
+            	// preamble (consume prior messages)
+            	[skipCount > 0 and ischosen(p_skip.skipMessage.request)] dPort.receive (p_skip.skipMessage.request) {
+            		skipCount := skipCount - 1;
+            		log("***f_gen_receive: Message skipped (intentionally) when checking for " & p_tpId & " at interface " & vc_interfaceName & " ****");
+					repeat;
+            	}
+            	[skipCount > 0 and ispresent(p_skip.skipMessage) and ischosen(p_skip.skipMessage.response)] dPort.receive (p_skip.skipMessage.response) {
+            		skipCount := skipCount - 1;
+            		log("***f_gen_receive: Message skipped (intentionally) when checking for " & p_tpId & " at interface " & vc_interfaceName & " ****");
+					repeat;
+            	}
+	            [] tc_wait.timeout {
+	            	f_setConformanceVerdict(inconc, "***f_gen_receive: Timer tc_wait expired when waiting for incoming message in " & p_tpId & " at interface " & vc_interfaceName & " ****");
+	            }
+            }
+            
+        }
+        
+		/**
+		* @desc Activates for each entry in a expected IMS SIP message list a default 
+		*       for receiving that message and setting the verdict as desired
+		* @param p_default Reference to default array where deaults are to be added
+		* @param p_startIdx Index into default array after which references for 
+		*                   defaults created in this function should be added
+		* @param p_list List of expected messages to be checked in default
+		* @param p_verdict Verdict to be set in case the incoming message matches 
+		                   any of the expcted messages 
+		* @param p_tpId Test Purpose identifir
+		*/
+		function f_activateImsSipDefaults(
+			inout DefaultList p_default,
+			in integer p_startIdx,
+			in template SipMessageList p_list,
+			in verdicttype p_verdict,
+			in charstring p_tpId,
+			in boolean p_forwardMtc,
+			in boolean p_checkMessage
+		) runs on ImsInterfaceMonitor {
+			var integer v_size := sizeof(p_list); 
+			var integer v_idx := p_startIdx;
+
+			for (var integer i := 0; i < v_size; i := i + 1) {
+				if (ischosen(p_list[i].request)) {
+					p_default[v_idx] := activate(
+						a_receive_sipRequest(p_list[i].request,p_verdict, p_tpId, p_forwardMtc, p_checkMessage)
+					);
+				} else {
+					p_default[v_idx] := activate(
+						a_receive_sipResponse(p_list[i].response,p_verdict, p_tpId, p_forwardMtc, p_checkMessage)
+					);
+				}
+				v_idx := v_idx + 1;
+			}
+//log ("### f_activateImsSipDefaults: ended");
+		}
+        
+	}//end group
+ 	
+ 	
+ 	group misc {
+ 		
+ 		/**
+          * @desc
+          *     This function generate a charstring with a given length used as
+          *     message body.
+          * @param p_length length of the message body
+          * @return message body (charstring)
+          */
+ 		function f_getMessageBody(in integer p_length) return charstring {
+ 			var charstring v_rtn := "";
+ 			
+ 			for(var integer i := 0; i < p_length; i:=i+1) {
+ 				v_rtn := v_rtn & "a";	
+ 			}
+ 			
+ 			return v_rtn;
+ 		}
+ 		
+			function f_getContactAddr(in Contact contact) return SipUrl {
+				var SipUrl v_SipUrl;
+				
+				var ContactAddress addr := contact.contactBody.contactAddresses[0];
+
+				if (ischosen (addr.addressField.nameAddr)) {
+					v_SipUrl := addr.addressField.nameAddr.addrSpec;
+				} else {
+					v_SipUrl := addr.addressField.addrSpecUnion;
+				}
+				
+				return (v_SipUrl);
+			}
+ 			
+ 	}
+ 
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_Templates.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_Templates.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_Templates.ttcn	(revision 22)
@@ -0,0 +1,2054 @@
+/*
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides the templates for Interoperability tests.
+ */
+
+module AtsImsIot_Templates {
+
+	import from LibCommon_BasicTypesAndValues {type UInt16;}
+	
+	import from LibCommon_VerdictControl {type FncRetCode;}
+	
+	import from LibIot_TypesAndValues {
+		type
+			InterfaceInfoList,
+			ProtocolFilter,
+			GeneralConfigurationReq,
+			GeneralConfigurationRsp,
+			SetFilterReq,
+			SetFilterRsp,
+			StartTrafficCaptureReq,
+			StartTrafficCaptureRsp,
+			StopTrafficCaptureReq,
+			StopTrafficCaptureRsp,
+			IpAddress,
+			Status;
+	}
+	import from AtsImsIot_TypesAndValues {type SipMessage;}
+
+	import from LibSip_SIPTypesAndValues all;
+	
+	import from LibSip_Templates all;
+	
+	import from LibIot_PIXITS {
+		modulepar
+			PX_IOT_TIMESTAMP_OFFSET,
+			PX_IOT_PCAP_SESSIONS_PATH,
+			PX_IOT_RECORD_MODE,
+			PX_IOT_EUTs_IFACE_INFO_LIST,
+			PX_IOT_FILE_MERGE_LIST,
+         	PX_IOT_FILE_MERGE_PATH,
+         	PX_IOT_MERGE_TOOL_PATH,
+         	PX_IOT_IFACES;
+	}
+	
+	group adapterMsgTemplates {
+		template SetFilterReq m_SetFilterReq(ProtocolFilter p_protocol, InterfaceInfoList p_iterfaces)	:= {
+			protocol := p_protocol,
+			interfaceInfos := p_iterfaces
+		}
+		
+		template SetFilterRsp mw_SetFilterRsp(template Status p_status) := {
+			status := p_status
+		}
+	}
+
+	
+	group sipTemplates {
+    
+		/**
+		* @desc SIP request template
+		* @param p_request SIP request
+		*/
+		template SipMessage mw_SipRequest(in template (present) Request p_request) := {
+			request := p_request
+		}
+    
+		/**
+		* @desc SIP response template
+		* @param p_response SIP response
+		*/
+		template SipMessage mw_SipResponse(in template (present) Response p_response) := {
+			response := p_response
+		}
+	}//end group
+	
+	group modifiedSIPBaseTemplates {
+		
+		/**
+		* 
+		* @desc Message Request containing a message body greater than 1500 bytes.
+		*/
+		template MESSAGE_Request mdw_TP_IMS_4002_01(template CallId p_callId) modifies mw_MESSAGE_Request_Base := {
+			msgHeader := {
+				contact := *
+			},
+			messageBody := {
+				textplain := pattern "?#(1500,)" 
+			}
+		}
+		
+		/**
+		 * 
+		 * @desc REGISTER Request containing secuity client header.
+		 */
+    template REGISTER_Request mdw_TP_IMS_5011_01_gm modifies mw_REGISTER_Request_Base := {
+      msgHeader := {
+		securityClient := ?
+      }
+    }
+    
+		/**
+		* 
+		* @desc REGISTER Request containing secuity client header.
+		*/
+		template REGISTER_Request mdw_TP_IMS_5011_02_gm modifies mw_REGISTER_Request_Base := {
+			msgHeader := {
+				securityClient := ?
+			}
+		}
+    
+    /**
+     * 
+     * @desc REGISTER Request checking TP_IMS_5011_01.
+     */
+    template REGISTER_Request mdw_TP_IMS_5011_01p_ic ( charstring p_EUTHostname ) modifies mw_REGISTER_Request_Base := {
+      msgHeader := {
+        path := mw_PathDef (p_EUTHostname), 
+        require :=  mw_Require ({"path", *}), 
+		pChargingVector := {
+			fieldName := P_CHARGING_VECTOR_E,
+			chargeParams := {
+				{id := "icid-value", paramValue := ?},
+				{id := "orig-ioi", paramValue := ?},
+				*
+			}
+		},
+        authorization := m_Authorization(mw_credentialIntegrityNo), 
+        securityClient := omit,
+        securityVerify :=omit,
+        pVisitedNetworkID := mw_PVisitedNetworkIDAny
+      }
+    }
+    
+	/**
+	* 
+	* @desc REGISTER Request checking TP_IMS_5011_01.
+	*/
+	template REGISTER_Request mdw_TP_IMS_5011_01f_ic modifies mw_REGISTER_Request_Base := {
+		msgHeader := {
+			pChargingVector := {
+				fieldName := P_CHARGING_VECTOR_E,
+				chargeParams := {
+					{id := "term-ioi", paramValue := ?},
+					*
+				}
+			}
+		}
+	}    
+    
+   /**
+     * 
+     * @desc REGISTER Request checking TP_IMS_5134_01.
+     */
+    template REGISTER_Request mdw_TP_IMS_5134_01_ic ( charstring p_EUTHostname ) modifies mw_REGISTER_Request_Base := {
+      msgHeader := {
+        path := mw_PathDef (p_EUTHostname)
+      }
+    }
+
+    /**
+     * 
+     * @desc REGISTER Request checking TP_IMS_5011_02.
+     */
+    template REGISTER_Request mdw_TP_IMS_5011_02p_ic ( charstring p_EUTHostname  ) modifies mw_REGISTER_Request_Base := {
+      msgHeader := {
+        path := mw_PathDef (p_EUTHostname),
+        require :=  mw_Require ({"path", *}), 
+        pChargingVector :=  mw_PChargingVector({
+            {id := "icid-value", paramValue := ?}, 
+            {id := "orig-ioi", paramValue := ?}, 
+            *
+          }),
+        authorization := m_Authorization(mw_credentialIntegrityYes), 
+        securityClient := omit,
+        securityVerify :=omit,
+        pVisitedNetworkID := mw_PVisitedNetworkIDAny
+      }
+    }
+
+	/**
+	* 
+	* @desc REGISTER Request checking TP_IMS_5011_02.
+	*/    
+	template REGISTER_Request mdw_TP_IMS_5011_02f_ic modifies mw_REGISTER_Request_Base := {
+		msgHeader := { 
+			pChargingVector :=  mw_PChargingVector({
+				{id := "term-ioi", paramValue := ?}, 
+				*
+			})
+		}
+	}    
+    
+	/**
+	* 
+	* @desc REGISTER Request checking TP_IMS_5089_01.
+	*/
+	template REGISTER_Request mdw_TP_IMS_5089_01_ic_when modifies mw_REGISTER_Request_Base := {
+		msgHeader := {
+			authorization := m_Authorization(mw_credentialIntegrityNo) 
+		}
+	}
+
+	/**
+	* 
+	* @desc REGISTER Request checking TP_IMS_5092_01.
+	*/
+	template REGISTER_Request mdw_TP_IMS_5092_01_ic_when modifies mw_REGISTER_Request_Base := {
+		msgHeader := {
+			authorization := m_Authorization(mw_credentialIntegrityNo) 
+		}
+	}
+
+    /**
+     * 
+     * @desc 200 OK  message for TP_IMS_5092_01
+     */
+    template Response mdw_TP_IMS_5092_01_ic (charstring p_EUTHostname, template SipUrl p_eutBUri) modifies mw_200OK_Base := {
+		msgHeader := {
+			path := mw_PathDef (p_EUTHostname), 
+			pAssociatedURI := {
+				fieldName := P_ASSOCIATED_URI_E, 
+				nameAddrList := ?
+			},
+			pChargingVector :=  mw_PChargingVector({  // @TODO indicating operator_identifier of IMS_? (IUT_?)?
+							{id := "term-ioi", paramValue := ?}, 
+							*
+			}),
+			serviceRoute := mw_ServiceRoute (p_eutBUri),
+			contact := {
+				fieldName := CONTACT_E,
+				contactBody := {
+					contactAddresses := ?
+				}
+			} 
+		}
+    }
+   /**
+     * 
+     * @desc 401 Unauthorized   message checking f_mtc_check_TP_IMS_5089_01_ic.
+     */
+    template Response mdw_TP_IMS_5089_01_ic modifies mw_401Unauthorized_Base := {
+      msgHeader := {
+        wwwAuthenticate := mw_WwwAuthenticate
+      }
+    }
+
+
+   /**
+     * 
+     * @desc SUBSCRIBE checking TP_IMS_5044_01.
+     */
+    template SUBSCRIBE_Request mdw_TP_IMS_5044_01_ic(
+		template SipUrl p_subscribe_uri,
+    	template SipUrl p_eutAUri, 
+        template charstring p_EUTB_PublicId
+    ) modifies mw_SUBSCRIBE_Request_Base := {
+      
+      requestLine := {
+        method := SUBSCRIBE_E,
+        requestUri := p_subscribe_uri, // @TODO
+        sipVersion := c_sipNameVersion
+      },
+      msgHeader := {
+        fromField := mw_From (p_eutAUri),
+        toField := mw_To_NameAddr_SipUrl (p_EUTB_PublicId, ?, ?),
+        event := m_Event_reg,
+        expires := ?, // checked outside the template
+        pAssertedID := mw_PAssertedID(mw_PAssertedIDValue(p_eutAUri)),
+        pChargingVector :=  mw_PChargingVector({
+            {id := "icid-value", paramValue := *}, 
+            *
+          })
+      }
+    }
+
+    template SUBSCRIBE_Request mdw_TP_IMS_5405_01_ic
+    modifies mw_SUBSCRIBE_Request_Base := {
+      
+      requestLine := {
+        method := SUBSCRIBE_E,
+        requestUri := ?,
+        sipVersion := c_sipNameVersion
+      },
+      msgHeader := {
+      	via := mw_Via (?), // TODO
+		recordRoute := mw_recordroute(?), // @TODO       		
+      	route := mw_route(?), // TODO
+        pChargingVector :=  omit
+          }
+    }
+
+    /**
+     * 
+     * @desc INVITE Request checking TP_IMS_5046_01
+     */
+    template INVITE_Request mdw_TP_IMS_5046_01_ic (template SipUrl p_pcscfEutAUri, template SipUrl p_userEutBUrl)
+     modifies mw_INVITE_Request_Base := {
+      msgHeader := {
+		route := {
+    		fieldName := ROUTE_E,
+    		routeBody := ? // complement (mw_routeBody(p_pcscfEutAUri)) // to be checked outside template
+			},
+      	via := {
+  			fieldName := VIA_E,
+  			viaBody := ? // superset(mw_ViaBody_interface(p_pcscfEutAUri.hostPort)) // to be checked outside template
+      		},
+      	recordRoute := {
+    		fieldName := RECORD_ROUTE_E,
+    		routeBody := {mw_routeBody(p_pcscfEutAUri), *}       		
+      	},
+		pPreferredID := omit,
+		pAssertedID := mw_PAssertedID(mw_PAssertedIDValue(p_userEutBUrl)),
+        pChargingVector :=  mw_PChargingVector({
+            {id := "icid-value", paramValue := *}, 
+            *
+          })
+      }
+    }
+
+	/**
+	  * 
+	  * @desc INVITE Request checking TP_IMS_5048_01
+	  */
+	template INVITE_Request mdw_TP_IMS_5048_01_ic (template SipUrl p_pcscfEutAUri)
+	 modifies mw_INVITE_Request_Base := {
+	  msgHeader := {
+		route := {
+			fieldName := ROUTE_E,
+			routeBody := {
+    			*, 
+    			complement(mw_routeBody(p_pcscfEutAUri)),
+    			*
+			}
+		},
+		via := {
+			fieldName := VIA_E,
+			viaBody := ? // superset(mw_ViaBody_interface(p_pcscfEutAUri.hostPort)) // to be checked outside template
+		},
+		recordRoute := {
+			fieldName := RECORD_ROUTE_E,
+			routeBody := {mw_routeBody(p_pcscfEutAUri), *}       		
+		}
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc BYE Request checking TP_IMS_5052_01 on MW
+	  */
+	template BYE_Request mdw_TP_IMS_5052_01_p_ic(template CallId p_callId, template RecordRoute p_route)
+	 modifies mw_BYE_Request_Base := {
+	  msgHeader := {
+		route := {
+			fieldName := ROUTE_E,
+			routeBody := *
+		},
+		recordRoute := p_route
+	  }
+	}
+
+	template BYE_Request mdw_TP_IMS_5052_01_f_ic(
+		template CallId p_callId, 
+		template SipUrl p_pcscfEutAUri)
+	modifies mw_BYE_Request_Base := {
+		msgHeader := {
+    		route := {
+    			fieldName := ROUTE_E,
+    			routeBody := {
+    				*, 
+    				mw_routeBody(p_pcscfEutAUri),
+    				*
+    			}
+    		}
+    	}
+	}
+
+    
+	/**
+	  * 
+	  * @desc 180 Ringing Response checking TP_IMS_5055_01 on MW
+	  */
+	template Response mdw_TP_IMS_5055_01_ic(template SipUrl p_pcscfEutAUri, template SipUrl p_userEutAUri) 
+	 modifies mw_180Ringing_Base := {
+	  msgHeader := {
+		recordRoute := {
+			fieldName := RECORD_ROUTE_E,
+			routeBody := {mw_routeBody(p_pcscfEutAUri), *}       		
+		},
+		pPreferredID := omit,
+		pAssertedID := mw_PAssertedID(mw_PAssertedIDValue(p_userEutAUri))//TODO containing public identitiy sent in P-Called_Party-ID header in the initial request
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc 200 OK Response checking TP_IMS_5055_02 on MW
+	  */
+	template Response mdw_TP_IMS_5055_02_ic(template SipUrl p_pcscfEutAUri, template SipUrl p_userEutAUri) 
+	 modifies mw_200OK_Base := {
+	  msgHeader := {
+		recordRoute := {
+			fieldName := RECORD_ROUTE_E,
+			routeBody := {mw_routeBody(p_pcscfEutAUri), *}       		
+		},
+		pPreferredID := omit,
+		pAssertedID := mw_PAssertedID(mw_PAssertedIDValue(p_userEutAUri))//TODO containing public identitiy sent in P-Called_Party-ID header in the initial request
+	  }
+	}
+
+	/**
+	  * 
+	  * @desc INVITE Request checking TP_IMS_5067_01 on MW
+	  */
+	template INVITE_Request mdw_TP_IMS_5067_01_ic 
+	 modifies mw_INVITE_Request_Base := {
+    	msgHeader := {
+			pChargingVector :=  mw_PChargingVector({
+				{id := "access-network-charging-info", paramValue := ?}, 
+				*
+			})
+    	}
+	}
+    
+     /**
+       * 
+       * @desc CANCEL Request checking TP_IMS_572_02 on gm
+       */
+     template CANCEL_Request mdw_TP_IMS_5072_02_gm (template CallId p_callId) 
+      modifies mw_CANCEL_Request_Base := {
+       msgHeader := {
+		reason := {
+			fieldName := REASON_E,
+			reasonValues := {
+				{
+					token := "503 Service Unavailable",
+					reasonParams := *
+				},
+				*
+			}
+		}
+      }
+     }
+
+	/**
+	  * 
+	  * @desc INVITE Request checking TP_IMS_5080_01 on MW
+	  */
+	template INVITE_Request mdw_TP_IMS_5080_01_ic 
+	 modifies mw_INVITE_Request_Base := {
+	  msgHeader := {
+		pChargingVector :=  mw_PChargingVector({
+			{id := "access-network-charging-info", paramValue := ?}, //note access-network-charging-info should be updated
+			*
+		})
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc 200 OK Response checking TP_IMS_5082_01 on MW
+	  */
+	template Response mdw_TP_IMS_5082_01_ic 
+	 modifies mw_200OK_Base := {
+		msgHeader := {
+			pChargingVector :=  mw_PChargingVector({
+				{id := "access-network-charging-info", paramValue := ?}, 
+				*
+			})
+		}
+	}
+    
+    /**
+    * 
+    * @desc SUBSCRIBE checking TP_IMS_5096_01.
+    */
+    template SUBSCRIBE_Request mdw_TP_IMS_5096_01_ic_when modifies mw_SUBSCRIBE_Request_Base := {
+		msgHeader := {
+			event := m_Event_reg
+		}
+    }
+    
+   /**
+     * @desc INVITE Request checking TP_IMS_5097_01
+     */
+    template INVITE_Request mdw_TP_IMS_5097_01_ic (template SipUrl p_SCSCF_SIP_URI)
+     modifies mw_INVITE_Request_Base := {
+      msgHeader := {
+		route := ({
+			fieldName := ROUTE_E,
+			routeBody := {
+				*, 
+				complement(mw_routeBody(p_SCSCF_SIP_URI)),
+				*
+			}
+		}, omit),
+      	recordRoute := {
+    		fieldName := RECORD_ROUTE_E,
+    		routeBody := {mw_routeBody(p_SCSCF_SIP_URI), *}       		
+      	},        
+		pChargingVector := {
+			fieldName := P_CHARGING_VECTOR_E,
+			chargeParams := {
+				*,
+				{id := "icid-value", paramValue := ?},
+				*,
+				{id := "orig-ioi", paramValue := ?},
+				*,
+				complement({id := "term-ioi", paramValue := ?}),
+				*,
+				complement({id := "access-network-charging-info", paramValue := ?}),
+				*
+			}
+		}
+      }
+    }
+    
+   
+	/**
+	  * @desc INVITE Request checking TP_IMS_5097_02
+	  */
+	template INVITE_Request mdw_TP_IMS_5097_02_ic (
+		template SipUrl p_SIP_URI,
+		template SipUrl p_TEL_URI)
+	 modifies mw_INVITE_Request_Base := {
+	  msgHeader := {
+		pAssertedID := {
+			fieldName := P_ASSERTED_ID_E,
+			pAssertedIDValueList := {
+				*, 
+				({ nameAddr := mw_NameAddr(p_SIP_URI)}, {addrSpecUnion := mw_SIP_URI_Base}),  
+				*, 
+				({nameAddr := mw_NameAddr(p_TEL_URI)}, {addrSpecUnion := mw_TEL_URI_Base}), 
+				*
+			}
+		}			        
+	  }
+	}
+    
+	/**
+	  * @desc INVITE Request checking TP_IMS_5097_04
+	  */
+	template INVITE_Request mdw_TP_IMS_5097_04_gm(template SipUrl p_requestUri)
+	 modifies mw_INVITE_Request_Base := {
+	  requestLine := {
+		requestUri := p_requestUri
+	  }
+	}
+    
+	/**
+	  * @desc INVITE Request checking TP_IMS_5097_04
+	  */
+	template INVITE_Request mdw_TP_IMS_5097_04_ic(template SipUrl p_requestUri)
+	 modifies mw_INVITE_Request_Base := {
+	  requestLine := {
+		requestUri := p_requestUri
+	  },
+	  msgHeader := {        
+		pChargingVector := {
+			fieldName := P_CHARGING_VECTOR_E,
+			chargeParams := {
+				*,
+				complement({id := "access-network-charging-info", paramValue := ?}),
+				*
+			}
+		}
+				        
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc BYE Request checking TP_IMS_5107_01 on MW
+	  */
+	template BYE_Request mdw_TP_IMS_5107_01_ic(template CallId p_callId, template SipUrl p_SCSCF_SIP_URI)
+	 modifies mw_BYE_Request_Base := {
+	  msgHeader := {
+		route := {
+			fieldName := ROUTE_E,
+			routeBody := {
+				*, 
+				complement(mw_routeBody(p_SCSCF_SIP_URI)),
+				*
+			}
+		}
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc ACK Request checking TP_IMS_5107_02 on MW
+	  */
+	template ACK_Request mdw_TP_IMS_5107_02_ic(template CallId p_callId, template SipUrl p_SCSCF_SIP_URI)
+	 modifies mw_ACK_Request_Base := {
+	  msgHeader := {
+		route := {
+			fieldName := ROUTE_E,
+			routeBody := {
+				*, 
+				complement(mw_routeBody(p_SCSCF_SIP_URI)),
+				*
+			}
+		}
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc CANCEL Request checking TP_IMS_5107_03 on MW
+	  */
+	template CANCEL_Request mdw_TP_IMS_5107_03_ic (template CallId p_callId, template SipUrl p_SCSCF_SIP_URI) 
+	modifies mw_CANCEL_Request_Base := {
+		msgHeader := {
+			route := (
+				omit, 
+					{
+					fieldName := ROUTE_E,
+					routeBody := {
+						*, 
+						complement(mw_routeBody(p_SCSCF_SIP_URI)),
+						*
+					}
+				}
+			)
+		}
+	}
+    
+	/**
+	  * 
+	  * @desc INVITE Request checking TP_IMS_5108_01 on MW
+	  */
+	template INVITE_Request mdw_TP_IMS_5108_01_ic(
+		template SipUrl p_SCSCF_Uri,
+		template GenericParam p_param
+	) modifies mw_INVITE_Request_Base := {
+	 msgHeader := {
+		route := (omit, 
+					{
+						fieldName := ROUTE_E,
+						routeBody := {
+							*, 
+							complement(mw_routeBody(p_SCSCF_Uri)),
+							*
+						}
+					}
+				), 
+		recordRoute := {
+			fieldName := RECORD_ROUTE_E,
+			routeBody := {{
+				nameAddr := {
+					displayName := *,
+					addrSpec := p_SCSCF_Uri	
+				},
+				rrParam := *
+			}, *}
+		},
+		pChargingVector := {
+			fieldName := P_CHARGING_VECTOR_E,
+			chargeParams := {
+				p_param,
+				*
+			}
+		}	
+	 }
+	}
+	
+	/**
+	  * 
+	  * @desc INVITE Request checking TP_IMS_5108_01_f on MW
+	  * 		ifpresent ioi params than fail
+	  */
+	template INVITE_Request mdw_TP_IMS_5108_01_f_ic
+	 modifies mw_INVITE_Request_Base := {
+	  msgHeader := {
+		pChargingVector := {
+			fieldName := P_CHARGING_VECTOR_E,
+			chargeParams := {
+				{id := "orig-ioi", paramValue := ?},
+				{id := "term-ioi", paramValue := ?},
+				*
+			}
+		}	
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc INVITE Request checking TP_IMS_5108_03 on ISC
+	  */
+	template INVITE_Request mdw_TP_IMS_5108_03_isc(
+		template SipUrl p_ASB_Uri,
+		template SipUrl p_SCSCF_Uri
+	) modifies mw_INVITE_Request_Base := {
+	  msgHeader := {
+		route := {
+			fieldName := ROUTE_E,
+			routeBody := {
+				{
+    				nameAddr := {
+    					displayName := *,
+    					addrSpec := p_ASB_Uri	
+    				},
+    				rrParam := *
+				},
+				{
+    				nameAddr := {
+    					displayName := *,
+    					addrSpec := p_SCSCF_Uri	
+    				},
+    				rrParam := *
+				},
+				*
+				
+			}
+		},
+		pChargingVector := {
+			fieldName := P_CHARGING_VECTOR_E,
+			chargeParams := {
+    			{id := "orig-ioi", paramValue := ?},
+    			*
+			}
+		}	
+	  }
+	}
+	
+	/**
+	  * 
+	  * @desc INVITE Request checking TP_IMS_5108_03_f on ISC
+	  * 		ifpresent ioi params than fail
+	  */
+	template INVITE_Request mdw_TP_IMS_5108_03_f_isc
+		modifies mw_INVITE_Request_Base := {
+			msgHeader := {
+		pChargingVector := {
+			fieldName := P_CHARGING_VECTOR_E,
+			chargeParams := {
+				{id := "term-ioi", paramValue := *},
+				*
+			}
+		}	
+			}
+	}
+    
+	/**
+	  * 
+	  * @desc 180 Ringing Response checking TP_IMS_5115_01 on MW
+	  */
+	template Response mdw_TP_IMS_5115_01_ic 
+	 modifies mw_180Ringing_Base := {
+	  msgHeader := {
+		pChargingVector :=  mw_PChargingVector({ 
+    		{id := "orig-ioi", paramValue := ?}, 
+    		{id := "term-ioi", paramValue := ?}, 
+    		*
+		})
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc 200 OK Response checking TP_IMS_5115_02 on MW
+	  */
+	template Response mdw_TP_IMS_5115_02_ic 
+	 modifies mw_200OK_Base := {
+	  msgHeader := {
+		pChargingVector :=  mw_PChargingVector({ 
+			{id := "orig-ioi", paramValue := ?}, 
+			{id := "term-ioi", paramValue := ?}, 
+			*
+		})
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc 180 Ringing Response checking TP_IMS_5115_03 on MW
+	  */
+	template Response mdw_TP_IMS_5115_03_ic(
+    	template SipUrl p_SIP_URI,
+    	template SipUrl p_TEL_URI)
+	 modifies mw_180Ringing_Base := {
+	  msgHeader := {
+		pAssertedID := {
+			fieldName := P_ASSERTED_ID_E,
+			pAssertedIDValueList := {
+				*, 
+				{ nameAddr := mw_NameAddr(p_SIP_URI)}, 
+				*, 
+				{nameAddr := mw_NameAddr(p_TEL_URI)},
+				*
+			}
+		}
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc 200 OK Response checking TP_IMS_5115_04 on MW
+	  */
+	template Response mdw_TP_IMS_5115_04_ic(
+    	template SipUrl p_SIP_URI,
+    	template SipUrl p_TEL_URI) 
+	 modifies mw_200OK_Base := {
+	  msgHeader := {
+		pAssertedID := {
+			fieldName := P_ASSERTED_ID_E,
+			pAssertedIDValueList := {
+				*, 
+				{ nameAddr := mw_NameAddr(p_SIP_URI)}, 
+				*, 
+				{nameAddr := mw_NameAddr(p_TEL_URI)},
+				*
+			}
+		}
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc 200 OK Response checking TP_IMS_5115_08 on MW
+	  */
+	template Response mdw_TP_IMS_5115_08_ic 
+	 modifies mw_200OK_Base := {
+	  msgHeader := {
+		pChargingVector :=  mw_PChargingVector({ 
+			{id := "orig-ioi", paramValue := ?}, 
+			{id := "term-ioi", paramValue := ?}, 
+			*
+		})
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc 180 Ringing Response checking TP_IMS_5131_01 on MW
+	  */
+	template Response mdw_TP_IMS_5131_01_ic 
+	 modifies mw_180Ringing_Base := {
+	  msgHeader := {
+		pChargingFunctionAddresses := omit
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc 200 OK Response checking TP_IMS_5131_02 on MW
+	  */
+	template Response mdw_TP_IMS_5131_02_ic 
+	 modifies mw_200OK_Base := {
+	  msgHeader := {
+		pChargingFunctionAddresses := omit
+	  }
+	}
+
+     /**
+       * 
+       * @desc INVITE Request checking TP_IMS_5135_01
+       */
+     template INVITE_Request mdw_TP_IMS_5135_01_ic (template SipUrl p_ibcfEutAUri)
+      modifies mw_INVITE_Request_Base := {
+       msgHeader := {
+          recordRoute := {
+           fieldName := RECORD_ROUTE_E,
+           routeBody := {mw_routeBody(p_ibcfEutAUri), *}       		
+          }
+       }
+     }
+
+	/**
+	  * 
+	  * @desc INVITE Request checking TP_IMS_5137_01
+	  */
+	template INVITE_Request mdw_TP_IMS_5137_01_ic (template SipUrl p_ibcfEutAUri)
+	 modifies mw_INVITE_Request_Base := {
+	  msgHeader := {
+		route := {
+			fieldName := ROUTE_E,
+			routeBody := {
+				mw_routeBodyTH(p_ibcfEutAUri),
+				*
+			}
+		},
+		via := {
+			fieldName := VIA_E,
+			viaBody := {{
+				sentProtocol := *,
+				sentBy := *,
+				viaParams :={{
+    				id:="tokenized-by",
+    				paramValue := *
+    			}}
+			}}
+		},
+		recordRoute := {
+			fieldName := RECORD_ROUTE_E,
+			routeBody := {mw_routeBodyTH(*), *}       		
+		}
+	 }
+	}
+    
+	/**
+	  * 
+	  * @desc 180 Ringing Response checking TP_IMS_5137_02 on MW
+	  */
+	template Response mdw_TP_IMS_5137_02_ic 
+	 modifies mw_180Ringing_Base := {
+	  msgHeader := {
+		via := {
+			fieldName := VIA_E,
+			viaBody := {{
+				sentProtocol := *,
+				sentBy := *,
+				viaParams :={{
+					id:="tokenized-by",
+					paramValue := *
+				}}
+			}}
+		},
+		recordRoute := {
+			fieldName := RECORD_ROUTE_E,
+			routeBody := {mw_routeBodyTH(*), *}       		
+		}
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc 200 OK Response checking TP_IMS_5137_03 on MW
+	  */
+	template Response mdw_TP_IMS_5137_03_ic 
+	 modifies mw_200OK_Base := {
+	  msgHeader := {
+		via := {
+			fieldName := VIA_E,
+			viaBody := {{
+				sentProtocol := *,
+				sentBy := *,
+				viaParams :={{
+					id:="tokenized-by",
+					paramValue := *
+				}}
+			}}
+		},
+		recordRoute := {
+			fieldName := RECORD_ROUTE_E,
+			routeBody := {mw_routeBodyTH(*), *}       		
+		}
+	  }
+	}
+	
+	/**
+	  * 
+	  * @desc BYE Request checking TP_IMS_5139_01 on MW
+	  */
+	template BYE_Request mdw_TP_IMS_5139_01_ic(
+		template CallId p_callId,
+		template SipUrl p_UE_URI,
+		template To  p_to, 
+		template From  p_from, 
+		template CSeq p_cSeq, 
+		template Route p_route
+	) modifies mw_BYE_Request_Base := {
+		requestLine := {
+			requestUri := p_UE_URI
+		},
+		msgHeader := {
+			callId := p_callId,
+			cSeq := p_cSeq,			
+			fromField := p_from,			
+			reason := ?,
+			route := p_route,		
+			toField := p_to	
+		}
+	}
+
+	  
+	/**
+	  * 
+	  * @desc BYE Request checking TP_IMS_5301_01 on MW
+	  */
+	template BYE_Request mdw_TP_IMS_5301_01_ic(template CallId p_callId, template SipUrl p_SCSCF_SIP_URI)
+	 modifies mw_BYE_Request_Base := {
+	  msgHeader := {
+		route := {
+			fieldName := ROUTE_E,
+			routeBody := {
+				*, 
+				complement(mw_routeBody(p_SCSCF_SIP_URI)),
+				*
+			}
+		},
+		recordRoute := {
+			fieldName := RECORD_ROUTE_E,
+			routeBody := {mw_routeBody(p_SCSCF_SIP_URI), *}       		
+		}
+	  }
+	}
+    
+    /**
+      * 
+      * @desc 180 Ringing Response checking TP_IMS_5308_01 on GM
+      */
+    template Response mdw_TP_IMS_5308_01_gm 
+     modifies mw_180Ringing_Base := {
+      msgHeader := {
+     	pChargingFunctionAddresses := ?
+      }
+    }
+    
+	/**
+	  * 
+	  * @desc 180 Ringing Response checking TP_IMS_5308_01 on ISC
+	  */
+	template Response mdw_TP_IMS_5308_01_isc 
+	 modifies mw_180Ringing_Base := {
+	  msgHeader := {
+		pChargingFunctionAddresses :=?
+	 }
+	}
+        
+    /**
+      * 
+      * @desc 200 OK Response checking TP_IMS_5308_02 on GM
+      */
+    template Response mdw_TP_IMS_5308_02_gm 
+     modifies mw_200OK_Base := {
+      msgHeader := {
+     pChargingFunctionAddresses := ?
+      }
+    }
+        
+	/**
+	  * 
+	  * @desc 200 OK Response checking TP_IMS_5308_02 on ISC
+	  */
+	template Response mdw_TP_IMS_5308_02_isc 
+	 modifies mw_200OK_Base := {
+	  msgHeader := {
+		pChargingFunctionAddresses := ?
+	 }
+	}
+
+   /**
+     * 
+     * @desc INVITE Request checking TP_IMS_5310_01 on GM
+     */
+    template INVITE_Request mdw_TP_IMS_5310_01_gm 
+     modifies mw_INVITE_Request_Base := {
+      msgHeader := {
+        pChargingVector :=  mw_PChargingVector({
+            {id := "access-network-charging-info", paramValue := ?}, 
+            *
+          })
+      }
+    }
+    
+   /**
+     * 
+     * @desc INVITE Request checking TP_IMS_5310_01 on AS
+     */
+    template INVITE_Request mdw_TP_IMS_5310_01_isc 
+     modifies mw_INVITE_Request_Base := {
+      msgHeader := {
+        pChargingVector :=  mw_PChargingVector({
+            {id := "access-network-charging-info", paramValue := ?}, 
+            *
+          })
+      }
+    }
+
+   /**
+     * 
+     * @desc 200 OK Response checking TP_IMS_5312_01 on MW
+     */
+    template Response mdw_TP_IMS_5312_01_ic 
+     modifies mw_200OK_Base := {
+      msgHeader := {
+        pChargingVector :=  mw_PChargingVector({
+            {id := "access-network-charging-info", paramValue := ?}, 
+            *
+          })
+      }
+    }
+   /**
+     * 
+     * @desc 200 OK Response checking TP_IMS_5312_01 on AS
+     */
+    template Response mdw_TP_IMS_5312_01_isc 
+     modifies mw_200OK_Base := {
+      msgHeader := {
+        pChargingVector :=  mw_PChargingVector({
+            {id := "access-network-charging-info", paramValue := ?}, 
+            *
+          })
+      }
+    }
+
+	/**
+	  * 
+	  * @desc 433 Anonymity Disallowe Response checking TP_IMS_5313_01 on MW
+	  */
+	template Response mdw_TP_IMS_5313_01_ic 
+	 modifies mw_433Anony_Base := {
+	  msgHeader := {
+		pChargingVector :=  mw_PChargingVector({
+			{id := "access-network-charging-info", paramValue := ?}, 
+			*
+		})
+	  }
+	}
+	
+	/**
+	  * 
+	  * @desc 433 Anonymity Disallowe Response checking TP_IMS_5313_01 on AS
+	  */
+	template Response mdw_TP_IMS_5313_01_isc 
+	 modifies mw_433Anony_Base := {
+	  msgHeader := {
+		pChargingVector :=  mw_PChargingVector({
+			{id := "access-network-charging-info", paramValue := ?}, 
+			*
+			})
+	  }
+	}
+
+	/**
+	  * 
+	  * @desc INVITE Request checking TP_IMS_5404_01 on GM
+	  */
+	template INVITE_Request mdw_TP_IMS_5404_01_gm 
+	 modifies mw_INVITE_Request_Base := {
+	  msgHeader := {
+		pChargingFunctionAddresses := ?
+	 }
+	}
+
+	/**
+	  * 
+	  * @desc INVITE Request checking TP_IMS_5404_01 on MW
+	  */
+	template INVITE_Request mdw_TP_IMS_5404_01_ic 
+	 modifies mw_INVITE_Request_Base := {
+	  msgHeader := {
+		pChargingFunctionAddresses := omit
+	 }
+	}
+    
+	/**
+	  * 
+	  * @desc ACK Request checking TP_IMS_5408_01 on MW
+	  */
+	template ACK_Request mdw_TP_IMS_5408_01_ic(template CallId p_callId, template SipUrl p_IBCF_SIP_URI)
+	 modifies mw_ACK_Request_Base := {
+	  msgHeader := {
+		route := {
+			fieldName := ROUTE_E,
+			routeBody := {
+				mw_routeBodyTH(p_IBCF_SIP_URI),
+				*
+			}
+		},
+		via := {
+			fieldName := VIA_E,
+			viaBody := {{
+				sentProtocol := *,
+				sentBy := *,
+				viaParams :={{
+					id:="tokenized-by",
+					paramValue := *
+				}}
+			}}
+		}
+	  }
+	}
+    
+	/**
+			* 
+			* @desc BYE Request checking TP_IMS_5408_02 on MW
+			*/
+	template CANCEL_Request mdw_TP_IMS_5408_02_ic(template CallId p_callId, template SipUrl p_IBCF_SIP_URI)
+	 modifies mw_CANCEL_Request_Base := {
+	  msgHeader := {
+		route := {
+			fieldName := ROUTE_E,
+			routeBody := {
+				mw_routeBodyTH(p_IBCF_SIP_URI),
+				*
+			}
+		},
+		via := {
+			fieldName := VIA_E,
+			viaBody := {{
+				sentProtocol := *,
+				sentBy := *,
+				viaParams :={{
+					id:="tokenized-by",
+					paramValue := *
+				}}
+			}}
+		},
+		recordRoute := {
+			fieldName := RECORD_ROUTE_E,
+			routeBody := {mw_routeBodyTH(*), *}       		
+		}
+	  }
+	}
+    
+	/**
+	  * 
+	  * @desc BYE Request checking TP_IMS_5408_03 on MW
+	  */
+	template BYE_Request mdw_TP_IMS_5408_03_ic(template CallId p_callId, template SipUrl p_IBCF_SIP_URI)
+	 modifies mw_BYE_Request_Base := {
+	  msgHeader := {
+		route := {
+			fieldName := ROUTE_E,
+			routeBody := {
+				mw_routeBodyTH(p_IBCF_SIP_URI),
+				*
+			}
+		},
+		via := {
+			fieldName := VIA_E,
+			viaBody := {{
+				sentProtocol := *,
+				sentBy := *,
+				viaParams :={{
+					id:="tokenized-by",
+					paramValue := *
+				}}
+			}}
+		},
+		recordRoute := {
+			fieldName := RECORD_ROUTE_E,
+			routeBody := {mw_routeBodyTH(*), *}       		
+		}
+	  }
+	}
+
+	/**
+	  * 
+	  * @desc INVITE Request checking TP_IMS_5408_04
+	  */
+	template INVITE_Request mdw_TP_IMS_5408_04_ic (template SipUrl p_ibcfEutAUri)
+	 modifies mw_INVITE_Request_Base := {
+	  msgHeader := {
+		route := {
+			fieldName := ROUTE_E,
+			routeBody := {
+				mw_routeBodyTH(p_ibcfEutAUri),
+				*
+			}
+		},
+		via := {
+			fieldName := VIA_E,
+			viaBody := {{
+				sentProtocol := *,
+				sentBy := *,
+				viaParams :={{
+					id:="tokenized-by",
+					paramValue := *
+				}}
+			}}
+		},
+		recordRoute := {
+			fieldName := RECORD_ROUTE_E,
+			routeBody := {mw_routeBodyTH(*), *}       		
+		}
+	 }
+	}
+
+   /**
+     * 
+     * @desc INVITE Request checking TP_IMS_5097_09
+     */
+    template INVITE_Request mdw_TP_IMS_5097_09_isc (template SipUrl p_EutB_ASUri)
+     modifies mw_INVITE_Request_Base := {
+      msgHeader := {
+		route := {
+    		fieldName := ROUTE_E,
+    		routeBody := {mw_routeBody(p_EutB_ASUri), *}
+			},
+		 pChargingFunctionAddresses := ?,
+         pChargingVector :=  mw_PChargingVector({
+            {id := "orig-ioi", paramValue := *},  // NOTE indicating also operator identifier for IMSA
+            *
+          })
+      }
+    }
+    
+	/**
+	  * @desc INVITE Request checking TP_IMS_5097_09 false
+	  */
+	template INVITE_Request mdw_TP_IMS_5097_09_f_isc
+	 modifies mw_INVITE_Request_Base := {
+		
+	  msgHeader := {        
+		pChargingVector := {
+			fieldName := P_CHARGING_VECTOR_E,
+			chargeParams := {
+							{id := "term-ioi", paramValue := *},
+							*
+			}
+		}
+	  }
+	}
+    
+    template MESSAGE_Request mdw_TP_IMS_5097_05_p_ic(
+    	template CallId p_callId
+    ) modifies mw_MESSAGE_Request_Base := {
+        msgHeader := {
+            pChargingVector := {
+                fieldName := P_CHARGING_VECTOR_E,
+                chargeParams := {
+                    {id := "icid-value", paramValue := ?},
+                    {id := "orig-ioi", paramValue := ?},
+                    *
+                }
+            },
+            pAccessNetworkInfo := omit
+        }
+    }
+    
+		template MESSAGE_Request mdw_TP_IMS_5097_05_f2_ic(
+			template CallId p_callId,
+			template SipUrl p_SCSCF_SIP_URI
+		) modifies mw_MESSAGE_Request_Base := {
+			msgHeader := {
+				route := {
+					fieldName := ROUTE_E,
+					routeBody := {
+						mw_routeBody(p_SCSCF_SIP_URI),
+						*
+					}
+				}
+			}
+		}
+    
+    template MESSAGE_Request mdw_TP_IMS_5097_05_f_ic(
+    	template CallId p_callId
+    ) modifies mw_MESSAGE_Request_Base := {
+        msgHeader := {
+            pChargingVector := {
+                fieldName := P_CHARGING_VECTOR_E,
+                chargeParams := {
+                    {id := "term-ioi", paramValue := ?},
+                    {id := "access-network-charging-info", paramValue := ?},
+                    *
+                }
+            }
+        }
+    }
+    
+    template MESSAGE_Request mdw_TP_IMS_5097_08_gm(
+      template CallId p_callId
+    ) modifies mw_MESSAGE_Request_Base := {
+       requestLine := { requestUri := mw_TEL_URI_Base }
+    }
+    
+    template MESSAGE_Request mdw_TP_IMS_5097_08_ic(
+      template CallId p_callId
+    ) modifies mw_MESSAGE_Request_Base := {
+       requestLine := { 
+       		requestUri := mw_SIP_URI_Base 
+       	},
+       	msgHeader := {
+       		pChargingVector := {
+	           fieldName := P_CHARGING_VECTOR_E,
+	           chargeParams := {
+                    complement({id := "access-network-charging-info", paramValue := ?}),
+		            *
+	           }
+	        }	
+       	}
+    }
+    
+    template MESSAGE_Request mdw_TP_IMS_5097_07_ic(
+      template CallId p_callId,
+      template SipUrl p_SIP_URI,
+      template SipUrl p_TEL_URI)
+    modifies mw_MESSAGE_Request_Base := {
+        msgHeader := {
+            pAssertedID := {
+                fieldName := P_ASSERTED_ID_E,
+                pAssertedIDValueList := {
+                    ({nameAddr := mw_NameAddr(p_SIP_URI)}, {addrSpecUnion := mw_SIP_URI_Base}), 
+                    ({nameAddr := mw_NameAddr(p_TEL_URI)}, {addrSpecUnion := mw_TEL_URI_Base}),
+                    *
+                }
+            }
+        }
+    }
+    
+    template MESSAGE_Request mdw_TP_IMS_5108_02a_ic(
+      template CallId p_callId
+    ) modifies mw_MESSAGE_Request_Base := {
+       	msgHeader := {
+       		pChargingVector := {
+                fieldName := P_CHARGING_VECTOR_E,
+                chargeParams := {
+                    {id := "icid-value", paramValue := ?},
+                    *
+                }
+            }	
+       	}
+    }
+    
+    template MESSAGE_Request mdw_TP_IMS_5108_02b_p_ic(
+      template CallId p_callId,
+      template SipUrl p_SCSCF_Uri,
+      template GenericParam p_param
+    ) modifies mw_MESSAGE_Request_Base := {
+       	msgHeader := {
+       		route := omit, // TODO TP is not clear please double check
+       		recordRoute := {
+       			fieldName := RECORD_ROUTE_E,
+       			routeBody := {{
+       				nameAddr := {
+       					displayName := *,
+       					addrSpec := p_SCSCF_Uri	
+       				},
+       				rrParam := *
+       			}}
+       		},
+       		pChargingVector := {
+                fieldName := P_CHARGING_VECTOR_E,
+                chargeParams := {
+                    p_param,
+                    *
+                }
+            }	
+       	}
+    }
+    
+    template MESSAGE_Request mdw_TP_IMS_5108_02b_f_ic(
+      template CallId p_callId
+    ) modifies mw_MESSAGE_Request_Base := {
+       	msgHeader := {
+       		pChargingVector := {
+                fieldName := P_CHARGING_VECTOR_E,
+                chargeParams := {
+                    {id := "orig-ioi", paramValue := ?},
+	                {id := "term-ioi", paramValue := ?},
+	                *
+                }
+            }	
+       	}
+    }
+		
+		
+	/**
+    * @desc INVITE Request checking TP_IMS_5120_01
+    */
+	template INVITE_Request mdw_TP_IMS_5120_01_ic(
+   		template SipUrl p_SCSCF_URI
+  	) modifies mw_INVITE_Request_Base := {
+		msgHeader := {        
+			route := {
+				fieldName := ROUTE_E,
+				routeBody := {
+					complement(mw_routeBody(p_SCSCF_URI)),
+					*
+				}
+  			},
+			recordRoute := {
+				fieldName := RECORD_ROUTE_E,
+				routeBody := {
+					mw_routeBody(p_SCSCF_URI), 
+					*
+				}       		
+			}
+		}
+	}
+    
+    template Response mw_TP_IMS_5121_02_ic modifies mdw_2XX_Base := {
+	    msgHeader := {
+	        pChargingVector := {
+	           fieldName := P_CHARGING_VECTOR_E,
+	           chargeParams := {
+                    complement({id := "access-network-charging-info", paramValue := ?}),
+		            *
+	           }
+	        }
+	    }   
+    }
+    
+    template Response mw_TP_IMS_5117_02_ic modifies mdw_2XX_Base := {
+	    msgHeader := {
+	        pChargingVector := {
+	           fieldName := P_CHARGING_VECTOR_E,
+	           chargeParams := {
+                    complement({id := "access-network-charging-info", paramValue := ?}),
+		            *
+	           }
+	        }
+	    }   
+    }
+    
+    template Response mw_TP_IMS_5117_06_ic modifies mdw_2XX_Base := {
+	    msgHeader := {
+	        pAssertedID := {
+                fieldName := P_ASSERTED_ID_E,
+                pAssertedIDValueList := {
+                    {nameAddr := mw_NameAddr(mw_SIP_URI_Base)}, 
+                    {nameAddr := mw_NameAddr(mw_TEL_URI_Base)},
+                    *
+                }
+            }
+	    }   
+    }
+    
+    template Response mw_TP_IMS_5118_01_ic modifies mw_200OK_Base := {
+	    msgHeader := {
+	        pChargingVector := {
+	           fieldName := P_CHARGING_VECTOR_E,
+	           chargeParams := {
+	                {id := "orig-ioi", paramValue := ?},
+	                {id := "term-ioi", paramValue := ?},
+	                *
+	           }
+	        }
+	    }   
+    }
+    
+    template MESSAGE_Request mdw_TP_IMS_5050_01_ic(
+      template CallId p_callId,
+      template SipUrl p_PCSCF_URI,
+      template SipUrl p_UE_A_URI
+    ) modifies mw_MESSAGE_Request_Base := {
+       	msgHeader := {
+       		route := {
+       			fieldName := ROUTE_E,
+       			routeBody := {
+       				{
+       					nameAddr := {
+	       					displayName := *,
+	       					addrSpec := complement(p_PCSCF_URI)	
+	       				},
+	       				rrParam := *
+       				},*
+       			}
+       		},
+       		pPreferredID := omit,
+       		pAssertedID := mw_PAssertedID(mw_PAssertedIDValue(p_UE_A_URI)),
+       		pChargingVector := {
+                fieldName := P_CHARGING_VECTOR_E,
+                chargeParams := {
+                    {id := "icid-value", paramValue := ?},
+	                *
+                }
+            }	
+       	}
+    }
+
+	template Response mdw_2XX_Base modifies m_Response_Dummy := {
+		statusLine := {c_sipNameVersion, (200..299), *},
+		msgHeader := ?,
+		messageBody := *,
+		payload	:= *
+	}
+
+  template Response mw_100Trying_Base  modifies m_Response_Dummy :=
+		{
+		statusLine := c_statusLine100,
+		msgHeader := ?,
+		messageBody := *,
+		payload	:= *
+		}
+
+  template Response mw_180Ringing_Base  modifies m_Response_Dummy :=
+		{
+		statusLine := c_statusLine180,
+		msgHeader := ?,
+		messageBody := *,
+		payload	:= *
+		}
+  template Response mw_200OK_Base  modifies m_Response_Dummy :=
+		{
+		statusLine := c_statusLine200,
+		msgHeader := ?,
+		messageBody := *,
+		payload	:= *
+		}
+  template Response mw_202Accepted_Base  modifies m_Response_Dummy :=
+		{
+		statusLine := c_statusLine202,
+		msgHeader := ?,
+		messageBody := *,
+		payload	:= *
+		}
+  template Response mw_401Unauthorized_Base  modifies m_Response_Dummy :=
+		{
+		statusLine := {c_sipNameVersion, 401, ?},
+		msgHeader := ?,
+		messageBody := *,
+		payload	:= *
+		}
+		
+  template Response mdw_4XX_Base modifies m_Response_Dummy :=
+  {
+		statusLine := {c_sipNameVersion, (400..499), *},
+		msgHeader := ?,
+		messageBody := *,
+		payload	:= *
+  }
+  template Response mw_403Forbidden_Base  modifies m_Response_Dummy :=
+		{
+		statusLine := {c_sipNameVersion, 403, ?},
+		msgHeader := ?,
+		messageBody := *,
+		payload	:= *
+		}
+		
+	template Response mw_404NotFound_Base  modifies m_Response_Dummy :=
+	{
+		statusLine := {c_sipNameVersion, 404, ?},
+		msgHeader := ?,
+		messageBody := *,
+		payload	:= *
+	}
+		
+	template Response mdw_404Or604NotFound_Base  modifies m_Response_Dummy :=
+	{
+		statusLine := ({c_sipNameVersion, 404, ?}, {c_sipNameVersion, 604, ?}),
+		msgHeader := ?,
+		messageBody := *,
+		payload	:= *
+	}
+		
+	template Response mdw_408Or5XX_Base  modifies m_Response_Dummy :=
+	{
+		statusLine := {c_sipNameVersion, (408,(500..599)), *},
+		msgHeader := ?,
+		messageBody := *,
+		payload	:= *
+	}
+		
+	template Response mw_433Anony_Base  modifies m_Response_Dummy :=
+	{
+		statusLine := c_statusLine433,
+		msgHeader := ?,
+		messageBody := *,
+		payload	:= *
+	}
+
+		template REGISTER_Request mdw_TP_IMS_5088_01_gm  modifies mw_REGISTER_Request_Base := {
+			msgHeader := {authorization := m_Authorization(mw_credentialIntegrityYes)}
+		}
+    	
+		template NOTIFY_Request mdw_TP_IMS_5088_01_ic(template CallId p_callId, template SipUrl p_PCSCF_SIP_URI) modifies mw_NOTIFY_Request_Base := { 
+			requestLine := { requestUri := p_PCSCF_SIP_URI }, 
+			msgHeader := { 
+				event := {
+					fieldName := EVENT_E, 
+					eventType := pattern "*reg*", 
+					eventParams := *},
+				route := ? }, // TODO route header indicating the original Route_header from SUBSCRIBE (SUBSCRIBE not defined in the test description) 
+			messageBody := ? // TODO 
+		}
+    	
+        template NOTIFY_Request mdw_TP_IMS_5093_01_UE_ic(template CallId p_callId, template SipUrl p_UE_SIP_URI) modifies mw_NOTIFY_Request_Base := { 
+        	requestLine := { requestUri := p_UE_SIP_URI }, 
+        	msgHeader := { 
+        		event := {
+        			fieldName := EVENT_E, 
+        			eventType := pattern "*reg*",
+        			eventParams := *},
+        		route := ? }, // TODO route header indicating the original Route_header from SUBSCRIBE (SUBSCRIBE not defined in the test description)
+        	messageBody := ? // TODO 
+        }       
+            
+        template NOTIFY_Request mdw_TP_IMS_5093_01_IMS_ic(template CallId p_callId, template SipUrl p_PCSCF_SIP_URI) modifies mw_NOTIFY_Request_Base := { 
+        	requestLine := { requestUri := p_PCSCF_SIP_URI }, 
+        	msgHeader := { 
+        		event := {
+        			fieldName := EVENT_E, 
+        			eventType := pattern "*reg*",
+        			eventParams := *},
+        		route := ? }, // TODO route header indicating the original Route_header from SUBSCRIBE (SUBSCRIBE not defined in the test description) 
+        	messageBody := ? // TODO 
+        }  
+    	
+		template NOTIFY_Request mdw_TP_IMS_5094_01_UE(template CallId p_callId, template SipUrl p_UE_SIP_URI) modifies mw_NOTIFY_Request_Base := { 
+			requestLine := { requestUri := p_UE_SIP_URI }, 
+			msgHeader := { 
+				event := {
+					fieldName := EVENT_E, 
+					eventType := pattern "*reg*", 
+					eventParams := *},
+				route := ? }, // TODO route header indicating the original Route_header from SUBSCRIBE (SUBSCRIBE not defined in the test description) 
+			messageBody := ? // TODO 
+		} 
+            
+		template NOTIFY_Request mdw_TP_IMS_5094_01_IMS_ic(template CallId p_callId, template SipUrl p_PCSCF_SIP_URI) modifies mw_NOTIFY_Request_Base := { 
+			requestLine := { requestUri := p_PCSCF_SIP_URI }, 
+			msgHeader := { 
+				event := {
+					fieldName := EVENT_E, 
+					eventType := pattern "*reg*",
+					eventParams := *},
+				route := ? }, // TODO route header indicating the original Route_header from SUBSCRIBE (SUBSCRIBE not defined in the test description) 
+			messageBody := ? // TODO 
+		}
+		
+		
+	/**
+	  * @desc INVITE Request checking TP_IMS_5106_01
+	  */
+	template INVITE_Request mdw_TP_IMS_5106_01_ic(
+		template SipUrl p_SCSCF_URI
+	) modifies mw_INVITE_Request_Base := {
+	  msgHeader := {        
+		route := {
+    		fieldName := ROUTE_E,
+    		routeBody := {
+    			complement(mw_routeBody(p_SCSCF_URI)),
+    			*
+    		}
+		},
+      	recordRoute := {
+    		fieldName := RECORD_ROUTE_E,
+    		routeBody := {
+    			mw_routeBody(p_SCSCF_URI), 
+    			*
+    		}       		
+      	},
+      	pAccessNetworkInfo := omit,
+        pChargingVector :=  mw_PChargingVector({
+            {id := "icid-value", paramValue := *}, 
+            *
+        })
+	  }
+	}
+	
+	/**
+	  * @desc VYE Request checking TP_IMS_5074_01
+	  */
+	template BYE_Request mdw_TP_IMS_5074_01_ic(
+		template CallId p_callId,
+		template SipUrl p_UE_URI // must be the IP address
+	) modifies mw_BYE_Request_Base := {
+	  requestLine := {
+	  	requestUri := p_UE_URI
+	  },
+	  msgHeader := {
+	  	toField := ?,
+	  	fromField := ?,
+	  	cSeq := ?,
+		route := ?,
+        reason := {
+        	fieldName := REASON_E,
+        	reasonValues := {
+        		{
+        			token := "503 Service Unavailable",
+        			reasonParams := *
+        		},
+        		*
+        	}
+        }
+	  }
+	}
+	
+		
+	/**
+	  * @desc UPDATE Request checking TP_IMS_5106_02
+	  */
+	template UPDATE_Request mdw_TP_IMS_5106_02_p_ic(
+		template CallId p_callId,
+		template SipUrl p_SCSCF_URI
+	) modifies mw_UPDATE_Request_Base := {
+	  msgHeader := {        
+		route := {
+    		fieldName := ROUTE_E,
+    		routeBody := *
+		},
+      	recordRoute := {
+    		fieldName := RECORD_ROUTE_E,
+    		routeBody := {
+    			*,
+    			mw_routeBody(p_SCSCF_URI), 
+    			*
+    		}       		
+      	},
+        pChargingVector :=  mw_PChargingVector({
+            {id := "icid-value", paramValue := *}, 
+            *
+        })
+	  }
+	}
+	
+
+    template UPDATE_Request mdw_TP_IMS_5106_02_f_ic(
+    	template CallId p_callId,
+    	template SipUrl p_SCSCF_URI
+    ) modifies mw_UPDATE_Request_Base := {
+        msgHeader := {        
+        	route := {
+        		fieldName := ROUTE_E,
+        		routeBody := {
+        			mw_routeBody(p_SCSCF_URI),
+        			*
+        		}
+        	}
+        }
+    }
+
+  	}//end group
+	group HeaderTemplates {
+		
+      template Path mw_PathDef (charstring p_Host) := {
+      fieldName := PATH_E,
+      pathValues := {{
+        nameAddr:= {
+          displayName := *,
+          addrSpec := { 
+            scheme := "sip",
+            userInfo := *,
+            hostPort := {   
+              host := p_Host,
+              portField := *},
+              urlParameters := *,
+              headers := omit}
+          },
+          rrParam := omit
+      }}
+      } // template
+      
+      template Require mw_Require (template OptionTag_List p_optionsList) := {
+        fieldName := REQUIRE_E,
+        optionsTags := p_optionsList
+      } // template
+    
+      template PChargingVector mw_PChargingVector (template SemicolonParam_List p_List) := {
+        fieldName := P_CHARGING_VECTOR_E,
+        chargeParams := p_List
+      } // template
+    
+      template ServiceRoute mw_ServiceRoute (template SipUrl p_eutAddr) := {
+        fieldName := SERVICE_ROUTE_E,
+        routeBody := {
+          {
+            nameAddr := {
+              displayName := *,
+              addrSpec := p_eutAddr
+            },
+            rrParam := *
+          }, 
+          *
+        }
+      } // template
+    
+    
+    
+      template PVisitedNetworkID mw_PVisitedNetworkIDAny  := {
+        fieldName := P_VISITED_NETWORK_E,
+        vNetWorkSpec := ?
+      } // template
+    
+      template PAssociatedURI mw_PAssociatedURI (template SemicolonParam_List p_SemicolonParam_List):=  
+        {
+        fieldName := P_ASSOCIATED_URI_E,
+        nameAddrList:= {
+           {nameAddr := *,
+            genericParams := p_SemicolonParam_List  
+           },
+           *
+           }
+        }	  
+      template WwwAuthenticate mw_WwwAuthenticate  := {
+        fieldName := WWW_AUTHENTICATE_E,
+        challenge := {
+          digestCln := { //{id := "username", paramValue := ?},
+     									  {id := "realm", paramValue := ?}, // TODO containing operator ID
+     									  {id := "nonce", paramValue := ?},
+     									  {id := "rand", paramValue := ?},
+     									  {id := "autn", paramValue := ?},
+     									  {id := "ik", paramValue := ?},
+     									  {id := "ck", paramValue := ?},
+     									  {id := "algorithm", paramValue := "AKAv1-MD5"}, 
+     									  *}
+          
+        }
+      } // template
+  
+  
+	} // end group HeaderTemplates
+
+    group AuxiliaryInformationElementTemplates {
+      
+		template Credentials mw_credentialIntegrityYes := {
+		 otherResponse := {authScheme := ?, authParams := { {"integrity-protected", "yes"},*} // TODO
+		 }}
+		template Credentials mw_credentialIntegrityNo := {
+		 otherResponse := {authScheme := ?, authParams := { {"integrity-protected", "no"},*} // TODO
+		 }}
+      
+		template RouteBody mw_routeBodyTH (template SipUrl p_sipurl):= {
+    		nameAddr :=
+    		{
+    			displayName := *,
+    			addrSpec := p_sipurl
+    		},
+    		rrParam := {{
+				id:="tokenized-by",
+				paramValue := *
+			}}
+		}
+		 
+		template NameAddr mw_NameAddr(template SipUrl p_URI) := {
+			displayName := *,
+			addrSpec := p_URI
+		}
+		
+		template SipUrl mw_SIP_URI_Base := {
+	        scheme := "sip",  // meaning "not tel"
+	        userInfo := ?,
+	        hostPort := ?,
+	        urlParameters := *,
+	        headers := *
+	    }
+		
+		template SipUrl mw_TEL_URI_Base := {
+            scheme := "tel",
+            userInfo := ?,
+            hostPort := *,
+            urlParameters := *,
+            headers := *
+        }
+ 
+    } //end group
+
+  group adapterTemplates {
+    
+    template GeneralConfigurationReq m_generalConfigurationReq_offline := {
+      captureProcessIpAddress := "127.0.0.1",
+      captureProcessPort := 5501,
+      captureMode := {
+        offlineCapture := {
+          offset := PX_IOT_TIMESTAMP_OFFSET,
+          captureSource := {
+            sessionsPath := PX_IOT_PCAP_SESSIONS_PATH,
+            mergeFileList := {
+              mergeFileList := { },
+              mergeFilePath := "",
+              mergeToolPath := ""
+            }
+          }
+        }
+      },
+      eutInfoList := omit
+    }
+    template GeneralConfigurationReq m_generalConfigurationReq_online := {
+      captureProcessIpAddress := "127.0.0.1",
+      captureProcessPort := 5501,
+      captureMode := {
+        liveCpature := {
+          physicalInterfaces := {
+            PX_IOT_IFACES
+          },
+          recordMode := PX_IOT_RECORD_MODE
+        }
+      },
+      eutInfoList := PX_IOT_EUTs_IFACE_INFO_LIST
+    }
+    template GeneralConfigurationReq m_generalConfigurationReq_merge := {
+      captureProcessIpAddress := "127.0.0.1",
+      captureProcessPort := 5501,
+      captureMode := {
+        offlineCapture := {
+          offset := PX_IOT_TIMESTAMP_OFFSET,
+          captureSource := {
+            sessionsPath := "",
+            mergeFileList := {
+              mergeFileList := PX_IOT_FILE_MERGE_LIST,
+              mergeFilePath := PX_IOT_FILE_MERGE_PATH,
+              mergeToolPath := PX_IOT_MERGE_TOOL_PATH
+            }
+          }
+        }
+      },
+      eutInfoList := omit
+    }
+    template GeneralConfigurationRsp m_generalConfigurationRsp_success := {
+      status := {
+        code := e_success,
+        reason := *
+      }
+    }
+    template GeneralConfigurationRsp m_generalConfigurationRsp_timeout := {
+      status := {
+        code := e_timeout,
+        reason := *
+      }
+    }
+    template GeneralConfigurationRsp m_generalConfigurationRsp_error := {
+      status := {
+        code := e_error,
+        reason := *
+      }
+    }
+    template GeneralConfigurationRsp m_generalConfigurationRsp_any := {
+      status := {
+        code := *,
+        reason := *
+      }
+    }
+    template StartTrafficCaptureReq m_startTrafficCaptureReq := {
+    }
+    template StartTrafficCaptureRsp m_startTrafficCaptureRsp_any := {
+      status := {
+        code := *,
+        reason := *
+      }
+    }
+    template StopTrafficCaptureReq m_stopTrafficCaptureReq :={
+    }
+    template StopTrafficCaptureRsp m_stopTrafficCaptureRsp_any := {
+      status := {
+        code := *,
+        reason := *
+      }
+    }
+   
+    template SetFilterReq m_setFilterReq (ProtocolFilter p_proto, IpAddress p_addr1, 
+      IpAddress p_addr2, UInt16 p_port) :={
+      protocol := p_proto,
+      interfaceInfos := {
+        {
+          IpInterfaceInfo := {
+            {
+              domainName := omit,
+              IpAddress := p_addr1,
+              portNumbers := { p_port }
+            },
+            {
+              domainName := omit,
+              IpAddress := p_addr2,
+              portNumbers := { p_port }
+            }
+          }
+        }
+      }           
+    }
+    
+    template SetFilterRsp m_setFilterRspAny := {
+      status := {
+        code := *,
+        reason := *
+      }
+    }
+  } // adapterTemplates
+
+}//end module
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestCases_CALL.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestCases_CALL.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestCases_CALL.ttcn	(revision 22)
@@ -0,0 +1,1824 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides ATS specific test case definitions.
+ */
+module AtsImsIot_TestCases_CALL {
+	import from AtsImsIot_Behavior {
+        function all;
+    }
+
+	import from AtsImsIot_Functions {
+        function all;
+    }
+
+	import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;}
+
+	import from LibIms_UpperTester {type ImsUserInfo;}
+
+	import from LibIot_TestConfiguration {
+        function f_cf_create_IotEquipmentUser;
+    }
+
+	import from AtsImsIot_TestConfiguration {
+        const all;
+        function all;
+    }
+
+	import from LibIot_TestInterface {type IotEquipmentUser;}
+
+	import from AtsImsIot_TestSystem {
+        type ImsInterfaceMonitor, ImsTestCoordinator, IotSystemInterface;
+    }
+    
+	import from AtsImsIot_TestSystem {type CF_INT_CALL;}
+	
+	
+	/**
+		* @desc Default SIP URI with DNS/ENUM lookup procedure
+		* @see TS 186 011-2 V2.3.1 cause 4.5.3.1.1.1
+		*/
+	testcase TC_IMS_CALL_0001() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B);
+		var ImsUserInfo v_userTelInfoB := f_getTelUserId(PX_EUT_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueA, v_userTelInfoB); //Test Sequence Step 1
+		
+		// check 1 (INVITE)
+		f_mtc_check_TP_IMS_5097_01_gm(v_gmA, true); // Check1
+		f_mtc_check_TP_IMS_5097_02_gm(v_gmA, true); // Check2
+		f_mtc_check_TP_IMS_5097_04_gm(v_gmA, false); // Check3
+		f_mtc_check_TP_IMS_5097_01_ic(v_ic, true); // Check1	
+		f_mtc_check_TP_IMS_5097_02_ic(v_ic, true); // Check2	
+		f_mtc_check_TP_IMS_5097_04_ic(v_ic, false); // Check3
+
+		// checks 6, 10 (180 Ringing)
+        f_mtc_check_TP_IMS_5115_01_gm(v_gmB, true); // Check 6
+		f_mtc_check_TP_IMS_5115_03_gm(v_gmB, true); // Check 7
+        f_mtc_check_TP_IMS_5131_01_gm(v_gmB, false); // Check 10
+        f_mtc_check_TP_IMS_5115_01_ic(v_ic, true); // Check 6
+        f_mtc_check_TP_IMS_5115_03_ic(v_ic, true); // Check 7
+		f_mtc_check_TP_IMS_5131_01_ic(v_ic, false); // Check 10	
+				
+		f_mtc_userCheckRinging(v_ueB); //Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueA); //Test Sequence Step 3
+		f_mtc_userAnswerCall(v_ueB); //Test Sequence Step 4
+
+		// checks 8, 11 (2xx)
+		f_mtc_check_TP_IMS_5115_02_gm(v_gmB, true); // Check 8 
+		f_mtc_check_TP_IMS_5115_04_gm(v_gmB, true); // Check 9
+		f_mtc_check_TP_IMS_5131_02_gm(v_gmB, false); // Check 11 
+		f_mtc_check_TP_IMS_5115_02_ic(v_ic, true); // Check 8
+		f_mtc_check_TP_IMS_5115_04_ic(v_ic, true); // Check 9
+		f_mtc_check_TP_IMS_5131_02_ic(v_ic, false); // Check 11
+
+		f_mtc_userCheckCallEstablished(v_ueA); //Test Sequence Step 5
+		f_mtc_userCheckCallEstablished(v_ueB); //Test Sequence Step 6
+
+		//check 4 (ACK)
+		f_mtc_check_TP_IMS_5107_02_gm(v_gmA, false); // Check2 
+		f_mtc_check_TP_IMS_5107_02_ic(v_ic, false); // Check2 
+
+		f_mtc_EndCall(v_ueA); //Test Sequence Step 7
+
+		// check 5 (BYE)
+		f_mtc_check_TP_IMS_5107_01_gm(v_gmA, false); // Check3 
+		f_mtc_check_TP_IMS_5107_01_ic(v_ic, false); // Check3 
+
+		f_mtc_userCheckCallEnded(v_ueB); //Test Sequence Step 8
+		f_mtc_userCheckCallEnded(v_ueA); //Test Sequence Step 9
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0001
+	
+	
+	/**
+	 * @desc Default SIP URI
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.1.2
+	 */
+	testcase TC_IMS_CALL_0001F() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+        var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var IotEquipmentUser v_ueB2 := f_cf_create_IotEquipmentUser(c_userUE_B2);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_user_up(v_ueB2);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		f_mtc_userRegistration(v_ueB2, v_userInfoB); 
+		
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB); //Test Sequence Step 1
+		
+		// check 1 (INVITE)
+		f_mtc_check_TP_IMS_5097_01_gm(v_gmA, false); // Check1		
+		f_mtc_check_TP_IMS_5097_01_ic(v_ic, false); // Check1 
+
+		// checks 4, 6 (180 Ringing)
+		f_mtc_check_TP_IMS_5115_01_gm(v_gmB, true); // Check 4
+		f_mtc_check_TP_IMS_5131_01_gm(v_gmB, false); // Check 6
+		f_mtc_check_TP_IMS_5115_01_ic(v_ic, true); // Check4
+		f_mtc_check_TP_IMS_5131_01_ic(v_ic, false); // Check6
+		f_mtc_check_TP_IMS_5115_01_gm(v_gmB, true); // Check4  
+		f_mtc_check_TP_IMS_5131_01_gm(v_gmB, false); // Check6   
+		f_mtc_check_TP_IMS_5115_01_ic(v_ic, true); // Check4 from UE_B2	
+		f_mtc_check_TP_IMS_5131_01_ic(v_ic, false); // Check6 from UE_B2
+				
+		f_mtc_userCheckRinging(v_ueB); //Test Sequence Step 2
+		f_mtc_userCheckRinging(v_ueB2); //Test Sequence Step 3
+		f_mtc_userCheckPeerIsRinging(v_ueA); //Test Sequence Step 4
+		f_mtc_userAnswerCall(v_ueB2); //Test Sequence Step 5
+
+		// checks 5, 7 (2xx)
+		f_mtc_check_TP_IMS_5115_02_gm(v_gmB, true); // Check 5 
+		f_mtc_check_TP_IMS_5131_02_gm(v_gmB, false); // Check 7 
+		f_mtc_check_TP_IMS_5115_02_ic(v_ic, true); // Check 5 
+		f_mtc_check_TP_IMS_5131_02_ic(v_ic, false); // Check 7 
+		f_mtc_check_TP_IMS_5115_02_gm(v_gmB, true); // Check 5 
+		f_mtc_check_TP_IMS_5131_02_gm(v_gmB, false); // Check 7 
+		f_mtc_check_TP_IMS_5115_02_ic(v_ic, true); // Check5 from UE_B2
+		f_mtc_check_TP_IMS_5131_02_ic(v_ic, false); // Check7 from UE_B2
+		
+		
+		f_mtc_userCheckCallNoLongerOffered(v_ueB); //Test Sequence Step 6
+		f_mtc_userCheckCallEstablished(v_ueA); //Test Sequence Step 7
+		f_mtc_userCheckCallEstablished(v_ueB2); //Test Sequence Step 8
+
+		//check 2 (ACK)
+		f_mtc_check_TP_IMS_5107_02_gm(v_gmA, false); // Check2 
+		f_mtc_check_TP_IMS_5107_02_ic(v_ic, false); // Check2 
+
+		f_mtc_EndCall(v_ueA); //Test Sequence Step 9
+
+		// check 3 (BYE)
+		f_mtc_check_TP_IMS_5107_01_gm(v_gmA, false); // Check3 
+		f_mtc_check_TP_IMS_5107_01_ic(v_ic, false); // Check3 
+
+		f_mtc_userCheckCallEnded(v_ueB2 ); //Test Sequence Step 10
+		f_mtc_userCheckCallEnded(v_ueA); //Test Sequence Step 11
+		
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_PO_user_home_deregistration(v_ueB2);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_user_down(v_ueB2);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0001F
+	
+	
+	/**
+		* @desc Default Tel URI
+		* @see TS 186 011-2 V2.3.1 cause 4.5.3.1.1.3
+		*/
+	testcase TC_IMS_CALL_0002() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB); //Test Sequence Step 1
+		
+		// check 1 (INVITE)
+		f_mtc_check_TP_IMS_5097_01_gm(v_gmA, true); // Check1
+		f_mtc_check_TP_IMS_5097_02_gm(v_gmA, false); // Check2
+		f_mtc_check_TP_IMS_5097_01_ic(v_ic, true); // Check1	
+		f_mtc_check_TP_IMS_5097_02_ic(v_ic, false); // Check2	
+
+		// checks 6, 10 (180 Ringing)
+        f_mtc_check_TP_IMS_5115_01_gm(v_gmB, true); // Check 5
+		f_mtc_check_TP_IMS_5115_03_gm(v_gmB, true); // Check 6
+        f_mtc_check_TP_IMS_5131_01_gm(v_gmB, false); // Check 9
+        f_mtc_check_TP_IMS_5115_01_ic(v_ic, true); // Check 5
+        f_mtc_check_TP_IMS_5115_03_ic(v_ic, true); // Check 6
+		f_mtc_check_TP_IMS_5131_01_ic(v_ic, false); // Check 9	
+				
+		f_mtc_userCheckRinging(v_ueB); //Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueA); //Test Sequence Step 3
+		f_mtc_userAnswerCall(v_ueB); //Test Sequence Step 4
+
+		// checks 8, 11 (2xx)
+		f_mtc_check_TP_IMS_5115_02_gm(v_gmB, true); // Check 7 
+		f_mtc_check_TP_IMS_5115_04_gm(v_gmB, true); // Check 8
+		f_mtc_check_TP_IMS_5131_02_gm(v_gmB, false); // Check 10 
+		f_mtc_check_TP_IMS_5115_02_ic(v_ic, true); // Check 7
+		f_mtc_check_TP_IMS_5115_04_ic(v_ic, true); // Check 8
+		f_mtc_check_TP_IMS_5131_02_ic(v_ic, false); // Check 10
+
+		f_mtc_userCheckCallEstablished(v_ueA); //Test Sequence Step 5
+		f_mtc_userCheckCallEstablished(v_ueB); //Test Sequence Step 6
+
+		//check 4 (ACK)
+		f_mtc_check_TP_IMS_5107_02_gm(v_gmA, false); // Check3 
+		f_mtc_check_TP_IMS_5107_02_ic(v_ic, false); // Check3 
+
+		f_mtc_EndCall(v_ueA); //Test Sequence Step 7
+
+		// check 5 (BYE)
+		f_mtc_check_TP_IMS_5107_01_gm(v_gmA, false); // Check4 
+		f_mtc_check_TP_IMS_5107_01_ic(v_ic, false); // Check4 
+
+		f_mtc_userCheckCallEnded(v_ueB); //Test Sequence Step 8
+		f_mtc_userCheckCallEnded(v_ueA); //Test Sequence Step 9
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0002
+	
+	
+	/**
+		* @desc Rejection of call from barred user
+		* @see TS 186 011-2 V2.3.1 cause 4.5.3.1.1.4
+		*/
+	testcase TC_IMS_CALL_0003() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, omit};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB); //Test Sequence Step 1
+		
+		//check 1 (INVITE)
+		f_mtc_check_TP_IMS_5108_05_gm(v_gmA, false); // Check1	
+		f_mtc_check_TP_IMS_5108_05_ic(v_ic, false); // Check1
+		
+		f_mtc_userCheckCallCannotBeEstablished(v_ueA); //Test Sequence Step 2
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0003
+	
+	
+	/**
+		* @desc Rejection of call to non existing user
+		* @see TS 186 011-2 V2.3.1 cause 4.5.3.1.1.5
+		*/
+	testcase TC_IMS_CALL_0004() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, omit};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA);
+		
+		// test body
+		v_userInfoB.privateId := ("non_existing_user");
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB); //Test Sequence Step 1 //
+		
+		//check 1 (INVITE)
+		f_mtc_check_TP_IMS_5132_01_gm(v_gmA, false); // Check1	
+		f_mtc_check_TP_IMS_5132_01_ic(v_ic, false); // Check1
+		
+		f_mtc_userCheckCallCannotBeEstablished(v_ueA); //Test Sequence Step 2
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0004
+	
+	
+	/**
+		* @desc Rejection of call to unavailable user
+		* @see TS 186 011-2 V2.3.1 cause 4.5.3.1.1.6
+		*/
+	testcase TC_IMS_CALL_0005() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, omit};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA);
+		
+		// test body
+		v_userInfoB.privateId := ("unavailable");
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB); //Test Sequence Step 1 //
+		
+		//check 1 (INVITE)
+		f_mtc_check_TP_IMS_5133_01_gm(v_gmA, false); // Check1	
+		f_mtc_check_TP_IMS_5133_01_ic(v_ic, false); // Check1
+		
+		f_mtc_userCheckCallCannotBeEstablished(v_ueA); //Test Sequence Step 2
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0005
+	
+	
+	/**
+		* @desc Initial request to non-registered user with terminating unregistered filter criterion
+		* @see TS 186 011-2 V2.3.1 cause 4.5.3.1.1.7
+		*/
+	testcase TC_IMS_CALL_0006() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, omit};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA);
+		
+		// test body
+		v_userInfoB.privateId := ("userNOAS_in_IMSB");
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB); //Test Sequence Step 1 //
+		
+		//check 1 (INVITE)
+		f_mtc_check_TP_IMS_5109_01_gm(v_gmA, false); // Check1	
+		f_mtc_check_TP_IMS_5109_01_ic(v_ic, false); // Check1
+		
+		f_mtc_userCheckCallCannotBeEstablished(v_ueA); //Test Sequence Step 2
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0006
+	
+	
+	/**
+		* @desc Normal call (roaming)
+		* @see TS 186 011-2 V2.3.1 cause 4.5.3.1.2.1
+		*/
+	testcase TC_IMS_CALL_0007() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		//var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+  		f_cf_roam_call_up(v_gmA, v_ic);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueB, v_userInfoA); //Test Sequence Step 1
+		
+		// checks 1,2 gm
+		f_mtc_check_TP_IMS_5046_01_gm(v_gmA, true); // Check1
+		f_mtc_check_TP_IMS_5067_01_gm(v_gmA, false); // Check2
+		//checks 1,2 (INVITE from IMS_A to IMS_B)
+		f_mtc_check_TP_IMS_5046_01_ic(v_ic, true); // Check1	
+		f_mtc_check_TP_IMS_5067_01_ic(v_ic, false); // Check2
+		
+        //checks 7,3 (INVITE from IMS_B to IMS_A and 100 Trying from IMS_A to IMS_B)
+    	f_mtc_check_TP_IMS_5108_01_ic(v_ic, true); // Check7	
+    	f_mtc_check_TP_IMS_5070_01_ic(v_ic, false); // Check3
+
+		// checks 5 (180 Ringing)
+        f_mtc_check_TP_IMS_5055_01_gm(v_gmA, true); // Check 5
+        f_mtc_check_TP_IMS_5055_01_ic(v_ic, true); // Check 5
+				
+		f_mtc_userCheckRinging(v_ueA); //Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueB); //Test Sequence Step 3
+		f_mtc_userAnswerCall(v_ueA); //Test Sequence Step 4
+
+		// checks 6 (2xx)
+		f_mtc_check_TP_IMS_5055_02_gm(v_gmA, true); // Check 6
+		f_mtc_check_TP_IMS_5055_02_ic(v_ic, true); // Check 6
+
+		f_mtc_userCheckCallEstablished(v_ueB); //Test Sequence Step 5
+		f_mtc_userCheckCallEstablished(v_ueA); //Test Sequence Step 6
+
+		f_mtc_EndCall(v_ueA); //Test Sequence Step 7
+
+		// check 4 (BYE)
+		//f_mtc_check_TP_IMS_5301_01_gm(v_gmA, false); // Check4 
+		//f_mtc_check_TP_IMS_5301_01_ic(v_ic, false); // Check4 
+
+		f_mtc_userCheckCallEnded(v_ueB); //Test Sequence Step 8
+		f_mtc_userCheckCallEnded(v_ueA); //Test Sequence Step 9
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_roam_call_down(v_gmA, v_ic);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0007
+	
+	
+	/**
+	  * @desc Normal call with hold/resume
+	  * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.2.2
+	  */
+	testcase TC_IMS_CALL_0008() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B);
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_roam_call_up(v_gmA, v_ic);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB); //Test Sequence Step 1
+		f_mtc_userCheckRinging(v_ueB); //Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueA); //Test Sequence Step 3
+		f_mtc_userAnswerCall(v_ueB); //Test Sequence Step 4
+		f_mtc_userCheckCallEstablished(v_ueA); //Test Sequence Step 5
+		f_mtc_userCheckCallEstablished(v_ueB); //Test Sequence Step 6
+
+		f_mtc_userTriggerHold(v_ueA); //Test Sequence Step 7
+
+		// checks 3 and 1 (INVITE and 100 Trying)
+		f_mtc_check_TP_IMS_5120_01_gm(v_gmA, false, 1); // Check3
+		f_mtc_check_TP_IMS_5081_01_ic(v_ic, true); // Check1
+		f_mtc_check_TP_IMS_5120_01_ic(v_ic, false, 2); // Check3	
+				
+		//checks 2 (200 OK)
+		f_mtc_check_TP_IMS_5082_01_gm(v_gmA, false, 1); // Check2
+		f_mtc_check_TP_IMS_5082_01_ic(v_ic, false, 2); // Check2
+	
+		f_mtc_userCheckUserOnHold(v_ueB); //Test Sequence Step 8
+		f_mtc_userCheckUserOnHold(v_ueA); //Test Sequence Step 9
+		
+		f_mtc_userTriggerResume(v_ueA);  //Test Sequence Step 10
+		
+		// checks 3 and 1 (INVITE and 100 Trying)
+		f_mtc_check_TP_IMS_5120_01_gm(v_gmA, false, 0); // Check3
+		f_mtc_check_TP_IMS_5120_01_ic(v_ic, true, 0); // Check3	
+		f_mtc_check_TP_IMS_5081_01_ic(v_ic, false); // Check1
+		
+		//checks 2 (200 OK)
+		f_mtc_check_TP_IMS_5082_01_gm(v_gmA, false, 0); // Check2
+		f_mtc_check_TP_IMS_5082_01_ic(v_ic, false, 0); // Check2
+		
+		f_mtc_userCheckCallResumed(v_ueB);  //Test Sequence Step 11
+		f_mtc_userCheckCallResumed(v_ueA);  //Test Sequence Step 12
+
+		f_mtc_EndCall(v_ueA); //Test Sequence Step 13
+
+		f_mtc_userCheckCallEnded(v_ueB); //Test Sequence Step 14
+		f_mtc_userCheckCallEnded(v_ueA); //Test Sequence Step 15
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_roam_call_down(v_gmA, v_ic);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0008
+	
+	
+	/**
+		* @desc Subsequent request(other than target refresh)
+		* @see TS 186 011-2 V2.3.1 cause 4.5.3.1.2.3
+		*/
+	testcase TC_IMS_CALL_0009() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+  		f_cf_roam_call_up(v_gmA, v_ic);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueB, v_userInfoA); //Test Sequence Step 1
+						
+		f_mtc_userCheckRinging(v_ueA); //Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueB); //Test Sequence Step 3
+		f_mtc_userAnswerCall(v_ueA); //Test Sequence Step 4
+
+		f_mtc_userCheckCallEstablished(v_ueB); //Test Sequence Step 5
+		f_mtc_userCheckCallEstablished(v_ueA); //Test Sequence Step 6
+
+		f_mtc_EndCall(v_ueB); //Test Sequence Step 7
+
+		// check 1 (BYE)
+		f_mtc_check_TP_IMS_5052_01_gm(v_gmA, false); // Check1 
+		f_mtc_check_TP_IMS_5052_01_ic(v_ic, false); // Check1 
+
+		f_mtc_userCheckCallEnded(v_ueA); //Test Sequence Step 8
+		f_mtc_userCheckCallEnded(v_ueB); //Test Sequence Step 9
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_roam_call_down(v_gmA, v_ic);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0009
+	
+	
+	/**
+	  * @desc Subsequent target refresh request(INVITE)
+	  * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.2.4
+	  */
+	testcase TC_IMS_CALL_0010() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_roam_call_up(v_gmA, v_ic);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueB, v_userInfoA); //Test Sequence Step 1
+		f_mtc_userCheckRinging(v_ueA); //Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueB); //Test Sequence Step 3
+		f_mtc_userAnswerCall(v_ueA); //Test Sequence Step 4
+		f_mtc_userCheckCallEstablished(v_ueB); //Test Sequence Step 5
+		f_mtc_userCheckCallEstablished(v_ueA); //Test Sequence Step 6
+
+		f_mtc_userTriggerHold(v_ueB); //Test Sequence Step 7
+
+		// checks 1 and 2 (INVITE)
+		f_mtc_check_TP_IMS_5048_01_gm(v_gmA, false, 1); // Check1
+		f_mtc_check_TP_IMS_5048_01_ic(v_ic, true, 2); // Check1	
+		f_mtc_check_TP_IMS_5080_01_ic(v_ic, false); // Check2
+			
+		f_mtc_userCheckUserOnHold(v_ueA); //Test Sequence Step 8
+		f_mtc_userCheckUserOnHold(v_ueB); //Test Sequence Step 9
+		
+		f_mtc_userTriggerResume(v_ueB);  //Test Sequence Step 10
+		
+		// checks 1 and 2 (INVITE)
+		f_mtc_check_TP_IMS_5048_01_gm(v_gmA, false, 0); // Check1
+		f_mtc_check_TP_IMS_5048_01_ic(v_ic, true, 1); // Check1	
+		f_mtc_check_TP_IMS_5080_01_ic(v_ic, false); // Check2
+		
+		f_mtc_userCheckCallResumed(v_ueA);  //Test Sequence Step 11
+		f_mtc_userCheckCallResumed(v_ueB);  //Test Sequence Step 12
+
+		f_mtc_EndCall(v_ueA); //Test Sequence Step 13
+
+		f_mtc_userCheckCallEnded(v_ueB); //Test Sequence Step 14
+		f_mtc_userCheckCallEnded(v_ueA); //Test Sequence Step 15
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_roam_call_down(v_gmA, v_ic);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0010
+	
+	
+	/**
+	  * @desc Call CANCEL due to loss of connectivity of calling user during call establishment
+	  * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.2.7
+	  */
+	testcase TC_IMS_CALL_0013() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_roam_call_up(v_gmA, v_ic);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueB, v_userInfoA); //Test Sequence Step 1
+		f_mtc_userCheckRinging(v_ueA); //Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueB); //Test Sequence Step 3
+		
+		f_cf_user_down(v_ueB);// //Test Sequence Step 4 --- UEB loses conectivity
+
+		f_mtc_check_TP_IMS_5072_02_gm(v_gmA, false); // Check1
+		
+		f_mtc_userCheckCallCancelled(v_ueA); //Test Sequence Step 5
+				
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_cf_roam_call_down(v_gmA, v_ic);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0013
+	
+	
+	/**
+	  * @desc Call CANCEL by calling user
+	  * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.3.1
+	  */
+	testcase TC_IMS_CALL_0014() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B);
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_roam_call_up(v_gmA, v_ic);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB); //Test Sequence Step 1
+		f_mtc_userCheckRinging(v_ueB); //Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueA); //Test Sequence Step 3
+		f_mtc_userTriggerCancelCall (v_ueA); //Test Sequence Step 4
+		
+		f_mtc_check_TP_IMS_5107_03_gm(v_gmA, false); // Check1
+		f_mtc_check_TP_IMS_5107_03_ic(v_ic, false); // Check1
+		
+		f_mtc_userCheckCallCancelled(v_ueB); //Test Sequence Step 5
+		f_mtc_userCheckCallEnded(v_ueA); //Test Sequence Step 6
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_roam_call_down(v_gmA, v_ic);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0014
+	
+
+	/**
+	  * @desc Call failure due to de-registration of calling user during call
+	  * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.3.3
+	  */
+	testcase TC_IMS_CALL_0016() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var IotEquipmentUser v_imsA := f_cf_create_IotEquipmentUser("IMS A");
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, omit};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_user_up(v_imsA);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB); //Test Sequence Step 1
+		f_mtc_userCheckRinging(v_ueB); //Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueA); //Test Sequence Step 3
+		f_mtc_userAnswerCall(v_ueB); //Test Sequence Step 4
+		f_mtc_userCheckCallEstablished(v_ueA); //Test Sequence Step 5
+		f_mtc_userCheckCallEstablished(v_ueB); //Test Sequence Step 6		
+		f_mtc_imsTriggerUeDeregistration(v_imsA, v_ueA); //Test Sequence Step 7
+		
+		f_mtc_check_TP_IMS_5139_01_ic(v_ic, false); // Check 1
+		
+		f_mtc_userCheckCallEnded(v_ueB); //Test Sequence Step 8
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_user_down(v_imsA);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0016
+	
+	
+	/**
+	 * @desc Subsequent target refresh request (INVITE)
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.3.4
+	 */
+	testcase TC_IMS_CALL_0017() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		
+		// variables
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		
+		// configuration
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA,v_userInfoA);
+		f_PR_user_home_registration(v_ueB,v_userInfoB);
+		
+		// test body
+		
+		// Test Sequence 1 --------------------->
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB);
+		// Test Sequence 2 --------------------->
+		f_mtc_userCheckRinging(v_ueB);
+		// Test Sequence 3 --------------------->
+		f_mtc_userCheckPeerIsRinging(v_ueA);
+		// Test Sequence 4 --------------------->
+		f_mtc_userAnswerCall(v_ueB);
+		// Test Sequence 5 --------------------->
+		f_mtc_userCheckCallEstablished(v_ueA);
+		// Test Sequence 6 --------------------->
+		f_mtc_userCheckCallEstablished(v_ueB);
+		// Test Sequence 7 --------------------->
+		f_mtc_userTriggerHold(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_01_gm(v_gmA,1);
+		f_mtc_check_TP_IMS_5106_01_ic(v_ic,1);
+		
+		// Test Sequence 8 --------------------->
+		f_mtc_userCheckUserOnHold(v_ueB);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,1);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,1);
+		
+		// Test Sequence 9 --------------------->
+		f_mtc_userCheckUserOnHold(v_ueA);
+		// Test Sequence 10 -------------------->
+		f_mtc_userTriggerResume(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_01_gm(v_gmA,0);
+		f_mtc_check_TP_IMS_5106_01_ic(v_ic,0);
+		
+		// Test Sequence 11 -------------------->
+		f_mtc_userCheckCallResumed(v_ueB);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,0);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,0);
+		
+		// Test Sequence 12 -------------------->
+		f_mtc_userCheckCallResumed(v_ueA);
+		// Test Sequence 13 -------------------->
+		f_mtc_EndCall(v_ueA);
+		// Test Sequence 14 -------------------->
+		f_mtc_userCheckCallEnded(v_ueB );
+		// Test Sequence 15 -------------------->
+		f_mtc_userCheckCallEnded(v_ueA);
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	}
+	
+	
+	/**
+	 * @desc Subsequent target refresh request (UPDATE)
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.3.5
+	 */
+	testcase TC_IMS_CALL_0018() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		
+		// variables
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		
+		// configuration
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA,v_userInfoA);
+		f_PR_user_home_registration(v_ueB,v_userInfoB);
+		
+		// test body
+		
+		// Test Sequence 1 --------------------->
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB);
+		// Test Sequence 2 --------------------->
+		f_mtc_userCheckRinging(v_ueB);
+		// Test Sequence 3 --------------------->
+		f_mtc_userCheckPeerIsRinging(v_ueA);
+		// Test Sequence 4 --------------------->
+		f_mtc_userAnswerCall(v_ueB);
+		// Test Sequence 5 --------------------->
+		f_mtc_userCheckCallEstablished(v_ueA);
+		// Test Sequence 6 --------------------->
+		f_mtc_userCheckCallEstablished(v_ueB);
+		// Test Sequence 7 --------------------->
+		f_mtc_userTriggerHold(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_02_gm(v_gmA);
+		f_mtc_check_TP_IMS_5106_02_ic(v_ic);
+		
+		// Test Sequence 8 --------------------->
+		f_mtc_userCheckUserOnHold(v_ueB);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,1);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,1);
+		
+		// Test Sequence 9 --------------------->
+		f_mtc_userCheckUserOnHold(v_ueA);
+		// Test Sequence 10 -------------------->
+		f_mtc_userTriggerResume(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_02_gm(v_gmA);
+		f_mtc_check_TP_IMS_5106_02_ic(v_ic);
+		
+		// Test Sequence 11 -------------------->
+		f_mtc_userCheckCallResumed(v_ueB);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,0);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,0);
+		
+		// Test Sequence 12 -------------------->
+		f_mtc_userCheckCallResumed(v_ueA);
+		// Test Sequence 13 -------------------->
+		f_mtc_EndCall(v_ueA);
+		// Test Sequence 14 -------------------->
+		f_mtc_userCheckCallEnded(v_ueB );
+		// Test Sequence 15 -------------------->
+		f_mtc_userCheckCallEnded(v_ueA);
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	} 
+	
+	
+	/**
+	 * @desc Addition of media streams (reINVITE)
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.3.6
+	 */
+	testcase TC_IMS_CALL_0019() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		
+		// variables
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		
+		// configuration
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA,v_userInfoA);
+		f_PR_user_home_registration(v_ueB,v_userInfoB);
+		
+		// test body
+		
+		// Test Sequence 1 --------------------->
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB);
+		// Test Sequence 2 --------------------->
+		f_mtc_userCheckRinging(v_ueB);
+		// Test Sequence 3 --------------------->
+		f_mtc_userCheckPeerIsRinging(v_ueA);
+		// Test Sequence 4 --------------------->
+		f_mtc_userAnswerCall(v_ueB);
+		// Test Sequence 5 --------------------->
+		f_mtc_userCheckCallEstablished(v_ueA);
+		// Test Sequence 6 --------------------->
+		f_mtc_userCheckCallEstablished(v_ueB);
+		// Test Sequence 7 --------------------->
+		f_mtc_userAddNewMediaStream(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_01_gm(v_gmA,1);
+		f_mtc_check_TP_IMS_5106_01_ic(v_ic,1);
+		
+		// Test Sequence 8 --------------------->
+		// optional	
+		// Test Sequence 9 --------------------->
+		// optional
+		
+		// Test Sequence 10 -------------------->
+		f_mtc_userCheckNewMediaStream(v_ueB);
+		
+		// Test Sequence 11 -------------------->
+		f_mtc_userCheckNewMediaStream(v_ueA);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,1);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,1);
+		
+		// Test Sequence 12 -------------------->
+		f_mtc_EndCall(v_ueA);
+		// Test Sequence 13 -------------------->
+		f_mtc_userCheckCallEnded(v_ueB );
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,0);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,0);
+		
+		// Test Sequence 14 -------------------->
+		f_mtc_userCheckCallEnded(v_ueA );
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	}
+	
+	
+	/**
+	 * @desc Addition of media streams (reINVITE)
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.3.7
+	 */
+	testcase TC_IMS_CALL_0020() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_A);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		
+		// variables
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		
+		// configuration
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA,v_userInfoA);
+		f_PR_user_home_registration(v_ueB,v_userInfoB);
+		
+		// test body
+		
+		// Test Sequence 1 --------------------->
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB);
+		// Test Sequence 2 --------------------->
+		f_mtc_userCheckRinging(v_ueB);
+		// Test Sequence 3 --------------------->
+		f_mtc_userCheckPeerIsRinging(v_ueA);
+		// Test Sequence 4 --------------------->
+		f_mtc_userAnswerCall(v_ueB);
+		// Test Sequence 5 --------------------->
+		f_mtc_userCheckCallEstablished(v_ueA);
+		// Test Sequence 6 --------------------->
+		f_mtc_userCheckCallEstablished(v_ueB);
+		// Test Sequence 7 --------------------->
+		f_mtc_userAddNewMediaStream(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_01_gm(v_gmA,1);
+		f_mtc_check_TP_IMS_5106_01_ic(v_ic,1);
+		
+		// Test Sequence 8 --------------------->
+		// optional	
+		// Test Sequence 9 --------------------->
+		// optional
+		
+		// Test Sequence 10 -------------------->
+		f_mtc_userCheckNewMediaStream(v_ueB);
+		
+		// Test Sequence 11 -------------------->
+		f_mtc_userCheckNewMediaStream(v_ueA);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,1);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,1);
+		
+		// Test Sequence 12 -------------------->
+		f_mtc_userModifiyMediaStream(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_01_gm(v_gmA,0);
+		f_mtc_check_TP_IMS_5106_01_ic(v_ic,0);
+		
+		// Test Sequence 13 -------------------->
+		// optional
+		// Test Sequence 14 -------------------->
+		// optional
+		
+		// Test Sequence 15 -------------------->
+		f_mtc_userCheckNewMediaStream(v_ueB);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,0);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,0);
+		
+		// Test Sequence 16 -------------------->
+		f_mtc_userCheckNewMediaStream(v_ueA);
+		
+		// Test Sequence 17 -------------------->
+		f_mtc_EndCall(v_ueB);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,0);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,0);
+		
+		// Test Sequence 18 -------------------->
+		f_mtc_userCheckCallEnded(v_ueA );
+		
+		// Test Sequence 19 -------------------->
+		f_mtc_userCheckCallEnded(v_ueB );
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	}
+	
+	
+	/**
+	 * @desc Hold/resume media streams (reINVITE)
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.3.8
+	 */
+	testcase TC_IMS_CALL_0021() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_A);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		
+		// variables
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		
+		// configuration
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA,v_userInfoA);
+		f_PR_user_home_registration(v_ueB,v_userInfoB);
+		
+		// test body
+		
+		// Test Sequence 1 --------------------->
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB);
+		// Test Sequence 2 --------------------->
+		f_mtc_userCheckRinging(v_ueB);
+		// Test Sequence 3 --------------------->
+		f_mtc_userCheckPeerIsRinging(v_ueA);
+		// Test Sequence 4 --------------------->
+		f_mtc_userAnswerCall(v_ueB);
+		// Test Sequence 5 --------------------->
+		f_mtc_userCheckCallEstablished(v_ueA);
+		// Test Sequence 6 --------------------->
+		f_mtc_userCheckCallEstablished(v_ueB);
+		// Test Sequence 7 --------------------->
+		f_mtc_userAddNewMediaStream(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_01_gm(v_gmA,1);
+		f_mtc_check_TP_IMS_5106_01_ic(v_ic,1);
+		
+		// Test Sequence 8 --------------------->
+		// optional	
+		// Test Sequence 9 --------------------->
+		// optional
+		
+		// Test Sequence 10 -------------------->
+		f_mtc_userCheckNewMediaStream(v_ueB);
+		
+		// Test Sequence 11 -------------------->
+		f_mtc_userCheckNewMediaStream(v_ueA);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,1);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,1);
+		
+		// Test Sequence 12 -------------------->
+		f_mtc_userTriggerHold(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_01_gm(v_gmA,0);
+		f_mtc_check_TP_IMS_5106_01_ic(v_ic,0);
+		
+		// Test Sequence 13 -------------------->
+		f_mtc_userCheckUserOnHold(v_ueA);
+		
+		// Test Sequence 14 -------------------->
+		f_mtc_userCheckUserOnHold(v_ueB);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,0);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,0);
+		
+		// Test Sequence 15 -------------------->
+		f_mtc_userTriggerResume(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_01_gm(v_gmA,0);
+		f_mtc_check_TP_IMS_5106_01_ic(v_ic,0);
+		
+		// Test Sequence 16 -------------------->
+		f_mtc_userCheckCallResumed(v_ueB);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,0);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,0);
+		
+		// Test Sequence 17 -------------------->
+		f_mtc_userCheckCallResumed(v_ueA);
+		
+		// Test Sequence 18 -------------------->
+		f_mtc_userRemoveMediaStream(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_01_gm(v_gmA,0);
+		f_mtc_check_TP_IMS_5106_01_ic(v_ic,0);
+		
+		// Test Sequence 19 -------------------->
+		f_mtc_userCheckRemoveMediaStream(v_ueB);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,0);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,0);
+		
+		// Test Sequence 20 -------------------->
+		// optional
+		
+		// Test Sequence 21 -------------------->
+		f_mtc_EndCall(v_ueB);
+		
+		// Test Sequence 22 -------------------->
+		f_mtc_userCheckCallEnded(v_ueA );
+		
+		// Test Sequence 23 -------------------->
+		f_mtc_userCheckCallEnded(v_ueB );
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	}
+	
+	
+	/**
+	 * @desc Hold/resume media streams (UPDATE)
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.3.9
+	 */
+	testcase TC_IMS_CALL_0022() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_A);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		
+		// variables
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		
+		// configuration
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA,v_userInfoA);
+		f_PR_user_home_registration(v_ueB,v_userInfoB);
+		
+		// test body
+		
+		// Test Sequence 1 --------------------->
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB);
+		// Test Sequence 2 --------------------->
+		f_mtc_userCheckRinging(v_ueB);
+		// Test Sequence 3 --------------------->
+		f_mtc_userCheckPeerIsRinging(v_ueA);
+		// Test Sequence 4 --------------------->
+		f_mtc_userAnswerCall(v_ueB);
+		// Test Sequence 5 --------------------->
+		f_mtc_userCheckCallEstablished(v_ueA);
+		// Test Sequence 6 --------------------->
+		f_mtc_userCheckCallEstablished(v_ueB);
+		// Test Sequence 7 --------------------->
+		f_mtc_userAddNewMediaStream(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_02_gm(v_gmA);
+		f_mtc_check_TP_IMS_5106_02_ic(v_ic);
+		
+		// Test Sequence 8 --------------------->
+		// optional	
+		// Test Sequence 9 --------------------->
+		// optional
+		
+		// Test Sequence 10 -------------------->
+		f_mtc_userCheckNewMediaStream(v_ueB);
+		
+		// Test Sequence 11 -------------------->
+		f_mtc_userCheckNewMediaStream(v_ueA);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,1);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,1);
+		
+		// Test Sequence 12 -------------------->
+		f_mtc_userTriggerHold(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_02_gm(v_gmA);
+		f_mtc_check_TP_IMS_5106_02_ic(v_ic);
+		
+		// Test Sequence 13 -------------------->
+		f_mtc_userCheckUserOnHold(v_ueA);
+		
+		// Test Sequence 14 -------------------->
+		f_mtc_userCheckUserOnHold(v_ueB);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,0);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,0);
+		
+		// Test Sequence 15 -------------------->
+		f_mtc_userTriggerResume(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_02_gm(v_gmA);
+		f_mtc_check_TP_IMS_5106_02_ic(v_ic);
+		
+		// Test Sequence 16 -------------------->
+		f_mtc_userCheckCallResumed(v_ueB);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,0);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,0);
+		
+		// Test Sequence 17 -------------------->
+		f_mtc_userCheckCallResumed(v_ueA);
+		
+		// Test Sequence 18 -------------------->
+		f_mtc_userRemoveMediaStream(v_ueA);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5106_02_gm(v_gmA);
+		f_mtc_check_TP_IMS_5106_02_ic(v_ic);
+		
+		// Test Sequence 19 -------------------->
+		f_mtc_userCheckRemoveMediaStream(v_ueB);
+		
+		// check 2
+		f_mtc_check_TP_IMS_5121_02_gm(v_gmB,0);
+		f_mtc_check_TP_IMS_5121_02_ic(v_ic,0);
+		
+		// Test Sequence 20 -------------------->
+		// optional
+		
+		// Test Sequence 21 -------------------->
+		f_mtc_EndCall(v_ueB);
+		
+		// Test Sequence 22 -------------------->
+		f_mtc_userCheckCallEnded(v_ueA );
+		
+		// Test Sequence 23 -------------------->
+		f_mtc_userCheckCallEnded(v_ueB );
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	}
+	
+	
+	/**
+	 * @desc Subsequent target refresh request (INVITE)
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.4
+	 */
+	testcase TC_IMS_CALL_0023() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		
+		// variables
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, omit};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		
+		// configuration
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA,v_userInfoA);
+		f_PR_user_home_registration(v_ueB,v_userInfoB);
+		
+		// test body
+		
+		// Test Sequence 1 --------------------->
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB);
+		// Test Sequence 2 --------------------->
+		f_mtc_userCheckRinging(v_ueB);
+		// Test Sequence 3 --------------------->
+		f_mtc_userCheckPeerIsRinging(v_ueA);
+		// Test Sequence 4 --------------------->
+		f_mtc_userAnswerCall(v_ueB);
+		// Test Sequence 5 --------------------->
+		f_mtc_userCheckCallEstablished(v_ueA);
+		// Test Sequence 6 --------------------->
+		f_mtc_userCheckCallEstablished(v_ueB);
+		// Test Sequence 7 --------------------->
+		f_mtc_userLooseConnection(v_ueB);
+		
+		// check 1
+		f_mtc_check_TP_IMS_5074_01_ic(v_ic);
+		
+		// Test Sequence 8 --------------------->
+		f_mtc_userCheckCallEnded(v_ueA);
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+		f_cf_adapter_down();
+	}
+	
+	
+	/**
+		* @desc Normal call - TH(Topology hiding)
+		* @see TS 186 011-2 V2.3.1 cause 4.5.3.1.5.1
+		*/
+	testcase TC_IMS_CALL_0024() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB); //Test Sequence Step 1
+		
+		//check 1,2,3,6  (INVITE and 100Trying)	
+        f_mtc_check_TP_IMS_5135_01_gm(v_gmA, true); // Check1 - INVITE
+        f_mtc_check_TP_IMS_5404_01_gm(v_gmA, false); // Check3 - INVITE
+        f_mtc_check_TP_IMS_5135_01_ic(v_ic, true); // Check1 - INVITE	
+		f_mtc_check_TP_IMS_5137_01_ic(v_ic, true); // Check2 - INVITE	
+		f_mtc_check_TP_IMS_5404_01_ic(v_ic, true); // Check3 - INVITE
+		f_mtc_check_TP_IMS_5414_01_ic(v_ic, false); // Check6 - INVITE and 100Trying	
+		
+		//check 7 (180 Ringing)
+
+		f_mtc_check_TP_IMS_5137_02_gm(v_gmB, false); // Check 7
+		f_mtc_check_TP_IMS_5137_02_ic(v_ic, false); // Check 7
+				
+		f_mtc_userCheckRinging(v_ueB); //Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueA); //Test Sequence Step 3
+		f_mtc_userAnswerCall(v_ueB); //Test Sequence Step 4
+
+		//check 8 (2xx)
+
+		f_mtc_check_TP_IMS_5137_03_gm(v_gmB, false); // Check 8
+		f_mtc_check_TP_IMS_5137_03_ic(v_ic, false); // Check 8
+
+		f_mtc_userCheckCallEstablished(v_ueA); //Test Sequence Step 5
+		f_mtc_userCheckCallEstablished(v_ueB); //Test Sequence Step 6
+
+		// check 4 (ACK)
+		f_mtc_check_TP_IMS_5408_01_gm(v_gmA, false); // Check4 
+		f_mtc_check_TP_IMS_5408_01_ic(v_ic, false); // Check4 
+
+		f_mtc_EndCall(v_ueA); //Test Sequence Step 7
+
+		// check 5 (BYE)
+		f_mtc_check_TP_IMS_5408_03_gm(v_gmA, false); // Check4 
+		f_mtc_check_TP_IMS_5408_03_ic(v_ic, false); // Check4 
+		
+		//check 8 (2xx)
+
+		f_mtc_check_TP_IMS_5137_03_gm(v_gmB, false); // Check 8
+		f_mtc_check_TP_IMS_5137_03_ic(v_ic, false); // Check 8
+
+		f_mtc_userCheckCallEnded(v_ueB); //Test Sequence Step 8
+		f_mtc_userCheckCallEnded(v_ueA); //Test Sequence Step 9
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_int_call_down(v_config);
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0024
+	
+	/**
+	  * @desc CANCEL call  by calling user
+	  * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.5.2
+	  */
+	testcase TC_IMS_CALL_0025() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB); //Test Sequence Step 1
+		f_mtc_userCheckRinging(v_ueB); //Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueA); //Test Sequence Step 3
+		f_mtc_userTriggerCancelCall (v_ueA); //Test Sequence Step 4
+		
+		f_mtc_check_TP_IMS_5408_02_gm(v_gmA, false); // Check1
+		f_mtc_check_TP_IMS_5408_02_ic(v_ic, false); // Check1
+		
+		f_mtc_userCheckCallCancelled(v_ueB); //Test Sequence Step 5
+		f_mtc_userCheckCallTerminated(v_ueA); //Test Sequence Step 6
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_int_call_down(v_config);
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_CALL_0025
+	
+	
+	/**
+	  * @desc Normal call with hold/resume - roaming
+	  * @see TS 186 011-2 V2.3.1 cause 4.5.3.1.5.3
+	  */
+	testcase TC_IMS_CALL_0026() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B);
+				
+		// map/connect component ports
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_roam_call_up(v_gmA, v_ic);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB); //Test Sequence Step 1
+		f_mtc_userCheckRinging(v_ueB); //Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueA); //Test Sequence Step 3
+		f_mtc_userAnswerCall(v_ueB); //Test Sequence Step 4
+		f_mtc_userCheckCallEstablished(v_ueA); //Test Sequence Step 5
+		f_mtc_userCheckCallEstablished(v_ueB); //Test Sequence Step 6
+
+		f_mtc_userTriggerHold(v_ueA); //Test Sequence Step 7
+
+		// check 1 (INVITE)
+		f_mtc_check_TP_IMS_5408_04_gm(v_gmA, false,1); // Check1
+		f_mtc_check_TP_IMS_5408_04_ic(v_ic, false,2); // Check1
+			
+		f_mtc_userCheckUserOnHold(v_ueB); //Test Sequence Step 8
+		f_mtc_userCheckUserOnHold(v_ueA); //Test Sequence Step 9
+		
+		f_mtc_userTriggerResume(v_ueA);  //Test Sequence Step 10
+		
+		// check 1 (INVITE)
+		f_mtc_check_TP_IMS_5408_04_gm(v_gmA, false,0); // Check1
+		f_mtc_check_TP_IMS_5408_04_ic(v_ic, false,1); // Check1
+				
+		f_mtc_userCheckCallResumed(v_ueB);  //Test Sequence Step 11
+		f_mtc_userCheckCallResumed(v_ueA);  //Test Sequence Step 12
+
+		f_mtc_EndCall(v_ueA); //Test Sequence Step 13
+
+		f_mtc_userCheckCallEnded(v_ueB); //Test Sequence Step 14
+		f_mtc_userCheckCallEnded(v_ueA); //Test Sequence Step 15
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_roam_call_down(v_gmA, v_ic);
+	} //end testcase TC_IMS_CALL_0026
+	
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestCases_MESS.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestCases_MESS.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestCases_MESS.ttcn	(revision 22)
@@ -0,0 +1,355 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides ATS specific test case definitions.
+ */
+module AtsImsIot_TestCases_MESS {
+	
+	import from AtsImsIot_Behavior {function all;}
+
+	import from AtsImsIot_Functions {function all;}
+	
+	import from LibCommon_VerdictControl {type FncRetCode;}
+
+	import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;}
+
+	import from LibIms_UpperTester {type ImsUserInfo;}
+
+	import from LibIot_TestConfiguration {
+		function f_cf_create_IotEquipmentUser;
+	}
+
+	import from AtsImsIot_TestConfiguration {
+		const all;
+		function all;
+	}
+
+	import from LibIot_TestInterface {type IotEquipmentUser;}
+
+	import from AtsImsIot_TestSystem {
+		type ImsInterfaceMonitor, ImsTestCoordinator, IotSystemInterface;
+	}
+		
+	import from AtsImsIot_TestSystem {type CF_INT_CALL;}
+	
+	import from AtsImsIot_Templates all;
+
+		
+	/**
+	 * @desc
+	 *     IMS network shall support SIP messages greater than 1500 bytes.
+	 *     (in ETSI TS 186 011-2 V2.3.1 cause 4.5.1.1)
+	 */
+	testcase TC_IMS_MESS_0001() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, omit};
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		
+		// preamble
+		f_cf_int_call_up(v_config);
+		f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+		f_PR_user_home_registration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+			log("**** TC_IMS_MESS_0001: Preamble done. ****");
+		
+		// test body
+		f_mtc_userSendMessage(v_ueA, f_getMessageBody(1301));
+		f_mtc_check_TP_IMS_4002_01_gm(v_gmA);
+		f_mtc_check_TP_IMS_4002_01_ic(v_ic);
+		f_mtc_userCheckMessageReceipt(v_ueB);
+		
+		// postabmle
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		log("**** TC_IMS_MESS_0001: Postamble done. ****");
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+	}
+	
+	
+		
+	/**
+		 * @desc
+		 *     IMS network handles messaging with SIP identity correctly without
+		 *     topology hiding. (ETSI TS 186 011-2 V2.3.1 cause 4.5.4.1)
+		 */
+	testcase TC_IMS_MESS_0002() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA, f_getSipUserId(PX_EUT_A));
+		f_PR_user_home_registration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+		
+		// test body
+		f_mtc_userSendMessage(v_ueA, "test"); 
+		
+		f_mtc_check_TP_IMS_5097_05_gm(v_gmA, false); // message not removed from port queue
+		//f_mtc_check_TP_IMS_5097_07_gm(v_gmA, false); // message removed from port queue
+		f_mtc_check_TP_IMS_5097_05_ic(v_ic, false);// message not removed from port queue
+		//f_mtc_check_TP_IMS_5097_07_ic(v_ic, false);// message removed from port queue
+		
+		f_mtc_userCheckMessageReceipt(v_ueB);
+		
+		f_mtc_check_TP_IMS_5117_02_gm(v_gmB, true);// message not removed from port queue
+		f_mtc_check_TP_IMS_5118_01_gm(v_gmB, false);// message removed from port queue
+		f_mtc_check_TP_IMS_5117_02_ic(v_ic, true);// message not removed from port queue
+		f_mtc_check_TP_IMS_5118_01_ic(v_ic, false);// message removed from port queue
+		
+		// postabmle
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+	}
+	
+		
+	/**
+		 * @desc
+		 *     IMS network handles messaging with TEL URI identities correctly
+		 *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.4.2)
+		 */
+	testcase TC_IMS_MESS_0003() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA, f_getTelUserId(PX_EUT_A));
+		f_PR_user_home_registration(v_ueB, f_getTelUserId(PX_EUT_B));
+		
+		// test body
+		f_mtc_userSendMessage(v_ueA, "test"); 
+		
+		f_mtc_check_TP_IMS_5097_07_gm(v_gmA, false); 
+		f_mtc_check_TP_IMS_5097_07_ic(v_ic, false);
+		
+		f_mtc_userCheckMessageReceipt(v_ueB);
+		
+		f_mtc_check_TP_IMS_5117_02_gm(v_gmB, true);// message not removed from port queue
+		f_mtc_check_TP_IMS_5118_01_gm(v_gmB, true);// message not removed from port queue
+		f_mtc_check_TP_IMS_5117_06_gm(v_gmB, false);// message removed from port queue
+		f_mtc_check_TP_IMS_5117_02_ic(v_ic, true);// message not removed from port queue
+		f_mtc_check_TP_IMS_5118_01_ic(v_ic, true);// message not removed from port queue
+		f_mtc_check_TP_IMS_5117_06_ic(v_ic, false);// message removed from port queue
+		
+		// postabmle
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+	}
+	
+	/**
+		 * @desc
+		 *     IMS network handles messaging with DNS/ENUM lookup procedure correctly
+		 *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.4.3)
+		 */
+	testcase TC_IMS_MESS_0004() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, v_gmB};
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA, f_getTelUserId(PX_EUT_A));
+		f_PR_user_home_registration(v_ueB, f_getTelUserId(PX_EUT_B));
+		
+		// test body
+		f_mtc_userSendMessage(v_ueA, "test"); 
+		
+		f_mtc_check_TP_IMS_5097_08_gm(v_gmA, false); 
+		f_mtc_check_TP_IMS_5097_08_ic(v_ic, false);
+		
+		// TODO add DNS checks
+		
+		f_mtc_userCheckMessageReceipt(v_ueB);
+		
+		f_mtc_check_TP_IMS_5117_06_gm(v_gmB, false);
+		f_mtc_check_TP_IMS_5117_06_ic(v_ic, false);
+		
+		// postabmle
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+	}	
+	
+	
+	
+	/**
+		 * @desc
+		 *     IMS network handles messaging while roaming correctly.
+		 *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.4.4)
+		 */
+	testcase TC_IMS_MESS_0005() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_roam_call_up(v_gmA, v_ic);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+		f_PR_user_roaming_registration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+		
+		// test body
+		f_mtc_userSendMessage(v_ueA, "test"); 
+		
+		f_mtc_check_TP_IMS_5108_02_ic(v_ic); // TODO must be checked
+		
+		f_mtc_userCheckMessageReceipt(v_ueB);
+		
+		f_mtc_check_TP_IMS_5118_01_gm(v_gmA, false);
+		f_mtc_check_TP_IMS_5118_01_ic(v_ic, false);
+		
+		// postabmle
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_roaming_deregistration(v_ueB);
+		f_cf_roam_call_down(v_gmA, v_ic);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+	}
+	
+	/**
+		 * @desc
+		 *     IMS network handles messaging correctly when receiving user is nit registered.
+		 *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.4.5)
+		 */
+	testcase TC_IMS_MESS_0006() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, omit};
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+		
+		// test body
+		f_mtc_userSendMessage(v_ueA, "test"); 
+		
+		f_mtc_check_TP_IMS_5114_02_gm(v_gmA); 
+		f_mtc_check_TP_IMS_5114_02_ic(v_ic); 
+		
+		f_mtc_userCheckMessageNotDelivered(v_ueA);
+		
+		// postabmle
+		f_PO_user_home_deregistration(v_ueA);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_adapter_down();
+	}
+	
+		
+	/**
+		 * @desc
+		 *     IMS network handles messaging correctly when receiving user is nit registered.
+		 *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.4.6)
+		 */
+	testcase TC_IMS_MESS_0007() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var CF_INT_CALL v_config := {v_gmA, v_ic, omit};
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_int_call_up(v_config);
+		
+		// preamble
+		f_PR_user_home_registration(v_ueA, f_getAnyValidUser(PX_EUT_A));
+		f_PR_user_home_registration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+		
+		// test body
+		f_mtc_userSendMessage(v_ueA, "test"); 
+		
+		f_mtc_check_TP_IMS_5108_06_gm(v_gmA); 
+		f_mtc_check_TP_IMS_5108_06_ic(v_ic); 
+		
+		f_mtc_userCheckMessageNotDelivered(v_ueA);
+		
+		// postabmle
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_int_call_down(v_config);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestCases_REG.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestCases_REG.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestCases_REG.ttcn	(revision 22)
@@ -0,0 +1,379 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides ATS specific test case definitions.
+ */
+module AtsImsIot_TestCases_REG {
+	
+	import from AtsImsIot_Behavior {
+        function all;
+    }
+
+	import from AtsImsIot_Functions {
+        function all;
+    }
+
+	import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;}
+
+	import from LibIms_UpperTester {type ImsUserInfo;}
+
+	import from LibIot_TestConfiguration {
+        function f_cf_create_IotEquipmentUser;
+    }
+
+	import from AtsImsIot_TestConfiguration {
+        const all;
+        function all;
+    }
+
+	import from LibIot_TestInterface {type IotEquipmentUser;}
+
+	import from AtsImsIot_TestSystem {
+        type ImsInterfaceMonitor, ImsTestCoordinator, IotSystemInterface;
+    }
+    
+    import from LibSip_SIPTypesAndValues all;
+    
+    
+    
+	/**
+	 * @desc
+	 *     First time registration in a visited IMS network.
+	 *     (in ETSI TS 186 011-2 V2.3.1 cause 4.5.2.1)
+	 */
+	testcase TC_IMS_REG_0001() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_anyValidUser := f_getAnyValidUser(PX_EUT_B);
+		var Response v_200OK_Step8;
+		var Request v_Subscribe_Step10;
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueB);
+		f_cf_roam_reg_up(v_gmA, v_ic);
+				
+		// test body
+		f_mtc_userRegistration(v_ueB, v_anyValidUser); // Test Sequence Step 1 @TODO shouldn't this be EUT_A?
+		
+		// @TODO check mw_credentialIntegrityNo, mw_credentialIntegrityYes
+		
+		f_mtc_check_TP_IMS_5011_01_gm(v_gmA, true); // Check1 when
+		f_mtc_check_TP_IMS_5011_01_ic(v_ic, true); // Check1 then 
+				
+		f_mtc_check_TP_IMS_5089_01_gm_when(v_gmA, false); // Check4 when (Gm)
+		f_mtc_check_TP_IMS_5089_01_ic_when(v_ic, false); // Check4 when (Mw) 
+		f_mtc_check_TP_IMS_5089_01_ic_then(v_ic, false); // Check4 then @TODO check mw_WwwAuthenticate
+		
+		f_mtc_check_TP_IMS_5011_02_gm(v_gmA, true); // Check2 when (Gm)
+		f_mtc_check_TP_IMS_5011_02_ic(v_ic, true);  // Check2 then (Mw)
+		
+		f_mtc_check_TP_IMS_5092_01_gm(v_gmA, false); // Check5 when (Gm)
+		f_mtc_check_TP_IMS_5092_01_ic_when(v_ic, false); // Check5 when (Mw)		
+		f_mtc_check_TP_IMS_5092_01_ic(v_ic, true); // Check5 then
+		
+		v_200OK_Step8 := f_mtc_check_TP_IMS_5044_01_ic_when(v_ic, false); // Check3 when
+		f_mtc_check_TP_IMS_5044_01_ic(v_ic, v_200OK_Step8, true); // Check3 then
+		
+		v_Subscribe_Step10 := f_mtc_check_TP_IMS_5096_01_ic_when(v_ic, false); // Check6 when 
+		f_mtc_check_TP_IMS_5096_01_ic(v_ic, v_Subscribe_Step10, false); // Check6 then
+		
+		// Test Sequence Step 2
+		f_mtc_userCheckRegistration(v_ueB, v_anyValidUser);
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueB);
+		
+		// unmap/disconnect component ports
+		f_cf_user_down(v_ueB);
+		f_cf_roam_reg_down(v_gmA, v_ic);
+		f_cf_adapter_down();
+	}
+	
+	/**
+	 * @desc
+	 *     No response from first entry point on REGISTER with topology hiding
+	 *     (TS 186 011-2 V2.3.1 cause 4.5.2.2)
+	 */
+	 // @TODO
+	testcase TC_IMS_REG_0002() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var Request v_Register_Step4; // why do we need this variable?
+		var Response v_200OK_Step9;
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueB);
+		f_cf_roam_reg_up(v_gmA, v_ic);
+		
+		// test body
+		f_mtc_userRegistration(v_ueB, f_getAnyValidUser(PX_EUT_A)); // Test Sequence Step 1
+		
+		// check no response (check1-when) -message skip (1st register) 
+		// check included in check1-then
+
+		// check mw for second register request 
+		f_mtc_check_TP_IMS_5203_01_ic(v_ic); // (Check1-then)
+		
+		// check gm for protected register (Check2-when)
+			
+		// check mw for protected register (check2-when)
+		
+		// check mw for 200_response (check2-then) 
+		//v_200OK_Step9 := f_mtc_check_TP_IMS_5092_01_ic(v_ic); // Check2
+		
+		//Step 2
+		f_mtc_userCheckRegistration(v_ueB, f_getAnyValidUser(PX_EUT_B)); 
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueB);
+		
+		// unmap/disconnect component ports
+		f_cf_user_down(v_ueB);
+		f_cf_roam_reg_down(v_gmA, v_ic);
+		f_cf_adapter_down();
+	}
+
+	/**
+	 * @desc
+	 *     403 response from first entry point on REGISTER with topology hiding
+	 *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.2.3)
+	 */
+	 // @TODO
+	testcase TC_IMS_REG_0002H() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var Request v_Register_Step4;
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueB);
+		f_cf_roam_reg_up(v_gmA, v_ic);
+		
+		// test body
+		f_mtc_userRegistration(v_ueB, f_getAnyValidUser(PX_EUT_A)); 
+		
+		f_mtc_check_TP_IMS_5402_01_gm(v_gmA);
+		
+		v_Register_Step4 := f_mtc_check_TP_IMS_5402_01_ic(v_ic); // Check1
+		
+		f_mtc_userCheckRegistration(v_ueB, f_getAnyValidUser(PX_EUT_B));
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueB);
+		
+		// unmap/disconnect component ports
+		f_cf_user_down(v_ueB);
+		f_cf_roam_reg_down(v_gmA, v_ic);
+	}
+	/**
+	 * @desc
+	 *     403 response to REGISTER from an un-trusted domain without topology hiding
+	 *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.2.4)
+	 */
+	testcase TC_IMS_REG_0003() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_anyValidUser := f_getAnyValidUser(PX_EUT_B);  
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueB);
+		f_cf_roam_reg_up(v_gmA, v_ic);
+		
+		// test body
+		f_mtc_userRegistration(v_ueB, v_anyValidUser); // Test Sequence Step 1
+		
+		f_mtc_check_TP_IMS_5129_01_gm(v_gmA, false); // Check1 when (Gm)
+		f_mtc_check_TP_IMS_5129_01_ic_when(v_ic, false); // Check1 when (Mw)
+
+		f_mtc_check_TP_IMS_5129_01_ic(v_ic, false); // Check1 then
+		
+		f_mtc_userCheckNoRegistration(v_ueB, v_anyValidUser); // Test Sequence Step 2 - unsuccessful registration 
+		
+		// unmap/disconnect component ports
+		f_cf_user_down(v_ueB);
+		f_cf_roam_reg_down(v_gmA, v_ic);
+	}
+
+	/**
+	 * @desc
+	 *     403 response to REGISTER from an un-trusted domain with topology hiding
+	 *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.2.5)
+	 */
+	testcase TC_IMS_REG_0003H() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_anyValidUser := f_getAnyValidUser(PX_EUT_B);  
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueB);
+		f_cf_roam_reg_up(v_gmA, v_ic);
+		
+		// test body
+		f_mtc_userRegistration(v_ueB, v_anyValidUser); // Test Sequence Step 1
+		
+		f_mtc_check_TP_IMS_5411_01_gm(v_gmA, false); // Check1 when (Gm)
+		f_mtc_check_TP_IMS_5411_01_ic_when(v_gmA, false); //Check1 when (Mw)
+
+		f_mtc_check_TP_IMS_5411_01_ic(v_ic, false); // Check1 then
+		
+		f_mtc_userCheckNoRegistration(v_ueB, v_anyValidUser); // Test Sequence Step 2 - unsuccessful registration
+		
+		// unmap/disconnect component ports
+		f_cf_user_down(v_ueB);
+		f_cf_roam_reg_down(v_gmA, v_ic);
+	}
+
+	/**
+	* @desc IMS network supports network initiated re-registration 
+	* upon receipt of a new registration with new contact information
+	* @see ETSI TS 186 011-2 V2.3.1 cause 4.5.2.6
+	*/
+	testcase TC_IMS_REG_0004() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_anyValidUser := f_getAnyValidUser(PX_EUT_B);
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueB);
+		f_cf_roam_reg_up(v_gmA, v_ic);
+		
+		// test body
+		f_mtc_userRegistration(v_ueB, v_anyValidUser); // Test Sequence Step 1 
+		
+		f_mtc_check_TP_IMS_5088_01_gm(v_gmA, false); // Check1 when (REGISTER)
+		f_mtc_check_TP_IMS_5088_01_ic(v_ic, false); // Check1 then (NOTIFY)
+		
+		f_mtc_userCheckRegistration(v_ueB, v_anyValidUser); // Test Sequence Step 2
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueB);
+		
+		// unmap/disconnect component ports
+		f_cf_user_down(v_ueB);
+		f_cf_roam_reg_down(v_gmA, v_ic);
+	}
+	
+	/**
+	* @desc IMS network can initiate user de-registration, 
+	* 		e.g., when a user runs out of credit
+	* @see 	ETSI TS 186 011-2 V2.3.1 cause 4.5.2.7
+	*/
+	testcase TC_IMS_REG_0005() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_anyValidUser := f_getAnyValidUser(PX_EUT_B);
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueB);
+		f_cf_roam_reg_up(v_gmA, v_ic);
+		
+		// test body
+		// IMS_B is triggered manually to de-register user B // Test Sequence Step 1 manuallz
+		
+		// IMS_B receives a network_originated_deregistration_event // Check1 when manually
+		
+		f_mtc_check_TP_IMS_5093_01_UE_ic(v_ic, v_anyValidUser, false); // check1 then - 1st NOTIFY 
+		f_mtc_check_TP_IMS_5093_01_IMS_ic(v_ic, false); // check1 then - 2nd NOTIFY
+		
+		f_mtc_userCheckNoRegistration(v_ueB, v_anyValidUser); // Test Sequence Step 2 - check that user is not registered anymore (de-registration)
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueB);
+		
+		// unmap/disconnect component ports
+		f_cf_user_down(v_ueB);
+		f_cf_roam_reg_down(v_gmA, v_ic);
+	}
+	/**
+	* @desc IMS network can initiate user re-authentication 
+	* @see 	ETSI TS 186 011-2 V2.3.1 cause 4.5.2.8
+	*/
+	testcase TC_IMS_REG_0006() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_anyValidUser := f_getAnyValidUser(PX_EUT_B);
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueB);
+		f_cf_roam_reg_up(v_gmA, v_ic);
+		
+		// test body
+		
+		//IMS_B receives a network_originated_deregistration_event // Check1 when manually
+		
+		f_mtc_check_TP_IMS_5094_01_UE(v_ic, v_anyValidUser, false); // check1 then - 1st NOTIFY 
+		f_mtc_check_TP_IMS_5094_01_IMS(v_ic, false); // check1 then - 2nd NOTIFY
+		
+		f_mtc_userCheckRegistration(v_ueB, v_anyValidUser); // Test Sequence Step 2
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_roam_reg_down(v_gmA, v_ic);
+		
+		// unmap/disconnect component ports
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+	}
+
+	/**
+	 * @desc
+	 *     First time registration in a visited IMS network with topology hiding.
+	 *     (ETSI TS 186 011-2 V2.3.1 cause 4.5.2.9)
+	 */
+	// @TODO
+	testcase TC_IMS_REG_0007() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsUserInfo v_anyValidUser := f_getAnyValidUser(PX_EUT_B);
+		
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueB);
+		f_cf_roam_reg_up(v_gmA, v_ic);
+
+		// test body
+		
+		f_mtc_userRegistration(v_ueB, v_anyValidUser); // Test Sequence Step 1
+		
+		f_mtc_check_TP_IMS_5134_01_gm(v_gmA, false); // Check1 when
+		f_mtc_check_TP_IMS_5134_01_ic(v_ic, false); // Check1 then
+		
+		f_mtc_check_TP_IMS_5405_01_gm(v_gmA, false); // Check2 when
+		f_mtc_check_TP_IMS_5405_01_ic(v_ic, false); // Check2 then // @TODO mdw_TP_IMS_5405_01_ic needs to be checked
+		
+		f_mtc_userCheckRegistration(v_ueB, v_anyValidUser); // Test Sequence Step 2
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueB);
+		f_cf_roam_reg_down(v_gmA, v_ic);
+		
+		// unmap/disconnect component ports
+		f_cf_user_down(v_ueB);
+		f_cf_adapter_down();
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestCases_SS.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestCases_SS.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestCases_SS.ttcn	(revision 22)
@@ -0,0 +1,680 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides ATS specific test case definitions.
+ */
+module AtsImsIot_TestCases_SS {
+	
+	import from AtsImsIot_Behavior {
+        function all;
+    }
+
+	import from AtsImsIot_Functions {
+        function all;
+    }
+
+	import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;}
+
+	import from LibIms_UpperTester {type ImsUserInfo;}
+
+	import from LibIot_TestConfiguration {
+        function f_cf_create_IotEquipmentUser;
+    }
+
+	import from AtsImsIot_TestConfiguration {
+        const all;
+        function all;
+    }
+
+	import from LibIot_TestInterface {type IotEquipmentUser;}
+
+	import from AtsImsIot_TestSystem {
+        type ImsInterfaceMonitor, ImsTestCoordinator, IotSystemInterface, CF_INT_AS, CF_ROAM_AS;
+    }
+
+	/**
+	 * @desc Supplementary Service HOLD with AS
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.5.1
+	 */
+	testcase TC_IMS_SS_0001() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+        var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_iscB := f_cf_create_monitor(c_isc_B);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getHoldUser(PX_EUT_B); 
+		var CF_INT_AS v_config := {v_gmA, v_ic, v_gmB, omit, v_iscB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_int_as_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+				
+		// test body
+	    f_mtc_StartAllTrafficCapture();		
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB);//Test Sequence Step 1
+
+		f_mtc_userCheckRinging(v_ueB);//Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueA);//Test Sequence Step 3
+		f_mtc_userAnswerCall(v_ueB);//Test Sequence Step 4
+		f_mtc_userCheckCallEstablished(v_ueA);//Test Sequence Step 5
+		f_mtc_userCheckCallEstablished(v_ueB);//Test Sequence Step 6
+
+		f_mtc_userTriggerHold(v_ueB);//Test Sequence Step 7
+		
+		//check 1 - INVITE(hold)
+		f_mtc_check_TP_IMS_5310_01_gm(v_gmB, 0); // Check1 
+		f_mtc_check_TP_IMS_5310_01_isc(v_iscB); // Check1 
+		
+		f_mtc_userCheckUserOnHold(v_ueA);//Test Sequence Step 8
+		
+		//check 2 - 200 OK
+		f_mtc_check_TP_IMS_5312_01_ic(v_ic, 1); // Check2 
+		f_mtc_check_TP_IMS_5312_01_isc(v_iscB); // Check2 
+		
+		f_mtc_userCheckUserOnHold(v_ueB);//Test Sequence Step 9
+				
+		f_mtc_userTriggerResume(v_ueB);//Test Sequence Step 10
+		
+		//check 3 - INVITE(resume)
+		f_mtc_check_TP_IMS_5310_01_gm(v_gmB, 0); // Check3 
+		f_mtc_check_TP_IMS_5310_01_isc(v_iscB); // Check3 
+		
+		f_mtc_userCheckCallResumed(v_ueA);//Test Sequence Step 11
+
+		//check 4 - 200 OK
+		f_mtc_check_TP_IMS_5312_01_ic(v_ic, 0); // Check4 
+		f_mtc_check_TP_IMS_5312_01_isc(v_iscB); // Check4 
+
+		f_mtc_userCheckCallResumed(v_ueB);//Test Sequence Step 12
+		f_mtc_EndCall(v_ueA);//Test Sequence Step 13
+		f_mtc_userCheckCallEnded(v_ueB );//Test Sequence Step 14
+		f_mtc_userCheckCallEnded(v_ueA);//Test Sequence Step 15
+
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_int_as_down(v_config);
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_SS_0001
+
+	/**
+	 * @desc Supplementary Service HOLD with AS in roaming
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.5.2
+	 */
+	testcase TC_IMS_SS_0002() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+        var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_iscB := f_cf_create_monitor(c_isc_B);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getHoldUser(PX_EUT_B); 
+		var CF_ROAM_AS v_config := {v_gmA, v_ic, v_gmB, omit, v_iscB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_roam_as_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+				
+		// test body
+	    f_mtc_StartAllTrafficCapture();		
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB);//Test Sequence Step 1
+
+		f_mtc_userCheckRinging(v_ueB);//Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueA);//Test Sequence Step 3
+		f_mtc_userAnswerCall(v_ueB);//Test Sequence Step 4
+		f_mtc_userCheckCallEstablished(v_ueA);//Test Sequence Step 5
+		f_mtc_userCheckCallEstablished(v_ueB);//Test Sequence Step 6
+
+		f_mtc_userTriggerHold(v_ueB);//Test Sequence Step 7
+
+		//check 1 - INVITE(hold)
+		f_mtc_check_TP_IMS_5310_01_gm(v_gmB, 1); // Check1 - skip one INVITE when call is established
+		f_mtc_check_TP_IMS_5310_01_isc(v_iscB); // Check1 
+		
+		f_mtc_userCheckUserOnHold(v_ueA);//Test Sequence Step 8
+		
+		//check 2 - 200 OK
+		f_mtc_check_TP_IMS_5312_01_ic(v_ic, 2); // Check2 - skip two 200OK when call is established - because roaming
+		f_mtc_check_TP_IMS_5312_01_isc(v_iscB); // Check2 
+		
+		f_mtc_userCheckUserOnHold(v_ueB);//Test Sequence Step 9
+		f_mtc_userTriggerResume(v_ueB);//Test Sequence Step 10
+		
+		//check 3 - INVITE(resume)
+		f_mtc_check_TP_IMS_5310_01_gm(v_gmB, 0); // Check3 
+		f_mtc_check_TP_IMS_5310_01_isc(v_iscB); // Check3 
+		
+		f_mtc_userCheckCallResumed(v_ueA);//Test Sequence Step 11
+		
+		//check 4 - 200 OK
+		f_mtc_check_TP_IMS_5312_01_ic(v_ic, 1); // Check4 
+		f_mtc_check_TP_IMS_5312_01_isc(v_iscB); // Check4 
+
+		f_mtc_userCheckCallResumed(v_ueB);//Test Sequence Step 12
+		f_mtc_EndCall(v_ueA);//Test Sequence Step 13
+		f_mtc_userCheckCallEnded(v_ueB );//Test Sequence Step 14
+		f_mtc_userCheckCallEnded(v_ueA);//Test Sequence Step 15
+
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_roam_as_down(v_config);
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_SS_0002
+
+	/**
+		* @desc Supplementary Service OIP with AS
+		* @see TS 186 011-2 V2.3.1 cause 4.5.5.3
+		*/
+	testcase TC_IMS_SS_0003() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_iscB := f_cf_create_monitor(c_isc_B);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getOIPUser(PX_EUT_B);
+		var CF_INT_AS v_config := {v_gmA, v_ic, v_gmB, omit, v_iscB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_int_as_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+				
+		// test body
+		f_mtc_StartAllTrafficCapture();		
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB);//Test Sequence Step 1
+
+		//check 1,2 - INVITE
+		f_mtc_check_TP_IMS_5097_02_gm(v_gmA, false);// Check1
+		f_mtc_check_TP_IMS_5097_02_ic(v_ic, true);// Check1
+		f_mtc_check_TP_IMS_5108_03_ic(v_ic, false);// Check2
+		f_mtc_check_TP_IMS_5108_03_isc(v_iscB, false);// Check2
+
+		f_mtc_userCheckRinging(v_ueB);//Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueA);//Test Sequence Step 3
+		f_mtc_userAnswerCall(v_ueB);//Test Sequence Step 4
+		
+		//check 3 - 200 OK
+		f_mtc_check_TP_IMS_5115_08_isc(v_iscB, false);// Check3
+		f_mtc_check_TP_IMS_5115_08_ic(v_ic, false, 0);// Check3
+		
+		f_mtc_userCheckCallEstablished(v_ueA);//Test Sequence Step 5
+		f_mtc_userCheckCallEstablished(v_ueB);//Test Sequence Step 6
+
+		f_mtc_EndCall(v_ueA);//Test Sequence Step 7
+		f_mtc_userCheckCallEnded(v_ueB);//Test Sequence Step 8
+		f_mtc_userCheckCallEnded(v_ueA);//Test Sequence Step 9
+
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_int_as_down(v_config);
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_SS_0003
+
+	/**
+		* @desc Supplementary Service OIP with AS in roaming
+		* @see TS 186 011-2 V2.3.1 cause 4.5.5.4
+		*/
+	testcase TC_IMS_SS_0004() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_iscB := f_cf_create_monitor(c_isc_B);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getOIPUser(PX_EUT_B);
+		var CF_ROAM_AS v_config := {v_gmA, v_ic, v_gmB, omit, v_iscB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_roam_as_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+				
+		// test body
+		f_mtc_StartAllTrafficCapture();		
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB);//Test Sequence Step 1
+
+		//checks 1,2 - INVITE
+		f_mtc_check_TP_IMS_5097_02_gm(v_gmA, false);// Check1
+		f_mtc_check_TP_IMS_5097_02_ic(v_ic, true);// Check1
+		f_mtc_check_TP_IMS_5108_03_ic(v_ic, false);// Check2
+		f_mtc_check_TP_IMS_5108_03_isc(v_iscB, false);// Check2
+
+		f_mtc_userCheckRinging(v_ueB);//Test Sequence Step 2
+		f_mtc_userCheckPeerIsRinging(v_ueA);//Test Sequence Step 3
+		f_mtc_userAnswerCall(v_ueB);//Test Sequence Step 4
+		
+		//check 3 - 200 OK
+		f_mtc_check_TP_IMS_5115_08_isc(v_iscB, false);// Check3
+		f_mtc_check_TP_IMS_5115_08_ic(v_ic, false, 1);// Check3 //skip 200OK IMSA->IMSB
+		
+		f_mtc_userCheckCallEstablished(v_ueA);//Test Sequence Step 5
+		f_mtc_userCheckCallEstablished(v_ueB);//Test Sequence Step 6
+
+		f_mtc_EndCall(v_ueA);//Test Sequence Step 7
+		f_mtc_userCheckCallEnded(v_ueB);//Test Sequence Step 8
+		f_mtc_userCheckCallEnded(v_ueA);//Test Sequence Step 9
+
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_roam_as_down(v_config);
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_SS_0004
+
+	/**
+		* @desc Supplementary Service OIR and ACR with AS
+		* @see TS 186 011-2 V2.3.1 cause 4.5.5.5
+		*/
+	testcase TC_IMS_SS_0005() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_iscA := f_cf_create_monitor(c_isc_A);
+		var ImsInterfaceMonitor v_iscB := f_cf_create_monitor(c_isc_B);
+		var ImsUserInfo v_userInfoA := f_getOIRUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getACRUser(PX_EUT_B);
+		var CF_INT_AS v_config := {v_gmA, v_ic, v_gmB, v_iscA, v_iscB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_int_as_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+				
+		// test body
+		f_mtc_StartAllTrafficCapture();		
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB);//Test Sequence Step 1
+
+		//check 1 - INVITE
+		f_mtc_check_TP_IMS_5108_03_ic(v_ic, false);// Check1
+		f_mtc_check_TP_IMS_5108_03_isc(v_iscB, false);// Check1
+		
+		//check 2 - 433 Anonymity Disallowe
+		f_mtc_check_TP_IMS_5313_01_ic(v_ic, false);// Check2
+		f_mtc_check_TP_IMS_5313_01_isc(v_iscA, false);// Check2
+
+		f_mtc_userCheckCallRejectedACR(v_ueA);//Test Sequence Step 2
+
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_int_as_down(v_config);
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_SS_0005
+
+	/**
+		* @desc Supplementary Service OIR and ACR with AS in roaming
+		* @see TS 186 011-2 V2.3.1 cause 4.5.5.6
+		*/
+	testcase TC_IMS_SS_0006() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_iscA := f_cf_create_monitor(c_isc_A);
+		var ImsInterfaceMonitor v_iscB := f_cf_create_monitor(c_isc_B);
+		var ImsUserInfo v_userInfoA := f_getACRUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getOIRUser(PX_EUT_B);
+		var CF_ROAM_AS v_config := {v_gmA, v_ic, v_gmB, v_iscA, v_iscB};
+				
+		// map/connect component ports
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_roam_as_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+				
+		// test body
+		f_mtc_StartAllTrafficCapture();		
+		f_mtc_userInitiateCall (v_ueB, v_userInfoA);//Test Sequence Step 1
+		
+		//checks 1,2,3 - INVITE
+		f_mtc_check_TP_IMS_5046_01_gm(v_gmB, true);// Check1
+		f_mtc_check_TP_IMS_5067_01_gm(v_gmB, false);// Check2
+		f_mtc_check_TP_IMS_5046_01_ic(v_ic, true);// Check1
+		f_mtc_check_TP_IMS_5067_01_ic(v_ic, true);// Check2
+		f_mtc_check_TP_IMS_5097_09_ic(v_ic, false);// Check3
+		f_mtc_check_TP_IMS_5097_09_isc(v_iscB, false);// Check3
+		
+		f_mtc_userCheckCallRejectedACR(v_ueB);//Test Sequence Step 2
+
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_roam_as_down(v_config);
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_SS_0006
+	
+	/**
+	 * @desc Supplementary Service CFU with AS
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.5.7
+	 */
+	testcase TC_IMS_SS_0007() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var IotEquipmentUser v_ueB2 := f_cf_create_IotEquipmentUser(c_userUE_B2);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_iscB := f_cf_create_monitor(c_isc_B);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		var ImsUserInfo v_userInfoB2 := f_getAnyValidUser(PX_EUT_B);//// TODO f_getAnyValidUser2 ? 
+		var CF_INT_AS v_config := {v_gmA, v_ic, v_gmB, omit, v_iscB};
+		
+		// map/connect component ports
+		// f_cf_user_up(v_ueB);
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_user_up(v_ueB2);
+		f_cf_int_as_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		f_mtc_userRegistration(v_ueB2, v_userInfoB2); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB);//Test Sequence Step 1
+
+        // checks 1,2 - INVITE
+		f_mtc_check_TP_IMS_5097_01_gm(v_gmA, false); // Check1 
+		f_mtc_check_TP_IMS_5097_01_ic(v_ic, true); // Check1 
+		f_mtc_check_TP_IMS_5108_03_ic(v_ic, false); // Check2 
+		f_mtc_check_TP_IMS_5108_03_isc(v_iscB, false); // Check2
+
+   		//f_mtc_userCheckRinging(v_ueB2); //possible Test Sequence Step
+		//f_mtc_userCheckPeerIsRinging(v_ueA); //possible Test Sequence Step
+		f_mtc_userAnswerCall(v_ueB2);//Test Sequence Step 3
+
+		//check 3 - 200 OK
+		f_mtc_check_TP_IMS_5115_08_isc(v_iscB, false);// Check3
+		f_mtc_check_TP_IMS_5115_08_ic(v_ic, false, 0);// Check3
+		
+		f_mtc_userCheckCallEstablished(v_ueA);//Test Sequence Step 4
+		f_mtc_userCheckCallEstablished(v_ueB2);//Test Sequence Step 5
+
+		f_mtc_EndCall(v_ueA);//Test Sequence Step 6
+		f_mtc_userCheckCallEnded(v_ueB2);//Test Sequence Step 7
+		f_mtc_userCheckCallEnded(v_ueA);//Test Sequence Step 8
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_PO_user_home_deregistration(v_ueB2);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_user_down(v_ueB2);
+		f_cf_int_as_down(v_config);
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_SS_0007
+	
+	/**
+	 * @desc Supplementary Service CFU with AS in roaming
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.5.8
+	 */
+	testcase TC_IMS_SS_0008() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var IotEquipmentUser v_ueA2 := f_cf_create_IotEquipmentUser(c_userUE_A2);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_iscA := f_cf_create_monitor(c_isc_A);
+		var ImsUserInfo v_userInfoA := f_getAnyValidUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getAnyValidUser(PX_EUT_B);
+		var ImsUserInfo v_userInfoA2 := f_getAnyValidUser(PX_EUT_A);//// TODO f_getAnyValidUser2 ? 
+		var CF_ROAM_AS v_config := {v_gmA, v_ic, v_gmB, v_iscA, omit};
+		
+		// map/connect component ports
+		// f_cf_user_up(v_ueB);
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_user_up(v_ueA2);
+		f_cf_roam_as_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		f_mtc_userRegistration(v_ueA2, v_userInfoA2); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueB, v_userInfoA);//Test Sequence Step 1
+
+        // checks 1,2,3 - INVITE
+		f_mtc_check_TP_IMS_5046_01_gm(v_gmB, true); // Check1
+		f_mtc_check_TP_IMS_5067_01_gm(v_gmB, false); // Check2
+		f_mtc_check_TP_IMS_5046_01_ic(v_ic, true); // Check1
+		f_mtc_check_TP_IMS_5067_01_ic(v_ic, true); // Check2
+		f_mtc_check_TP_IMS_5070_01_ic(v_ic, false); // Check3
+
+   		//f_mtc_userCheckRinging(v_ueA2); //possible Test Sequence Step
+		//f_mtc_userCheckPeerIsRinging(v_ueA); //possible Test Sequence Step
+		f_mtc_userAnswerCall(v_ueA2);//Test Sequence Step 3
+
+		//check 4 - 200 OK
+		f_mtc_check_TP_IMS_5110_01_isc(v_iscA); // Check4 
+		f_mtc_check_TP_IMS_5110_01_ic(v_ic); // Check4 
+		
+		f_mtc_userCheckCallEstablished(v_ueB);//Test Sequence Step 4
+		f_mtc_userCheckCallEstablished(v_ueA2);//Test Sequence Step 5
+
+		f_mtc_EndCall(v_ueB);//Test Sequence Step 6
+		f_mtc_userCheckCallEnded(v_ueA2);//Test Sequence Step 7
+		f_mtc_userCheckCallEnded(v_ueB);//Test Sequence Step 8
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		f_PO_user_home_deregistration(v_ueA2);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_user_down(v_ueA2);
+		f_cf_roam_as_down(v_config);
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_SS_0008
+	
+	/**
+	 * @desc Supplementary Service OIP and OIR with AS
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.5.9
+	 */
+	testcase TC_IMS_SS_0009() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_iscA := f_cf_create_monitor(c_isc_A);
+		var ImsInterfaceMonitor v_iscB := f_cf_create_monitor(c_isc_B);
+		var ImsUserInfo v_userInfoA := f_getOIRUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getOIPUser(PX_EUT_B); 
+		var CF_INT_AS v_config := {v_gmA, v_ic, v_gmB, v_iscA, v_iscB};
+		
+		// map/connect component ports
+		// f_cf_user_up(v_ueB);
+		f_cf_adapter_up();
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_int_as_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueA, v_userInfoB);//Test Sequence Step 1
+
+        // checks 1,2 - INVITE
+		f_mtc_check_TP_IMS_5097_01_gm(v_gmA, false); // Check1 
+		f_mtc_check_TP_IMS_5097_01_ic(v_ic, true); // Check1 
+		f_mtc_check_TP_IMS_5108_03_ic(v_ic, false); // Check2 
+		f_mtc_check_TP_IMS_5108_03_isc(v_iscB, false); // Check2
+
+   		f_mtc_userCheckRinging(v_ueB); //possible Test Sequence Step
+		f_mtc_userCheckPeerIsRinging(v_ueA); //possible Test Sequence Step
+		f_mtc_userAnswerCall(v_ueB);//Test Sequence Step 3
+		
+		f_mtc_userCheckCallEstablished(v_ueA);//Test Sequence Step 4
+		f_mtc_userCheckCallEstablished(v_ueB);//Test Sequence Step 5
+
+		f_mtc_EndCall(v_ueB);//Test Sequence Step 6
+		f_mtc_userCheckCallEnded(v_ueA);//Test Sequence Step 7
+		f_mtc_userCheckCallEnded(v_ueB);//Test Sequence Step 8
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_int_as_down(v_config);
+		f_cf_adapter_down();
+	} //end testcase TC_IMS_SS_0009
+	
+	/**
+	 * @desc Supplementary Service OIP and OIR with AS in roaming
+	 * @see TS 186 011-2 V2.3.1 cause 4.5.5.10
+	 */
+	testcase TC_IMS_SS_0010() runs on ImsTestCoordinator system IotSystemInterface {
+		// create components
+		var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser(c_userUE_A);
+		var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser(c_userUE_B);
+		var ImsInterfaceMonitor v_gmA := f_cf_create_monitor(c_gm_A);
+		var ImsInterfaceMonitor v_gmB := f_cf_create_monitor(c_gm_B);
+		var ImsInterfaceMonitor v_ic := f_cf_create_monitor(c_ic);
+		var ImsInterfaceMonitor v_iscA := f_cf_create_monitor(c_isc_A);
+		var ImsInterfaceMonitor v_iscB := f_cf_create_monitor(c_isc_B);
+		var ImsUserInfo v_userInfoA := f_getOIRUser(PX_EUT_A);
+		var ImsUserInfo v_userInfoB := f_getOIPUser(PX_EUT_B);
+		var CF_ROAM_AS v_config := {v_gmA, v_ic, v_gmB, v_iscA, v_iscB};
+		
+		// map/connect component ports
+		// f_cf_user_up(v_ueB);
+		f_cf_user_up(v_ueA);
+		f_cf_user_up(v_ueB);
+		f_cf_roam_as_up(v_config);
+		
+		// preamble
+		f_mtc_userRegistration(v_ueA, v_userInfoA); 
+		f_mtc_userRegistration(v_ueB, v_userInfoB); 
+		
+		// test body
+		f_mtc_userInitiateCall (v_ueB, v_userInfoA);//Test Sequence Step 1
+
+		//checks 1,2,5 - INVITE
+        f_mtc_check_TP_IMS_5046_01_gm(v_gmB, true);// Check1
+        f_mtc_check_TP_IMS_5067_01_gm(v_gmB, false);// Check5
+        f_mtc_check_TP_IMS_5046_01_ic(v_ic, true);// Check1
+        f_mtc_check_TP_IMS_5067_01_ic(v_ic, true);// Check5
+        f_mtc_check_TP_IMS_5097_09_ic(v_ic, false);// Check2
+        f_mtc_check_TP_IMS_5097_09_isc(v_iscB, false);// Check2
+
+		//check 3 -180 Ringing
+		f_mtc_check_TP_IMS_5308_01_gm(v_gmA, false);// Check3
+		f_mtc_check_TP_IMS_5308_01_isc(v_iscA, false);// Check3
+		
+   		f_mtc_userCheckRinging(v_ueB); //possible Test Sequence Step
+		f_mtc_userCheckPeerIsRinging(v_ueA); //possible Test Sequence Step
+		f_mtc_userAnswerCall(v_ueA);//Test Sequence Step 3
+		
+		//check 4 -200 OK
+		f_mtc_check_TP_IMS_5308_02_gm(v_gmA, false);// Check4
+		f_mtc_check_TP_IMS_5308_02_isc(v_iscA, false);// Check4
+		
+		f_mtc_userCheckCallEstablished(v_ueB);//Test Sequence Step 4
+		f_mtc_userCheckCallEstablished(v_ueA);//Test Sequence Step 5
+
+		f_mtc_EndCall(v_ueB);//Test Sequence Step 6
+		f_mtc_userCheckCallEnded(v_ueA);//Test Sequence Step 7
+		f_mtc_userCheckCallEnded(v_ueB);//Test Sequence Step 8
+		
+		// postamble
+		f_PO_user_home_deregistration(v_ueA);
+		f_PO_user_home_deregistration(v_ueB);
+		
+		//unmap/disconnet component ports
+		f_cf_user_down(v_ueA);
+		f_cf_user_down(v_ueB);
+		f_cf_roam_as_down(v_config);
+	} //end testcase TC_IMS_SS_0010
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestConfiguration.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestConfiguration.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestConfiguration.ttcn	(revision 22)
@@ -0,0 +1,1002 @@
+/*
+ *	@author 	STF 370
+ *  @version    $Id $
+ *	@desc		This module contains functions which implement the 
+ *              configuration of the SUT adapter and mapping of test
+ *              components for establishing and tearing down different 
+ *              test configurations.
+ */
+
+module AtsImsIot_TestConfiguration {
+	
+	import from LibIms_UpperTester language "TTCN-3:2008 Amendment 1" {
+		modulepar PX_IMS_USER_DATA;
+	}
+
+	import from LibIot_TypesAndValues {
+		type StartTrafficCaptureRsp, StopTrafficCaptureRsp;
+	}
+
+	import from AtsImsIot_TestSystem {type CF_INT_CALL, CF_INT_AS, CF_ROAM_AS;}
+
+	import from LibIot_PIXITS {
+		modulepar PX_EUT_A, PX_EUT_B, PX_PRODUCTS, PX_MAX_MSG_WAIT;
+	}
+
+	import from LibIot_Functions language "TTCN-3:2008 Amendment 1" {
+		altstep a_receiveIOTVerdict;
+		function f_setConformanceVerdict, f_setE2EVerdict;
+	}
+
+	import from AtsImsIot_Templates {
+		template
+			m_generalConfigurationReq_offline,
+			m_generalConfigurationReq_online,
+			m_generalConfigurationReq_merge,
+			m_generalConfigurationRsp_success,
+			m_generalConfigurationRsp_error,
+			m_generalConfigurationRsp_timeout,
+			m_SetFilterReq,
+			mw_SetFilterRsp,
+			m_startTrafficCaptureReq,
+			m_stopTrafficCaptureReq,
+			m_startTrafficCaptureRsp_any,
+			m_stopTrafficCaptureRsp_any;
+	}
+
+	import from LibCommon_VerdictControl {type FncRetCode;}
+
+	import from LibIot_TypesAndValues {
+		type
+			InterfaceInfo,
+			InterfaceInfoList,
+			Product,
+			ProtocolFilter,
+			StartTrafficCaptureRsp,
+			StopTrafficCaptureRsp,
+			SetFilterReq,
+			SetFilterRsp,
+			Status;
+	}
+
+	import from LibIot_TestConfiguration {
+		function f_cf_oracle_up, f_cf_oracle_down;
+	}
+
+	import from AtsImsIot_TestSystem {
+		type ImsInterfaceMonitor, ImsTestCoordinator;
+	}
+
+	import from LibIot_TestInterface {type IotEquipmentUser;}
+	
+	import from AtsImsIot_Functions {function f_setInterfaceNameOnComponent;}
+	
+	
+	group constantDefinitions {
+		//* interface monitor name Gm A
+		const charstring c_gm_A := "Gm A";
+		//* interface monitor name Gm B
+		const charstring c_gm_B := "Gm B";
+		//* interface monitor name Mx A
+        const charstring c_mx_A := "Mx A";
+        //* interface monitor name Mx B
+        const charstring c_mx_B := "Mx B";
+		//* interface monitor name Ic
+		const charstring c_ic := "Ic";
+		//* interface monitor name Isc A
+		const charstring c_isc_A := "Isc A";
+		//* interface monitor name Isc B
+		const charstring c_isc_B := "Isc B";
+		//* eut trigger name User A
+		const charstring c_trigger_A := "User A";
+		//* eut trigger name User B
+		const charstring c_trigger_B := "User B";
+		//* eut trigger name User A
+		const charstring c_userUE_A := "User A";
+  		const charstring c_userUE_A2 := "User A2";
+		//* eut trigger name User B
+		const charstring c_userUE_B := "User B";
+		const charstring c_userUE_B2 := "User B2";
+	}
+	
+	group mappingFunctions {
+	
+			/**
+			 * 
+			 * @desc initialize the adapter port of MTC
+			 */
+			function f_cf_adapter_up() runs on ImsTestCoordinator {
+				map(self:acPort, system:acPort);
+			}
+			
+			/**
+			 * 
+			 * @desc uninitialize the adapter port of MTC
+			 */
+			function f_cf_adapter_down() runs on ImsTestCoordinator {
+				unmap(self:acPort, system:acPort);
+			}
+			
+			/**
+			 * 
+			 * @desc initialize trigger component ports
+			 * @param p_driver trigger component
+			 */
+			function f_cf_user_up(in IotEquipmentUser p_driver) runs on ImsTestCoordinator {
+				// connect sync ports
+				connect(p_driver:syncPort, self:syncPort);
+				// connect TSI ports 
+				map(p_driver:eaPort, system:eaPort);
+				// configure oracle
+				f_cf_oracle_up(p_driver);
+			}
+			
+			/**
+			 * 
+			 * @desc uninitialize trigger component ports
+			 * @param p_driver trigger component
+			 */
+			function f_cf_user_down(in IotEquipmentUser p_driver) runs on ImsTestCoordinator {
+				// disconnect sync ports
+				disconnect(p_driver:syncPort, self:syncPort);
+				// disconnect TSI ports 
+				unmap(p_driver:eaPort, system:eaPort);
+				// release oracle ports
+				f_cf_oracle_down(p_driver);
+			}
+			
+			/**
+			* @desc 	configures monitor component: connects to the synchronnization
+			* 			port, maps to the TSI port and connects to the oracle 
+			* @param 	p_monitor	monitor component 
+			*/	
+			function f_cf_monitor_up(in ImsInterfaceMonitor p_monitor) runs on ImsTestCoordinator {
+				// connect sync ports
+				connect(p_monitor:syncPort, self:syncPort);
+				connect(p_monitor:icpPort, self:icpPort);
+				// mapp TSI port
+				map(p_monitor:dPort, system:dPort);
+				map(p_monitor:acPort, system:acPort);
+				// configure oracle
+				f_cf_oracle_up(p_monitor);
+			}
+		
+			/**
+			* @desc 	frees monitor component: disconnects the synchronnization
+			* 			port, unmaps from the TSI port and disconnects from the oracle 
+			* @param 	p_monitor	monitor component 
+			*/		
+			function f_cf_monitor_down(in ImsInterfaceMonitor p_monitor) runs on ImsTestCoordinator {
+				// connect sync ports
+				disconnect(p_monitor:syncPort, self:syncPort);
+				disconnect(p_monitor:icpPort, self:icpPort);
+				// mapp TSI port
+				unmap(p_monitor:dPort, system:dPort);
+				unmap(p_monitor:acPort, system:acPort);
+				// configure oracle
+				f_cf_oracle_down(p_monitor);
+			}
+	
+	}
+	
+	group adapterConfiguration {
+		
+		function f_cf_setFilter(in SetFilterReq p_req) runs on ImsInterfaceMonitor {
+			var SetFilterRsp v_rsp;
+			var template Status v_status := {
+				code := e_success,
+				reason := *
+			}
+			
+			tc_wait.start;
+			acPort.send(p_req);
+			alt {
+				[] acPort.receive (mw_SetFilterRsp(v_status)) -> value v_rsp {
+					tc_wait.stop;
+					f_setE2EVerdict(pass, "Adapter Configuration: setting monitor filter successful");
+					f_setConformanceVerdict(pass, "Adapter Configuration: setting monitor filter successful");
+				}
+				[] acPort.receive (mw_SetFilterRsp(?)) -> value v_rsp {
+					tc_wait.stop;
+					f_setE2EVerdict(inconc, "Adapter Configuration: error while setting monitor filter");
+					f_setConformanceVerdict(inconc, "Adapter Configuration: error while setting monitor filter");
+				}
+				[] tc_wait.timeout {
+					f_setE2EVerdict(inconc, "Adapter Configuration: timer expires while waiting for response");
+					f_setConformanceVerdict(inconc, "Adapter Configuration: timer expires while waiting for response");
+				}
+			}
+		}
+			
+		
+	}
+	
+	group componentCreation {
+	
+			/**
+			* @desc 	creates a monitor component 
+			* @param 	p_name	name of the monitor component 
+			* @return 			the created monitor component
+			*/	
+			function f_cf_create_monitor(in charstring p_name) runs on ImsTestCoordinator return ImsInterfaceMonitor {
+				var ImsInterfaceMonitor v_monitor := ImsInterfaceMonitor.create(p_name) alive;
+				v_monitor.start(f_setInterfaceNameOnComponent(p_name));
+				v_monitor.done;				 
+				return v_monitor; 
+			}
+	}
+	
+	
+	group testConfiguration {
+		
+		/**
+		 * @desc
+		 *     Test configuration function for roaming registration szenario.
+		 *     More information can be found in ETSI TS 186 011-2 V2.3.1 Cause
+		 *     4.3.4.
+		 * @param p_Gm Gm interface monitor component
+		 * @param p_ic Mw interface monitor component
+		 */
+			function f_cf_roam_reg_up(
+				inout ImsInterfaceMonitor p_Gm, 
+				inout ImsInterfaceMonitor p_ic
+			) runs on ImsTestCoordinator {
+				// Initialize the Adapter (including the TrafficCapture process).
+				timer tc_configureGuard;
+				var StartTrafficCaptureRsp startResult;
+				activate(a_receiveIOTVerdict());
+				
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_generalConfigurationReq_offline);
+				alt {
+					[] acPort.receive (m_generalConfigurationRsp_success) {
+						log("General configuration succeed.");
+						tc_configureGuard.stop;
+					}
+					[] acPort.receive (m_generalConfigurationRsp_timeout) {
+						setverdict(fail);
+						tc_configureGuard.stop;
+						stop;
+					}
+					[] acPort.receive (m_generalConfigurationRsp_error) {
+						setverdict(fail);
+						tc_configureGuard.stop;
+						stop;
+					}
+					[] acPort.receive {
+						log("Unknown response.");
+						tc_configureGuard.stop;
+						setverdict (inconc);
+						stop;
+					}
+					[] tc_configureGuard.timeout {
+						log("Timeout.");
+						setverdict (inconc);
+						stop;
+					}
+				} 
+				
+				f_cf_monitor_up(p_Gm);
+				f_cf_monitor_up(p_ic);
+				
+				// TODO UE IP address and port is missing
+				p_Gm.start(f_cf_setFilter(
+					valueof (m_SetFilterReq(
+						e_sip, 
+						f_getInterfaceInfoList("Gm", PX_EUT_A, PX_EUT_B)
+					)
+				)));
+				p_Gm.done;
+				
+				p_ic.start(f_cf_setFilter(
+					valueof(m_SetFilterReq(
+						e_sip, 
+						f_getInterfaceInfoList("Ic", PX_EUT_A, PX_EUT_B)
+					)
+				)));
+				p_ic.done;
+				
+				// Start traffic capture processing.
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_startTrafficCaptureReq);
+				alt {
+				[] acPort.receive (m_startTrafficCaptureRsp_any) -> value startResult {
+					tc_configureGuard.stop;
+							if (startResult.status.code != e_success)
+							{
+								log("**** StartTrafficCaptureReq unsuccessfull! ****");
+								setverdict(fail);
+								stop;
+							}
+						}
+						[] tc_configureGuard.timeout {
+							log("**** StartTrafficCaptureReq not answered. ****");
+							setverdict (inconc);
+							stop;
+						}
+				} 
+			}
+			
+			/**
+		 * @desc
+		 *     Test configuration function for roaming registration szenario.
+		 *     More information can be found in ETSI TS 186 011-2 V2.3.1 Cause
+		 *     4.3.4.
+		 * @param p_Gm Gm interface monitor component
+		 * @param p_ic Mw interface monitor component
+		 */
+			function f_cf_roam_reg_down(
+				inout ImsInterfaceMonitor p_Gm, 
+				inout ImsInterfaceMonitor p_ic
+			) runs on ImsTestCoordinator {
+				// Stop traffic capture processing.
+				timer tc_configureGuard;
+				var StopTrafficCaptureRsp stopResult;
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_stopTrafficCaptureReq);
+				alt {
+					[] acPort.receive (m_stopTrafficCaptureRsp_any) -> value stopResult {
+						tc_configureGuard.stop;
+						if (stopResult.status.code != e_success)
+						{
+							log("**** TC_IMS_MESS_0001: StopTrafficCaptureReq unsuccessfull! ****");
+							setverdict(fail);
+						}
+					}
+					[] tc_configureGuard.timeout {
+						log("**** TC_IMS_MESS_0001: StopTrafficCaptureReq not answered. ****");
+						setverdict (inconc);
+					}
+				} 
+				f_cf_monitor_down(p_Gm);
+				f_cf_monitor_down(p_ic);
+			}
+			
+			/**
+				 * @desc
+				 *     Interworking Call test configuration. Mapps/connects all related
+				 *     ports and initialize the test adapter.
+				 *     More information can be found in ETSI TS 186 011-2 V2.3.1 Cause
+		 *     4.3.4.
+				 * @param p_GmA Gm A Interface Monitor component
+				 * @param p_ic Mw Interface Monitor component
+				 * @param p_GmB
+				 *     Gm B Interface Monitor component (optional, can be omitted)
+				 */
+			function f_cf_int_call_up(
+				inout CF_INT_CALL p_config 
+			) runs on ImsTestCoordinator {
+				// Initialize the Adapter (including the TrafficCapture process).
+				timer tc_configureGuard;
+				var StartTrafficCaptureRsp startResult;
+				
+				activate(a_receiveIOTVerdict());
+				
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_generalConfigurationReq_offline);
+				alt {
+					[] acPort.receive (m_generalConfigurationRsp_success) {
+						log("General configuration succeed.");
+						tc_configureGuard.stop;
+					}
+					[] acPort.receive (m_generalConfigurationRsp_timeout) {
+						setverdict(fail);
+						tc_configureGuard.stop;
+						stop;
+					}
+					[] acPort.receive (m_generalConfigurationRsp_error) {
+						setverdict(fail);
+						tc_configureGuard.stop;
+						stop;
+					}
+					[] acPort.receive {
+						log("Unknown response.");
+						tc_configureGuard.stop;
+						setverdict (inconc);
+						stop;
+					}
+					[] tc_configureGuard.timeout {
+						log("Timeout.");
+						setverdict (inconc);
+						stop;
+					}
+				} 
+				
+				f_cf_monitor_up(p_config.gmA);
+				f_cf_monitor_up(p_config.mw);
+				if(isvalue(p_config.gmB)) {
+					f_cf_monitor_up(p_config.gmB);
+				}
+				
+				// TODO UE IP address and port is missing
+				p_config.gmA.start(f_cf_setFilter(
+					valueof (m_SetFilterReq(
+						e_sip,
+						{f_getInterfaceInfo("Gm", PX_PRODUCTS[PX_EUT_A])}
+					)
+				)));
+				p_config.gmA.done;
+				
+				p_config.mw.start(f_cf_setFilter(
+					valueof(m_SetFilterReq(
+						e_sip, 
+						f_getInterfaceInfoList("Ic", PX_EUT_A, PX_EUT_B)
+					)
+				)));
+				p_config.mw.done;
+				
+				if(isvalue(p_config.gmB)) {
+						p_config.gmB.start(f_cf_setFilter(
+							valueof (m_SetFilterReq(
+								e_sip, 
+								{f_getInterfaceInfo("Gm", PX_PRODUCTS[PX_EUT_B])}
+							)
+						)));
+						p_config.gmB.done;
+				}
+				// Start traffic capture processing.
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_startTrafficCaptureReq);
+				alt {
+				[] acPort.receive (m_startTrafficCaptureRsp_any) -> value startResult {
+					tc_configureGuard.stop;
+							if (startResult.status.code != e_success)
+							{
+								log("**** StartTrafficCaptureReq unsuccessfull! ****");
+								setverdict(fail);
+								stop;
+							}
+						}
+						[] tc_configureGuard.timeout {
+							log("**** StartTrafficCaptureReq not answered. ****");
+							setverdict (inconc);
+							stop;
+						}
+				} 
+			}
+			
+			/**
+				 * @desc
+				 *     Interworking Call test configuration. Ummaps/disconnect the
+				 *     related component ports. More information can be found in ETSI TS
+				 *     186 011-2 V2.3.1 Cause 4.3.4.
+				 * @param p_GmA Gm A Interface Monitor component
+				 * @param p_ic Mw Interface Monitor component
+				 * @param p_GmB
+				 *     Gm B Interface Monitor component (optional, can be omitted)
+				 */
+			function f_cf_int_call_down(
+				inout CF_INT_CALL p_config
+			) runs on ImsTestCoordinator {
+				// Stop traffic capture processing.
+				timer tc_configureGuard;
+				var StopTrafficCaptureRsp stopResult;
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_stopTrafficCaptureReq);
+				alt {
+					[] acPort.receive (m_stopTrafficCaptureRsp_any) -> value stopResult {
+						tc_configureGuard.stop;
+						if (stopResult.status.code != e_success)
+						{
+							log("**** TC_IMS_MESS_0001: StopTrafficCaptureReq unsuccessfull! ****");
+							setverdict(fail);
+						}
+					}
+					[] tc_configureGuard.timeout {
+						log("**** TC_IMS_MESS_0001: StopTrafficCaptureReq not answered. ****");
+						//setverdict (inconc);
+					}
+				} 
+				f_cf_monitor_down(p_config.gmA);
+				f_cf_monitor_down(p_config.mw);
+				if(isvalue(p_config.gmB)) {
+					f_cf_monitor_down(p_config.gmB);
+				}
+			}
+		
+			/**
+				 * @desc
+				 *     Roaming Call test configuration. Mapps/connects all related
+				 *     ports and initialize the test adapter.
+				 *     More information can be found in ETSI TS 186 011-2 V2.3.1 Cause
+		 *     4.3.4.
+				 * @param p_Gm Gm A Interface Monitor component
+				 * @param p_ic Mw Interface Monitor component
+				 */
+			function f_cf_roam_call_up(
+				inout ImsInterfaceMonitor p_Gm, 
+				inout ImsInterfaceMonitor p_ic
+			) runs on ImsTestCoordinator {
+				// Initialize the Adapter (including the TrafficCapture process).
+				timer tc_configureGuard;
+				var StartTrafficCaptureRsp startResult;
+				activate(a_receiveIOTVerdict());
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_generalConfigurationReq_offline);
+				alt {
+					[] acPort.receive (m_generalConfigurationRsp_success) {
+						log("General configuration succeed.");
+						tc_configureGuard.stop;
+					}
+					[] acPort.receive (m_generalConfigurationRsp_timeout) {
+						setverdict(fail);
+						tc_configureGuard.stop;
+						stop;
+					}
+					[] acPort.receive (m_generalConfigurationRsp_error) {
+						setverdict(fail);
+						tc_configureGuard.stop;
+						stop;
+					}
+					[] acPort.receive {
+						log("Unknown response.");
+						tc_configureGuard.stop;
+						setverdict (inconc);
+						stop;
+					}
+					[] tc_configureGuard.timeout {
+						log("Timeout.");
+						setverdict (inconc);
+						stop;
+					}
+				} 
+				
+				f_cf_monitor_up(p_Gm);
+				f_cf_monitor_up(p_ic);
+				
+				// TODO UE IP address and port is missing
+				// TODO UE IP address and port is missing
+				p_Gm.start(f_cf_setFilter(
+					valueof (m_SetFilterReq(
+						e_sip, 
+						f_getInterfaceInfoList("Gm", PX_EUT_A, PX_EUT_B)
+					)
+				)));
+				p_Gm.done;
+				
+				p_ic.start(f_cf_setFilter(
+					valueof(m_SetFilterReq(
+						e_sip, 
+						f_getInterfaceInfoList("Ic", PX_EUT_A, PX_EUT_B)
+					)
+				)));
+				p_ic.done;
+				
+				// Start traffic capture processing.
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_startTrafficCaptureReq);
+				alt {
+				[] acPort.receive (m_startTrafficCaptureRsp_any) -> value startResult {
+					tc_configureGuard.stop;
+							if (startResult.status.code != e_success)
+							{
+								log("**** StartTrafficCaptureReq unsuccessfull! ****");
+								setverdict(fail);
+								stop;
+							}
+						}
+						[] tc_configureGuard.timeout {
+							log("**** StartTrafficCaptureReq not answered. ****");
+							setverdict (inconc);
+							stop;
+						}
+				} 
+			}
+			
+			/**
+				 * @desc
+				 *     Roaming Call test configuration. Ummaps/disconnect the
+				 *     related component ports. More information can be found in ETSI TS
+				 *     186 011-2 V2.3.1 Cause 4.3.4.
+				 * @param p_GmA Gm A Interface Monitor component
+				 * @param p_ic Mw Interface Monitor component
+				 */
+			function f_cf_roam_call_down(
+				inout ImsInterfaceMonitor p_GmA, 
+				inout ImsInterfaceMonitor p_ic
+			) runs on ImsTestCoordinator {
+				// Stop traffic capture processing.
+				timer tc_configureGuard;
+				var StopTrafficCaptureRsp stopResult;
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_stopTrafficCaptureReq);
+				alt {
+					[] acPort.receive (m_stopTrafficCaptureRsp_any) -> value stopResult {
+						tc_configureGuard.stop;
+						if (stopResult.status.code != e_success)
+						{
+							log("**** TC_IMS_MESS_0001: StopTrafficCaptureReq unsuccessfull! ****");
+							setverdict(fail);
+						}
+					}
+					[] tc_configureGuard.timeout {
+						log("**** TC_IMS_MESS_0001: StopTrafficCaptureReq not answered. ****");
+						setverdict (inconc);
+					}
+				} 
+				f_cf_monitor_down(p_GmA);
+				f_cf_monitor_down(p_ic);
+			}
+			
+			
+			/**
+				 * @desc
+				 *     Roaming Call test configuration. Mapps/connects all related
+				 *     ports and initialize the test adapter.
+				 *     More information can be found in ETSI TS 186 011-2 V2.3.1 Cause
+		 *     4.3.4.
+				 * @param p_config.gmA Gm A Interface Monitor component
+				 * @param p_config.mw Mw Interface Monitor component
+				 * @param p_config.gmB Gm B Interface Monitor component
+				 * @param p_config.iscA Isc A Interface Monitor component
+				 * @param p_config.iscB Isc B Interface Monitor component
+				 *      IscA and IscB Interface Monitor component (optional, can be omitted)
+				 */
+			function f_cf_int_as_up(
+  				inout CF_INT_AS p_config
+			) runs on ImsTestCoordinator {
+				// Initialize the Adapter (including the TrafficCapture process).
+				timer tc_configureGuard;
+				var StartTrafficCaptureRsp startResult;
+				activate(a_receiveIOTVerdict());
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_generalConfigurationReq_offline);
+				alt {
+					[] acPort.receive (m_generalConfigurationRsp_success) {
+						log("General configuration succeed.");
+						tc_configureGuard.stop;
+					}
+					[] acPort.receive (m_generalConfigurationRsp_timeout) {
+						setverdict(fail);
+						tc_configureGuard.stop;
+						stop;
+					}
+					[] acPort.receive (m_generalConfigurationRsp_error) {
+						setverdict(fail);
+						tc_configureGuard.stop;
+						stop;
+					}
+					[] acPort.receive {
+						log("Unknown response.");
+						tc_configureGuard.stop;
+						setverdict (inconc);
+						stop;
+					}
+					[] tc_configureGuard.timeout {
+						log("Timeout.");
+						setverdict (inconc);
+						stop;
+					}
+				} 
+				
+				f_cf_monitor_up(p_config.gmA);
+				f_cf_monitor_up(p_config.mw);
+				f_cf_monitor_up(p_config.gmB);
+				if(isvalue(p_config.iscA)) {
+					f_cf_monitor_up(p_config.iscA);
+				}
+				if(isvalue(p_config.iscB)) {
+					f_cf_monitor_up(p_config.iscB);
+				}
+								
+				// TODO UE IP address and port is missing
+				p_config.gmA.start(f_cf_setFilter(
+					valueof (m_SetFilterReq(
+						e_sip,
+						{f_getInterfaceInfo("Gm", PX_PRODUCTS[PX_EUT_A])}
+					)
+				)));
+				p_config.gmA.done;
+				
+				p_config.mw.start(f_cf_setFilter(
+					valueof(m_SetFilterReq(
+						e_sip, 
+						f_getInterfaceInfoList("Ic", PX_EUT_A, PX_EUT_B)
+					)
+				)));
+				p_config.mw.done;
+				
+				p_config.gmB.start(f_cf_setFilter(
+					valueof (m_SetFilterReq(
+						e_sip, 
+						{f_getInterfaceInfo("Gm", PX_PRODUCTS[PX_EUT_B])}
+					)
+				)));
+				p_config.gmB.done;
+				
+				if(isvalue(p_config.iscA)) {
+    				p_config.iscA.start(f_cf_setFilter(
+    					valueof (m_SetFilterReq(
+    						e_sip, 
+    						{f_getInterfaceInfo("Isc", PX_PRODUCTS[PX_EUT_A])}
+    					)
+    				)));
+    				p_config.iscA.done;
+				}
+				
+				if(isvalue(p_config.iscB)) {
+					p_config.iscB.start(f_cf_setFilter(
+						valueof (m_SetFilterReq(
+							e_sip, 
+							{f_getInterfaceInfo("Isc", PX_PRODUCTS[PX_EUT_B])}
+						)
+					)));
+					p_config.iscB.done;
+				}
+				
+				// Start traffic capture processing.
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_startTrafficCaptureReq);
+				alt {
+				[] acPort.receive (m_startTrafficCaptureRsp_any) -> value startResult {
+					tc_configureGuard.stop;
+							if (startResult.status.code != e_success)
+							{
+								log("**** StartTrafficCaptureReq unsuccessfull! ****");
+								setverdict(fail);
+								stop;
+							}
+						}
+						[] tc_configureGuard.timeout {
+							log("**** StartTrafficCaptureReq not answered. ****");
+							setverdict (inconc);
+							stop;
+						}
+				} 				
+			}
+			
+			/**
+				 * @desc
+				 *     Interworking Application Server test configuration.
+				 *     Ummaps/disconnect the related component ports. More information
+				 *     can be found in ETSI TS 186 011-2 V2.3.1 Cause 4.3.4.
+				 * @param p_config.gmA Gm A Interface Monitor component
+				 * @param p_config.mw Mw Interface Monitor component
+				 * @param p_config.gmB Gm B Interface Monitor component
+				 * @param p_config.iscA Isc A Interface Monitor component
+				 * @param p_config.iscB Isc B Interface Monitor component
+				 *      IscA and IscB Interface Monitor component (optional, can be omitted)
+				 */
+			function f_cf_int_as_down(
+				inout CF_INT_AS p_config
+			) runs on ImsTestCoordinator {
+				// Stop traffic capture processing.
+				timer tc_configureGuard;
+				var StopTrafficCaptureRsp stopResult;
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_stopTrafficCaptureReq);
+				alt {
+					[] acPort.receive (m_stopTrafficCaptureRsp_any) -> value stopResult {
+						tc_configureGuard.stop;
+						if (stopResult.status.code != e_success)
+						{
+							log("**** TC_IMS_MESS_0001: StopTrafficCaptureReq unsuccessfull! ****");
+							setverdict(fail);
+						}
+					}
+					[] tc_configureGuard.timeout {
+						log("**** TC_IMS_MESS_0001: StopTrafficCaptureReq not answered. ****");
+						//setverdict (inconc);
+					}
+				} 
+				f_cf_monitor_down(p_config.gmA);
+				f_cf_monitor_down(p_config.mw);
+				f_cf_monitor_down(p_config.gmB);
+				if(isvalue(p_config.iscA)) {
+					f_cf_monitor_down(p_config.iscA);
+				}
+				if(isvalue(p_config.iscB)) {
+					f_cf_monitor_down(p_config.iscB);
+				}
+			}
+			
+			
+		/**
+				* @desc
+				*     Roaming Call test configuration. Mapps/connects all related
+				*     ports and initialize the test adapter.
+				*     More information can be found in ETSI TS 186 011-2 V2.3.1 Cause
+		*     4.3.4.
+				* @param p_config.gmA Gm A Interface Monitor component
+				* @param p_config.mw Mw Interface Monitor component
+				* @param p_config.gmB Gm B Interface Monitor component
+				* @param p_config.iscA Isc A Interface Monitor component
+				* @param p_config.iscB Isc B Interface Monitor component
+				*      IscA and IscB Interface Monitor component (optional, can be omitted)
+				*/
+		function f_cf_roam_as_up(
+			inout CF_ROAM_AS p_config
+		) runs on ImsTestCoordinator {
+				// Initialize the Adapter (including the TrafficCapture process).
+				timer tc_configureGuard;
+				var StartTrafficCaptureRsp startResult;
+			activate(a_receiveIOTVerdict());
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_generalConfigurationReq_offline);
+				alt {
+					[] acPort.receive (m_generalConfigurationRsp_success) {
+						log("General configuration succeed.");
+						tc_configureGuard.stop;
+					}
+					[] acPort.receive (m_generalConfigurationRsp_timeout) {
+						setverdict(fail);
+						tc_configureGuard.stop;
+						stop;
+					}
+					[] acPort.receive (m_generalConfigurationRsp_error) {
+						setverdict(fail);
+						tc_configureGuard.stop;
+						stop;
+					}
+					[] acPort.receive {
+						log("Unknown response.");
+						tc_configureGuard.stop;
+						setverdict (inconc);
+						stop;
+					}
+					[] tc_configureGuard.timeout {
+						log("Timeout.");
+						setverdict (inconc);
+						stop;
+					}
+				} 
+				
+			f_cf_monitor_up(p_config.gmA);
+			f_cf_monitor_up(p_config.mw);
+			f_cf_monitor_up(p_config.gmB);
+			if(isvalue(p_config.iscA)) {
+				f_cf_monitor_up(p_config.iscA);
+			}
+			if(isvalue(p_config.iscB)) {
+				f_cf_monitor_up(p_config.iscB);
+			}
+								
+			// TODO UE IP address and port is missing
+			p_config.gmA.start(f_cf_setFilter(
+				valueof (m_SetFilterReq(
+					e_sip,
+					{f_getInterfaceInfo("Gm", PX_PRODUCTS[PX_EUT_A])}
+				)
+			)));
+			p_config.gmA.done;
+				
+			p_config.mw.start(f_cf_setFilter(
+				valueof(m_SetFilterReq(
+					e_sip, 
+					f_getInterfaceInfoList("Ic", PX_EUT_A, PX_EUT_B)
+				)
+			)));
+			p_config.mw.done;
+				
+			p_config.gmB.start(f_cf_setFilter(
+				valueof (m_SetFilterReq(
+					e_sip, 
+					{f_getInterfaceInfo("Gm", PX_PRODUCTS[PX_EUT_B])}
+				)
+			)));
+			p_config.gmB.done;
+				
+			if(isvalue(p_config.iscA)) {
+							p_config.iscA.start(f_cf_setFilter(
+								valueof (m_SetFilterReq(
+									e_sip, 
+									{f_getInterfaceInfo("Isc", PX_PRODUCTS[PX_EUT_A])}
+								)
+							)));
+							p_config.iscA.done;
+			}
+				
+			if(isvalue(p_config.iscB)) {
+				p_config.iscB.start(f_cf_setFilter(
+					valueof (m_SetFilterReq(
+						e_sip, 
+						{f_getInterfaceInfo("Isc", PX_PRODUCTS[PX_EUT_B])}
+					)
+				)));
+				p_config.iscB.done;
+			}
+				
+				// Start traffic capture processing.
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_startTrafficCaptureReq);
+				alt {
+				[] acPort.receive (m_startTrafficCaptureRsp_any) -> value startResult {
+					tc_configureGuard.stop;
+							if (startResult.status.code != e_success)
+							{
+								log("**** StartTrafficCaptureReq unsuccessfull! ****");
+								setverdict(fail);
+								stop;
+							}
+						}
+						[] tc_configureGuard.timeout {
+							log("**** StartTrafficCaptureReq not answered. ****");
+							setverdict (inconc);
+							stop;
+						}
+				} 
+		}
+			
+		/**
+				* @desc
+				*     Interworking Application Server test configuration.
+				*     Ummaps/disconnect the related component ports. More information
+				*     can be found in ETSI TS 186 011-2 V2.3.1 Cause 4.3.4.
+				* @param p_config.gmA Gm A Interface Monitor component
+				* @param p_config.mw Mw Interface Monitor component
+				* @param p_config.gmB Gm B Interface Monitor component
+				* @param p_config.iscA Isc A Interface Monitor component
+				* @param p_config.iscB Isc B Interface Monitor component
+				*      IscA and IscB Interface Monitor component (optional, can be omitted)
+				*/
+		function f_cf_roam_as_down(
+			inout CF_ROAM_AS p_config
+		) runs on ImsTestCoordinator {
+				// Stop traffic capture processing.
+				timer tc_configureGuard;
+				var StopTrafficCaptureRsp stopResult;
+				tc_configureGuard.start(PX_MAX_MSG_WAIT);
+				acPort.send(m_stopTrafficCaptureReq);
+				alt {
+					[] acPort.receive (m_stopTrafficCaptureRsp_any) -> value stopResult {
+						tc_configureGuard.stop;
+						if (stopResult.status.code != e_success)
+						{
+							log("**** TC_IMS_MESS_0001: StopTrafficCaptureReq unsuccessfull! ****");
+							setverdict(fail);
+						}
+					}
+					[] tc_configureGuard.timeout {
+						log("**** TC_IMS_MESS_0001: StopTrafficCaptureReq not answered. ****");
+						setverdict (inconc);
+					}
+				} 
+			f_cf_monitor_down(p_config.gmA);
+			f_cf_monitor_down(p_config.mw);
+			f_cf_monitor_down(p_config.gmB);
+			if(isvalue(p_config.iscA)) {
+				f_cf_monitor_down(p_config.iscA);
+			}
+			if(isvalue(p_config.iscB)) {
+				f_cf_monitor_down(p_config.iscB);
+			}
+		}
+	}
+	
+	function f_getInterfaceInfoList(
+		in charstring p_interfaceName, 
+		in integer p_product1, 
+		in integer p_product2
+	) return InterfaceInfoList {
+		var InterfaceInfoList v_list := {
+			f_getInterfaceInfo(p_interfaceName, PX_PRODUCTS[p_product1]),
+			f_getInterfaceInfo(p_interfaceName, PX_PRODUCTS[p_product2])
+		};
+		
+		return v_list;
+	}
+	
+	function f_getInterfaceInfo(in charstring p_interfaceName, Product p_product) return InterfaceInfo {
+		var InterfaceInfo v_info := {
+			IpInterfaceInfo := {
+				{
+					domainName := "invalid",
+					IpAddress := "0.0.0.0",
+					portNumbers := {0}
+				}
+			}
+		};
+		
+		for(var integer i := 0; i < lengthof(p_product.monitorInterfaces); i := i + 1) { // YANN: <= instead of <
+			if(p_product.monitorInterfaces[i].interfaceName == p_interfaceName)	{
+				return p_product.monitorInterfaces[i].interfaceInfo;
+			}
+		}
+		
+		return v_info;
+	}
+	
+	
+	
+		
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestControl.ttcn3
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestControl.ttcn3	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestControl.ttcn3	(revision 22)
@@ -0,0 +1,29 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides ATS specific test control declarations.
+ */
+module AtsImsIot_TestControl {
+	import from AtsImsIot_TestCases_CALL all;
+	import from AtsImsIot_TestCases_MESS all;
+	import from AtsImsIot_TestCases_REG all;
+	import from AtsImsIot_TestCases_SS all;
+
+	control {
+		// MESS TCs
+		//execute(TC_IMS_MESS_0001());
+
+		// CALL TCs
+		//execute(TC_IMS_CALL_0001());
+		//execute(TC_IMS_CALL_0003()); // OK
+		//execute(TC_IMS_CALL_0007());
+		//execute(TC_IMS_CALL_0017());
+
+		// REG TCs
+		execute(TC_IMS_REG_0002());
+		//execute(TC_IMS_REG_0003());
+
+		// SS TCs
+		//execute(TC_IMS_SS_0006());
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestSystem.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestSystem.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TestSystem.ttcn	(revision 22)
@@ -0,0 +1,74 @@
+module AtsImsIot_TestSystem {
+
+	import from LibSip_SIPTypesAndValues {type Request, Response;}
+
+	import from AtsImsIot_TypesAndValues {type SipMessage;}
+
+	import from LibIot_TestInterface {type EquipmentAccessPort;}
+
+	import from LibIot_TestInterface all;
+
+	/**
+	* @desc 	interfaces to the SUT 
+	*/	
+	type component IotSystemInterface {
+		port DataPort dPort;
+		port EquipmentAccessPort eaPort;
+		port AdapterConfigPort acPort;
+	}
+	
+		/**
+		* @desc
+		*     providing monitoring functionality of involved interfaces. Used as
+		*     PTC.
+		*/
+		type component ImsInterfaceMonitor extends InterfaceMonitor {
+			port DataPort dPort;
+			port ImsCoordinationPort icpPort;
+		}
+    	
+		/**
+		* @desc
+		*     used to coordinate the behavior of other components. It is in charge
+		*     of controlling the overall execution, manangement of testing phases,
+		*     test verdicts collection and synchronization. Used as MTC.
+		*/
+		type component ImsTestCoordinator extends TestCoordinator {
+			port ImsCoordinationPort icpPort;
+		}
+    	
+   	group portDefinitions {
+		
+ 		type port ImsCoordinationPort message {
+ 			inout SipMessage; 
+		}
+		
+		type port DataPort message {
+			in  Request, Response; // SIP
+			// TODO DNS .. or union
+		}
+
+	}
+	
+	type record CF_INT_CALL {
+		ImsInterfaceMonitor gmA,
+		ImsInterfaceMonitor mw,	
+		ImsInterfaceMonitor gmB optional
+	}
+	
+	type record CF_INT_AS {
+        ImsInterfaceMonitor gmA,
+        ImsInterfaceMonitor mw,	
+        ImsInterfaceMonitor gmB,
+		ImsInterfaceMonitor iscA optional,
+		ImsInterfaceMonitor iscB optional        
+	}
+	
+	type record CF_ROAM_AS {
+		ImsInterfaceMonitor gmA,
+		ImsInterfaceMonitor mw,	
+		ImsInterfaceMonitor gmB,
+		ImsInterfaceMonitor iscA optional,
+		ImsInterfaceMonitor iscB optional        
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TypesAndValues.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TypesAndValues.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/AtsImsIot/AtsImsIot_TypesAndValues.ttcn	(revision 22)
@@ -0,0 +1,33 @@
+/*
+ *	@author 	STF 370
+ *  @version    $Id: $
+ *	@desc		This module provides the templates for Interoperability tests.
+ */
+
+module AtsImsIot_TypesAndValues {
+
+	import from LibSip_SIPTypesAndValues {type Request, Response;}
+
+	group SIPmessageTypes {
+		/**
+		* @desc SIP Message Type
+		* @member request SIP request
+		* @member response SIP response
+		*/
+		type union SipMessage {
+			Request request,
+			Response response	
+		}
+		
+		/**
+		* @desc SIP Message List Type
+		*/
+		type record of SipMessage SipMessageList;
+		
+		type record SkipType {
+			integer skipCount,
+			SipMessage skipMessage optional
+		} 
+	}
+
+}//end module
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIms_ConfigAndTrigger/LibIms_UpperTester.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIms_ConfigAndTrigger/LibIms_UpperTester.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIms_ConfigAndTrigger/LibIms_UpperTester.ttcn	(revision 22)
@@ -0,0 +1,516 @@
+/**
+ *	@author 	STF 370
+ *  @version    $Id:$
+ *	@desc		This module provides trigger and configuration functions for IMS.
+ */
+module LibIms_UpperTester {
+	
+
+	import from LibIot_Functions {function f_sendEquipmentCmd;}
+
+	import from LibUpperTester {
+		template m_EQ_Request;
+		type EquipmentCommand;
+	}
+
+	import from LibIot_TestInterface {type TestCoordinator, EquipmentUser;}
+ 	
+	group ue {
+		group ueTypes {
+			group ueCommands {
+				
+				/**
+				 * @desc Command to trigger registration of the UE
+				 * @remark
+				 *     Note that the registration trigger command needs has
+				 *     additional parameter for the public, private user id and
+				 *     password.
+				 * @remark
+				 *     Note that the user friendly application and the upper test 
+				 *     adapter may need to be uparaded if new messages are added.
+				 */
+				const EquipmentCommand c_UE_REGISTRATION := "UE_REGISTRATION";
+				const EquipmentCommand c_UE_CHECKisREGISTERED := "UE_CHECK_IS_REGISTER";
+				const EquipmentCommand c_UE_CHECKisnotREGISTERED := "UE_CHECK_IS_NOT_REGISTERED";
+				const EquipmentCommand c_UE_CHECK_CALLisINITIALIZED := "UE_CHECK_CALL_IS_INITIALIZED";
+				const EquipmentCommand c_UE_CHECK_CALLisANSWERED := "UE_CHECK_CALL_IS_ANSWERED";
+				const EquipmentCommand c_UE_CHECK_CALLisENDED := "UE_CHECK_CALL_IS_ENDED";
+				const EquipmentCommand c_UE_CHECK_NEWMEDIASTREAMisADDED := "UE_CHECK_NEW_MEDIA_STREAM_IS_ADDED";
+				const EquipmentCommand c_UE_CHECK_REMOVEMEDIASTREAMisADDED := "UE_CHECK_NEW_MEDIA_STREAM_IS_REMOVED";
+				
+				
+				/**
+				 * 
+				 * @desc Command to trigger de-registration of the UE
+				 */
+				const EquipmentCommand c_UE_DEREGISTRATION := "UE_DEREGISTRATION";
+				
+				/**
+				 * @desc Command to trigger UE to send a message
+				 */
+				const EquipmentCommand c_UE_SEND_MESSAGE := "UE_SEND_MESSAGE";	
+				
+								/**
+				 * @desc Command to check if UE has receipt of a message
+				 */
+				const EquipmentCommand c_UE_CHECK_MESSAGE_RECEIPT := "UE_CHECK_MESSAGE_RECEIPT";
+				
+				
+				/**
+				 * @desc Command to check if UE is informed about that the message request could not be delivered.
+				 */
+				const EquipmentCommand c_UE_CHECK_MESSAGE_NOT_DELIVERED := "UE_CHECK_MESSAGE_NOT_DELIVERED";		
+			}
+		}
+		
+		group ueFunctions {
+			
+			
+			/**
+			 * 
+			 * @desc Triggers registration of a given user via UE
+			 * @param p_publicId The public user identity 
+			 * @param p_privateId The private user identity
+			 * @param p_pw The users password
+			 * @verdict e2e verdict will be set depending on the result of trigger action
+			 */
+			function f_userRegistration(in charstring p_publicId, in charstring p_privateId, in charstring p_pw) 
+			runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_REGISTRATION, {p_publicId, p_privateId, p_pw})));
+			}
+
+			function f_checkUserIsRegistered() 
+			runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_CHECKisREGISTERED, {})));
+			}
+			function f_checkUserIsNotRegistered() 
+			runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_CHECKisnotREGISTERED, {})));
+			}
+			function f_checkUserCallIsInitiated() 
+			runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_CHECK_CALLisINITIALIZED, {})));
+			}
+   			function f_checkUserCallIsAnswered() 
+			runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_CHECK_CALLisANSWERED, {})));
+			}
+			function f_checkUserCallIsEnded() 
+            runs on EquipmentUser {
+            	f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_CHECK_CALLisENDED, {})));
+            }
+			function f_checkUserAddNewMediaStream() 
+			runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_CHECK_NEWMEDIASTREAMisADDED, {})));
+			}
+			function f_checkUserRemoveNewMediaStream() 
+			runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_CHECK_REMOVEMEDIASTREAMisADDED, {})));
+			}
+			/**
+			 * 
+			 * @desc Triggers de-registration of a given user via UE
+			 * @param p_publicId The public user name
+			 * @verdict e2e verdict will be set depending on the result of trigger action
+			 */
+			function f_userDeregistration(in charstring p_publicId) 
+			runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_DEREGISTRATION, {p_publicId})));
+			}
+			
+			/**
+			 * 
+			 * @desc Trigger sending an instant message via UE
+			 */
+			function f_userSendMessage(in charstring p_body) 
+			runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_SEND_MESSAGE, {p_body})));
+			}
+			
+			/**
+			 * 
+			 * @desc Trigger checking the receipt of instant message at UE
+			 */
+			function f_userCheckMessageReceipt() runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_CHECK_MESSAGE_RECEIPT, {})));
+			}
+				
+			/**
+			 * 
+			 * @desc Trigger checking the receipt of instant message at UE
+			 */
+			function f_userCheckMessageNotDelivered() runs on EquipmentUser {
+				f_sendEquipmentCmd(valueof(m_EQ_Request(c_UE_CHECK_MESSAGE_NOT_DELIVERED,  {})));
+			}
+ 		}
+	}
+	
+	group LibUEModuleParameters {
+ 	
+		/**
+		* 
+		* @desc Required information for user components
+		* @member publicId  public user identity
+		* @member privateId private user identity 
+		* @member password user password
+		* @member domain Home domain of user
+		* @member domainProxy Entry point to either home or roaming IMS network
+		*/
+		type record ImsUserInfo {
+			charstring publicId, // (default) id to be used by UE
+			charstring privateId,
+			charstring password,
+			charstring domain,
+			charstring domainProxy
+		}
+		
+		type union ImsUserIdentity {
+			ImsUserInfo genUserId,
+			ImsUserInfo sipUserId,
+			ImsUserInfo telUserId,
+			ImsUserInfo noasUserId,
+			ImsUserInfo holdUserId,
+			ImsUserInfo oipUserId,
+			ImsUserInfo oirUserId,
+			ImsUserInfo acrUserId,
+			ImsUserInfo cfuUserId,
+			ImsUserInfo presUserId,
+			ImsUserInfo iptvUserId
+		}
+	
+		/**
+		* 
+		* @desc List of IMS user information 
+		*/
+		type record of ImsUserIdentity ImsUserIdentityList ;
+ 
+		/**
+		* 
+		* @desc The record collects IMS user information configured in one specific core IMS 
+		* @member productIndex index pointing to the entry of the core IMS product in PX_PRODUCTS
+		* @member userInfos Lists information about all users configured in the HSS of this core IMS
+		*/
+		type record CoreImsUserInfo {
+			integer       productIndex,
+			ImsUserIdentityList  userIds
+		}
+	
+		/**
+		* 
+		* @desc Collects  IMS user information configured in all core IMS participating in the interoperability event
+		*/
+		type record of CoreImsUserInfo CoreImsUserInfoList;
+	
+	
+		/**
+			* 
+			* @desc Example of module parameter based entry of EUT interface information for all products particpating in an interoperability event
+			*/
+		modulepar CoreImsUserInfoList PX_IMS_USER_DATA := {
+			{
+				productIndex := 0, // Ericsson
+				userIds := {
+					{
+				      genUserId := {
+						publicId := "userGEN",
+						privateId := "userGEN_priv",
+						password := "123456",
+						domain := "ericsson.etsi",
+						domainProxy := "pcscf.ericsson.etsi" //pcscf domain or IPaddress
+
+					}},
+					{
+					  sipUserId := {
+						publicId := "userSIP",
+						privateId := "userSIP_priv",
+						password := "123456",
+						domain := "ericsson.etsi",
+						domainProxy := "pcscf.ericsson.etsi" //pcscf domain or IPaddress
+
+					}},
+					{
+					  telUserId := {
+						publicId := "tel: 3344123432",
+						privateId := "userTEL_priv",
+						password := "123456",
+						domain := "ericsson.etsi",
+						domainProxy := "pcscf.ericsson.etsi" //pcscf domain or IPaddress
+					}}
+				}
+			},
+			{
+				productIndex := 1, // Thomson
+				userIds := {
+					{
+					  genUserId := {
+						publicId := "userSIP",
+						privateId := "userSIP_priv",
+						password := "123456",
+						domain := "thomson.etsi",
+						domainProxy := "pcscf.thomson.etsi" //pcscf domain or IPaddress
+
+					}},
+					{
+					  sipUserId := {
+						publicId := "userSIP",
+						privateId := "userSIP_priv",
+						password := "123456",
+						domain := "thomson.etsi",
+						domainProxy := "pcscf.thomson.etsi" //pcscf domain or IPaddress
+					}},
+					{
+					  telUserId := {
+						publicId := "tel: 3344123443",
+						privateId := "userTEL_priv",
+						password := "123456",
+						domain := "thomson.etsi",
+						domainProxy := "pcscf.thomson.etsi" //pcscf domain or IPaddress
+					}}
+				}
+			},
+			{
+				productIndex := 2, // NSN
+				userIds := {
+					{
+					  genUserId := {
+						publicId := "userGEN",
+						privateId := "userGEN_priv",
+						password := "123456",
+						domain := "nsn.etsi",
+						domainProxy := "pcscf.nsn.etsi" //pcscf domain or IPaddress
+
+					}},
+					{
+					  sipUserId := {
+						publicId := "userSIP",
+						privateId := "userSIP_priv",
+						password := "123456",
+						domain := "nsn.etsi",
+						domainProxy := "pcscf.nsn.etsi" //pcscf domain or IPaddress
+					}},
+					{
+					  telUserId := {
+						publicId := "tel: 3344123443",
+						privateId := "userTEL_priv",
+						password := "123456",
+						domain := "nsn.etsi",
+						domainProxy := "pcscf.nsn.etsi" //pcscf domain or IPaddress
+					}}
+				}
+			},
+			{
+				productIndex := 3, // Italtel
+				userIds := {
+					{
+					  genUserId := {
+						publicId := "userGEN",
+						privateId := "userGEN_priv",
+						password := "123456",
+						domain := "italtel.etsi",
+						domainProxy := "pcscf.italtel.etsi" //pcscf domain or IPaddress
+
+					}},
+					{
+					  sipUserId := {
+						publicId := "userSIP",
+						privateId := "userSIP_priv",
+						password := "123456",
+						domain := "italtel.etsi",
+						domainProxy := "pcscf.italtel.etsi" //pcscf domain or IPaddress
+					}},
+					{
+					  telUserId := {
+						publicId := "tel: 3344123443",
+						privateId := "userTEL_priv",
+						password := "123456",
+						domain := "italtel.etsi",
+						domainProxy := "pcscf.italtel.etsi" //pcscf domain or IPaddress
+					}}
+				}
+			},
+			{
+				productIndex := 4, // EXFO
+				userIds := {
+					{
+					  genUserId := {
+						publicId := "userGEN",
+						privateId := "userGEN_priv",
+						password := "123456",
+						domain := "exfo.etsi",
+						domainProxy := "pcscf.exfo.etsi" //pcscf domain or IPaddress
+
+					}},
+					{
+					  sipUserId := {
+						publicId := "userSIP",
+						privateId := "userSIP_priv",
+						password := "123456",
+						domain := "exfo.etsi",
+						domainProxy := "pcscf.exfo.etsi" //pcscf domain or IPaddress
+					}},
+					{
+					  telUserId := {
+						publicId := "tel: 3344123443",
+						privateId := "userTEL_priv",
+						password := "123456",
+						domain := "exfo.etsi",
+						domainProxy := "pcscf.exfo.etsi" //pcscf domain or IPaddress
+					}}
+				}
+			},
+			{
+				productIndex := 5, // Iskratel
+				userIds := {
+					{
+					  genUserId := {
+						publicId := "userGEN",
+						privateId := "userGEN_priv",
+						password := "123456",
+						domain := "iskratel.etsi",
+						domainProxy := "pcscf.iskratel.etsi" //pcscf domain or IPaddress
+
+					}},
+					{
+					  sipUserId := {
+						publicId := "userSIP",
+						privateId := "userSIP_priv",
+						password := "123456",
+						domain := "iskratel.etsi",
+						domainProxy := "pcscf.iskratel.etsi" //pcscf domain or IPaddress
+					}},
+					{
+					  telUserId := {
+						publicId := "tel: 3344123443",
+						privateId := "userTEL_priv",
+						password := "123456",
+						domain := "iskratel.etsi",
+						domainProxy := "pcscf.iskratel.etsi" //pcscf domain or IPaddress
+					}}
+				}
+			},
+			{
+				productIndex := 6, // Testing Tech IMS Core
+				userIds := {
+					{
+					  genUserId := {
+						publicId := "userGEN",
+						privateId := "userGEN_priv",
+						password := "123456",
+						domain := "testingtech.com",
+						domainProxy := "pcscf.testingtech.com" //pcscf domain or IPaddress
+
+					}},
+					{
+					  sipUserId := {
+						publicId := "userSIP",
+						privateId := "userSIP_priv",
+						password := "123456",
+						domain := "testingtech.com",
+						domainProxy := "pcscf.testingtech.com" //pcscf domain or IPaddress
+					}},
+					{
+					  telUserId := {
+						publicId := "tel: 3344123443",
+						privateId := "userTEL_priv",
+						password := "123456",
+						domain := "testingtech.com",
+						domainProxy := "pcscf.testingtech.com" //pcscf domain or IPaddress
+					}}
+				}
+			},
+			{
+				productIndex := 7, // Acme
+				userIds := {
+					{
+					  genUserId := {
+						publicId := "userGEN",
+						privateId := "userGEN_priv",
+						password := "123456",
+						domain := "acme.etsi",
+						domainProxy := "pcscf.acme.etsi" //pcscf domain or IPaddress
+
+					}},
+					{
+					  sipUserId := {
+						publicId := "userSIP",
+						privateId := "userSIP_priv",
+						password := "123456",
+						domain := "acme.etsi",
+						domainProxy := "acme" //pcscf domain or IPaddress
+					}},
+					{
+					  telUserId := {
+						publicId := "tel: 3344123443",
+						privateId := "userTEL_priv",
+						password := "123456",
+						domain := "acme.etsi",
+						domainProxy := "pcscf.acme.etsi" //pcscf domain or IPaddress
+					}}
+				}
+			},
+			{
+				productIndex := 8, // Nexcom
+				userIds := {
+					{
+					  genUserId := {
+						publicId := "userGEN",
+						privateId := "userSIP_priv",
+						password := "123456",
+						domain := "nexcom.etsi",
+						domainProxy := "pcscf.nexcom.etsi" //pcscf domain or IPaddress
+
+					}},
+					{
+					  sipUserId := {
+						publicId := "userGEN",
+						privateId := "userSIP_priv",
+						password := "123456",
+						domain := "nexcom.etsi",
+						domainProxy := "pcscf.nexcom.etsi" //pcscf domain or IPaddress
+					}},
+					{
+					  telUserId := {
+						publicId := "tel: 3344123443",
+						privateId := "userTEL_priv",
+						password := "123456",
+						domain := "nexcom.etsi",
+						domainProxy := "pcscf.nexcom.etsi" //pcscf domain or IPaddress
+					}}
+				}
+			},
+			{
+				productIndex := 9, // Hotaro
+				userIds := {
+					{
+					  genUserId := {
+						publicId := "userGEN",
+						privateId := "userGEN_priv",
+						password := "123456",
+						domain := "hotaro.etsi",
+						domainProxy := "pcscf.hotaro.etsi" //pcscf domain or IPaddress
+
+					}},
+					{
+					  sipUserId := {
+						publicId := "userSIP",
+						privateId := "userSIP_priv",
+						password := "123456",
+						domain := "hotaro.etsi",
+						domainProxy := "pcscf.hotaro.etsi" //pcscf domain or IPaddress
+					}},
+					{
+					  telUserId := {
+						publicId := "tel: 3344123443",
+						privateId := "userTEL_priv",
+						password := "123456",
+						domain := "hotaro.etsi",
+						domainProxy := "pcscf.hotaro.etsi" //pcscf domain or IPaddress
+					}}
+				}
+			}
+		}// end modulepar
+	} // end group
+	
+	group eut {
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_Functions.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_Functions.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_Functions.ttcn	(revision 22)
@@ -0,0 +1,231 @@
+/*
+ *	@author 	STF 370
+ *  @version    $Id: LibIot_Functions.ttcn 16 2009-06-16 15:06:42Z pintar $
+ *	@desc		This module provides the functions used by the test component 
+ */
+
+module LibIot_Functions {
+	import from LibCommon_VerdictControl {type FncRetCode;}
+
+	import from LibUpperTester {
+		template mw_EO_Response;
+		type EquipmentOperationReq, EquipmentOperationRsp;
+	}
+
+	import from LibIot_TypesAndValues {
+		type IotVerdict, IotVerdictType, Status, VerdictType;
+	}
+
+	import from LibIot_PIXITS {
+		modulepar PX_EUT_TRIGGER_RESPONSE, PX_TTCN3_VERDICT;
+	}
+
+	import from LibIot_TestInterface {
+		type IotEquipmentUser, OracleClient, OracleServer, TestCoordinator, EquipmentUser;
+	}
+	
+	
+	group oracleFunctions {
+    
+    	/**
+    	 * @desc Sets the conformance verdict on the oracle client and sends it to the oracle server
+    	 * @param p_verdict conformance verdict set by the monitor
+    	 * @param p_reason reason why the verdict has been set
+    	 */
+    	function f_setConformanceVerdict(in verdicttype p_verdict,
+    									 in charstring p_reason)
+    	runs on OracleClient {
+    		var IotVerdict v_verdict := {conformance := {p_verdict, p_reason}};
+    		log("Conformance verdict set to: ", p_verdict, p_reason);
+    		vPort.send(v_verdict);
+    	}
+    
+    	/**
+    	* @desc Sets the end-to-end verdict on the oracle client and sends it to the oracle server
+    	* @param p_verdict e2e verdict set by the monitor
+    	* @param p_reason reason why the verdict has been set
+    	*/
+    	function f_setE2EVerdict(in verdicttype p_verdict, in charstring p_reason)
+    	runs on OracleClient {
+    		var IotVerdict v_verdict := {e2e := {p_verdict, p_reason}};
+    		log("E2E verdict set to: ", p_verdict, p_reason);
+    		vPort.send(v_verdict);
+    	}
+    
+    	/**
+    	 * @desc Gets the conformance verdict on the oracle client
+    	 * @return conformance verdict of oracle server
+    	 */
+    	function f_getConformanceVerdict()
+    	runs on OracleServer
+		return verdicttype {
+    		return vc_conf_verdict.verdict;
+    	}
+    
+    	/**
+    	 * @desc Gets the end-to-end verdict on the oracle client
+    	 * @return end-to-end verdict of oracle server
+    	 */
+    	function f_getE2EVerdict()
+    	runs on OracleServer
+		return verdicttype {
+    		return vc_e3e_verdict.verdict;
+    	}
+    
+    	/**
+    	* @desc Computes and logs overall verdict for end-to-end and conformance separately on oracle server
+    	* @param p_verdict the verdict received
+    	*/
+    	function f_setIotVerdict(in IotVerdict p_verdict) runs on OracleServer {
+    		f_logIotVerdict(p_verdict);
+    		if (ischosen(p_verdict.e2e) and PX_TTCN3_VERDICT == e_e2e) {
+    			setverdict(p_verdict.e2e.verdict, p_verdict.e2e.reason);
+    		} else if (ischosen(p_verdict.conformance) and PX_TTCN3_VERDICT == e_conformance) {
+    			setverdict(p_verdict.conformance.verdict, p_verdict.conformance.reason);
+    		}
+    	}
+
+		/**
+		* @desc Set verdict PASS on main component (to be used, e.g on TestCoordinator)
+		*/
+		function f_setIotVerdictPASS(in charstring p_reason) runs on OracleServer {
+            var IotVerdict p_verdict := {
+            	conformance := {verdict := pass, reason := p_reason}
+            };
+            f_setIotVerdict(p_verdict);
+		}
+    	/**
+    	* @desc Set verdict PASS on main component (to be used, e.g on TestCoordinator)
+    	*/
+    	function f_setIotVerdictFAIL(in charstring p_reason) runs on OracleServer {
+			var IotVerdict p_verdict := {
+				conformance := {verdict := fail, reason := p_reason}
+			};
+			f_setIotVerdict(p_verdict);
+    	}
+
+    	    	
+    	/**
+    	 * 
+    	 * @desc logs the received IOT verdict
+    	 * @param p_verdict The verdict to set
+    	 */
+    	function f_logIotVerdict(in IotVerdict p_verdict) runs on OracleServer {
+    		if (ischosen(p_verdict.e2e)) {
+    			vc_e3e_verdict := f_getWorseVerdict(vc_e3e_verdict, p_verdict.e2e);
+    			log("E2E verdict set to: ", p_verdict.e2e.verdict, "Reason: " & p_verdict.e2e.reason);
+    		} else  {
+    			vc_conf_verdict := f_getWorseVerdict(vc_conf_verdict, p_verdict.conformance);
+    			log("Conformance verdict set to: ", p_verdict.conformance.verdict, "Reason: " & p_verdict.conformance.reason);
+    		}
+    	}
+    	
+    	/**
+    	 * 
+    	 * @desc returns the worse verdict 
+    	 * @param p_org the original verdict 
+    	 * @param p_new the new verdict
+    	 * @return the worse verdict
+    	 */
+    	function f_getWorseVerdict(in VerdictType p_org, in VerdictType p_new) return VerdictType {
+    		if(p_org.verdict == pass) {
+    			
+    			if(p_new.verdict != pass) {
+    				return p_new;
+    			}
+    			else {
+    				return p_org;
+    			}
+    		}
+    		else if (p_org.verdict == inconc) {
+    			
+    			if(p_new.verdict != pass) {
+    				return p_new;
+    			}
+    			else {
+    				return p_org;
+    			}
+    		}
+    		else if (p_org.verdict == fail) {
+    			if(p_new.verdict == pass) {
+    				return p_org;
+    			}
+    			else if(p_new.verdict == inconc) {
+    				return p_org;
+    			}
+    			else {
+    				return p_new;
+    			}
+    		}
+    		else if (p_org.verdict == error) {
+    			return p_org;
+    		}
+    		
+    		return p_org;
+    	}
+    
+    	/**
+    	* @desc Altstep to be used for listening continously on the verdict port of the oracle server for receiving verdicts from oracle clients
+    	*/
+    	altstep a_receiveIOTVerdict() runs on OracleServer {
+    		var IotVerdict v_verdict;
+    		[] vPort.receive(IotVerdict:?) -> value v_verdict {
+    			f_setIotVerdict(v_verdict);
+    			repeat;
+    		}
+    	}
+	}
+	
+	group equipmentOperationFunctions { // TODO Update!
+		function f_sendEquipmentCmd(in EquipmentOperationReq p_req) runs on EquipmentUser {
+			var EquipmentOperationRsp v_response;
+			var charstring v_reason := "";
+			
+			T_Equipment.start(PX_EUT_TRIGGER_RESPONSE);
+			eaPort.send(p_req);
+			
+			alt{
+				[] eaPort.receive(mw_EO_Response(e_success)) -> value v_response {
+					T_Equipment.stop;
+					if(ispresent(v_response.status.reason)) {
+						v_reason := v_response.status.reason;
+						f_setE2EVerdict(pass, "Equipment command """ & p_req.cmd & """successful: " & v_reason);
+					}else {
+						f_setE2EVerdict(pass, "Equipment command successful");
+					}
+				}
+				[] eaPort.receive(mw_EO_Response(?)) -> value  v_response {
+					T_Equipment.stop;
+					if(ispresent(v_response.status.reason)) {
+						v_reason := v_response.status.reason;
+						f_setE2EVerdict(fail, "Equipment command """ & p_req.cmd & """unsuccessful: " & v_reason);
+					}else {
+						f_setE2EVerdict(fail, "Equipment command unsuccessful: no reason given");
+					}
+				}
+				[] T_Equipment.timeout {
+					f_setE2EVerdict(inconc, "Timer expired while waiting for reponse of Trigger command """ & p_req.cmd & """");
+				}
+			}
+		}
+	}
+	
+	group miscFunctions {
+    	/**
+    	* @desc 	searches the array for a given name and returns 
+    	* 			the corresponding index
+    	* @param 	p_idx index of the port
+    	* @return 	the index
+    	*/
+    	function f_getMonitorIdx(in charstring p_name)
+    	runs on TestCoordinator return integer {
+    		var integer v_size := sizeof(vc_compIds);
+    		for (var integer i := 0; i < v_size; i := i + 1) {
+    			if (vc_compIds[i].name == p_name) {
+    				return vc_compIds[i].index;
+    			}
+    		}
+    		return - 1;
+    	}
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_PIXITS.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_PIXITS.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_PIXITS.ttcn	(revision 22)
@@ -0,0 +1,1040 @@
+/*
+ *	@author		STF	370
+ *	@version		$Id: LibIot_PIXITS.ttcn	277	2009-06-16 15:06:42Z pintar	$
+ *	@desc		This module	provides PIXIT parameters	which	need to	be 
+ *				changeable within	validation
+ */
+
+module LibIot_PIXITS	 {
+ 
+	import from	LibIot_TypesAndValues	
+	{
+		type IOTExecMode,	IotVerdictType,	CaptureMode, RecordMode, FileList, TimeOffset, EutInterfaceInfoList,
+		ProtocolFilter,	IpAddress, PortNumber, ProductList, InterfaceAvailableList;
+	}
+
+	/**
+		*	@desc	PIXIT	defines	which	verdict	 (E2E	or conformance)is	to be	kept track of	with the TTCN-3	verdict.
+		*				Note that	the	verdict	not	chosen will	be only	available	in log statements.
+		*/
+	modulepar	IotVerdictType PX_TTCN3_VERDICT	:= e_conformance;
+	
+	/**
+	*	
+	*	@desc	Maximum	time limit used	by monitor component for waiting for expected	incoming messages
+	*/
+	modulepar	float	PX_MAX_MSG_WAIT	:= 10.0;
+
+	/**
+	 * 
+	 * @desc Example of	module parameter based entry of	EUT	interface	information	for	all	products particpating	in an	interoperability event
+	 */
+	modulepar	ProductList	PX_PRODUCTS	:= {
+		{
+			// productIndex = 0
+			productName := "Ericsson",
+			monitorInterfaces	:= {
+				{
+					interfaceName	:= "Gm",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.ericsson.etsi",
+								IpAddress	:= "192.86.1.97",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.2",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.3",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.37",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.38",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.66",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.67",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.98",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.99",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Ic",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.ericsson.etsi",
+								IpAddress	:= "192.86.1.97",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	"icscf.ericsson.etsi",
+								IpAddress	:= "192.86.1.98",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	"scscf.ericsson.etsi",
+								IpAddress	:= "192.86.1.99",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Isc",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"telephonyas.ericsson.etsi",
+								IpAddress	:= "192.86.1.109",
+								portNumbers	:= {}
+							},
+							{
+								domainName :=	"presenceas.ericsson.etsi",
+								IpAddress	:= "192.86.1.106",
+								portNumbers	:= {}
+							},
+							{
+								domainName :=	"mtasout.ericsson.etsi",
+								IpAddress	:= "0.0.0.0",
+								portNumbers	:= {}
+							},
+							{
+								domainName :=	"scscf.ericsson.etsi",
+								IpAddress	:= "192.86.1.99",
+								portNumbers	:= {5060}
+							}
+							
+						}
+					}
+				}
+			}
+		},				
+		{
+			// productIndex = 1
+			productName := "Thomson",
+			monitorInterfaces	:= {
+				{
+					interfaceName	:= "Gm",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.thomson.etsi",
+								IpAddress	:= "10.10.2.10",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.8",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.9",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.41",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.42",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.70",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.71",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.106",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.107",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Ic",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.thomson.etsi",
+								IpAddress	:= "10.10.2.10",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	"icscf.thomson.etsi",
+								IpAddress	:= "10.10.2.10",
+								portNumbers	:= {5180,5185}
+							},
+							{
+								domainName :=	"scscf.thomson.etsi",
+								IpAddress	:= "10.10.2.10",
+								portNumbers	:= {5185,5187,5188,5189}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Isc",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.thomson.etsi",
+								IpAddress	:= "10.10.2.10",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	"telephonyas.thomson.net",
+								IpAddress	:= "10.10.2.20",
+								portNumbers	:= {5076}
+							}
+						}
+					}
+				}
+			}
+		},	
+		{
+			// productIndex = 2
+			productName := "NSN",
+			monitorInterfaces	:= {
+				{
+					interfaceName	:= "Gm",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf-gm.nsn.etsi",
+								IpAddress	:= "10.10.1.99",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.16",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.17",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.39",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.40",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.68",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.69",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.100",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.101",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Ic",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf-mw.nsn.etsi",
+								IpAddress	:= "10.10.1.67",
+								portNumbers	:= {5070}
+							},
+							{
+								domainName :=	"icscf.nsn.etsi",
+								IpAddress	:= "10.10.1.67",
+								portNumbers	:= {5080}
+							},
+							{
+								domainName :=	"scscf.nsn.etsi",
+								IpAddress	:= "10.10.1.67",
+								portNumbers	:= {5090}
+							},
+							{
+								domainName :=	"pcscf-mw.nsn.etsi",
+								IpAddress	:= "10.10.1.67",
+								portNumbers	:= {5070}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Isc",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"as.nsn.etsi",
+								IpAddress	:= "0.0.0.0",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				}
+			}
+		},	
+		{
+			// productIndex = 3
+			productName := "Italtel",
+			monitorInterfaces	:= {
+				{
+					interfaceName	:= "Gm",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.italtel.net",
+								IpAddress	:= "172.31.14.6",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Ic",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"icscf.italtel.net",
+								IpAddress	:= "172.31.14.2",
+								portNumbers	:= {5160}
+							},
+							{
+								domainName :=	"scscf.italtel.net",
+								IpAddress	:= "172.31.14.10",
+								portNumbers	:= {5160}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Isc",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"as.italtel.net",
+								IpAddress	:= "172.31.14.6",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				}
+			}
+		},		
+		{
+			// productIndex = 4
+			productName := "EXFO",
+			monitorInterfaces	:= {
+				{
+					interfaceName	:= "Gm",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.exfo.net",
+								IpAddress	:= "172.31.15.3",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Ic",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"icscf.exfo.net",
+								IpAddress	:= "172.31.15.2",
+								portNumbers	:= {5160}
+							},
+							{
+								domainName :=	"scscf.exfo",
+								IpAddress	:= "172.31.15.4",
+								portNumbers	:= {5160}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Isc",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"as.exfo.net",
+								IpAddress	:= "172.31.15.6",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				}
+			}
+		},		
+		{
+			// productIndex = 5
+			productName := "Iskratel",
+			monitorInterfaces	:= {
+				{
+					interfaceName	:= "Gm",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"ptech.iskratel.etsi",
+								IpAddress	:= "10.10.14.14",
+								portNumbers	:= {5070}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.6",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.7",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.35",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.36",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.74",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.75",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.104",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.105",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Ic",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"ptech.iskratel.etsi",
+								IpAddress	:= "10.10.14.14",
+								portNumbers	:= {5070}
+							},
+							{
+								domainName :=	"itech.iskratel.etsi",
+								IpAddress	:= "10.10.14.10",
+								portNumbers	:= {5080}
+							},
+							{
+								domainName :=	"stech.iskratel.etsi",
+								IpAddress	:= "10.10.14.18",
+								portNumbers	:= {5090}
+							},
+							{
+								domainName :=	"stech.iskratel.etsi",
+								IpAddress	:= "10.10.14.6",
+								portNumbers	:= {5090}
+							}							
+						}
+					}
+				},
+				{
+					interfaceName	:= "Isc",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"astech.iskratel.etsi",
+								IpAddress	:= "10.10.14.30",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	"stech.iskratel.etsi",
+								IpAddress	:= "10.10.14.6",
+								portNumbers	:= {5090}
+							}							
+							
+						}
+					}
+				}
+			}
+		},
+		{				
+			// productIndex = 6
+			productName := "Starrent",
+			monitorInterfaces	:= {
+				{
+					interfaceName	:= "Gm",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.starrent.etsi",
+								IpAddress	:= "10.10.15.10",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.10",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.11",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.43",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.44",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.70",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.71",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.108",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.109",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Ic",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.starrent.etsi",
+								IpAddress	:= "10.10.15.10",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	"scscf.starrent.etsi",
+								IpAddress	:= "10.10.15.11",
+								portNumbers	:= {5160}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Isc",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"as.starrent.etsi",
+								IpAddress	:= "0.0.0.0",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				}
+			}
+		},				
+		{
+			// productIndex = 7
+			productName := "Acme Packet",
+			monitorInterfaces	:= {
+				{
+					interfaceName	:= "Gm",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.acme.etsi",
+								IpAddress	:= "10.10.16.40",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.12",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.13",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.47",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.48",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.78",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.79",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.110",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.111",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Ic",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.acme.etsi",
+								IpAddress	:= "10.10.16.40",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Isc",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"as.acme.etsi",
+								IpAddress	:= "0.0.0.0",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				}
+			}
+		},
+		{
+			// productIndex = 8
+			productName := "Nexcom",
+			monitorInterfaces	:= {
+				{
+					interfaceName	:= "Gm",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.nexcom.etsi",
+								IpAddress	:= "10.10.7.18",
+								portNumbers	:= {5080, 5055}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.14",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.15",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.49",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.50",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.80",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.81",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.112",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.113",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Ic",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.nexcom.etsi",
+								IpAddress	:= "10.10.7.18",
+								portNumbers	:= {5080, 5055}
+							},
+							{
+								domainName :=	"icscf.nexcom.etsi",
+								IpAddress	:= "10.10.7.18",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	"scscf.nexcom.etsi",
+								IpAddress	:= "10.10.7.18",
+								portNumbers	:= {5070}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Isc",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"as.nexcom.etsi",
+								IpAddress	:= "0.0.0.0",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				}
+			}
+		},
+		{
+			// productIndex = 9
+			productName := "Hutaro",
+			monitorInterfaces	:= {
+				{
+					interfaceName	:= "Gm",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.hutaro.etsi",
+								IpAddress	:= "10.10.9.26",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.4",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.5",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.45",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.46",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.72",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.73",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.102",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	omit,
+								IpAddress	:= "10.10.20.103",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Ic",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.hutaro.etsi",
+								IpAddress	:= "10.10.9.26",
+								portNumbers	:= {5060}
+							},
+							{
+								domainName :=	"icscf.hutaro.etsi",
+								IpAddress	:= "10.10.9.10",
+								portNumbers	:= {5080}
+							},
+							{
+								domainName :=	"scscf.hutaro.etsi",
+								IpAddress	:= "127.0.0.1",
+								portNumbers	:= {5090}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Isc",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"as.hutaro.etsi",
+								IpAddress	:= "0.0.0.0",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				}
+			}
+		},
+		{
+			// productIndex = 10
+			productName := "Testing Tech IMS Core",
+			monitorInterfaces	:= {
+				{
+					interfaceName	:= "Gm",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"pcscf.testingtech.com",
+								IpAddress	:= "127.0.0.1",
+								portNumbers	:= {5060,	5061}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Ic",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"icscf.testingtech.com",
+								IpAddress	:= "127.0.0.1",
+								portNumbers	:= {5080}
+							},
+							{
+								domainName :=	"scscf.testingtech.com",
+								IpAddress	:= "127.0.0.1",
+								portNumbers	:= {5090}
+							}
+						}
+					}
+				},
+				{
+					interfaceName	:= "Isc",
+					interfaceInfo	:= {
+						IpInterfaceInfo	:= {
+							{
+								domainName :=	"as.testingtech.com",
+								IpAddress	:= "127.0.0.1",
+								portNumbers	:= {5060}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	
+	/**
+	 * 
+	 * @desc Selects product based on	index	in PX_PRODCUTS vendor	list for EUT_A
+	 * 
+	 */
+	modulepar	integer	PX_EUT_A := 6;
+	
+	/**
+	 * 
+	 * @desc Selects product based on	index	in PX_PRODCUTS vendor	list for EUT_B
+	 */
+	modulepar	integer	PX_EUT_B := 8;
+	
+	/**
+	 * 
+	 * @desc Selects product based on	index	in PX_PRODCUTS vendor	list for EUT_B_B2
+	 */
+	modulepar	integer	PX_EUT_B_B2	:= 2;
+	
+	
+	/**
+	* 
+	* @desc Selects if interfaces should be considered in the evaluation 
+	* 		interfaceName needs to be consistent to AtsImsIot_TestConfiguration
+	*/
+	modulepar InterfaceAvailableList PX_AVAILABLE_INTERFACES := {
+		{ interfaceName := "Gm A", available := true },
+		{ interfaceName := "Gm B", available := true },
+		{ interfaceName := "Ic", available := true },
+		{ interfaceName := "Isc A", available := true },
+		{ interfaceName := "Isc B", available := true },
+		{ interfaceName := "User A", available := true },
+		{ interfaceName := "User B", available := true },
+		{ interfaceName := "User A2", available := true },
+		{ interfaceName := "User B2", available := true }		
+	}
+	
+	group	adapterGeneralConfiguration	{
+		/**
+		*	
+		*	@desc	Maximum	time limit used	by trigger component for waiting for EUT response	after	command	has	been sent
+		*/
+		modulepar	float	PX_EUT_TRIGGER_RESPONSE	:= 15.0;
+		
+		/**
+		 * @desc
+		 *		 In	case of	offline	mode,	it defines the path where all sessions's Pcap files are located.
+		 */
+		modulepar	charstring PX_IOT_PCAP_SESSIONS_PATH :=	"c:/Captures/Result/MS2 Wed Afternoon 1"; // Do not forget to upgrade PX_EUT_A and PX_EUT_B
+		
+		/**
+		 * @desc
+		 *		 Defines if	the	record traffic capture mode	must be	activated	or not.
+		 */
+		modulepar	RecordMode PX_IOT_RECORD_MODE	:= e_norecord;
+		
+		/**
+		 * @desc
+		 *		 Defines list	of the files to	merge.
+		 */
+		modulepar	FileList PX_IOT_FILE_MERGE_LIST	:= { "TD_IMS_MESS_0001_19.pcap",	"TD_IMS_MESS_0001_20.pcap"	};
+		
+		/**
+		 * @desc
+		 *		 Defines the location	of the files to	merge.
+		 */
+		modulepar	charstring PX_IOT_FILE_MERGE_PATH	:= ".";
+		
+		/**
+		 * @desc
+		 *		 Defines the location	of the files to	merge.
+		 */
+		modulepar	charstring PX_IOT_MERGE_TOOL_PATH	:= "C:\Program Files\WireShark";
+		
+		/**
+		 * @desc
+		 *		 Defines the time	stamp	offset to	start	playing	record traffic capture file.
+		 */
+		modulepar	TimeOffset PX_IOT_TIMESTAMP_OFFSET :=	
+		{
+			seconds	:= 0,
+			microseconds :=	0
+		};
+		
+		/**
+		 * @desc
+		 *		 List	of the network interfaces	to monitor.
+		 *		 Use ';' to	separate the interfaces
+		 */
+		modulepar	charstring PX_IOT_IFACES :=	"rpcap://\Device\NPF_{9E2D0FCD-C7F5-401D-B736-F0D4F8814715}";
+		
+		modulepar	EutInterfaceInfoList PX_IOT_EUTs_IFACE_INFO_LIST :=	
+		{
+			{
+				eut	:= "User A",
+				ipAddress	:= "127.0.0.1",
+				portNumber :=	6610
+			},
+			{
+				eut	:= "User B",
+				ipAddress	:= "127.0.0.1",
+				portNumber :=	6611
+			}
+		};
+		
+	}	// group adapterGlobalConfiguration
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_TestConfiguration.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_TestConfiguration.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_TestConfiguration.ttcn	(revision 22)
@@ -0,0 +1,50 @@
+/*
+ *	@author 	STF 370
+ *  @version    $Id: LibIot_TestConfiguration.ttcn 16 2009-06-16 15:06:42Z pintar $
+ *	@desc		xxx.
+ */
+
+module LibIot_TestConfiguration {
+	
+	import from LibIot_TestInterface {
+		type
+			InterfaceMonitor,
+			IotEquipmentUser,
+			OracleClient,
+			OracleServer,
+			TestCoordinator;
+	}
+	
+	/**
+	* @desc 	connects the port of the monitor component to the 
+	* 			port of the test oracle and activates the default
+	* @param 	p_monitor	monitor component 	
+	*/
+	function f_cf_oracle_up(in OracleClient p_client) runs on OracleServer {
+		connect(self:vPort, p_client:vPort);
+	}
+	
+	/**
+	* @desc 	deactivates the default and disconnects the port of the monitor
+	* 			component
+	* @param 	p_monitor	monitor component 	
+	*/	
+	function f_cf_oracle_down(in OracleClient p_client) runs on OracleServer {
+		disconnect(self:vPort, p_client:vPort);
+	}
+		
+	/**
+	* @desc 	creates a IOT equipment user component 
+	* @param 	p_name	name of the equipment user component 
+	* @return 			reference to the created equipment user component
+	*/	
+	function f_cf_create_IotEquipmentUser(in charstring p_name) runs on TestCoordinator return IotEquipmentUser {
+      var IotEquipmentUser v_iotEquipmentUser := IotEquipmentUser.create(p_name) alive;
+		  // TODO var IotEquipmentUser v_iotEquipmentUser := IotEquipmentUser.create alive;
+		  /* YANN
+		  	It's really better to use named port for debug and so on
+		  */
+		
+		return v_iotEquipmentUser; 
+	}
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_TestInterface.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_TestInterface.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_TestInterface.ttcn	(revision 22)
@@ -0,0 +1,116 @@
+/*
+ *	@author 	STF 370
+ *  @version    $Id: LibIot_TestInterface.ttcn 16 2009-06-16 15:06:42Z pintar $
+ *	@desc		This module provides the types and components used by the test 
+ *				system component for Interoperability tests.
+ */
+
+module LibIot_TestInterface {
+
+	import from LibUpperTester {
+		type EquipmentOperationReq, EquipmentOperationRsp;
+	}
+
+	import from LibIot_TypesAndValues all;
+
+	import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT;}
+
+	import from LibCommon_Sync all;
+	import from LibSip_SIPTypesAndValues all; 
+	import from AtsImsIot_TypesAndValues all;
+	
+	
+	group abstractTestComponents {
+		/**
+		* @desc
+		*     used to coordinate the behavior of other components. It is in charge
+		*     of controlling the overall execution, manangement of testing phases,
+		*     test verdicts collection and synchronization. Used as MTC.
+		*/
+		type component TestCoordinator extends OracleServer {
+			var ComponentIdList vc_compIds;
+			port AdapterConfigPort acPort;
+		}
+    	
+		/**
+		* @desc
+		*     collecting information to manage E2E and conformance verdicts.
+		*     Can be used as MTC.
+		*/				
+		type component OracleServer extends ServerSyncComp {
+			port VerdictPort vPort;
+			var VerdictType vc_e3e_verdict := {none, "init"};
+			var VerdictType vc_conf_verdict := {none, "init"};
+		}
+		
+		type component OracleClient extends SelfSyncComp {
+			port VerdictPort vPort;
+		}
+    	
+		/**
+		* @desc
+		*     This component type is used to monitor interfaces.
+		*     The library provides on the adapter configuration port.
+		* @remark
+		*     As part of the ATS test system module this component type must be
+		*     extended to include the ATS specific data port!
+		*/
+		type component InterfaceMonitor extends OracleClient {
+			timer tc_wait := PX_MAX_MSG_WAIT;
+			var charstring vc_interfaceName := "Undefined";
+			port AdapterConfigPort acPort;
+		}
+    	
+    	
+    /**
+	 * @desc
+	 *     This component type is used to trigger, stimualte, configure etc any
+	 *     equipment related to the test, i.e., EUTs or other, or the
+	 *     interconnecting network. To be used as PTC.
+	 */
+	type component EquipmentUser extends OracleClient{
+		port EquipmentAccessPort eaPort;
+		timer T_Equipment;
+	}
+    	
+		/**
+		* @desc This component type is used to trigger, stimulate, configure etc 
+		*       any equipment related to the test, i.e., EUTs or other, or 
+		*       the interconnecting network. To be used as PTC.
+		*/
+		type component IotEquipmentUser extends EquipmentUser {
+		}
+		
+//	TODO commented out due to problems with tools not accepting 'extends' from several components
+	/**
+		* @desc This component type is used to trigger, stimulate, configure etc 
+		*       any equipment related to the test, i.e., EUTs or other, or 
+		*       the interconnecting network. To be used as PTC.
+		*/
+//		type component IotEquipmentUser extends EquipmentUser, OracleClient {
+//		}
+		
+	}// end group abstractTestComponents
+	
+	group portDefinitions {
+		
+		type port EquipmentAccessPort message {
+			out EquipmentOperationReq;
+			in EquipmentOperationRsp;
+		}
+		type port VerdictPort message {
+			inout IotVerdict;
+		}
+		
+		type port AdapterConfigPort message {
+			out GeneralConfigurationReq; 
+			out SetFilterReq; 
+			out StartTrafficCaptureReq; 
+			out StopTrafficCaptureReq; 
+			in  GeneralConfigurationRsp;	
+			in  SetFilterRsp;	
+			in  StartTrafficCaptureRsp;	
+			in  StopTrafficCaptureRsp;	
+		}	
+	}// end group portDefinitions
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_TypesAndValues.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_TypesAndValues.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibIot/LibIot_TypesAndValues.ttcn	(revision 22)
@@ -0,0 +1,256 @@
+/*
+ *	@author 	STF 370
+ *  @version    $Id: LibIot_TypesAndValues.ttcn 16 2009-06-16 15:06:42Z pintar $
+ *	@desc		This module provides the (message) types and constants used by the test component 
+ *              for Iot tests. 
+ */
+
+module LibIot_TypesAndValues { 
+	
+	import from LibCommon_BasicTypesAndValues {type UInt32, UInt16;}
+
+	import from LibCommon_VerdictControl {type FncRetCode;}
+
+	group commonTypes {
+	  type enumerated IOTExecMode { e_realtime, e_offline }
+
+		type record Status {
+			FncRetCode code,
+			charstring reason optional
+		}
+		
+	}
+		
+	group interfaceInformationrelatedTypes {
+	  
+	/**
+	 * 
+	 * @desc IP address type e.g. "127.0.0.1" 
+	 */
+	type charstring IpAddress;
+	
+	/**
+	 * 
+	 * @desc Type for port number, e.g. "5060" 
+	 */
+	type UInt16 PortNumber;
+	
+	/**
+	 * 
+	 * @desc List of port numbers 
+	 */
+	type record of PortNumber PortNumberList;
+ 	
+ 	type record InterfaceAvailable {
+ 		charstring interfaceName,
+ 		boolean available	
+ 	}
+ 	
+ 	type set of InterfaceAvailable InterfaceAvailableList;
+ 	
+ 	/**
+ 	 * 
+ 	 * @desc Required information for IP interfaces
+ 	 * @member domainName the domain name
+ 	 * @member IpAddress the ip address
+ 	 * @member portNumbers the list of port numbers where message are received
+ 	 */
+	type record IpInterfaceInfo {
+	   charstring domainName optional,
+	   IpAddress IpAddress,
+	   PortNumberList portNumbers	
+	}
+ 	
+ 	/**
+ 	 * 
+ 	 * @desc List of IP interfacees
+ 	 */
+	type record of IpInterfaceInfo IpInterfaceInfoList;
+ 	
+ 	/**
+ 	 * 
+ 	 * @desc Collection of different interface types, e.g for IP communications 
+ 	 *       This type can be extended with new alternative for other interface types
+ 	 */
+	type union InterfaceInfo {
+	   IpInterfaceInfoList IpInterfaceInfo
+	}
+	
+	/**
+	 * 
+	 * @desc Type for representing EUT interface information for monitored logical interfaces 
+	 * @member interfaceName Name of logical interface
+	 * @member interfaceInfo Interface information specific to this logical interface
+	 */ 
+	type record MonitorInterfaceInfo {
+	   charstring interfaceName,
+	   InterfaceInfo interfaceInfo	
+	}
+	
+	/**
+	 * 
+	 * @desc List of monitored interfaces 
+	 */
+	type record of MonitorInterfaceInfo MonitorInterfaceInfoList;
+ 
+ 	/**
+ 	 * 
+ 	 * @desc Product specific EUT interface information 
+ 	 * @member name the name of the vendor
+ 	 * @member monitorInterfaces monitor interface configuration
+ 	 */
+	type record Product {
+	   charstring productName,
+	   MonitorInterfaceInfoList monitorInterfaces
+	}
+	
+	/**
+	 * 
+	 * @desc List of product specificr EUT interface information
+	 */
+	type record of Product ProductList;
+	}
+	
+
+
+	group adapterConfigurationTypes {
+		
+    type union CaptureMode {
+      LiveCapture liveCpature,
+      OfflineCapture offlineCapture
+    }
+    
+    //
+    type record of charstring PhysicalInterfaceList;
+         
+    type record LiveCapture {
+    	PhysicalInterfaceList physicalInterfaces, // TODO document example syntax
+      RecordMode            recordMode
+    }
+    
+    type enumerated RecordMode {
+      e_norecord,
+      e_record  
+    }
+    
+    type record of charstring FileList;
+
+    type record MergeFileList {
+      FileList    mergeFileList, 
+      charstring  mergeFilePath,   
+      charstring  mergeToolPath   
+    }
+    
+    type record CaptureSource {
+    	charstring sessionsPath, // e.g., the path where session's PCAP files are located like /tmp/19
+    	MergeFileList mergeFileList
+    }
+    
+    type record TimeOffset
+    {
+      UInt32 seconds,
+      UInt32 microseconds
+    }
+    
+    type record OfflineCapture {
+      TimeOffset     offset,
+      CaptureSource  captureSource
+    }
+    
+  /**
+   * 
+   * @desc Required information for EUTs IP interfaces
+   * @member IpAddress the ip address
+   * @member portNumber the list of port number where message are received
+   */
+  type record EutInterfaceInfo {
+     charstring     eut,
+     IpAddress      ipAddress,
+     PortNumber     portNumber
+  }
+  
+ /**
+   * 
+   * @desc List of IP interfaces for EUTs
+   */
+  type record of EutInterfaceInfo EutInterfaceInfoList;
+  
+
+    
+    type record GeneralConfigurationReq {
+      charstring  captureProcessIpAddress,
+      PortNumber  captureProcessPort,
+      CaptureMode captureMode,
+      EutInterfaceInfoList eutInfoList optional
+    }
+    
+    type record GeneralConfigurationRsp
+    {
+      Status status
+    }
+    
+    
+    //type record (2..infinity) of InterfaceInfo InterfaceInfoList;
+    type record of InterfaceInfo InterfaceInfoList;
+    
+    type enumerated ProtocolFilter {
+    	e_sip,
+    	e_dns
+    }
+    
+    type record SetFilterReq {
+      ProtocolFilter    protocol,
+      InterfaceInfoList interfaceInfos
+    }
+
+        
+    type record SetFilterRsp
+    {
+      Status status
+    }
+    
+    
+    type record StartTrafficCaptureReq { }
+    
+    type record StartTrafficCaptureRsp
+    {
+      Status status
+    }
+    
+    
+    type record StopTrafficCaptureReq { }
+  
+    type record StopTrafficCaptureRsp
+    {
+      Status status
+    }
+
+	}
+
+	group oracleRelatedTypes {
+ 	  // used for PIXIT definition
+	  type enumerated IotVerdictType { e_e2e, e_conformance }
+	
+	  // used for verdict handling
+	  type record VerdictType {
+		  verdicttype verdict,
+		 charstring reason optional	
+	  }
+	
+	  type union IotVerdict {
+		  VerdictType e2e,
+		  VerdictType conformance	
+	  }
+	}
+	/**
+     * @desc Default record
+     */
+	type record of default DefaultList;
+   
+	type record ComponentId {
+   		charstring name,
+   		integer index // explain more
+   	}
+   
+   	type set of ComponentId ComponentIdList;
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibUpperTester/LibUpperTester.ttcn
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibUpperTester/LibUpperTester.ttcn	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/ttcn/LibUpperTester/LibUpperTester.ttcn	(revision 22)
@@ -0,0 +1,57 @@
+/*
+ *	@author 	STF 370
+ *  @version    $Id$
+ *	@desc		xxx
+ */
+module LibUpperTester {
+	import from LibCommon_VerdictControl {type FncRetCode;}
+	import from LibIot_TypesAndValues {type Status;}
+
+	// TODO - move to common lib
+	/*type record Status {
+		FncRetCode code, charstring reason optional
+	}*/
+// TODO commented out due to problems with tools not accepting 'extends' from several components
+  /**
+	 * @desc
+	 *     This component type is used to trigger, stimualte, configure etc any
+	 *     equipment related to the test, i.e., EUTs or other, or the
+	 *     interconnecting network. To be used as PTC.
+	 */
+//	type component EquipmentUser {
+//		port EquipmentAccessPort eaPort;
+//		timer T_Equipment;
+//	}
+
+	group equipmentOperationTypes {
+
+		type record of charstring ParameterList;
+
+		type charstring EquipmentCommand;
+
+		type record EquipmentOperationReq {
+			EquipmentCommand cmd, ParameterList params optional 
+		}
+
+		type record EquipmentOperationRsp {
+			Status status
+		}
+	}
+	
+	group equipmentOperationTemplates {
+		
+		template EquipmentOperationReq m_EQ_Request(in EquipmentCommand p_cmd, ParameterList p_params) := {
+			cmd := p_cmd,
+			params := p_params
+		}
+		
+		template EquipmentOperationRsp mw_EO_Response(in template FncRetCode p_code) := {
+			status := {
+				code := p_code,
+				reason := *
+			}
+		}
+	}
+
+	
+}
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/validation/IMS_IOT_validate.bat
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/validation/IMS_IOT_validate.bat	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/validation/IMS_IOT_validate.bat	(revision 22)
@@ -0,0 +1,5 @@
+@echo off
+perl ttcn_validation.pl ..\ttcn ..\..\LibCommon\ttcn ..\..\LibSip\ttcn 
+pause
+
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/validation/README_HOWTO
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/validation/README_HOWTO	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/validation/README_HOWTO	(revision 22)
@@ -0,0 +1,26 @@
+README
+
+I (Anthony) added a script in the validation directory to run several 
+compilers on a set of TTCN-3 files.
+
+This is a perl script that takes one or multiple source directories 
+as parameter and will generate the list of ttcn files contained in these 
+directories and their subdirectories. Then it will detect which tools are 
+installed one the system and try to compile the files with each of them. 
+Three tools are supported so far: Telelogic, MessageMagic and TTworkbench. 
+I could not add the support for OpenTTCN because I don't have access to a 
+license (but the script is easily extendible).
+
+The console display the result of the compilation of each tool (success or 
+not) and filters its output to only display the lines reporting errors or 
+warnings. The full output of each tool is saved in a separate 
+file (output.[toolname].txt).
+
+To make it easier to use, I added a batch file IMS_IOT_validation.bat 
+to run it as well as the perl executables (it know it's not clean in the 
+repository, but well I prefer a one-click solution).
+
+Comments (Thomas):
+It might be required to update the installtion paths of the tool 
+installations in the perl script (ttcn_validation.pl)
+
Index: /trunk/ETSI-Testsuites/ETSI_auto_IOT/validation/ttcn_validation.pl
===================================================================
--- /trunk/ETSI-Testsuites/ETSI_auto_IOT/validation/ttcn_validation.pl	(revision 22)
+++ /trunk/ETSI-Testsuites/ETSI_auto_IOT/validation/ttcn_validation.pl	(revision 22)
@@ -0,0 +1,487 @@
+#!/usr/bin/perl -w
+
+# This perl script takes one or multiple source directories as parameter and
+# will generate the list of ttcn files contained in these directories and their
+# subdirectories. Then it will detect which TTCN-3 tools are installed one the
+# system and try to compile the files with each of them.
+#
+# Three tools are supported so far: Telelogic Tester, MessageMagic and TTworkbench
+#
+# The console display the result of the compilation of each tool (success or
+# not) and filters its output to only display the lines reporting errors or
+# warnings. The full output of each tool is saved in a separate file
+# (output.[toolname].txt).
+
+
+
+# regular expression used to identify which files are TTCN-3 files
+$TTCN_FILENAME_PATTERN = "\\.ttcn?\$";
+
+
+#######################################################################
+# An abstract class representing a TTCN-3 tool
+package TTCN3Tool;
+
+# constructor
+#
+#	name	name of the tool
+sub new
+{
+	my ($class, $name) = @_;
+	return bless {name => $name}, $class;
+}
+
+# report that this tool was detected on this system
+#
+#	dir	directory in which the tool is installed
+#
+# Note:		this function should be called from the constructors of the
+#		derived classes, it should be called at most once
+#
+# Note2:	the directory is then stored in the {dir} attribute
+sub detected
+{
+	my ($self, $dir) = @_;
+	$self->{dir} = ::get_abs_path ($dir);
+
+	printf "Detected %-24s in %s\n", $self->{name}, $dir;
+}
+
+# tell if this tool was detected on the system
+sub is_detected
+{
+	my ($self) = @_;
+	return defined $self->{dir};
+}
+
+# Check if the file given as parameter is executable, then store 
+# this parameter in the {cmd} attribute. This command should be
+# the file to be executed to call the compiler.
+#
+#	cmd	path of the executable
+#
+sub try_cmd
+{
+	my ($self, $cmd) = @_;
+
+	# safety check because we store the name of the command here
+	$self->is_detected &&
+		die "TTCN3Tool::try_cmd must not be called after the tool has been detected";
+
+	$self->{cmd} = ::get_abs_path ($cmd);
+
+	return -X $cmd;
+}
+
+# Generate the name of the output file where the output of the compiler will be
+# stored. This function currently generates: "output.<name>.txt"
+#
+# Note:		the name of the compiler is mangled to avoid having strange
+#		characters in the result
+#
+sub output_file_name
+{
+	$_ = shift->{name};
+
+	s/[^A-Z0-9]/_/ig;
+
+	$_ = "output.$_.txt";
+
+	if (defined $OUTPUT_DIR) {
+		$_ = "$OUTPUT_DIR\\$_";
+	}
+}
+
+# Public interface to execute the compiler
+#
+# This function execute the command generated by the analyse_cmd() function
+# (normally implemented in the derived classes) and store the output into
+# the output file given by the function output_file_name().
+#
+# The output is also duplicated on the console. However, in order to simplify
+# the output, it is filtered so that only the lines reporting errors are
+# displayed on the console.
+#
+# The filter is implemented by the match_error() function. Since this filter is 
+# compiler-dependent, it is normally reimplemented in the derived classes.
+#
+#	@files	list of the TTCN-3 input files
+#	
+#	return	true if the analysis was successful
+#
+sub analyse
+{
+	my $self = shift;
+
+#	print "Executing: ", $self->analyse_cmd(@_), "\n";
+
+	unless (open CMD, $self->analyse_cmd(@_)." 2>&1 |") {
+		print "Error: cannot execute command: ", $self->analyse_cmd(@_), "\n";
+		return undef;
+	}
+	
+	unless (open OUT, '>'.$self->output_file_name) {
+		print "Error: cannot open output file: ", $self->output_file_name, "\n";
+		return undef;
+	}
+	
+	while (<CMD>) {
+		# display only the errors on the console
+		$self->match_error ($_)	&& print "\t$_";
+
+		# write everything into the output file
+		print OUT $_;
+	}
+	
+	return (close OUT) && (close CMD);
+}
+
+# default filter to be used by the analyse() function
+#
+# By default all the lines are displayed on the console.
+#
+sub match_error
+{
+	return 1;
+}
+
+########################################################################
+# A driver class for controlling the TTCN-3 tool IBM Telelogic Tester
+package TTCN3Tool::TelelogicTester;
+@ISA = qw(TTCN3Tool);		
+
+# Constructor
+#
+# This function will detect the latest version of the compiler installed on the
+# system in the default path (c:\program files\telelogic)
+sub new
+{
+	$self = TTCN3Tool::new (shift, "Telelogic Tester");
+	
+	# find the newest telelogic tester version installed on the system
+	my $dir = ::find_newest_version_in_dir ("c:\\program files\\telelogic", "^(TAU_)?Tester_"); #ori
+	#my $dir = ::find_newest_version_in_dir ("c:\\program files\\telelogic\\TAU_4.2sdsfd"); ## needs to be adjusted """
+	
+	if ((defined $dir) && ($self->try_cmd ("$dir\\bin\\t3cg.exe"))) { 
+		$self->detected($dir);
+	}
+	return $self;
+}
+
+# generate the command line to run the compiler
+sub analyse_cmd
+{
+	my $self = shift;
+
+	return "\"$self->{cmd}\" -D -F -a @_";
+}
+
+# match one error line in the compiler output
+sub match_error
+{
+	shift;
+	/: (Error|Warning)/;
+}
+
+
+########################################################################
+# A driver class for controlling the TTCN-3 tool TestingTech TTworkbench
+package TTCN3Tool::TTworkbench;
+@ISA = qw(TTCN3Tool);		
+
+# Constructor
+#
+# This function will detect the compiler installed on the system in the default
+# path (c:\program files\TTworkbenchBasic)
+sub new
+{
+	$self = TTCN3Tool::new (shift, "TTworkbench");
+	
+	foreach my $dir ("c:\\program files\\ttworkbenchbasic118")  #TODO: maybe add other directories to search 
+	{
+		if ($self->try_cmd ("$dir\\TTthree.bat")) {
+			$self->detected ($dir);
+			last;
+		}
+	}
+	return $self;
+}
+
+# generate the command line to run the compiler
+sub analyse_cmd
+{
+	my $self = shift;
+
+	# TTworkbench needs to know the list of sub-directories where our files
+	# are located
+	my %subdirs=();
+	foreach (@_) {
+		if (/^(.*\\)[^\\]+/) {
+			$subdirs{$1} = 1;
+		} else {
+			$subdirs{"."} = 1;
+		}
+	}
+	
+	# TTworkbench needs to know one or more root module id so as to know
+	# what shall be compiled in these subdirectories
+	#
+	# Note: the compiler does not support files whose basename does not
+	# match the module id that they contain -> so we can afford just 
+	# using the basename of our files
+	#
+	# Note2: we do not know which module is the root one, so we give the
+	# full list of modules
+	my @modules=();
+	foreach (@_) {
+		if (/^.*\\([^\\.]+)\.[a-z0-9]+$/i) {
+			push @modules, $1;
+		} else {
+			die "error: cannot extract a module name form the file: $_";
+		}
+	}
+
+	return "\"$self->{cmd}\" --clean --dry-run --continue --use-bigint --rebuild --strict-standard-compliance enforce --verbosity warning "
+			. join (" -P ", "", keys %subdirs)." @modules";
+}
+
+# match one error line in the compiler output
+sub match_error
+{
+	shift;
+	/^(error|warning|failure):/;
+}
+
+########################################################################
+# A driver class for controlling the TTCN-3 tool OpenTTCN Tester
+#
+# warning: this class has not yet been validated
+#
+package TTCN3Tool::OpenTTCNTester;
+@ISA = qw(TTCN3Tool);		
+
+sub new
+{
+	$self = TTCN3Tool::new (shift, "OpenTTCN Tester");
+	
+	foreach my $dir ("c:\\program files\\OpenTTCN\\Tester3")  #TODO: maybe add other directories to search 
+	{
+		if ($self->try_cmd ("$dir\\bin\\importer3.exe")) {
+			$self->detected ($dir);
+			last;
+		}
+	}
+	return $self;
+}
+
+########################################################################
+# A driver class for controlling the TTCN-3 tool Elvior MessageMagic
+package TTCN3Tool::MessageMagic;
+@ISA = qw(TTCN3Tool);		
+
+sub new
+{
+	$self = TTCN3Tool::new (shift, "Message Magic");
+	
+	# find the newest telelogic tester version installed on the system
+	my $dir = ::find_newest_version_in_dir ("c:\\program files\\elvior", "^MessageMagic5");
+
+	if ((defined $dir) && ($self->try_cmd ("$dir\\mmttcncp.exe"))) {
+		$self->detected($dir);
+	}
+	return $self;
+}
+
+# generate the command line to run the compiler
+sub analyse_cmd
+{
+	shift;
+
+	# MessageMagic must be executed from its directory to be able to locate the license
+
+	# transform the file names into absolute file names
+	my $cwd = ::cwd();
+	my @files = ();
+	foreach my $file (@_) {
+		push @files, ::get_abs_path ($file);
+	}
+
+	return "cd \"$_->{dir}\" && mmttcncp.exe -l \"".(join ';', @files).'"';
+}
+
+# match one error line in the compiler output
+sub match_error
+{
+	shift;
+	/\* Script.*: Line [0-9]+: /;
+}
+
+package main;
+
+# List all the files matching a regular expression in a directory and
+# recursively in all its subdirectories
+#
+#	dir	path of the directory to be scanned
+#	pattern	regular expression to be used for selecting the files
+#
+#	return	an array containing the files that match the pattern
+#
+sub get_files_in_dir
+{
+	my ($dir, $pattern) = @_;
+	my @result = ();
+
+	(opendir "DIR$dir", "$dir") or die "cannot access directory $dir";
+	while ($_ = readdir "DIR$dir")
+	{
+		next if /^\.\.?$/;
+		my $file = "$dir\\$_";
+
+		if ((-f $file) && ($file =~ /$pattern/i)) {
+			push @result, $file;
+		} elsif (-d $file) {
+			my @subdir_result = get_files_in_dir ($file, $pattern);
+			push @result, @subdir_result;
+		}
+	}
+	closedir "DIR$dir";
+
+	return @result;
+}
+
+# make a comparison of two version numbers
+#
+# This function compares separately the major an minor version numbers
+sub cmp_version
+{
+	my ($a, $b) = @_;
+
+	my ($a_maj, $a_min, $b_maj, $b_min) = ($a, undef, $b, undef);
+	if ($a =~ /^([0-9a-z]+)[_.-]([0-9a-z].*)$/i) {
+		($a_maj, $a_min) = ($1, $2);
+	}
+	if ($b =~ /^([0-9a-z]+)[_.-]([0-9a-z].*)$/i) {
+		($b_maj, $b_min) = ($1, $2);
+	}
+	my $result = undef;
+	if (($a_maj =~ /^[0-9]/) && ($b_maj =~ /^[0-9]/)) {
+		# numeric comparison
+		# FIXME: this comparison ignores letters appended to the
+		#	 version: eg. 1.2.3a
+		$result = $a_maj <=> $b_maj;
+	} else {
+		# alphabetical comparison
+		$result = $a_maj cmp $b_maj;
+	}
+
+	$result && return $result;
+
+	if (defined $a_min) {
+		return (defined $b_min) ? cmp_version ($a_min, $b_min) : 1;
+	} else {
+		return (defined $b_min) ? -1 : 0;
+	}
+}
+
+# Find the newest versionned subdir in a directory
+#
+# This function will check the names of the subdirectories located in dir and
+# will select the one which has the highest version number in its suffix and that
+# matches the pattern
+#
+#	dir	directory to be scanned
+#	pattern	regular expression to detect the elegible subdirectories
+#
+#	return	the chosen subdirectory in the form "directory\\subdirectory"
+sub find_newest_version_in_dir
+{
+	my ($base_dir, $pattern) = @_;
+
+	(opendir DIR, $base_dir) || return undef;
+
+	my @subdirs = readdir DIR;
+	my $max_version = " ";
+	my $subdir = undef;
+	foreach (@subdirs) {
+		if (	(-d "$base_dir\\$_")
+		    &&	((!defined $pattern) || /$pattern/i) 
+		    &&	/([0-9]+([._][0-9]+)*)$/ 
+		    &&	(cmp_version ($max_version, $1) < 0))
+		{
+			$max_version = $1;
+			$subdir = $_;
+		}
+	}
+	closedir DIR;
+	
+	return (defined $subdir ? "$base_dir\\$subdir" : undef);
+}
+
+# Get the absolute path of the current working directory
+sub cwd
+{
+	(open CWD, "cmd.exe /C cd |") or die "Cannot run the interpreter cmd.exe";
+	$cwd = <CWD>;
+	$cwd =~ /^[A-Z]:/i || die;
+	chomp $cwd;
+	close CWD;
+	return $cwd;
+}
+
+# Get the absolute path a file/directory
+sub get_abs_path
+{
+	my $path = shift;
+
+	return (($path =~ /^[A-Z]:/i) ? "" : cwd()."\\" ) . $path;
+}
+
+
+########################################################################
+### Beginning of the script                                          ###
+
+# output directory for storing the results
+$TTCN3Tool::OUTPUT_DIR = cwd();
+
+# generate the list of TTCN-3 files to be compiled
+if (@ARGV == 1) {
+	# if there is only one directory given, then we chdir into
+	# this directory to have shorter file name
+	# (this is purely cosmetical)
+	$_ = $ARGV[0];
+	chdir $_ or die "Error: cannot chdir into '$_'\n";
+
+	@ttcn_files = get_files_in_dir (".", $TTCN_FILENAME_PATTERN);
+} else {
+	# otherwise we just use the full directory names
+	@ttcn_files = ();
+	foreach (@ARGV) {
+		-d or die "Error: there is no directory '$_'\n";
+		push @ttcn_files, get_files_in_dir ($_, $TTCN_FILENAME_PATTERN);
+	}
+}
+
+@ttcn_files or die "usage: $0 sourcedir1 [sourcedir2 ...]\n";
+
+print "List of TTCN-3 source files: @ttcn_files\n\n";
+
+
+# detect the tools installed on the system
+my @tools = ();
+foreach (
+	new TTCN3Tool::TelelogicTester,
+#	new TTCN3Tool::OpenTTCNTester,		# FIXME: not supported yet (need a license)
+	new TTCN3Tool::MessageMagic,
+	new TTCN3Tool::TTworkbench
+) {
+	$_->is_detected  &&  push @tools, $_;
+}
+
+# execute each compiler
+foreach (@tools)
+{
+	print "\nAnalysing the ATS with $_->{name}...\n";
+	$_->analyse (@ttcn_files);
+}
+
+
