From caee97732083b5f73cf58cc30c1e18fab77dc73b Mon Sep 17 00:00:00 2001
From: VHofman <vincent.hofman@kereval.com>
Date: Thu, 14 Mar 2024 17:17:45 +0100
Subject: [PATCH] Add swiss mCSD validation profiles

---
 ...nization-GetRequest-ValidationProfile.json | 390 ++++++++++++++++++
 ...titioner-GetRequest-ValidationProfile.json | 390 ++++++++++++++++++
 ...onerRole-GetRequest-ValidationProfile.json | 387 +++++++++++++++++
 EHS/CH_mCSD/README.md                         | 107 +++++
 .../CH-mCSD - 010 - valid - with name.txt     |   8 +
 5 files changed, 1282 insertions(+)
 create mode 100644 EHS/CH_mCSD/CH-ITI-90-Organization-GetRequest-ValidationProfile.json
 create mode 100644 EHS/CH_mCSD/CH-ITI-90-Practitioner-GetRequest-ValidationProfile.json
 create mode 100644 EHS/CH_mCSD/CH-ITI-90-PractitionerRole-GetRequest-ValidationProfile.json
 create mode 100644 EHS/CH_mCSD/README.md

diff --git a/EHS/CH_mCSD/CH-ITI-90-Organization-GetRequest-ValidationProfile.json b/EHS/CH_mCSD/CH-ITI-90-Organization-GetRequest-ValidationProfile.json
new file mode 100644
index 0000000..c3e0a95
--- /dev/null
+++ b/EHS/CH_mCSD/CH-ITI-90-Organization-GetRequest-ValidationProfile.json
@@ -0,0 +1,390 @@
+{
+    "profileType": "HTTPREQUEST",
+    "id": "CH_ITI-90_Organization_GET_mCSD_Query",
+    "name": "CH_ITI-90_Organization_HTTP_GET_Request",
+    "description": "Validation Profile for validating a Get mCSD Query.",
+    "context": "EPR",
+    "assertions": [
+      {
+          "selector": "request.method",
+          "id": "GETMethodChecking",
+          "description": "HTTP method shall be GET",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+              {
+                  "type": "FIXEDVALUE",
+                  "fixedValue": "GET"
+              }
+          ]
+      },
+      {
+          "selector": "request.version",
+          "id": "HTTP1VersionChecking",
+          "description": "The HTTP version shall be HTTP/1.1",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "FIXEDVALUE",
+              "fixedValue": "HTTP/1.1"
+            }
+          ]
+        },
+        {
+            "selector": "request.uri.path",
+            "id": "URIRegexChecking",
+            "description": "URI path of the request shall be followed by the mCSD resource",
+            "requirementPriority": "MANDATORY",
+            "checksComposition": "oneOf",
+            "checks": [
+                {
+                    "type": "REGEX",
+                    "regex": "^(\\S)+(Organization|Practitioner|PractitionerRole|Location|HealthcareService|OrganizationAffiliation|Endpoint)$"
+                }
+            ]
+        },
+        {
+          "selector": "request.headers('Host').values",
+          "id": "HostChecking",
+          "description": "Host Shall be a server name; Regex: ^(http[s]?:\\/\\/)?[a-zA-Z0-9.\\-\\/]+(:(\\d)+)?$",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(http[s]?:\\/\\/)?[a-zA-Z0-9.\\-\\/]+(:(\\d)+)?$"
+            }
+          ]
+        },
+        {
+          "selector": "request.headers('Authorization').values",
+          "id": "Authorization_parameter_presence",
+          "description": "The Authorization parameter is mandatory.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "OCCURRENCE",
+              "minOccurrence": 1,
+              "maxOccurrence": 1
+            }
+          ]
+        },
+        {
+          "selector": "request.headers('Authorization').values",
+          "id": "Authorization_parameter_value",
+          "description": "Authorization parameter's value SHALL be Bearer, followed by the token.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^Bearer\\ [-a-zA-Z0-9._~+\\/]+=*$"
+            }
+          ]
+        },{
+          "selector": "request.headers('traceparent').values",
+          "id": "traceparent_parameter_presence",
+          "description": "The traceparent parameter is mandatory in the HTTP header.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "OCCURRENCE",
+              "minOccurrence": 1,
+              "maxOccurrence": 1
+            }
+          ]
+        },
+        {
+          "selector": "request.headers('traceparent').values",
+          "id": "traceparent_parameter_value",
+          "description": "traceparent parameter's value SHALL be as defined in fhir.ch, section tracecontext.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!f{2})([\\da-f]{2})-(?!f{32})([\\daf]{32})-(?!f{16})([\\da-f]{16})-(?!f{2})([\\da-f]{2})$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_id').values",
+          "id": "_id_parameter_presence",
+          "description": "_id parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "(?!.*_id=.*_id=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_id').values",
+          "id": "_id_parameter_value",
+          "description": "_id parameter is a token.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_id').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^\\S+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_lastUpdated')",
+          "id": "_lastUpdated_parameter_presence",
+          "description": "_lastUpdated parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*_lastUpdated=.*_lastUpdated=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_lastUpdated').values",
+          "id": "_lastUpdated_parameter_value",
+          "description": "_lastUpdated parameter is made of a date eventually preceded by a modifier ge or le.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_lastUpdated').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(ge|le)?[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|1d|2[0-8]|3[01])$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_format').values",
+          "id": "_format_parameter_presence",
+          "description": "_format parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "(?!.*_format=.*_format=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_format').values",
+          "id": "_format_parameter_value",
+          "description": "_format parameter's value shall be either json or xml.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_format').values.size() > 0",
+          "checks": [
+            {
+              "type": "CLOSEDLIST",
+              "values": [
+                  "json",
+                  "xml"
+              ]
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_sort').values",
+          "id": "_sort_parameter_presence",
+          "description": "_sort parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*_sort=.*_sort=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_sort').values",
+          "id": "_sort_parameter_value",
+          "description": "_sort parameter's value is made of items composed of word caracters, separated by a comma and eventually prefixed by a dash.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_sort').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "([\\w,]|(-\\w))+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_count').values",
+          "id": "_count parameter can be used only once.",
+          "description": "_count parameter is a decimal.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*_count=.*_count=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_count').values",
+          "id": "_count_parameter_value",
+          "description": "_count parameter is a decimal.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_count').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "\\d+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('active').values",
+          "id": "active_parameter_presence",
+          "description": "active parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*active=.*active=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('active').values",
+          "id": "active_parameter_value",
+          "description": "active parameter is a boolean and accept true or false values.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('active').values.size() > 0",
+          "checks": [
+            {
+              "type": "CLOSEDLIST",
+              "values": [
+                  "true",
+                  "false"
+              ]
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('identifier').values",
+          "id": "identifier_parameter_presence",
+          "description": "identifier parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*identifier=.*identifier=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('identifier').values",
+          "id": "identifier_parameter_value",
+          "description": "identifier parameter is a token.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('identifier').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^\\S+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('name').values",
+          "id": "name_parameter_presence",
+          "description": "name parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*name=.*name=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('name').values",
+          "id": "name_parameter_value",
+          "description": "name parameter is a string.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('name').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^.+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('partof').values",
+          "id": "partof_parameter_presence",
+          "description": "partof parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*partof=.*partof=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('partof').values",
+          "id": "partof_parameter_value",
+          "description": "partof parameter is a token.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('partof').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^\\S+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('identifier').values",
+          "id": "identifier_parameter_presence",
+          "description": "identifier parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*identifier=.*identifier=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('type').values",
+          "id": "type_parameter_value",
+          "description": "type parameter is a token.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('type').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^\\S+$"
+            }
+          ]
+        }
+  ]
+}
\ No newline at end of file
diff --git a/EHS/CH_mCSD/CH-ITI-90-Practitioner-GetRequest-ValidationProfile.json b/EHS/CH_mCSD/CH-ITI-90-Practitioner-GetRequest-ValidationProfile.json
new file mode 100644
index 0000000..27c322c
--- /dev/null
+++ b/EHS/CH_mCSD/CH-ITI-90-Practitioner-GetRequest-ValidationProfile.json
@@ -0,0 +1,390 @@
+{
+    "profileType": "HTTPREQUEST",
+    "id": "CH_ITI-90_Practitioner_GET_mCSD_Query",
+    "name": "CH_ITI-90_Practitioner_HTTP_GET_Request",
+    "description": "Validation Profile for validating a Get mCSD Query.",
+    "context": "EPR",
+    "assertions": [
+      {
+          "selector": "request.method",
+          "id": "GETMethodChecking",
+          "description": "HTTP method shall be GET",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+              {
+                  "type": "FIXEDVALUE",
+                  "fixedValue": "GET"
+              }
+          ]
+      },
+      {
+          "selector": "request.version",
+          "id": "HTTP1VersionChecking",
+          "description": "The HTTP version shall be HTTP/1.1",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "FIXEDVALUE",
+              "fixedValue": "HTTP/1.1"
+            }
+          ]
+        },
+        {
+            "selector": "request.uri.path",
+            "id": "URIRegexChecking",
+            "description": "URI path of the request shall be followed by the mCSD resource",
+            "requirementPriority": "MANDATORY",
+            "checksComposition": "oneOf",
+            "checks": [
+                {
+                    "type": "REGEX",
+                    "regex": "^(\\S)+(Organization|Practitioner|PractitionerRole|Location|HealthcareService|OrganizationAffiliation|Endpoint)$"
+                }
+            ]
+        },
+        {
+          "selector": "request.headers('Host').values",
+          "id": "HostChecking",
+          "description": "Host Shall be a server name; Regex: ^(http[s]?:\\/\\/)?[a-zA-Z0-9.\\-\\/]+(:(\\d)+)?$",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(http[s]?:\\/\\/)?[a-zA-Z0-9.\\-\\/]+(:(\\d)+)?$"
+            }
+          ]
+        },
+        {
+          "selector": "request.headers('Authorization').values",
+          "id": "Authorization_parameter_presence",
+          "description": "The Authorization parameter is mandatory.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "OCCURRENCE",
+              "minOccurrence": 1,
+              "maxOccurrence": 1
+            }
+          ]
+        },
+        {
+          "selector": "request.headers('Authorization').values",
+          "id": "Authorization_parameter_value",
+          "description": "Authorization parameter's value SHALL be Bearer, followed by the token.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^Bearer\\ [-a-zA-Z0-9._~+\\/]+=*$"
+            }
+          ]
+        },{
+          "selector": "request.headers('traceparent').values",
+          "id": "traceparent_parameter_presence",
+          "description": "The traceparent parameter is mandatory in the HTTP header.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "OCCURRENCE",
+              "minOccurrence": 1,
+              "maxOccurrence": 1
+            }
+          ]
+        },
+        {
+          "selector": "request.headers('traceparent').values",
+          "id": "traceparent_parameter_value",
+          "description": "traceparent parameter's value SHALL be as defined in fhir.ch, section tracecontext.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!f{2})([\\da-f]{2})-(?!f{32})([\\daf]{32})-(?!f{16})([\\da-f]{16})-(?!f{2})([\\da-f]{2})$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_id').values",
+          "id": "_id_parameter_presence",
+          "description": "_id parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "(?!.*_id=.*_id=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_id').values",
+          "id": "_id_parameter_value",
+          "description": "_id parameter is a token.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_id').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^\\S+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_lastUpdated')",
+          "id": "_lastUpdated_parameter_presence",
+          "description": "_lastUpdated parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*_lastUpdated=.*_lastUpdated=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_lastUpdated').values",
+          "id": "_lastUpdated_parameter_value",
+          "description": "_lastUpdated parameter is made of a date eventually preceded by a modifier ge or le.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_lastUpdated').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(ge|le)?[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|1d|2[0-8]|3[01])$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_format').values",
+          "id": "_format_parameter_presence",
+          "description": "_format parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "(?!.*_format=.*_format=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_format').values",
+          "id": "_format_parameter_value",
+          "description": "_format parameter's value shall be either json or xml.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_format').values.size() > 0",
+          "checks": [
+            {
+              "type": "CLOSEDLIST",
+              "values": [
+                  "json",
+                  "xml"
+              ]
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_sort').values",
+          "id": "_sort_parameter_presence",
+          "description": "_sort parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*_sort=.*_sort=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_sort').values",
+          "id": "_sort_parameter_value",
+          "description": "_sort parameter's value is made of items composed of word caracters, separated by a comma and eventually prefixed by a dash.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_sort').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "([\\w,]|(-\\w))+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_count').values",
+          "id": "_count parameter can be used only once.",
+          "description": "_count parameter is a decimal.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*_count=.*_count=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_count').values",
+          "id": "_count_parameter_value",
+          "description": "_count parameter is a decimal.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_count').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "\\d+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('active').values",
+          "id": "active_parameter_presence",
+          "description": "active parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*active=.*active=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('active').values",
+          "id": "active_parameter_value",
+          "description": "active parameter is a boolean and accept true or false values.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('active').values.size() > 0",
+          "checks": [
+            {
+              "type": "CLOSEDLIST",
+              "values": [
+                  "true",
+                  "false"
+              ]
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('identifier').values",
+          "id": "identifier_parameter_presence",
+          "description": "identifier parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*identifier=.*identifier=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('identifier').values",
+          "id": "identifier_parameter_value",
+          "description": "identifier parameter is a token.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('identifier').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^\\S+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('name').values",
+          "id": "name_parameter_presence",
+          "description": "name parameter can be used only once, eventually suffixed by a modifier :contains or :exact.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*name(:contains|:exact)?=.*name(:contains|:exact)?=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('name').values",
+          "id": "name_parameter_value",
+          "description": "name parameter is a string.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('name').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^.+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('given').values",
+          "id": "given_parameter_presence",
+          "description": "given parameter can be used only once, eventually suffixed by a modifier :contains or :exact.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*given(:contains|:exact)?=.*given(:contains|:exact)?=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('given').values",
+          "id": "given_parameter_value",
+          "description": "given parameter is a string.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('given').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^.+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('family').values",
+          "id": "family_parameter_presence",
+          "description": "family parameter can be used only once, eventually suffixed by a modifier :contains or :exact.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*family(:contains|:exact)?=.*family(:contains|:exact)?=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('family').values",
+          "id": "family_parameter_value",
+          "description": "family parameter is a string.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('family').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^.+$"
+            }
+          ]
+        }
+  ]
+}
\ No newline at end of file
diff --git a/EHS/CH_mCSD/CH-ITI-90-PractitionerRole-GetRequest-ValidationProfile.json b/EHS/CH_mCSD/CH-ITI-90-PractitionerRole-GetRequest-ValidationProfile.json
new file mode 100644
index 0000000..b86dd86
--- /dev/null
+++ b/EHS/CH_mCSD/CH-ITI-90-PractitionerRole-GetRequest-ValidationProfile.json
@@ -0,0 +1,387 @@
+{
+    "profileType": "HTTPREQUEST",
+    "id": "CH_ITI-90_PractitionerRole_GET_mCSD_Query",
+    "name": "CH_ITI-90_PractitionerRole_HTTP_GET_Request",
+    "description": "Validation Profile for validating a Get mCSD Query.",
+    "context": "EPR",
+    "assertions": [
+      {
+          "selector": "request.method",
+          "id": "GETMethodChecking",
+          "description": "HTTP method shall be GET",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+              {
+                  "type": "FIXEDVALUE",
+                  "fixedValue": "GET"
+              }
+          ]
+      },
+      {
+          "selector": "request.version",
+          "id": "HTTP1VersionChecking",
+          "description": "The HTTP version shall be HTTP/1.1",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "FIXEDVALUE",
+              "fixedValue": "HTTP/1.1"
+            }
+          ]
+        },
+        {
+            "selector": "request.uri.path",
+            "id": "URIRegexChecking",
+            "description": "URI path of the request shall be followed by the mCSD resource",
+            "requirementPriority": "MANDATORY",
+            "checksComposition": "oneOf",
+            "checks": [
+                {
+                    "type": "REGEX",
+                    "regex": "^(\\S)+(Organization|Practitioner|PractitionerRole|Location|HealthcareService|OrganizationAffiliation|Endpoint)$"
+                }
+            ]
+        },
+        {
+          "selector": "request.headers('Host').values",
+          "id": "HostChecking",
+          "description": "Host Shall be a server name; Regex: ^(http[s]?:\\/\\/)?[a-zA-Z0-9.\\-\\/]+(:(\\d)+)?$",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(http[s]?:\\/\\/)?[a-zA-Z0-9.\\-\\/]+(:(\\d)+)?$"
+            }
+          ]
+        },
+        {
+          "selector": "request.headers('Authorization').values",
+          "id": "Authorization_parameter_presence",
+          "description": "The Authorization parameter is mandatory.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "OCCURRENCE",
+              "minOccurrence": 1,
+              "maxOccurrence": 1
+            }
+          ]
+        },
+        {
+          "selector": "request.headers('Authorization').values",
+          "id": "Authorization_parameter_value",
+          "description": "Authorization parameter's value SHALL be Bearer, followed by the token.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^Bearer\\ [-a-zA-Z0-9._~+\\/]+=*$"
+            }
+          ]
+        },{
+          "selector": "request.headers('traceparent').values",
+          "id": "traceparent_parameter_presence",
+          "description": "The traceparent parameter is mandatory in the HTTP header.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "OCCURRENCE",
+              "minOccurrence": 1,
+              "maxOccurrence": 1
+            }
+          ]
+        },
+        {
+          "selector": "request.headers('traceparent').values",
+          "id": "traceparent_parameter_value",
+          "description": "traceparent parameter's value SHALL be as defined in fhir.ch, section tracecontext.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!f{2})([\\da-f]{2})-(?!f{32})([\\daf]{32})-(?!f{16})([\\da-f]{16})-(?!f{2})([\\da-f]{2})$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_id').values",
+          "id": "_id_parameter_presence",
+          "description": "_id parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "(?!.*_id=.*_id=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_id').values",
+          "id": "_id_parameter_value",
+          "description": "_id parameter is a token.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_id').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^\\S+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_lastUpdated')",
+          "id": "_lastUpdated_parameter_presence",
+          "description": "_lastUpdated parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*_lastUpdated=.*_lastUpdated=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_lastUpdated').values",
+          "id": "_lastUpdated_parameter_value",
+          "description": "_lastUpdated parameter is made of a date eventually preceded by a modifier ge or le.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_lastUpdated').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(ge|le)?[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|1d|2[0-8]|3[01])$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_format').values",
+          "id": "_format_parameter_presence",
+          "description": "_format parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "(?!.*_format=.*_format=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_format').values",
+          "id": "_format_parameter_value",
+          "description": "_format parameter's value shall be either json or xml.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_format').values.size() > 0",
+          "checks": [
+            {
+              "type": "CLOSEDLIST",
+              "values": [
+                  "json",
+                  "xml"
+              ]
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_sort').values",
+          "id": "_sort_parameter_presence",
+          "description": "_sort parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*_sort=.*_sort=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_sort').values",
+          "id": "_sort_parameter_value",
+          "description": "_sort parameter's value is made of items composed of word caracters, separated by a comma and eventually prefixed by a dash.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_sort').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "([\\w,]|(-\\w))+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_count').values",
+          "id": "_count parameter can be used only once.",
+          "description": "_count parameter is a decimal.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*_count=.*_count=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('_count').values",
+          "id": "_count_parameter_value",
+          "description": "_count parameter is a decimal.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('_count').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "\\d+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('organization').values",
+          "id": "organization_parameter_presence",
+          "description": "organization parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*organization=.*organization=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('organization').values",
+          "id": "organization_parameter_value",
+          "description": "organization parameter is a boolean and accept true or false values.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('organization').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^\\S+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('practitioner').values",
+          "id": "practitioner_parameter_presence",
+          "description": "practitioner parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*practitioner=.*practitioner=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('practitioner').values",
+          "id": "practitioner_parameter_value",
+          "description": "practitioner parameter is a token.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('practitioner').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^\\S+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('role').values",
+          "id": "role_parameter_presence",
+          "description": "role parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "(?!.*role=.*role=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('role').values",
+          "id": "role_parameter_value",
+          "description": "role parameter is a token.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('role').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^\\S+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('service').values",
+          "id": "service_parameter_presence",
+          "description": "service parameter can be used only once.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*service=.*service=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('service').values",
+          "id": "service_parameter_value",
+          "description": "service parameter is a token.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('service').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^\\S+$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('speciality').values",
+          "id": "speciality_parameter_presence",
+          "description": "speciality parameter can be used only once, eventually suffixed by a modifier :contains or :exact.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^(?!.*speciality=.*speciality=).*$"
+            }
+          ]
+        },
+        {
+          "selector": "request.uri.queryParams('speciality').values",
+          "id": "speciality_parameter_value",
+          "description": "speciality parameter is a token.",
+          "requirementPriority": "MANDATORY",
+          "checksComposition": "oneOf",
+          "applyIf": "request.uri.queryParams('speciality').values.size() > 0",
+          "checks": [
+            {
+              "type": "REGEX",
+              "regex": "^\\S+$"
+            }
+          ]
+        }
+  ]
+}
\ No newline at end of file
diff --git a/EHS/CH_mCSD/README.md b/EHS/CH_mCSD/README.md
new file mode 100644
index 0000000..b87f175
--- /dev/null
+++ b/EHS/CH_mCSD/README.md
@@ -0,0 +1,107 @@
+---
+title: CH:mCSD HTTP Validation profiles' assertions 
+subtitle: List of all HTTP rules for CH:mCSD
+authors: Vincent HOFMAN
+date: 2023-03-14
+---
+
+# CH:mCSD HTTP Validation profiles' assertions
+
+## Organization resource's assertions
+
+|   id  |   Check's type |   Value |   Description    |
+|---    |---    |---    |---    |
+|   GETMethodChecking   |   FIXEDVALUE |   GET |   HTTP method shall be GET  |
+|   HTTP1VersionChecking   |   FIXEDVALUE  |   HTTP/1.1 |   The HTTP version shall be HTTP/1.1  |
+|   URIRegexChecking   |   REGEX   |   `^(\S)+Organization$` |   URI path of the request shall be followed by the mCSD resource  |
+|   HostChecking   |   REGEX   |   `^(http[s]?:\/\/)?[a-zA-Z0-9.\-\/]+(\:(\d)+)?$` |   Host Shall be a server name  |
+|   Authorization_parameter_presence   |   OCCURRENCE   |   1..1 |   The Authorization parameter is mandatory  |
+|   Authorization_parameter_value   |   REGEX   |   `^Bearer\\ [-a-zA-Z0-9._~+\\/]+=*$` |   Authorization parameter's value SHALL be Bearer, followed by the token.  |
+|   traceparent_parameter_presence   |   OCCURRENCE   |   1..1 |   The traceparent parameter is mandatory in the HTTP header|
+|   traceparent_parameter_value   |   REGEX   |   `^(?!f{2})([\da-f]{2})-(?!f{32})([\da-f]{32})-(?!f{16})([\da-f]{16})-(?!f{2})([\da-f]{2})$` |   traceparent parameter's value SHALL be as defined in fhir.ch, section [tracecontext](https://fhir.ch/ig/ch-epr-mhealth/tracecontext.html). |
+|   _id_parameter_presence   |   REGEX   | `^(?!.*_id=.*_id=).*$` |   _id parameter can be used only once. |
+|   _id_parameter_value   |   REGEX   |   `^\S+$` |   _id parameter is a token.  |
+|   _lastUpdated_parameter_presence   |   REGEX   | `^(?!.*_lastUpdated=.*_lastUpdated=).*$` |   _lastUpdated parameter can be used only once. |
+|   _lastUpdated_parameter_value   |   REGEX   |   `^(ge\|le)?[0-9]{4}-(0[1-9]\|1[0-2])-(0[1-9]\|1\d\|2[0-8]\|3[01])$` |_lastUpdated parameter is made of a date eventually preceded by a modifier ge or le.    |
+|   _format_parameter_presence   |   REGEX   | `^(?!.*_format=.*_format=).*$` |   _format parameter can be used only once. |
+|   _format_parameter_value   |   CLOSEDLIST   |   [json,xml] |   _format parameter's value shall be either json or xml.
+|   _sort_parameter_presence   |   REGEX   | `^(?!.*_sort=.*_sort=).*$` |   _sort parameter can be used only once. |
+|   _sort_parameter_value   |   REGEX   |   `^([\w,]\|(-\w))+$` |   _sort parameter's value is made of items composed of word caracters, separated by a comma and eventually prefixed by a dash. | 
+|   _count_parameter_presence   |   REGEX   | `^(?!.*_count=.*_count=).*$` |   _count parameter can be used only once. |
+|   _count_parameter_value   |   REGEX   |   `^\d+$` |   _count parameter is a decimal.  |
+|   active_parameter_presence   |   REGEX   | `^(?!.*active=.*active=).*$` |   active parameter can be used only once. |
+|   active_parameter_value   |   CLOSEDLIST   |   [true,false] |   active parameter is a boolean and accept true or false values.  |
+|   identifier_parameter_presence   |   REGEX   | `^(?!.*identifier=.*identifier=).*$` |   identifier parameter can be used only once. |
+|   identifier_parameter_value   |   REGEX   |   `^\S+$` |   identifier parameter is a token.  |
+|   name_parameter_presence   |   REGEX   | `^(?!.*name=.*name=).*$` |   name parameter can be used only once. |
+|   name_parameter_value   |   REGEX   |   `^.+$` |   name parameter is a string.  |
+|   partof_parameter_presence   |   REGEX   | `^(?!.*partof=.*partof=).*$` |   partof parameter can be used only once. |
+|   partof_parameter_value   |   REGEX   |   `^\S+$` |  partof parameter is a token.   |
+|   type_parameter_presence   |   REGEX   | `^(?!.*_type=.*_type=).*$` |   type parameter can be used only once. |
+|   type_parameter_value |   REGEX   |   `^.+$` |  type parameter is a token.   |
+
+## Practitioner resource's assertions
+
+|   id  |   Check's type |   Value |   Description    |
+|---    |---    |---    |---    |
+|   GETMethodChecking   |   FIXEDVALUE |   GET |   HTTP method shall be GET  |
+|   HTTP1VersionChecking   |   FIXEDVALUE  |   HTTP/1.1 |   The HTTP version shall be HTTP/1.1  |
+|   URIRegexChecking   |   REGEX   |   `^(\S)+Organization$` |   URI path of the request shall be followed by the mCSD resource  |
+|   HostChecking   |   REGEX   |   `^(http[s]?:\/\/)?[a-zA-Z0-9.\-\/]+(\:(\d)+)?$` |   Host Shall be a server name  |
+|   Authorization_parameter_presence   |   OCCURRENCE   |   1..1 |   The Authorization parameter is mandatory  |
+|   Authorization_parameter_value   |   REGEX   |   `^Bearer\\ [-a-zA-Z0-9._~+\\/]+=*$` |   Authorization parameter's value SHALL be Bearer, followed by the token.  |
+|   traceparent_parameter_presence   |   OCCURRENCE   |   1..1 |   The traceparent parameter is mandatory in the HTTP header|
+|   traceparent_parameter_value   |   REGEX   |   `^(?!f{2})([\da-f]{2})-(?!f{32})([\da-f]{32})-(?!f{16})([\da-f]{16})-(?!f{2})([\da-f]{2})$` |   traceparent parameter's value SHALL be as defined in fhir.ch, section [tracecontext](https://fhir.ch/ig/ch-epr-mhealth/tracecontext.html). |
+|   _id_parameter_presence   |   REGEX   | `^(?!.*_id=.*_id=).*$` |   _id parameter can be used only once. |
+|   _id_parameter_value   |   REGEX   |   `^\S+$` |   _id parameter is a token.  |
+|   _lastUpdated_parameter_presence   |   REGEX   | `^(?!.*_lastUpdated=.*_lastUpdated=).*$` |   _lastUpdated parameter can be used only once. |
+|   _lastUpdated_parameter_value   |   REGEX   |   `^(ge\|le)?[0-9]{4}-(0[1-9]\|1[0-2])-(0[1-9]\|1\d\|2[0-8]\|3[01])$` |_lastUpdated parameter is made of a date eventually preceded by a modifier ge or le.    |
+|   _format_parameter_presence   |   REGEX   | `^(?!.*_format=.*_format=).*$` |   _format parameter can be used only once. |
+|   _format_parameter_value   |   CLOSEDLIST   |   [json,xml] |   _format parameter's value shall be either json or xml.
+|   _sort_parameter_presence   |   REGEX   | `^(?!.*_sort=.*_sort=).*$` |   _sort parameter can be used only once. |
+|   _sort_parameter_value   |   REGEX   |   `^([\w,]\|(-\w))+$` |   _sort parameter's value is made of items composed of word caracters, separated by a comma and eventually prefixed by a dash. | 
+|   _count_parameter_presence   |   REGEX   | `^(?!.*_count=.*_count=).*$` |   _count parameter can be used only once. |
+|   _count_parameter_value   |   REGEX   |   `^\d+$` |   _count parameter is a decimal.  | 
+|   active_parameter_presence   |   REGEX   | `^(?!.*active=.*active=).*$` |   active parameter can be used only once. |
+|   active_parameter_value   |   CLOSEDLIST   |   [true,false] |   active parameter is a boolean and accept true or false values.  |
+|   identifier_parameter_presence   |   REGEX   | `^(?!.*identifier=.*identifier=).*$` |   identifier parameter can be used only once. |
+|   identifier_parameter_value   |   REGEX   |   `^\S+$` |   identifier parameter is a token.  |
+|   name_parameter_presence   |   REGEX   | `^(?!.*name(:contains\|:exact)?=.*name(:contains\|:exact)?=).*$` |   name parameter can be used only once, eventually suffixed by a modifier :contains or :exact.
+|   name_parameter_value   |   REGEX   |  `^.+$`   | name parameter is made of a string.    |
+|   given_parameter_presence   |   REGEX   | `^(?!.*given(:contains\|:exact)?=.*given(:contains\|:exact)?=).*$` |   given parameter can be used only once, eventually suffixed by a modifier :contains or :exact.
+|   given_parameter_value   |   REGEX   |  `^.+$`   | given parameter is made of a string.    |
+|   family_parameter_presence   |   REGEX   | `^(?!.*family(:contains\|:exact)?=.*family(:contains\|:exact)?=).*$` |   family parameter can be used only once, eventually suffixed by a modifier :contains or :exact.
+|   family_parameter_value   |   REGEX   |  `^.+$`   | family parameter is made of a string.    |
+
+## PractitionerRole resource's assertions
+
+|   id  |   Check's type |   Value |   Description    |
+|---    |---    |---    |---    |
+|   GETMethodChecking   |   FIXEDVALUE |   GET |   HTTP method shall be GET  |
+|   HTTP1VersionChecking   |   FIXEDVALUE  |   HTTP/1.1 |   The HTTP version shall be HTTP/1.1  |
+|   URIRegexChecking   |   REGEX   |   `^(\S)+Organization$` |   URI path of the request shall be followed by the mCSD resource  |
+|   HostChecking   |   REGEX   |   `^(http[s]?:\/\/)?[a-zA-Z0-9.\-\/]+(\:(\d)+)?$` |   Host Shall be a server name  |
+|   Authorization_parameter_presence   |   OCCURRENCE   |   1..1 |   The Authorization parameter is mandatory  |
+|   Authorization_parameter_value   |   REGEX   |   `^Bearer\\ [-a-zA-Z0-9._~+\\/]+=*$` |   Authorization parameter's value SHALL be Bearer, followed by the token.  |
+|   traceparent_parameter_presence   |   OCCURRENCE   |   1..1 |   The traceparent parameter is mandatory in the HTTP header|
+|   traceparent_parameter_value   |   REGEX   |   `^(?!f{2})([\da-f]{2})-(?!f{32})([\da-f]{32})-(?!f{16})([\da-f]{16})-(?!f{2})([\da-f]{2})$` |   traceparent parameter's value SHALL be as defined in fhir.ch, section [tracecontext](https://fhir.ch/ig/ch-epr-mhealth/tracecontext.html). |
+|   _id_parameter_presence   |   REGEX   | `^(?!.*_id=.*_id=).*$` |   _id parameter can be used only once. |
+|   _id_parameter_value   |   REGEX   |   `^\S+$` |   _id parameter is a token.  |
+|   _lastUpdated_parameter_presence   |   REGEX   | `^(?!.*_lastUpdated=.*_lastUpdated=).*$` |   _lastUpdated parameter can be used only once. |
+|   _lastUpdated_parameter_value   |   REGEX   |   `^(ge\|le)?[0-9]{4}-(0[1-9]\|1[0-2])-(0[1-9]\|1\d\|2[0-8]\|3[01])$` |_lastUpdated parameter is made of a date eventually preceded by a modifier ge or le.    |
+|   _format_parameter_presence   |   REGEX   | `^(?!.*_format=.*_format=).*$` |   _format parameter can be used only once. |
+|   _format_parameter_value   |   CLOSEDLIST   |   [json,xml] |   _format parameter's value shall be either json or xml.
+|   _sort_parameter_presence   |   REGEX   | `^(?!.*_sort=.*_sort=).*$` |   _sort parameter can be used only once. |
+|   _sort_parameter_value   |   REGEX   |   `^([\w,]\|(-\w))+$` |   _sort parameter's value is made of items composed of word caracters, separated by a comma and eventually prefixed by a dash. | 
+|   _count_parameter_presence   |   REGEX   | `^(?!.*_count=.*_count=).*$` |   _count parameter can be used only once. |
+|   _count_parameter_value   |   REGEX   |   `^\d+$` |   _count parameter is a decimal.  |
+|   organization_parameter_presence   | REGEX |   `^(?!.*organization=.*organization=).*$` |   organization parameter can be used only once. |
+|   organization_parameter_value   |   REGEX   |   `^\S+$` |  organization parameter is a token.   |
+|   practitioner_parameter_presence   | REGEX |   `^(?!.*practitioner=.*practitioner=).*$` |   practitioner parameter can be used only once. |
+|   practitioner_parameter_value   | REGEX |  `^\S+$` |  practitioner parameter is a token.
+|   role_parameter_presence   | REGEX |   `^(?!.*role=.*role=).*$` |   role parameter can be used only once. |
+|   role_parameter_value   |   REGEX |  `^\S+$` |  role parameter is a token.
+|   service_parameter_presence   | REGEX |   `^(?!.*service=.*service=).*$` |   service parameter can be used only once. |
+|   service_parameter_value   |   REGEX |  `^\S+$` |  service parameter is a token.
+|   speciality_parameter_presence   | REGEX |   `^(?!.*speciality=.*speciality=).*$` |   speciality parameter can be used only once. |
+|   speciality_parameter_value   |   REGEX |  `^\S+$` |  speciality parameter is a token.
\ No newline at end of file
diff --git a/EHS/samples/CH-mCSD/ITI-90/B - Practitioner/CH-mCSD - 010 - valid - with name.txt b/EHS/samples/CH-mCSD/ITI-90/B - Practitioner/CH-mCSD - 010 - valid - with name.txt
index 7e0e997..9147d93 100644
--- a/EHS/samples/CH-mCSD/ITI-90/B - Practitioner/CH-mCSD - 010 - valid - with name.txt	
+++ b/EHS/samples/CH-mCSD/ITI-90/B - Practitioner/CH-mCSD - 010 - valid - with name.txt	
@@ -1,3 +1,11 @@
 GET CareServicesSelectiveSupplier/Practitioner?name=Peter%20Pan HTTP/1.1
 Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJnVmd6VWtRZEtwZHVMbmF4bThKQy1JYTh0VUdNV0J1TTJZT2R3akthcEdzIn0.eyJleHAiOjE3MDgzNDg0ODUsImlhdCI6MTcwODM0ODE4NSwiYXV0aF90aW1lIjoxNzA4MzQ4MTQzLCJqdGkiOiI5OGZjZDFiNy0wZGE5LTRkZGQtODUwNy1hM2I1YmU3NmY0ZmIiLCJpc3MiOiJodHRwczovL2VoZWFsdGhzdWlzc2UuaWhlLWV1cm9wZS5uZXQvaXVhLXNzby9yZWFsbXMvY2gtaXVhIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImFjNGZkNjI2LWNiZGYtNGIzMC1hOTNhLTc0YTM2YWQyM2QwYiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImNoLWl1YS1jbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiYzUyMTE2NjItY2VhNy00ZmFmLWFkZjktNDNiNTE2MGNjYjUwIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyIvKiJdLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiZGVmYXVsdC1yb2xlcy1jaC1pdWEiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJwdXJwb3NlX29mX3VzZT11cm46b2lkOjIuMTYuNzU2LjUuMzAuMS4xMjcuMy4xMC41fE5PUk0gcHJvZmlsZSBsYXVuY2ggZW1haWwiLCJzaWQiOiJjNTIxMTY2Mi1jZWE3LTRmYWYtYWRmOS00M2I1MTYwY2NiNTAiLCJleHRlbnNpb25zIjp7ImNoX2VwciI6eyJ1c2VyX2lkX3F1YWxpZmllciI6InVybjpnczE6Z2xuIiwidXNlcl9pZCI6Ijc2MDEwMDI0NjczNzMifSwiY2hfaXVhIjp7ImxhdW5jaCI6ImxhdW5jaCJ9LCJpaGVfaXVhIjp7InB1cnBvc2Vfb2ZfdXNlIjp7ImNvZGUiOiJOT1JNIiwic3lzdGVtIjoidXJuOm9pZDoyLjE2Ljc1Ni41LjMwLjEuMTI3LjMuMTAuNSJ9fX0sImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibmFtZSI6InJyZXlub2xkcyBSZXlub2xkcyIsInByZWZlcnJlZF91c2VybmFtZSI6InJyZXlub2xkcyIsImdpdmVuX25hbWUiOiJycmV5bm9sZHMiLCJmYW1pbHlfbmFtZSI6IlJleW5vbGRzIn0.mT9ZTGNqTfsMBxoyGLaQlUr9PVcFItvlKmZxjY4_OAHqi4nE82S5n0mE4iy_5YL_sbYtNODI1L_LH6keBTCSbSOY5REkp_NLm4QLzdX4ynJ7Y_nMoD5H6TFqJTrllKVJ5IKtXhWv9bLQK35PLLPeNMZH4yl3ChlOlx0IH-zqHEPcOV69kN1vC7_Jjj0vx3d0RFvR_0sbfG3XnSiO3fpwwj2xYgRfZkfJqTuZ5404j9nu8TiPHtCRqQ_EPtEirUTG1ClX1DahJRKB-jwLHThxkKooUxsRAQZVhqayhLMV8sxwNkeHnNemhqreOkeDELxn2ZC-VOQLe9WRsX37QagO1g
 Host: ehealthsuisse.ihe-europe.net
+
+GET CareServicesSelectiveSupplier/Practitioner?name=contains:Peter%20Pan HTTP/1.1
+Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJnVmd6VWtRZEtwZHVMbmF4bThKQy1JYTh0VUdNV0J1TTJZT2R3akthcEdzIn0.eyJleHAiOjE3MDgzNDg0ODUsImlhdCI6MTcwODM0ODE4NSwiYXV0aF90aW1lIjoxNzA4MzQ4MTQzLCJqdGkiOiI5OGZjZDFiNy0wZGE5LTRkZGQtODUwNy1hM2I1YmU3NmY0ZmIiLCJpc3MiOiJodHRwczovL2VoZWFsdGhzdWlzc2UuaWhlLWV1cm9wZS5uZXQvaXVhLXNzby9yZWFsbXMvY2gtaXVhIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImFjNGZkNjI2LWNiZGYtNGIzMC1hOTNhLTc0YTM2YWQyM2QwYiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImNoLWl1YS1jbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiYzUyMTE2NjItY2VhNy00ZmFmLWFkZjktNDNiNTE2MGNjYjUwIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyIvKiJdLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiZGVmYXVsdC1yb2xlcy1jaC1pdWEiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJwdXJwb3NlX29mX3VzZT11cm46b2lkOjIuMTYuNzU2LjUuMzAuMS4xMjcuMy4xMC41fE5PUk0gcHJvZmlsZSBsYXVuY2ggZW1haWwiLCJzaWQiOiJjNTIxMTY2Mi1jZWE3LTRmYWYtYWRmOS00M2I1MTYwY2NiNTAiLCJleHRlbnNpb25zIjp7ImNoX2VwciI6eyJ1c2VyX2lkX3F1YWxpZmllciI6InVybjpnczE6Z2xuIiwidXNlcl9pZCI6Ijc2MDEwMDI0NjczNzMifSwiY2hfaXVhIjp7ImxhdW5jaCI6ImxhdW5jaCJ9LCJpaGVfaXVhIjp7InB1cnBvc2Vfb2ZfdXNlIjp7ImNvZGUiOiJOT1JNIiwic3lzdGVtIjoidXJuOm9pZDoyLjE2Ljc1Ni41LjMwLjEuMTI3LjMuMTAuNSJ9fX0sImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibmFtZSI6InJyZXlub2xkcyBSZXlub2xkcyIsInByZWZlcnJlZF91c2VybmFtZSI6InJyZXlub2xkcyIsImdpdmVuX25hbWUiOiJycmV5bm9sZHMiLCJmYW1pbHlfbmFtZSI6IlJleW5vbGRzIn0.mT9ZTGNqTfsMBxoyGLaQlUr9PVcFItvlKmZxjY4_OAHqi4nE82S5n0mE4iy_5YL_sbYtNODI1L_LH6keBTCSbSOY5REkp_NLm4QLzdX4ynJ7Y_nMoD5H6TFqJTrllKVJ5IKtXhWv9bLQK35PLLPeNMZH4yl3ChlOlx0IH-zqHEPcOV69kN1vC7_Jjj0vx3d0RFvR_0sbfG3XnSiO3fpwwj2xYgRfZkfJqTuZ5404j9nu8TiPHtCRqQ_EPtEirUTG1ClX1DahJRKB-jwLHThxkKooUxsRAQZVhqayhLMV8sxwNkeHnNemhqreOkeDELxn2ZC-VOQLe9WRsX37QagO1g
+Host: ehealthsuisse.ihe-europe.net
+
+GET CareServicesSelectiveSupplier/Practitioner?name=exact:Peter%20Pan HTTP/1.1
+Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJnVmd6VWtRZEtwZHVMbmF4bThKQy1JYTh0VUdNV0J1TTJZT2R3akthcEdzIn0.eyJleHAiOjE3MDgzNDg0ODUsImlhdCI6MTcwODM0ODE4NSwiYXV0aF90aW1lIjoxNzA4MzQ4MTQzLCJqdGkiOiI5OGZjZDFiNy0wZGE5LTRkZGQtODUwNy1hM2I1YmU3NmY0ZmIiLCJpc3MiOiJodHRwczovL2VoZWFsdGhzdWlzc2UuaWhlLWV1cm9wZS5uZXQvaXVhLXNzby9yZWFsbXMvY2gtaXVhIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImFjNGZkNjI2LWNiZGYtNGIzMC1hOTNhLTc0YTM2YWQyM2QwYiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImNoLWl1YS1jbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiYzUyMTE2NjItY2VhNy00ZmFmLWFkZjktNDNiNTE2MGNjYjUwIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyIvKiJdLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiZGVmYXVsdC1yb2xlcy1jaC1pdWEiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJwdXJwb3NlX29mX3VzZT11cm46b2lkOjIuMTYuNzU2LjUuMzAuMS4xMjcuMy4xMC41fE5PUk0gcHJvZmlsZSBsYXVuY2ggZW1haWwiLCJzaWQiOiJjNTIxMTY2Mi1jZWE3LTRmYWYtYWRmOS00M2I1MTYwY2NiNTAiLCJleHRlbnNpb25zIjp7ImNoX2VwciI6eyJ1c2VyX2lkX3F1YWxpZmllciI6InVybjpnczE6Z2xuIiwidXNlcl9pZCI6Ijc2MDEwMDI0NjczNzMifSwiY2hfaXVhIjp7ImxhdW5jaCI6ImxhdW5jaCJ9LCJpaGVfaXVhIjp7InB1cnBvc2Vfb2ZfdXNlIjp7ImNvZGUiOiJOT1JNIiwic3lzdGVtIjoidXJuOm9pZDoyLjE2Ljc1Ni41LjMwLjEuMTI3LjMuMTAuNSJ9fX0sImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibmFtZSI6InJyZXlub2xkcyBSZXlub2xkcyIsInByZWZlcnJlZF91c2VybmFtZSI6InJyZXlub2xkcyIsImdpdmVuX25hbWUiOiJycmV5bm9sZHMiLCJmYW1pbHlfbmFtZSI6IlJleW5vbGRzIn0.mT9ZTGNqTfsMBxoyGLaQlUr9PVcFItvlKmZxjY4_OAHqi4nE82S5n0mE4iy_5YL_sbYtNODI1L_LH6keBTCSbSOY5REkp_NLm4QLzdX4ynJ7Y_nMoD5H6TFqJTrllKVJ5IKtXhWv9bLQK35PLLPeNMZH4yl3ChlOlx0IH-zqHEPcOV69kN1vC7_Jjj0vx3d0RFvR_0sbfG3XnSiO3fpwwj2xYgRfZkfJqTuZ5404j9nu8TiPHtCRqQ_EPtEirUTG1ClX1DahJRKB-jwLHThxkKooUxsRAQZVhqayhLMV8sxwNkeHnNemhqreOkeDELxn2ZC-VOQLe9WRsX37QagO1g
+Host: ehealthsuisse.ihe-europe.net
\ No newline at end of file
-- 
GitLab